o
    …9j¨d  ã                   @   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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  d dl!m"Z"m#Z#m$Z$m%Z% d dl&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Ú	is_failedÚSTDTESTSÚNOTTESTSÚPROGRESS_MIN_TIMEÚPassedÚFailedÚ
EnvChangedÚSkippedÚResourceDeniedÚInterruptedÚ
ChildErrorÚ	DidNotRun)Úsetup_tests)Úsetup_pgo_tests)ÚremovepyÚcountÚformat_durationÚ	printlist)Úsupport)Ú	os_helperg      ^@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 | _	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Ú
need_rerunÚ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.10/test/libregrtest/main.pyÚ__init__6   s0   

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_executeda   s   ÿÿþzRegrtest.get_executedFc              	   C   sv  |j }t|ttfƒs|s| j |j|f¡ t|tƒr!| j |¡ nYt|t	ƒr3| j
 |¡ | j |¡ nGt|tƒr?| j
 |¡ n;t|tƒrK| j |¡ n/t|tƒr_|s^| j |¡ | j |¡ nt|tƒrk| j |¡ nt|tƒrtd| _ntd| ƒ‚|r‰t|ttfƒs‰| j |¡ |j}|r·dd lm  m} |D ]}z| j | |¡¡ W q™ |jy¶   t|tj d� ‚ w d S d S )NTzinvalid test result: %rr   ©Úfile)!ÚnameÚ
isinstancer   r   r*   ÚappendÚduration_secr
   r    r   r"   r#   r   r   r$   r   r!   r&   r   r%   r)   Ú
ValueErrorÚremoveÚxml_dataÚxml.etree.ElementTreeÚetreeÚElementTreer3   Ú
fromstringÚ
ParseErrorÚprintÚsysÚ
__stderr__)r8   Úresultr'   Ú	test_namerG   ÚETÚer9   r9   r:   Úaccumulate_resultf   sH   




€

þûzRegrtest.accumulate_resultr   c                 C   s’   | }|   ¡ }|d urd|d›d|› �}t ¡ | j }tt|ƒdƒ\}}t|dƒ\}}d|||f }|› d|› �}|rA|d d… }t|dd� d S )	Nz
load avg: z.2fú é<   z%d:%02d:%02déÿÿÿÿT)Úflush)Ú
getloadavgr,   r-   r.   ÚdivmodÚintrM   )r8   ÚlineÚemptyÚload_avgÚ	test_timeÚminsÚsecsÚhoursr9   r9   r:   Úlog�   s   zRegrtest.logc                 C   sh   | j jrd S || j› ›| j› �}t| jƒt| jƒ }|r'| j js'|› d|› �}|  d|› d|› �¡ d S )Nú/ú[z] )	r   Úquietr0   r/   Úlenr!   r$   Úpgorc   )r8   Ú
test_indexÚtextr\   Úfailsr9   r9   r:   Údisplay_progress¢   s   zRegrtest.display_progressc           
      C   sÊ   t tjdd … fi |¤Ž}|jrg  t_| _|j}|d ur0ddlm	} ||jƒ\}}||_|| _
t|jƒ |jrU|j\}}}|dk sF|dk rUd}	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@   rX   é   )r   rN   ÚargvÚxmlpathr   Újunit_xml_listr3   Úworker_argsÚtest.libregrtest.runtest_mprm   r6   r   ÚargsÚ
huntrleaksrM   ÚstderrÚexitÚtempdirÚosÚpathÚ
expanduserr   )
r8   Úkwargsr   rs   rm   rQ   ÚwarmupÚrepetitionsÚ_Úmsgr9   r9   r:   Ú
parse_args­   s&   


zRegrtest.parse_argsc                 C   s¶  || _ | jjr<tj | jd¡| _z"t| jdƒ�}| 	¡  
¡ }|g| _ W d   ƒ n1 s,w   Y  W n	 ty;   Y nw | jjr†g | _ t d¡}ttj tj| jj¡ƒ�*}|D ]}| dd¡d }| 
¡ }| |¡}|d urv| j  | ¡ ¡ qWW d   ƒ n1 s�w   Y  t| j ƒ | jjr”t| jƒ td d … }t ¡ }| jjr»| jjD ]}	|	|v r±| |	¡ | |	¡ q¦g | j_| jjrÊt | 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&�y   Y nw | jj'�r7z| j#d | j# $| jj'¡…= W n t(�y6   t)d| jj' t*j+d� Y nw | jj,�rY| jj-d u �rJt. /d	¡| j_-t. 0| jj-¡ t. 1| j#¡ d S d S )
NÚ
pynexttestÚrz\btest_[a-zA-Z0-9_]+\bú#r   r   z1Couldn't find starting test (%s), using all testsr?   i€–˜ )2r   r   Úsinglerz   r{   Újoinr5   r2   ÚopenÚreadÚstripÚOSErrorÚfromfileÚreÚcompiler   ÚSAVEDCWDÚsplitÚsearchrC   Úgroupr   rh   r   r   r   ÚcopyÚexcluderu   rF   ÚaddÚtestdirr   Úlistr=   r   Úindexr1   Ú
IndexErrorÚstartrE   rM   rN   rw   Ú	randomizeÚrandom_seedÚrandomÚ	randrangeÚseedÚshuffle)r8   r   ÚfpÚ	next_testÚregexr\   ÚmatchÚstdtestsÚnottestsÚargÚalltestsÚposr9   r9   r:   Ú
find_testsË   s„   
þ€ÿ

