HEX
Server: Apache
System: Linux zacp120.webway.host 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
User: govancoz (1003)
PHP: 8.3.26
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //usr/local/lib/python3.7/test/__pycache__/test_subprocess.cpython-37.opt-2.pyc
B

��g.�@sNddlZddlmZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlmZyddlZWnek
r�dZYn
XddlZyddlZWnek
�rdZYnXej�r$e�d��ejdkZe�r:dZndZd	Z e!e"e#fZ$Gd
d�dej%�Z&Gdd
�d
e'�Z(Gdd�dej)�Z*Gdd�de&�Z+Gdd�de&�Z,e�-ed�Gdd�de&��Z.e�/ed�Gdd�de&��Z0Gdd�dej%�Z1e�/e2ed�d�Gdd�de+��Z3e�/ed �Gd!d"�d"e&��Z4Gd#d$�d$e&�Z5e6d%k�rJe�7�dS)&�N)�mock)�support)�FakePathztest is not helpful for PGO�win32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);�)Znonexisting_i_hopec@s&eZdZdd�Zdd�Zddd�ZdS)	�BaseTestCasecCst��dS)N)r�
reap_children)�self�r
�0/usr/local/lib/python3.7/test/test_subprocess.py�setUp9szBaseTestCase.setUpcCsFts2xtjD]}|��qWt��|�tjd�|��t��dS)Nzsubprocess._active not empty)	�	mswindows�
subprocess�_active�waitZ_cleanup�assertFalseZ
doCleanupsrr)r	�instr
r
r�tearDown>s
zBaseTestCase.tearDownNcCs$t�|�}|��}|�|||�dS)N)r�strip_python_stderr�strip�assertEqual)r	�stderr�expected�msg�actualr
r
r�assertStderrEqualJs
zBaseTestCase.assertStderrEqual)N)�__name__�
__module__�__qualname__rrrr
r
r
rr8src@seZdZdS)�PopenTestExceptionN)rrrr
r
r
rrTsrc@seZdZdd�ZdS)�PopenExecuteChildRaisescOstd��dS)NzForced Exception for Test)r)r	�args�kwargsr
r
r�_execute_child\sz&PopenExecuteChildRaises._execute_childN)rrrr#r
r
r
rr Xsr c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Ze�ed-�d.d/��Zd0d1�Zd2d3�Zd4d5�Zd6d7�Z d8d9�Z!e�ed:�d;d<��Z"e�ed:�d=d>��Z#d?d@�Z$e�e%j&e%j'kdA�dBdC��Z(e�e%j&e%j'kdA�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=dikdj�e�e)�>dk�dlkdm�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��ZOd�d��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�edơd�dȄ�Zne�edơd�dʄ�Zod�S)��ProcessTestCasecCs�tjtjddgtjtjtjd�}z4|�|jtj�|�|j	tj�|�|j
tj�Wd|j��|j	��|j
��|��XdS)Nz-czimport sys; sys.exit(0))�stdin�stdoutr)
r�Popen�sys�
executable�PIPE�assertIsInstancer%�io�BufferedIOBaser&r�closer)r	�pr
r
r�test_io_buffered_by_defaultbs



z+ProcessTestCase.test_io_buffered_by_defaultcCs�tjtjddgtjtjtjdd�}z4|�|jtj�|�|j	tj�|�|j
tj�Wd|j��|j	��|j
��|��XdS)Nz-czimport sys; sys.exit(0)r)r%r&r�bufsize)
rr'r(r)r*r+r%r,�	RawIOBaser&rr.r)r	r/r
r
r�test_io_unbuffered_worksps


z(ProcessTestCase.test_io_unbuffered_workscCs"t�tjddg�}|�|d�dS)Nz-czimport sys; sys.exit(47)�/)r�callr(r)r)r	�rcr
r
r�
test_call_seq~s
zProcessTestCase.test_call_seqcCs"|jtjtjtjddgdd�dS)Nz-czwhile True: passg�������?)�timeout)�assertRaisesr�TimeoutExpiredr5r(r))r	r
r
r�test_call_timeout�s
z!ProcessTestCase.test_call_timeoutcCs"t�tjddg�}|�|d�dS)Nz-czimport sys; sys.exit(0)r)r�
check_callr(r)r)r	r6r
r
r�test_check_call_zero�s
z$ProcessTestCase.test_check_call_zeroc	Cs>|�tj��}t�tjddg�WdQRX|�|jjd�dS)Nz-czimport sys; sys.exit(47)r4)	r9r�CalledProcessErrorr<r(r)r�	exception�
returncode)r	�cr
r
r�test_check_call_nonzero�s
z'ProcessTestCase.test_check_call_nonzerocCs"t�tjddg�}|�d|�dS)Nz-cz
print('BDFL')sBDFL)r�check_outputr(r)�assertIn)r	�outputr
r
r�test_check_output�sz!ProcessTestCase.test_check_outputc	Cs>|�tj��}t�tjddg�WdQRX|�|jjd�dS)Nz-czimport sys; sys.exit(5)�)	r9rr>rCr(r)rr?r@)r	rAr
r
r�test_check_output_nonzero�sz)ProcessTestCase.test_check_output_nonzerocCs(tjtjddgtjd�}|�d|�dS)Nz-cz$import sys; sys.stderr.write('BDFL'))rsBDFL)rrCr(r)�STDOUTrD)r	rEr
r
r�test_check_output_stderr�s

z(ProcessTestCase.test_check_output_stderrcCsNt��}|�|j�|�d�|�d�tjtj	ddg|d�}|�
d|�dS)Nspearrz-cz6import sys; sys.stdout.write(sys.stdin.read().upper()))r%sPEAR)�tempfile�
TemporaryFile�
addCleanupr.�write�seekrrCr(r)rD)r	�tfrEr
r
r�test_check_output_stdin_arg�s

z+ProcessTestCase.test_check_output_stdin_argcCs&tjtjddgdd�}|�d|�dS)Nz-cz6import sys; sys.stdout.write(sys.stdin.read().upper())spear)�inputsPEAR)rrCr(r)rD)r	rEr
r
r�test_check_output_input_arg�s
z+ProcessTestCase.test_check_output_input_argc	CsP|�t��(}tjtjddgtjd�}|�d�WdQRX|�d|j	j
d�dS)Nz-czprint('will not be run'))r&z-Expected ValueError when stdout arg supplied.r&r)r9�
ValueErrorrrCr(r)r&�failrDr?r!)r	rArEr
r
r�test_check_output_stdout_arg�s

z,ProcessTestCase.test_check_output_stdout_argc	Cs�t��}|�|j�|�d�|�d�|�t��(}tj	t
jddg|dd�}|�d�WdQRX|�
d|jjd�|�
d	|jjd�dS)
Nspearrz-czprint('will not be run')share)r%rRz7Expected ValueError when stdin and input args supplied.r%rR)rKrLrMr.rNrOr9rTrrCr(r)rUrDr?r!)r	rPrArEr
r
r�&test_check_output_stdin_with_input_arg�s



z6ProcessTestCase.test_check_output_stdin_with_input_argc	CsL|�tj��&}tjtjddgdd�}|�d�WdQRX|�|jj	d�dS)Nz-czMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)�)r8zExpected TimeoutExpired.sBDFL)
r9rr:rCr(r)rUrr?rE)r	rArEr
r
r�test_check_output_timeout�sz)ProcessTestCase.test_check_output_timeoutcCs8tj��}d|d<tjtjddg|d�}|�|d�dS)N�banana�FRUITz-cz5import sys, os;sys.exit(os.getenv("FRUIT")=="banana"))�env�)�os�environ�copyrr5r(r)r)r	�newenvr6r
r
r�test_call_kwargs�s

z ProcessTestCase.test_call_kwargsc	Csht���F}|jttjdd�tjjjj}dg|d}|jttjf|��WdQRX|�	|�
�d�dS)Nr])Zinvalid_arg_namerr)rZcaptured_stderrr9�	TypeErrorrr'�__init__�__code__�co_argcountr�getvalue)r	�sZargcountZ
too_many_argsr
r
r�test_invalid_args�s
z!ProcessTestCase.test_invalid_argscCsRtjtjddgtjtjd�}|�|jj�|�|jj�|�	�|�
|jd�dS)Nz-czprint("banana"))r&r)rr'r(r)r*rMr&r.rrrr%)r	r/r
r
r�test_stdin_none�szProcessTestCase.test_stdin_nonecCsld}tjtjd|gtjtjd�}|�|jj�|�|jj�|�	�\}}|�
|jd|�|�
|��d�dS)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&rrstest_stdout_none)
rr'r(r)r*rMr&r.r�communicaterr@�rstrip)r	�coder/�out�errr
r
r�test_stdout_nonesz ProcessTestCase.test_stdout_nonecCsRtjtjddgtjtjd�}|�|jj�|�|jj�|�	�|�
|jd�dS)Nz-czprint("banana"))r%r&)rr'r(r)r*rMr&r.r%rrr)r	r/r
r
r�test_stderr_nonesz ProcessTestCase.test_stderr_nonecKs2|dg}tj|f|�}|��|�d|j�dS)Nzimport sys; sys.exit(47)r4)rr'rrr@)r	�pre_argsr"r!r/r
r
r�_assert_python%s
zProcessTestCase._assert_pythoncCs0tj�tj�tj�d�}|j|dgtjd�dS)N�doesnotexistz-c)r))r^�path�join�dirnamer(r)rs)r	rtr
r
r�test_executable-szProcessTestCase.test_executablecCs0tjdg}|�|�|jt|j|tdd�dS)Nz-cr)r))r(r)rsr9�NONEXISTING_ERRORS�NONEXISTING_CMD)r	rrr
r
r� test_executable_takes_precedence8s


z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs|jgtjdd�dS)NT)r)�shell)rsr(r))r	r
r
r�test_executable_replaces_shellBsz.ProcessTestCase.test_executable_replaces_shellc	Cst�|��
t��SQRXdS)N)rZ
change_cwdr^�getcwd)r	�cwdr
r
r�_normalize_cwdIszProcessTestCase._normalize_cwdcCstj�tj�}tj�|�S)N)r^ru�realpathr(r)�split)r	Zpython_pathr
r
r�_split_python_pathQsz"ProcessTestCase._split_python_pathcKsntj|ddgfdtji|��}|�|jj�|��|�d|j�t	j
j}|�||�||j���
d���dS)Nz-cz;import os, sys; sys.stdout.write(os.getcwd()); sys.exit(47)r&r4zutf-8)rr'r*rMr&r.rrr@r^ru�normcase�read�decode)r	Zexpected_cwdZ
python_argr"r/r�r
r
r�_assert_cwdWs
zProcessTestCase._assert_cwdcCs(t��}|�|�}|j|tj|d�dS)N)r)rK�
gettempdirr�r�r(r))r	�temp_dirr
r
r�test_cwdhs
zProcessTestCase.test_cwdcCs,t��}|�|�}|j|tjt|�d�dS)N)r)rKr�r�r�r(r)r)r	r�r
r
r�test_cwd_with_pathlikens
z&ProcessTestCase.test_cwd_with_pathlikez"pending resolution of issue #15533c	Csv|��\}}tj�tj|�}t���H}|�tt	j
|g�|jtt	j
|g|d�|�|�}|j|||d�WdQRXdS)N)r)
r�r^rurv�curdirr�temp_cwdr9�FileNotFoundErrorrr'r�r�)r	�
python_dir�python_base�
rel_python�	wrong_dirr
r
r�test_cwd_with_relative_argss



