a
    zeC                     @   sP  d 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ZddlmZ ddlmZ ddlmZ ee	dZejejeddZejejeZdZed	ZG d
d dej Z!G dd dej Z"G dd de"Z#G dd de"Z$G dd de"Z%G dd dej Z&e'dkrLe(  dS )zM
Tests of regrtest.py.

Note: test_regrtest cannot be run twice in parallel.
    N)libregrtest)support)utilsZgettotalrefcountz..z5[0-9]+:[0-9]+:[0-9]+ (?:load avg: [0-9]+\.[0-9]{2} )?z
    from signal import SIGINT, raise_signal
    try:
        raise_signal(SIGINT)
    except ImportError:
        import os
        os.kill(os.getpid(), SIGINT)
    c                   @   sP  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% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRS )SParseArgsTestCasezC
    Test regrtest's argument parsing, function _parse_args().
    c              	   C   sp   t  D}| t t| W d    n1 s40    Y  W d    n1 sR0    Y  | ||  d S N)r   Zcaptured_stderrassertRaises
SystemExitr   _parse_argsassertIngetvalue)selfargsmsgerr r   (/usr/lib/python3.9/test/test_regrtest.py
checkError-   s    FzParseArgsTestCase.checkErrorc                 C   s   dD ]}| j |d~ t F}| t t|g W d    n1 sL0    Y  W d    n1 sj0    Y  | d|  W d    q1 s0    Y  qd S )N)z-hz--helpoptzRun Python regression tests.)	subTestr   Zcaptured_stdoutr   r   r   r	   r
   r   )r   r   outr   r   r   	test_help2   s    
HzParseArgsTestCase.test_helpc                 C   s>   t ddg}| |jd | dgd | ddgd d S )N	--timeoutz4.2g@expected one argumentfoozinvalid float value)r   r	   assertEqualtimeoutr   r   nsr   r   r   test_timeout:   s    zParseArgsTestCase.test_timeoutc                 C   s   t dg}| |j d S )N--wait)r   r	   
assertTruewaitr   r   r   r   	test_wait@   s    zParseArgsTestCase.test_waitc                 C   s.   t ddg}| |jd | dgd d S )Nz--worker-argsz[[], {}]r   )r   r	   r   Zworker_argsr   r   r   r   r   test_worker_argsD   s    z"ParseArgsTestCase.test_worker_argsc              	   C   sd   dD ]Z}| j |d: t|dg}| |jd | |gd W d    q1 sT0    Y  qd S )N)z-S--startr   r   r   )r   r   r	   r   startr   r   r   r   r   r   r   
test_startI   s
    zParseArgsTestCase.test_startc                 C   s   t dg}| |jd t dg}| |jd t dg}| |jd t dgd }| |jd t g }| |jd d S )N-v   z-vvv   	--verboser   )r   r	   r   verboser   r   r   r   test_verboseP   s    
zParseArgsTestCase.test_verbosec              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)-wz
--verbose2r   )r   r   r	   r!   Zverbose2r'   r   r   r   test_verbose2\   s    zParseArgsTestCase.test_verbose2c              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)-Wz
--verbose3r   )r   r   r	   r!   Zverbose3r'   r   r   r   test_verbose3b   s    zParseArgsTestCase.test_verbose3c              	   C   s`   dD ]V}| j |d6 t|g}| |j | |jd W d    q1 sP0    Y  qd S )N)-q--quietr   r   )r   r   r	   r!   quietr   r-   r'   r   r   r   
test_quieth   s
    zParseArgsTestCase.test_quietc              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)z-o	--slowestr   )r   r   r	   r!   Z
print_slowr'   r   r   r   test_slowesto   s    zParseArgsTestCase.test_slowestc                 C   s4   t dg}| |j t dg}| |j d S )Nz--headerr,   )r   r	   r!   headerr   r   r   r   test_headeru   s    zParseArgsTestCase.test_headerc              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)-rz--randomizer   )r   r   r	   r!   	randomizer'   r   r   r   test_randomize|   s    z ParseArgsTestCase.test_randomizec                 C   sJ   t ddg}| |jd | |j | dgd | ddgd d S )Nz
--randseedZ12345i90  r   r   invalid int value)r   r	   r   Zrandom_seedr!   r<   r   r   r   r   r   test_randseed   s
    zParseArgsTestCase.test_randseedc              	   C   sv   dD ]l}| j |dL t|dg}| |jd | |gd | |ddgd W d    q1 sf0    Y  qd S )N)-f
--fromfiler   r   r   -sdon't go together)r   r   r	   r   fromfiler   r'   r   r   r   test_fromfile   s    zParseArgsTestCase.test_fromfilec              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)z-x	--excluder   )r   r   r	   r!   excluder'   r   r   r   test_exclude   s    zParseArgsTestCase.test_excludec              	   C   sd   dD ]Z}| j |d: t|g}| |j | |ddgd W d    q1 sT0    Y  qd S )N)rB   z--singler   r@   r   rC   )r   r   r	   r!   Zsingler   r'   r   r   r   test_single   s
    zParseArgsTestCase.test_singlec              	   C   s   dD ]\}| j |d< t|dg}| |jdg | |gd W d    q1 sV0    Y  q| tjtj	 t
