U
    ›‰`K`  ã                   @   s  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mZmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( d dl)m*Z* dZ+G d	d
„ d
ƒZ,ddd„Z-d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ÚTIMEOUTÚPROGRESS_MIN_TIMEÚformat_test_resultÚ	is_failed)Úsetup_tests)Úsetup_pgo_tests)ÚremovepyÚcountÚformat_durationÚ	printlist)Úsupportg      ^@c                   @   sÞ   e Zd ZdZdd„ Zdd„ Zd7dd„Zd8d
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/„ Zd9d1d2„Zd3d4„ Zd5d6„ Zd0S ):Ú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 | _t ¡ | _d| _d| _d | _d | _d | _d | _d | _d | _d S )NFÚ é   )ÚnsÚtestsÚselectedÚgoodÚbadÚskippedÚresource_deniedsÚenvironment_changedÚrun_no_testsÚrerunÚfirst_resultÚinterruptedÚ
test_timesÚtracerÚtimeÚ	monotonicÚ
start_timeÚ
test_countÚtest_count_widthÚnext_single_testÚnext_single_filenameÚtestsuite_xmlÚwin_load_trackerÚtmp_dirÚworker_test_name©Úself© r9   ú+/usr/lib/python3.8/test/libregrtest/main.pyÚ__init__6   s.    
zRegrtest.__init__c                 C   s<   t | jƒt | jƒB t | jƒB t | jƒB t | jƒB t | jƒB S ©N)Úsetr!   r"   r#   r$   r%   r&   r7   r9   r9   r:   Úget_executed`   s    ÿÿþzRegrtest.get_executedFc              	   C   sˆ  |j }|j}|ttfkr.|s.| j |j|f¡ |tkrD| j |¡ n´|t	tfkrb|sø| j
 |¡ n–|tkrx| j |¡ n€|tkrŽ| j |¡ nj|tkr°| j |¡ | j |¡ nH|tkrÆ| j |¡ n2|tkrÖd| _n"|tkrì| j
 |¡ ntd| ƒ‚|r|t	tthkr| j
 |¡ |j}|r„dd lm  m} |D ]F}z| j | |¡¡ W n( |jk
r~   t|tj d ‚ Y nX q<d S )NTzinvalid test result: %rr   ©Úfile)!Ú	test_nameÚresultr   r   r*   ÚappendÚ	test_timer   r!   r	   r"   r
   r%   r   r#   r   r$   r   r&   r)   r   Ú
ValueErrorÚremoveÚxml_dataÚxml.etree.ElementTreeÚetreeÚElementTreer3   Z
fromstringZ
ParseErrorÚprintÚsysÚ
__stderr__)r8   rB   r'   rA   ÚokrG   ÚETÚer9   r9   r:   Úaccumulate_resulte   sD    zRegrtest.accumulate_resultr   c                 C   st   | }|   ¡ }|d k	r(d|d›d|› }t ¡ | j }tjt|ƒd}|› d|› }|rd|d d… }t|dd d S )Nz
load avg: z.2fú )ZsecondséÿÿÿÿT)Úflush)Ú
getloadavgr,   r-   r.   ÚdatetimeZ	timedeltaÚintrK   )r8   ÚlineÚemptyZload_avgrD   r9   r9   r:   ÚlogŽ   s    zRegrtest.logc                 C   sh   | j jrd S || j› ›| j› }t| jƒt| jƒ }|rN| j jsN|› d|› }|  d|› d|› ¡ d S )Nú/ú[z] )	r   Úquietr0   r/   Úlenr"   r%   ÚpgorZ   )r8   Ú
test_indexÚtextrX   Zfailsr9   r9   r:   Údisplay_progress    s    zRegrtest.display_progressc           
      C   sÆ   t tjdd … f|Ž}|jr(g  t_| _|j}|d k	r\ddlm	} ||jƒ\}}||_|| _
t|jƒ |jr¦|j\}}}|dk sˆ|dk r¦d}	t|	tjdd t d¡ |jr¼tj |j¡|_|| _d S )Nr   r   )Úparse_worker_argszwInvalid values for the --huntrleaks/-R parameters. The number of warmups and repetitions must be at least 1 each (1:1).T©r@   rT   é   )r   rL   ÚargvÚxmlpathr   Zjunit_xml_listr3   Úworker_argsÚtest.libregrtest.runtest_mprc   r6   r   ÚargsÚ
huntrleaksrK   ÚstderrÚexitÚtempdirÚosÚpathÚ
expanduserr   )
r8   Úkwargsr   rh   rc   rA   ÚwarmupÚrepetitionsÚ_Úmsgr9   r9   r:   Ú
parse_args«   s&    

