B
    Ã S]=U  ã               @   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Zd dlZd dlmZ d dlmZ ejZG dd„ dejƒZdd„ Zedkr¶eƒ  dS )	é    N)Úsupport)Úscript_helperc               @   s¼  e Zd Zdd„ Zdd„ Zdd„ Ze 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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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)G dHdI„ dIƒZ*G dJdK„ dKƒZ+dLdM„ Z,dNdO„ Z-dPdQ„ Z.e eedRƒo€eedSƒdT¡dUdV„ ƒZ/dbdXdY„Z0dZd[„ Z1d\d]„ Z2d^d_„ Z3d`da„ Z4dWS )cÚTestSupportc             C   s    t  d¡ |  tjt jd¡ d S )NÚftplibÚfoo)r   Úimport_moduleÚassertRaisesÚunittestÚSkipTest)Úself© r   ú"lib/python3.7/test/test_support.pyÚtest_import_module   s    
zTestSupport.test_import_modulec             C   s   t  d¡ d S )Nr   )r   Zimport_fresh_module)r   r   r   r   Útest_import_fresh_module   s    z$TestSupport.test_import_fresh_modulec             C   s.   |   t | d¡| j¡ |  tjtj| d¡ d S )NÚtest_get_attributer   )ÚassertEqualr   Zget_attributer   r   r	   r
   )r   r   r   r   r      s    zTestSupport.test_get_attributezfailing buildbotsc             C   s   |   t ¡ tj¡ d S )N)r   r   Zget_original_stdoutÚsysÚstdout)r   r   r   r   Útest_get_original_stdout#   s    z$TestSupport.test_get_original_stdoutc             C   s2   dd l }|  dtj¡ t d¡ |  dtj¡ d S )Nr   Úsched)r   ÚassertInr   Úmodulesr   ZunloadÚassertNotIn)r   r   r   r   r   Útest_unload'   s    
zTestSupport.test_unloadc          	   C   s@   t tdƒ}W d Q R X t t¡ |  tj t¡¡ t t¡ d S )NÚw)ÚopenÚTESTFNr   ÚunlinkÚassertFalseÚosÚpathÚexists)r   Úfr   r   r   Útest_unlink-   s
    

zTestSupport.test_unlinkc          	   C   s$  t jd }tj |d¡}t |¡ t |¡ t  |¡ |  tj |¡¡ t  	t dd¡ t  |¡ W d Q R X t |¡ t |¡ t 
|tjtjB ¡ t  	t dd¡ t  |¡ W d Q R X |  tj |¡¡ t |¡ t |¡ t 
|d¡ t  	t dd¡ t  |¡ W d Q R X |  tj |¡¡ d S )NÚdZsubdirÚverboser   )r   r   r   r    ÚjoinÚmkdirÚrmtreer   r!   Ú	swap_attrÚchmodÚstatÚS_IRUSRÚS_IXUSR)r   ÚdirpathZ
subdirpathr   r   r   Útest_rmtree4   s(    







zTestSupport.test_rmtreec          	   C   s˜   t d }t|dƒ}td|d W d Q R X tj dtj¡ t 	¡  z2t
t ƒ}|  t tj¡ t t ¡ |  t tj¡ W d tjd= t |¡ t d¡ X d S )Nz.pyr   zfoo = 1)Úfiler   Ú__pycache__)r   r   Úprintr   r    Úinsertr   ÚcurdirÚ	importlibÚinvalidate_cachesÚ
__import__r   r   r   Zforgetr   r   r(   )r   Zmod_filenamer"   Úmodr   r   r   Útest_forgetL   s    

zTestSupport.test_forgetc             C   s$   t   ¡ }| tjdf¡ | ¡  d S )Nr   )ÚsocketÚbindr   ÚHOSTÚclose)r   Úsr   r   r   Ú	test_HOST]   s    zTestSupport.test_HOSTc             C   s,   t  ¡ }t ¡ }| t j|f¡ | ¡  d S )N)r   Zfind_unused_portr:   r;   r<   r=   )r   Zportr>   r   r   r   Útest_find_unused_portb   s    z!TestSupport.test_find_unused_portc             C   s&   t   ¡ }t |¡ | ¡  | ¡  d S )N)r:   r   Z	bind_portZlistenr=   )r   r>   r   r   r   Útest_bind_porth   s    
zTestSupport.test_bind_portc          	   C   s   t  ¡ }tj |¡}zjtj |d¡}|  tj |¡¡ t 	|¡$}|  
||¡ |  tj |¡¡ W dQ R X |  tj |¡¡ W dt |¡ X dS )z8Test that temp_dir() creates and destroys its directory.ZtempN)ÚtempfileÚmkdtempr   r    Úrealpathr&   r   Úisdirr   Útemp_dirr   Ú
assertTruer(   )r   Ú
parent_dirr    Ú	temp_pathr   r   r   Útest_temp_dirp   s    zTestSupport.test_temp_dirc          	   C   s<   t  ¡ }|  tj |¡¡ W dQ R X |  tj |¡¡ dS )zTest passing no path.N)r   rF   rG   r   r    rE   r   )r   rI   r   r   r   Útest_temp_dir__path_none   s    
z$TestSupport.test_temp_dir__path_nonec          	   C   sd   dd„ }t  ¡ }tj |¡}z6|  tj |¡¡ |  t||¡ |  tj |¡¡ W dt	 
|¡ X dS )z-Test passing a directory that already exists.c          	   S   s"   t  | ¡}tdƒ‚W d Q R X d S )Nzshould not get here)r   rF   Ú	Exception)r    rI   r   r   r   Úcall_temp_dir‡   s    zMTestSupport.test_temp_dir__existing_dir__quiet_default.<locals>.call_temp_dirN)rB   rC   r   r    rD   rG   rE   r   ÚFileExistsErrorÚshutilr(   )r   rM   r    r   r   r   Ú*test_temp_dir__existing_dir__quiet_default…   s    z6TestSupport.test_temp_dir__existing_dir__quiet_defaultc          
   C   sº   t  ¡ }tj |¡}z`t ¡ <}tj|dd}|  ||¡ W dQ R X dd„ |j	D ƒ}W dQ R X |  