tj	d(}td|d td|d W d    n1 s0    Y  tjtj	}td	d
d|g}| |jddg d S )N)z-iz--ignorer   patternr   w
matchfile1file
matchfile2-mmatch--ignorefile)r   r   r	   r   Zignore_testsr   
addCleanupr   unlinkTESTFNopenprintospathabspathr   r   r   fpfilenamer   r   r   test_ignore   s     .*zParseArgsTestCase.test_ignorec              	   C   s  dD ]\}| j |d< t|dg}| |jdg | |gd W d    q1 sV0    Y  qtg d}| |jddg | tjtj	 t
tj	d(}td	|d
 td|d
 W d    n1 s0    Y  tjtj	}tddd|g}| |jg d d S )N)rP   z--matchr   rJ   r   )rP   pattern1rP   pattern2r_   r`   rK   rL   rM   rO   rP   rQ   --matchfile)rQ   rL   rO   )r   r   r	   r   Zmatch_testsr   rS   r   rT   rU   rV   rW   rX   rY   rZ   r[   r   r   r   
test_match   s$    .*zParseArgsTestCase.test_matchc              	   C   s|   dD ]r}| j |dR t|dg}| |j t|dg}| |j | |gd W d    q1 sl0    Y  qd S )N)z-Gz
--failfastr   r)   r1   z#-G/--failfast needs either -v or -W)r   r   r	   r!   Zfailfastr   r'   r   r   r   test_failfast   s    zParseArgsTestCase.test_failfastc              	   C   s  dD ]}| j |d t|dg}| |jddg t|dg}| |jdg ttj}|d t|dg}| |j| | |gd | |d	gd
 t|dg}| |jttjdg  t|dg}| |jdg W d    q1 s0    Y  qd S )N)-uz--user   zgui,networkZguinetworkzgui,none,networkzall,-guir   r   zinvalid resourcez
all,tzdataZtzdataZextralargefile)	r   r   r	   r   Zuse_resourceslistZALL_RESOURCESremover   )r   r   r   Zexpectedr   r   r   test_use   s$    


zParseArgsTestCase.test_usec              	   C   sd   dD ]Z}| j |d: t|dg}| |jd | |gd W d    q1 sT0    Y  qd S )N)z-Mz
--memlimitr   Z4Gr   )r   r   r	   r   memlimitr   r'   r   r   r   test_memlimit   s
    zParseArgsTestCase.test_memlimitc                 C   s:   t ddg}| |jtjtjd | 	dgd d S )Nz	--testdirr   r   )
r   r	   r   testdirrX   rY   joinr   SAVEDCWDr   r   r   r   r   test_testdir   s    zParseArgsTestCase.test_testdirc              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)z-Lz
--runleaksr   )r   r   r	   r!   Zrunleaksr'   r   r   r   test_runleaks   s    zParseArgsTestCase.test_runleaksc              	   C   s   dD ]}| j |d t|dg}| |jd t|dg}| |jd t|dg}| |jd t|d	g}| |jd
 | |gd | |dgd | |dgd | |dgd W d    q1 s0    Y  qd S )N)z-R--huntrleaksr   :)      
reflog.txtz6:)   rs   rt   z:3)rr   r+   rt   z6:3:leaks.log)ru   r+   z	leaks.logr   6z&needs 2 or 3 colon-separated argumentszfoo:zinvalid huntrleaks valuez6:foo)r   r   r	   r   
huntrleaksr   r'   r   r   r   test_huntrleaks   s     
z!ParseArgsTestCase.test_huntrleaksc              	   C   s   dD ]}| j |dn t|dg}| |jd | |gd | |dgd | |ddgd	 | |d
dgd	 W d    q1 s0    Y  qd S )N)z-jz--multiprocessr   2   r   r   r>   -TrC   0)r   r   r	   r   Zuse_mpr   r'   r   r   r   test_multiprocess  s    z#ParseArgsTestCase.test_multiprocessc              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)r{   
--coverager   )r   r   r	   r!   Ztracer'   r   r   r   test_coverage  s    zParseArgsTestCase.test_coveragec              	   C   sp   dD ]f}| j |dF t|dg}| |jtjtj	d | 
|gd W d    q1 s`0    Y  qd S )N)z-Dz
--coverdirr   r   r   )r   r   r	   r   coverdirrX   rY   rl   r   rm   r   r'   r   r   r   test_coverdir  s    zParseArgsTestCase.test_coverdirc              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)z-Nz--nocoverdirr   )r   r   r	   ZassertIsNoner   r'   r   r   r   test_nocoverdir#  s    z!ParseArgsTestCase.test_nocoverdirc              	   C   st   dD ]j}| j |dJ t|dg}| |jd | |gd | |dgd W d    q1 sd0    Y  qd S )N)z-tz--thresholdr   Z1000i  r   r   r>   )r   r   r	   r   Z	thresholdr   r'   r   r   r   test_threshold)  s    z ParseArgsTestCase.test_thresholdc              
   C   s   dD ]}| j |dj tt }t|g}W d    n1 sF0    Y  | |j |	 }| 