z*ProcessTestCase.test_cwd_with_relative_argc	Cs�|��\}}tj�tj|�}d}t���P}|jtt	j
|g|d�|jtt	j
|g||d�|�|�}|j||||d�WdQRXdS)N�somethingyoudonthave)r))r)r)
r�r^rurvr�rr�r9r�rr'r�r�)r	r�r�r�Zdoesntexistr�r
r
r�!test_cwd_with_relative_executable�s




z1ProcessTestCase.test_cwd_with_relative_executablec	Csr|��\}}tj�||�}tj�tj|�}t���6}|jtt	j
|g|d�|�|�}|j|||d�WdQRXdS)N)r)
r�r^rurvr�rr�r9r�rr'r�r�)r	r�r�Z
abs_pythonr�r�r
r
r�test_cwd_with_absolute_arg�s


z*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblecCs.|��\}}|�|�}|j|dtj|d�dS)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 #7774cCs|jt��dtjd�dS)Nr�)r))r�r^r~r(r))r	r
r
r�test_executable_without_cwd�sz+ProcessTestCase.test_executable_without_cwdcCsHtjtjddgtjd�}|j�d�|j��|��|�	|j
d�dS)Nz-cz0import sys; sys.exit(sys.stdin.read() == "pear"))r%spearr])rr'r(r)r*r%rNr.rrr@)r	r/r
r
r�test_stdin_pipe�s


zProcessTestCase.test_stdin_pipecCsft��}|�|j�|��}t�|d�t�|dd�tj	t
jddg|d�}|��|�
|jd�dS)Nspearrz-cz0import sys; sys.exit(sys.stdin.read() == "pear"))r%r])rKrLrMr.�filenor^rN�lseekrr'r(r)rrr@)r	rP�dr/r
r
r�test_stdin_filedes�s
z"ProcessTestCase.test_stdin_filedescCsXt��}|�|j�|�d�|�d�tjtj	ddg|d�}|�
�|�|jd�dS)Nspearrz-cz0import sys; sys.exit(sys.stdin.read() == "pear"))r%r])
rKrLrMr.rNrOrr'r(r)rrr@)r	rPr/r
r
r�test_stdin_fileobj�s


z"ProcessTestCase.test_stdin_fileobjc	Cs>tjtjddgtjd�}|�|�|j��d�WdQRXdS)Nz-cz&import sys; sys.stdout.write("orange"))r&sorange)rr'r(r)r*rr&r�)r	r/r
r
r�test_stdout_pipe�s


z ProcessTestCase.test_stdout_pipecCs`t��}|�|j�|��}tjtjddg|d�}|�	�t
�|dd�|�t
�
|d�d�dS)Nz-cz&import sys; sys.stdout.write("orange"))r&risorange)rKrLrMr.r�rr'r(r)rr^r�rr�)r	rPr�r/r
r
r�test_stdout_filedes�s
z#ProcessTestCase.test_stdout_filedescCsPt��}|�|j�tjtjddg|d�}|��|�	d�|�
|��d�dS)Nz-cz&import sys; sys.stdout.write("orange"))r&rsorange)rKrLrMr.rr'r(r)rrOrr�)r	rPr/r
r
r�test_stdout_fileobj�s

z#ProcessTestCase.test_stdout_fileobjc	Cs>tjtjddgtjd�}|�|�|j��d�WdQRXdS)Nz-cz*import sys; sys.stderr.write("strawberry"))rs
strawberry)rr'r(r)r*rrr�)r	r/r
r
r�test_stderr_pipe�s


z ProcessTestCase.test_stderr_pipecCs`t��}|�|j�|��}tjtjddg|d�}|�	�t
�|dd�|�t
�
|d�d�dS)Nz-cz*import sys; sys.stderr.write("strawberry"))rris
strawberry)rKrLrMr.r�rr'r(r)rr^r�rr�)r	rPr�r/r
r
r�test_stderr_filedess
z#ProcessTestCase.test_stderr_filedescCsPt��}|�|j�tjtjddg|d�}|��|�	d�|�
|��d�dS)Nz-cz*import sys; sys.stderr.write("strawberry"))rrs
strawberry)rKrLrMr.rr'r(r)rrOrr�)r	rPr/r
r
r�test_stderr_fileobjs

z#ProcessTestCase.test_stderr_fileobjcCsRtjtjddgtjtjd�}|��\}}|�|d�|�|d�|�|jd�dS)Nz-cz�import sys, subprocess;rc = subprocess.call([sys.executable, "-c",    "import sys;"    "sys.stderr.write('42')"],    stderr=subprocess.STDOUT);sys.exit(rc))r&rs42�r)	rr'r(r)r*rkrrr@)r	r/r&rr
r
r�,test_stderr_redirect_with_no_stdout_redirects

z<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectc	CsBtjtjddgtjtjd�}|�|�|j��d�WdQRXdS)Nz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange"))r&rsappleorange)	rr'r(r)r*rIrr&r�)r	r/r
r
r�test_stdout_stderr_pipe,s

z'ProcessTestCase.test_stdout_stderr_pipecCsRt��}|�|j�tjtjddg||d�}|��|�	d�|�
|��d�dS)Nz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange"))r&rrsappleorange)rKrLrMr.rr'r(r)rrOrr�)r	rPr/r
r
r�test_stdout_stderr_file8s

z'ProcessTestCase.test_stdout_stderr_filecCsld}tjtjd|gtjtjd�}|�|jj�|�|jj�|�	�\}}|�
|jd|�|�
|��d�dS)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&rrstest with stdout=1)
rr'r(r)r*rMr&r.rrkrr@rl)r	rmr/rnror
r
r�test_stdout_filedes_of_stdoutGsz-ProcessTestCase.test_stdout_filedes_of_stdoutcCs2tjtjddgtjd�}|��|�|jd�dS)Nz-cz'for i in range(10240):print("x" * 1024))r&)rr'r(r)�DEVNULLrrr&)r	r/r
r
r�test_stdout_devnullZs


z#ProcessTestCase.test_stdout_devnullcCs2tjtjddgtjd�}|��|�|jd�dS)Nz-cz=import sys
for i in range(10240):sys.stderr.write("x" * 1024))r)rr'r(r)r�rrr)r	r/r
r
r�test_stderr_devnullbs


z#ProcessTestCase.test_stderr_devnullcCs2tjtjddgtjd�}|��|�|jd�dS)Nz-czimport sys;sys.stdin.read(1))r%)rr'r(r)r�rrr%)r	r/r
r
r�test_stdin_devnullks


z"ProcessTestCase.test_stdin_devnullc	CsTtj��}d|d<tjtjddgtj|d��}|��\}}|�	|d�WdQRXdS)N�oranger[z-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT")))r&r\sorange)
r^r_r`rr'r(r)r*rkr)r	rar/r&rr
r
r�test_envss


zProcessTestCase.test_envrz#cannot test an empty env on WindowsZPy_ENABLE_SHAREDr]zEThe Python shared library cannot be loaded with an empty environment.c	stdd��tjtjddgtjid��H}|��\}}t|���}|�|t	��fdd�|D�}|�
|g�WdQRXdS)NcSs*d|kp(d|kp(|dkp(|�d�p(|dkS)NZ	VERSIONERZ__CFZ
LD_PRELOADZSANDBOX�LC_CTYPE)�
startswith)�nr
r
r�is_env_var_to_ignore�sz<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignorez-cz)import os; print(list(os.environ.keys())))r&r\csg|]}�|�s|�qSr
r
)�.0�k)r�r
r�
<listcomp>�sz2ProcessTestCase.test_empty_env.<locals>.<listcomp>)rr'r(r)r*rk�evalrr+�listr)r	r/r&rZchild_env_namesr
)r�r�test_empty_env�s	
zProcessTestCase.test_empty_envc	Cs\tjd}|�t��t�|ddg�WdQRX|�t��t�tjddg�WdQRXdS)N�z-c�passzpass#)r(r)r9rTrr')r	�cmdr
r
r�test_invalid_cmd�s

z ProcessTestCase.test_invalid_cmdc	Cstj��}d|d<|�t��tjtjddg|d�WdQRXtj��}d|d<|�t��tjtjddg|d�WdQRXtj��}d|d	<|�t��tjtjddg|d�WdQRXtj��}d
|d<tjtjddgtj	|d��}|�
�\}}|�|d
�WdQRXdS)NZcabbagezFRUITVEGETABLEz-cr�)r\zorangeVEGETABLE=cabbager[ZlemonzFRUIT=ORANGEzorange=lemonz3import sys, os;sys.stdout.write(os.getenv("FRUIT")))r&r\sorange=lemon)r^r_r`r9rTrr'r(r)r*rkr)r	rar/r&rr
r
r�test_invalid_env�s(
 
 
 


z ProcessTestCase.test_invalid_envcCs4tjtjddgtjd�}|�d�|�|jd�dS)Nz-cz/import sys;sys.exit(sys.stdin.read() == "pear"))r%spearr])rr'r(r)r*rkrr@)r	r/r
r
r�test_communicate_stdin�s



z&ProcessTestCase.test_communicate_stdincCs@tjtjddgtjd�}|��\}}|�|d�|�|d�dS)Nz-cz)import sys; sys.stdout.write("pineapple"))r&s	pineapple)rr'r(r)r*rkr)r	r/r&rr
r
r�test_communicate_stdout�s

z'ProcessTestCase.test_communicate_stdoutcCs@tjtjddgtjd�}|��\}}|�|d�|�|d�dS)Nz-cz)import sys; sys.stderr.write("pineapple"))rs	pineapple)rr'r(r)r*rkrr)r	r/r&rr
r
r�test_communicate_stderr�s

z'ProcessTestCase.test_communicate_stderrcCsttjtjddgtjtjtjd�}|�|jj�|�|jj�|�|j	j�|�
d�\}}|�|d�|�|d�dS)Nz-czNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read()))r%r&rsbananas	pineapple)
rr'r(r)r*rMr&r.rr%rkrr)r	r/r&rr
r
r�test_communicate�s

z ProcessTestCase.test_communicatecCsdtjtjddgdtjtjtjd�}|jtj|jddd�|��\}}|�|d�|�	|�
�d�dS)	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&rrZg333333�?)r8spineapple
pear
)rr'r(r)r*r9r:rkrr�encode)r	r/r&rr
r
r�test_communicate_timeout�s

z(ProcessTestCase.test_communicate_timeoutcCsLtjtjddgtjd�}|jtj|jdd�|��\}}|�t	|�d�dS)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�������?)r8i)
rr'r(r)r*r9r:rkr�len)r	r/r&�_r
r
r�%test_communicate_timeout_large_output�s

z5ProcessTestCase.test_communicate_timeout_large_outputcCs�x�dD]�}x�dD]�}x�dD]�}i}|r0tj|d<|r>tj|d<|rLtj|d<|sRqtjtjddff|�}|��|jdk	r�|�|jj�|j	dk	r�|�|j	j�|j
dk	r|�|j
j�qWqWqWdS)N)FTr%r&rz-cr�)rr*r'r(r)rkr%�
assertTrue�closedr&r)r	Z
stdin_pipeZstdout_pipeZstderr_pipe�optionsr/r
r
r�test_communicate_pipe_fd_leaks(








z-ProcessTestCase.test_communicate_pipe_fd_leakcCs:t�tjddg�}|��\}}|�|d�|�|d�dS)Nz-czimport sys; sys.exit(47))rr'r(r)rkr)r	r/r&rr
r
r�test_communicate_returns$s