zRegrtest.parse_argsc              	   C   s   || _ | jjrftj | jd¡| _z0t| jdƒ}| 	¡  
¡ }|g| _ W 5 Q R X W n tk
rd   Y nX | jjræg | _ t d¡}ttj tj| jj¡ƒJ}|D ]>}| dd¡d }| 
¡ }| |¡}|d k	rœ| j  | ¡ ¡ qœW 5 Q R X t| j ƒ | jjrt| jƒ td d … }t ¡ }| jjrX| jjD ]$}	|	|krB| |	¡ | |	¡ q*g | j_| jjrxt | jjt!ƒ t"ƒ ƒ}
nt | jj||ƒ}
| jjs¬| j p¦| jjp¦|
| _#n| j | _#| jjr| j#d d… | _#z"|
 $| j#d ¡}|
|d  | _%W n t&k
r   Y nX | jj'r\z| j#d | j# $| jj'¡…= W n, t(k
rZ   t)d| jj' t*j+d Y nX | jj,rœ| jj-d kr‚t. /d	¡| j_-t. 0| jj-¡ t. 1| j#¡ d S )
NZ
pynexttestÚrz\btest_[a-zA-Z0-9_]+\bú#r   r   z1Couldn't find starting test (%s), using all testsr?   i€–˜ )2r   r   Úsinglero   rp   Újoinr5   r2   ÚopenÚreadÚstripÚOSErrorZfromfileÚreÚcompiler   ÚSAVEDCWDÚsplitÚsearchrC   Úgroupr   r_   r   r   r   ÚcopyZexcluderj   rF   ÚaddZtestdirr   Úlistr=   r    Úindexr1   Ú
IndexErrorÚstartrE   rK   rL   rl   Ú	randomizeÚrandom_seedÚrandomZ	randrangeZseedZshuffle)r8   r   ÚfpZ	next_testZregexrX   ÚmatchZstdtestsZnottestsÚargZalltestsÚposr9   r9   r:   Ú
find_testsÉ   sr    











ÿÿ
zRegrtest.find_testsc                 C   s   | j D ]}t|ƒ qd S r<   )r    rK   )r8   Únamer9   r9   r:   Ú
list_tests  s    
zRegrtest.list_testsc                 C   sX   |D ]N}t |tjjƒrqt |tjƒr0|  |¡ qt |tjƒrt |¡rt	| 
¡ ƒ qd S r<   )Ú
isinstanceÚunittestÚloaderZ_FailedTestZ	TestSuiteÚ_list_casesZTestCaser   Z
match_testrK   Úid)r8   ÚsuiteÚtestr9   r9   r:   r™     s    
zRegrtest._list_casesc              	   C   s²   dt _t  | jj| jj¡ | jD ]N}t| j|ƒ}ztj	 
|¡}|  |¡ W q  tjk
rl   | j |¡ Y q X q | jr®ttjd ttt| jƒdƒdtjd t| jtjd d S )NFr?   rœ   úskipped:)r   ÚverboseZset_match_testsr   Zmatch_testsZignore_testsr    r   r—   ZdefaultTestLoaderZloadTestsFromNamer™   ZSkipTestr#   rC   rK   rL   rl   r   r^   r   )r8   rA   Zabstestr›   r9   r9   r:   Ú
list_cases   s    
zRegrtest.list_casesc                 C   sÄ   d| j _d| j _d| j _|  ¡ | _|  ¡  |  d¡ | jd d … | _| jD ]F}|  d|› d¡ d| j _t	| j |ƒ}| j
|dd |jtkrJ q’qJ| jr¸ttt| jƒdƒdƒ t| jƒ |  ¡  d S )	NTFz'Re-running failed tests in verbose modezRe-running z in verbose mode)r'   rœ   zfailed again:)r   rž   ÚfailfastZverbose3Úget_tests_resultr(   rZ   r"   r'   r   rQ   rB   r   rK   r   r^   r   Údisplay_result)r8   rA   rB   r9   r9   r:   Úrerun_failed_tests1  s$    




zRegrtest.rerun_failed_testsc                 C   s
  | j jrd S tƒ  td|  ¡  ƒ | jr0tdƒ t| jƒ|  ¡  }|rhtƒ  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ƒ | jd d… D ]\}}td|t|ƒf ƒ qò| jr>tƒ  ttt	| jƒdƒdƒ t