d| W d    q1 s0    Y  qd S )N)-nz--nowindowsr   z)the --nowindows (-n) option is deprecated)r   
contextlibredirect_stderrioStringIOr   r	   r!   Z	nowindowsr   r
   )r   r   stderrr   r   r   r   r   test_nowindows1  s    *z ParseArgsTestCase.test_nowindowsc              	   C   sR   dD ]H}| j |d( t|g}| |j W d    q1 sB0    Y  qd S )N)z-F	--foreverr   )r   r   r	   r!   foreverr'   r   r   r   test_forever:  s    zParseArgsTestCase.test_foreverc                 C   s   |  dgd d S )Nz--xxxzusage:r   r   r   r   r   test_unrecognized_argument@  s    z,ParseArgsTestCase.test_unrecognized_argumentc                 C   s*   t dg}| |j | |jd d S )Nz--quir   )r   r	   r!   r5   r   r-   r   r   r   r   test_long_option__partialC  s    z+ParseArgsTestCase.test_long_option__partialc                 C   s8   t ddg}| |j | |jd | |j d S )Nr4   rF   r   )r   r	   r!   r5   r   r-   rG   r   r   r   r   test_two_optionsH  s    z"ParseArgsTestCase.test_two_optionsc                 C   s    t ddg}| |jd d S )Nr%    )r   r	   r   r&   r   r   r   r   #test_option_with_empty_string_valueN  s    z5ParseArgsTestCase.test_option_with_empty_string_valuec                 C   s    t dg}| |jdg d S )Nr   )r   r	   r   r   r   r   r   r   test_argR  s    zParseArgsTestCase.test_argc                 C   s<   t ddg}| |j | |jd | |jdg d S )Nr4   r   r   )r   r	   r!   r5   r   r-   r   r   r   r   r   test_option_and_argV  s    z%ParseArgsTestCase.test_option_and_argc                 C   s2   t g d}| |jd | |jddg d S )N)test_unaryopr)   
test_binopr*   r   r   )r   r	   r   r-   r   r   r   r   r   test_arg_option_arg\  s    z%ParseArgsTestCase.test_arg_option_argc                 C   s   |  dgd d S )Nz--unknown-optionz(unrecognized arguments: --unknown-optionr   r   r   r   r   test_unknown_optiona  s    z%ParseArgsTestCase.test_unknown_optionN),__name__
__module____qualname____doc__r   r   r   r#   r$   r(   r.   r0   r2   r6   r8   r:   r=   r?   rE   rH   rI   r^   rb   rc   rh   rj   rn   ro   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   (   sR   	
	r   c                	   @   sx   e Zd ZdZdZdZdd ZdddZd	d
 Zdd Z	dd Z
ddddi ddddf	ddZdd ZdddZdd ZdS )BaseTestCaser*   Ztest_regrtest_ztest_[a-zA-Z0-9_]+c                 C   s4   t jt jt| _t | _| 	t
j| j d S r   )rX   rY   realpathdirname__file__rk   tempfilemkdtemp
tmptestdirrS   r   rmtreer   r   r   r   setUpk  s    
zBaseTestCase.setUpNc              
   C   s   |sdt j }t  jd7  _|d u r.td}| j| }tj| j|d }| 	t
j| z<t|ddd}|| W d    n1 s0    Y  W n@ ty } z(t s| d||f   W Y d }~n
d }~0 0 |S )	Nznoop%sr*   z
                    import unittest

                    class Tests(unittest.TestCase):
                        def test_empty_test(self):
                            pass
                z.pyxzutf-8)encodingzcannot write %s: %s)r   TEST_UNIQUE_IDtextwrapdedentTESTNAME_PREFIXrX   rY   rl   r   rS   r   rT   rV   writePermissionError	sysconfigis_python_buildskipTest)r   namecoderY   r\   excr   r   r   create_testq  s     