z(ProcessTestCase.test_communicate_returnscCs�t��\}}t�|�t�|�tjtjddtjgtj	tj	tj	d�}|�
|jj�|�
|jj�|�
|j
j�dtj}|�|�\}}|�||�dS)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^�piper.rr'r(r)r�
PIPE_MAX_SIZEr*rMr&rr%rkr)r	�x�yr/Zstring_to_writer&rr
r
r�test_communicate_pipe_buf,s




z)ProcessTestCase.test_communicate_pipe_bufcCs�tjtjddgtjtjtjd�}|�|jj�|�|jj�|�|j	j�|j	�
d�|�d�\}}|�|d�|�
|d�dS)Nz-cz0import sys,os;sys.stdout.write(sys.stdin.read()))r%r&rsbananassplitsbananasplitr�)rr'r(r)r*rMr&r.rr%rNrkrr)r	r/r&rr
r
r�test_writes_before_communicateCs

z.ProcessTestCase.test_writes_before_communicatec
Cs�tjddtdg}x�dD]�}tj|fdtjdtj|di�}|��|j�d�|j��|�	|j
��d�|j�d	�|j��|�
|j
j�|�	|j
��d
�|�	|j
�d�d	�|�	|j
��d�WdQRXqWdS)
Nz-czimport 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&Tzline1
zline3
zline2
�zline4
line5
line6
line7
line8)r(r)�	SETBINARYrr'r*r%rN�flushrr&�readliner.rMr�)r	r!Zextra_kwargr/r
r
r� test_universal_newlines_and_textSs(



z0ProcessTestCase.test_universal_newlines_and_textcCs^tjtjddtdgtjtjdd�}|�|jj�|�|j	j�|�
�\}}|�|d�dS)Nz-czimport 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])rr&r�z#line2
line4
line5
line6
line7
line8)rr'r(r)r�r*rMr&r.rrkr)r	r/r&rr
r
r�#test_universal_newlines_communicatezs
z3ProcessTestCase.test_universal_newlines_communicatecCsHtjtjddtt�d�gtjdd�}|�d�\}}|�	|j
d�dS)Nz-czimport 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)rr'r(r)r��textwrap�dedentr*rkrr@)r	r/r&rr
r
r�)test_universal_newlines_communicate_stdin�s

z9ProcessTestCase.test_universal_newlines_communicate_stdincCs8tjtjddgtjtjdd�}|��|�|jd�dS)Nz-cr�T)r%r&r�r)rr'r(r)r*rkrr@)r	r/r
r
r�.test_universal_newlines_communicate_input_none�sz>ProcessTestCase.test_universal_newlines_communicate_input_nonecCs�tjtjddtt�d�gtjtjtjdd�}|�|j	j
�|�|jj
�|�d�\}}|�
|jd�|�
d|�|�|�d	��dS)
Nz-czimport 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%rr&r�zline1
line3
rzline1
line2
line3
line4
line5
zeline2
eline6
eline7
)rr'r(r)r�r�r�r*rMr&r.rrkrr@r�r�)r	r/r&rr
r
r�7test_universal_newlines_communicate_stdin_stdout_stderr�s

zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrcCsXxRdD]J}d|}tjd|g}tj|tjtj|d�}|jdd�\}}|�|d�qWdS)N)zutf-16z	utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))z-c)r%r&�encodingr)rRz1
2
3
4)r(r)rr'r*rkr)r	r�rmr!�popenr&rr
r
r�-test_universal_newlines_communicate_encodings�s
z=ProcessTestCase.test_universal_newlines_communicate_encodingscCs`xZdD]R\}}d}tjd|g}tj|tjtjd|d�}|jdd�\}}|�|d�|��qWdS)	N))�ignorer)�replaceu��)�surrogateescapeu��)�backslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')z-czutf-8)r%r&r��errorsr)rRz[{}])r(r)rr'r*rkr�format)r	r�rrmr!r�r&rr
r
r�test_communicate_errors�sz'ProcessTestCase.test_communicate_errorsc
Cs8ts
d}nd}g}t��}z�x�t|�D]f}y.tj�|tj�}|�	t�
|tjtjB��Wq&t
k
r�}z|jtjkrx�PWdd}~XYq&Xq&W|�d|�xtd�D]}t�|���q�WxJtd�D]>}tjtjddgtjtjtjd�}|�d	�d
}|�|d	�q�WWdx|D]}	t�|	��qWt�|�XdS)Niiz4failed to reach the file descriptor limit (tried %d)�
�z-cz-import sys;sys.stdout.write(sys.stdin.read()))r%r&rslimer)r
rK�mkdtemp�ranger^rurvrZTESTFN�append�open�O_WRONLY�O_CREAT�OSError�errnoZEMFILE�skipTestr.�poprr'r(r)r*rkr�shutilZrmtree)
r	Zmax_handles�handlesZtmpdir�iZtmpfile�er/�data�hr
r
r�test_no_leaking�s:


zProcessTestCase.test_no_leakingcCs�|�t�dddg�d�|�t�dddg�d�|�t�dddg�d	�|�t�d
ddg�d
�|�t�dddg�d�|�t�dddg�d�|�t�dddg�d�|�t�ddg�d�dS)Nza b cr�r�z"a b c" d ezab"c�\z	ab\"c \ dz \z
ab\"c " \\" dza\\\bzde fgr�za\\\b "de fg" hza\"brAz
a\\\"b c dza\\b cz"a\\b c" d eza\\b\ cz
"a\\b\ c" d eZabrzab "")rr�list2cmdline)r	r
r
r�test_list2cmdlines z!ProcessTestCase.test_list2cmdlinecCsbtjtjddgtjd�}|�|jj�|�|�	��t
�|j��d�|�
�|�|�	�d�dS)Nz-czimport os; os.read(0, 1))r%�Ar)rr'r(r)r*rMr%r.�assertIsNone�pollr^rNr�rr)r	r/r
r
r�	test_poll.s

zProcessTestCase.test_pollcCs6t�tjddg�}|�|��d�|�|��d�dS)Nz-cr�r)rr'r(r)rr)r	r/r
r
r�	test_wait9szProcessTestCase.test_waitc	Cs`t�tjddg�}|�tj��}|jdd�WdQRX|�dt|j	��|�
|jdd�d�dS)Nz-czimport time; time.sleep(0.3)g-C��6?)r8z0.0001rXr)rr'r(r)r9r:rrD�strr?r)r	r/rAr
r
r�test_wait_timeout?s
z!ProcessTestCase.test_wait_timeoutc	Cs.|�t��t�tjddgd�WdQRXdS)Nz-cr�r�)r9rcrr'r(r))r	r
r
r�test_invalid_bufsizeIsz$ProcessTestCase.test_invalid_bufsizecCsNt�tjddgd�}|�|��d�tjtjddgdd�}|�|��d�dS)Nz-cr�r)r1)rr'r(r)rr)r	r/r
r
r�test_bufsize_is_noneOsz$ProcessTestCase.test_bufsize_is_nonec
Cs�tjtjddgtjtjtjd|d��j}|j�|�t�	|j�
��|j��}t
���*y|j�	�Wntk
rxYnXWdQRXd|_WdQRX|�|jd�|�||�dS)Nz-czDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r])r%r&rr1r�r)rr'r(r)r*r�r%rNr^r.r�r&r�r�SuppressCrashReportr�rr@)r	�linerr�r/Z	read_liner
r
r�_test_bufsize_equal_oneWs"


z'ProcessTestCase._test_bufsize_equal_onecCsd}|j||dd�dS)Nzline
T)r�)r)r	rr
r
r� test_bufsize_equal_one_text_modemsz0ProcessTestCase.test_bufsize_equal_one_text_modecCs"dtj��}|j|ddd�dS)Nsliner�F)r�)r^�linesepr�r)r	rr
r
r�"test_bufsize_equal_one_binary_modessz2ProcessTestCase.test_bufsize_equal_one_binary_modec
Cs@x:td�D].}|�t��tjttjtjd�WdQRXq
WdS)Ni)r&r)r�r9ryrr'rzr*)r	r�r
r
r�test_leaking_fds_on_errorys
z)ProcessTestCase.test_leaking_fds_on_errorc	Cs�yddl}|jWn"ttfk
r4|�d�YnXt�dt�d��}tj	d|g}t
j|t
jdd�}|�|�
�d}WdQRX|�|d	�|�|jd�dS)
Nrzneed 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)rr�r]r)�msvcrtZCrtSetReportMode�AttributeError�ImportErrorr�r�r�rzr(r)rr'r*rkrr@)r	rrmr��procrr
r
r�test_nonexisting_with_pipes�s
z+ProcessTestCase.test_nonexisting_with_pipescs�g��fdd�}tj|d�}|��z2|�t��tjttjtjtjd�WdQRXWd|�	�d}xB�D]:}yt
�|�Wqjtk
r�}z|}Wdd}~XYqjXqjW|dk	r�|�XdS)Ncs.x(td�D]}��t���t�d�q
WdS)N�g����MbP?)r��extendr^r��time�sleep)r�)�fdsr
r�open_fds�sz<ProcessTestCase.test_double_close_on_error.<locals>.open_fds)�target)r%r&r)
�	threadingZThread�startr9�EnvironmentErrorrr'rzr*rvr^r.r�)r	r�t�exc�fdr�r
)rr�test_double_close_on_error�s&
z*ProcessTestCase.test_double_close_on_errorcs�t�tjddg��|��jd�g���fdd�}t�d|�}|��t	rPd}nd}�j
dd	�|j�j|d
d���
�|j�j|dd�|��|�d
d|fd|fg��dS)Nz-czimport time; time.sleep(12)csN��d���f���������d�jf������d�jf�dS)Nzthread-start-poll-resultzthread-after-kill-and-waitzthread-after-second-wait)r�r�killrr@r
)r�resultsr
r�kill_proc_timer_thread�szDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_threadg�������?r]i����r)r8z*unexpected result in wait from main thread)rz&unexpected result in second main wait.)zthread-start-poll-resultNzthread-after-kill-and-waitzthread-after-second-wait)rr'r(r)rr@rZTimerrr
rrv)r	r&r Zexpected_errorcoder
)rr%r�test_threadsafe_wait�s*


z$ProcessTestCase.test_threadsafe_waitcCs6d�d�}t�tjd|g�}|�|�d�t|��dS)N�;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0z-csHello World!)rvrrCr(r)r�r��ascii)r	rmrEr
r
r�test_issue8780�szProcessTestCase.test_issue8780cCs�t��\}}t��\}}t��\}}ytjdg|||d�WnPtk
r�t�|�t�|�t�|�t�|�t�|�t�|�YnX|�tj	�
|��|�tj	�
|��|�tj	�
|��dS)N�*)r%r&r)rK�mkstemprr'r�r^r.�removerru�exists)r	ZifhandleZifnameZofhandleZofnameZefhandleZefnamer
r
r� test_handles_closed_on_exception
s 




