B
    18™\Ã% ã               @   sF  d dl Z d dl mZ d dlm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Zd dlZd dlZd dlZd dlmZ yd dlZW n ek
rØ   dZY n
X d dlZyd dlZW n ek
r   dZY nX ejre  d¡‚ejdkZer2dZndZd	Ze e!e"fZ#G d
d„ de j$ƒZ%G dd„ de&ƒZ'G dd„ dej(ƒZ)G dd„ de%ƒZ*G dd„ de%ƒZ+e  ,ed¡G dd„ de%ƒƒZ-e  .ed¡G dd„ de%ƒƒZ/G dd„ de j$ƒZ0e  .e1edƒd¡G dd„ de*ƒƒZ2e  .ed ¡G d!d"„ d"e%ƒƒZ3G d#d$„ d$e%ƒZ4e5d%krBe  6¡  dS )&é    N)Úmock)Úsupport)ÚFakePathztest is not helpful for PGOÚwin32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);Ú )Znonexisting_i_hopec               @   s&   e Zd Zdd„ Zdd„ Zddd„ZdS )	ÚBaseTestCasec             C   s   t  ¡  d S )N)r   Úreap_children)Úself© r
   úX/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_subprocess.pyÚsetUp8   s    zBaseTestCase.setUpc             C   sB   xt jD ]}| ¡  qW t  ¡  |  t jd¡ |  ¡  t ¡  d S )Nzsubprocess._active not empty)Ú
subprocessÚ_activeÚwaitÚ_cleanupÚassertFalseÚ
doCleanupsr   r   )r	   Úinstr
   r
   r   ÚtearDown=   s    zBaseTestCase.tearDownNc             C   s$   t  |¡}| ¡ }|  |||¡ d S )N)r   Ústrip_python_stderrÚstripÚassertEqual)r	   ÚstderrÚexpectedÚmsgÚactualr
   r
   r   ÚassertStderrEqualE   s    
zBaseTestCase.assertStderrEqual)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r
   r
   r
   r   r   7   s   r   c               @   s   e Zd ZdS )ÚPopenTestExceptionN)r   r   r   r
   r
   r
   r   r    O   s   r    c               @   s   e Zd ZdZdd„ ZdS )ÚPopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when
    _execute_child fails.
    c             O   s   t dƒ‚d S )NzForced Exception for Test)r    )r	   ÚargsÚkwargsr
   r
   r   Ú_execute_childW   s    z&PopenExecuteChildRaises._execute_childN)r   r   r   Ú__doc__r$   r
   r
   r
   r   r!   S   s   r!   c               @   sÚ  e 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e ed-¡d.d/„ ƒZd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Z d8d9„ Z!e ed:¡d;d<„ ƒZ"e ed:¡d=d>„ ƒZ#d?d@„ Z$e e%j&e%j'kdA¡dBdC„ ƒZ(e e%j&e%j'kdA¡e e) *¡ dD¡dEdF„ ƒƒZ+dGdH„ Z,dIdJ„ Z-dKdL„ Z.dMdN„ Z/dOdP„ Z0dQdR„ Z1dSdT„ Z2dUdV„ Z3dWdX„ Z4dYdZ„ Z5d[d\„ Z6d]d^„ Z7d_d`„ Z8dadb„ Z9dcdd„ Z:dedf„ Z;dgdh„ Z<e e%j=dikdj¡e e) >dk¡dlkdm¡dndo„ ƒƒZ?dpdq„ Z@drds„ ZAdtdu„ ZBdvdw„ ZCdxdy„ ZDdzd{„ ZEd|d}„ ZFd~d„ ZGd€d„ ZHd‚dƒ„ ZId„d…„ ZJd†d‡„ ZKdˆd‰„ ZLdŠd‹„ ZMdŒd„ ZNdŽd„ ZOdd‘„ ZPd’d“„ ZQd”d•„ ZRd–d—„ ZSd˜d™„ ZTdšd›„ ZUdœd„ ZVdždŸ„ ZWd d¡„ ZXd¢d£„ ZYd¤d¥„ ZZd¦d§„ Z[d¨d©„ Z\dªd«„ Z]d¬d­„ Z^d®d¯„ Z_d°d±„ Z`d²d³„ Zad´dµ„ Zbd¶d·„ Zcd¸d¹„ Zde eefegdºƒd»¡e eefehd¼ƒd½¡e eefehd¾ƒd¿¡dÀdÁ„ ƒƒƒZie eehjj kdÂeh l¡  ¡dÃ¡dÄdÅ„ ƒZme edÆ¡dÇdÈ„ ƒZne edÆ¡dÉdÊ„ ƒZodËS )ÌÚProcessTestCasec             C   s‚   t jtjddgt jt jt jd}z4|  |jtj¡ |  |j	tj¡ |  |j
tj¡ W d |j ¡  |j	 ¡  |j
 ¡  | ¡  X d S )Nz-czimport sys; sys.exit(0))ÚstdinÚstdoutr   )r   ÚPopenÚsysÚ
executableÚPIPEÚassertIsInstancer'   ÚioÚBufferedIOBaser(   r   Úcloser   )r	   Úpr
   r
   r   Útest_io_buffered_by_default]   s    



z+ProcessTestCase.test_io_buffered_by_defaultc             C   s„   t jtjddgt jt jt jdd}z4|  |jtj¡ |  |j	tj¡ |  |j
tj¡ W d |j ¡  |j	 ¡  |j
 ¡  | ¡  X d S )Nz-czimport sys; sys.exit(0)r   )r'   r(   r   Úbufsize)r   r)   r*   r+   r,   r-   r'   r.   Ú	RawIOBaser(   r   r0   r   )r	   r1   r
   r
   r   Útest_io_unbuffered_worksk   s    


z(ProcessTestCase.test_io_unbuffered_worksc             C   s"   t  tjddg¡}|  |d¡ d S )Nz-czimport sys; sys.exit(47)é/   )r   Úcallr*   r+   r   )r	   Úrcr
   r
   r   Útest_call_seqy   s    
zProcessTestCase.test_call_seqc             C   s"   | j tjtjtjddgdd d S )Nz-czwhile True: passgš™™™™™¹?)Útimeout)ÚassertRaisesr   ÚTimeoutExpiredr7   r*   r+   )r	   r
   r
   r   Útest_call_timeout   s    
z!ProcessTestCase.test_call_timeoutc             C   s"   t  tjddg¡}|  |d¡ d S )Nz-czimport sys; sys.exit(0)r   )r   Ú
check_callr*   r+   r   )r	   r8   r
   r
   r   Útest_check_call_zeroˆ   s    
z$ProcessTestCase.test_check_call_zeroc          	   C   s>   |   tj¡}t tjddg¡ W d Q R X |  |jjd¡ d S )Nz-czimport sys; sys.exit(47)r6   )	r;   r   ÚCalledProcessErrorr>   r*   r+   r   Ú	exceptionÚ
returncode)r	   Úcr
   r
   r   Útest_check_call_nonzeroŽ   s    
z'ProcessTestCase.test_check_call_nonzeroc             C   s"   t  tjddg¡}|  d|¡ d S )Nz-czprint('BDFL')s   BDFL)r   Úcheck_outputr*   r+   ÚassertIn)r	   Úoutputr
   r
   r   Útest_check_output•   s    z!ProcessTestCase.test_check_outputc          	   C   s>   |   tj¡}t tjddg¡ W d Q R X |  |jjd¡ d S )Nz-czimport sys; sys.exit(5)é   )	r;   r   r@   rE   r*   r+   r   rA   rB   )r	   rC   r
   r
   r   Útest_check_output_nonzero›   s    z)ProcessTestCase.test_check_output_nonzeroc             C   s(   t jtjddgt jd}|  d|¡ d S )Nz-cz$import sys; sys.stderr.write('BDFL'))r   s   BDFL)r   rE   r*   r+   ÚSTDOUTrF   )r	   rG   r
   r
   r   Útest_check_output_stderr¢   s    

z(ProcessTestCase.test_check_output_stderrc             C   sN   t  ¡ }|  |j¡ | d¡ | d¡ tjtj	ddg|d}|  
d|¡ d S )Ns   pearr   z-cz6import sys; sys.stdout.write(sys.stdin.read().upper()))r'   s   PEAR)ÚtempfileÚTemporaryFileÚ
addCleanupr0   ÚwriteÚseekr   rE   r*   r+   rF   )r	   ÚtfrG   r
   r
   r   Útest_check_output_stdin_arg©   s    

z+ProcessTestCase.test_check_output_stdin_argc             C   s&   t jtjddgdd}|  d|¡ d S )Nz-cz6import sys; sys.stdout.write(sys.stdin.read().upper())s   pear)Úinputs   PEAR)r   rE   r*   r+   rF   )r	   rG   r
   r
   r   Útest_check_output_input_argµ   s
    z+ProcessTestCase.test_check_output_input_argc          	   C   sP   |   t¡(}tjtjddgtjd}|  d¡ W d Q R X |  d|j	j
d ¡ d S )Nz-czprint('will not be run'))r(   z-Expected ValueError when stdout arg supplied.r(   r   )r;   Ú
ValueErrorr   rE   r*   r+   r(   ÚfailrF   rA   r"   )r	   rC   rG   r
   r
   r   Útest_check_output_stdout_arg½   s    

z,ProcessTestCase.test_check_output_stdout_argc          	   C   sŒ   t  ¡ }|  |j¡ | d¡ | d¡ |  t¡(}tj	t
jddg|dd}|  d¡ W d Q R X |  d|jjd ¡ |  d	|jjd ¡ d S )
Ns   pearr   z-czprint('will not be run')s   hare)r'   rT   z7Expected ValueError when stdin and input args supplied.r'   rT   )rM   rN   rO   r0   rP   rQ   r;   rV   r   rE   r*   r+   rW   rF   rA   r"   )r	   rR   rC   rG   r
   r
   r   Ú&test_check_output_stdin_with_input_argÆ   s    



z6ProcessTestCase.test_check_output_stdin_with_input_argc          	   C   sL   |   tj¡&}tjtjddgdd}|  d¡ W d Q R X |  |jj	d¡ d S )Nz-czMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)é   )r:   zExpected TimeoutExpired.s   BDFL)
r;   r   r<   rE   r*   r+   rW   r   rA   rG   )r	   rC   rG   r
   r
   r   Útest_check_output_timeoutÔ   s    z)ProcessTestCase.test_check_output_timeoutc             C   s8   t j ¡ }d|d< tjtjddg|d}|  |d¡ d S )NÚbananaÚFRUITz-cz5import sys, os;sys.exit(os.getenv("FRUIT")=="banana"))Úenvé   )ÚosÚenvironÚcopyr   r7   r*   r+   r   )r	   Únewenvr8   r
   r
   r   Útest_call_kwargsã   s    

z ProcessTestCase.test_call_kwargsc          	   C   sh   t  ¡ F}| jttjdd tjjjj}dg|d  }| jttjf|žŽ  W d Q R X |  	| 
¡ d¡ d S )Nr_   )Zinvalid_arg_namer   r   )r   Úcaptured_stderrr;   Ú	TypeErrorr   r)   Ú__init__Ú__code__Úco_argcountr   Úgetvalue)r	   ÚsZargcountZtoo_many_argsr
   r
   r   Útest_invalid_argsí   s    
z!ProcessTestCase.test_invalid_argsc             C   sR   t jtjddgt jt jd}|  |jj¡ |  |jj¡ | 	¡  |  
|jd ¡ d S )Nz-czprint("banana"))r(   r   )r   r)   r*   r+   r,   rO   r(   r0   r   r   r   r'   )r	   r1   r
   r
   r   Útest_stdin_none÷   s    zProcessTestCase.test_stdin_nonec             C   sl   d}t jtjd|gt jt jd}|  |jj¡ |  |jj¡ | 	¡ \}}|  
|jd|¡ |  
| ¡ d¡ d S )Nz²import sys; from subprocess import Popen, PIPE;p = Popen([sys.executable, "-c", "print('test_stdout_none')"],          stdin=PIPE, stderr=PIPE);p.wait(); assert p.stdout is None;z-c)r(   r   r   s   test_stdout_none)r   r)   r*   r+   r,   rO   r(   r0   r   Úcommunicater   rB   Úrstrip)r	   Úcoder1   ÚoutÚerrr
   r
   r   Útest_stdout_none   s    z ProcessTestCase.test_stdout_nonec             C   sR   t jtjddgt jt jd}|  |jj¡ |  |jj¡ | 	¡  |  
|jd ¡ d S )Nz-czprint("banana"))r'   r(   )r   r)   r*   r+   r,   rO   r(   r0   r'   r   r   r   )r	   r1   r
   r
   r   Útest_stderr_none  s    z ProcessTestCase.test_stderr_nonec             K   s2   |dg }t j|f|Ž}| ¡  |  d|j¡ d S )Nzimport sys; sys.exit(47)r6   )r   r)   r   r   rB   )r	   Úpre_argsr#   r"   r1   r
   r
   r   Ú_assert_python   s    
zProcessTestCase._assert_pythonc             C   s0   t j t j tj¡d¡}| j|dgtjd d S )NÚdoesnotexistz-c)r+   )r`   ÚpathÚjoinÚdirnamer*   r+   rv   )r	   rw   r
   r
   r   Útest_executable(  s    zProcessTestCase.test_executablec             C   s0   t jdg}|  |¡ | jt| j|td d d S )Nz-cr   )r+   )r*   r+   rv   r;   ÚNONEXISTING_ERRORSÚNONEXISTING_CMD)r	   ru   r
   r
   r   Ú test_executable_takes_precedence3  s
    

z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellc             C   s   | j g tjdd d S )NT)r+   Úshell)rv   r*   r+   )r	   r
   r
   r   Útest_executable_replaces_shell=  s    z.ProcessTestCase.test_executable_replaces_shellc          	   C   s   t  |¡
 t ¡ S Q R X d S )N)r   Ú
change_cwdr`   Úgetcwd)r	   Úcwdr
   r
   r   Ú_normalize_cwdD  s    zProcessTestCase._normalize_cwdc             C   s   t j tj¡}t j |¡S )N)r`   rx   Úrealpathr*   r+   Úsplit)r	   Zpython_pathr
   r
   r   Ú_split_python_pathL  s    z"ProcessTestCase._split_python_pathc             K   sn   t j|ddgfdt ji|—Ž}|  |jj¡ | ¡  |  d|j¡ t	j
j}|  ||ƒ||j ¡  d¡ƒ¡ d S )Nz-cz;import os, sys; sys.stdout.write(os.getcwd()); sys.exit(47)r(   r6   zutf-8)r   r)   r,   rO   r(   r0   r   r   rB   r`   rx   ÚnormcaseÚreadÚdecode)r	   Zexpected_cwdZ
python_argr#   r1   rˆ   r
   r
   r   Ú_assert_cwdR  s    
zProcessTestCase._assert_cwdc             C   s(   t  ¡ }|  |¡}| j|tj|d d S )N)rƒ   )rM   Ú
gettempdirr„   r‹   r*   r+   )r	   Útemp_dirr
   r
   r   Útest_cwdc  s    
zProcessTestCase.test_cwdc             C   s,   t  ¡ }|  |¡}| j|tjt|ƒd d S )N)rƒ   )rM   rŒ   r„   r‹   r*   r+   r   )r	   r   r
   r
   r   Útest_cwd_with_pathlikei  s    
