B
    UÿþeÖV  ã               @   sx  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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mZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  d dl!m"Z"m#Z#m$Z$m%Z% d dl&m'Z' yd dl(Z(W n e)k
r   dZ(Y nX e	 *¡ rHe	 +d¡a,t,dkr8e	 +d¡a,ej- .t,d	¡a,ne
 /¡ a,ej- 0t,¡a,G d
d„ dƒZ1ddd„Z2dS )é    N)Ú_parse_args)Ú	findtestsÚruntestÚget_abs_moduleÚSTDTESTSÚNOTTESTSÚPASSEDÚFAILEDÚENV_CHANGEDÚSKIPPEDÚRESOURCE_DENIEDÚINTERRUPTEDÚCHILD_ERRORÚTEST_DID_NOT_RUNÚPROGRESS_MIN_TIMEÚformat_test_result)Úsetup_tests)ÚremovepyÚcountÚformat_durationÚ	printlist)ÚsupportZabs_builddirZsrcdirZbuildc               @   sª   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd)d%d&„Zd'd(„ Zd$S )*ÚRegrtestal  Execute a test suite.

    This also parses command-line options and modifies its behavior
    accordingly.

    tests -- a list of strings containing test names (optional)
    testdir -- the directory in which to look for tests (optional)

    Users other than the Python test suite will certainly want to
    specify testdir; if it's omitted, the directory containing the
    Python test suite is searched for.

    If the tests argument is omitted, the tests listed on the
    command-line will be used.  If that's empty, too, then all *.py
    files beginning with test_ will be used.

    The other default arguments (verbose, quiet, exclude,
    single, randomize, findleaks, use_resources, trace, coverdir,
    print_slow, and random_seed) allow programmers calling main()
    directly to set the values that would normally be set by flags
    on the command line.
    c             C   s†   d | _ g | _g | _g | _g | _g | _g | _g | _g | _g | _	d | _
d| _g | _d | _g | _t ¡ | _d| _d| _d | _d | _d | _d S )NFÚ é   )ÚnsÚtestsÚselectedÚgoodÚbadÚskippedÚresource_deniedsÚenvironment_changedÚrerunÚrun_no_testsÚfirst_resultÚinterruptedÚ
test_timesÚtracerÚfound_garbageÚtimeÚ	monotonicÚ
start_timeÚ
test_countÚtest_count_widthÚnext_single_testÚnext_single_filenameÚtestsuite_xml)Úself© r3   ú+/usr/lib/python3.7/test/libregrtest/main.pyÚ__init__D   s*    
zRegrtest.__init__c          	   C   s8  |\}}}|t tfkr&| j ||f¡ |tkr<| j |¡ n’|tt fkrV| j |¡ nx|tkrl| j	 |¡ nb|t
kr‚| j |¡ nL|tkr¤| j |¡ | j |¡ n*|tkrº| j |¡ n|tkrÎtd| ƒ‚|r4dd lm  m} xL|D ]D}y| j | |¡¡ W qì |jk
r.   t|tjd ‚ Y qìX qìW d S )Nzinvalid test result: %rr   )Úfile)r   r   r'   Úappendr   r   r	   r   r
   r"   r   r    r   r!   r   r$   Ú
ValueErrorÚxml.etree.ElementTreeÚetreeÚElementTreer1   Z
fromstringZ
ParseErrorÚprintÚsysÚ
__stderr__)r2   ÚtestÚresultÚokÚ	test_timeZxml_dataÚETÚer3   r3   r4   Úaccumulate_resultl   s4    

zRegrtest.accumulate_resultc             C   sÂ   | j jrd S || j› ›| j› }t| jƒt| jƒ }|rN| j jsN|› d|› }d|› d|› }tt	dƒr†t	 
¡ d }d|d›d|› }t ¡ | j }tjt|ƒd	}|› d|› }t|d
d d S )Nú/ú[z] Ú
getloadavgr   z
load avg: z.2fú )ZsecondsT)Úflush)r   Úquietr.   r-   Úlenr   r"   ÚpgoÚhasattrÚosrH   r*   r+   r,   ÚdatetimeZ	timedeltaÚintr<   )r2   Ú
test_indexr?   ÚlineZfailsZload_avg_1minrB   r3   r3   r4   Údisplay_progress‰   s    
zRegrtest.display_progressc             C   s¤   t tjdd … f|Ž}|jr:ttdƒs:tdtjd d |_|jd k	r`t	d kr`tdtjd d |_|j
r„t	d k	rpntdtjd d|_
|jr–g  t_| _t|jƒ |S )Nr   Zdump_traceback_laterzFWarning: The timeout option requires faulthandler.dump_traceback_later)r6   z$No GC available, ignore --threshold.z&No GC available, disabling --findleaksF)r   r=   ÚargvZtimeoutrN   Úfaulthandlerr<   ÚstderrZ	thresholdÚgcÚ	findleaksÚxmlpathr   Zjunit_xml_listr1   r   Úargs)r2   Úkwargsr   r3   r3   r4   Ú
parse_argsŸ   s$    