,zBaseTestCase.create_testc                 C   s*   t ||t j}|s&| d||f  |S )Nz%r not found in %r)research	MULTILINEfail)r   regexoutputrQ   r   r   r   regex_search  s    zBaseTestCase.regex_searchc                 C   s"   t d| t j}| || d S )N^)r   compiler   assertRegexr   r   r   r   r   r   
check_line  s    zBaseTestCase.check_linec                 C   s0   dt | jf }t||tj}tdd |D S )Nz"^%s\[ *[0-9]+(?:/ *[0-9]+)*\] (%s)c                 s   s   | ]}| d V  qdS )r*   Ngroup.0rQ   r   r   r   	<genexpr>      z4BaseTestCase.parse_executed_tests.<locals>.<genexpr>)
LOG_PREFIXTESTNAME_REGEXr   finditerr   rf   )r   r   r   parserr   r   r   parse_executed_tests  s
    z!BaseTestCase.parse_executed_testsr   Fc                    s  t |tr|g}t |tr |g}t |tr0|g}t |tr@|g}t |trP|g}t |tr`|g}| |}|	r| t|t|| n| ||| dd   fdd}|r|d|}| || |r|d|}| || |r|d|}| || |r|d|}| || |r||d	| }| || td
 }| || | D ],\}}td| d| d }| || qN|r|d|}| || t	|t	| t	| t	| t	| t	| }|rd| |f }|s|s|dkrd| }| || |
r| |d g }|r0|
d n|rF|rF|
d |
rV|
d t||||
|||fsz|
d n|s|
d d|}|r| |d d| }| |d|  d S )Nc                 S   s   | dkrdS dS )Nr*   sr   r   )countr   r   r   plural  s    z1BaseTestCase.check_executed_tests.<locals>.pluralc                    s6   t |}dt|}| | |f }d||f }|S )N z%s:\n    %s$)lenrl   sorted)Zline_formattestsr   namesr   r   r   r   
list_regex  s
    z5BaseTestCase.check_executed_tests.<locals>.list_regexz%s test%s skippedz%s test%s failedz+%s test%s altered the execution environmentz%s test%s omittedz%s re-run test%sz'Re-running failed tests in verbose modezRe-running z in verbose mode \(matching: z\)z%s test%s run no testsz%s test%s OK\.$r*   zAll %sz(Test suite interrupted by signal SIGINT.FAILUREzENV CHANGEDZINTERRUPTEDzNO TEST RUNSUCCESS, zTests result: FAILUREzFAILURE then %szTests result: %s)
isinstancestrr   r   setr   keysr   itemsr   appendanyrl   )r   r   r   skippedfailedenv_changedomittedrerunno_test_ranr<   interruptedfail_env_changedZexecutedr   r   r   rQ   Zgoodresultr   r   r   check_executed_tests  s    














z!BaseTestCase.check_executed_testsc                 C   s>   |  d|}t|d}| d|  ko0dkn  | |S )NzUsing random seed ([0-9]+)r*   r   i )r   intr   r!   )r   r   rQ   randseedr   r   r   parse_random_seed  s     zBaseTestCase.parse_random_seedr   c                 K   sx   |sd}d|vrt j|d< t j|fd|t jd|}|j|krtdt||j|jf }|jrj|d|j 7 }| | |S )Nr   r   T)universal_newlinesinputstdoutz8Command %s failed with exit code %s

stdout:
---
%s
---
z
stderr:
---
%s---
)	
subprocessSTDOUTrunPIPE
returncoder   r   r   r   )r   r   r   exitcodekwprocr   r   r   r   run_command  s*    


zBaseTestCase.run_commandc                 K   s*   t jdddg|}| j|fi |}|jS )Nz-Xfaulthandlerz-I)sys
executabler   r   )r   r   r   r   r   r   r   
run_python  s    zBaseTestCase.run_python)NN)Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   f  s"   

^
r   c                   @   s   e Zd Zdd ZdS )CheckActualTestsc                 C   st   g d}|  |}t| }tjttjt	d}tt|}| j
||d d dd|  d dS )	zP
        Check that regrtest appears to find the expected set of tests.
        )-Wd-E-bbrP   test.regrtest--list-testsztest*.py	   
   z+Unexpectedly low number of tests found in:
r   )r   N)r   r   
splitlinesrX   rY   rl   globescaper   r   ZassertGreater)r   r   r   Zrough_number_of_tests_foundZactual_testsuite_globZrough_counted_test_py_filesr   r   r   #test_finds_expected_number_of_tests&  s    

z4CheckActualTests.test_finds_expected_number_of_testsN)r   r   r   r
  r   r   r   r   r   %  s   r   c                       s   e Zd ZdZdZ f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ee ddd Zdd Zee deejdkddd Zeejdkddd  Z  ZS )!ProgramsTestCasezp
    Test various ways to run the Python test suite. Use options close
    to options used on the buildbot.
    rs   c                    sf   t     fddt jD  _g d _ddd j g _ jd t	j
dkrb jd	 d S )
Nc                    s   g | ]}   qS r   r   r   indexr   r   r   
<listcomp>I  r   z*ProgramsTestCase.setUp.<locals>.<listcomp>)r   r  r  z-uallz-rwW--testdir=%s)r   Z3600z-j4win32r   )superr   rangeNTESTr   python_argsr   regrtest_argsextendr   platformr   r   	__class__r   r   r   E  s    


zProgramsTestCase.setUpc                 C   s    |  | | j|| jdd d S )NT)r<   )r   r   r   )r   r   r   r   r   check_outputR  s    
zProgramsTestCase.check_outputc                 C   s   |  |}| | d S r   )r   r  )r   r   r   r   r   r   	run_testsV  s    
zProgramsTestCase.run_testsc                 C   s8   t j| jd}g | j|| j| j}| | d S )Nzregrtest.pyrX   rY   rl   rk   r  r  r   r  r   scriptr   r   r   r   test_script_regrtestZ  s    z%ProgramsTestCase.test_script_regrtestc                 C   s,   g | j dd| j| j}| | d S )NrP   testr  r  r   r  r   r   r   r   r   test_module_testa  s    z!ProgramsTestCase.test_module_testc                 C   s,   g | j dd| j| j}| | d S )NrP   r  r"  r#  r   r   r   test_module_regrtestg  s    z%ProgramsTestCase.test_module_regrtestc                 C   s,   g | j dd| j| j}| | d S )NrP   ztest.autotestr"  r#  r   r   r   test_module_autotestm  s    z%ProgramsTestCase.test_module_autotestc                 C   s0   d}g | j d|| j| j}| | d S )Nzfrom test import autotestz-cr"  )r   r   r   r   r   r   test_module_from_test_autotests  s    z/ProgramsTestCase.test_module_from_test_autotestc                 C   s8   t j| jd}g | j|| j| j}| | d S )Nzautotest.pyr  r  r   r   r   test_script_autotestz  s    z%ProgramsTestCase.test_script_autotestz$run_tests.py script is not installedc                 C   s2   t jtddd}|g| j| j}| | d S )NToolsZscriptszrun_tests.py)rX   rY   rl   ROOT_DIRr  r   r  r  r   r   r   test_tools_script_run_tests  s    z,ProgramsTestCase.test_tools_script_run_testsc                 G   s   |  |}| |j d S r   )r   r  r   )r   r   r   r   r   r   	run_batch  s    
zProgramsTestCase.run_batchz test.bat script is not installedr  zWindows onlyc                 C   s   t jtddd}d| j g}t dkr6|d n2t dkrN|d nt d	 d
krh|d t	sv|d | j
|g|| jR   d S )Nr)  Zbuildbotztest.batr  ARM64-arm64ARM-arm32r   64bit-x64z+d)rX   rY   rl   r*  r   r  machiner   architecturePy_DEBUGr,  r   )r   r  Z	test_argsr   r   r   test_tools_buildbot_test  s    

z)ProgramsTestCase.test_tools_buildbot_testc                 C   s   t jtd}t j|s,| d| d dg}t dkrJ|d n2t dkrb|d nt	 d	 d
kr||d t
r|d | j|g|| j| jR   d S )NzPCbuild\rt.batzFile "z" does not existr3   r-  r.  r/  r0  r   r1  r2  z-d)rX   rY   rl   r*  isfiler   r  r3  r   r4  r5  r,  r  r   )r   r  Zrt_argsr   r   r   test_pcbuild_rt  s    

z ProgramsTestCase.test_pcbuild_rt)r   r   r   r   r  r   r  r  r   r$  r%  r&  r'  r(  unittest
skipUnlessr   r   r+  r,  r   r  r6  r8  __classcell__r   r   r  r   r  =  s.   


r  c                   @   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eeddd Zeeddd Zdd  Zd!d" Zejd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Z d3d4 Z!d5d6 Z"d7d8 Z#ejd9d: Z$d;d< Z%d=d> Z&d?d@ Z'dAS )BArgsTestCasez2
    Test arguments of the Python test suite.
    c                 O   s&   ddd| j  g|}| j|fi |S )NrP   r!  r  )r   r   )r   Ztestargsr   cmdargsr   r   r   r    s    zArgsTestCase.run_testsc                 C   sN   t d}| d}| jd|d}||g}| j|ddi}| j|||d d S )Nz
            import unittest

            class FailingTest(unittest.TestCase):
                def test_failing(self):
                    self.fail("bug")
        okZfailingr   r   rz   r   r   r   r   r  r   )r   r   Ztest_okZtest_failingr   r   r   r   r   test_failing_test  s    

zArgsTestCase.test_failing_testc                 C   s   i }dD ]"}t d| }| ||||< qt| }| jddg|R  }| || | jdg|R  }| j|||d d | j| }| j|||d d S )N)Zaudiore   a  
                        from test import support; support.requires(%r)
                        import unittest
                        class PassingTest(unittest.TestCase):
                            def test_pass(self):
                                pass
                    rd   allz-uaudiore   )r   )r   r   r   r   valuesr  r   )r   r   resourcer   Z
test_namesr   r   r   r   test_resources  s"    
zArgsTestCase.test_resourcesc           	      C   s   t d}| d|}| d|}| |}| d|}t|d}| dd| |}| |}| || | d|}t|d}| || d S )Nza
            import random
            print("TESTRANDOM: %s" % random.randint(1, 1000))
        randomr;   zTESTRANDOM: ([0-9]+)r*   z--randseed=%s)	r   r   r   r  r   r   r   r   r   )	r   r   r!  r   r   rQ   test_randomZ	randseed2Ztest_random2r   r   r   rH    s    


zArgsTestCase.test_randomc           	         s   fddt dD }tj} tj| t|d\}d }t|dD ]<\}}d||t||f }|rp|d| 7 }t||d |}qDW d    n1 s0    Y   	d	|} 
|| t|d>}t|dD ]"\}}td
|t||f |d qW d    n1 s0    Y   	d	|} 
|| t|d(}|D ]}t||d q:W d    n1 sd0    Y   	d	|} 
|| t|d,}|D ]}td| |d qW d    n1 s0    Y   	d	|} 
|| d S )Nc                    s   g | ]}   qS r   r  r  r   r   r   r    r   z.ArgsTestCase.test_fromfile.<locals>.<listcomp>rr   rK   r*   z00:00:%02i [%s/%s] %sz -- %s took 0 secrM   rA   z
[%s/%s] %szLib/test/%s.py)r  r   rU   rS   rT   rV   	enumerater   rW   r  r   )	r   r   r]   r\   Zpreviousr  r   liner   r   r   r   rE     s<    $<04zArgsTestCase.test_fromfilec                 C   s6   t }| jd|d}| j|dd}| j|||dd d S )Nsigintr?     r   Tr   r   )TEST_INTERRUPTEDr   r  r   r   r   r!  r   r   r   r   test_interrupted,  s    
zArgsTestCase.test_interruptedc                    sV    fddt dD } jdg|R  } || d jt|f } || d S )Nc                    s   g | ]}   qS r   r  r  r   r   r   r  5  r   z-ArgsTestCase.test_slowest.<locals>.<listcomp>r+   r7   z#10 slowest tests:
(?:- %s: .*
){%s})r  r  r   r   r   r   )r   r   r   r   r   r   r   r8   3  s    zArgsTestCase.test_slowestc              	   C   s   t }| jd|d}dD ]z}| j|dZ |r8dd|f}nd|f}| j|ddi}| j|||d	d
 d}| || W d    q1 s0    Y  qd S )NrK  r?  )FT)multiprocessingr7   -j2r   rL  TrN  z10 slowest tests:
)rO  r   r   r  r   r   )r   r   r!  rR  r   r   r   r   r   r   test_slowest_interrupted=  s    z%ArgsTestCase.test_slowest_interruptedc                 C   s8   |  d}| d|}| ||g d}| || d S )NZcoverager~   zLlines +cov% +module +\(path\)\n(?: *[0-9]+ *[0-9]{1,2}% *[^ ]+ +\([^)]+\)+)+)r   r  r   r   )r   r!  r   r   r   r   r   r   O  s
    
zArgsTestCase.test_coveragec                 C   s*   |  d}| jd|dd}| |d d S )Nr"   r    key)r   zPress any key to continue)r   r  r   )r   r!  r   r   r   r   r#   X  s    
zArgsTestCase.test_waitc                 C   sB   t d}| jd|d}| jd|dd}| j||gd |d d S )	NaL  
            import builtins
            import unittest

            class ForeverTester(unittest.TestCase):
                def test_run(self):
                    # Store the state in the builtins module, because the test
                    # module is reload at each run
                    if 'RUN' in builtins.__dict__:
                        builtins.__dict__['RUN'] += 1
                        if builtins.__dict__['RUN'] >= 3:
                            self.fail("fail at the 3rd runs")
                    else:
                        builtins.__dict__['RUN'] = 1
        r   r?  r   rz   rM  r+   r@  rA  rP  r   r   r   r   ^  s    
zArgsTestCase.test_foreverc           
      C   s   | j d|d}d}| tj| | jdd|dtjd}| j||g|d d	}| |t	
| d
||f }| || t|$}| }	| ||	 W d    n1 s0    Y  d S )Nrw   r?  rt   rp   z3:3:rz   )r   r   r@  z&beginning 6 repetitions
123456
......
z%s leaked [1, 1, 1] %s, sum=3
)r   rS   r   rT   r  r   r   r   r   r   r	  r
   rV   read)
r   r   Zwhatr!  r]   r   rJ  Zline2r\   Zreflogr   r   r   
check_leaks  s    

zArgsTestCase.check_leakzneed a debug buildc                 C   s   t d}| |d d S )Nz
            import unittest

            GLOBAL_LIST = []

            class RefLeakTest(unittest.TestCase):
                def test_leak(self):
                    GLOBAL_LIST.append(object())
        Z
referencesr   r   rW  r   r   r   r   r   rx     s    
	zArgsTestCase.test_huntrleaksc                 C   s   t d}| |d d S )Na  
            import os
            import unittest

            class FDLeakTest(unittest.TestCase):
                def test_leak(self):
                    fd = os.open(__file__, os.O_RDONLY)
                    # bug: never close the file descriptor
        zfile descriptorsrX  rY  r   r   r   test_huntrleaks_fd_leak  s    
	z$ArgsTestCase.test_huntrleaks_fd_leakc                    s@    fddt dD } jdg|R  } |  | d S )Nc                    s   g | ]}   qS r   r  )r   ir   r   r   r    r   z0ArgsTestCase.test_list_tests.<locals>.<listcomp>rr   r  )r  r  r   rstripr  )r   r   r   r   r   r   test_list_tests  s
    zArgsTestCase.test_list_testsc                 C   sp   t d}| j|d}d| d| g}| d|}| | | d| g}| ddd|}| | | d S )Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_method1(self):
                    pass
                def test_method2(self):
                    pass
        r?  z%s.Tests.test_method1z%s.Tests.test_method2z--list-casesrP   test_method1)r   r   r   r  r   r  )r   r   testnameall_methodsr   r   r   r   test_list_cases  s    
	
zArgsTestCase.test_list_casesc                 C   sF   d}| j d|d}|g}| jdg|R ddi}| j|||dd d S )	Nz,import faulthandler; faulthandler._sigsegv()Zcrash)r   r   rS  r   rz   T)r   r<   )r   r  r   )r   r   Z
crash_testr   r   r   r   r   test_crashed  s    
zArgsTestCase.test_crashedc                 C   s$   t jdt jd}dd ||D S )Nz^(test[^ ]+).*ok$)flagsc                 S   s   g | ]}| d qS )r*   r   r   r   r   r   r    r   z.ArgsTestCase.parse_methods.<locals>.<listcomp>)r   r   r   r   r   r   r   r   parse_methods  s    zArgsTestCase.parse_methodsc           
      C   s   t d}g d}| j|d}tj}| tj| dd| g}t|d&}|D ]}t||d qNW d    n1 st0    Y  | 	dd	||}| 
|}	d
dg}| |	| d S )NV  
            import unittest

            class Tests(unittest.TestCase):
                def test_method1(self):
                    pass
                def test_method2(self):
                    pass
                def test_method3(self):
                    pass
                def test_method4(self):
                    pass
        r^  test_method2test_method3test_method4r?  r^  %s.Tests.test_method3rK   rM   r)   rR   rg  ri  )r   r   r   r   rU   rS   rT   rV   rW   r  rd  r   )
r   r   r`  r_  r]   subsetr\   r   r   methodsr   r   r   test_ignorefile  s    
,
zArgsTestCase.test_ignorefilec           
      C   s   t d}g d}| j|d}| d|}| |}| || tj}| tj	| dd| g}t
