B
    ï¥à`]_  ã               @   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#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)Ú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© r7   ú+/usr/lib/python3.7/test/libregrtest/main.pyÚ__init__5   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%   )r6   r7   r7   r8   Ú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} xN|D ]F}y| j | |¡¡ W n( |jk
r€   t|tj d ‚ Y nX q>W 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ÚElementTreer2   Z
fromstringZ
ParseErrorÚprintÚsysÚ
__stderr__)r6   r>   r&   r=   ÚokrC   ÚETÚer7   r7   r8   Úaccumulate_resultd   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ÚintrG   )r6   ÚlineÚemptyZload_avgr@   r7   r7   r8   Ú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   Úquietr/   r.   Úlenr!   r$   ÚpgorV   )r6   Ú
test_indexÚtextrT   Zfailsr7   r7   r8   Ú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<   rP   é   )r   rH   ÚargvÚxmlpathr   Zjunit_xml_listr2   Úworker_argsÚtest.libregrtest.runtest_mpr_   r5   r   ÚargsÚ
huntrleaksrG   ÚstderrÚexitÚtempdirÚosÚpathÚ
expanduserr   )
r6   Úkwargsr   rc   r_   r=   ÚwarmupÚrepetitionsÚ_Úmsgr7   r7   r8   Ú
parse_argsª   s&    

zRegrtest.parse_argsc          	   C   s”  || _ | jjrftj | jd¡| _y0t| jdƒ}| 	¡  
¡ }|g| _ W d Q R X W n tk
rd   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rLx0| jjD ]$}	|	|kr4| |	¡ | |	¡ qW g | j_| jjrlt| 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%rPy| j!d | j! "| jj%¡…= W n, t&k
rN   t'd| jj% t(j)d Y nX | jj*r| jj+d krvt, -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)r<   i€–˜ )0r   r   Úsinglerj   rk   Újoinr4   r1   ÚopenÚreadÚstripÚOSErrorZfromfileÚreÚcompiler   ÚSAVEDCWDÚsplitÚsearchr?   Úgroupr   r   r   ÚcopyZexcludere   rB   ÚaddZtestdirr   Úlistr:   r   Úindexr0   Ú
IndexErrorÚstartrA   rG   rH   rg   Ú	randomizeÚrandom_seedÚrandomZ	randrangeZseedZshuffle)r6   r   ÚfpZ	next_testZregexrT   ÚmatchZstdtestsZnottestsÚargZalltestsÚposr7   r7   r8   Ú
find_testsÈ   sh    











zRegrtest.find_testsc             C   s   x| j D ]}t|ƒ qW d S )N)r   rG   )r6   Únamer7   r7   r8   Ú
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_testrG   Úid)r6   ÚsuiteÚtestr7   r7   r8   r”     s    

zRegrtest._list_casesc          	   C   s¶   dt _t  | jj| jj¡ xX| jD ]N}t| j|ƒ}ytj	 
|¡}|  |¡ W q" tjk
rn   | 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)r<   r—   zskipped:)r   ÚverboseZset_match_testsr   Zmatch_testsZignore_testsr   r   r’   ZdefaultTestLoaderZloadTestsFromNamer”   ZSkipTestr"   r?   rG   rH   rg   r   rZ   r   )r6   r=   Zabstestr–   r7   r7   r8   Ú
list_cases  s    zRegrtest.list_casesc             C   sÆ   d| j _d| j _d| j _|  ¡ | _|  ¡  |  d¡ | jd d … | _xN| jD ]D}|  d|› d¡ d| j _t	| j |ƒ}| j
|dd |jtkrLP qLW | 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'   rV   r!   r&   r   rM   r>   r   rG   r   rZ   r   Údisplay_result)r6   r=   r>   r7   r7   r8   Úrerun_failed_tests,  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ƒ x.| jd d… D ]\}}td|t|ƒf ƒ qôW | jrBtƒ  ttt	| jƒdƒdƒ t
| jƒ | jrttƒ  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AllrN   )Ú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   r[   rG   r›   r(   r:   r   r;   r   rZ   r   r    rY   r!   r"   Z
print_slowr)   Úsortr   r$   Úformatr&   r%   )r6   Zomittedr@   r—   r7   r7   r8   rœ   F  s\    




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 }x"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îP t|ƒ}t ¡ | }|tkrd|t|ƒf }n|jtkr.d }x4tj ¡ D ]&}||kr:| d¡r:t |¡ q:W | j jrht|| j ƒrhP qhW |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Úlocalsr>   z%s in %sztest.) r   r£   ZTracer*   rH   ÚmodulesÚkeysZtimeoutr   rV   Ú	enumerater   r+   r,   r^   Údictr¥   Zrunctxr¤   r   rM   r>   r   r   r   r   Ú
startswithr   Zunloadrš   r   rG   )r6   r£   Zsave_modulesrq   Zprevious_testr\   r=   r-   r]   Úcmdr   r>   r@   Úmoduler7   r7   r8   Úrun_tests_sequential  sJ    






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$   )r6   r   r=   r7   r7   r8   Ú_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)rG   ÚplatformZpython_implementationrH   Úversionr~   Ú	byteorderrj   ÚgetcwdÚ	cpu_countÚlocaleZgetpreferredencodingÚgetfilesystemencoding)r6   r´   r7   r7   r8   Ú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!   r?   r   r®   r$   Úanyr    r"   r(   rv   r'   )r6   r>   r7   r7   r8   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)r<   rP   zUsing random seedr   z/{}r   r   )Úrun_tests_multiprocess)r   Úheaderr[   rY   ru   r   re   r·   rf   rG   rH   Ústdoutr‡   rˆ   Zforeverr¯   rƒ   r   r.   r/   Úiterr¢   rZ   Zuse_mprd   r¼   r­   )r6   rn   ro   rp   rq   r¼   r7   r7   r8   Ú	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   rw   Úwriterj   Úunlinkr*   ZresultsZwrite_resultsr   rÃ   rG   r+   r,   r-   r   r›   ZrunleaksÚsystemÚgetpid)r6   rŠ   rs   Zdurationr7   r7   r8   Ú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   rb   r2   rD   rE   rF   ZElementr?   rS   ÚgetrA   Úitemsr:   Ústrrj   rk   rv   r   r}   rw   ZtostringlistrÄ   )
r6   rK   ÚrootZtotalsr–   ÚkÚvrb   ÚfÚsr7   r7   r8   Ú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   ri   r4   Ú	sysconfigZis_python_buildZget_config_varrj   rk   rv   ÚtempfileZ
gettempdirÚabspath)r6   r7   r7   r8   Úset_temp_dir1  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_{})rj   Úmakedirsr4   rÇ   r5   r¢   rk   rv   )r6   ÚpidÚtest_cwdr7   r7   r8   Úcreate_temp_dirG  s    

zRegrtest.create_temp_dirc             C   sx   dd l }tj | jd¡}td| j ƒ xL|  |¡D ]>}tj |¡rZtd| ƒ t |¡ q2td| ƒ t 	|¡ q2W d S )Nr   ztest_python_*zCleanup %s directoryzRemove directory: %szRemove file: %s)
Úglobrj   rk   rv   r4   rG   Úisdirr   ZrmtreerÅ   )r6   rÝ   rk   r   r7   r7   r8   ÚcleanupU  s    zRegrtest.cleanupNc          
   K   s¨   |   |¡ |  ¡  | jjr,|  ¡  t d¡ |  ¡ }y2tj|dd || j_	|  
||¡ W d Q R X W n< tk
r¢ } ztjtdd t |j¡ W d d }~X Y nX d S )Nr   T)rY   )rh   )rr   r×   r   rß   rH   rh   rÜ   r   Ztemp_cwdri   Ú_mainÚ
SystemExitÚfaulthandlerZdump_traceback_laterÚEXIT_TIMEOUTÚcode)r6   r   rm   rÛ   Úexcr7   r7   r8   Úmainb  s    

zRegrtest.mainc             C   s.   | j d k	r| j  ¡ S ttdƒr*t ¡ d S d S )NrQ   r   )r3   rQ   Úhasattrrj   )r6   r7   r7   r8   rQ   €  s
    


zRegrtest.getloadavgc          
   C   s  | j d k	r$ddlm} || j| j ƒ | jjr4tdƒ | jjt_t	| jƒ |  
|¡ | jjrl|  ¡  t d¡ | jjr†|  ¡  t d¡ tjdkrä| j d kräddlm} y|ƒ | _W n0 tk
râ } ztd|› ƒ W d d }~X Y nX z.|  ¡  |  ¡  | jjr| jr|  ¡  W d | jd k	r0| j ¡  d | _X |  ¡  |  ¡  | jrTt d¡ | jrft 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: r`   é‚   r»   ) r5   rd   rè   r   ÚwaitÚinputr[   r   ZPGOr   rŽ   r   rH   rh   r™   r°   Ztest.libregrtest.win_utilsré   r3   ÚFileNotFoundErrorrG   rÀ   rœ   Zverbose2r!   r   ÚcloserÈ   rÓ   r(   r®   r$   )r6   r   rm   rè   ré   Úerrorr7   r7   r8   rà   ‰  sJ    





 



zRegrtest._main)F)r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r9   r;   rM   rV   r^   rr   rŽ   r   r”   r™   r   rœ   r­   r¯   r·   r›   rÀ   rÈ   rÓ   r×   rÜ   rß   ræ   rQ   rà   r7   r7   r7   r8   r      s4   *
)
E
;7	 
	r   c             K   s   t ƒ jf d| i|—Ž dS )zRun the Python suite.r   N)r   ræ   )r   rm   r7   r7   r8   ræ   Ã  s    ræ   )N),rR   râ   rµ   rj   r°   r‰   r{   rH   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.utilsr   r   r   r   r—   r   rã   r   ræ   r7   r7   r7   r8   Ú<module>   s0   L     *