z0ProcessTestCase.test_handles_closed_on_exceptioncCs\tjtjddgtjtjtjd�}|�|jj�|�|jj�|�|j	j�|�
dd�dS)Nz-cr�)r%r&r�xi)rr'r(r)r*rMr&r.rr%rk)r	r/r
r
r�test_communicate_epipes
z&ProcessTestCase.test_communicate_epipecCs@tjtjddgtjd�}|�|jj�|��|�	dd�dS)Nz-cr�)r%r0i)
rr'r(r)r*rMr%r.rrk)r	r/r
r
r�!test_communicate_epipe_only_stdin)s

z1ProcessTestCase.test_communicate_epipe_only_stdin�SIGUSR1zRequires signal.SIGUSR1r$zRequires os.kill�getppidzRequires os.getppidc
Csrdd�}t�tj|�}|�tjtj|�tjddg}x8dD]0}|tji}tj|f|��}|��WdQRXq:WdS)NcSsdS)Nr
)Zsignum�framer
r
r�handler9sz7ProcessTestCase.test_communicate_eintr.<locals>.handlerz-cz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1))r&r)	�signalr3rMr(r)rr*r'rk)r	r6�old_handlerr!�stream�kw�processr
r
r�test_communicate_eintr1s

z&ProcessTestCase.test_communicate_eintrz/proc/%d/fdzLinux specificc	Csddt��}t�|�}|�t��$ttjddgtj	tj	tj	d�WdQRXt�|�}|�
||�dS)Nz/proc/%d/fdz-cr�)r%r&r)r^�getpid�listdirr9rr r(r)rr*r)r	Zfd_directoryZfds_before_popenZfds_after_exceptionr
r
r�!test_failed_child_execute_fd_leakJs

z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on Windowsc	Cs<|�t��}t�ddddg�WdQRX|�|jjd�dS)Nz/opt/nonexistent_binary�withZsomer!)r9r�rr5rr?�filename)r	rAr
r
r�%test_file_not_found_includes_filename\sz5ProcessTestCase.test_file_not_found_includes_filenamec	Cs<|�t��}tjddgdd�WdQRX|�|jjd�dS)N�exit�0z/some/nonexistent/directory)r)r9r�rr'rr?rA)r	rAr
r
r� test_file_not_found_with_bad_cwdbsz0ProcessTestCase.test_file_not_found_with_bad_cwdN)prrrr0r3r7r;r=rBrFrHrJrQrSrVrWrYrbrirjrprqrsrxr{�unittest�skipIfr
r}r�r�r�r�r�r�r�r�r(�base_prefix�prefixr��	sysconfigZis_python_buildr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��platformZget_config_varr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr	rr
rrrr#r'r*r/r1r2�
skipUnless�hasattrr7r^r<ru�isdirr=r?rBrEr
r
r
rr$`s�		

		



	

''
)4r$c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Ze�ed�d d!��Zd"S)#�RunFuncTestCasecKstjd|g}tj|f|�S)Nz-c)r(r)r�run)r	rmr"�argvr
r
r�
run_pythonjszRunFuncTestCase.run_pythonc	Cs<|�d�}|�|jd�|�tj��|��WdQRXdS)Nzimport sys; sys.exit(47)r4)rRrr@r9rr>Zcheck_returncode)r	�cpr
r
r�test_returncodeos
zRunFuncTestCase.test_returncodec	Cs:|�tj��}|jddd�WdQRX|�|jjd�dS)Nzimport sys; sys.exit(47)T)�checkr4)r9rr>rRrr?r@)r	rAr
r
r�
test_checkvszRunFuncTestCase.test_checkcCs |jddd�}|�|jd�dS)Nzimport sys; sys.exit(0)T)rUr)rRrr@)r	rSr
r
r�test_check_zero{szRunFuncTestCase.test_check_zeroc	Cs*|�tj��|jddd�WdQRXdS)Nzwhile True: passg-C��6?)r8)r9rr:rR)r	r
r
r�test_timeout�szRunFuncTestCase.test_timeoutcCs"|jdtjd�}|�d|j�dS)Nz
print('BDFL'))r&sBDFL)rRrr*rDr&)r	rSr
r
r�test_capture_stdout�sz#RunFuncTestCase.test_capture_stdoutcCs"|jdtjd�}|�d|j�dS)Nz$import sys; sys.stderr.write('BDFL'))rsBDFL)rRrr*rDr)r	rSr
r
r�test_capture_stderr�s
z#RunFuncTestCase.test_capture_stderrcCsLt��}|�|j�|�d�|�d�|jd|tjd�}|�	d|j
�dS)Nspearrz6import sys; sys.stdout.write(sys.stdin.read().upper()))r%r&sPEAR)rKrLrMr.rNrOrRrr*rDr&)r	rPrSr
r
rrQ�s

z+RunFuncTestCase.test_check_output_stdin_argcCs$|jddtjd�}|�d|j�dS)Nz6import sys; sys.stdout.write(sys.stdin.read().upper())spear)rRr&sPEAR)rRrr*rDr&)r	rSr
r
rrS�sz+RunFuncTestCase.test_check_output_input_argc	Cs~t��}|�|j�|�d�|�d�|jtdd��}|jd|dd�}WdQRX|�	d|j
jd�|�	d	|j
jd�dS)
Nspearrz7Expected ValueError when stdin and input args supplied.)rzprint('will not be run')share)r%rRr%rR)rKrLrMr.rNrOr9rTrRrDr?r!)r	rPrArEr
r
rrW�s


z6RunFuncTestCase.test_check_output_stdin_with_input_argc	CsN|�tj��}|jddtjd�}WdQRX|�|jjd�|�|jjd�dS)NzMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)rX)r8r&sBDFL)	r9rr:rRr*rr?rEr&)r	rArSr
r
rrY�sz)RunFuncTestCase.test_check_output_timeoutcCs2tj��}d|d<|jd|d�}|�|jd�dS)NrZr[zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31))r\�!)r^r_r`rRrr@)r	rarSr
r
r�test_run_kwargs�s

zRunFuncTestCase.test_run_kwargscCs.|jddd�}|�d|j�|�d|j�dS)Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)�capture_outputsBDFLsFLUFL)rRrDr&r)r	rSr
r
r�test_capture_output�sz#RunFuncTestCase.test_capture_outputc	Csjt��}|�|j�|jtdd��}|jdd|d�}WdQRX|�d|jj	d�|�d|jj	d�dS)	NzAExpected ValueError when stdout and capture_output args supplied.)rzprint('will not be run')T)r]r&r&rr])
rKrLrMr.r9rTrRrDr?r!)r	rPrArEr
r
r�#test_stdout_with_capture_output_arg�sz3RunFuncTestCase.test_stdout_with_capture_output_argc	Csjt��}|�|j�|jtdd��}|jdd|d�}WdQRX|�d|jj	d�|�d|jj	d�dS)	NzAExpected ValueError when stderr and capture_output args supplied.)rzprint('will not be run')T)r]rrrr])
rKrLrMr.r9rTrRrDr?r!)r	rPrArEr
r
r�#test_stderr_with_capture_output_arg�sz3RunFuncTestCase.test_stderr_with_capture_output_argz)requires posix like 'sleep' shell commandc
Cs~t��}ytjddddd�Wn4tjk
rR}zt��}t��}Wdd}~XYnX|�d�|j||dd|�d�d	�dS)
Nzsleep 3Tg�������?)r|r8r]zTimeoutExpired not raised.g�?z/TimeoutExpired was delayed! Bad traceback:
```
z```)r)	rZ	monotonicrrPr:�	traceback�
format_excrUZ
assertLess)r	Zbefore_secsr!Z
after_secsZstacksr
r
r�.test_run_with_shell_timeout_and_capture_output�s

z>RunFuncTestCase.test_run_with_shell_timeout_and_capture_outputN)rrrrRrTrVrWrXrYrZrQrSrWrYr\r^r_r`rFrGr
rcr
r
r
rrOis 
rOzPOSIX specific testscsPeZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�ZGdd�dej	�Z
e�d
�dd��Z
e�d
�dd��Ze�ej�d�d�dd��Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�ZGd$d%�d%ej	�Ze�ej�d&�d'�d(d)��Zd*d+�Ze�ej d,kd-�d.d/��Z!d0d1�Z"d2d3�Z#d4d5�Z$d6d7�Z%d8d9�Z&d:d;�Z'd<d=�Z(e�ej �)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�ej �)dz��one�Gd{�jHe�Gd|�jHkd}�d~d��ZIeJ�Kd�d��d�d���ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��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���Zad�d��Zb�ZcS)��POSIXProcessTestCasecst���d|_dS)Nz/_this/pa.th/does/not/exist)�superr�_nonexistent_dir)r	)�	__class__r
rr�s
zPOSIXProcessTestCase.setUpc
Csdyt�|j�Wn>tk
rN}z |}|jdt|j�7_Wdd}~XYnX|�d|j�|S)Nz: z,chdir to nonexistent directory %s succeeded.)r^�chdirrfr��strerror�reprrU)r	r��desired_exceptionr
r
r�_get_chdir_exceptions*
z)POSIXProcessTestCase._get_chdir_exceptionc
Csz|��}ytjtjddg|jd�}WnBtk
rf}z$|�|j|j�|�|j	|j	�Wdd}~XYnX|�
d|�dS)Nz-cr)rzExpected OSError: %s)rlrr'r(r)rfr�rr�rirU)r	rkr/r�r
r
r�test_exception_cwds"z'POSIXProcessTestCase.test_exception_cwdc
Csz|��}ytjtjddg|jd�}WnBtk
rf}z$|�|j|j�|�|j	|j	�Wdd}~XYnX|�
d|�dS)Nz-cr)r)zExpected OSError: %s)rlrr'r(r)rfr�rr�rirU)r	rkr/r�r
r
r�test_exception_bad_executables"z2POSIXProcessTestCase.test_exception_bad_executablec
Cst|��}yt�|jddg�}WnBtk
r`}z$|�|j|j�|�|j|j�Wdd}~XYnX|�d|�dS)Nz-crzExpected OSError: %s)	rlrr'rfr�rr�rirU)r	rkr/r�r
r
r�test_exception_bad_args_0-s"z.POSIXProcessTestCase.test_exception_bad_args_0c@seZdZdd�ZdS)z&POSIXProcessTestCase.PopenNoDestructorcCsdS)Nr
)r	r
r
r�__del__Bsz.POSIXProcessTestCase.PopenNoDestructor.__del__N)rrrrpr
r
r
r�PopenNoDestructorAsrqz%subprocess._posixsubprocess.fork_execc
CsNdd�}||_tjdtd��(|�t��|�dg�WdQRXWdQRXdS)NcWs0|d}d�tj���}t�|d|d�dS)N�
z{:x}sOSError:�:r)r�r�ZEISDIRr�r^rN)r!�
errpipe_writeZerr_coder
r
r�proper_errorHszHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_errorzsubprocess.os.waitpid)�side_effect�non_existent_command)rvr�patch�ChildProcessErrorr9�IsADirectoryErrorrq)r	�	fork_execrur
r
r�test_exception_errpipe_normalEs
z2POSIXProcessTestCase.test_exception_errpipe_normalc
snd��fdd�}||_tjdtd��*|�tj��}|�dg�WdQRXWdQRX|�t	��t
|j��dS)Ns�ޭcs|d}t�|��dS)Nrrr)r^rN)r!rt)�
error_datar
r�	bad_error[szGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_errorzsubprocess.os.waitpid)rvrw)rvrrxryr9r�SubprocessErrorrqrDrjrr?)r	r{r~r�r
)r}r�test_exception_errpipe_bad_dataVs
 z4POSIXProcessTestCase.test_exception_errpipe_bad_dataz/proc/self/statuszneed /proc/self/statuscCs�tjddgdd�}x*|��D]}|�d�r|}PqW|�d�tjddgdd�}x |��D]}|�d�rZ|}PqZW|j||dd	�dS)