z&ProcessTestCase.test_cwd_with_pathlikez"pending resolution of issue #15533c          	   C   sv   |   ¡ \}}tj tj|¡}t ¡ H}|  tt	j
|g¡ | jtt	j
|g|d |  |¡}| j|||d W d Q R X d S )N)rƒ   )r‡   r`   rx   ry   Úcurdirr   Útemp_cwdr;   ÚFileNotFoundErrorr   r)   r„   r‹   )r	   Ú
python_dirÚpython_baseÚ
rel_pythonÚ	wrong_dirr
   r
   r   Útest_cwd_with_relative_argn  s    



z*ProcessTestCase.test_cwd_with_relative_argc          	   C   s‚   |   ¡ \}}tj tj|¡}d}t ¡ P}| jtt	j
|g|d | jtt	j
|g||d |  |¡}| j||||d W d Q R X d S )NÚsomethingyoudonthave)r+   )r+   rƒ   )r‡   r`   rx   ry   r   r   r‘   r;   r’   r   r)   r„   r‹   )r	   r“   r”   r•   Zdoesntexistr–   r
   r
   r   Ú!test_cwd_with_relative_executable~  s    




z1ProcessTestCase.test_cwd_with_relative_executablec          	   C   sr   |   ¡ \}}tj ||¡}tj tj|¡}t ¡ 6}| jtt	j
|g|d |  |¡}| j|||d W d Q R X d S )N)rƒ   )r‡   r`   rx   ry   r   r   r   r;   r’   r   r)   r„   r‹   )r	   r“   r”   Z
abs_pythonr•   r–   r
   r
   r   Útest_cwd_with_absolute_arg‘  s    


z*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblec             C   s.   |   ¡ \}}|  |¡}| j|dtj|d d S )Nr˜   )r+   rƒ   )r‡   r„   r‹   r*   r+   )r	   r“   r”   r
   r
   r   Útest_executable_with_cwdŸ  s    
z(ProcessTestCase.test_executable_with_cwdz#need an installed Python. See #7774c             C   s   | j t ¡ dtjd d S )Nr˜   )r+   )r‹   r`   r‚   r*   r+   )r	   r
   r
   r   Útest_executable_without_cwd§  s    z+ProcessTestCase.test_executable_without_cwdc             C   sH   t jtjddgt jd}|j d¡ |j ¡  | ¡  |  	|j
d¡ d S )Nz-cz0import sys; sys.exit(sys.stdin.read() == "pear"))r'   s   pearr_   )r   r)   r*   r+   r,   r'   rP   r0   r   r   rB   )r	   r1   r
   r
   r   Útest_stdin_pipe±  s    


zProcessTestCase.test_stdin_pipec             C   sf   t  ¡ }|  |j¡ | ¡ }t |d¡ t |dd¡ tj	t
jddg|d}| ¡  |  |jd¡ d S )Ns   pearr   z-cz0import sys; sys.exit(sys.stdin.read() == "pear"))r'   r_   )rM   rN   rO   r0   Úfilenor`   rP   Úlseekr   r)   r*   r+   r   r   rB   )r	   rR   Údr1   r
   r
   r   Útest_stdin_filedes»  s    
z"ProcessTestCase.test_stdin_filedesc             C   sX   t  ¡ }|  |j¡ | d¡ | d¡ tjtj	ddg|d}| 
¡  |  |jd¡ d S )Ns   pearr   z-cz0import sys; sys.exit(sys.stdin.read() == "pear"))r'   r_   )rM   rN   rO   r0   rP   rQ   r   r)   r*   r+   r   r   rB   )r	   rR   r1   r
   r
   r   Útest_stdin_fileobjÈ  s    


z"ProcessTestCase.test_stdin_fileobjc          	   C   s>   t jtjddgt jd}| |  |j ¡ d¡ W d Q R X d S )Nz-cz&import sys; sys.stdout.write("orange"))r(   s   orange)r   r)   r*   r+   r,   r   r(   r‰   )r	   r1   r
   r
   r   Útest_stdout_pipeÔ  s
    

z ProcessTestCase.test_stdout_pipec             C   s`   t  ¡ }|  |j¡ | ¡ }tjtjddg|d}| 	¡  t
 |dd¡ |  t
 |d¡d¡ d S )Nz-cz&import sys; sys.stdout.write("orange"))r(   r   i   s   orange)rM   rN   rO   r0   rž   r   r)   r*   r+   r   r`   rŸ   r   r‰   )r	   rR   r    r1   r
   r
   r   Útest_stdout_filedesÜ  s    
z#ProcessTestCase.test_stdout_filedesc             C   sP   t  ¡ }|  |j¡ tjtjddg|d}| ¡  | 	d¡ |  
| ¡ d¡ d S )Nz-cz&import sys; sys.stdout.write("orange"))r(   r   s   orange)rM   rN   rO   r0   r   r)   r*   r+   r   rQ   r   r‰   )r	   rR   r1   r
   r
   r   Útest_stdout_fileobjè  s    

z#ProcessTestCase.test_stdout_fileobjc          	   C   s>   t jtjddgt jd}| |  |j ¡ d¡ W d Q R X d S )Nz-cz*import sys; sys.stderr.write("strawberry"))r   s
   strawberry)r   r)   r*   r+   r,   r   r   r‰   )r	   r1   r
   r
   r   Útest_stderr_pipeó  s
    

z ProcessTestCase.test_stderr_pipec             C   s`   t  ¡ }|  |j¡ | ¡ }tjtjddg|d}| 	¡  t
 |dd¡ |  t
 |d¡d¡ d S )Nz-cz*import sys; sys.stderr.write("strawberry"))r   r   i   s
   strawberry)rM   rN   rO   r0   rž   r   r)   r*   r+   r   r`   rŸ   r   r‰   )r	   rR   r    r1   r
   r
   r   Útest_stderr_filedesû  s    
z#ProcessTestCase.test_stderr_filedesc             C   sP   t  ¡ }|  |j¡ tjtjddg|d}| ¡  | 	d¡ |  
| ¡ d¡ d S )Nz-cz*import sys; sys.stderr.write("strawberry"))r   r   s
   strawberry)rM   rN   rO   r0   r   r)   r*   r+   r   rQ   r   r‰   )r	   rR   r1   r
   r
   r   Útest_stderr_fileobj  s    

z#ProcessTestCase.test_stderr_fileobjc             C   sR   t jtjddgt jt jd}| ¡ \}}|  |d¡ |  |d¡ |  |jd¡ d S )Nz-cz›import sys, subprocess;rc = subprocess.call([sys.executable, "-c",    "import sys;"    "sys.stderr.write('42')"],    stderr=subprocess.STDOUT);sys.exit(rc))r(   r   s   42ó    r   )	r   r)   r*   r+   r,   rn   r   r   rB   )r	   r1   r(   r   r
   r
   r   Ú,test_stderr_redirect_with_no_stdout_redirect  s    

z<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectc          	   C   sB   t jtjddgt jt jd}| |  |j ¡ d¡ W d Q R X d S )Nz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange"))r(   r   s   appleorange)	r   r)   r*   r+   r,   rK   r   r(   r‰   )r	   r1   r
   r
   r   Útest_stdout_stderr_pipe'  s    

z'ProcessTestCase.test_stdout_stderr_pipec             C   sR   t  ¡ }|  |j¡ tjtjddg||d}| ¡  | 	d¡ |  
| ¡ d¡ d S )Nz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange"))r(   r   r   s   appleorange)rM   rN   rO   r0   r   r)   r*   r+   r   rQ   r   r‰   )r	   rR   r1   r
   r
   r   Útest_stdout_stderr_file3  s    

z'ProcessTestCase.test_stdout_stderr_filec             C   sl   d}t jtjd|gt jt jd}|  |jj¡ |  |jj¡ | 	¡ \}}|  
|jd|¡ |  
| ¡ d¡ d S )Nzµimport sys, subprocess; rc = subprocess.call([sys.executable, "-c",     "import os, sys; sys.exit(os.write(sys.stdout.fileno(), b'test with stdout=1'))"], stdout=1); assert rc == 18z-c)r(   r   r   s   test with stdout=1)r   r)   r*   r+   r,   rO   r(   r0   r   rn   r   rB   ro   )r	   rp   r1   rq   rr   r
   r
   r   Útest_stdout_filedes_of_stdoutB  s    z-ProcessTestCase.test_stdout_filedes_of_stdoutc             C   s2   t jtjddgt jd}| ¡  |  |jd ¡ d S )Nz-cz'for i in range(10240):print("x" * 1024))r(   )r   r)   r*   r+   ÚDEVNULLr   r   r(   )r	   r1   r
   r
   r   Útest_stdout_devnullU  s
    

z#ProcessTestCase.test_stdout_devnullc             C   s2   t jtjddgt jd}| ¡  |  |jd ¡ d S )Nz-cz=import sys
for i in range(10240):sys.stderr.write("x" * 1024))r   )r   r)   r*   r+   r®   r   r   r   )r	   r1   r
   r
   r   Útest_stderr_devnull]  s
    

z#ProcessTestCase.test_stderr_devnullc             C   s2   t jtjddgt jd}| ¡  |  |jd ¡ d S )Nz-czimport sys;sys.stdin.read(1))r'   )r   r)   r*   r+   r®   r   r   r'   )r	   r1   r
   r
   r   Útest_stdin_devnullf  s
    

z"ProcessTestCase.test_stdin_devnullc          	   C   sT   t j ¡ }d|d< tjtjddgtj|d}| ¡ \}}|  	|d¡ W d Q R X d S )NÚoranger]   z-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT")))r(   r^   s   orange)
r`   ra   rb   r   r)   r*   r+   r,   rn   r   )r	   rc   r1   r(   r   r
   r
   r   Útest_envn  s    


zProcessTestCase.test_envr   z#cannot test an empty env on WindowsÚPy_ENABLE_SHAREDr_   zEThe Python shared library cannot be loaded with an empty environment.c          	      st   dd„ ‰ t jtjddgt ji dH}| ¡ \}}t| ¡ ƒ}|  |t	¡ ‡ fdd„|D ƒ}|  
|g ¡ W dQ R X dS )	z+Verify that env={} is as empty as possible.c             S   s2   d| kp0d| kp0d| kp0| dkp0|   d¡p0| dkS )z:Determine if an environment variable is under our control.Z	VERSIONERZ__CFÚ__PYVENV_LAUNCHER__Z
LD_PRELOADZSANDBOXÚLC_CTYPE)Ú
startswith)Únr
   r
   r   Úis_env_var_to_ignoreƒ  s    z<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignorez-cz)import os; print(list(os.environ.keys())))r(   r^   c                s   g | ]}ˆ |ƒs|‘qS r
   r
   )Ú.0Úk)r¹   r
   r   ú
<listcomp>“  s    z2ProcessTestCase.test_empty_env.<locals>.<listcomp>N)r   r)   r*   r+   r,   rn   Úevalr   r-   Úlistr   )r	   r1   r(   r   Zchild_env_namesr
   )r¹   r   Útest_empty_env{  s    

zProcessTestCase.test_empty_envc          	   C   s\   t jd }|  t¡ t |ddg¡ W d Q R X |  t¡ t t jddg¡ W d Q R X d S )Nú z-cÚpasszpass# )r*   r+   r;   rV   r   r)   )r	   Úcmdr
   r
   r   Útest_invalid_cmd—  s
    
z ProcessTestCase.test_invalid_cmdc          	   C   s  t j ¡ }d|d< |  t¡ tjtjddg|d W d Q R X t j ¡ }d|d< |  t¡ tjtjddg|d W d Q R X t j ¡ }d|d	< |  t¡ tjtjddg|d W d Q R X t j ¡ }d
|d< tjtjddgtj	|d}| 
¡ \}}|  |d¡ W d Q R X d S )NÚcabbagezFRUIT VEGETABLEz-crÁ   )r^   zorange VEGETABLE=cabbager]   ÚlemonzFRUIT=ORANGEzorange=lemonz3import sys, os;sys.stdout.write(os.getenv("FRUIT")))r(   r^   s   orange=lemon)r`   ra   rb   r;   rV   r   r)   r*   r+   r,   rn   r   )r	   rc   r1   r(   r   r
   r
   r   Útest_invalid_env¡  s(    
 
 
 


z ProcessTestCase.test_invalid_envc             C   s4   t jtjddgt jd}| d¡ |  |jd¡ d S )Nz-cz/import sys;sys.exit(sys.stdin.read() == "pear"))r'   s   pearr_   )r   r)   r*   r+   r,   rn   r   rB   )r	   r1   r
   r
   r   Útest_communicate_stdin¿  s
    


z&ProcessTestCase.test_communicate_stdinc             C   s@   t jtjddgt jd}| ¡ \}}|  |d¡ |  |d ¡ d S )Nz-cz)import sys; sys.stdout.write("pineapple"))r(   s	   pineapple)r   r)   r*   r+   r,   rn   r   )r	   r1   r(   r   r
   r
   r   Útest_communicate_stdoutÇ  s    

z'ProcessTestCase.test_communicate_stdoutc             C   s@   t jtjddgt jd}| ¡ \}}|  |d ¡ |  |d¡ d S )Nz-cz)import sys; sys.stderr.write("pineapple"))r   s	   pineapple)r   r)   r*   r+   r,   rn   r   r   )r	   r1   r(   r   r
   r
   r   Útest_communicate_stderrÏ  s    

z'ProcessTestCase.test_communicate_stderrc             C   st   t jtjddgt jt jt jd}|  |jj¡ |  |jj¡ |  |j	j¡ | 
d¡\}}|  |d¡ |  |d¡ d S )Nz-czNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read()))r'   r(   r   s   bananas	   pineapple)r   r)   r*   r+   r,   rO   r(   r0   r   r'   rn   r   r   )r	   r1   r(   r   r
   r
   r   Útest_communicate×  s    

z ProcessTestCase.test_communicatec             C   sd   t jtjddgdt jt jt jd}| jt j|jddd | ¡ \}}|  |d¡ |  	| 
¡ d¡ d S )	Nz-cz~import sys,os,time;sys.stderr.write("pineapple\n");time.sleep(1);sys.stderr.write("pear\n");sys.stdout.write(sys.stdin.read())T)Úuniversal_newlinesr'   r(   r   r\   g333333Ó?)r:   s   pineapple
pear
)r   r)   r*   r+   r,   r;   r<   rn   r   r   Úencode)r	   r1   r(   r   r
   r
   r   Útest_communicate_timeoutæ  s    

z(ProcessTestCase.test_communicate_timeoutc             C   sL   t jtjddgt jd}| jt j|jdd | ¡ \}}|  t	|ƒd¡ d S )Nz-czÓimport sys,os,time;sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));)r(   gš™™™™™Ù?)r:   i   )
r   r)   r*   r+   r,   r;   r<   rn   r   Úlen)r	   r1   r(   Ú_r
   r
   r   Ú%test_communicate_timeout_large_outputù  s    

z5ProcessTestCase.test_communicate_timeout_large_outputc             C   sÈ   xÂdD ]º}x´dD ]¬}x¦dD ]ž}i }|r0t j|d< |r>t j|d< |rLt j|d< |sRqt jtjddff|Ž}| ¡  |jd k	rˆ|  |jj¡ |j	d k	r |  |j	j¡ |j
d k	r|  |j
j¡ qW qW qW d S )N)FTr'   r(   r   z-crÁ   )r   r,   r)   r*   r+   rn   r'   Ú
assertTrueÚclosedr(   r   )r	   Z
stdin_pipeZstdout_pipeZstderr_pipeÚoptionsr1   r
   r
   r   Útest_communicate_pipe_fd_leak
  s(    








z-ProcessTestCase.test_communicate_pipe_fd_leakc             C   s:   t  tjddg¡}| ¡ \}}|  |d ¡ |  |d ¡ d S )Nz-czimport sys; sys.exit(47))r   r)   r*   r+   rn   r   )r	   r1   r(   r   r
   r
   r   Útest_communicate_returns   s
    
z(ProcessTestCase.test_communicate_returnsc             C   s˜   t  ¡ \}}t  |¡ t  |¡ tjtjddtj gtj	tj	tj	d}|  
|jj¡ |  
|jj¡ |  
|jj¡ dtj }| |¡\}}|  ||¡ d S )Nz-czpimport sys,os;sys.stdout.write(sys.stdin.read(47));sys.stderr.write("x" * %d);sys.stdout.write(sys.stdin.read()))r'   r(   r   ó   a)r`   Úpiper0   r   r)   r*   r+   r   ÚPIPE_MAX_SIZEr,   rO   r(   r   r'   rn   r   )r	   ÚxÚyr1   Zstring_to_writer(   r   r
   r
   r   Útest_communicate_pipe_buf(  s    




z)ProcessTestCase.test_communicate_pipe_bufc             C   s€   t jtjddgt jt jt jd}|  |jj¡ |  |jj¡ |  |j	j¡ |j	 
d¡ | d¡\}}|  |d¡ |  |d¡ d S )Nz-cz0import sys,os;sys.stdout.write(sys.stdin.read()))r'   r(   r   s   bananas   splits   bananasplitr©   )r   r)   r*   r+   r,   rO   r(   r0   r   r'   rP   rn   r   r   )r	   r1   r(   r   r
   r
   r   Útest_writes_before_communicate?  s    

z.ProcessTestCase.test_writes_before_communicatec          
   C   sØ   t jddt d g}x¾dD ]¶}tj|fdtjdtj|diŽ}|Š |j d¡ |j ¡  |  	|j
 ¡ d¡ |j d	¡ |j ¡  |  |j