€ûÿ



ÿ
ÿ
ÿÿ
üzRegrtest.find_testsc                 C   s   | j D ]}t|ƒ qd S r<   )r   rM   )r8   rA   r9   r9   r:   Ú
list_tests  s   

ÿzRegrtest.list_testsc                 C   sX   |D ]'}t |tjjƒrqt |tjƒr|  |¡ qt |tjƒr)t |¡r)t	| 
¡ ƒ qd S r<   )rB   ÚunittestÚloaderÚ_FailedTestÚ	TestSuiteÚ_list_casesÚTestCaser   Ú
match_testrM   Úid)r8   ÚsuiteÚtestr9   r9   r:   r°     s   
€ùzRegrtest._list_casesc              	   C   s²   dt _t  | jj| jj¡ | jD ]%}t| j|ƒ}ztj	 
|¡}|  |¡ W q tjy5   | j |¡ Y qw | jrWttjd� ttt| jƒdƒdtjd� t| jtjd� d S d S )NFr?   rµ   úskipped:)r   ÚverboseÚset_match_testsr   Úmatch_testsÚignore_testsr   r   r¬   ÚdefaultTestLoaderÚloadTestsFromNamer°   ÚSkipTestr"   rC   rM   rN   rw   r   rg   r   )r8   rQ   Úabstestr´   r9   r9   r:   Ú
list_cases"  s   
ÿýzRegrtest.list_casesc           
      C   s|  d| j _d| j _d| j _|  ¡ | _|  ¡  |  d¡ t| jƒ}| j 	¡  |D ]~}|j
}| j |¡ |jp5g }|jp:g }dd„ |D ƒ}dd„ |D ƒ}d| j _| j j}|sU|rƒ| j jd u r_g | j _| j j |¡ | j j |¡ dd | j j¡ }	|  d	|› d
|	› d�¡ n	|  d	|› d�¡ t| j |ƒ}|| j _| j|dd� t|tƒr¤ nq&| jr¸ttt| jƒdƒdƒ t| jƒ |  ¡  d S )NTFz'Re-running failed tests in verbose modec                 S   ó   g | ]^}}|  d ¡d ‘qS ©rU   r   ©r�   ©Ú.0Útest_full_namer€   r9   r9   r:   Ú
<listcomp>D  ó    z/Regrtest.rerun_failed_tests.<locals>.<listcomp>c                 S   rÀ   rÁ   rÂ   rÃ   r9   r9   r:   rÆ   E  rÇ   z
matching: ú, zRe-running z in verbose mode (ú)z in verbose mode)r'   rµ   zfailed again:)r   r·   ÚfailfastÚverbose3Úget_tests_resultr(   rc   r—   r&   ÚclearrA   r'   rC   ÚerrorsÚfailuresr¹   Úextendr‡   r   rT   rB   r   r!   rM   r   rg   r   Údisplay_result)
r8   Ú
rerun_listrP   rQ   rÎ   rÏ   Úerror_namesÚfailure_namesÚorig_match_testsÚmatchingr9   r9   r:   Úrerun_failed_tests3  sF   






ÿ
zRegrtest.rerun_failed_testsc                 C   s   | j jrd S tƒ  td|  ¡  ƒ | jrtdƒ t| jƒ|  ¡  }|r4tƒ  ttt	|ƒdƒdƒ t
|ƒ | jr_| j js_tƒ  | jsT| jsT| jsTt	| jƒdkrTt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 ƒ qx| jr�tƒ  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 d S )Nz== Tests result: %s ==z(Test suite interrupted by signal SIGINT.rµ   zomitted:r   ÚAllrU   )Ú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   rh   rM   rÌ   r)   r=   r   r>   r   rg   r   r    rf   r!   r"   Ú
print_slowr*   Úsortr   r$   Úformatr'   r%   )r8   Úomittedr_   rµ   r9   r9   r:   rÑ   _  sd   ÿþ
ÿ