|d&}|D ]}	t|	|d qpW d    n1 s0    Y  | dd	||}| |}dd
g}| || d S )Nre  rf  r?  r)   r^  rj  rK   rM   ra   rh  )r   r   r   r  rd  r   r   rU   rS   rT   rV   rW   )
r   r   r`  r_  r   rl  r]   rk  r\   r   r   r   r   test_matchfile  s$    

,
zArgsTestCase.test_matchfilec                 C   sZ   t d}| j|d}| |}| j||g|d | jd|dd}| j||g|dd d S )	Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_env_changed(self):
                    open("env_changed", "w").close()
        r?  )r   --fail-env-changedr+   rM  Tr   r   rA  r   r   r_  r   r   r   r   test_env_changed   s    

zArgsTestCase.test_env_changedc                 C   sB   t d}| j|d}| jd|dd}| j||g||did d S )Na  
            import unittest

            class Tests(unittest.TestCase):
                def test_succeed(self):
                    return

                def test_fail_always(self):
                    # test that always fails
                    self.fail("bug")
        r?  r/   rz   rM  Ztest_fail_always)r   r   rA  rq  r   r   r   test_rerun_fail3  s    

zArgsTestCase.test_rerun_failc                 C   s@   t d}| j|d}| jd|dd}| j||g|did d S )Nax  
            import builtins
            import unittest

            class Tests(unittest.TestCase):
                def test_succeed(self):
                    return

                def test_fail_once(self):
                    if not hasattr(builtins, '_test_failed'):
                        builtins._test_failed = True
                        self.fail("bug")
        r?  r/   r   rM  Ztest_fail_once)r   rA  rq  r   r   r   test_rerun_successF  s    

zArgsTestCase.test_rerun_successc                 C   s>   t d}| j|d}| j|dddd}| j||g|d d S N
            import unittest

            class Tests(unittest.TestCase):
                def test_bug(self):
                    pass
        r?  rP   
nosuchtestr   rM  r   rA  rq  r   r   r   test_no_tests_ran[  s    
zArgsTestCase.test_no_tests_ranc                 C   s6   t d}| j|d}| j|dd}| ||g d S )Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_skipped(self):
                    self.skipTest("because")
        r?  r   rM  rA  rq  r   r   r   test_no_tests_ran_skiph  s    
z#ArgsTestCase.test_no_tests_ran_skipc                 C   sR   t d}| j|d}| j|d}| j||dddd}| j|||g||gd d S ru  rA  )r   r   r_  	testname2r   r   r   r   ,test_no_tests_ran_multiple_tests_nonexistentu  s    
z9ArgsTestCase.test_no_tests_ran_multiple_tests_nonexistentc              	   C   s^   t d}| j|d}t d}| j|d}| j||dddddd}| j|||g|gd	 d S )
Nrv  r?  z
            import unittest

            class Tests(unittest.TestCase):
                def test_other_bug(self):
                    pass
        rP   rw  Ztest_other_bugr   rM  rx  rA  )r   r   r_  Z
other_coder{  r   r   r   r   )test_no_test_ran_some_test_exist_some_not  s    

z6ArgsTestCase.test_no_test_ran_some_test_exist_some_notc                 C   sf   t d}| j|d}| jd|dd}| j||g|gdd | jd|dd}| j||g|gdd d S )	Na  
            import _testcapi
            import gc
            import unittest

            @_testcapi.with_tp_del
            class Garbage:
                def __tp_del__(self):
                    pass

            class Tests(unittest.TestCase):
                def test_garbage(self):
                    # create an uncollectable object
                    obj = Garbage()
                    obj.ref_cycle = obj
                    obj = None
        r?  ro  r+   rM  Trp  z--findleaksrA  rq  r   r   r   test_findleaks  s    


zArgsTestCase.test_findleaksc                 C   sX   t d}| j|d}| jdd|dd}| j||g|d | |td| tj d S )	Naa  
            import time
            import unittest
            try:
                import faulthandler
            except ImportError:
                faulthandler = None

            class Tests(unittest.TestCase):
                # test hangs and so should be stopped by the timeout
                def test_sleep(self):
                    # we want to test regrtest multiprocessing timeout,
                    # not faulthandler timeout
                    if faulthandler is not None:
                        faulthandler.cancel_dump_traceback_later()

                    time.sleep(60 * 5)
        r?  rS  z--timeout=1.0rz   rM  r@  z%s timed out)	r   r   r   r  r   r   r   r   r   rq  r   r   r   test_multiprocessing_timeout  s    

z)ArgsTestCase.test_multiprocessing_timeoutc                 C   sZ   t d}| j|d}| jdd|dd}| j||g|gdd | d	| | d
| d S )Na  
            import unittest
            import weakref
            from test.support import captured_stderr

            class MyObject:
                pass

            def weakref_callback(obj):
                raise Exception("weakref callback bug")

            class Tests(unittest.TestCase):
                def test_unraisable_exc(self):
                    obj = MyObject()
                    ref = weakref.ref(obj, weakref_callback)
                    with captured_stderr() as stderr:
                        # call weakref_callback() which logs
                        # an unraisable exception
                        obj = None
                    self.assertEqual(stderr.getvalue(), '')
        r?  ro  r)   r+   rM  Trp  zWarning -- Unraisable exceptionzException: weakref callback bug)r   r   r   r  r   r
   rq  r   r   r   test_unraisable_exc  s    

z ArgsTestCase.test_unraisable_excc                 C   s~   t j| jd}t | t j| jd}t|d  ||g}ddd| j dg}| | |D ]}| t j	|| q`d S )NZtest_python_123Ztest_python_456wbrP   r!  z--tempdir=%sz	--cleanup)
rX   rY   rl   r   mkdirrV   closer   ZassertFalseexists)r   r   r]   r   r=  r   r   r   r   test_cleanup  s    