j¡ |  	|j
 ¡ d
¡ |  	|j
 d¡d	¡ |  	|j
 ¡ d¡ W d Q R X qW d S )Nz-czimport sys,os;a@  buf = sys.stdout.buffer;buf.write(sys.stdin.readline().encode());buf.flush();buf.write(b"line2\n");buf.flush();buf.write(sys.stdin.read().encode());buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");)rË   Útextr'   r(   Tzline1
zline3
zline2
é   zline4
line5
line6
line7
line8)r*   r+   Ú	SETBINARYr   r)   r,   r'   rP   Úflushr   r(   Úreadliner0   rO   r‰   )r	   r"   Zextra_kwargr1   r
   r
   r   Ú test_universal_newlines_and_textO  s(    



z0ProcessTestCase.test_universal_newlines_and_textc             C   s^   t jtjddt d gt jt jdd}|  |jj¡ |  |j	j¡ | 
¡ \}}|  |d¡ d S )Nz-czimport sys,os;zÚbuf = sys.stdout.buffer;buf.write(b"line2\n");buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");r_   )r   r(   rË   z#line2
line4
line5
line6
line7
line8)r   r)   r*   r+   rß   r,   rO   r(   r0   r   rn   r   )r	   r1   r(   r   r
   r
   r   Ú#test_universal_newlines_communicatev  s    
z3ProcessTestCase.test_universal_newlines_communicatec             C   sH   t jtjddt t d¡ gt jdd}| d¡\}}|  	|j
d¡ d S )Nz-czimport sys,os;a  
                               s = sys.stdin.readline()
                               assert s == "line1\n", repr(s)
                               s = sys.stdin.read()
                               assert s == "line3\n", repr(s)
                              r_   )r'   rË   zline1
line3
r   )r   r)   r*   r+   rß   ÚtextwrapÚdedentr,   rn   r   rB   )r	   r1   r(   r   r
   r
   r   Ú)test_universal_newlines_communicate_stdin  s    

z9ProcessTestCase.test_universal_newlines_communicate_stdinc             C   s8   t jtjddgt jt jdd}| ¡  |  |jd¡ d S )Nz-crÁ   T)r'   r(   rË   r   )r   r)   r*   r+   r,   rn   r   rB   )r	   r1   r
   r
   r   Ú.test_universal_newlines_communicate_input_none  s    z>ProcessTestCase.test_universal_newlines_communicate_input_nonec             C   sˆ   t jtjddt t d¡ gt jt jt jdd}|  |j	j
¡ |  |jj
¡ | d¡\}}|  |jd¡ |  d|¡ |  | d	¡¡ d S )
Nz-czimport sys,os;a§  
                               s = sys.stdin.buffer.readline()
                               sys.stdout.buffer.write(s)
                               sys.stdout.buffer.write(b"line2\r")
                               sys.stderr.buffer.write(b"eline2\n")
                               s = sys.stdin.buffer.read()
                               sys.stdout.buffer.write(s)
                               sys.stdout.buffer.write(b"line4\n")
                               sys.stdout.buffer.write(b"line5\r\n")
                               sys.stderr.buffer.write(b"eline6\r")
                               sys.stderr.buffer.write(b"eline7\r\nz")
                              T)r'   r   r(   rË   zline1
line3
r   zline1
line2
line3
line4
line5
zeline2
eline6
eline7
)r   r)   r*   r+   rß   rä   rå   r,   rO   r(   r0   r   rn   r   rB   rÑ   r·   )r	   r1   r(   r   r
   r
   r   Ú7test_universal_newlines_communicate_stdin_stdout_stderr©  s    

zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrc             C   sX   xRdD ]J}d| }t jd|g}tj|tjtj|d}|jdd\}}|  |d¡ qW d S )N)zutf-16z	utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))z-c)r'   r(   Úencodingr   )rT   z1
2
3
4)r*   r+   r   r)   r,   rn   r   )r	   ré   rp   r"   Úpopenr(   r   r
   r
   r   Ú-test_universal_newlines_communicate_encodingsÆ  s    
z=ProcessTestCase.test_universal_newlines_communicate_encodingsc             C   s`   xZdD ]R\}}d}t jd|g}tj|tjtjd|d}|jdd\}}|  |d |¡¡ qW d S )	N))Úignorer   )Úreplaceu   ï¿½ï¿½)Úsurrogateescapeu   í²€í²€)Úbackslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')z-czutf-8)r'   r(   ré   Úerrorsr   )rT   z[{}])r*   r+   r   r)   r,   rn   r   Úformat)r	   rð   r   rp   r"   rê   r(   r   r
   r
   r   Útest_communicate_errorsÜ  s    z'ProcessTestCase.test_communicate_errorsc       
      C   s8  t s
d}nd}g }t ¡ }zòx€t|ƒD ]f}y.tj |tj¡}| 	t 
|tjtjB ¡¡ W q& tk
rŠ } z|jtjkrx‚ P W d d }~X Y q&X q&W |  d| ¡ xtdƒD ]}t | ¡ ¡ q¨W xJtdƒD ]>}tjtjddgtjtjtjd}| d	¡d
 }|  |d	¡ qÈW W d x|D ]}	t |	¡ qW t |¡ X d S )Ni  i  z4failed to reach the file descriptor limit (tried %d)é
   é   z-cz-import sys;sys.stdout.write(sys.stdin.read()))r'   r(   r   s   limer   )Ú	mswindowsrM   ÚmkdtempÚranger`   rx   ry   r   ÚTESTFNÚappendÚopenÚO_WRONLYÚO_CREATÚOSErrorÚerrnoÚEMFILEÚskipTestr0   Úpopr   r)   r*   r+   r,   rn   r   ÚshutilÚrmtree)
r	   Zmax_handlesÚhandlesÚtmpdirÚiZtmpfileÚer1   ÚdataÚhr
   r
   r   Útest_no_leakingñ  s:    


zProcessTestCase.test_no_leakingc             C   sÂ   |   t dddg¡d¡ |   t dddg¡d¡ |   t dddg¡d	¡ |   t d
ddg¡d¡ |   t dddg¡d¡ |   t dddg¡d¡ |   t dddg¡d¡ |   t ddg¡d¡ d S )Nza b cr    r  z"a b c" d ezab"cú\z	ab\"c \ dz \zab\"c " \\" dza\\\bzde fgr	  za\\\b "de fg" hza\"brC   z
a\\\"b c dza\\b cz"a\\b c" d eza\\b\ cz"a\\b\ c" d eÚabr   zab "")r   r   Úlist2cmdline)r	   r
   r
   r   Útest_list2cmdline  s     z!ProcessTestCase.test_list2cmdlinec             C   sb   t jtjddgt jd}|  |jj¡ |  | 	¡ ¡ t
 |j ¡ d¡ | ¡  |  | 	¡ d¡ d S )Nz-czimport os; os.read(0, 1))r'   ó   Ar   )r   r)   r*   r+   r,   rO   r'   r0   ÚassertIsNoneÚpollr`   rP   rž   r   r   )r	   r1   r
   r
   r   Ú	test_poll*  s    

zProcessTestCase.test_pollc             C   s6   t  tjddg¡}|  | ¡ d¡ |  | ¡ d¡ d S )Nz-crÁ   r   )r   r)   r*   r+   r   r   )r	   r1   r
   r
   r   Ú	test_wait5  s    zProcessTestCase.test_waitc          	   C   s`   t  tjddg¡}|  t j¡}|jdd W d Q R X |  dt|j	ƒ¡ |  
|jddd¡ d S )Nz-czimport time; time.sleep(0.3)g-Cëâ6?)r:   z0.0001rZ   r   )r   r)   r*   r+   r;   r<   r   rF   ÚstrrA   r   )r	   r1   rC   r
   r
   r   Útest_wait_timeout;  s    
z!ProcessTestCase.test_wait_timeoutc          	   C   s.   |   t¡ t tjddgd¡ W d Q R X d S )Nz-crÁ   r²   )r;   rf   r   r)   r*   r+   )r	   r
   r
   r   Útest_invalid_bufsizeE  s    z$ProcessTestCase.test_invalid_bufsizec             C   sN   t  tjddgd ¡}|  | ¡ d¡ t jtjddgd d}|  | ¡ d¡ d S )Nz-crÁ   r   )r3   )r   r)   r*   r+   r   r   )r	   r1   r
   r
   r   Útest_bufsize_is_noneK  s    z$ProcessTestCase.test_bufsize_is_nonec          
   C   s²   t jtjddgt jt jt jd|dj}|j |¡ t 	|j 
¡ ¡ |j ¡ }t ¡ * y|j 	¡  W n tk
rx   Y nX W d Q R X d |_W d Q R X |  |jd¡ |  ||¡ d S )Nz-czDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r_   )r'   r(   r   r3   rË   r   )r   r)   r*   r+   r,   r®   r'   rP   r`   r0   rž   r(   rá   r   ÚSuppressCrashReportrý   r   rB   )r	   Úliner   rË   r1   Z	read_liner
   r
   r   Ú_test_bufsize_equal_oneS  s"    


z'ProcessTestCase._test_bufsize_equal_onec             C   s   d}| j ||dd d S )Nzline
T)rË   )r  )r	   r  r
   r
   r   Ú test_bufsize_equal_one_text_modei  s    z0ProcessTestCase.test_bufsize_equal_one_text_modec             C   s"   dt j ¡  }| j|ddd d S )Ns   liner©   F)rË   )r`   ÚlineseprÌ   r  )r	   r  r
   r
   r   Ú"test_bufsize_equal_one_binary_modeo  s    z2ProcessTestCase.test_bufsize_equal_one_binary_modec          
   C   s@   x:t dƒD ].}|  t¡ tjttjtjd W d Q R X q
W d S )Ni   )r(   r   )r÷   r;   r|   r   r)   r}   r,   )r	   r  r
   r
   r   Útest_leaking_fds_on_erroru  s
    z)ProcessTestCase.test_leaking_fds_on_errorc          	   C   s    ydd l }|j W n" ttfk
r4   |  d¡ Y nX t dt›d¡}tj	d|g}t
j|t
jdd}| | ¡ d }W d Q R X |  |d	¡ |  |jd¡ d S )
Nr   zneed msvcrt.CrtSetReportModezL
            import msvcrt
            import subprocess

            cmd = a  

            for report_type in [msvcrt.CRT_WARN,
                                msvcrt.CRT_ERROR,
                                msvcrt.CRT_ASSERT]:
                msvcrt.CrtSetReportMode(report_type, msvcrt.CRTDBG_MODE_FILE)
                msvcrt.CrtSetReportFile(report_type, msvcrt.CRTDBG_FILE_STDERR)

            try:
                subprocess.Popen(cmd,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            except OSError:
                pass
        z-cT)r   rË   r_   r   )ÚmsvcrtÚCrtSetReportModeÚAttributeErrorÚImportErrorr   rä   rå   r}   r*   r+   r   r)   r,   rn   r   rB   )r	   r  rp   rÂ   Úprocr   r
   r
   r   Útest_nonexisting_with_pipes  s    
z+ProcessTestCase.test_nonexisting_with_pipesc                sº   g ‰ ‡ fdd„}t j|d}| ¡  z2|  t¡ tjttjtjtjd W d Q R X W d | 	¡  d }xBˆ D ]:}yt
 |¡ W qj tk
r¢ } z|}W d d }~X Y qjX qjW |d k	r´|‚X d S )Nc                 s.   x(t dƒD ]} ˆ  t ¡ ¡ t d¡ q
W d S )Né   gü©ñÒMbP?)r÷   Úextendr`   r×   ÚtimeÚsleep)r  )Úfdsr
   r   Úopen_fds­  s    z<ProcessTestCase.test_double_close_on_error.<locals>.open_fds)Útarget)r'   r(   r   )Ú	threadingÚThreadÚstartr;   ÚEnvironmentErrorr   r)   r}   r,   ry   r`   r0   rý   )r	   r*  ÚtÚexcÚfdr  r
   )r)  r   Útest_double_close_on_errorª  s&    
z*ProcessTestCase.test_double_close_on_errorc                s²   t  tjddg¡‰ |  ˆ jd¡ g ‰‡ ‡fdd„}t d|¡}| ¡  t	rPd}nd}ˆ j
d	d
 | jˆ j|dd ˆ  
¡  | jˆ j|dd | ¡  |  dd|fd|fgˆ¡ dS )z?Issue21291: Popen.wait() needs to be threadsafe for returncode.z-czimport time; time.sleep(12)Nc                  sN   ˆ  dˆ  ¡ f¡ ˆ  ¡  ˆ  ¡  ˆ  dˆ jf¡ ˆ  ¡  ˆ  dˆ jf¡ d S )Nzthread-start-poll-resultzthread-after-kill-and-waitzthread-after-second-wait)rù   r  Úkillr   rB   r
   )r#  Úresultsr
   r   Úkill_proc_timer_threadÎ  s    zDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_threadgš™™™™™É?r_   i÷ÿÿÿr%  )r:   z*unexpected result in wait from main thread)r   z&unexpected result in second main wait.)zthread-start-poll-resultNzthread-after-kill-and-waitzthread-after-second-wait)r   r)   r*   r+   r   rB   r,  ÚTimerr.  rõ   r   ry   )r	   r6  r0  Zexpected_errorcoder
   )r#  r5  r   Útest_threadsafe_waitÇ  s*    


