U
    ¼Ê¦i+)  ã                   @   sv  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 d dlmZ d dlmZmZ dZd ZdZdZd	Zd
ZdZdZdZedededededededededi	ZdZddddddddd d!g
Z e!ƒ Z"g Z#d"d#„ Z$d$d%„ Z%d;d&d'„Z&de e"fd(d)„Z'd*d+„ Z(e  )d,d-¡Z*d.d/„ Z+d0d1„ Z,d2d3„ Z-d4d5„ Z.d<d7d8„Z/d9d:„ Z0dS )=é    N)Úsupport)Údash_RÚclear_caches)Úsaved_test_environment)Úformat_durationÚprint_warningé   éÿÿÿÿéþÿÿÿéýÿÿÿéüÿÿÿéûÿÿÿiúÿÿÿiùÿÿÿz	%s passedz	%s failedz%s failed (env changed)z
%s skippedz%s skipped (resource denied)z%s interruptedz
%s crashedz%s run no testsz%s timed outg      >@Ztest_grammarZtest_opcodesZ	test_dictZtest_builtinZtest_exceptionsZ
test_typesZtest_unittestZtest_doctestZtest_doctest2Ztest_supportc                 C   s,   | j }|ttttfkrdS |tkr(|jS dS )NFT)ÚresultÚPASSEDÚRESOURCE_DENIEDÚSKIPPEDÚTEST_DID_NOT_RUNÚENV_CHANGEDZfail_env_changed)r   ÚnsÚok© r   ú./usr/lib/python3.8/test/libregrtest/runtest.pyÚ	is_failedE   s    r   c                 C   s8   t  | jd¡}|| j }| jtkr4d|t| jƒf }|S )Nz%sz%s (%s))Ú_FORMAT_TEST_RESULTÚgetr   Ú	test_nameÚTIMEOUTr   Ú	test_time)r   ZfmtÚtextr   r   r   Úformat_test_resultN   s
    

r   c                 C   s   | pt j t j t¡¡pt jS )N)ÚosÚpathÚdirnameÚ__file__Úcurdir)r!   r   r   r   ÚfindtestdirV   s    r%   c           	      C   sr   t | ƒ} t | ¡}g }t|ƒ|B }|D ]>}tj |¡\}}|dd… dkr&|dkr&||kr&| |¡ q&|t|ƒ S )z-Return a list of all applicable test modules.Né   Ztest_)z.pyÚ )r%   r    ÚlistdirÚsetr!   ÚsplitextÚappendÚsorted)	ÚtestdirZstdtestsZnottestsÚnamesÚtestsZothersÚnameÚmodZextr   r   r   Ú	findtestsZ   s    
 r2   c                 C   s    |  d¡s| jr|S d| S d S )Nztest.)Ú