| jƒ | jrptƒ  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AllrR   )ÚendzOK.T)Úreversez10 slowest tests:é
   z- %s: %szfailed:z%{} altered the execution environment:r   z%s:zre-run testzrun no tests:)r   r_   rK   r¡   r)   r=   r    r>   r   r^   r   r!   r]   r"   r#   Z
print_slowr*   Úsortr   r%   Úformatr'   r&   )r8   ZomittedrD   rœ   r9   r9   r:   r¢   K  sd    ÿþý

ÿ


zRegrtest.display_resultc                 C   sŽ  | j jr dd l}|jddd| _tj ¡ }d}| j jrJ|dt| j jƒ 7 }|  	|¡ d }t
| jdƒD ]\}}t ¡ }|}|rŠd||f }|  ||¡ | jrÈd	}	ttƒ ƒ}
| jj|	tƒ |
d
 |
d }nt| j |ƒ}|  |¡ |jtkrî q|t|ƒ}t ¡ | }|tkrd|t|ƒf }n|jtkr.d }tj ¡ D ]&}||kr8| d¡r8t |¡ q8| j jrdt|| j ƒrd q|qd|rŠt|ƒ d S )Nr   FT)Útracer   zRun tests sequentiallyz (timeout: %s)r   z%s -- %szDresult = runtest(self.ns, test_name); self.accumulate_result(result))ÚglobalsÚlocalsrB   z%s in %sztest.) r   r©   ZTracer+   rL   ÚmodulesÚkeysZtimeoutr   rZ   Ú	enumerater   r,   r-   rb   Údictr«   Zrunctxrª   r   rQ   rB   r   r   r   r   Ú
startswithr   Zunloadr    r   rK   )r8   r©   Zsave_modulesrv   Zprevious_testr`   rA   r.   ra   Úcmdr   rB   rD   Úmoduler9   r9   r:   Úrun_tests_sequential†  sJ    






zRegrtest.run_tests_sequentialc                 c   s6   |D ]*}|V  | j r d S | jjr| jr d S qq d S r<   )r"   r   Úfail_env_changedr%   )r8   r   rA   r9   r9   r:   Ú_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)rK   ÚplatformZpython_implementationrL   Úversionrƒ   Ú	byteorderro   ÚgetcwdÚ	cpu_countÚlocaleZgetpreferredencodingÚgetfilesystemencoding)r8   rº   r9   r9   r:   Ú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"   rC   r   r´   r%   Úanyr!   r#   r)   r{   r(   )r8   rB   r9   r9   r:   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!Trd   zUsing random seedr   z/{}r   r   )Úrun_tests_multiprocess)r   Úheaderr_   r]   rz   r   rj   r½   rk   rK   rL   ÚstdoutrŒ   r   Zforeverrµ   rˆ   r    r/   r0   Úiterr¨   r^   Zuse_mpri   rÂ   r³   )r8   rs   rt   ru   rv   rÂ   r9   r9   r:   Ú	run_testsè  s<    ÿÿÿþþ
zRegrtest.run_testsc              	   C   s¸   | j rB| jr6t| j dƒ}| | jd ¡ W 5 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)r2   r1   r|   Úwritero   Úunlinkr+   ZresultsZwrite_resultsr   rÉ   rK   r,   r-   r.   r   r¡   ZrunleaksÚsystemÚgetpid)r8   r   rx   Zdurationr9   r9   r:   Úfinalize  s     
ÿzRegrtest.finalizec           
   
   C   sú   | j js| jsd S dd lm  m} | d¡}ddddœ}| jD ]N}| |¡ |D ]:}z ||  t| 	|d¡ƒ7  < W qR t
k
rŠ   Y qRX qRq@| ¡ D ]\}}| |t|ƒ¡ q˜tj tj| j j¡}t|dƒ }| |¡D ]}	| |	¡ qÜW 5 Q R X d S )Nr   Z
testsuites)r   ÚerrorsZfailuresÚwb)r   rg   r3   rH   rI   rJ   ZElementrC   rW   ÚgetrE   Úitemsr=   Ústrro   rp   r{   r   r‚   r|   ZtostringlistrÊ   )
r8   rO   ÚrootZtotalsr›   ÚkÚvrg   ÚfÚsr9   r9   r:   Úsave_xml_result  s$    


 
zRegrtest.save_xml_resultc                 C   st   | j jr| j j| _| js`t ¡ rVt d¡| _| jd krBt d¡| _tj | jd¡| _n
t	 
¡ | _tj | j¡| _d S )NZabs_builddirZsrcdirZbuild)r   rn   r5   Ú	sysconfigZis_python_buildZget_config_varro   rp   r{   ÚtempfileZ
gettempdirÚabspathr7   r9   r9   r:   Úset_temp_dir6  s    


zRegrtest.set_temp_dirc                 C   sL   t j| jdd t  ¡ }| jd k	r.d |¡}n
d |¡}t j | j|¡}|S )NT)Úexist_okztest_python_worker_{}ztest_python_{})ro   Úmakedirsr5   rÍ   r6   r¨   rp   r{   )r8   ÚpidÚtest_cwdr9   r9   r:   Úcreate_temp_dirL  s    