z$ProcessTestCase.test_threadsafe_waitc             C   s6   d  d¡}t tjd|g¡}|  | d¡t|ƒ¡ d S )Nú;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0z-cs   Hello World!)ry   r   rE   r*   r+   rÑ   r·   Úascii)r	   rp   rG   r
   r
   r   Útest_issue8780û  s    zProcessTestCase.test_issue8780c             C   sÈ   t  ¡ \}}t  ¡ \}}t  ¡ \}}ytjdg|||d W nP tk
rŒ   t |¡ t |¡ t |¡ t |¡ t |¡ t |¡ Y nX |  tj	 
|¡¡ |  tj	 
|¡¡ |  tj	 
|¡¡ d S )NÚ*)r'   r(   r   )rM   Úmkstempr   r)   rý   r`   r0   Úremover   rx   Úexists)r	   ZifhandleZifnameZofhandleÚofnameZefhandleZefnamer
   r
   r   Ú test_handles_closed_on_exception  s     




z0ProcessTestCase.test_handles_closed_on_exceptionc             C   s\   t jtjddgt jt jt jd}|  |jj¡ |  |jj¡ |  |j	j¡ | 
dd ¡ d S )Nz-crÁ   )r'   r(   r   ó   xi   )r   r)   r*   r+   r,   rO   r(   r0   r   r'   rn   )r	   r1   r
   r
   r   Útest_communicate_epipe  s    
z&ProcessTestCase.test_communicate_epipec             C   s@   t jtjddgt jd}|  |jj¡ | ¡  | 	dd ¡ d S )Nz-crÁ   )r'   rB  i   )
r   r)   r*   r+   r,   rO   r'   r0   r   rn   )r	   r1   r
   r
   r   Ú!test_communicate_epipe_only_stdin%  s
    
z1ProcessTestCase.test_communicate_epipe_only_stdinÚSIGUSR1zRequires signal.SIGUSR1r4  zRequires os.killÚgetppidzRequires os.getppidc          
   C   sr   dd„ }t   t j|¡}|  t j t j|¡ tjddg}x8dD ]0}|tji}tj|f|Ž}| ¡  W d Q R X q:W d S )Nc             S   s   d S )Nr
   )ÚsignumÚframer
   r
   r   Úhandler5  s    z7ProcessTestCase.test_communicate_eintr.<locals>.handlerz-cz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1))r(   r   )	ÚsignalrE  rO   r*   r+   r   r,   r)   rn   )r	   rI  Úold_handlerr"   ÚstreamÚkwÚprocessr
   r
   r   Útest_communicate_eintr-  s    

z&ProcessTestCase.test_communicate_eintrz/proc/%d/fdzLinux specificc          	   C   sd   dt  ¡  }t  |¡}|  t¡$ ttjddgtj	tj	tj	d W dQ R X t  |¡}|  
||¡ dS )z;Test for the fork() failure fd leak reported in issue16327.z/proc/%d/fdz-crÁ   )r'   r(   r   N)r`   ÚgetpidÚlistdirr;   r    r!   r*   r+   r   r,   r   )r	   Zfd_directoryZfds_before_popenZfds_after_exceptionr
   r
   r   Ú!test_failed_child_execute_fd_leakF  s    

z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on Windowsc          	   C   s<   |   t¡}t ddddg¡ W d Q R X |  |jjd¡ d S )Nz/opt/nonexistent_binaryÚwithZsomer"   )r;   r’   r   r7   r   rA   Úfilename)r	   rC   r
   r
   r   Ú%test_file_not_found_includes_filenameX  s    z5ProcessTestCase.test_file_not_found_includes_filenamec          	   C   s<   |   t¡}tjddgdd W d Q R X |  |jjd¡ d S )NÚexitÚ0z/some/nonexistent/directory)rƒ   )r;   r’   r   r)   r   rA   rT  )r	   rC   r
   r
   r   Ú test_file_not_found_with_bad_cwd^  s    z0ProcessTestCase.test_file_not_found_with_bad_cwdN)pr   r   r   r2   r5   r9   r=   r?   rD   rH   rJ   rL   rS   rU   rX   rY   r[   rd   rl   rm   rs   rt   rv   r{   r~   ÚunittestÚskipIfrõ   r€   r„   r‡   r‹   rŽ   r   r—   r™   rš   r*   Úbase_prefixÚprefixr›   Ú	sysconfigÚis_python_buildrœ   r   r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   rª   r«   r¬   r­   r¯   r°   r±   r³   ÚplatformÚget_config_varr¿   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  r$  r3  r8  r;  rA  rC  rD  Ú
skipUnlessÚhasattrrJ  r`   rO  rx   ÚisdirrP  rR  rU  rX  r
   r
   r
   r   r&   [   sÒ   		

		


	
''
)4r&   c               @   s„   e 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S ) ÚRunFuncTestCasec             K   s   t jd|g}tj|f|ŽS )z4Run Python code in a subprocess using subprocess.runz-c)r*   r+   r   Úrun)r	   rp   r#   Úargvr
   r
   r   Ú
run_pythonf  s    zRunFuncTestCase.run_pythonc          	   C   s<   |   d¡}|  |jd¡ |  tj¡ | ¡  W d Q R X d S )Nzimport sys; sys.exit(47)r6   )rg  r   rB   r;   r   r@   Úcheck_returncode)r	   Úcpr
   r
   r   Útest_returncodek  s    
zRunFuncTestCase.test_returncodec          	   C   s:   |   tj¡}| jddd W d Q R X |  |jjd¡ d S )Nzimport sys; sys.exit(47)T)Úcheckr6   )r;   r   r@   rg  r   rA   rB   )r	   rC   r
   r
   r   Ú
test_checkr  s    zRunFuncTestCase.test_checkc             C   s    | j ddd}|  |jd¡ d S )Nzimport sys; sys.exit(0)T)rk  r   )rg  r   rB   )r	   ri  r
   r
   r   Útest_check_zerow  s    zRunFuncTestCase.test_check_zeroc          	   C   s*   |   tj¡ | jddd W d Q R X d S )Nzwhile True: passg-Cëâ6?)r:   )r;   r   r<   rg  )r	   r
   r
   r   Útest_timeout|  s    zRunFuncTestCase.test_timeoutc             C   s"   | j dtjd}|  d|j¡ d S )Nzprint('BDFL'))r(   s   BDFL)rg  r   r,   rF   r(   )r	   ri  r
   r
   r   Útest_capture_stdout„  s    z#RunFuncTestCase.test_capture_stdoutc             C   s"   | j dtjd}|  d|j¡ d S )Nz$import sys; sys.stderr.write('BDFL'))r   s   BDFL)rg  r   r,   rF   r   )r	   ri  r
   r
   r   Útest_capture_stderr‰  s    
z#RunFuncTestCase.test_capture_stderrc             C   sL   t  ¡ }|  |j¡ | d¡ | d¡ | jd|tjd}|  	d|j
¡ d S )Ns   pearr   z6import sys; sys.stdout.write(sys.stdin.read().upper()))r'   r(   s   PEAR)rM   rN   rO   r0   rP   rQ   rg  r   r,   rF   r(   )r	   rR   ri  r
   r
   r   rS   Ž  s    

z+RunFuncTestCase.test_check_output_stdin_argc             C   s$   | j ddtjd}|  d|j¡ d S )Nz6import sys; sys.stdout.write(sys.stdin.read().upper())s   pear)rT   r(   s   PEAR)rg  r   r,   rF   r(   )r	   ri  r
   r
   r   rU   ™  s    z+RunFuncTestCase.test_check_output_input_argc          	   C   s~   t  ¡ }|  |j¡ | d¡ | d¡ | jtdd}| jd|dd}W d Q R X |  	d|j
jd ¡ |  	d	|j
jd ¡ d S )
Ns   pearr   z7Expected ValueError when stdin and input args supplied.)r   zprint('will not be run')s   hare)r'   rT   r'   rT   )rM   rN   rO   r0   rP   rQ   r;   rV   rg  rF   rA   r"   )r	   rR   rC   rG   r
   r
   r   rY      s    


z6RunFuncTestCase.test_check_output_stdin_with_input_argc          	   C   sN   |   tj¡}| jddtjd}W d Q R X |  |jjd¡ |  |jjd¡ d S )NzMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)rZ   )r:   r(   s   BDFL)	r;   r   r<   rg  r,   r   rA   rG   r(   )r	   rC   ri  r
   r
   r   r[   ­  s    z)RunFuncTestCase.test_check_output_timeoutc             C   s2   t j ¡ }d|d< | jd|d}|  |jd¡ d S )Nr\   r]   zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31))r^   é!   )r`   ra   rb   rg  r   rB   )r	   rc   ri  r
   r
   r   Útest_run_kwargs»  s
    
zRunFuncTestCase.test_run_kwargsc             C   s.   | j ddd}|  d|j¡ |  d|j¡ d S )Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)Úcapture_outputs   BDFLs   FLUFL)rg  rF   r(   r   )r	   ri  r
   r
   r   Útest_capture_outputÃ  s    z#RunFuncTestCase.test_capture_outputc          	   C   sj   t  ¡ }|  |j¡ | jtdd}| jdd|d}W d Q R X |  d|jj	d ¡ |  d|jj	d ¡ d S )	NzAExpected ValueError when stdout and capture_output args supplied.)r   zprint('will not be run')T)rs  r(   r(   r   rs  )
rM   rN   rO   r0   r;   rV   rg  rF   rA   r"   )r	   rR   rC   rG   r
   r
   r   Ú#test_stdout_with_capture_output_argË  s    z3RunFuncTestCase.test_stdout_with_capture_output_argc          	   C   sj   t  ¡ }|  |j¡ | jtdd}| jdd|d}W d Q R X |  d|jj	d ¡ |  d|jj	d ¡ d S )	NzAExpected ValueError when stderr and capture_output args supplied.)r   zprint('will not be run')T)rs  r   r   r   rs  )
rM   rN   rO   r0   r;   rV   rg  rF   rA   r"   )r	   rR   rC   rG   r
   r
   r   Ú#test_stderr_with_capture_output_arg×  s    z3RunFuncTestCase.test_stderr_with_capture_output_argN)r   r   r   rg  rj  rl  rm  rn  ro  rp  rS   rU   rY   r[   rr  rt  ru  rv  r
   r
   r
   r   rd  e  s   rd  zPOSIX specific testsc                   sH  e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ ZG dd„ dej	ƒZ
e d¡dd„ ƒZe d¡dd„ ƒZe ej 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G d$d%„ d%ej	ƒZe ej d&¡ d'¡d(d)„ ƒZd*d+„ Ze ej d,kd-¡d.d/„ ƒZ!d0d1„ Z"d2d3„ Z#d4d5„ Z$d6d7„ Z%d8d9„ Z&d:d;„ Z'd<d=„ Z(e ej  )d>¡d?¡d@dA„ ƒZ*dBdC„ Z+dDdE„ Z,dFdG„ Z-dHdI„ Z.dJdK„ Z/dLdM„ Z0dNdO„ Z1dPdQ„ Z2dRdS„ Z3dTdU„ Z4dVdW„ Z5dXdY„ Z6dZd[„ Z7d\d]„ Z8d^d_„ Z9d`da„ Z:dbdc„ Z;ddde„ Z<dfdg„ Z=dhdi„ Z>djdk„ Z?dldm„ Z@dndo„ ZAdpdq„ ZBdrds„ ZCdtdu„ ZDdvdw„ ZEdxdy„ ZFe ej  )dz¡one Gd{¡jHe Gd|¡jHkd}¡d~d„ ƒZIeJ Kd€d¡d‚dƒ„ ƒZLd„d…„ ZMd†d‡„ ZNdˆd‰„ ZOdŠd‹„ ZPdŒd„ ZQdŽd„ ZRdd‘„ ZSd’d“„ ZTd”d•„ ZUd–d—„ ZVeJjWd˜d™„ ƒZXeJjWdšd›„ ƒZYdœd„ ZZdždŸ„ Z[d d¡„ Z\d¢d£„ Z]e ^e_d¤k	o2e`e_d¥ƒd¦¡d§d¨„ ƒZa‡  ZbS )©ÚPOSIXProcessTestCasec                s   t ƒ  ¡  d| _d S )Nz/_this/pa.th/does/not/exist)Úsuperr   Ú_nonexistent_dir)r	   )Ú	__class__r
   r   r   ç  s    
zPOSIXProcessTestCase.setUpc          
   C   sd   yt  | j¡ W n> tk
rN } z |}| jdt| jƒ 7  _W d d }~X Y nX |  d| j ¡ |S )Nz: z,chdir to nonexistent directory %s succeeded.)r`   Úchdirry  rý   ÚstrerrorÚreprrW   )r	   r  Údesired_exceptionr
   r
   r   Ú_get_chdir_exceptionë  s    *
z)POSIXProcessTestCase._get_chdir_exceptionc          
   C   sz   |   ¡ }ytjtjddg| jd}W nB tk
rf } z$|  |j|j¡ |  |j	|j	¡ W dd}~X Y nX |  
d| ¡ dS )z;Test error in the child raised in the parent for a bad cwd.z-cr   )rƒ   NzExpected OSError: %s)r  r   r)   r*   r+   ry  rý   r   rþ   r|  rW   )r	   r~  r1   r  r
   r
   r   Útest_exception_cwdù  s    "z'POSIXProcessTestCase.test_exception_cwdc          
   C   sz   |   ¡ }ytjtjddg| jd}W nB tk
rf } z$|  |j|j¡ |  |j	|j	¡ W dd}~X Y nX |  
d| ¡ dS )zBTest error in the child raised in the parent for a bad executable.z-cr   )r+   NzExpected OSError: %s)r  r   r)   r*   r+   ry  rý   r   rþ   r|  rW   )r	   r~  r1   r  r
   r
   r   Útest_exception_bad_executable  s    "z2POSIXProcessTestCase.test_exception_bad_executablec          
   C   st   |   ¡ }yt | jddg¡}W nB tk
r` } z$|  |j|j¡ |  |j|j¡ W dd}~X Y nX |  d| ¡ dS )z?Test error in the child raised in the parent for a bad args[0].z-cr   NzExpected OSError: %s)	r  r   r)   ry  rý   r   rþ   r|  rW   )r	   r~  r1   r  r
   r
   r   Útest_exception_bad_args_0  s    "z.POSIXProcessTestCase.test_exception_bad_args_0c               @   s   e Zd Zdd„ ZdS )z&POSIXProcessTestCase.PopenNoDestructorc             C   s   d S )Nr
   )r	   r
   r
   r   Ú__del__*  s    z.POSIXProcessTestCase.PopenNoDestructor.__del__N)r   r   r   rƒ  r
   r
   r
   r   ÚPopenNoDestructor)  s   r„  z%subprocess._posixsubprocess.fork_execc          
   C   sN   dd„ }||_ tjdtd( |  t¡ |  dg¡ W dQ R X W dQ R X dS )z>Test error passing done through errpipe_write in the good casec              W   s0   | d }d  tj¡ ¡ }t |d| d ¡ dS )Né   z{:x}s   OSError:ó   :r   )rñ   rþ   ÚEISDIRrÌ   r`   rP   )r"   Úerrpipe_writeZerr_coder
   r
   r   Úproper_error0  s    zHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_errorzsubprocess.os.waitpid)Úside_effectÚnon_existent_commandN)rŠ  r   ÚpatchÚChildProcessErrorr;   ÚIsADirectoryErrorr„  )r	   Ú	fork_execr‰  r
   r
   r   Útest_exception_errpipe_normal-  s    
z2POSIXProcessTestCase.test_exception_errpipe_normalc          
      sn   d‰ ‡ fdd„}||_ tjdtd* |  tj¡}|  dg¡ W dQ R X W dQ R X |  t	ˆ ƒt
|jƒ¡ dS )zZTest error passing done through errpipe_write where its not
        in the expected formats   ÿ Þ­c                 s   | d }t  |ˆ ¡ dS )Nr…  r   )r`   rP   )r"   rˆ  )Ú
