B
    u9aҥ                 @   s4  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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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jZ#e$dkr0e%  dS )zM
Tests of regrtest.py.

Note: test_regrtest cannot be run twice in parallel.
    N)libregrtest)support)utilsZgettotalrefcountz..z
    from signal import SIGINT
    try:
        from _testcapi import raise_signal
        raise_signal(SIGINT)
    except ImportError:
        import os
        os.kill(os.getpid(), SIGINT)
    c               @   sZ  e Zd ZdZdd Zdd Zeee	dd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   sH   t  &}| t t| W d Q R X W d Q R X | ||  d S )N)r   Zcaptured_stderrassertRaises
SystemExitr   _parse_argsassertIngetvalue)selfargsmsgerr r   #/usr/lib/python3.7/test_regrtest.py
checkError,   s    zParseArgsTestCase.checkErrorc             C   sp   xjdD ]b}| j |dL t (}| t t|g W d Q R X W d Q R X | d|  W d Q R X qW 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_help1   s    

 zParseArgsTestCase.test_helpdump_traceback_laterz,faulthandler.dump_traceback_later() requiredc             C   s>   t ddg}| |jd | dgd | ddgd d S )Nz	--timeoutz4.2g@zexpected one argumentfoozinvalid float value)r   r   assertEqualZtimeoutr   )r   nsr   r   r   test_timeout9   s    zParseArgsTestCase.test_timeoutc             C   s   t dg}| |j d S )Nz--wait)r   r   
assertTruewait)r   r   r   r   r   	test_waitA   s    zParseArgsTestCase.test_waitc             C   s.   t ddg}| |jd | dgd d S )Nz--worker-argsz[[], {}]zexpected one argument)r   r   r   Zworker_argsr   )r   r   r   r   r   test_worker_argsE   s    z"ParseArgsTestCase.test_worker_argsc          
   C   sT   xNdD ]F}| j |d0 t|dg}| |jd | |gd W d Q R X qW d S )N)z-Sz--start)r   r   zexpected one argument)r   r   r   r   startr   )r   r   r   r   r   r   
test_startJ   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 )Nz-v   z-vvv   z	--verboser   )r   r   r   verbose)r   r   r   r   r   test_verboseQ   s    
zParseArgsTestCase.test_verbosec          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-wz
--verbose2)r   )r   r   r   r   Zverbose2)r   r   r   r   r   r   test_verbose2]   s    
zParseArgsTestCase.test_verbose2c          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-Wz
--verbose3)r   )r   r   r   r   Zverbose3)r   r   r   r   r   r   test_verbose3c   s    
zParseArgsTestCase.test_verbose3c          
   C   sP   xJdD ]B}| j |d, t|g}| |j | |jd W d Q R X qW d S )N)z-qz--quiet)r   r   )r   r   r   r   quietr   r#   )r   r   r   r   r   r   
test_quieti   s
    