zRegrtest.create_temp_dirc                 C   sz   dd l }tj | | j¡d¡}td| j ƒ |  |¡D ]>}tj |¡r^td| ƒ t 	|¡ q6td| ƒ t 
|¡ q6d S )Nr   ztest_python_*zCleanup %s directoryzRemove directory: %szRemove file: %s)Úglobro   rp   r{   Úescaper5   rK   Úisdirr   ZrmtreerË   )r8   rã   rp   r”   r9   r9   r:   ÚcleanupZ  s    zRegrtest.cleanupNc              
   K   s¨   |   |¡ |  ¡  | jjr,|  ¡  t d¡ |  ¡ }z2tj|dd || j_	|  
||¡ W 5 Q R X W n< tk
r¢ } ztjtdd t |j¡ W 5 d }~X Y nX d S )Nr   T)r]   )rm   )rw   rÝ   r   ræ   rL   rm   râ   r   Ztemp_cwdrn   Ú_mainÚ
SystemExitÚfaulthandlerZdump_traceback_laterÚEXIT_TIMEOUTÚcode)r8   r   rr   rá   Úexcr9   r9   r:   Úmaing  s    

zRegrtest.mainc                 C   s.   | j d k	r| j  ¡ S ttdƒr*t ¡ d S d S )NrU   r   )r4   rU   Úhasattrro   r7   r9   r9   r:   rU   …  s
    


zRegrtest.getloadavgc              
   C   sš  | j d k	r$ddlm} || j| j ƒ | jjr4tdƒ | jjt_| jj	t_
t| jƒ |  |¡ | jjrv|  ¡  t d¡ | jjr|  ¡  t d¡ tjdkrî| j d krîddlm} z|ƒ | _W n0 tk
rì } ztd|› ƒ W 5 d }~X Y nX z.|  ¡  |  ¡  | jjr| jr|  ¡  W 5 | jd k	r:| j ¡  d | _X |  ¡  |  ¡  | jr^t d¡ | jrpt d¡ | jj rŒ| j!rŒt d	¡ t d¡ d S )
Nr   )Úrun_tests_workerzPress any key to continue...Zwin32)ÚWindowsLoadTrackerz%Failed to create WindowsLoadTracker: re   é‚   rÁ   )"r6   ri   rï   r   ÚwaitÚinputr_   r   ZPGOZpgo_extendedZPGO_EXTENDEDr   r“   r•   rL   rm   rŸ   r¶   Ztest.libregrtest.win_utilsrð   r4   ÚFileNotFoundErrorrK   ÚcloserÆ   r¢   Zverbose2r"   r£   rÎ   rÙ   r)   r´   r%   )r8   r   rr   rï   rð   Úerrorr9   r9   r:   rç   Ž  sL    






 



zRegrtest._main)F)r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   r>   rQ   rZ   rb   rw   r“   r•   r™   rŸ   r£   r¢   r³   rµ   r½   r¡   rÆ   rÎ   rÙ   rÝ   râ   ræ   rí   rU   rç   r9   r9   r9   r:   r      s4   *
)
I
;7	 
	r   c                 K   s   t ƒ jf d| i|—Ž dS )zRun the Python suite.r   N)r   rí   )r   rr   r9   r9   r:   rí   É  s    rí   )N).rV   ré   r»   ro   r¶   rŽ   r€   rL   rÚ   rÛ   r,   r—   Ztest.libregrtest.cmdliner   Ztest.libregrtest.runtestr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Ztest.libregrtest.setupr   Ztest.libregrtest.pgor   Ztest.libregrtest.utilsr   r   r   r   rœ   r   rê   r   rí   r9   r9   r9   r:   Ú<module>   s2   L     /