zRegrtest.parse_argsc          	   C   s’  || _ | jjrdtj td¡| _y0t| jdƒ}| 	¡  
¡ }|g| _ W d Q R X W n tk
rb   Y nX | jjrèg | _ t d¡}ttj tj| jj¡ƒN}xF|D ]>}| dd¡d }| 
¡ }| |¡}|d k	rœ| j  | ¡ ¡ qœW W d Q R X t| j ƒ td d … }t ¡ }| jjrJx0| jjD ]$}	|	|kr2| |	¡ | |	¡ qW g | j_| jjrjt| jjtƒ t ƒ ƒ}
nt| jj||ƒ}
| jjsž| j p˜| jjp˜|
| _!n| j | _!| jjrú| j!d d… | _!y"|
 "| j!d ¡}|
|d  | _#W n t$k
rø   Y nX | jj%rNy| j!d | j! "| jj%¡…= W n, t&k
rL   t'd| jj% t(j)d Y nX | jj*rŽ| jj+d krtt, -d	¡| j_+t, .| jj+¡ t, /| j!¡ d S )
NZ
pynexttestÚrz\btest_[a-zA-Z0-9_]+\bú#r   r   z1Couldn't find starting test (%s), using all tests)r6   i€–˜ )0r   r   ÚsinglerO   ÚpathÚjoinÚTEMPDIRr0   ÚopenÚreadÚstripÚOSErrorZfromfileÚreÚcompiler   ÚSAVEDCWDÚsplitÚsearchr7   Úgroupr   r   r   ÚcopyZexcluder[   ÚremoveÚaddZtestdirr   ÚlistÚsetr   Úindexr/   Ú
IndexErrorÚstartr8   r<   r=   rW   Ú	randomizeÚrandom_seedÚrandomZ	randrangeZseedZshuffle)r2   r   ÚfpZ	next_testZregexrS   ÚmatchZstdtestsZnottestsÚargZalltestsÚposr3   r3   r4   Ú
find_tests¿   sh    











zRegrtest.find_testsc             C   s   x| j D ]}t|ƒ qW d S )N)r   r<   )r2   Únamer3   r3   r4   Ú
list_tests  s    zRegrtest.list_testsc             C   s\   xV|D ]N}t |tjjƒrqt |tjƒr2|  |¡ qt |tjƒrt |¡rt	| 
¡ ƒ qW d S )N)Ú
isinstanceÚunittestÚloaderZ_FailedTestZ	TestSuiteÚ_list_casesZTestCaser   Z
match_testr<   Úid)r2   Úsuiter?   r3   r3   r4   rƒ     s    

zRegrtest._list_casesc          	   C   s°   dt _t  | jj¡ xX| jD ]N}t| j|ƒ}ytj 	|¡}|  
|¡ W q tjk
rh   | j |¡ Y qX qW | jr¬ttjd ttt| jƒdƒdtjd t| jtjd d S )NF)r6   r?   zskipped:)r   ÚverboseZset_match_testsr   Zmatch_testsr   r   r   ZdefaultTestLoaderZloadTestsFromNamerƒ   ZSkipTestr    r7   r<   r=   rW   r   rL   r   )r2   r?   Zabstestr…   r3   r3   r4   Ú
list_cases  s    zRegrtest.list_casesc          	   C   sî   d| j _d| j _d| j _|  ¡ | _tƒ  tdƒ | jd d … | _x | jD ]p}td| dd yd| j _t	| j |ƒ}W n" t
k
r–   d| _tƒ  P Y qHX |d tttthkrH| j |¡ qHW | jrâttt| jƒdƒdƒ t| jƒ |  ¡  d S )	NTFz'Re-running failed tests in verbose modez"Re-running test %r in verbose mode)rJ   r   r?   zfailed again:)r   r†   ZfailfastZverbose3Úget_tests_resultr%   r<   r   r#   r   ÚKeyboardInterruptr&   r   r
   r   r   ro   r   rL   r   Údisplay_result)r2   r?   rA   r3   r3   r4   Úrerun_failed_tests#  s,    