zParseArgsTestCase.test_quietc          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-oz	--slowest)r   )r   r   r   r   Z
print_slow)r   r   r   r   r   r   test_slowestp   s    
zParseArgsTestCase.test_slowestc             C   s4   t dg}| |j t dg}| |j d S )Nz--headerz	--verbose)r   r   r   header)r   r   r   r   r   test_headerv   s    zParseArgsTestCase.test_headerc          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-rz--randomize)r   )r   r   r   r   	randomize)r   r   r   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  zexpected one argumentr   zinvalid int value)r   r   r   Zrandom_seedr   r,   r   )r   r   r   r   r   test_randseed   s
    zParseArgsTestCase.test_randseedc          
   C   sf   x`dD ]X}| j |dB t|dg}| |jd | |gd | |ddgd W d Q R X qW d S )N)z-fz
--fromfile)r   r   zexpected one argumentz-szdon't go together)r   r   r   r   Zfromfiler   )r   r   r   r   r   r   test_fromfile   s    
zParseArgsTestCase.test_fromfilec          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-xz	--exclude)r   )r   r   r   r   exclude)r   r   r   r   r   r   test_exclude   s    
zParseArgsTestCase.test_excludec          
   C   sT   xNdD ]F}| j |d0 t|g}| |j | |ddgd W d Q R X qW d S )N)z-sz--single)r   z-fr   zdon't go together)r   r   r   r   Zsingler   )r   r   r   r   r   r   test_single   s
    
zParseArgsTestCase.test_singlec          
   C   s   xPdD ]H}| j |d2 t|dg}| |jdg | |gd W d Q R X qW tddddg}| |jddg | tjtj	 t
tj	d}td	|d
 td|d
 W d Q R X tjtj	}tddd|g}| |jdd	dg d S )N)z-mz--match)r   patternzexpected one argumentz-mZpattern1Zpattern2wZ
matchfile1)fileZ
matchfile2matchz--matchfile)r   r   r   r   Zmatch_testsr   
addCleanupr   unlinkTESTFNopenprintospathabspath)r   r   r   fpfilenamer   r   r   
test_match   s"    


zParseArgsTestCase.test_matchc          
   C   sl   xfdD ]^}| j |dH t|dg}| |j t|dg}| |j | |gd W d Q R X qW d S )N)z-Gz
--failfast)r   z-vz-Wz#-G/--failfast needs either -v or -W)r   r   r   r   Zfailfastr   )r   r   r   r   r   r   test_failfast   s    
zParseArgsTestCase.test_failfastc          
   C   s   xd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 R X qW d S )N)z-uz--use)r   zgui,networkZguinetworkzgui,none,networkzall,-guizexpected one argumentr   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   sT   xNdD ]F}| j |d0 t|dg}| |jd | |gd W d Q R X qW d S )N)z-Mz
--memlimit)r   Z4Gzexpected one argument)r   r   r   r   Zmemlimitr   )r   r   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   zexpected one argument)
r   r   r   testdirr<   r=   joinr   SAVEDCWDr   )r   r   r   r   r   test_testdir   s    zParseArgsTestCase.test_testdirc          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-Lz
--runleaks)r   )r   r   r   r   Zrunleaks)r   r   r   r   r   r   test_runleaks   s    
zParseArgsTestCase.test_runleaksc          
   C   s   xd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 R X qW d S )N)z-Rz--huntrleaks)r   :)      z
reflog.txtz6:)   rO   z
reflog.txtz:3)rN   r"   z
reflog.txtz6:3:leaks.log)rP   r"   z	leaks.logzexpected one argument6z&needs 2 or 3 colon-separated argumentszfoo:zinvalid huntrleaks valuez6:foo)r   r   r   r   
huntrleaksr   )r   r   r   r   r   r   test_huntrleaks   s    

z!ParseArgsTestCase.test_huntrleaksc          
   C   s   xdD ]z}| j |dd t|dg}| |jd | |gd | |dgd | |ddgd	 | |d
dgd	 W d Q R X qW d S )N)z-jz--multiprocess)r   2   zexpected one argumentr   zinvalid int valuez-Tzdon't go together0)r   r   r   r   Zuse_mpr   )r   r   r   r   r   r   test_multiprocess   s    
z#ParseArgsTestCase.test_multiprocessc          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-Tz
--coverage)r   )r   r   r   r   Ztrace)r   r   r   r   r   r   test_coverage  s    
zParseArgsTestCase.test_coveragec          
   C   s`   xZdD ]R}| j |d< t|dg}| |jtjtj	d | 
|gd W d Q R X qW d S )N)z-Dz
--coverdir)r   r   zexpected one argument)r   r   r   r   coverdirr<   r=   rI   r   rJ   r   )r   r   r   r   r   r   test_coverdir
  s    
zParseArgsTestCase.test_coverdirc          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-Nz--nocoverdir)r   )r   r   r   ZassertIsNonerY   )r   r   r   r   r   r   test_nocoverdir  s    
z!ParseArgsTestCase.test_nocoverdirc          
   C   sd   x^dD ]V}| j |d@ t|dg}| |jd | |gd | |dgd W d Q R X qW d S )N)z-tz--threshold)r   Z1000i  zexpected one argumentr   zinvalid int value)r   r   r   r   Z	thresholdr   )r   r   r   r   r   r   test_threshold  s    