N�catz/proc/self/statusF)Zrestore_signalssSigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.)r)rrC�
splitlinesr�r��assertNotEqual)r	Zdefault_proc_statusrZdefault_sig_ign_maskZrestored_proc_statusZrestored_sig_ign_maskr
r
r�test_restore_signalsls"


z)POSIXProcessTestCase.test_restore_signalsc
Csrytjtjddgdd�}Wn0tk
rJ}z|jtjkr:�Wdd}~XYn$Xt�t�	��}t
|�}|�||�dS)Nz-cz)import os; print(os.getpgid(os.getpid()))T)Zstart_new_session)rrCr(r)r�r�ZEPERMr^�getpgidr=�intr�)r	rEr�Zparent_pgidZ
child_pgidr
r
r�test_start_new_session�sz+POSIXProcessTestCase.test_start_new_sessionc	CsDt��� t�tjddg�}|��WdQRX|�|jt	j
�dS)Nz-czimport os; os.abort())rr
rr'r(r)rrr@r7�SIGABRT)r	r/r
r
r�test_run_abort�s


z#POSIXProcessTestCase.test_run_abortcCsNt�ttj�d�}t|�}|�d|���|�d|�|�ttj�|�dS)Nzfake cmdr7ZSIG)rr>r�r7r�rrD�lower)r	ro�error_stringr
r
r�"test_CalledProcessError_str_signal�s
z7POSIXProcessTestCase.test_CalledProcessError_str_signalcCs$t�dd�}t|�}|�d|�dS)Ni�Ki�zfake cmdzunknown signal 9876543.)rr>rrD)r	ror�r
r
r�*test_CalledProcessError_str_unknown_signal�sz?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalcCs$t�dd�}t|�}|�d|�dS)N�zfake cmdznon-zero exit status 2.)rr>rrD)r	ror�r
r
r�$test_CalledProcessError_str_non_zero�sz9POSIXProcessTestCase.test_CalledProcessError_str_non_zeroc	CsDtjtjddgtjdd�d�}|�|�|j��d�WdQRXdS)Nz-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT"))cSst�dd�S)Nr[�apple)r^�putenvr
r
r
r�<lambda>�r�z3POSIXProcessTestCase.test_preexec.<locals>.<lambda>)r&�
preexec_fnsapple)rr'r(r)r*rr&r�)r	r/r
r
r�test_preexec�s
z!POSIXProcessTestCase.test_preexecc
Cs�dd�}ytjtjddg|d�}Wndtjk
rT}z|�tjd�Wdd}~XYn>tk
r�}z|�d|j	d�Wdd}~XYnX|�
d	�dS)
NcSstd��dS)Nz'What if two swallows carried a coconut?)rTr
r
r
r�raise_it�sz=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itz-cr)r�z)Expected a ValueError from the preexec_fnZcoconutrzEException raised by preexec_fn did not make it to the parent process.)rr'r(r)rr��_posixsubprocessrTrDr!rU)r	r�r/r�r
r
r�test_preexec_exception�s$z+POSIXProcessTestCase.test_preexec_exceptionc@seZdZdd�Zdd�ZdS)z+POSIXProcessTestCase._TestExecuteChildPopencOs||_tjj|f|�|�dS)N)�	_testcaserr'rd)r	Ztestcaser!r"r
r
rrd�sz4POSIXProcessTestCase._TestExecuteChildPopen.__init__cOs�ztjj|f|�|�Wddd�td�D�}z<x6|D].}|jj||j��|j��|j	��fdd�q4WWdx|D]}t
�|�qpWXXdS)NcSsg|]}t�dtj��qS)z	/dev/zero)r^r��O_RDONLY)r�r�r
r
rr��szNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>�z!At least one fd was closed early.)r)rr'r#r�r��assertNotInr%r�r&rr^r.)r	r!r"Zdevzero_fdsr"r
r
rr#�s


z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)rrrrdr#r
r
r
r�_TestExecuteChildPopen�sr�z	/dev/zeroz/dev/zero required.c	CsHdd�}|�tj��*|j|tjddgtjtjtj|d�WdQRXdS)NcSst�d��dS)Nz-force the _execute_child() errpipe_data path.)rrr
r
r
rr��szWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_itz-cr�)r%r&rr�)r9rrr�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_pipescCsdd�}t��}tj}tj}z�t��|�t���tjtjddgdd�d�|�t��d�t��|�	t���tjtjddgd	d�d�|�	t��d
�|t_|j
ttjtjddgdd�d�t`|j
t
tjtjddgdd�d�Wd|t_|t_|�st��XdS)
NcSstd��dS)Nzthis shouldn't escape)�RuntimeErrorr
r
r
r�raise_runtime_error�szPPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.raise_runtime_errorz-crcSsdS)Nr
r
r
r
rr�r�zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>)r�z#Popen enabled gc when it shouldn't.cSsdS)Nr
r
r
r
rr�r�zPopen left gc disabled.cSsdS)Nr
r
r
r
rr�
r�cSsdS)Nr
r
r
r
rr�r�)�gc�	isenabled�disablerrr5r(r)�enabler�r9r�r'r)r	r�ZenabledZorig_gc_disableZorig_gc_isenabledr
r
r�test_preexec_gc_module_failure�s8




z3POSIXProcessTestCase.test_preexec_gc_module_failure�darwinz!setrlimit() seems to fail on OS Xc
Cs�yddlm}m}m}Wn,tk
rD}z|�|�Wdd}~XYnX||�}|\}}||d|f�|�|||�ytjt	j
ddgdd�d�Wntk
r�YnX|�d�dS)	Nr)�	getrlimit�	setrlimit�RLIMIT_NPROCz-crcSsdS)Nr
r
r
r
rr�(r�z@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>)r�z.RLIMIT_NPROC had no effect; probably superuser)�resourcer�r�r�rr�rMrr5r(r)�BlockingIOError)r	r�r�r�roZlimitsr�Zhardr
r
r�test_preexec_fork_failuresz.POSIXProcessTestCase.test_preexec_fork_failurec	Cs�t��\}}t|ddd��&}|�dtj�|�dtj�WdQRXt�	|d�t
�|�}|��t�
|�|�|jd�dS)N�wr�)r�z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r4)rKr,r�rNr�
unix_shellr(r)r^�chmodrr'rr-rr@)r	r"�fname�fobjr/r
r
r�test_args_string/s

z%POSIXProcessTestCase.test_args_stringcCs<|jttjtjddgdd�|jttjtjddgdd�dS)Nz-czimport sys; sys.exit(47)r4)�startupinfo)�
creationflags)r9rTrr5r(r))r	r
r
rri=s

z&POSIXProcessTestCase.test_invalid_argsc	CsTtj��}d|d<tjdgdtj|d�}|�|�|j���	d�d�WdQRXdS)Nr�r[zecho $FRUITr])r|r&r\s 	
sapple)
r^r_r`rr'r*rr&r�r)r	rar/r
r
r�test_shell_sequenceHs