startswithr-   )r   r   r   r   r   Úget_abs_moduleg   s    r4   Ú
TestResultz#test_name result test_time xml_datac                    sR  | j }| jd k	}|r$tj| jdd� t ¡ }�zt 	| j
| j¡ | jrJg nd  t_}| jr`dt_|rÐdt_t ¡ }tj}tj}z@|t_|t_t| |dd�}	|	tkr¼| ¡ }
| |
¡ | ¡  W 5 |t_|t_X n| jt_t| || j d�}	|�rdd lm  m‰  ‡ fdd„|D ƒ}nd }t ¡ | }t||	||ƒW ¢S |�rFt ¡  d t_X d S )NT)ÚexitF)Údisplay_failurer   c                    s   g | ]}ˆ   |¡ d ¡‘qS )zus-ascii)ZtostringÚdecode)Ú.0Úx©ZETr   r   Ú
<listcomp>ž   s     z_runtest.<locals>.<listcomp>)Zverbose3ZtimeoutÚfaulthandlerZdump_traceback_laterÚtimeÚperf_counterZcancel_dump_traceback_laterr   Zjunit_xml_listZset_match_testsZmatch_testsZignore_testsZxmlpathZfailfastÚverboseÚioÚStringIOÚsysÚstdoutÚstderrÚ_runtest_innerr   ÚgetvalueÚwriteÚflushZxml.etree.ElementTreeZetreeZElementTreer5   )r   r   Zoutput_on_failureZuse_timeoutZ
start_timeZxml_listÚstreamZorig_stdoutZorig_stderrr   ÚoutputZxml_datar   r   r;   r   Ú_runtestr   sP    
ÿ

ÿrL   c                 C   sV   zt | |ƒW S    | js>t ¡ }td|› d|› �tjdd� t|tddƒ Y S X dS )aÄ  Run a single test.

    ns -- regrtest namespace of options
    test_name -- the name of the test

    Returns the tuple (result, test_time, xml_data), where result is one
    of the constants:

        INTERRUPTED      KeyboardInterrupt
        RESOURCE_DENIED  test skipped because resource denied
        SKIPPED          test skipped for some other reason
        ENV_CHANGED      test failed because it changed the execution environment
        FAILED           test failed
        PASSED           test passed
        EMPTY_TEST_SUITE test ran no subtests.
        TIMEOUT          test timed out.

    If ns.xmlpath is not None, xml_data is a list containing each
    generated testsuite element.
    útest ú crashed -- T©ÚfilerI   g        N)	rL   ÚpgoÚ	tracebackÚ
format_excÚprintrC   rE   r5   ÚFAILED)r   r   Úmsgr   r   r   Úruntest«   s     ÿrW   c                 C   sH   t  ¡ }| | ¡}|jD ]}t|tjd� q|jr:tdƒ‚t 	|¡ d S )N)rP   zerrors while loading tests)
ÚunittestZ
TestLoaderZloadTestsFromModuleÚerrorsrT   rC   rE   Ú	Exceptionr   Zrun_unittest)Ú
the_moduleÚloaderr/   Úerrorr   r   r   Ú_test_moduleÊ   s    

r^   c              	   C   sÀ   t | |ƒ}t |¡ t |¡}t|dd ƒ}|d kr>t t|¡}z"| jrTt| ||ƒ}n
|ƒ  d}W 5 t	|| j
ƒ X t ¡  tjr´dt_t|› dttjƒ› d�ƒ t tj¡ tj ¡  t ¡  |S )NZ	test_mainFTz	 created z uncollectable object(s).)r4   r   ZunloadÚ	importlibÚimport_moduleÚgetattrÚ	functoolsÚpartialr^   Úcleanup_test_droppingsr@   Z
huntrleaksr   Ú
gc_collectÚgcZgarbageÚenvironment_alteredr   ÚlenÚFOUND_GARBAGEÚextendÚclearZreap_children)r   r   Zabstestr[   Ztest_runnerÚrefleakr   r   r   Ú_runtest_inner2Ô   s(    



rm   Tc              
   C   sÎ  dt _| jrd}z8tƒ  t|| j| j| jd��}t| |ƒ}W 5 Q R X W �nj t jk
r˜ } z.| js~| js~t	|› d|› �dd� t
 W Y ¢S d }~X Y �n tjk
rä } z.| jsÌ| jsÌt	|› d|› �dd� t W Y ¢S d }~X Y nÐ t jk
�r@ } z<d|› d�}|�r|› d|› �}t	|tjdd	� t W Y ¢S d }~X Y nt t jk
�rZ   t Y S  tk
�rx   t	ƒ  t Y S    | j�sªt ¡ }t	d|› d
|› �tjdd	� t Y S X |�r¾tS |j�rÊtS tS )NF)rQ   z skipped -- T)rI   rM   z failedz -- rO   rN   )r   rg   rQ   r   r   r@   Úquietrm   ZResourceDeniedrT   r   rX   ZSkipTestr   Z
TestFailedrC   rE   rU   ZTestDidNotRunr   ÚKeyboardInterruptÚINTERRUPTEDrR   rS   Zchangedr   r   )r   r   r7   Zenvironmentrl   rV   Úexcr   r   r   rF      sN     ÿ
rF   c                 C   s  t  ¡  t jfD ]ò}tj |¡s"qtj |¡rDdd l}d|j }}n*tj 	|¡r^dtj
 }}ntd|›d�ƒ‚|r�t| › d|› d|›�ƒ dt _z.dd l}t ||j|jB |jB ¡ ||ƒ W q tk
�r  } z"t| › d|› d|›d	|› �ƒ W 5 d }~X Y qX qd S )
Nr   Z	directoryrP   zos.path says z) exists but is neither directory nor filez left behind ú Tz and it couldn't be removed: )r   re   ZTESTFNr    r!   ÚexistsÚisdirÚshutilZrmtreeÚisfileÚunlinkÚRuntimeErrorr   rg   ÚstatÚchmodÚS_IRWXUÚS_IRWXGÚS_IRWXOrZ   )r   r@   r0   ru   ZkindZnukerry   rq   r   r   r   rd   0  s&    rd   )N)T)1Úcollectionsr=   rb   rf   r_   rA   r    rC   r>   rR   rX   Ztestr   Ztest.libregrtest.refleakr   r   Ztest.libregrtest.save_envr   Ztest.libregrtest.utilsr   r   r   rU   r   r   r   rp   ZCHILD_ERRORr   r   r   ZPROGRESS_MIN_TIMEZSTDTESTSr)   ZNOTTESTSri   r   r   r%   r2   r4   Ú
namedtupler5   rL   rW   r^   rm   rF   rd   r   r   r   r   Ú<module>   sŒ            ÷ö	
ÿ9
,
0