error_datar
   r   Ú	bad_errorC  s    zGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_errorzsubprocess.os.waitpid)rŠ  r‹  N)rŠ  r   rŒ  r  r;   r   ÚSubprocessErrorr„  rF   r}  r  rA   )r	   r  r’  r  r
   )r‘  r   Útest_exception_errpipe_bad_data>  s    
 z4POSIXProcessTestCase.test_exception_errpipe_bad_dataz/proc/self/statuszneed /proc/self/statusc             C   s†   t jddgdd}x*| ¡ D ]}| d¡r|}P qW |  d¡ t jddgdd}x | ¡ D ]}| d¡rZ|}P qZW | j||dd	 d S )
NÚcatz/proc/self/statusF)Úrestore_signalss   SigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.)r   )r   rE   Ú
splitlinesr·   r   ÚassertNotEqual)r	   Zdefault_proc_statusr  Zdefault_sig_ign_maskZrestored_proc_statusZrestored_sig_ign_maskr
   r
   r   Útest_restore_signalsT  s"    


z)POSIXProcessTestCase.test_restore_signalsc          
   C   sr   yt jtjddgdd}W n0 tk
rJ } z|jtjkr:‚ W d d }~X Y n$X t t 	¡ ¡}t
|ƒ}|  ||¡ d S )Nz-cz)import os; print(os.getpgid(os.getpid()))T)Ústart_new_session)r   rE   r*   r+   rý   rþ   ÚEPERMr`   ÚgetpgidrP  Úintr˜  )r	   rG   r  Zparent_pgidZ
child_pgidr
   r
   r   Útest_start_new_sessionl  s    z+POSIXProcessTestCase.test_start_new_sessionc          	   C   sD   t  ¡   t tjddg¡}| ¡  W d Q R X |  |j t	j
¡ d S )Nz-czimport os; os.abort())r   r  r   r)   r*   r+   r   r   rB   rJ  ÚSIGABRT)r	   r1   r
   r
   r   Útest_run_abort}  s
    

z#POSIXProcessTestCase.test_run_abortc             C   sN   t  ttjƒ d¡}t|ƒ}|  d| ¡ ¡ |  d|¡ |  ttjƒ|¡ d S )Nzfake cmdrJ  ZSIG)r   r@   r  rJ  rŸ  r  rF   Úlower)r	   rr   Úerror_stringr
   r
   r   Ú"test_CalledProcessError_str_signal…  s
    z7POSIXProcessTestCase.test_CalledProcessError_str_signalc             C   s$   t  dd¡}t|ƒ}|  d|¡ d S )NiÁKiÿzfake cmdzunknown signal 9876543.)r   r@   r  rF   )r	   rr   r¢  r
   r
   r   Ú*test_CalledProcessError_str_unknown_signal  s    z?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalc             C   s$   t  dd¡}t|ƒ}|  d|¡ d S )Né   zfake cmdznon-zero exit status 2.)r   r@   r  rF   )r	   rr   r¢  r
   r
   r   Ú$test_CalledProcessError_str_non_zero•  s    z9POSIXProcessTestCase.test_CalledProcessError_str_non_zeroc          	   C   sD   t jtjddgt jdd„ d}| |  |j ¡ d¡ W d Q R X d S )Nz-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT"))c               S   s   t  dd¡S )Nr]   Úapple)r`   Úputenvr
   r
   r
   r   Ú<lambda>¡  r©   z3POSIXProcessTestCase.test_preexec.<locals>.<lambda>)r(   Ú
preexec_fns   apple)r   r)   r*   r+   r,   r   r(   r‰   )r	   r1   r
   r
   r   Útest_preexecš  s    
z!POSIXProcessTestCase.test_preexecc          
   C   s–   dd„ }yt jtjddg|d}W nd t jk
rT } z|  t jd¡ W d d }~X Y n> tk
r† } z|  d|j	d ¡ W d d }~X Y nX |  
d	¡ d S )
Nc               S   s   t dƒ‚d S )Nz'What if two swallows carried a coconut?)rV   r
   r
   r
   r   Úraise_it¦  s    z=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itz-cr   )rª  z)Expected a ValueError from the preexec_fnZcoconutr   zEException raised by preexec_fn did not make it to the parent process.)r   r)   r*   r+   r“  rÑ   Ú_posixsubprocessrV   rF   r"   rW   )r	   r¬  r1   r  r
   r
   r   Útest_preexec_exception¥  s    $z+POSIXProcessTestCase.test_preexec_exceptionc               @   s    e Zd ZdZdd„ Zdd„ ZdS )z+POSIXProcessTestCase._TestExecuteChildPopenz3Used to test behavior at the end of _execute_child.c             O   s   || _ tjj| f|ž|Ž d S )N)Ú	_testcaser   r)   rg   )r	   Útestcaser"   r#   r
   r
   r   rg   ·  s    z4POSIXProcessTestCase._TestExecuteChildPopen.__init__c             O   sŠ   zt jj| f|ž|Ž W d dd„ tdƒD ƒ}z<x6|D ].}| jj|| j ¡ | j ¡ | j	 ¡ fdd q4W W d x|D ]}t
 |¡ qpW X X d S )Nc             S   s   g | ]}t  d t j¡‘qS )z	/dev/zero)r`   rú   ÚO_RDONLY)rº   rÏ   r
   r
   r   r¼   Â  s   zNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>é   z!At least one fd was closed early.)r   )r   r)   r$   r÷   r¯  ÚassertNotInr'   rž   r(   r   r`   r0   )r	   r"   r#   Zdevzero_fdsr2  r
   r
   r   r$   »  s    


z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)r   r   r   r%   rg   r$   r
   r
   r
   r   Ú_TestExecuteChildPopenµ  s   r´  z	/dev/zeroz/dev/zero required.c          	   C   sH   dd„ }|   tj¡* | j| tjddgtjtjtj|d W dQ R X dS )z6Issue16140: Don't double close pipes on preexec error.c               S   s   t  d¡‚d S )Nz-force the _execute_child() errpipe_data path.)r   r“  r
   r
   r
   r   r¬  Ò  s    zWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_itz-crÁ   )r'   r(   r   rª  N)r;   r   r“  r´  r*   r+   r,   )r	   r¬  r
   r
   r   Ú0test_preexec_errpipe_does_not_double_close_pipesÎ  s    zEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipesc             C   s  dd„ }t  ¡ }t j}t j}zÎt  ¡  |  t  ¡ ¡ tjtjddgdd„ d |  t  ¡ d¡ t  ¡  |  	t  ¡ ¡ tjtjddgd	d„ d |  	t  ¡ d
¡ |t _| j
ttjtjddgdd„ d t `| j
ttjtjddgdd„ d W d |t _|t _|st  ¡  X d S )Nc               S   s   t dƒ‚d S )Nzthis shouldn't escape)ÚRuntimeErrorr
   r
   r
   r   Úraise_runtime_errorß  s    zPPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.raise_runtime_errorz-cr   c               S   s   d S )Nr
   r
   r
   r
   r   r©  è  r©   zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>)rª  z#Popen enabled gc when it shouldn't.c               S   s   d S )Nr
   r
   r
   r
   r   r©  ï  r©   zPopen left gc disabled.c               S   s   d S )Nr
   r
   r
   r
   r   r©  õ  r©   c               S   s   d S )Nr
   r
   r
   r
   r   r©  ú  r©   )ÚgcÚ	isenabledÚdisabler   r   r7   r*   r+   ÚenablerÑ   r;   r¶  r)   r!  )r	   r·  ÚenabledZorig_gc_disableZorig_gc_isenabledr
   r
   r   Útest_preexec_gc_module_failureÜ  s8    




z3POSIXProcessTestCase.test_preexec_gc_module_failureÚdarwinz!setrlimit() seems to fail on OS Xc          
   C   s´   yddl m}m}m} W n, tk
rD } z|  |¡ W d d }~X Y nX ||ƒ}|\}}||d|fƒ |  |||¡ ytjt	j
ddgdd„ d W n tk
r¤   Y nX |  d¡ d S )	Nr   )Ú	getrlimitÚ	setrlimitÚRLIMIT_NPROCz-cr   c               S   s   d S )Nr
   r
   r
   r
   r   r©    r©   z@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>)rª  z.RLIMIT_NPROC had no effect; probably superuser)Úresourcer¿  rÀ  rÁ  r"  r   rO   r   r7   r*   r+   ÚBlockingIOError)r	   r¿  rÀ  rÁ  rr   ÚlimitsrÏ   Úhardr
   r
   r   Útest_preexec_fork_failure  s    z.POSIXProcessTestCase.test_preexec_fork_failurec          	   C   s€   t  ¡ \}}t|ddd&}| dtj ¡ | dtj ¡ W d Q R X t 	|d¡ t
 |¡}| ¡  t |¡ |  |jd¡ d S )NÚwrî   )rð   z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
iÀ  r6   )rM   r=  rú   rP   r   Ú
unix_shellr*   r+   r`   Úchmodr   r)   r   r>  r   rB   )r	   r2  ÚfnameÚfobjr1   r
   r
   r   Útest_args_string  s    

z%POSIXProcessTestCase.test_args_stringc             C   s<   | j ttjtjddgdd | j ttjtjddgdd d S )Nz-czimport sys; sys.exit(47)r6   )Ústartupinfo)Úcreationflags)r;   rV   r   r7   r*   r+   )r	   r
   r
   r   rl   %  s    

z&POSIXProcessTestCase.test_invalid_argsc          	   C   sT   t j ¡ }d|d< tjdgdtj|d}| |  |j ¡  	d¡d¡ W d Q R X d S )Nr§  r]   zecho $FRUITr_   )r   r(   r^   s    	
s   apple)
r`   ra   rb   r   r)   r,   r   r(   r‰   r   )r	   rc   r1   r
   r
   r   Útest_shell_sequence0  s    

z(POSIXProcessTestCase.test_shell_sequencec          	   C   sR   t j ¡ }d|d< tjddtj|d}| |  |j ¡  	d¡d¡ W d Q R X d S )Nr§  r]   zecho $FRUITr_   )r   r(   r^   s    	
s   apple)
r`   ra   rb   r   r)   r,   r   r(   r‰   r   )r	   rc   r1   r
   r
   r   Útest_shell_string:  s    
z&POSIXProcessTestCase.test_shell_stringc          	   C   sv   t  ¡ \}}t|ddd&}| dtj ¡ | dtj ¡ W d Q R X t 	|d¡ t
 |¡}t |¡ |  |d¡ d S )NrÇ  rî   )rð   z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
iÀ  r6   )rM   r=  rú   rP   r   rÈ  r*   r+   r`   rÉ  r   r7   r>  r   )r	   r2  rÊ  rË  r8   r
   r
   r   Útest_call_stringD  s    

z%POSIXProcessTestCase.test_call_stringc          
   C   sÊ   g }x>dD ]6}x0dD ](}t j ||¡}t j |¡r| |¡ qW q
W |sR|  d¡ d}t j |¡rxt j |¡sx| |¡ xL|D ]D}tjd|dtj	d}|" |  
|j ¡  ¡ t|dƒ¡ W d Q R X q~W d S )	N)z/binz	/usr/bin/z/usr/local/bin)ZbashZkshz"bash or ksh required for this testz/bin/shzecho $0T)r+   r   r(   r:  )r`   rx   ry   Úisfilerù   r   Úislinkr   r)   r,   r   r(   r‰   r   Úbytes)r	   Zshellsr\  ÚnameÚshr1   r
   r
   r   Útest_specific_shellQ  s     






z(POSIXProcessTestCase.test_specific_shellc          
   G   sf   t   t jt j¡}z&tjtjddgdtjtjtjd}W d t   t j|¡ X |j 	d¡ t
||ƒ|Ž  |S )Nz-czöif 1:
                                 import sys, time
                                 sys.stdout.write('x\n')
                                 sys.stdout.flush()
                                 time.sleep(30)
                                 T)Ú	close_fdsr'   r(   r   r_   )rJ  ÚSIGINTÚdefault_int_handlerr   r)   r*   r+   r,   r(   r‰   Úgetattr)r	   Úmethodr"   rK  r1   r
   r
   r   Ú_kill_processe  s    
z"POSIXProcessTestCase._kill_process)ZnetbsdZopenbsdz"Due to known OS bug (issue #16762)c             G   sR   t jtjddgdt jt jt jd}|j d¡ t d¡ t	||ƒ|Ž  | 
¡  d S )Nz-cz¶if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             T)rØ  r'   r(   r   r_   )r   r)   r*   r+   r,   r(   r‰   r'  r(  rÛ  rn   )r	   rÜ  r"   r1   r
   r
   r   Ú_kill_dead_process~  s    


z'POSIXProcessTestCase._kill_dead_processc             C   s:   |   dtj¡}| ¡ \}}|  d|¡ |  | ¡ d¡ d S )NÚsend_signals   KeyboardInterruptr   )rÝ  rJ  rÙ  rn   rF   r˜  r   )r	   r1   rÏ   r   r
   r
   r   Útest_send_signal•  s    z%POSIXProcessTestCase.test_send_signalc             C   s:   |   d¡}| ¡ \}}|  |d¡ |  | ¡ tj ¡ d S )Nr4  r©   )rÝ  rn   r   r   r   rJ  ÚSIGKILL)r	   r1   rÏ   r   r
   r
   r   Ú	test_kill›  s    
zPOSIXProcessTestCase.test_killc             C   s:   |   d¡}| ¡ \}}|  |d¡ |  | ¡ tj ¡ d S )NÚ	terminater©   )rÝ  rn   r   r   r   rJ  ÚSIGTERM)r	   r1   rÏ   r   r
   r
   r   Útest_terminate¡  s    
z#POSIXProcessTestCase.test_terminatec             C   s   |   dtj¡ d S )Nrß  )rÞ  rJ  rÙ  )r	   r
   r
   r   Útest_send_signal_dead§  s    z*POSIXProcessTestCase.test_send_signal_deadc             C   s   |   d¡ d S )Nr4  )rÞ  )r	   r
   r
   r   Útest_kill_dead«  s    z#POSIXProcessTestCase.test_kill_deadc             C   s   |   d¡ d S )Nrã  )rÞ  )r	   r
   r
   r   Útest_terminate_dead¯  s    z(POSIXProcessTestCase.test_terminate_deadc             C   s:   g }x0|D ](}t  |¡}t  |¡}| |||f¡ q
W |S )N)r`   Úget_inheritableÚduprù   )r	   Zsave_fdsr)  r2  ÚinheritableÚsavedr
   r
   r   Ú	_save_fds³  s    


zPOSIXProcessTestCase._save_fdsc             C   s2   x,|D ]$\}}}t j|||d t  |¡ qW d S )N)rë  )r`   Údup2r0   )r	   r)  r2  rì  rë  r
   r
   r   Ú_restore_fds»  s    z!POSIXProcessTestCase._restore_fdsc       	   	   C   sž   d}|   |¡}x |D ]\}}}|dkr|}P qW z\x|D ]}t |¡ q8W tjtjddg|tjtjd ¡ \}}t	 