z(POSIXProcessTestCase.test_shell_sequencec	CsRtj��}d|d<tjddtj|d�}|�|�|j���	d�d�WdQRXdS)Nr�r[zecho $FRUITr])r|r&r\s 	
sapple)
r^r_r`rr'r*rr&r�r)r	rar/r
r
r�test_shell_stringRs
z&POSIXProcessTestCase.test_shell_stringc	Csvt��\}}t|ddd��&}|�dtj�|�dtj�WdQRXt�	|d�t
�|�}t�|�|�
|d�dS)Nr�r�)r�z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r4)rKr,r�rNrr�r(r)r^r�rr5r-r)r	r"r�r�r6r
r
r�test_call_string\s

z%POSIXProcessTestCase.test_call_stringc
Cs�g}x>dD]6}x0dD](}tj�||�}tj�|�r|�|�qWq
W|sR|�d�d}tj�|�rxtj�|�sx|�|�xL|D]D}tjd|dtj	d�}|�"|�
|j���
�t|d��WdQRXq~WdS)	N)z/binz	/usr/bin/z/usr/local/bin)ZbashZkshz"bash or ksh required for this testz/bin/shzecho $0T)r)r|r&r))r^rurv�isfiler�r��islinkrr'r*rr&r�r�bytes)r	ZshellsrI�name�shr/r
r
r�test_specific_shellis 






z(POSIXProcessTestCase.test_specific_shellc
Gsft�tjtj�}z&tjtjddgdtjtjtjd�}Wdt�tj|�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&rr])r7�SIGINT�default_int_handlerrr'r(r)r*r&r��getattr)r	�methodr!r8r/r
r
r�
_kill_process}s
z"POSIXProcessTestCase._kill_process)ZnetbsdZopenbsdz"Due to known OS bug (issue #16762)cGsRtjtjddgdtjtjtjd�}|j�d�t�d�t	||�|�|�
�dS)Nz-cz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             T)r�r%r&rr])rr'r(r)r*r&r�rrr�rk)r	r�r!r/r
r
r�_kill_dead_process�s


z'POSIXProcessTestCase._kill_dead_processcCs:|�dtj�}|��\}}|�d|�|�|��d�dS)N�send_signalsKeyboardInterruptr)r�r7r�rkrDr�r)r	r/r�rr
r
r�test_send_signal�sz%POSIXProcessTestCase.test_send_signalcCs:|�d�}|��\}}|�|d�|�|��tj�dS)Nr$r�)r�rkrrrr7�SIGKILL)r	r/r�rr
r
r�	test_kill�s
zPOSIXProcessTestCase.test_killcCs:|�d�}|��\}}|�|d�|�|��tj�dS)N�	terminater�)r�rkrrrr7�SIGTERM)r	r/r�rr
r
r�test_terminate�s
z#POSIXProcessTestCase.test_terminatecCs|�dtj�dS)Nr�)r�r7r�)r	r
r
r�test_send_signal_dead�sz*POSIXProcessTestCase.test_send_signal_deadcCs|�d�dS)Nr$)r�)r	r
r
r�test_kill_dead�sz#POSIXProcessTestCase.test_kill_deadcCs|�d�dS)Nr�)r�)r	r
r
r�test_terminate_dead�sz(POSIXProcessTestCase.test_terminate_deadcCs:g}x0|D](}t�|�}t�|�}|�|||f�q
W|S)N)r^�get_inheritable�dupr�)r	Zsave_fdsrr"�inheritable�savedr
r
r�	_save_fds�s


zPOSIXProcessTestCase._save_fdscCs2x,|D]$\}}}tj|||d�t�|�qWdS)N)r�)r^�dup2r.)r	rr"r�r�r
r
r�_restore_fds�sz!POSIXProcessTestCase._restore_fdsc		Cs�d}|�|�}x |D]\}}}|dkr|}PqWz\x|D]}t�|�q8Wtjtjddg|tjtjd���\}}t	�
|�}|�||fd�Wd|�|�XdS)Nrz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange"))r%r&r)sapplesorange)
r�r^r.rr'r(r)r*rkrrrr�)	r	rr%�	saved_fdsr"r�r�rnror
r
r�check_close_std_fds�s"



z(POSIXProcessTestCase.check_close_std_fdscCs|�dg�dS)Nr)r�)r	r
r
r�test_close_fd_0�sz$POSIXProcessTestCase.test_close_fd_0cCs|�dg�dS)Nr])r�)r	r
r
r�test_close_fd_1�sz$POSIXProcessTestCase.test_close_fd_1cCs|�dg�dS)Nr�)r�)r	r
r
r�test_close_fd_2�sz$POSIXProcessTestCase.test_close_fd_2cCs|�ddg�dS)Nrr])r�)r	r
r
r�test_close_fds_0_1�sz'POSIXProcessTestCase.test_close_fds_0_1cCs|�ddg�dS)Nrr�)r�)r	r
r
r�test_close_fds_0_2�sz'POSIXProcessTestCase.test_close_fds_0_2cCs|�ddg�dS)Nr]r�)r�)r	r
r
r�test_close_fds_1_2sz'POSIXProcessTestCase.test_close_fds_1_2cCs|�dddg�dS)Nrr]r�)r�)r	r
r
r�test_close_fds_0_1_2sz)POSIXProcessTestCase.test_close_fds_0_1_2c
Csvt�d�}t�d�}z.t�d�t�d�t�tjddg���Wdt�|d�t�|d�t�|�t�|�XdS)Nrr]z-cz*print('AssertionError:0:CLOEXEC failure.'))	r^r�r.rr'r(r)rr�)r	Z	new_stdinZ
new_stdoutr
r
r�test_small_errpipe_write_fds




z0POSIXProcessTestCase.test_small_errpipe_write_fdc

CsPdd�td�D�}�zdd�|D�}x|D]\}}t�|�q*Wt�|dd�t�|ddd�|�td��}zTx t|�D]\}}t�||�q|Wtj	t
jdd	g|d|d
|dd�}|��Wd|�
|�Xx|D]}t�|dd�q�Wt�|d
d�}t�t�|dd��}	|�|d
�|�|	d�Wdx|D]}t�|��q6WXdS)NcSsg|]}t���qSr
)rKr,)r�r�r
r
rr�sz?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rXcSsg|]\}}|�qSr
r
)r�r"r�r
r
rr�!sr]sSTDINrz-czZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")r�)r%r&ris	got STDINserr)r�r^�unlinkrNr�r��	enumerater�rr'r(r)rr�r�rrrr.)
r	�temps�temp_fdsr"r�r��temp_fdr/rnror
r
r�test_remapping_std_fdss4


z+POSIXProcessTestCase.test_remapping_std_fdsc

Cs2dd�td�D�}dd�|D�}z�x|D]\}}t�|�q(W|�td��}z�x t|�D]\}}	t�|	|�qXWt�|d�t�|dd�tj	t
jddg|||d	�}
|
��x|D]}t�|dd�q�Wt�
|d
�}t�t�
|d
��}Wd|�|�X|�|d�|�|d�Wdx|D]}t�|��qWXdS)
NcSsg|]}t���qSr
)rKr,)r�r�r
r
rr�Lsz7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rXcSsg|]\}}|�qSr
r
)r�r"r�r
r
rr�MssSTDINrz-czZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err"))r%r&ris	got STDINserr)r�r^r�r�r�r�rNr�rr'r(r)rr�rrr�rr.)
r	Zstdin_noZ	stdout_noZ	stderr_nor�r�r"r�r�r�r/rnror
r
r�check_swap_fdsJs4


z#POSIXProcessTestCase.check_swap_fdscCsX|�ddd�|�ddd�|�ddd�|�ddd�|�ddd�|�ddd�dS)Nrr]r�)r�)r	r
r
r�
test_swap_fdszsz"POSIXProcessTestCase.test_swap_fdscCsx|�td��}�zVx0|D](}t���}t�|��|�WdQRXqWttd��t|���}t�	|�dddg}i}x"t
||�D]\}}	||||	<q�Wt�d�}
ttd��t|���}t
jtjd|
t|�gf|�}|�|d�x�t
||�D]r\}}	t�|dtj�t�|d�}
ttt|
�d	���}t�d
|�d|�d|�d
|�d|	�d��}|�|	g||�q�WWd|�|�XdS)NrXr%r&rz�
                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-crir)z"
                    When testing z to z4 redirection,
                    parent descriptor z5 got redirected
                    to descriptor(s) z instead of descriptor z.
                )r�r�rKrLr^r�r��setr�r.�zipr�r�rr5r(r)rrr��SEEK_SETr�r��mapr�r�r�)r	�from_fds�to_fdsr�Zfrom_fd�fZfd_to_closeZ	arg_namesr"Zto_fdrmZ
skipped_fdr6Z
read_bytesZread_fdsrr
r
r�#_check_swap_std_fds_with_one_closed�s2



&z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedcCsDx>t�td�d�D]*}x$t�td�d�D]}|�||�q(WqWdS)NrXr�)�	itertools�combinationsr��permutationsr�)r	r�r�r
r
r�!test_swap_std_fds_with_one_closed�sz6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc
Cs�dd�}ytjtjddg|d�Wn|tk
r`}z |�tj�|�t|�d�Wdd}~XYnJtj	k
r�}z |�
tj�|�t|�d�Wdd}~XYnX|�d�dS)	NcSstd��dS)Nu
surrogate:�)rTr
r
r
r�prepare�szCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparez-cr�)r�u
surrogate:�z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)rr5r(r)rTrr�rrrZassertIsNotNonerU)r	r�ror
r
r�test_surrogates_error_message�s
 "z2POSIXProcessTestCase.test_surrogates_error_messagecCs�x�dD]�\}}|�dd�}dt|�}tj��}|||<d|d<|}tjtjd|g|d�}|�	d	�}|�
|�d�t|��|�dd�}d
t|�}tj��}|||<tjtjd|g|d�}|�	d	�}|�
|�d�t|��qWdS)N))�testuabc�)utest�Z42r)r�z&import os; print(ascii(os.getenv(%s)))�C�LC_ALLz-c)r\s

z'import os; print(ascii(os.getenvb(%s))))
r�rjr^r_r`rrCr(r)rlrr�r))r	�key�valueZ
encoded_value�scriptr\Z
decoded_valuer&r
r
r�test_undecodable_env�s*





z)POSIXProcessTestCase.test_undecodable_envcCs�t�tj�}tj�tj�\}}t�|�}t�|ddg�}|�|d�d|d}tj|dd�}|�|d�tj	�
�}||d<tj|ddg|d	�}|�|d�tj�
�}t�|�|d
<tj|ddg|d	�}|�|d�dS)Nz-cr�r�'s	' -c passT)r|�PATH)r\sPATH)r^�fsencoder(r)rur�rr5rr_r`�environb)r	Zabs_programruZprogramZexitcoder�r\Zenvbr
r
r�test_bytes_program�s 


z'POSIXProcessTestCase.test_bytes_programc	Cs�tjddd�}tjddd�}tjtj|gtjtjtjdd�}|�|jd�tjtj|gtjdd�}|��\}}t	t
t|�d	���}t	|j
��|j��|j��g�}|�||@d
|||@f�dS)Nzinput_reader.py�subprocessdata)�subdirzfd_status.pyF)r%r&rr�r�)r&r��,z5Expected no fds from %r to be open in child, found %r)r�findfilerr'r(r)r*rMrkr�r�r�r�r%r�r&rr)	r	Zsleeper�	fd_status�p1�p2rE�errorZ
result_fdsZunwanted_fdsr
r
r�test_pipe_cloexec�s
z&POSIXProcessTestCase.test_pipe_cloexecc
stjddd�}tjddd�}d}|dd}tjtj|gtjtjdd	��tjtj||g�jtjdd	��|��j	�|��j	��fd
d�}�fdd
�}|�|�|�|��j
�|��j
��t
�
�jgggd�\}}}	|�|d�|��j��|��j���j��dS)Nzqcat.pyr)rzqgrep.pyszxcvbn��
F)r%r&r�cs&y���Wntk
r YnXdS)N)r��ProcessLookupErrorr
)rr
r�kill_p1%	szBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1cs&y���Wntk
r YnXdS)N)r�rr
)rr
r�kill_p2*	szBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2r�zThe child hung)rrrr'r(r)r*r&rMrr%rNr.�selectr�rr�)
r	ZqcatZqgrepZsubdatar�r
rZ	readfilesZignored1Zignored2r
)rrr�test_pipe_cloexec_real_tools	s.



z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc
s�tjddd�}t��}|�tj|d�|�tj|d�t|��x8td�D],}t�tj	tj
�}|�tj|���|�qLWx�D]}t�|d�q�Wt
jtj|gt
jdd	�}|��\}}ttt|�d
���}|�|�@�d�t
jtj|gt
jdd	�}|��\}}ttt|�d
���}|�|�@d�|�d|d
�t�fdd�td�D��}	t
jtj|gt
jd|	d�}|��\}}ttt|�d
���}|�||	�@d�|�d|d
�dS)Nzfd_status.pyr)rrr]�	TF)r&r�rzSome fds were closedzSome fds were left openzSubprocess failedc3s|]}���VqdS)N)r�)r�r�)rr
r�	<genexpr>a	sz6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>r�)r&r��pass_fdsz'Some fds not in pass_fds were left open)rrr^r�rMr.r�r�r��devnullr��add�set_inheritablerr'r(r)r*rkr�r�r�rrrD)
r	rrr�r"r/rE�ignored�
remaining_fds�fds_to_keepr
)rr�test_close_fds=	sB

z#POSIXProcessTestCase.test_close_fdsZfreebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.cCs�tjddd�}tjtjdt�d|�gtjd�}|�	�\}}|�
�}|jt|�dd|d	�t
tt|d
���d���}t
tt|d���d���}|j||@d
d	�dS)Nzfd_status.pyr)rz-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)rrrr]zSome fds were left open.)rrrr'r(r)r�r�r*rkr�rr�r�r�r�rr�r)r	rr/rEZ
unused_stderrZoutput_linesZ
opened_fdsrr
r
r�%test_close_fds_when_max_fd_is_loweredm	s
0
z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredr�rGc
Cs:tjddd�}t�}xftd�D]Z}t��}|�tj|d�|�tj|d�t�|dd�t�|dd�|�	|�qWx�|D]�}t
jtj
|gt
jd|fd�}|��\}}ttt|�d	���}	||h}
|�||	d
�|�|	|
@d�|�t��&}|�t
jtj
dd
gd|fd��WdQRX|�dt|j��q�WdS)Nzfd_status.pyr)rrGrr]T)r&r�rrzfd to be passed not passedzfd to be closed passedz-czimport sys; sys.exit(0)F)r�rzoverriding close_fds)rrr�r�r^r�rMr.r�updaterr'r(r)r*rkr�r�r�rDrZassertWarns�RuntimeWarningr5rZwarning)r	rrr�rr"r/rErrZto_be_closed�contextr
r
r�
test_pass_fds�	s0