zRegrtest.rerun_failed_testsc             C   s&  | j jrd S tƒ  td|  ¡  ƒ | jr~tƒ  tdƒ t| jƒt| jƒB t| jƒB }t| j	ƒ| }tt
t|ƒdƒdƒ t|ƒ | jrÔ| j jsÔtƒ  | js¾| js¾| js¾t| jƒdkr¾tddd tt
t| jƒdƒd	ƒ | j jr,| jjd
d tƒ  tdƒ x0| jd d… D ]\}}td|t|ƒf ƒ q
W | jrZtƒ  tt
t| jƒdƒdƒ t| jƒ | jrŒtƒ  td t
t| jƒdƒ¡ƒ t| jƒ | jrÄ| j jsÄtƒ  tt
t| jƒdƒdƒ t| jƒ | jrôtƒ  tdt
t| jƒdƒ ƒ t| jƒ | jr"tƒ  tt
t| jƒdƒdƒ t| jƒ d S )Nz== Tests result: %s ==z(Test suite interrupted by signal SIGINT.r?   zomitted:r   ZAllrI   )ÚendzOK.T)Úreversez10 slowest tests:é
   z- %s: %szfailed:z%{} altered the execution environment:zskipped:z%s:zre-run testzrun no tests:)r   rM   r<   rˆ   r&   rr   r   r   r    r   r   rL   r   rK   Z
print_slowr'   Úsortr   r"   Úformatr#   r$   )r2   ZexecutedZomittedr*   r?   r3   r3   r4   rŠ   A  s\    




zRegrtest.display_resultc          
   C   sÚ  | j jr dd l}|jddd| _tj ¡ }tdƒ d }xŽt| j	dƒD ]|\}}t
 ¡ }|}|rld||f }|  ||¡ | jrªd}ttƒ ƒ}	| jj|tƒ |	d	 |	d
 }
nLyt| j |ƒ}
W n. tk
rè   d| _|  |td d f¡ P Y nX |  ||
¡ t||
d ƒ}t
 ¡ | }|tkr,d|t|ƒf }n|
d tkr>d }| j jrŽt ¡  tjrŽtdttjƒdd tdƒ | j  tj¡ tjd d …= x4tj ¡ D ]&}||krš| !d¡ršt" #|¡ qšW qFW |rÖt|ƒ d S )Nr   FT)Útracer   zRun tests sequentiallyr   z%s -- %szEresult = runtest(self.ns, test); self.accumulate_result(test, result))ÚglobalsÚlocalsr@   z%s in %szWarning: test createdrI   )rŒ   zuncollectable object(s).ztest.)$r   r‘   ZTracer(   r=   ÚmodulesÚkeysr<   Ú	enumerater   r*   r+   rT   Údictr“   Zrunctxr’   r   r‰   r&   rE   r   r   r   r   r   rY   rX   ZcollectZgarbagerL   r)   ÚextendÚ
startswithr   Zunload)r2   r‘   Zsave_modulesZprevious_testrR   r?   r,   ÚtextÚcmdr   r@   rB   Úmoduler3   r3   r4   Úrun_tests_sequential|  sT    




zRegrtest.run_tests_sequentialc             c   s:   x4x.|D ]&}|V  | j rd S | jjr| jrd S qW qW d S )N)r   r   Úfail_env_changedr"   )r2   r   r?   r3   r3   r4   Ú_test_foreverº  s    
zRegrtest._test_foreverc             C   sv   t dt ¡ ftj ¡ žŽ  t dtjdddtj ƒ t dt ¡ ƒ t 	¡ }|rXt d|ƒ t dt
 d¡t ¡ f ƒ d S )	Nz==T)Zaliasedz	%s-endianz== cwd:z== CPU count:z== encodings: locale=%s, FS=%sF)r<   ÚplatformZpython_implementationr=   Úversionrk   Ú	byteorderrO   ÚgetcwdÚ	cpu_countÚlocaleÚgetpreferredencodingÚgetfilesystemencoding)r2   r¤   r3   r3   r4   Údisplay_headerÃ  s    
zRegrtest.display_headerc             C   s–   g }| j r| d¡ n@| jjr0| jr0| d¡ n&t| j| j | j| j| jfƒsV| d¡ | jrf| d¡ |st| d¡ d 	|¡}| j
r’d| j
|f }|S )NÚFAILUREzENV CHANGEDzNO TEST RUNr   ÚSUCCESSz, z
%s then %s)r   r7   r   rž   r"   Úanyr   r    r&   rb   r%   )r2   r@   r3   r3   r4   rˆ   Ð  s     