|¡}|  ||fd¡ W d |  |¡ X d S )Nr   z-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange"))r'   r(   r   )s   apples   orange)rí  r`   r0   r   r)   r*   r+   r,   rn   r   r   r   rï  )	r	   r)  r'   Ú	saved_fdsr2  rì  rë  rq   rr   r
   r
   r   Úcheck_close_std_fdsÀ  s"    



z(POSIXProcessTestCase.check_close_std_fdsc             C   s   |   dg¡ d S )Nr   )rñ  )r	   r
   r
   r   Útest_close_fd_0Ù  s    z$POSIXProcessTestCase.test_close_fd_0c             C   s   |   dg¡ d S )Nr_   )rñ  )r	   r
   r
   r   Útest_close_fd_1Ü  s    z$POSIXProcessTestCase.test_close_fd_1c             C   s   |   dg¡ d S )Nr¥  )rñ  )r	   r
   r
   r   Útest_close_fd_2ß  s    z$POSIXProcessTestCase.test_close_fd_2c             C   s   |   ddg¡ d S )Nr   r_   )rñ  )r	   r
   r
   r   Útest_close_fds_0_1â  s    z'POSIXProcessTestCase.test_close_fds_0_1c             C   s   |   ddg¡ d S )Nr   r¥  )rñ  )r	   r
   r
   r   Útest_close_fds_0_2å  s    z'POSIXProcessTestCase.test_close_fds_0_2c             C   s   |   ddg¡ d S )Nr_   r¥  )rñ  )r	   r
   r
   r   Útest_close_fds_1_2è  s    z'POSIXProcessTestCase.test_close_fds_1_2c             C   s   |   dddg¡ d S )Nr   r_   r¥  )rñ  )r	   r
   r
   r   Útest_close_fds_0_1_2ë  s    z)POSIXProcessTestCase.test_close_fds_0_1_2c          
   C   sv   t  d¡}t  d¡}z.t  d¡ t  d¡ t tjddg¡ ¡  W dt  |d¡ t  |d¡ t  |¡ t  |¡ X dS )z=Issue #15798: Popen should work when stdio fds are available.r   r_   z-cz*print('AssertionError:0:CLOEXEC failure.')N)	r`   rê  r0   r   r)   r*   r+   r   rî  )r	   Z	new_stdinZ
new_stdoutr
   r
   r   Útest_small_errpipe_write_fdð  s    




z0POSIXProcessTestCase.test_small_errpipe_write_fdc       
   
   C   sP  dd„ t dƒD ƒ}zdd„ |D ƒ}x|D ]\}}t |¡ q*W t |d d¡ t |d dd¡ |  t dƒ¡}zTx t|ƒD ]\}}t ||¡ q|W tj	t
jdd	g|d |d
 |d d}| ¡  W d |  |¡ X x|D ]}t |dd¡ qØW t |d
 d¡}t t |d d¡¡}	|  |d¡ |  |	d¡ W d x|D ]}t |¡ q6W X d S )Nc             S   s   g | ]}t  ¡ ‘qS r
   )rM   r=  )rº   r  r
   r
   r   r¼     s    z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rZ   c             S   s   g | ]\}}|‘qS r
   r
   )rº   r2  rÊ  r
   r
   r   r¼   	  s    r_   s   STDINr   z-czZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")r¥  )r'   r(   r   i   s	   got STDINs   err)r÷   r`   ÚunlinkrP   rŸ   rí  Ú	enumeraterî  r   r)   r*   r+   r   rï  r‰   r   r   r   r0   )
r	   ÚtempsÚtemp_fdsr2  rÊ  rð  Útemp_fdr1   rq   rr   r
   r
   r   Útest_remapping_std_fds  s4    


z+POSIXProcessTestCase.test_remapping_std_fdsc          
   C   s2  dd„ t dƒD ƒ}dd„ |D ƒ}zðx|D ]\}}t |¡ q(W |  t dƒ¡}zœx t|ƒD ]\}}	t |	|¡ qXW t |d¡ t |dd¡ tj	t
jddg|||d	}
|
 ¡  x|D ]}t |dd¡ q²W t |d
¡}t t |d
¡¡}W d |  |¡ X |  |d¡ |  |d¡ W d x|D ]}t |¡ qW X d S )Nc             S   s   g | ]}t  ¡ ‘qS r
   )rM   r=  )rº   r  r
   r
   r   r¼   4  s    z7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rZ   c             S   s   g | ]\}}|‘qS r
   r
   )rº   r2  rÊ  r
   r
   r   r¼   5  s    s   STDINr   z-czZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err"))r'   r(   r   i   s	   got STDINs   err)r÷   r`   rú  rí  rû  rî  rP   rŸ   r   r)   r*   r+   r   r‰   r   r   rï  r   r0   )r	   Zstdin_noZ	stdout_noZ	stderr_norü  rý  r2  rÊ  rð  rþ  r1   rq   rr   r
   r
   r   Úcheck_swap_fds2  s4    


z#POSIXProcessTestCase.check_swap_fdsc             C   sX   |   ddd¡ |   ddd¡ |   ddd¡ |   ddd¡ |   ddd¡ |   ddd¡ d S )Nr   r_   r¥  )r   )r	   r
   r
   r   Útest_swap_fdsb  s    z"POSIXProcessTestCase.test_swap_fdsc             C   sx  |   tdƒ¡}zVx0|D ](}t ¡ }t | ¡ |¡ W d Q R X qW ttdƒƒt|ƒ  ¡ }t 	|¡ dddg}i }x"t
||ƒD ]\}}	||||	 < q€W t d¡}
ttdƒƒt|ƒ  ¡ }tjtjd|
t|ƒgf|Ž}|  |d¡ x€t
||ƒD ]r\}}	t |dtj¡ t |d¡}ttt| d	¡ƒƒ}t d
|› d|› d|› d|› d|	› d¡}|  |	g||¡ qîW W d |  |¡ X d S )NrZ   r'   r(   r   zå
                import os, sys
                skipped_fd = int(sys.argv[1])
                for fd in range(3):
                    if fd != skipped_fd:
                        os.write(fd, str(fd).encode('ascii'))
            z-cr   i   r:  z"
                    When testing z to z4 redirection,
                    parent descriptor z5 got redirected
                    to descriptor(s) z instead of descriptor z.
                )rí  r÷   rM   rN   r`   rî  rž   Úsetr  r0   Úziprä   rå   r   r7   r*   r+   r  r   rŸ   ÚSEEK_SETr‰   r¾   Úmapr  rŠ   rï  )r	   Úfrom_fdsÚto_fdsrð  Zfrom_fdÚfZfd_to_closeÚ	arg_namesr#   Zto_fdrp   Z
skipped_fdr8   Ú
read_bytesZread_fdsr   r
   r
   r   Ú#_check_swap_std_fds_with_one_closedj  s2    



&z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedc             C   sD   x>t  tdƒd¡D ]*}x$t  tdƒd¡D ]}|  ||¡ q(W qW d S )NrZ   r¥  )Ú	itertoolsÚcombinationsr÷   Úpermutationsr  )r	   r  r  r
   r
   r   Ú!test_swap_std_fds_with_one_closed–  s    z6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc          
   C   s®   dd„ }yt jtjddg|d W n| tk
r` } z |  t j¡ |  t|ƒd¡ W d d }~X Y nJ t j	k
rž } z |  
t j¡ |  t|ƒd¡ W d d }~X Y nX |  d¡ d S )	Nc               S   s   t dƒ‚d S )Nu   surrogate:í³¿)rV   r
   r
   r
   r   Úprepareœ  s    zCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparez-crÁ   )rª  u   surrogate:í³¿z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)r   r7   r*   r+   rV   r  r­  r   r  r“  ÚassertIsNotNonerW   )r	   r  rr   r
   r
   r   Útest_surrogates_error_message›  s    
 "z2POSIXProcessTestCase.test_surrogates_error_messagec             C   sâ   xÜdD ]Ô\}}|  dd¡}dt|ƒ }tj ¡ }|||< d|d< |}tjtjd|g|d}| 	d	¡}|  
| d¡t|ƒ¡ |  dd¡}d
t|ƒ }tj ¡ }|||< tjtjd|g|d}| 	d	¡}|  
| d¡t|ƒ¡ qW d S )N))Útestu   abcí³¿)u   testí³¿Ú42r:  rî   z&import os; print(ascii(os.getenv(%s)))ÚCÚLC_ALLz-c)r^   s   
z'import os; print(ascii(os.getenvb(%s))))rÌ   r}  r`   ra   rb   r   rE   r*   r+   ro   r   rŠ   r:  )r	   ÚkeyÚvalueÚencoded_valueÚscriptr^   Zdecoded_valuer(   r
   r
   r   Útest_undecodable_env®  s*    





z)POSIXProcessTestCase.test_undecodable_envc             C   sØ   t  tj¡}t j tj¡\}}t  |¡}t |ddg¡}|  |d¡ d| d }tj|dd}|  |d¡ t j	 
¡ }||d< tj|ddg|d	}|  |d¡ t j 
¡ }t  |¡|d
< tj|ddg|d	}|  |d¡ d S )Nz-crÁ   r   ó   's	   ' -c passT)r   ÚPATH)r^   s   PATH)r`   Úfsencoder*   r+   rx   r†   r   r7   r   ra   rb   Úenvironb)r	   Zabs_programrx   ÚprogramÚexitcoderÂ   r^   Zenvbr
   r
   r   Útest_bytes_programË  s     


z'POSIXProcessTestCase.test_bytes_programc       	      C   sÂ   t jddd}t jddd}tjtj|gtjtjtjdd}|  |jd¡ tjtj|gtjdd}| ¡ \}}t	t
t| d	¡ƒƒ}t	|j ¡ |j ¡ |j ¡ gƒ}|  ||@ d
|||@ f ¡ d S )Nzinput_reader.pyÚsubprocessdata)Úsubdirzfd_status.pyF)r'   r(   r   rØ  r©   )r(   rØ  ó   ,z5Expected no fds from %r to be open in child, found %r)r   Úfindfiler   r)   r*   r+   r,   rO   rn   r  r  r  r†   r'   rž   r(   r   r   )	r	   ZsleeperÚ	fd_statusÚp1Úp2rG   ÚerrorZ
result_fdsZunwanted_fdsr
   r
   r   Útest_pipe_cloexecå  s    
z&POSIXProcessTestCase.test_pipe_cloexecc       
         s  t jddd}t jddd}d}|d d }tjtj|gtjtjdd	‰ tjtj||gˆ jtjdd	‰|  ˆ j	¡ |  ˆj	¡ ‡ fd
d„}‡fdd„}|  |¡ |  |¡ ˆ j
 |¡ ˆ j
 ¡  t ˆjgg g d¡\}}}	|  |d¡ |  ˆj ¡ |¡ ˆ j ¡  ˆj ¡  d S )Nzqcat.pyr#  )r$  zqgrep.pys   zxcvbné   ó   
F)r'   r(   rØ  c                  s&   yˆ   ¡  W n tk
r    Y nX d S )N)rã  ÚProcessLookupErrorr
   )r(  r
   r   Úkill_p1	  s    zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1c                  s&   yˆ   ¡  W n tk
r    Y nX d S )N)rã  r.  r
   )r)  r
   r   Úkill_p2	  s    zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2ró   zThe child hung)r   r&  r   r)   r*   r+   r,   r(   rO   r   r'   rP   r0   ÚselectrÑ   r   r‰   )
r	   ZqcatZqgrepZsubdatar  r/  r0  Z	readfilesZignored1Zignored2r
   )r(  r)  r   Útest_pipe_cloexec_real_toolsü  s.    



z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc       
         s°  t jddd}t ¡ }|  tj|d ¡ |  tj|d ¡ t|ƒ‰ x8tdƒD ],}t tj	tj
¡}|  tj|¡ ˆ  |¡ qLW xˆ D ]}t |d¡ q‚W tjtj|gtjdd	}| ¡ \}}ttt| d
¡ƒƒ}|  |ˆ @ ˆ d¡ tjtj|gtjdd	}| ¡ \}}ttt| d
¡ƒƒ}|  |ˆ @ d¡ |  d|d¡ t‡ fdd„tdƒD ƒƒ}	tjtj|gtjd|	d}| ¡ \}}ttt| d
¡ƒƒ}|  ||	 ˆ @ d¡ |  d|d¡ d S )Nzfd_status.pyr#  )r$  r   r_   é	   TF)r(   rØ  r%  zSome fds were closedzSome fds were left openzSubprocess failedc             3   s   | ]}ˆ   ¡ V  qd S )N)r  )rº   rÏ   )r*  r
   r   ú	<genexpr>I	  s    z6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>r²  )r(   rØ  Úpass_fdsz'Some fds not in pass_fds were left open)r   r&  r`   r×   rO   r0   r  r÷   rú   Údevnullr±  ÚaddÚset_inheritabler   r)   r*   r+   r,   rn   r  r  r†   r   r   rF   )
r	   r'  r)  rÏ   r2  r1   rG   ÚignoredÚremaining_fdsÚfds_to_keepr
   )r*  r   Útest_close_fds%	  sB    

z#POSIXProcessTestCase.test_close_fdsÚfreebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.c             C   sª   t jddd}tjtjdt d| ¡gtjd}| 	¡ \}}| 
¡ }| jt|ƒdd| d	 ttt|d
  ¡  d¡ƒƒ}ttt|d  ¡  d¡ƒƒ}| j||@ dd	 dS )z;Confirm that issue21618 is fixed (may fail under valgrind).zfd_status.pyr#  )r$  z-caK  
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

        # Leave a two pairs of low ones available for use by the
        # internal child error pipe and the stdout pipe.
        # We also leave 10 more open as some Python buildbots run into
        # "too many open files" errors during the test if we do not.
        for fd in sorted(open_fds)[:14]:
            os.close(fd)
            open_fds.remove(fd)

        for fd in open_fds:
            #self.addCleanup(os.close, fd)
            os.set_inheritable(fd, True)

        max_fd_open = max(open_fds)

        # Communicate the open_fds to the parent unittest.TestCase process.
        print(','.join(map(str, sorted(open_fds))))
        sys.stdout.flush()

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        )r(   r¥  z(expected exactly two lines of output:
%r)r   r   r%  r_   zSome fds were left open.N)r   r&  r   r)   r*   r+   rä   rå   r,   rn   r—  r   rÎ   r  r  r  r   r†   r   )r	   r'  r1   rG   Zunused_stderrZoutput_linesZ
opened_fdsr:  r
   r
   r   Ú%test_close_fds_when_max_fd_is_loweredU	  s    0
z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredró   rI   c          
   C   s:  t jddd}tƒ }xftdƒD ]Z}t ¡ }|  tj|d ¡ |  tj|d ¡ t |d d¡ t |d d¡ | 	|¡ qW x¸|D ]°}t
jtj|gt
jd|fd}| ¡ \}}ttt| d	¡ƒƒ}	||h }
|  ||	d
¡ |  |	|
@ d¡ |  t¡&}|  t
jtjddgd|fd¡ W d Q R X |  dt|jƒ¡ q‚W d S )Nzfd_status.pyr#  )r$  rI   r   r_   T)r(   rØ  r5  r%  zfd to be passed not passedzfd to be closed passedz-czimport sys; sys.exit(0)F)rØ  r5  zoverriding close_fds)r   r&  r  r÷   r`   r×   rO   r0   r8  Úupdater   r)   r*   r+   r,   rn   r  r  r†   rF   r   ÚassertWarnsÚRuntimeWarningr7   r  Úwarning)r	   r'  r*  rÙ   r)  r2  r1   rG   r9  r:  Zto_be_closedÚcontextr
   r
   r   Útest_pass_fds¨	  s0    