tj |¡¡ W dt |¡ X |  t|ƒd|¡ |d }|  
| d|›d	¡|¡ dS )
z=Test passing a directory that already exists with quiet=True.T)ÚquietNc             S   s   g | ]}t |jƒ‘qS r   )ÚstrÚmessage)Ú.0r   r   r   r   ú
<listcomp>ž   s    zGTestSupport.test_temp_dir__existing_dir__quiet_true.<locals>.<listcomp>é   r   z5tests may fail, unable to create temporary directory z: )rB   rC   r   r    rD   r   Úcheck_warningsrF   r   ÚwarningsrG   rE   rO   r(   ÚlenÚ
startswith)r   r    ÚrecorderrI   rX   Úwarnr   r   r   Ú'test_temp_dir__existing_dir__quiet_true•   s    
z3TestSupport.test_temp_dir__existing_dir__quiet_trueÚforkztest requires os.forkc             C   s   t  dt d¡¡ dS )z?Test that a forked child process does not remove the directory.z-ca§  
            import os
            from test import support
            with support.temp_cwd() as temp_path:
                pid = os.fork()
                if pid != 0:
                    # parent process (child has pid == 0)

                    # wait for the child to terminate
                    (pid, status) = os.waitpid(pid, 0)
                    if status != 0:
                        raise AssertionError(f"Child process failed with exit "
                                             f"status indication 0x{status:x}.")

                    # Make sure that temp_path is still present. When the child
                    # process leaves the 'temp_cwd'-context, the __exit__()-
                    # method of the context must not remove the temporary
                    # directory.
                    if not os.path.isdir(temp_path):
                        raise AssertionError("Child removed temp_path.")
        N)r   Zassert_python_okÚtextwrapÚdedent)r   r   r   r   Útest_temp_dir__forked_childª   s    