zRegrtest.get_tests_resultc             C   sþ   | j js.| j js6| j js6| j js6| js6| j js6|  ¡  | j jrh| j j\}}}|dk rhd}t	|t
jdd | j jr~t	d| j jƒ | j jr¦|  t| jƒ¡| _d| _d| _n.t| jƒ| _d t| jƒ¡| _t| jƒd | _| j jròd	d
lm} || ƒ n|  ¡  d S )Né   zhWARNING: Running tests with --huntrleaks/-R and less than 3 warmup repetitions can give false positives!T)r6   rJ   zUsing random seedr   z/{}r   r   )Úrun_tests_multiprocess)r   ÚheaderrM   rK   r`   r   r[   r¨   Ú
huntrleaksr<   r=   Ústdoutrv   rw   ZforeverrŸ   rq   r   r-   r.   Úiterr   rL   Zuse_mpÚtest.libregrtest.runtest_mpr­   r   )r2   ÚwarmupÚrepetitionsÚ_Úmsgr­   r3   r3   r4   Ú	run_testså  s,    
zRegrtest.run_testsc          	   C   s¸   | j rB| jr6t| j dƒ}| | jd ¡ W d Q R X nt | j ¡ | jrf| j ¡ }|jdd| j	j
d tƒ  t ¡ | j }tdt|ƒ ƒ td|  ¡  ƒ | j	jr´t dt ¡  ¡ d S )NÚwÚ
T)Zshow_missingZsummaryÚcoverdirzTotal duration: %szTests result: %szleaks %d)r0   r/   rd   ÚwriterO   Úunlinkr(   ZresultsZwrite_resultsr   rº   r<   r*   r+   r,   r   rˆ   ZrunleaksÚsystemÚgetpid)r2   ry   r^   Zdurationr3   r3   r4   Úfinalize  s    
zRegrtest.finalizec       
   
   C   s
  | j js| jsd S dd lm  m} | d¡}ddddœ}x\| jD ]R}| |¡ xB|D ]:}y ||  t| 	|d¡ƒ7  < W qV t
k
rŽ   Y qVX qVW qBW x$| ¡ D ]\}}| |t|ƒ¡ q¢W tj tj| j j¡}t|dƒ$}x| |¡D ]}	| |	¡ qêW W d Q R X d S )Nr   Z
testsuites)r   ÚerrorsZfailuresÚwb)r   rZ   r1   r9   r:   r;   ZElementr7   rQ   Úgetr8   Úitemsrr   ÚstrrO   ra   rb   r   rj   rd   Ztostringlistr»   )
r2   rC   ÚrootZtotalsr…   ÚkÚvrZ   ÚfÚsr3   r3   r4   Úsave_xml_result  s$    


 zRegrtest.save_xml_resultNc          	   K   sš   |   |¡| _| jjr| jjan(| jjrFt | jj¡\}}| d¡pDtatj	tdd d 
t ¡ ¡}tj t|¡}tj|dd |  ||¡ W d Q R X d S )NÚtempdirT)Úexist_okztest_python_{})rK   )r]   r   rË   rc   Úworker_argsÚjsonÚloadsrÂ   rO   Úmakedirsr   r¾   ra   rb   r   Ztemp_cwdÚ_main)r2   r   r\   Zns_dictrµ   Ztest_cwdr3   r3   r4   Úmain3  s    
zRegrtest.mainc             C   sN  | j jrD| j j\}}}|dk s&|dk rDd}t|tjdd t d¡ | j jd k	rhddlm} || j jƒ | j j	rxt
dƒ | j jt_t| j ƒ |  |¡ | j jr°|  ¡  t d¡ | j jrÊ|  ¡  t d¡ |  ¡  |  ¡  | j jrð| jrð|  ¡  |  ¡  |  ¡  | jrt d¡ | jr$t d	¡ | j jr@| jr@t d
¡ t d¡ d S )Nr   zwInvalid values for the --huntrleaks/-R parameters. The number of warmups and repetitions must be at least 1 each (1:1).T)r6   rJ   é   r   )Úrun_tests_workerzPress any key to continue...é‚   r¬   )r   r¯   r<   r=   rW   ÚexitrÍ   r²   rÔ   ÚwaitÚinputrM   r   ZPGOr   r}   r   r‡   r·   rŠ   Zverbose2r   r‹   r¿   rÊ   r&   rž   r"   )r2   r   r\   r³   r´   rµ   r¶   rÔ   r3   r3   r4   rÑ   L  sB    








zRegrtest._main)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r5   rE   rT   r]   r}   r   rƒ   r‡   r‹   rŠ   r   rŸ   r¨   rˆ   r·   r¿   rÊ   rÒ   rÑ   r3   r3   r3   r4   r   -   s(   ( E
;>	 
r   c             K   s   t ƒ jf d| i|—Ž dS )zRun the Python suite.r   N)r   rÒ   )r   r\   r3   r3   r4   rÒ   ~  s    rÒ   )N)3rP   rV   rÎ   r¥   rO   r    rx   rh   r=   Z	sysconfigZtempfiler*   r   Ztest.libregrtest.cmdliner   Ztest.libregrtest.runtestr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Ztest.libregrtest.setupr   Ztest.libregrtest.utilsr   r   r   r   r?   r   rX   ÚImportErrorZis_python_buildZget_config_varrc   ra   rb   Z
gettempdirÚabspathr   rÒ   r3   r3   r3   r4   Ú<module>   sD   D




    U