z ParseArgsTestCase.test_thresholdc             C   sp   xjdD ]b}| j |dL tt }t|g}W d Q R X | |j |	 }| 
d| W d Q R X qW d S )N)z-nz--nowindows)r   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_nowindows   s    
z ParseArgsTestCase.test_nowindowsc          
   C   sB   x<dD ]4}| j |d t|g}| |j W d Q R X qW d S )N)z-Fz	--forever)r   )r   r   r   r   forever)r   r   r   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   r'   r   r#   )r   r   r   r   r   test_long_option__partial2  s    z+ParseArgsTestCase.test_long_option__partialc             C   s8   t ddg}| |j | |jd | |j d S )Nz--quietz	--excluder   )r   r   r   r'   r   r#   r0   )r   r   r   r   r   test_two_options7  s    z"ParseArgsTestCase.test_two_optionsc             C   s    t ddg}| |jd d S )Nz--start )r   r   r   r   )r   r   r   r   r   #test_option_with_empty_string_value=  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   r   test_argA  s    zParseArgsTestCase.test_argc             C   s<   t ddg}| |j | |jd | |jdg d S )Nz--quietr   r   )r   r   r   r'   r   r#   r   )r   r   r   r   r   test_option_and_argE  s    z%ParseArgsTestCase.test_option_and_argc             C   s4   t dddg}| |jd | |jddg d S )NZtest_unaryopz-vZ
test_binopr!   )r   r   r   r#   r   )r   r   r   r   r   test_arg_option_argK  s    z%ParseArgsTestCase.test_arg_option_argc             C   s   |  dgd d S )Nz--unknown-optionz(unrecognized arguments: --unknown-option)r   )r   r   r   r   test_unknown_optionP  s    z%ParseArgsTestCase.test_unknown_optionN)/__name__
__module____qualname____doc__r   r   unittest
skipUnlesshasattrfaulthandlerr   r   r   r    r$   r%   r&   r(   r)   r+   r-   r.   r/   r1   r2   rA   rB   rF   rG   rK   rL   rS   rW   rX   rZ   r[   r\   rb   rd   re   rf   rg   ri   rj   rk   rl   rm   r   r   r   r   r   '   sR   	
	r   c            	   @   sf   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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 )N)r<   r=   realpathdirname__file__rH   tempfileZmkdtemp
tmptestdirr7   r   Zrmtree)r   r   r   r   setUpZ  s    
zBaseTestCase.setUpNc          
   C   s   |sdt j }t  jd7  _|d kr.td}| j| }tj| j|d }| 	t