z'TestSupport.test_temp_dir__forked_childc          
   C   sb   t  ¡ }t ¡ 8}t |¡"}|  ||¡ |  t  ¡ |¡ W d Q R X W d Q R X |  t  ¡ |¡ d S )N)r   Úgetcwdr   rF   Ú
change_cwdr   )r   Úoriginal_cwdrI   Únew_cwdr   r   r   Útest_change_cwdÇ   s    
$zTestSupport.test_change_cwdc          	   C   sT   t  ¡ }dd„ }t ¡ "}t j |d¡}|  t||¡ W dQ R X |  t  ¡ |¡ dS )z&Test passing a non-existent directory.c          	   S   s"   t  | ¡}tdƒ‚W d Q R X d S )Nzshould not get here)r   rc   rL   )r    re   r   r   r   Úcall_change_cwdÕ   s    zFTestSupport.test_change_cwd__non_existent_dir.<locals>.call_change_cwdÚdoes_not_existN)	r   rb   r   rF   r    r&   r   ÚFileNotFoundErrorr   )r   rd   rg   rH   Znon_existent_dirr   r   r   Ú!test_change_cwd__non_existent_dirÑ   s    
z-TestSupport.test_change_cwd__non_existent_dirc             C   s¼   t  ¡ }t ¡ n}t j |d¡}t ¡ L}tj|dd"}|  ||¡ |  t  ¡ |¡ W dQ R X dd„ |j	D ƒ}W dQ R X W dQ R X |  t
|ƒd|¡ |d }|  | d	|›d
¡|¡ dS )z6Test passing a non-existent directory with quiet=True.rh   T)rQ   Nc             S   s   g | ]}t |jƒ‘qS r   )rR   rS   )rT   r   r   r   r   rU   ê   s    zMTestSupport.test_change_cwd__non_existent_dir__quiet_true.<locals>.<listcomp>rV   r   zBtests may fail, unable to change the current working directory to z: )r   rb   r   rF   r    r&   rW   rc   r   rX   rY   rG   rZ   )r   rd   rH   Zbad_dirr[   re   rX   r\   r   r   r   Ú-test_change_cwd__non_existent_dir__quiet_trueà   s    

$z9TestSupport.test_change_cwd__non_existent_dir__quiet_truec          
   C   s~   t d }t ¡ 0}tj|dd W dQ R X dd„ |jD ƒ}W dQ R X |  t|ƒd|¡ |d }|  | d	|›d
¡|¡ dS )z0Check the warning message when os.chdir() fails.Z_does_not_existT)r    rQ   Nc             S   s   g | ]}t |jƒ‘qS r   )rR   rS   )rT   r   r   r   r   rU   û   s    z>TestSupport.test_change_cwd__chdir_warning.<locals>.<listcomp>rV   r   zBtests may fail, unable to change the current working directory to z: )	r   r   rW   rc   rX   r   rY   rG   rZ   )r   r    r[   ZmessagesÚmsgr   r   r   Útest_change_cwd__chdir_warningõ   s    

z*TestSupport.test_change_cwd__chdir_warningc          	   C   s^   t  ¡ }tjtd |  t j t  ¡ ¡t¡ W d Q R X |  t j 	t¡¡ |  t  ¡ |¡ d S )N)Úname)
r   rb   r   Útemp_cwdr   r   r    Úbasenamer   r!   )r   Úherer   r   r   Útest_temp_cwd  s
    "zTestSupport.test_temp_cwdc          	   C   sb   t  ¡ }tjdd4}|  ||¡ |  t j |¡¡ |  t  ¡ |¡ W dQ R X |  t  ¡ |¡ dS )z Test passing None to temp_cwd().N)rn   )	r   rb   r   ro   ZassertNotEqualrG   r    rE   r   )r   rd   re   r   r   r   Útest_temp_cwd__name_none  s    z$TestSupport.test_temp_cwd__name_nonec             C   s   |   t ddddœ¡d¡ d S )Né   é   rV   )rt   ru   rV   z{1: 1, 2: 2, 3: 3})r   r   Zsortdict)r   r   r   r   Útest_sortdict  s    zTestSupport.test_sortdictc          	   C   s@   t  ¡ }|  t¡}t |d¡ W d Q R X |  |jjtj	¡ d S )Ns   foo)
