B
    H/\@              
   @   s  d dl mZmZmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ yed W n eeefk
r   Y nX dZeej !dpe"e d da#t#dkr$da#er.dZdeiZ$er@da#dd Z%dd Z&d2ddZ'd3ddZ(d d! Z)d"d# Z*d4d%d&Z+d'd( Z,d5d)d*Z-d+d, Z.d6d-d.Z/d/d0 Z0e1d1kre0  dS )7    )print_functionabsolute_importdivisionN)	timedelta)
ThreadPool)	cpu_count   )util)log)RUNNING_ON_CI)PYPY)PY2)RESOLVER_ARES)RUN_LEAKCHECKS)sixZ	_testcapid   NWORKERS   
      Ztimeoutc             C   s*   t j| s&|r&t|}t j|| S | S )N)ospathisfile_dir_from_package_namejoin)filenamepackagepackage_dir r   8lib/python3.7/site-packages/gevent/testing/testrunner.py_package_relative_filename6   s    r    c             C   s   t | }tj|j}|S )N)	importlibimport_moduler   r   dirname__file__)r   Zpackage_modr   r   r   r   r   =   s    
r   r   Fc                s  t   }d}i  i dgdg	tt| tp0datttdkpDt_ 	fddg fddfdd}fd	d
}g }	yytdtf  xD| D ]<\}
}|d7 }|pi }t||
r|		|
|f q||
| qW 
    td x|	D ]\}
}|
f| qW W nz tk
r   ytd |  W nP tk
r     t| dt   | |d 	d d td  Y nX Y nX W n   t     Y nX |  t| t   | |d 	d d d S )Nr   r   c                sj   |d< t j| f|}|r8r(td | |g |j< n
d|j< d  |j7  < d  |j7  < d S )Nquietr   Tr   )r	   runsysexitnameZ	run_countZskipped_count)cmdkwargsresult)failedfailfastpassedr%   total_casestotal_skippedr   r   run_oneV   s    

zrun_many.<locals>.run_onec                 sT   xJ d d  D ]:} |   sq|  r0 |  q|   td| f  qW t S )Nz#Internal error in testrunner.py: %r)ZreadyZ
successfulremovegetr'   r(   len)r)resultsr   r   reapd   s    zrun_many.<locals>.reapc                  s   x  dkrt d qW d S )Nr   g?)timesleepr   )r8   r   r   reap_allo   s    zrun_many.<locals>.reap_allc                s@   x: t k r. | f|pi }| d S td qW d S )Ng?)r   Zapply_asyncappendr9   r:   )r*   optionsr6   )poolr8   r7   r2   r   r   spawns   s    

zrun_many.<locals>.spawnz-Running tests in parallel with concurrency %szRunning tests marked standalonez*Waiting for currently running to finish...F)r(   tookconfigured_failing_testsr0   r1   z(partial results)
)r@   rA   r0   r1   )r9   minr5   r   r   r	   ZBUFFER_OUTPUTr
   matchesr<   closer   KeyboardInterruptZ	terminatereport	traceback	print_exc)testsrA   r.   r%   configured_run_alone_testsstarttotalr;   r?   Z	run_aloner*   r=   r   )