z"POSIXProcessTestCase.test_pass_fdsc       
      C   sä   t jddd}t ¡ \}}|  tj|¡ |  tj|¡ t |d¡ t |d¡ ||f}tj|g}|t	t
t|ƒƒ7 }tj|tjd|d}| ¡ \}}tt
t| d¡ƒƒ}	|  |	t|ƒd| ¡ |  t |¡d¡ |  t |¡d¡ d S )	Nzfd_status.pyr#  )r$  TF)r(   rØ  r5  r%  z	output=%a)r   r&  r`   r×   rO   r0   r8  r*   r+   r¾   r  r  r   r)   r,   rn   r  r  r†   r   ré  )
r	   r  rë  Znon_inheritabler5  r"   r1   rG   r9  r)  r
   r
   r   Útest_pass_fds_inheritableÊ	  s"    
z.POSIXProcessTestCase.test_pass_fds_inheritablec       	   	   C   sú   t jddd}g }x8tdƒD ],}t tjtj¡}|  tj|¡ | 	|¡ qW t 
¡ \}}|  tj|¡ |  tj|¡ | d|¡ tjtj|g|d |d |d d|d t |d	¡}W d
Q R X dd„ | d¡D ƒ}|  |dddht|ƒB d|›¡ d
S )z7Regression test for https://bugs.python.org/issue32270.zfd_status.pyr#  )r$  r¥  r_   r   T)r'   r(   r   rØ  r5  i   Nc             S   s   h | ]}t |ƒ’qS r
   )r  )rº   Únumr
   r
   r   ú	<setcomp>ý	  s    z@POSIXProcessTestCase.test_pass_fds_redirected.<locals>.<setcomp>r%  zoutput=)r   r&  r÷   r`   rú   r6  ÚO_RDWRrO   r0   rù   r×   Úinsertr   r)   r*   r+   r‰   r†   r   Ú	frozenset)	r	   r'  r5  rÏ   r2  Zstdout_rZstdout_wrG   r)  r
   r
   r   Útest_pass_fds_redirectedè	  s&    
z-POSIXProcessTestCase.test_pass_fds_redirectedc          	   C   s>   t  tjd¡&}tjtjddg||d}| ¡  W d Q R X d S )Nzr+z-czimport sys; sys.exit(0))r(   r'   )	r.   rú   r`   r6  r   r)   r*   r+   r   )r	   Úinoutr1   r
   r
   r   Ú%test_stdout_stdin_are_single_inout_fd
  s    
z:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdc          	   C   s>   t  tjd¡&}tjtjddg||d}| ¡  W d Q R X d S )Nzr+z-czimport sys; sys.exit(0))r(   r   )	r.   rú   r`   r6  r   r)   r*   r+   r   )r	   rL  r1   r
   r
   r   Ú&test_stdout_stderr_are_single_inout_fd
  s    
z;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdc          	   C   s>   t  tjd¡&}tjtjddg||d}| ¡  W d Q R X d S )Nzr+z-czimport sys; sys.exit(0))r   r'   )	r.   rú   r`   r6  r   r)   r*   r+   r   )r	   rL  r1   r
   r
   r   Ú%test_stderr_stdin_are_single_inout_fd
  s    
z:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdc             C   sR   t jddd}tjtj|gtjtjd}| ¡ \}}|  d|j	d| 
d¡ ¡ d S )Nzsigchild_ignore.pyr#  )r$  )r(   r   r   z6sigchild_ignore.py exited non-zero with this error:
%szutf-8)r   r&  r   r)   r*   r+   r,   rn   r   rB   rŠ   )r	   Zsigchild_ignorer1   r(   r   r
   r
   r   Útest_wait_when_sigchild_ignored
  s    z4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc          	   C   sz   t  d¡}tjtjddgtjdd}|j}|  |j	¡ z4|  
| d¡d¡ |  || |gg g d¡d ¡ W d | ¡  X d S )	Nr1  z-cz$import sys;sys.stdout.write("apple")r   )r(   r3   r,  s   applg        )r   Úimport_moduler   r)   r*   r+   r,   r(   rO   r0   r   r‰   rF   r1  r   )r	   r1  r1   r  r
   r
   r   Útest_select_unbuffered
  s    

"z+POSIXProcessTestCase.test_select_unbufferedc          	   C   s€   t jtjddgt jt jd}|  |jj¡ |  |jj¡ t	|ƒ}|j
}t dtf¡
 d }W d Q R X |  |dd„ t jD ƒ¡ d S )Nz-cz import sys, time;time.sleep(0.2))r(   r   r   c             S   s   g | ]}t |ƒ‘qS r
   )Úid)rº   Úor
   r
   r   r¼   B
  s    zEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)r   r)   r*   r+   r,   rO   r(   r0   r   rS  Úpidr   Úcheck_warningsÚResourceWarningrF   r   )r	   r1   ÚidentrU  r
   r
   r   Útest_zombie_fast_process_del0
  s    

z1POSIXProcessTestCase.test_zombie_fast_process_delc          
   C   sø   t jtjddgt jt jd}|  |jj¡ |  |jj¡ t	|ƒ}|j
}t dtf¡
 d }W d Q R X t |tj¡ |  |dd„ t jD ƒ¡ t d¡ |  t¡& t jtt jt jd}W d Q R X W d Q R X |  ttj|d¡ |  |d	d„ t jD ƒ¡ d S )
Nz-czimport time;time.sleep(3))r(   r   r   c             S   s   g | ]}t |ƒ‘qS r
   )rS  )rº   rT  r
   r
   r   r¼   X
  s    zJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>gš™™™™™É?r   c             S   s   g | ]}t |ƒ‘qS r
   )rS  )rº   rT  r
   r
   r   r¼   d
  s    )r   r)   r*   r+   r,   rO   r(   r0   r   rS  rU  r   rV  rW  r`   r4  rJ  rá  rF   r   r'  r(  r;   rý   r}   Úwaitpidr³  )r	   r1   rX  rU  r#  r
   r
   r   Ú!test_leak_fast_process_del_killedD
  s(    


z6POSIXProcessTestCase.test_leak_fast_process_del_killedc                sx   t jddd}t d¡‰ |  tjˆ ¡ tjtj	|gtj
d‡ fdd„d}| ¡ \}}ttt| d	¡ƒƒ}|  ˆ |¡ d S )
Nzfd_status.pyr#  )r$  r_   Tc                  s   t  dˆ ¡S )Nr_   )r`   rî  r
   )r2  r
   r   r©  p
  r©   zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>)r(   rØ  rª  r%  )r   r&  r`   rê  rO   r0   r   r)   r*   r+   r,   rn   r  r  r  r†   r³  )r	   r'  r1   rG   r9  r:  r
   )r2  r   Útest_close_fds_after_preexecf
  s    
z1POSIXProcessTestCase.test_close_fds_after_preexecc             C   sÈ   dd l }t ¡ }z¤dd„ }t ¡  xŽddgd dgfdgdd dgfdgdgddgfdgdgd dffD ]L\}}}}|  t¡0 | ||dd	||d
d
d
d
dddddd|¡ W d Q R X qbW W d |sÂt ¡  X d S )Nr   c               S   s   d S )Nr
   r
   r
   r
   r   r©  
  r©   z5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>é{   s   exes   envs   argTr
   éÿÿÿÿr_   r¥  rZ   r,  )r­  r¸  r¹  r»  r;   rf   r  rº  )r	   r­  Ú
gc_enabledÚfuncr"   Zexe_listrƒ   Úenv_listr
   r
   r   Útest_fork_execw
  s&    z#POSIXProcessTestCase.test_fork_execc             C   sÆ   dd l }G dd„ dƒ}t ¡ }z”t ¡  x†ddddd|d	ƒ|d
ƒffD ]f}| jtd |¡d6}| dgdgd|d dgddddd	d
ddddd ¡ W d Q R X |  dt	|j
ƒ¡ qFW W d |sÀt ¡  X d S )Nr   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadIntTc             S   s
   || _ d S )N)r  )r	   r  r
   r
   r   rg   ›
  s    zSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__c             S   s   | j rd| _ | jS t‚d S )NF)Úfirstr  rV   )r	   r
   r
   r   Ú__int__
  s    zRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)r   r   r   rc  rg   rd  r
   r
   r
   r   ÚBadInt™
  s   re  )r^  r¥  rZ   r,  rI   )r  r,  )é   é   é*   l            )rI   r,  )rÞ   é   ri  r²  r_   r¥  zfds_to_keep={})r   s   falseTs   envr^  rZ   r,  r;  )r­  r¸  r¹  r»  r;   rV   rñ   r  rF   r  rA   rº  )r	   r­  re  r_  r;  rC   r
   r
   r   Ú%test_fork_exec_sorted_fd_sanity_check•
  s0    

z:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc          
   C   sZ   t  tjddg¡}|: tj |d¡ }t|j_	| 
¡  |j ¡  W d Q R X W d Q R X d S )Nz-crÁ   r'   )r   r)   r*   r+   r   rŒ  ÚobjectÚBrokenPipeErrorr0   rŠ  rn   Úassert_called_with)r	   r#  Úmock_proc_stdinr
   r
   r   Ú,test_communicate_BrokenPipeError_stdin_close½
  s
    zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec          
   C   sh   t  tjddg¡}|H tj |d¡.}t|j_	| 
d¡ |j d¡ |j ¡  W d Q R X W d Q R X d S )Nz-crÁ   r'   s   stuff)r   r)   r*   r+   r   rŒ  rk  rl  rP   rŠ  rn   Úassert_called_once_withr0   )r	   r#  rn  r
   r
   r   Ú,test_communicate_BrokenPipeError_stdin_writeÆ
  s    
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writec             C   sˆ   t jtjdgt jt jd}|` tj |d¡F}tt	j
dƒ.}t|j_| ¡ |j_| d¡ |j ¡  W d Q R X W d Q R X W d Q R X d S )Nz-h)r'   r(   r'   Úwbs   stuff)r   r)   r*   r+   r,   r   rŒ  rk  rú   r`   r6  rl  rà   rŠ  rž   Úreturn_valuern   rp  )r	   r#  rn  Zdev_nullr
   r
   r   Ú,test_communicate_BrokenPipeError_stdin_flushÐ
  s    

zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc          
   C   sf   t jtjdgt jt jd}|> tj |d¡$}t|j	_
|jdd |j	 ¡  W d Q R X W d Q R X d S )Nz-h)r'   r(   r'   iç  )r:   )r   r)   r*   r+   r,   r   rŒ  rk  rl  r0   rŠ  rn   rp  )r	   r#  rn  r
   r
   r   Ú9test_communicate_BrokenPipeError_stdin_close_with_timeoutß
  s    
zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutNÚ
W_STOPCODEzneed _testcapi.W_STOPCODEc          	   C   sx   t jddg}t |¡}|j}t |d¡\}}|  |d¡ t 	d¡}t
jd||fd | ¡ }W dQ R X |  |d¡ dS )	zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.z-crÁ   r   rZ   zsubprocess.os.waitpid)rs  Néýÿÿÿ)r*   r+   r   r)   rU  r`   rZ  r   Ú	_testcapirv  r   rŒ  r   )r	   r"   r#  rU  ÚstatusrB   r
   r
   r   Útest_stoppedë
  s    

z!POSIXProcessTestCase.test_stopped)cr   r   r   r   r  r€  r  r‚  r   r)   r„  r   rŒ  r  r”  rY  rZ  r`   rx   r?  r™  rž  r   r£  r¤  r¦  r«  r®  r´  rµ  r½  r*   r_  rÆ  rÌ  rl   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  r  r"  r+  r2  r<  ÚstatÚst_devr>  r   Úrequires_mac_verrD  rE  rK  rM  rN  rO  rP  rR  rY  r[  r\  Úcpython_onlyrb  rj  ro  rq  rt  ru  ra  rx  rb  rz  Ú__classcell__r
   r
   )rz  r   rw  ä  s¤   %

-0,)0Q""(	
rw  zWindows specific testsc               @   sÂ   e Zd Zdd„ Zdd„ Z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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-S ).ÚWin32ProcessTestCasec             C   s6   d}d}t  ¡ }||_||_t jtjddg|d d S )Nr_   rZ   z-czimport sys; sys.exit(0))rÍ  )r   ÚSTARTUPINFOÚdwFlagsÚwShowWindowr7   r*   r+   )r	   ÚSTARTF_USESHOWWINDOWÚSW_MAXIMIZErÍ  r
   r
   r   Útest_startupinfo  s    z%Win32ProcessTestCase.test_startupinfoc             C   s0   d}d}t j||d}t jtjddg|d d S )Nr_   rZ   )r‚  rƒ  z-czimport sys; sys.exit(0))rÍ  )r   r  r7   r*   r+   )r	   ZSTARTF_USERSHOWWINDOWr…  rÍ  r
   r
   r   Útest_startupinfo_keywords  s    z.Win32ProcessTestCase.test_startupinfo_keywordsc             C   sâ   t  ¡ }t j|_t j|_xÄtdƒD ]¸}tjddg}t	t
jdƒ@}t j||t j|d}| | ¡  W d Q R X |  |jd¡ W d Q R X |  |jt j¡ |  |j¡ |  |j¡ |  |j¡ |  |jt j¡ |  |jdg i¡ q"W d S )Nr¥  z-crÁ   rÇ  )r(   r   rÍ  r   Úhandle_list)r   r  r„  r‚  ZSW_HIDErƒ  r÷   r*   r+   rú   r`   r6  r)   rK   rn   r   rB   r  Z	hStdInputZ
hStdOutputZ	hStdErrorÚlpAttributeList)r	   rÍ  rÏ   rÂ   Únullr#  r
   r
   r   Útest_startupinfo_copy!  s(    z*Win32ProcessTestCase.test_startupinfo_copyc             C   s(   d}t j d¡ tjt jd |d d S )Né   z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)")rÎ  )r*   r   rP   r   r7   r+   )r	   ÚCREATE_NEW_CONSOLEr
   r
   r   Útest_creationflags<  s
    z'Win32ProcessTestCase.test_creationflagsc             C   s$   | j ttjtjddgdd„ d d S )Nz-czimport sys; sys.exit(47)c               S   s   dS )Nr_   r
   r
   r
   r
   r   r©  I  r©   z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>)rª  )r;   rV   r   r7   r*   r+   )r	   r
   r
   r   rl   D  s    
z&Win32ProcessTestCase.test_invalid_argsc          	   C   sB   G dd„ dt ƒ}|  t¡ tjtjddg|ƒ d W d Q R X d S )Nc               @   s   e Zd ZdZdS )z4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)r   r   r   Úkeysr
   r
   r
   r   ÚBadEnvO  s   r  z-crÁ   )r^   )Údictr;   rf   r   r)   r*   r+   )r	   r  r
   r
   r   Útest_issue31471K  s    z$Win32ProcessTestCase.test_issue31471c             C   s&   t jtjddgdd}|  |d¡ d S )Nz-czimport sys; sys.exit(47)T)rØ  r6   )r   r7   r*   r+   r   )r	   r8   r
   r
   r   r<  T  s    
z#Win32ProcessTestCase.test_close_fdsc       
   	   C   sÜ  dd l }t ¡ }|  tj|d ¡ |  tj|d ¡ g }x(|D ] }t |d¡ | | |¡¡ q>W tj	t