r   Zmake_bad_fdr   ÚOSErrorr   Úwriter   Z	exceptionÚerrnoZEBADF)r   ÚfdÚcmr   r   r   Útest_make_bad_fd  s    zTestSupport.test_make_bad_fdc          	   C   s8   t j| dddd |  t¡ t  | d¡ W d Q R X d S )Nz	def classrV   é	   )ÚlinenoÚoffsetzx=1)r   Zcheck_syntax_errorr   ÚAssertionError)r   r   r   r   Útest_check_syntax_error   s    z#TestSupport.test_check_syntax_errorc          	   C   s,   dd l }t d¡ | d¡ W d Q R X d S )Nr   Zasyncore)r5   r   ZCleanImportr   )r   r5   r   r   r   Útest_CleanImport%  s    zTestSupport.test_CleanImportc          	   C   sT   t  dd¡" |  dtj¡ |  dtj¡ W d Q R X |  dtj¡ |  dtj¡ d S )Nr   Zbar)r   ZDirsOnSysPathr   r   r    r   )r   r   r   r   Útest_DirsOnSysPath*  s
    zTestSupport.test_DirsOnSysPathc          	   C   s0   t  ¡ }tdƒ W d Q R X |  | ¡ d¡ d S )NÚhellozhello
)r   Zcaptured_stdoutr2   r   Úgetvalue)r   r   r   r   r   Útest_captured_stdout1  s    
z TestSupport.test_captured_stdoutc          	   C   s6   t  ¡ }tdtjd W d Q R X |  | ¡ d¡ d S )Nr„   )r0   zhello
)r   Zcaptured_stderrr2   r   Ústderrr   r…   )r   r‡   r   r   r   Útest_captured_stderr6  s    
z TestSupport.test_captured_stderrc          	   C   s>   t  ¡  }| d¡ | d¡ tƒ }W d Q R X |  |d¡ d S )Nzhello
r   r„   )r   Zcaptured_stdinrx   ÚseekÚinputr   )r   ÚstdinZcapturedr   r   r   Útest_captured_stdin;  s
    