z"POSIXProcessTestCase.test_pass_fdsc
Cs�tjddd�}t��\}}|�tj|�|�tj|�t�|d�t�|d�||f}tj|g}|t	t
t|��7}tj
|tjd|d�}|��\}}tt
t|�d���}	|�|	t|�d|�|�t�|�d�|�t�|�d�dS)	Nzfd_status.pyr)rTF)r&r�rrz	output=%a)rrr^r�rMr.rr(r)r�r�rrr'r*rkr�r�r�rr�)
r	r�r�Znon_inheritablerr!r/rErrr
r
r�test_pass_fds_inheritable�	s"
z.POSIXProcessTestCase.test_pass_fds_inheritablec		Cs�tjddd�}g}x8td�D],}t�tjtj�}|�tj|�|�	|�qWt�
�\}}|�tj|�|�tj|�|�d|�tj
tj|g|d|d|dd|d��t�|d	�}WdQRXd
d�|�d�D�}|�|dddht|�Bd
|���dS)Nzfd_status.pyr)rr�r]rT)r%r&rr�ricSsh|]}t|��qSr
)r�)r�Znumr
r
r�	<setcomp>
sz@POSIXProcessTestCase.test_pass_fds_redirected.<locals>.<setcomp>rzoutput=)rrr�r^r�r�O_RDWRrMr.r�r��insertrr'r(r)r�r�r�	frozenset)	r	rrr�r"Zstdout_rZstdout_wrErr
r
r�test_pass_fds_redirected
s&
z-POSIXProcessTestCase.test_pass_fds_redirectedc	Cs>t�tjd��&}tjtjddg||d�}|��WdQRXdS)Nzr+z-czimport sys; sys.exit(0))r&r%)	r,r�r^rrr'r(r)r)r	�inoutr/r
r
r�%test_stdout_stdin_are_single_inout_fd
s
z:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdc	Cs>t�tjd��&}tjtjddg||d�}|��WdQRXdS)Nzr+z-czimport sys; sys.exit(0))r&r)	r,r�r^rrr'r(r)r)r	r&r/r
r
r�&test_stdout_stderr_are_single_inout_fd 
s
z;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdc	Cs>t�tjd��&}tjtjddg||d�}|��WdQRXdS)Nzr+z-czimport sys; sys.exit(0))rr%)	r,r�r^rrr'r(r)r)r	r&r/r
r
r�%test_stderr_stdin_are_single_inout_fd&
s
z:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdcCsRtjddd�}tjtj|gtjtjd�}|��\}}|�d|j	d|�
d��dS)Nzsigchild_ignore.pyr)r)r&rrz6sigchild_ignore.py exited non-zero with this error:
%szutf-8)rrrr'r(r)r*rkrr@r�)r	Zsigchild_ignorer/r&rr
r
r�test_wait_when_sigchild_ignored,
sz4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc	Cszt�d�}tjtjddgtjdd�}|j}|�|j	�z4|�
|�d�d�|�||�
|gggd�d�Wd|��XdS)	Nrz-cz$import sys;sys.stdout.write("apple")r)r&r1r
sapplg)r�
import_modulerr'r(r)r*r&rMr.rr�rDrr)r	rr/r�r
r
r�test_select_unbuffered7
s

"z+POSIXProcessTestCase.test_select_unbufferedc	Cs�tjtjddgtjtjd�}|�|jj�|�|jj�t	|�}|j
}t�dt
f��
d}WdQRXtrv|�tj�n|�|dd�tjD��dS)Nz-cz import sys, time;time.sleep(0.2))r&rrcSsg|]}t|��qSr
)�id)r��or
r
rr�^
szEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)rr'r(r)r*rMr&r.rr-�pidr�check_warnings�ResourceWarningr
rrrD)r	r/�identr/r
r
r�test_zombie_fast_process_delH
s

z1POSIXProcessTestCase.test_zombie_fast_process_delc
Cstjtjddgtjtjd�}|�|jj�|�|jj�t	|�}|j
}t�dt
f��
d}WdQRXt�|tj�tr�|�tj�n|�|dd�tjD��t�d�|�t��&tjttjtjd��}WdQRXWdQRX|�ttj|d�t�r|�tj�n|�|d	d�tjD��dS)
Nz-czimport time;time.sleep(3))r&rrcSsg|]}t|��qSr
)r-)r�r.r
r
rr�x
szJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>g�������?rcSsg|]}t|��qSr
)r-)r�r.r
r
rr��
s)rr'r(r)r*rMr&r.rr-r/rr0r1r^r$r7r�r
rrrDrrr9r�rz�waitpidr�)r	r/r2r/rr
r
r�!test_leak_fast_process_del_killed`
s0


z6POSIXProcessTestCase.test_leak_fast_process_del_killedcsxtjddd�}t�d��|�tj��tjtj	|gtj
d�fdd�d�}|��\}}tt
t|�d	���}|��|�dS)
Nzfd_status.pyr)rr]Tcst�d��S)Nr])r^r�r
)r"r
rr��
r�zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>)r&r�r�r)rrr^r�rMr.rr'r(r)r*rkr�r�r�r�r�)r	rr/rErrr
)r"r�test_close_fds_after_preexec�
s
z1POSIXProcessTestCase.test_close_fds_after_preexeccCs�ddl}t��}z�dd�}t��x�ddgddgfdgdddgfdgdgddgfdgdgddffD]L\}}}}|�t��0|�||dd	||d
d
d
d
ddd
ddd|�WdQRXqbWWd|s�t��XdS)NrcSsdS)Nr
r
r
r
rr��
r�z5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>�{sexesenvsargTr
���r]r�rXr
)r�r�r�r�r9rcr{r�)r	r��
gc_enabled�funcr!Zexe_listrZenv_listr
r
r�test_fork_exec�
s&z#POSIXProcessTestCase.test_fork_execcCs�ddl}Gdd�d�}t��}z�t��x�ddddd|d	�|d
�ffD]f}|jtd�|�d��6}|�d
gd
gd|ddgddddd	d
ddddd�WdQRX|�dt	|j
��qFWWd|s�t��XdS)Nrc@s eZdZdZdd�Zdd�ZdS)zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadIntTcSs
||_dS)N)r�)r	r�r
r
rrd�
szSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__cSs|jrd|_|jSt�dS)NF)�firstr�rT)r	r
r
r�__int__�
szRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)rrrr<rdr=r
r
r
r�BadInt�
sr>)r8r�rXr
rG)rr
)���*l)rGr
)r��rBr�r]r�zfds_to_keep={})rsfalseTsenvr8rXr
r)r�r�r�r�r9rTr�r{rDrr?r�)r	r�r>r9rrAr
r
r�%test_fork_exec_sorted_fd_sanity_check�
s0

z:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc
CsZt�tjddg�}|�:tj�|d�� }t|j_	|�
�|j��WdQRXWdQRXdS)Nz-cr�r%)rr'r(r)rrx�object�BrokenPipeErrorr.rvrkZassert_called_with)r	r�mock_proc_stdinr
r
r�,test_communicate_BrokenPipeError_stdin_close�
s
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec
Csht�tjddg�}|�Htj�|d��.}t|j_	|�
d�|j�d�|j��WdQRXWdQRXdS)Nz-cr�r%sstuff)
rr'r(r)rrxrDrErNrvrk�assert_called_once_withr.)r	rrFr
r
r�,test_communicate_BrokenPipeError_stdin_write�
s
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writecCs�tjtjdgtjtjd�}|�`tj�|d��F}tt	j
d��.}t|j_
|��|j_|�d�|j��WdQRXWdQRXWdQRXdS)Nz-h)r%r&r%�wbsstuff)rr'r(r)r*rrxrDr�r^rrEr�rvr��return_valuerkrH)r	rrFZdev_nullr
r
r�,test_communicate_BrokenPipeError_stdin_flush�
s

zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc
Csftjtjdgtjtjd�}|�>tj�|d��$}t|j	_
|jdd�|j	��WdQRXWdQRXdS)Nz-h)r%r&r%i�)r8)
rr'r(r)r*rrxrDrEr.rvrkrH)r	rrFr
r
r�9test_communicate_BrokenPipeError_stdin_close_with_timeouts
zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutN�
W_STOPCODEzneed _testcapi.W_STOPCODEc	Csxtjddg}t�|�}|j}t�|d�\}}|�|d�t�	d�}t
jd||fd��|��}WdQRX|�|d�dS)Nz-cr�rrXzsubprocess.os.waitpid)rK���)
r(r)rr'r/r^r4r�	_testcapirNrrxr)r	r!rr/�statusr@r
r
r�test_stoppeds

z!POSIXProcessTestCase.test_stoppedcCsJtjtjddgtjd�}x,y|jdd�dStjk
r@YqXqWdS)Nz-cz+import os, time; os.close(1), time.sleep(2))r&g�������?)r8)rr'r(r)r*rkr:)r	rr
r
r�1test_communicate_repeated_call_after_stdout_close"s

zFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)drrrrrlrmrnrorr'rqrrxr|r�rFrGr^rur.r�r�r�r�r�r�r�r�r�r�r�r(rKr�r�rir�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�rr	rr�stat�st_devrrZrequires_mac_verrr r%r'r(r)r*r,r3r5r6�cpython_onlyr;rCrGrIrLrMrLrPrMrRrS�
__classcell__r
r
)rgrrd�s�%


-0,)0Q"*(	
rdzWindows specific testsc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zej	dd��Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-S).�Win32ProcessTestCasecCs6d}d}t��}||_||_tjtjddg|d�dS)Nr]rXz-czimport sys; sys.exit(0))r�)r�STARTUPINFO�dwFlags�wShowWindowr5r(r))r	�STARTF_USESHOWWINDOW�SW_MAXIMIZEr�r
r
r�test_startupinfo1sz%Win32ProcessTestCase.test_startupinfocCs0d}d}tj||d�}tjtjddg|d�dS)Nr]rX)rZr[z-czimport sys; sys.exit(0))r�)rrYr5r(r))r	ZSTARTF_USERSHOWWINDOWr]r�r
r
r�test_startupinfo_keywords@sz.Win32ProcessTestCase.test_startupinfo_keywordscCs�t��}tj|_tj|_x�td�D]�}tjddg}t	t
jd��@}tj||tj
|d�}|�|��WdQRX|�|jd�WdQRX|�|jtj�|�|j�|�|j�|�|j�|�|jtj�|�|jdgi�q"WdS)Nr�z-cr�r�)r&rr�r�handle_list)rrYr\rZZSW_HIDEr[r�r(r)r�r^rr'rIrkrr@rZ	hStdInputZ
hStdOutputZ	hStdError�lpAttributeList)r	r�r�r�Znullrr
r
r�test_startupinfo_copyPs(z*Win32ProcessTestCase.test_startupinfo_copycCs(d}tj�d�tjtjd|d�dS)N�z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)")r�)r(rrNrr5r))r	ZCREATE_NEW_CONSOLEr
r
r�test_creationflagsks
z'Win32ProcessTestCase.test_creationflagscCs$|jttjtjddgdd�d�dS)Nz-czimport sys; sys.exit(47)cSsdS)Nr]r
r
r
r
rr�xr�z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>)r�)r9rTrr5r(r))r	r
r
rriss
z&Win32ProcessTestCase.test_invalid_argsc	CsBGdd�dt�}|�t��tjtjddg|�d�WdQRXdS)Nc@seZdZdZdS)z4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)rrr�keysr
r
r
r�BadEnv~srfz-cr�)r\)�dictr9rcrr'r(r))r	rfr
r
r�test_issue31471zsz$Win32ProcessTestCase.test_issue31471cCs&tjtjddgdd�}|�|d�dS)Nz-czimport sys; sys.exit(47)T)r�r4)rr5r(r)r)r	r6r
r
rr�s
z#Win32ProcessTestCase.test_close_fdsc
	Cs�ddl}t��}|�tj|d�|�tj|d�g}x(|D] }t�|d�|�|�|��q>Wtj	t
