B
    2*™\VY  ã               @   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srcdirÚ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© r4   ú@C:\ALexclude\prg\programme\Python37\Lib\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ÚElementTreer2   Z
fromstringZ
ParseErrorÚprintÚsysÚ
__stderr__)r3   ÚtestÚresultÚokÚ	test_timeZxml_dataÚETÚer4   r4   r5   Ú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ÚosrI   r+   r,   r-   ÚdatetimeZ	timedeltaÚintr=   )r3   Ú
test_indexr@   ÚlineZfailsZload_avg_1minrC   r4   r4   r5   Ú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)r7   z$No GC available, ignore --threshold.z&No GC available, disabling --findleaksF)r   r>   ÚargvZtimeoutrO   Úfaulthandlerr=   ÚstderrZ	thresholdÚgcÚ	findleaksÚxmlpathr   Zjunit_xml_listr2   r   Úargs)r3   Úkwargsr   r4   r4   r5   Ú
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)r7   i€–˜ )0r   r   ÚsinglerP   ÚpathÚjoinÚTEMPDIRr1   ÚopenÚreadÚstripÚOSErrorZfromfileÚreÚcompiler   ÚSAVEDCWDÚsplitÚsearchr8   Úgroupr   r   r   ÚcopyZexcluder\   ÚremoveÚaddZtestdirr   ÚlistÚsetr   Úindexr0   Ú
IndexErrorÚstartr9   r=   r>   rX   Ú	randomizeÚrandom_seedÚrandomZ	randrangeZseedZshuffle)r3   r   ÚfpZ	next_testZregexrT   ÚmatchZstdtestsZnottestsÚargZalltestsÚposr4   r4   r5   Ú
find_tests¿   sh    











zRegrtest.find_testsc             C   s   x| j D ]}t|ƒ qW d S )N)r   r=   )r3   Únamer4   r4   r5   Ú
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)r3   Úsuiter@   r4   r4   r5   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)r7   r@   zskipped:)r   ÚverboseZset_match_testsr   Zmatch_testsr   r   r‚   ZdefaultTestLoaderZloadTestsFromNamer„   ZSkipTestr!   r8   r=   r>   rX   r   rM   r   )r3   r@   Zabstestr†   r4   r4   r5   Ú
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)rK   r   r@   zfailed again:)r   r‡   ZfailfastZverbose3Úget_tests_resultr&   r=   r    r$   r   ÚKeyboardInterruptr'   r   r
   r   r   rp   r   rM   r   Údisplay_result)r3   r@   rB   r4   r4   r5   Ú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AllrJ   )Ú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   rN   r=   r‰   r'   rs   r   r    r!   r   r   rM   r   rL   Z
print_slowr(   Úsortr   r#   Úformatr$   r%   )r3   ZexecutedZomittedr+   r@   r4   r4   r5   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ÚlocalsrA   z%s in %szWarning: test createdrJ   )r   zuncollectable object(s).ztest.)$r   r’   ZTracer)   r>   ÚmodulesÚkeysr=   Ú	enumerater   r+   r,   rU   Údictr”   Zrunctxr“   r   rŠ   r'   rF   r   r   r   r   r   rZ   rY   ZcollectZgarbagerM   r*   ÚextendÚ
startswithr   Zunload)r3   r’   Zsave_modulesZprevious_testrS   r@   r-   ÚtextÚcmdr   rA   rC   Úmoduler4   r4   r5   Ú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#   )r3   r   r@   r4   r4   r5   Ú_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>   Úversionrl   Ú	byteorderrP   ÚgetcwdÚ	cpu_countÚlocaleÚgetpreferredencodingÚgetfilesystemencoding)r3   r¥   r4   r4   r5   Ú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    r8   r   rŸ   r#   Úanyr   r!   r'   rc   r&   )r3   rA   r4   r4   r5   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)r7   rK   zUsing random seedr   z/{}r   r   )Úrun_tests_multiprocess)r   ÚheaderrN   rL   ra   r   r\   r©   Ú
huntrleaksr=   r>   Ústdoutrw   rx   Zforeverr    rr   r   r.   r/   Úiterr‘   rM   Zuse_mpÚtest.libregrtest.runtest_mpr®   rž   )r3   ÚwarmupÚrepetitionsÚ_Úmsgr®   r4   r4   r5   Ú	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)r1   r0   re   ÚwriterP   Úunlinkr)   ÚresultsZwrite_resultsr   r»   r=   r+   r,   r-   r   r‰   ZrunleaksÚsystemÚgetpid)r3   rz   r_   Zdurationr4   r4   r5   Ú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   r[   r2   r:   r;   r<   ZElementr8   rR   Úgetr9   Úitemsrs   ÚstrrP   rb   rc   r   rk   re   Ztostringlistr¼   )
r3   rD   ÚrootZtotalsr†   ÚkÚvr[   ÚfÚsr4   r4   r5   Ú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_{})rL   )r^   r   rÍ   rd   Úworker_argsÚjsonÚloadsrÄ   rP   Úmakedirsr‘   rÀ   rb   rc   r   Ztemp_cwdÚ_main)r3   r   r]   Zns_dictr¶   Ztest_cwdr4   r4   r5   Ú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)r7   rK   é   r   )Úrun_tests_workerzPress any key to continue...é‚   r­   )r   r°   r=   r>   rX   ÚexitrÏ   r³   rÖ   ÚwaitÚinputrN   r   ZPGOr   r~   r€   rˆ   r¸   r‹   Zverbose2r    rŒ   rÁ   rÌ   r'   rŸ   r#   )r3   r   r]   r´   rµ   r¶   r·   rÖ   r4   r4   r5   rÓ   L  sB    








zRegrtest._main)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   rF   rU   r^   r~   r€   r„   rˆ   rŒ   r‹   rž   r    r©   r‰   r¸   rÁ   rÌ   rÔ   rÓ   r4   r4   r4   r5   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]   r4   r4   r5   rÔ   ~  s    rÔ   )N)3rQ   rW   rÐ   r¦   rP   r¡   ry   ri   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   rY   ÚImportErrorZis_python_buildZget_config_varrd   rb   rc   Z
gettempdirÚabspathr   rÔ   r4   r4   r4   r5   Ú<module>   sD   D




    U