jdd |d ¡gtjdd}| ¡ \}}|  |jd¡ t| ¡ ƒ tj	t
jdd |d ¡gtjtjdd}| ¡ \}}|  |jd¡ |  d	|¡ g }t ¡ }	d
|i|	_tj	t
jdd |d ¡gtjtj|	dd}| ¡ \}}|  |jd¡ |  d	|¡ t dtf¡d t ¡ }	d
|d d … i|	_tj	t
jdd |d ¡gtjtj|	dd}| ¡ \}}|  |jd¡ W d Q R X d S )Nr   r_   Tz-cz2import msvcrt; print(msvcrt.open_osfhandle({}, 0))F)r(   rØ  )r(   r   rØ  s   OSErrorrˆ  )r(   r   rÍ  rØ  z.*overriding close_fds)r  r`   r×   rO   r0   r8  rù   Úget_osfhandler   r)   r*   r+   rñ   r,   rn   r   rB   r  r   rF   r  r‰  r   rV  rA  )
r	   r  r)  r  r2  r1   r(   r   rˆ  rÍ  r
   r
   r   Útest_close_fds_with_stdio[  sN    







z.Win32ProcessTestCase.test_close_fds_with_stdioc             C   s(   t  ¡ }i |_t jtjddg|d d S )Nz-czimport sys; sys.exit(0))rÍ  )r   r  r‰  r7   r*   r+   )r	   rÍ  r
   r
   r   Útest_empty_attribute_listŒ  s    z.Win32ProcessTestCase.test_empty_attribute_listc             C   s,   t  ¡ }dg i|_t jtjddg|d d S )Nrˆ  z-czimport sys; sys.exit(0))rÍ  )r   r  r‰  r7   r*   r+   )r	   rÍ  r
   r
   r   Útest_empty_handle_list’  s    
z+Win32ProcessTestCase.test_empty_handle_listc          	   C   sN   t j ¡ }d|d< tjdgdtj|d}| |  d|j ¡ ¡ W d Q R X d S )NÚphysalisr]   r  r_   )r   r(   r^   s   physalis)	r`   ra   rb   r   r)   r,   rF   r(   r‰   )r	   rc   r1   r
   r
   r   rÏ  ˜  s    

z(Win32ProcessTestCase.test_shell_sequencec          	   C   sL   t j ¡ }d|d< tjddtj|d}| |  d|j ¡ ¡ W d Q R X d S )Nr—  r]   r  r_   )r   r(   r^   s   physalis)	r`   ra   rb   r   r)   r,   rF   r(   r‰   )r	   rc   r1   r
   r
   r   rÐ  ¢  s    
z&Win32ProcessTestCase.test_shell_stringc          
   C   s^   xXdD ]P}t j ¡ }d|d< tjddtj||d}| |  d|j ¡ |¡ W d Q R X qW d S )N)ÚansiÚoemr—  r]   r  r_   )r   r(   r^   ré   )	r`   ra   rb   r   r)   r,   rF   r(   r‰   )r	   Úencrc   r1   r
   r
   r   Útest_shell_encodings¬  s    

z)Win32ProcessTestCase.test_shell_encodingsc             C   s    t  tjd ¡}|  |d¡ d S )Nz -c "import sys; sys.exit(47)"r6   )r   r7   r*   r+   r   )r	   r8   r
   r
   r   rÑ  ¸  s    z%Win32ProcessTestCase.test_call_stringc          	   G   sz   t jtjddgt jt jt jd}|@ |j d¡ t||ƒ|Ž  | ¡ \}}|  	|d¡ | 
¡ }W d Q R X |  |d¡ d S )Nz-czâif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             time.sleep(30)
                             )r'   r(   r   r_   r©   r   )r   r)   r*   r+   r,   r(   r‰   rÛ  rn   r   r   r˜  )r	   rÜ  r"   r1   rÏ   r   rB   r
   r
   r   rÝ  ¾  s    

z"Win32ProcessTestCase._kill_processc          	   G   s„   t jtjddgt jt jt jd}|J |j d¡ t d¡ t	||ƒ|Ž  | 
¡ \}}|  |d¡ | ¡ }W d Q R X |  |d¡ d S )Nz-czàif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             )r'   r(   r   r_   r©   rh  )r   r)   r*   r+   r,   r(   r‰   r'  r(  rÛ  rn   r   r   r   )r	   rÜ  r"   r1   rÏ   r   r8   r
   r
   r   rÞ  Ó  s    


z'Win32ProcessTestCase._kill_dead_processc             C   s   |   dtj¡ d S )Nrß  )rÝ  rJ  rä  )r	   r
   r
   r   rà  ê  s    z%Win32ProcessTestCase.test_send_signalc             C   s   |   d¡ d S )Nr4  )rÝ  )r	   r
   r
   r   râ  í  s    zWin32ProcessTestCase.test_killc             C   s   |   d¡ d S )Nrã  )rÝ  )r	   r
   r
   r   rå  ð  s    z#Win32ProcessTestCase.test_terminatec             C   s   |   dtj¡ d S )Nrß  )rÞ  rJ  rä  )r	   r
   r
   r   ræ  ó  s    z*Win32ProcessTestCase.test_send_signal_deadc             C   s   |   d¡ d S )Nr4  )rÞ  )r	   r
   r
   r   rç  ö  s    z#Win32ProcessTestCase.test_kill_deadc             C   s   |   d¡ d S )Nrã  )rÞ  )r	   r
   r
   r   rè  ù  s    z(Win32ProcessTestCase.test_terminate_deadN)r   r   r   r†  r‡  r‹  rŽ  rl   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,   	1

r€  c               @   s^   e Zd ZG dd„ dejƒZej ejd¡dd„ ƒZ	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ ZdS )Ú	MiscTestsc                   s$   e Zd ZdZg Z‡ fdd„Z‡  ZS )zMiscTests.RecordingPopenz<A Popen that saves a reference to each instance for testing.c                s   t ƒ j||Ž | j | ¡ d S )N)rx  rg   Úinstances_createdrù   )r	   r"   r#   )rz  r
   r   rg     s    z!MiscTests.RecordingPopen.__init__)r   r   r   r%   r  rg   r  r
   r
   )rz  r   ÚRecordingPopenþ  s   rž  Ú_communicatec             K   sB  t |_ztj tjd¡ì}t |_tj td| j¡: |  t ¡$ |t	j
ddgfdtji|—Ž W dQ R X W dQ R X x4|jdd… D ]"}|  |tjddd	|j› ¡ q„W g }x(|jD ]}|tjd
dkr¶| |¡ q¶W | j|jd|jd | jt|ƒd|jd W dQ R X W d| jj ¡ }| ¡  | ¡  |  g | jj¡ X dS )a‡  Fake a SIGINT happening during Popen._communicate() and ._wait().

        This avoids the need to actually try and get test environments to send
        and receive signals reliably across platforms.  The net effect of a ^C
        happening during a blocking subprocess execution which we want to clean
        up from is a KeyboardInterrupt coming out of communicate() or wait().
        Ú_waitr)   z-czLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')r(   Nr_   )r:   z.no open-ended wait() after the first allowed: g      Ð?r¥  )r   )ÚKeyboardInterruptrŠ  r   rŒ  rk  r   r)   rž  r;   r*   r+   r®   Úcall_args_listr˜  r7   rù   ÚassertLessEqualÚ
call_countr   rÎ   r  r  r4  r   )r	   ZpopenerZmock__communicater#   Z
mock__waitr7   Zsigint_callsrN  r
   r
   r   Ú_test_keyboardinterrupt_no_kill  s4    

"

z)MiscTests._test_keyboardinterrupt_no_killc             C   s   | j tjdd d S )NgTã¥›Ä @)r:   )r¥  r   r7   )r	   r
   r
   r   Ú#test_call_keyboardinterrupt_no_kill2  s    z-MiscTests.test_call_keyboardinterrupt_no_killc             C   s   | j tjdd d S )NgTã¥›Ä @)r:   )r¥  r   re  )r	   r
   r
   r   Ú"test_run_keyboardinterrupt_no_kill5  s    z,MiscTests.test_run_keyboardinterrupt_no_killc             C   s   dd„ }|   |¡ d S )Nc           	   _   s    t j| |Ž
}t‚W d Q R X d S )N)r   r)   r¡  )r"   r#   Zunused_processr
   r
   r   Úpopen_via_context_manager9  s    z[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager)r¥  )r	   r¨  r
   r
   r   Ú.test_context_manager_keyboardinterrupt_no_kill8  s    z8MiscTests.test_context_manager_keyboardinterrupt_no_killc          	   C   s‚   |   t d¡d¡ |   t d¡d¡ d }z@t ¡ }tj |d¡}t t	rLdnd| ¡\}}|  
|d¡ W d |d k	r|t |¡ X d S )Nz
echo xyzzyÚxyzzy)r   rª  Úfooztype zcat r   )r   r   Ú	getoutputÚgetstatusoutputrM   rö   r`   rx   ry   rõ   r˜  Úrmdir)r	   ÚdirrÕ  ry  rG   r
   r
   r   Útest_getoutput>  s    zMiscTests.test_getoutputc             C   sr   ddh}t tjƒ}t ƒ }ddl}x<tj ¡ D ].\}}| d¡r@q,t||jfƒrPq,| 	|¡ q,W |  
||| ¡ dS )z*Ensure that __all__ is populated properly.r  ÚHandler   NrÏ   )r  r   Ú__all__ÚtypesÚ__dict__Úitemsr·   Ú
isinstanceÚ
ModuleTyper7  r   )r	   Zintentionally_excludedZexportedZpossible_exportsr³  rÕ  r  r
   r
   r   Útest__all__Q  s    

zMiscTests.test__all__N)r   r   r   r   r)   rž  r   rŒ  rk  r¥  r¦  r§  r©  r°  r¸  r
   r
   r
   r   rœ  ü  s   ,rœ  ÚPollSelectorz!Test needs selectors.PollSelectorc               @   s   e Zd Zdd„ Zdd„ ZdS )ÚProcessTestCaseNoPollc             C   s   t j| _tjt _t | ¡ d S )N)r   Ú_PopenSelectorÚorig_selectorÚ	selectorsÚSelectSelectorr&   r   )r	   r
   r
   r   r   c  s    zProcessTestCaseNoPoll.setUpc             C   s   | j t_t | ¡ d S )N)r¼  r   r»  r&   r   )r	   r
   r
   r   r   h  s    zProcessTestCaseNoPoll.tearDownN)r   r   r   r   r   r
   r
   r
   r   rº  `  s   rº  zWindows-specific testsc                   sP   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚCommandsWithSpacesc                s>   t ƒ  ¡  t dd¡\}}| ¡ | _t |d¡ t |¡ d S )Nz.pyzte stsV   import sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	rx  r   rM   r=  r¡  rÊ  r`   rP   r0   )r	   r  rÊ  )rz  r
   r   r   p  s
    

zCommandsWithSpaces.setUpc                s   t  | j¡ tƒ  ¡  d S )N)r`   r>  rÊ  rx  r   )r	   )rz  r
   r   r   y  s    zCommandsWithSpaces.tearDownc          	   O   sH   t j|d< t j||Ž}|$ |  |j ¡  d¡d| j ¡ W d Q R X d S )Nr(   Úmbcsz2 [%r, 'ab cd'])r   r,   r)   r   r(   r‰   rŠ   rÊ  )r	   r"   r#   r1   r
   r
   r   Úwith_spaces}  s    
zCommandsWithSpaces.with_spacesc             C   s    | j dtj| jdf dd d S )Nz"%s" "%s" "%s"zab cdr_   )r   )rÁ  r*   r+   rÊ  )r	   r
   r
   r   Útest_shell_string_with_spaces†  s    z0CommandsWithSpaces.test_shell_string_with_spacesc             C   s   | j tj| jdgdd d S )Nzab cdr_   )r   )rÁ  r*   r+   rÊ  )r	   r
   r
   r   Útest_shell_sequence_with_spaces‹  s    z2CommandsWithSpaces.test_shell_sequence_with_spacesc             C   s   |   dtj| jdf ¡ d S )Nz"%s" "%s" "%s"zab cd)rÁ  r*   r+   rÊ  )r	   r
   r
   r   Útest_noshell_string_with_spaces  s    z2CommandsWithSpaces.test_noshell_string_with_spacesc             C   s   |   tj| jdg¡ d S )Nzab cd)rÁ  r*   r+   rÊ  )r	   r
   r
   r   Ú!test_noshell_sequence_with_spaces”  s    z4CommandsWithSpaces.test_noshell_sequence_with_spaces)r   r   r   r   r   rÁ  rÂ  rÃ  rÄ  rÅ  r  r
   r
   )rz  r   r¿  m  s   		r¿  c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚContextManagerTestsc          	   C   sl   t jtjddgt jt jd*}|  |j ¡ d¡ |  |j	 ¡ d¡ W d Q R X |  
|jj¡ |  
|j	j¡ d S )Nz-czAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');)r(   r   s   stdouts   stderr)r   r)   r*   r+   r,   r   r(   r‰   r   r   rÑ   rÒ   )r	   r#  r
   r
   r   Ú	test_pipe›  s    
zContextManagerTests.test_pipec          	   C   s0   t  tjddg¡}W d Q R X |  |jd¡ d S )Nz-czimport sys; sys.exit(100)éd   )r   r)   r*   r+   r   rB   )r	   r#  r
   r
   r   rj  ¨  s    


z#ContextManagerTests.test_returncodec          	   C   s@   t jtjddgt jd}| d¡ |  |jd¡ W d Q R X d S )Nz-cz2import sys;sys.exit(sys.stdin.read() == 'context'))r'   s   contextr_   )r   r)   r*   r+   r,   rn   r   rB   )r	   r#  r
   r
   r   rÇ   ¯  s
    

z*ContextManagerTests.test_communicate_stdinc          
   C   s:   |   t¡& tjttjtjd}W d Q R X W d Q R X d S )N)r(   r   )r;   r|   r   r)   r}   r,   )r	   r#  r
   r
   r   rl   ·  s
    z%ContextManagerTests.test_invalid_argsc             C   sz   t jtjddgt jtjd d}| ¡ }|j 	dtj ¡ |  
|j¡ |  t|jddd¡ |  |jd¡ |  |jj¡ dS )z9Broken pipe error should not prevent wait() (Issue 21619)z-crÁ   r¥  )r'   r3   rB  Nr   )r   r)   r*   r+   r,   r   rØ   Ú	__enter__r'   rP   r  rB   r;   rý   Ú__exit__r   rÑ   rÒ   )r	   r#  r
   r
   r   Útest_broken_pipe_cleanup¾  s    z,ContextManagerTests.test_broken_pipe_cleanupN)r   r   r   rÇ  rj  rÇ   rl   rË  r
   r
   r
   r   rÆ  ™  s
   rÆ  Ú__main__)7rY  r   r  r   r   r*   r_  rJ  r.   r  r`   rþ   rM   r'  r½  r]  r1  r  r,  r¸  rä   Ztest.supportr   Úctypesr"  Úctypes.utilrx  ÚPGOÚSkipTestrõ   rß   r}   r’   ÚNotADirectoryErrorÚPermissionErrorr|   ÚTestCaser   Ú	Exceptionr    r)   r!   r&   rd  rZ  rw  ra  r€  rœ  rb  rº  r¿  rÆ  r   Úmainr
   r
   r
   r   Ú<module>   s˜   




                    $ }d+6