zArgsTestCase.test_cleanupN)(r   r   r   r   r  rB  rF  rH  rE   rQ  r8   rT  r   r#   r   rW  r9  r:  r5  rx   rZ  r]  ra  r   Zcpython_onlyrb  rd  rm  rn  rr  rs  rt  ry  rz  r|  r}  r~  r  r  r  r   r   r   r   r<    sH   0
	





$)
!r<  c                   @   s   e Zd Zdd ZdS )	TestUtilsc                 C   s   |  tdd |  tdd |  tdd |  tdd |  td	d
 |  tdd |  tdd |  tdd |  tdd |  tdd d S )Nr   z0 msg&.>z1 msg{Gz?z10 msg      ?z1.5 secr*   z1.0 secx   z2 miny   z2 min 1 seci0*  z3 houri*  z3 hour 2 mini1*  z3 hour 1 sec)r   r   Zformat_durationr   r   r   r   test_format_duration  s<    zTestUtils.test_format_durationN)r   r   r   r  r   r   r   r   r    s   r  __main__))r   r   r  r   Zos.pathrX   r  r   r   r   r   r   r   timer9  r!  r   r   Ztest.libregrtestr   hasattrr5  rY   rl   r   r   r*  rZ   normpathr   r   rO  ZTestCaser   r   r   r  r<  r  r   mainr   r   r   r   <module>   sH   


  @ @r    \