j| y(t|ddd}|| W d Q R X W n> tk
r } z t s| d||f   W d d }~X Y nX |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)rv   TEST_UNIQUE_IDtextwrapdedentTESTNAME_PREFIXr<   r=   rI   r{   r7   r   r8   r:   writePermissionError	sysconfigis_python_buildskipTest)r   namecoder=   r?   excr   r   r   create_test`  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outputr6   r   r   r   regex_search~  s    zBaseTestCase.regex_searchc             C   s"   t d| t j}| || d S )N^)r   compiler   ZassertRegex)r   r   r   r   r   r   
check_line  s    zBaseTestCase.check_linec             C   s,   d| j  }t||tj}tdd |D S )NzU^[0-9]+:[0-9]+:[0-9]+ (?:load avg: [0-9]+\.[0-9]{2} )?\[ *[0-9]+(?:/ *[0-9]+)*\] (%s)c             s   s   | ]}| d V  qdS )r!   N)group).0r6   r   r   r   	<genexpr>  s    z4BaseTestCase.parse_executed_tests.<locals>.<genexpr>)TESTNAME_REGEXr   finditerr   rD   )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}t |trp|g}| |}|	r| t|t|| n| ||| dd   fdd}|r|d|}| || |r|d|}| || |r|d|}| || |r$|d|}| || |rt|d	|}| || | |d
 x&|D ]}d| d}| || qRW |r|d|}| || t|t| t| t| t| t| }|r d| |f }|s|s|dkrd| }| || |
r| |d g }|r(|d n|r>|r>|d |
rN|d t||||
|||fsr|d n|s|d d	|}|r| |d d| }| |d|  d S )Nc             S   s   | dkrdS dS )Nr!   srh   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$)lenrI   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 modez%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SUCCESSz, zTests result: FAILUREzFAILURE then %szTests result: %s)

isinstancestrr   r   setr   r   appendanyrI   )r   r   r   skippedfailedenv_changedomittedrerunno_test_ranr,   interruptedfail_env_changedZexecutedr   r   Z	test_nameZgoodresultr   )r   r   check_executed_tests  s    













0



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   r6   randseedr   r   r   parse_random_seed  s     zBaseTestCase.parse_random_seedr   c             K   sx   |sd}d|krt j|d< t j|fd|t jd|}|j|krtdt||j|jf }|jrj|d|j 7 }| | |S )Nrh   ra   T)Zuniversal_newlinesinputstdoutz8Command %s failed with exit code %s

stdout:
---
%s
---
z
stderr:
---
%s---
)
subprocessPIPErun
returncoder   r   ra   r   )r   r   r   exitcodekwprocr   r   r   r   run_command  s"    



zBaseTestCase.run_commandc             K   s&   t jdddf|}| j|f|}|jS )Nz-Xru   z-I)sys
executabler   r   )r   r   r   r   r   r   r   
run_python  s    zBaseTestCase.run_python)NN)	r   r   r   r   r   r   FFF)Nr   )rn   ro   rp   r   r   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   rv   U  s    
    
[
rv   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.
    rO   c                sr   t     fddt jD  _dddg _ddd j g _tt	d	rX j
d
 tjdkrn jd d S )Nc                s   g | ]}   qS r   )r   )r   index)r   r   r   
<listcomp>!  s    z*ProgramsTestCase.setUp.<locals>.<listcomp>z-Wdz-Ez-bbz-uallz-rwWz--testdir=%sr   )z	--timeoutZ3600z-j4win32z-n)superr|   rangeNTESTr   python_argsr{   regrtest_argsrt   ru   extendr   platformr   )r   )	__class__)r   r   r|     s    


zProgramsTestCase.setUpc             C   s    |  | | j|| jdd d S )NT)r,   )r   r   r   )r   r   r   r   r   check_output+  s    
zProgramsTestCase.check_outputc             C   s   |  |}| | d S )N)r   r   )r   r   r   r   r   r   	run_tests/  s    
zProgramsTestCase.run_testsc             C   s2   t j| jd}| j|f| j| j}| | d S )Nzregrtest.py)r<   r=   rI   rH   r   r   r   r   )r   scriptr   r   r   r   test_script_regrtest3  s    z%ProgramsTestCase.test_script_regrtestc             C   s    | j d| j| j}| | d S )N-mtest)r   r   )r   r   r   r   )r   r   r   r   r   test_module_test:  s    z!ProgramsTestCase.test_module_testc             C   s    | j d| j| j}| | d S )N-mtest.regrtest)r   r   )r   r   r   r   )r   r   r   r   r   test_module_regrtest@  s    z%ProgramsTestCase.test_module_regrtestc             C   s    | j d| j| j}| | d S )N-mtest.autotest)r   r   )r   r   r   r   )r   r   r   r   r   test_module_autotestF  s    z%ProgramsTestCase.test_module_autotestc             C   s(   d}| j d|f| j| j}| | d S )Nzfrom test import autotestz-c)r   r   r   r   )r   r   r   r   r   r   test_module_from_test_autotestL  s    
z/ProgramsTestCase.test_module_from_test_autotestc             C   s2   t j| jd}| j|f| j| j}| | d S )Nzautotest.py)r<   r=   rI   rH   r   r   r   r   )r   r   r   r   r   r   test_script_autotestS  s    z%ProgramsTestCase.test_script_autotestz$run_tests.py script is not installedc             C   s0   t jtddd}|f| j| j}| | d S )NToolsZscriptszrun_tests.py)r<   r=   rI   ROOT_DIRr   r   r   )r   r   r   r   r   r   test_tools_script_run_testsY  s    z,ProgramsTestCase.test_tools_script_run_testsc             G   s   |  |}| |j d S )N)r   r   r   )r   r   r   r   r   r   	run_batcha  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 dkr8|d tsF|d | j	|f|| j
  d S )	Nr   Zbuildbotztest.batz--testdir=%sr   64bitz-x64z+d)r<   r=   rI   r   r{   r   architecturer   Py_DEBUGr   r   )r   r   Z	test_argsr   r   r   test_tools_buildbot_teste  s    

z)ProgramsTestCase.test_tools_buildbot_testc             C   sv   t jtd}t j|s,| d| d dg}t d dkrL|d t	rZ|d | j
|f|| j| j  d S )	NzPCbuild\rt.batzFile "z" does not existz-qr   r   z-x64z-d)r<   r=   rI   r   isfiler   r   r   r   r   r   r   r   )r   r   Zrt_argsr   r   r   test_pcbuild_rtr  s    

z ProgramsTestCase.test_pcbuild_rt)rn   ro   rp   rq   r   r|   r   r   r   r   r   r   r   r   rr   rs   r   r   r   r   r   r   r   r   __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"ejd7d8 Z#d9S ):ArgsTestCasez2
    Test arguments of the Python test suite.
    c             O   s"   ddd| j  f|}| j|f|S )Nz-mr   z--testdir=%s)r{   r   )r   Ztestargsr   Z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   rU   )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 }x*dD ]"}t d| }| ||||< q
W t| }| jd| }| || | jd	| }| j|||d d | j| }| j|||d d S )
N)ZaudiorC   a  
                        from test import support; support.requires(%r)
                        import unittest
                        class PassingTest(unittest.TestCase):
                            def test_pass(self):
                                pass
                    -uall-uaudiorC   )r   )r   r   )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))
        Zrandomz-rzTESTRANDOM: ([0-9]+)r!   z--randseed=%s)	r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r6   test_randomZ	randseed2Ztest_random2r   r   r   r     s    

zArgsTestCase.test_randomc       	   	      s   fddt dD }tj} tj| t|dV}d }xJt|dD ]<\}}d||t||f }|rr|d| 7 }t||d |}qFW W d Q R X  	d	|} 
|| t|d8}x0t|dD ]"\}}td
|t||f |d qW W d Q R X  	d	|} 
|| t|d"}x|D ]}t||d qW W d Q R X  	d	|} 
|| t|d&}x|D ]}td| |d qdW W d Q R X  	d	|} 
|| d S )Nc                s   g | ]}   qS r   )r   )r   r   )r   r   r   r     s    z.ArgsTestCase.test_fromfile.<locals>.<listcomp>rN   r4   r!   z00:00:%02i [%s/%s] %sz -- %s took 0 sec)r5   z
--fromfilez
[%s/%s] %szLib/test/%s.py)r   r   r9   r7   r8   r:   	enumerater   r;   r   r   )	r   r   r@   r?   Zpreviousr   r   liner   r   )r   r   r/     s:    (

 zArgsTestCase.test_fromfilec             C   s6   t }| jd|d}| j|dd}| j|||dd d S )Nsigint)r      )r   T)r   r   )TEST_INTERRUPTEDr   r   r   )r   r   r   r   r   r   r   test_interrupted  s
    
zArgsTestCase.test_interruptedc                sR    fddt dD } jd| } || d jt|f } || d S )Nc                s   g | ]}   qS r   )r   )r   r   )r   r   r   r     s    z-ArgsTestCase.test_slowest.<locals>.<listcomp>r"   	--slowestz#10 slowest tests:
(?:- %s: .*
){%s})r   )r   r   r   r   r   r   )r   r   r   r   r   )r   r   r)     s    zArgsTestCase.test_slowestc          
   C   s   t }| jd|d}xndD ]f}| j|dP |r:dd|f}nd|f}| j|ddi}| j|||d	d
 d}| || W d Q R X qW d S )Nr   )r   )FT)multiprocessingz	--slowestz-j2r   r   T)r   r   z10 slowest tests:
)r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   test_slowest_interrupted  s    

z%ArgsTestCase.test_slowest_interruptedc             C   s8   |  d}| d|}| ||g d}| || d S )NZcoveragez
--coveragezLlines +cov% +module +\(path\)\n(?: *[0-9]+ *[0-9]{1,2}% *[^ ]+ +\([^)]+\)+)+)r   r   r   r   )r   r   r   r   r   r   r   rX      s
    
zArgsTestCase.test_coveragec             C   s*   |  d}| jd|dd}| |d d S )Nr   z--waitkey)r   zPress any key to continue)r   r   r   )r   r   r   r   r   r   r   )  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
        rc   )r   z	--foreverrU   )r   r"   )r   )r   r   r   r   r   )r   r   r   r   r   r   r   rd   /  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 Q R X d S )NrR   )r   z
reflog.txtz--huntrleaksz3:3:rU   )r   ra   )r   z&beginning 6 repetitions
123456
......
z%s leaked [1, 1, 1] %s, sum=3
)r   r7   r   r8   r   r   ZSTDOUTr   r   r   escaper	   r:   read)
r   r   Zwhatr   r@   r   r   Zline2r?   Zreflogr   r   r   
check_leakD  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   r  )r   r   r   r   r   rS   X  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 descriptors)r   r   r  )r   r   r   r   r   test_huntrleaks_fd_leakf  s    z$ArgsTestCase.test_huntrleaks_fd_leakc                s<    fddt dD } jd| } |  | d S )Nc                s   g | ]}   qS r   )r   )r   i)r   r   r   r   v  s    z0ArgsTestCase.test_list_tests.<locals>.<listcomp>rN   --list-tests)r  )r   r   r   rstrip
splitlines)r   r   r   r   )r   r   test_list_testst  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-casesz-m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   sB   d}| j d|d}|g}| jd	|ddi}| j|||dd d S )
Nz,import faulthandler; faulthandler._sigsegv()Zcrash)r   r   -j2r   rU   T)r   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   r6   r   r   r   r     s    z.ArgsTestCase.parse_methods.<locals>.<listcomp>)r   r   r   r   )r   r   r   r   r   r   parse_methods  s    zArgsTestCase.parse_methodsc       
   	   C   s   t d}ddddg}| j|d}| d|}| |}| || tj}| tj	| dd| g}t
|d	 }x|D ]}	t|	|d
 qvW W d Q R X | dd||}| |}ddg}| || d S )NaV  
            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
  Ztest_method2Ztest_method3Ztest_method4)r   z-vz%s.Tests.test_method3r4   )r5   z--matchfile)r   r   r   r   r  r   r   r9   r7   r8   r:   r;   )
r   r   r  r  r   methodsr@   Zsubsetr?   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   z--fail-env-changedr"   )r   T)r   r   )r   r   r   r   r   )r   r   r  r   r   r   r   test_env_changed  s    
zArgsTestCase.test_env_changedc             C   s>   t d}| j|d}| jd|dd}| j||g||d d S )Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_bug(self):
                    # test always fail
                    self.fail("bug")
        )r   z-wrU   )r   )r   r   )r   r   r   r   r   )r   r   r  r   r   r   r   test_rerun_fail  s    
zArgsTestCase.test_rerun_failc             C   s<   t d}| j|d}| jd|dd}| j||g|d d S )NaT  
            import builtins
            import unittest

            class Tests(unittest.TestCase):
                failed = False

                def test_fail_once(self):
                    if not hasattr(builtins, '_test_failed'):
                        builtins._test_failed = True
                        self.fail("bug")
        )r   z-wr   )r   )r   )r   r   r   r   r   )r   r   r  r   r   r   r   test_rerun_success  s    
zArgsTestCase.test_rerun_successc             C   s>   t d}| j|d}| j|dddd}| j||g|d d S )Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_bug(self):
                    pass
        )r   z-m
nosuchtestr   )r   )r   )r   r   r   r   r   )r   r   r  r   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   )r   )r   r   r   r   r   )r   r   r  r   r   r   r   test_no_tests_ran_skip  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 )Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_bug(self):
                    pass
        )r   z-mr  r   )r   )r   )r   r   r   r   r   )r   r   r  	testname2r   r   r   r   ,test_no_tests_ran_multiple_tests_nonexistent  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 )
Nz
            import unittest

            class Tests(unittest.TestCase):
                def test_bug(self):
                    pass
        )r   z
            import unittest

            class Tests(unittest.TestCase):
                def test_other_bug(self):
                    pass
        z-mr  Ztest_other_bugr   )r   )r   )r   r   r   r   r   )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   z--fail-env-changedr"   )r   T)r   r   z--findleaks)r   r   r   r   r   )r   r   r  r   r   r   r   test_findleaksD  s    

zArgsTestCase.test_findleaksN)$rn   ro   rp   rq   r   r   r   r   r/   r   r)   r   rX   r   rd   r  rr   rs   r   rS   r  r	  r  r   Zcpython_onlyr  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r     s8   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 sec 500 msr!   z1 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_duration)r   r   r   r   test_format_durationf  s(    zTestUtils.test_format_durationN)rn   ro   rp   r!  r   r   r   r   r  e  s   r  __main__)&rq   r]   ru   r_   Zos.pathr<   r   r   r   r   r   rz   r   rr   r   r   r   Ztest.libregrtestr   rt   r   r=   rI   rx   ry   r   r>   normpathr   r   ZTestCaser   rv   r   r   r  rn   mainr   r   r   r   <module>   sB   
  0 Ak   h
