B
    18™\=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   úU/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_support.pyÚtest_import_module   s    
zTestSupport.test_import_modulec             C   s   t  d¡ d S )Nr   )r   Ú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   Ú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   Ú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   Ú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ÚdÚ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   Ú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   Úfind_unused_portr@   rA   rB   rC   )r   ÚportrD   r   r   r   Útest_find_unused_portb   s    z!TestSupport.test_find_unused_portc             C   s&   t   ¡ }t |¡ | ¡  | ¡  d S )N)r@   r   Ú	bind_portÚlistenrC   )r   rD   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.Ú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   rQ   rR   r#   r$   rP   r"   )r   rT   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   rQ   Ú	Exception)r$   rT   r   r   r   Úcall_temp_dir‡   s    zMTestSupport.test_temp_dir__existing_dir__quiet_default.<locals>.call_temp_dirN)rM   rN   r#   r$   rO   rR   rP   r   ÚFileExistsErrorÚshutilr-   )r   rX   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: )rM   rN   r#   r$   rO   r   Úcheck_warningsrQ   r   ÚwarningsrR   rP   rZ   r-   ÚlenÚ
startswith)r   r$   ÚrecorderrT   rc   Ú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   Ú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   rQ   Ú
change_cwdr   )r   Úoriginal_cwdrT   Ú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   ro   rW   )r$   rq   r   r   r   Úcall_change_cwdÕ   s    zFTestSupport.test_change_cwd__non_existent_dir.<locals>.call_change_cwdÚdoes_not_existN)	r#   rn   r   rQ   r$   r+   r   ÚFileNotFoundErrorr   )r   rp   rs   rS   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.rt   T)r\   Nc             S   s   g | ]}t |jƒ‘qS r   )r]   r^   )r_   r   r   r   r   r`   ê   s    zMTestSupport.test_change_cwd__non_existent_dir__quiet_true.<locals>.<listcomp>ra   r   zBtests may fail, unable to change the current working directory to z: )r#   rn   r   rQ   r$   r+   rb   ro   r   rc   rd   rR   re   )r   rp   rS   Zbad_dirrf   rq   rc   rg   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$   r\   Nc             S   s   g | ]}t |jƒ‘qS r   )r]   r^   )r_   r   r   r   r   r`   û   s    z>TestSupport.test_change_cwd__chdir_warning.<locals>.<listcomp>ra   r   zBtests may fail, unable to change the current working directory to z: )	r    r   rb   ro   rc   r   rd   rR   re   )r   r$   rf   Ú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#   rn   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)r{   )	r#   rn   r   r|   ÚassertNotEqualrR   r$   rP   r   )r   rp   rq   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é   é   ra   )r‚   rƒ   ra   z{1: 1, 2: 2, 3: 3})r   r   Ú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   Úmake_bad_fdr   ÚOSErrorr#   Úwriter   Ú	exceptionÚerrnoÚ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 classra   é	   )ÚlinenoÚoffsetzx=1)r   Ú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   Úasyncore)r:   r   ÚCleanImportr   )r   r:   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   Úbar)r   Ú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   Úcaptured_stdoutr7   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›   )r5   zhello
)r   Úcaptured_stderrr7   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   Úcaptured_stdinrˆ   ÚseekÚinputr   )r   ÚstdinZcapturedr   r   r   Útest_captured_stdin;  s
    


zTestSupport.test_captured_stdinc             C   s   t  ¡  d S )N)r   Ú
gc_collect)r   r   r   r   Útest_gc_collectC  s    zTestSupport.test_gc_collectc             C   s   |   t ¡ t¡ d S )N)ÚassertIsInstancer   Ú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°   ra   Ú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±   ra   r²   r³   )r   Ú	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 )
NÚtempdirÚtemplate)ÚextraÚ	blacklistÚTextTestResultÚinstallHandlerÚ
load_testsÚTestProgramÚBaseTestSuite)zunittest.resultzunittest.casezunittest.suitezunittest.loaderzunittest.mainzunittest.runnerzunittest.signals)r   Úcheck__all__rM   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@FÚtimeoutgš™™™™™¹?z2Warning -- reap_children() reaped child process %s)r   Úreap_childrenr#   ri   Ú_exitÚtimeÚ	monotonicÚenvironment_alteredÚioÚStringIOÚfailÚ
contextlibÚredirect_stderrÚsleepr   r   rR   )r   ÚpidÚt0ÚdeadlineZwas_alteredr    ry   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 )ÚPYTHON)re   )r_   ÚkeyÚvaluer   r   r   ú
<dictcomp>Î  s    z-TestSupport.check_options.<locals>.<dictcomp>T)r   r    Úuniversal_newlinesÚenvr   )r   Ú
executabler#   ÚenvironÚitemsÚ
subprocessÚrunÚPIPEÚDEVNULLr   r   ÚrstripÚreprÚ
returncode)r   ÚargsÚfuncÚ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-XÚdevÚfaulthandlerÚ
importtimeÚshowalloccountÚshowrefcountÚtracemallocztracemalloc=3)ÚoptsÚ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  Ú!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_chdirÚ_match_test_funcÚtest_osztest_*Z	filetestsÚ	FileTestsz*test_os.*.test_*Útest_accessZ	DONTMATCH)r   r.   Úset_match_testsrR   Ú
match_testr
  r"   )r   r  r  Ú
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 )Nra   )r   Úfd_countr#   r   Ú__file__ÚO_RDONLYrC   r   )r   ÚstartrŒ   Úmorer   r   r   Útest_fd_countB  s    zTestSupport.test_fd_count)N)5r­   r®   r¯   r   r   r   r	   Úskipr   r   r'   r4   r?   rE   rH   rK   rU   rV   r[   rh   Ú
skipUnlessrµ   r#   rm   rr   rv   rw   rz   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   r   r   r      s\   
		,
#9r   c              C   s   t g} tj| Ž  d S )N)r   r   Úrun_unittest)Útestsr   r   r   Ú	test_mainh  s    r  Ú__main__)rÞ   rŠ   r:   rÛ   r#   rZ   r@   r0   rî   r   rM   rk   rØ   r	   Útestr   Ztest.supportr   r    ÚTestCaser   r  r­   r   r   r   r   Ú<module>   s0       W