zTestSupport.test_captured_stdinc             C   s   t  ¡  d S )N)r   Z
gc_collect)r   r   r   r   Útest_gc_collectC  s    zTestSupport.test_gc_collectc             C   s   |   t ¡ t¡ d S )N)ZassertIsInstancer   Zpython_is_optimizedÚbool)r   r   r   r   Útest_python_is_optimizedF  s    z$TestSupport.test_python_is_optimizedc          	   C   sÐ   G dd„ dƒ}|ƒ }d|_ t |dd¡ }|  |j d¡ |  |d¡ W d Q R X |  |j d¡ t |dd¡}|  |jd¡ |  |¡ W d Q R X |  t|dƒ¡ t |dd¡
 |`W d Q R X |  t|dƒ¡ d S )Nc               @   s   e Zd ZdS )z'TestSupport.test_swap_attr.<locals>.ObjN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚObjJ  s   r“   rV   Úxé   Úy)r”   r   r)   r   r–   ÚassertIsNoner   Úhasattr)r   r“   Úobjr”   r–   r   r   r   Útest_swap_attrI  s    zTestSupport.test_swap_attrc          	   C   s¾   ddi}t  |dd¡"}|  |d d¡ |  |d¡ W d Q R X |  |d d¡ t  |dd¡ }|  |d d¡ |  |¡ W d Q R X |  d|¡ t  |dd¡ |d= W d Q R X |  d|¡ d S )Nr”   rV   r•   r–   )r   Z	swap_itemr   r—   r   )r   ÚDr”   r–   r   r   r   Útest_swap_itemZ  s    zTestSupport.test_swap_itemc               @   s   e Zd ZdZdZdZdZdS )zTestSupport.RefClassN)r   r‘   r’   Ú
attribute1Ú
attribute2Z_hidden_attribute1Ú__magic_1__r   r   r   r   ÚRefClassh  s   r    c               @   s   e Zd ZdZdZdZdZdS )zTestSupport.OtherClassN)r   r‘   r’   rž   Ú
attribute3rŸ   Ú__magic_2__r   r   r   r   Ú
OtherClassn  s   r£   c             C   sB   t  | j| j¡}|  dh|¡ t  | j| j¡}|  ddh|¡ d S )Nr   r¡   r¢   )r   Údetect_api_mismatchr    r£   r   )r   Úmissing_itemsr   r   r   Útest_detect_api_mismatcht  s    z$TestSupport.test_detect_api_mismatchc             C   sT   ddddg}t j| j| j|d}|  tƒ |¡ t j| j| j|d}|  tƒ |¡ d S )Nr   r¡   r¢   Znot_in_either)Úignore)r   r¤   r    r£   r   Úset)r   r§   r¥   r   r   r   Ú test_detect_api_mismatch__ignore}  s    z,TestSupport.test_detect_api_mismatch__ignorec             C   sZ   dh}dh}t j| t||d ddh}dddh}t j| td	||d |  tt j| t¡ d S )
NZtempdirÚtemplate)ÚextraÚ	blacklistZTextTestResultZinstallHandlerZ
load_testsZTestProgramZBaseTestSuite)zunittest.resultzunittest.casezunittest.suitezunittest.loaderzunittest.mainzunittest.runnerzunittest.signals)r   Zcheck__all__rB   r	   r   r€   )r   r«   r¬   r   r   r   Útest_check__all__ˆ  s    
zTestSupport.test_check__all__ÚwaitpidÚWNOHANGz need os.waitpid() and os.WNOHANGc          	   C   sÔ   t  ¡  t ¡ }|dkr"t d¡ t ¡ }t ¡ d }t j}z‚dt _t 	¡ }xJt ¡ |krd|  
d¡ t |¡ t  ¡  W d Q R X t jrŠP t d¡ qNW d| }|  || ¡ ¡ |  t j¡ W d |t _X t  ¡  d S )Nr   g      N@FZtimeoutgš™™™™™¹?z2Warning -- reap_children() reaped child process %s)r   Zreap_childrenr   r^   Ú_exitÚtimeZ	monotonicZenvironment_alteredÚioÚStringIOZfailÚ
contextlibÚredirect_stderrZsleepr   r…   rG   )r   ÚpidZt0ZdeadlineZwas_alteredr‡   rl   r   r   r   Útest_reap_childrenž  s.    

zTestSupport.test_reap_childrenNc             C   s„   d|› d|› d}t jf|d|f•}dd„ tj ¡ D ƒ}tj|tjtjd|d}|d kr\|}|  	|j
 ¡ t|ƒ¡ |  	|jd	¡ d S )
Nzfrom test.support import z; print(repr(z()))z-cc             S   s    i | ]\}}|  d ¡s||“qS )ZPYTHON)rZ   )rT   ÚkeyÚvaluer   r   r   ú
<dictcomp>Î  s    z-TestSupport.check_options.<locals>.<dictcomp>T)r   r‡   Zuniversal_newlinesÚenvr   )r   Ú
executabler   ÚenvironÚitemsÚ
subprocessÚrunÚPIPEZDEVNULLr   r   ÚrstripÚreprÚ
returncode)r   ÚargsÚfuncZexpectedÚcodeÚcmdr»   Úprocr   r   r   Úcheck_optionsË  s    zTestSupport.check_optionsc             C   s¬   xg dgdgdgdgdgdgdgdgd	gd
gdgddgdddgddgddgddgddgddgddgfD ](}| j |d |  |d¡ W d Q R X qfW |  dddgddg¡ d S )Nz-Bz-sz-Sz-Ez-vz-bz-qz-Iz-bbz-vvvz-Wignorez-XZdevZfaulthandlerZ
importtimeZshowalloccountZshowrefcountÚtracemallocztracemalloc=3)ÚoptsZargs_from_interpreter_flags)ÚsubTestrÊ   )r   rÌ   r   r   r   Ú test_args_from_interpreter_flagsÚ  s2    z,TestSupport.test_args_from_interpreter_flagsc          
   C   sD   x>g dgdgdgfD ](}| j |d |  |d¡ W d Q R X qW d S )Nz-Oz-OOz-OOOO)rÌ   Z!optim_args_from_interpreter_flags)rÍ   rÊ   )r   rÌ   r   r   r   Ú&test_optim_args_from_interpreter_flagsý  s    z2TestSupport.test_optim_args_from_interpreter_flagsc          	   C   sâ  G dd„ dƒ}|dƒ}|dƒ}t  t dd ¡ª t  g ¡ |  t  |¡¡ |  t  |¡¡ t  d ¡ |  t  |¡¡ |  t  |¡¡ t  | ¡ g¡ |  t  |¡¡ |  t  |¡¡ t  dg¡ |  t  |¡¡ |  t  |¡¡ t  dg¡ |  t  |¡¡ |  t  |¡¡ t  dg¡ |  t  |¡¡ t  d	g¡ |  t  |¡¡ t  d
g¡ |  t  |¡¡ |  t  |¡¡ t  | ¡ | ¡ g¡ |  t  |¡¡ |  t  |¡¡ t  ddg¡ |  t  |¡¡ |  t  |¡¡ W d Q R X d S )Nc               @   s   e Zd Zdd„ Zdd„ ZdS )z)TestSupport.test_match_test.<locals>.Testc             S   s
   || _ d S )N)Útest_id)r   rÐ   r   r   r   Ú__init__  s    z2TestSupport.test_match_test.<locals>.Test.__init__c             S   s   | j S )N)rÐ   )r   r   r   r   Úid  s    z,TestSupport.test_match_test.<locals>.Test.idN)r   r‘   r’   rÑ   rÒ   r   r   r   r   ÚTest
  s   rÓ   z"test.test_os.FileTests.test_accessz'test.test_os.Win32ErrorTests.test_chdirZ_match_test_funcZtest_osztest_*Z	filetestsZ	FileTestsz*test_os.*.test_*Útest_accessZ	DONTMATCH)r   r)   Zset_match_testsrG   Z
match_testrÒ   r   )r   rÓ   rÔ   Z
test_chdirr   r   r   Útest_match_test	  s@    

zTestSupport.test_match_testc          	   C   sD   t  ¡ }t ttj¡}zt  ¡ }W d t |¡ X |  || d¡ d S )NrV   )r   Zfd_countr   r   Ú__file__ÚO_RDONLYr=   r   )r   Ústartrz   Zmorer   r   r   Útest_fd_countB  s    zTestSupport.test_fd_count)N)5r   r‘   r’   r   r   r   r	   Úskipr   r   r#   r/   r9   r?   r@   rA   rJ   rK   rP   r]   Z
skipUnlessr˜   r   ra   rf   rj   rk   rm   rr   rs   rv   r|   r   r‚   rƒ   r†   rˆ   rŒ   r   r   rš   rœ   r    r£   r¦   r©   r­   r·   rÊ   rÎ   rÏ   rÕ   rÙ   r   r   r   r   r      s\   
		,
#9r   c              C   s   t g} tj| Ž  d S )N)r   r   Zrun_unittest)Ztestsr   r   r   Ú	test_mainh  s    rÛ   Ú__main__)r´   ry   r5   r²   r   rO   r:   r+   r¿   r   rB   r_   r±   r	   Ztestr   Ztest.supportr   r   ZTestCaser   rÛ   r   r   r   r   r   Ú<module>   s0       W