ýzRegrtest.display_resultc                 C   s€  | j jrdd l}|jddd�| _tj ¡ }d}| j jr%|dt| j jƒ 7 }|  	|¡ d }t
| jdƒD ]ƒ\}}t ¡ }|}|rDd||f }|  ||¡ | jrcd	}	ttƒ ƒ}
| jj|	tƒ |
d
� |
d }nt| j |ƒ}|  |¡ t|tƒru nAt|ƒ}t ¡ | }|tkrŒd|t|ƒf }nt|tƒr“d }tj ¡ D ]}||vr¨| d¡r¨t |¡ q˜| j jrµt|| j ƒrµ nq2|r¾t|ƒ d S 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ÚlocalsrP   z%s in %sztest.) r   rà   ÚTracer+   rN   ÚmodulesÚkeysÚtimeoutr   rc   Ú	enumerater   r,   r-   rl   Údictrâ   Úrunctxrá   r   rT   rB   r   Ústrr	   r
   Ú
startswithr   ÚunloadrÊ   r   rM   )r8   rà   Úsave_modulesr�   Úprevious_testri   rQ   r.   rj   Úcmdr   rP   r_   Úmoduler9   r9   r:   Úrun_tests_sequentialš  sP   







€€ÿzRegrtest.run_tests_sequentialc                 c   s6   � 	 |D ]}|V  | j r d S | jjr| jr d S qqr<   )r!   r   Úfail_env_changedr$   )r8   r   rQ   r9   r9   r:   Ú_test_foreverÑ  s   €€úzRegrtest._test_foreverc                 C   sx   t dt ¡ gtj ¡ ¢R Ž  t dtjdd�dtj ƒ t dt ¡ ƒ t 	¡ }|r-t d|ƒ t dt
 d¡t ¡ f ƒ d S )	Nz==T)Úaliasedz	%s-endianz== cwd:z== CPU count:z== encodings: locale=%s, FS=%sF)rM   ÚplatformÚpython_implementationrN   Úversionr�   Ú	byteorderrz   ÚgetcwdÚ	cpu_countÚlocaleÚgetpreferredencodingÚgetfilesystemencoding)r8   rú   r9   r9   r:   Údisplay_headerÚ  s   ÿ
ÿ
ÿzRegrtest.display_headerc                 C   s–   g }| j r| d¡ n | jjr| jr| d¡ nt| j| j | j| j| jfƒs+| d¡ | jr3| d¡ |s:| d¡ d 	|¡}| j
rId| j
|f }|S )NÚFAILUREzENV CHANGEDzNO TEST RUNÚINTERRUPTEDÚSUCCESSrÈ   z
%s then %s)r!   rC   r   rò   r$   Úanyr    r"   r)   r‡   r(   )r8   rP   r9   r9   r:   rÌ   ç  s"   ÿ



zRegrtest.get_tests_resultc              
   C   sž  | j js| j js| j js| j js| js| j js|  ¡  | j jr4| j j\}}}|dk r4d}t	|t
jdd� | j jr?t	d| j jƒ | j jrS|  t| jƒ¡| _d| _d| _nt| jƒ| _d t| jƒ¡| _t| jƒd | _| j jrÉd	d
lm} t
jdkr¤| jd u r¤d	dlm} z|ƒ | _W n ty£ } zt	d|› �ƒ W Y d }~nd }~ww z|| ƒ W | jd ur¹| j  ¡  d | _d S d S | jd urÈ| j  ¡  d | _w |  !¡  d S )Né   zhWARNING: Running tests with --huntrleaks/-R and less than 3 warmup repetitions can give false positives!Trn   zUsing random seedr   z/{}r   r   )Úrun_tests_multiprocessÚwin32)ÚWindowsLoadTrackerz%Failed to create WindowsLoadTracker: )"r   Úheaderrh   rf   r†   r   ru   rþ   rv   rM   rN   Ústdoutr›   rœ   Úforeverró   r—   r   r/   r0   ÚiterrÞ   rg   Úuse_mprt   r  rõ   r6   Útest.libregrtest.win_utilsr  r4   ÚPermissionErrorÚcloserñ   )r8   r~   r   r€   r�   r  r  Úerrorr9   r9   r:   Ú	run_testsü  sZ   ÿÿÿþþ€ý