r-   r.   r/   r>   r%   r8   r7   r2   r0   r1   r   run_manyC   s`    	

rM   c          
   C   s  |pi }t  }t|pd}|rL|d}x |D ]}	|tt|	| q0W |rZ|| |rpt|}
t |
 | sttdtdg } nt| } |r| |8 } t	| } g }g }x| D ]}t j
|d }|r|d | n|}tt j
|d}	|	 }W d Q R X d|kr|| qtjd	g}tr<tr<|d
 |rR|d|  n
|| t }|||i  |||f qW t | xT|D ]L}t|}x:| D ].\}}t|d |krΐq|||f qW qW |S )Nr   ,z	test_*.pyztest_support.pyr   .rbs
   TESTRUNNERz-u)z-Xztrack-resourcesz-m)r   getcwdsetsplitupdateload_list_from_filer   chdirglobsortedr   splitextopenabspathreadr<   r'   
executabler   r   extendDEFAULT_RUN_OPTIONScopyr4   r!   r"   Z
TESTRUNNERremove_options)rI   ignore_filesignoredcoverager   configured_ignore_coverageconfigured_test_optionsZolddirignorefr   Z
to_processZ	to_importr   Zmodule_nameZqualified_namecontentsr*   r=   moduler   r   r   discover   sX    











rl   c             C   s   dd | D S )Nc             S   s   g | ]}|r| d s|qS )-)
startswith).0xr   r   r   
<listcomp>   s    z"remove_options.<locals>.<listcomp>r   )lstr   r   r   rb      s    rb   c          	   C   sV   g }| rRt t| |6}x.|D ]&}|ddd  }|r|| qW W d Q R X |S )N#r   r   )r[   r    rT   stripr<   )r   r   r,   ri   rp   r   r   r   rV      s    
rV   Tc             C   sf   t |trd|}xL| D ]D}|s.|dr.q|dd}|d| sZ||ddrdS qW dS )N zFLAKY  z.pyTF)
isinstancelistr   rn   replaceendswith)ZpossibilitiesZcommandinclude_flakyliner   r   r   rC     s    


 rC   c             C   s<   | dk rd|  S t tt| d} | dr8| dd  } | S )N   z%.1fs)secondsz0:   )strr   roundrn   )r~   r   r   r   format_seconds  s    
r   c             C   s  t j}|rhtd |  td|d d   }	dt|	 d }
x&|d d D ]\}}t|
| | qNW |rzdt| }nd}g }g }g }x$|D ]}t||d	d
r|| qW |rtdt|| dd t	| |r^tdt|| | x2|D ]*}t||dd
r|| q|| qW |r:tdt||  t	| |rtdt|| dd t	| n&td||rzt 
dd| nd| | |r|rttdt| |rtd | dkrtd d S )Nz
Longest-running tests:z%.1fr   %z.1f seconds: %s   z in %srv   F)r{   z
%s/%s unexpected passeserror)Zcolorz
%s/%s tests failed%sTz
%s/%s expected failuresz
%s/%s unexpected failuresz
Ran %s tests%s in %s files%sZskippedz (skipped=%d)r   e   zNo tests found.)r	   
runtimelogr
   sortr5   r   r   rC   r<   
print_listZ	_colorizer'   r(   rB   )rL   r-   r/   r(   r@   rA   r0   r1   r   lengthZfrmtZdeltar)   Zfailed_expectedZfailed_unexpectedZpassed_unexpectedr   r   r   rF      sZ    




rF   c             C   s   x| D ]}t d| qW d S )Nz - %s)r
   )rr   r)   r   r   r   r   _  s    
r   c             C   s   dt jkr,tjs,dddddddgt jd< d	t jkr@d
t jd	< dt jkrX| rXdt jd< dt jkrldt jd< dt jkrdt jd< dt jkrdt jd< d S )NZPYTHONWARNINGSrN   defaultzignore:::site:zignore:::pkgutilzignore:::importlib._bootstrap:z'ignore:::importlib._bootstrap_external:z)ignore:::pkg_resources._vendor.pyparsing:ZPYTHONFAULTHANDLERtrueZGEVENT_DEBUGdebugZPYTHONTRACEMALLOCZ10ZPYTHONDEVMODE1ZPYTHONMALLOC)r   environr'   warnoptionsr   )r   r   r   r   _setup_environc  s$    







r   c           	   C   s  dd l } |  }|d |jddd |jddd |jddd	 |jd
dd |jddd |jdddd |jdddd |jdddd |jddd	 |jddd | }g }g }g }i }d}|jstjdr~d}tj	dtjd< t
r
tj	dtjd< tjt}tj|d}	tj	|	}	|	tj tjdd  tjd< tj	d!tj d" tjd#< td$tjd# d%|	 t|jd& |jri }
t|j|j|_t|j}| }W d Q R X t||
 |
d' }|
d( }|
d) }|
d* }|
d+ }t|j|j|||j||d,}|jrbx2|D ]*\}}ttj||d-|d.d/ q"W td0t|  n^t
rzt rztd1 d S |jrt!|j}tjdd tj | tjd< t"|||j#|j$|d2 d S )3Nr   z--ignorez
--discover
store_true)actionz--fullz--configzknown_failures.py)r   z
--failfastz
--coveragez--quietT)r   r   z	--verboseZstore_falser%   )r   destz--debugFz	--packagezgevent.testsrI   *)nargsZGEVENTTEST_COVERAGEz.coveragercZCOVERAGE_PROCESS_STARTz.coveragerc-pypyZcoveragesiteZ
PYTHONPATHrv   rO   z	.coverageZCOVERAGE_FILEzEnabling coverage toz	with site)r   FAILING_TESTSIGNORED_TESTS	RUN_ALONETEST_FILE_OPTIONSIGNORE_COVERAGE)rc   rd   re   r   rf   rg   envsetenv)r   r   z%s tests found.zDNot running tests on pypy with c-ares; not a supported configuration)rA   r.   r%   rJ   )%argparseArgumentParseradd_argument
parse_argsre   r   r   r4   r   r\   r   r#   r$   r   pathsepsepprintr   r   configr    r   r[   r]   r   Zexec_rl   rI   rh   r	   Zgetnamer5   r   r   rM   r.   r%   )r   parserr=   r   r   r   r   re   Zthis_dirZsite_dirr   ri   Zconfig_datar   rI   r*   r   r   r   r   main  s    
&
r   __main__)r   FFr   )NNr   FNr   N)T)TNr   r   r   )F)2Z
__future__r   r   r   r'   r   rX   rG   r9   r!   Zdatetimer   Zmultiprocessing.poolr   Zmultiprocessingr   rv   r	   r
   Zsysinfor   r   r   r   r   r   
__import__ImportErrorOSErrorIOErrorZTIMEOUTintr   r4   maxr   r`   r    r   rM   rl   rb   rV   rC   r   rF   r   r   r   __name__r   r   r   r   <module>   sj   "
   
^    
P
	  
=
*S