jdd�|d�gtj
dd�}|��\}}|�|jd�t|���tj	t
jdd�|d�gtj
tj
dd�}|��\}}|�|jd�|�d	|�g}t��}	d
|i|	_tj	t
jdd�|d�gtj
tj
|	dd�}|��\}}|�|jd�|�d	|�t�dtf��dt��}	d
|dd�i|	_tj	t
jdd�|d�gtj
tj
|	dd�}|��\}}|�|jd�WdQRXdS)
Nrr]Tz-cz2import msvcrt; print(msvcrt.open_osfhandle({}, 0))F)r&r�)r&rr�sOSErrorr`)r&rr�r�z.*overriding close_fds)rr^r�rMr.rr�Z
get_osfhandlerr'r(r)r�r*rkrr@r�rrDrYrarr0r)
r	rrr�r"r/r&rr`r�r
r
r�test_close_fds_with_stdio�sN







z.Win32ProcessTestCase.test_close_fds_with_stdiocCs(t��}i|_tjtjddg|d�dS)Nz-czimport sys; sys.exit(0))r�)rrYrar5r(r))r	r�r
r
r�test_empty_attribute_list�sz.Win32ProcessTestCase.test_empty_attribute_listcCs,t��}dgi|_tjtjddg|d�dS)Nr`z-czimport sys; sys.exit(0))r�)rrYrar5r(r))r	r�r
r
r�test_empty_handle_list�s
z+Win32ProcessTestCase.test_empty_handle_listc	CsNtj��}d|d<tjdgdtj|d�}|�|�d|j���WdQRXdS)N�physalisr[r�r])r|r&r\sphysalis)	r^r_r`rr'r*rDr&r�)r	rar/r
r
rr��s

z(Win32ProcessTestCase.test_shell_sequencec	CsLtj��}d|d<tjddtj|d�}|�|�d|j���WdQRXdS)Nrlr[r�r])r|r&r\sphysalis)	r^r_r`rr'r*rDr&r�)r	rar/r
r
rr��s
z&Win32ProcessTestCase.test_shell_stringc
Cs^xXdD]P}tj��}d|d<tjddtj||d�}|�|�d|j��|�WdQRXqWdS)N)�ansiZoemrlr[r�r])r|r&r\r�)	r^r_r`rr'r*rDr&r�)r	�encrar/r
r
r�test_shell_encodings�s

z)Win32ProcessTestCase.test_shell_encodingscCs t�tjd�}|�|d�dS)Nz -c "import sys; sys.exit(47)"r4)rr5r(r)r)r	r6r
r
rr��sz%Win32ProcessTestCase.test_call_stringc	Gsztjtjddgtjtjtjd�}|�@|j�d�t||�|�|��\}}|�	|d�|�
�}WdQRX|�|d�dS)Nz-cz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             time.sleep(30)
                             )r%r&rr]r�r)rr'r(r)r*r&r�r�rkrrr�)r	r�r!r/r�rr@r
r
rr��s

z"Win32ProcessTestCase._kill_processc	Gs�tjtjddgtjtjtjd�}|�J|j�d�t�d�t	||�|�|�
�\}}|�|d�|��}WdQRX|�
|d�dS)Nz-cz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             )r%r&rr]r�rA)rr'r(r)r*r&r�rrr�rkrrr)r	r�r!r/r�rr6r
r
rr�s


z'Win32ProcessTestCase._kill_dead_processcCs|�dtj�dS)Nr�)r�r7r�)r	r
r
rr�sz%Win32ProcessTestCase.test_send_signalcCs|�d�dS)Nr$)r�)r	r
r
rr�szWin32ProcessTestCase.test_killcCs|�d�dS)Nr�)r�)r	r
r
rr�sz#Win32ProcessTestCase.test_terminatecCs|�dtj�dS)Nr�)r�r7r�)r	r
r
rr�"sz*Win32ProcessTestCase.test_send_signal_deadcCs|�d�dS)Nr$)r�)r	r
r
rr�%sz#Win32ProcessTestCase.test_kill_deadcCs|�d�dS)Nr�)r�)r	r
r
rr�(sz(Win32ProcessTestCase.test_terminate_deadN)rrrr^r_rbrdrirrVrhrrirjrkr�r�ror�r�r�r�r�r�r�r�r�r
r
r
rrX.s,	1

rXc@s^eZdZGdd�dej�Zej�ejd�dd��Z	dd�Z
dd	�Zd
d�Zdd
�Z
dd�ZdS)�	MiscTestscs eZdZgZ�fdd�Z�ZS)zMiscTests.RecordingPopencst�j||�|j�|�dS)N)rerd�instances_createdr�)r	r!r")rgr
rrd1sz!MiscTests.RecordingPopen.__init__)rrrrqrdrWr
r
)rgr�RecordingPopen-srrZ_communicatecKsBt|_�ztj�tjd���}t|_tj�td|j��:|�t��$|t	j
ddgfdtji|��WdQRXWdQRXx4|jdd�D]"}|�
|tjdd�d|j���q�Wg}x(|jD]}|tjd	d�kr�|�|�q�W|j|jd
|jd�|jt|�d|jd�WdQRXWd|jj��}|��|��|�g|jj�XdS)NZ_waitr'z-czLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')r&r])r8z.no open-ended wait() after the first allowed: g�?r�)r)�KeyboardInterruptrvrrxrDrr'rrr9r(r)r�Zcall_args_listr�r5r�ZassertLessEqualZ
call_countrr�rqr�r$r)r	ZpopenerZmock__communicater"Z
mock__waitr5Zsigint_callsr;r
r
r�_test_keyboardinterrupt_no_kill5s4

"

z)MiscTests._test_keyboardinterrupt_no_killcCs|jtjdd�dS)NgT㥛� @)r8)rtrr5)r	r
r
r�#test_call_keyboardinterrupt_no_killasz-MiscTests.test_call_keyboardinterrupt_no_killcCs|jtjdd�dS)NgT㥛� @)r8)rtrrP)r	r
r
r�"test_run_keyboardinterrupt_no_killdsz,MiscTests.test_run_keyboardinterrupt_no_killcCsdd�}|�|�dS)Nc	_s tj||��
}t�WdQRXdS)N)rr'rs)r!r"Zunused_processr
r
r�popen_via_context_managerhsz[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager)rt)r	rwr
r
r�.test_context_manager_keyboardinterrupt_no_killgsz8MiscTests.test_context_manager_keyboardinterrupt_no_killc	Cs�|�t�d�d�|�t�d�d�d}z@t��}tj�|d�}t�t	rLdnd|�\}}|�
|d�Wd|dk	r|t�|�XdS)Nz
echo xyzzy�xyzzy)rryZfooztype zcat r)rrZ	getoutputZgetstatusoutputrKr�r^rurvr
r��rmdir)r	�dirr�rQrEr
r
r�test_getoutputmszMiscTests.test_getoutputcCsrddh}ttj�}t�}ddl}x<tj��D].\}}|�d�r@q,t||jf�rPq,|�	|�q,W|�
|||�dS)Nr�ZHandlerr�)r�r�__all__�types�__dict__�itemsr��
isinstance�
ModuleTyperr)r	Zintentionally_excludedZexportedZpossible_exportsr~r�r�r
r
r�test__all__�s

zMiscTests.test__all__N)rrrrr'rrrrxrDrtrurvrxr|r�r
r
r
rrp+s,rpZPollSelectorz!Test needs selectors.PollSelectorc@seZdZdd�Zdd�ZdS)�ProcessTestCaseNoPollcCstj|_tjt_t�|�dS)N)r�_PopenSelector�
orig_selector�	selectorsZSelectSelectorr$r)r	r
r
rr�szProcessTestCaseNoPoll.setUpcCs|jt_t�|�dS)N)r�rr�r$r)r	r
r
rr�szProcessTestCaseNoPoll.tearDownN)rrrrrr
r
r
rr��sr�zWindows-specific testscsPeZdZ�fdd�Z�fdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	�Z
S)�CommandsWithSpacescs>t���t�dd�\}}|��|_t�|d�t�|�dS)Nz.pyzte stsVimport sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	rerrKr,r�r�r^rNr.)r	r�r�)rgr
rr�s


zCommandsWithSpaces.setUpcst�|j�t���dS)N)r^r-r�rer)r	)rgr
rr�szCommandsWithSpaces.tearDownc	OsHtj|d<tj||�}|�$|�|j���d�d|j�WdQRXdS)Nr&�mbcsz2 [%r, 'ab cd'])rr*r'rr&r�r�r�)r	r!r"r/r
r
r�with_spaces�s
zCommandsWithSpaces.with_spacescCs |jdtj|jdfdd�dS)Nz"%s" "%s" "%s"zab cdr])r|)r�r(r)r�)r	r
r
r�test_shell_string_with_spaces�sz0CommandsWithSpaces.test_shell_string_with_spacescCs|jtj|jdgdd�dS)Nzab cdr])r|)r�r(r)r�)r	r
r
r�test_shell_sequence_with_spaces�sz2CommandsWithSpaces.test_shell_sequence_with_spacescCs|�dtj|jdf�dS)Nz"%s" "%s" "%s"zab cd)r�r(r)r�)r	r
r
r�test_noshell_string_with_spaces�sz2CommandsWithSpaces.test_noshell_string_with_spacescCs|�tj|jdg�dS)Nzab cd)r�r(r)r�)r	r
r
r�!test_noshell_sequence_with_spaces�sz4CommandsWithSpaces.test_noshell_sequence_with_spaces)rrrrrr�r�r�r�r�rWr
r
)rgrr��s		r�c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ContextManagerTestsc	Csltjtjddgtjtjd��*}|�|j��d�|�|j	��d�WdQRX|�
|jj�|�
|j	j�dS)Nz-czAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');)r&rsstdoutsstderr)rr'r(r)r*rr&r�rrr�r�)r	rr
r
r�	test_pipe�s
zContextManagerTests.test_pipec	Cs0t�tjddg��}WdQRX|�|jd�dS)Nz-czimport sys; sys.exit(100)�d)rr'r(r)rr@)r	rr
r
rrT�s


z#ContextManagerTests.test_returncodec	Cs@tjtjddgtjd��}|�d�|�|jd�WdQRXdS)Nz-cz2import sys;sys.exit(sys.stdin.read() == 'context'))r%scontextr])rr'r(r)r*rkrr@)r	rr
r
rr��s


z*ContextManagerTests.test_communicate_stdinc
Cs:|�t��&tjttjtjd��}WdQRXWdQRXdS)N)r&r)r9ryrr'rzr*)r	rr
r
rri�s
z%ContextManagerTests.test_invalid_argscCsztjtjddgtjtjdd�}|��}|j�	dtj�|�
|j�|�t
|jddd�|�|jd�|�|jj�dS)Nz-cr�r�)r%r1r0r)rr'r(r)r*rr��	__enter__r%rNrr@r9r��__exit__rr�r�)r	rr
r
r�test_broken_pipe_cleanup�sz,ContextManagerTests.test_broken_pipe_cleanupN)rrrr�rTr�rir�r
r
r
rr��s

r��__main__)8rFrr�rrr(rKr7r,r�r^r�rKrrar�rJrr�rr�r�Ztest.supportrZctypesrZctypes.utilrPZPGOZSkipTestr
r�rzr��NotADirectoryError�PermissionErrorryZTestCaser�	Exceptionrr'r r$rOrGrdrLrXrprMr�r�r�r�mainr
r
r
r�<module>s�




;}d+6