þ
zRegrtest.run_testsc                 C   sÐ   | j r+| jr%t| j dƒ�}| | jd ¡ W d   ƒ n1 sw   Y  nt | j ¡ | jr=| j ¡ }|jdd| j	j
d� tƒ  t ¡ | j }tdt|ƒ ƒ td|  ¡  ƒ | j	jrft dt ¡  ¡ d S d S )NÚwÚ
T)Úshow_missingÚsummaryÚcoverdirzTotal duration: %szTests result: %szleaks %d)r2   r1   rˆ   Úwriterz   Úunlinkr+   ÚresultsÚwrite_resultsr   r  rM   r,   r-   r.   r   rÌ   ÚrunleaksÚsystemÚgetpid)r8   r¡   r„   Ú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 ]%}| |¡ |D ]}z||  t| 	|d¡ƒ7  < W q) t
yD   Y q)w q | ¡ D ]\}}| |t|ƒ¡ qJtj tj| j j¡}t|dƒ�}| |¡D ]}	| |	¡ qlW d   ƒ d S 1 sw   Y  d S )Nr   Ú
testsuites)r   rÎ   rÏ   Úwb)r   rq   r3   rH   rI   rJ   ÚElementrC   r[   ÚgetrE   Úitemsr=   rê   rz   r{   r‡   r   r�   rˆ   Útostringlistr  )
r8   rR   ÚrootÚtotalsr´   ÚkÚvrq   ÚfÚsr9   r9   r:   Úsave_xml_resultB  s,   


 ÿýÿ"ÿzRegrtest.save_xml_resultc                 C   st   | j jr	| j j| _| js0t ¡ r+t d¡| _| jd u r!t d¡| _tj | jd¡| _nt	 
¡ | _tj | j¡| _d S )NÚabs_builddirÚsrcdirÚbuild)r   ry   r5   Ú	sysconfigÚis_python_buildÚget_config_varrz   r{   r‡   ÚtempfileÚ
gettempdirÚabspathr7   r9   r9   r:   Úset_temp_dir[  s   


zRegrtest.set_temp_dirc                 C   sV   t j| jdd� t  ¡ }| jd urd |¡}nd |¡}|tj7 }t j 	| j|¡}|S )NT)Úexist_okztest_python_worker_{}ztest_python_{})
rz   Úmakedirsr5   r  r6   rÞ   r   ÚFS_NONASCIIr{   r‡   )r8   ÚpidÚtest_cwdr9   r9   r:   Úcreate_temp_dirq  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 	|¡ qtd| ƒ t 
|¡ qd S )Nr   ztest_python_*zCleanup %s directoryzRemove directory: %szRemove file: %s)Úglobrz   r{   r‡   Úescaper5   rM   Úisdirr   Úrmtreer  )r8   r<  r{   rA   r9   r9   r:   Úcleanup€  s   úzRegrtest.cleanupNc              
   K   sÂ   |   |¡ |  ¡  | jjr|  ¡  t d¡ |  ¡ }z&tj|dd�� || j_	|  
||¡ W d   ƒ W d S 1 s9w   Y  W d S  ty` } ztjtdd� t |j¡ W Y d }~d S d }~ww )Nr   T)rf   )rx   )r‚   r5  r   r@  rN   rx   r;  r   Útemp_cwdry   Ú_mainÚ
SystemExitÚfaulthandlerÚdump_traceback_laterÚEXIT_TIMEOUTÚcode)r8   r   r}   r:  Úexcr9   r9   r:   Úmain�  s    

&ú€ûzRegrtest.mainc                 C   s.   | j d ur
| j  ¡ S ttdƒrt ¡ d S d S )NrY   r   )r4   rY   Úhasattrrz   r7   r9   r9   r:   rY   «  s
   


zRegrtest.getloadavgc                 C   s  | j d urddlm} || j| j ƒ | jjrtdƒ | jjt_| jj	t_
t| jƒ |  |¡ | jjr;|  ¡  t d¡ | jjrH|  ¡  t d¡ |  ¡  |  ¡  | jjr[| jr[|  ¡  |  ¡  |  ¡  | jrkt d¡ | jrst d¡ | jjr| jrt d¡ t d¡ d S )Nr   )Úrun_tests_workerzPress any key to continue...ro   é‚   r  )r6   rt   rK  r   ÚwaitÚinputrh   r   ÚPGOÚpgo_extendedÚPGO_EXTENDEDr   rª   r«   rN   rx   r¿   r  rÑ   Úverbose2r!   r×   r  r+  r)   rò   r$   )r8   r   r}   rK  r9   r9   r:   rB  ´  s8   









zRegrtest._main)F)r   r<   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   r>   rT   rc   rl   r‚   rª   r«   r°   r¿   r×   rÑ   rñ   ró   rþ   rÌ   r  r  r+  r5  r;  r@  rI  rY   rB  r9   r9   r9   r:   r      s6    +

'I
,;7	1
	r   c                 K   s   t ƒ jdd| i|¤Ž dS )zRun the Python suite.r   Nr9   )r   rI  )r   r}   r9   r9   r:   rI  Þ  s   rI  r<   )-rD  rû   rz   rõ   r�   r�   rN   r/  r2  r,   r¬   Útest.libregrtest.cmdliner   Útest.libregrtest.runtestr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   Útest.libregrtest.setupr   Útest.libregrtest.pgor   Útest.libregrtest.utilsr   r   r   r   rµ   r   Útest.supportr   rF  r   rI  r9   r9   r9   r:   Ú<module>   s4    D     D