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: //proc/thread-self/root/usr/local/lib/python3.7/test/__pycache__/test_subprocess.cpython-37.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@seZdZdZdd�ZdS)�PopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when
    _execute_child fails.
    cOstd��dS)NzForced Exception for Test)r)r	�args�kwargsr
r
r�_execute_child\sz&PopenExecuteChildRaises._execute_childN)rrr�__doc__r#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	r0r
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�TimeoutExpiredr6r)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	r7r
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)r5)	r:r�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)�)	r:rr?rDr)r*rr@rA)r	rBr
r
r�test_check_output_nonzero�sz)ProcessTestCase.test_check_output_nonzerocCs(tjtjddgtjd�}|�d|�dS)Nz-cz$import sys; sys.stderr.write('BDFL'))rsBDFL)rrDr)r*�STDOUTrE)r	rFr
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�seekrrDr)r*rE)r	�tfrFr
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)rrDr)r*rE)r	rFr
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)r:�
ValueErrorrrDr)r*r'�failrEr@r!)r	rBrFr
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&rSz7Expected ValueError when stdin and input args supplied.r&rS)rLrMrNr/rOrPr:rUrrDr)r*rVrEr@r!)r	rQrBrFr
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)�)r9zExpected TimeoutExpired.sBDFL)
r:rr;rDr)r*rVrr@rF)r	rBrFr
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�copyrr6r)r*r)r	�newenvr7r
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_stderrr:�	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+rNr'r/rrrr&)r	r0r
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+rNr'r/r�communicaterrA�rstrip)r	�coder0�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+rNr'r/r&rrr)r	r0r
r
r�test_stderr_nonesz ProcessTestCase.test_stderr_nonecKs2|dg}tj|f|�}|��|�d|j�dS)Nzimport sys; sys.exit(47)r5)rr(rrrA)r	�pre_argsr"r!r0r
r
r�_assert_python%s
zProcessTestCase._assert_pythoncCs0tj�tj�tj�d�}|j|dgtjd�dS)N�doesnotexistz-c)r*)r_�path�join�dirnamer)r*rt)r	rur
r
r�test_executable-szProcessTestCase.test_executablecCs0tjdg}|�|�|jt|j|tdd�dS)Nz-cr)r*)r)r*rtr:�NONEXISTING_ERRORS�NONEXISTING_CMD)r	rsr
r
r� test_executable_takes_precedence8s


z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs|jgtjdd�dS)NT)r*�shell)rtr)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_rv�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'r5zutf-8)rr(r+rNr'r/rrrAr_rv�normcase�read�decode)r	Zexpected_cwdZ
python_argr"r0r�r
r
r�_assert_cwdWs
zProcessTestCase._assert_cwdcCs(t��}|�|�}|j|tj|d�dS)N)r�)rL�
gettempdirr�r�r)r*)r	�temp_dirr
r
r�test_cwdhs
zProcessTestCase.test_cwdcCs,t��}|�|�}|j|tjt|�d�dS)N)r�)rLr�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_rvrw�curdirr�temp_cwdr:�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_rvrwr�rr�r:r�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_rvrwr�rr�r:r�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_rr)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&rOr/rrrA)r	r0r
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^)rLrMrNr/�filenor_rO�lseekrr(r)r*rrrA)r	rQ�dr0r
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^)
rLrMrNr/rOrPrr(r)r*rrrA)r	rQr0r
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	r0r
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)rLrMrNr/r�rr(r)r*rr_r�rr�)r	rQr�r0r
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)rLrMrNr/rr(r)r*rrPrr�)r	rQr0r
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	r0r
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)rLrMrNr/r�rr(r)r*rr_r�rr�)r	rQr�r0r
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)rLrMrNr/rr(r)r*rrPrr�)r	rQr0r
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+rlrrrA)r	r0r'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+rJrr'r�)r	r0r
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)rLrMrNr/rr(r)r*rrPrr�)r	rQr0r
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+rNr'r/rrlrrArm)r	rnr0rorpr
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	r0r
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	r0r
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	r0r
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`rarr(r)r*r+rlr)r	rbr0r'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)	z+Verify that env={} is as empty as possible.cSs*d|kp(d|kp(|dkp(|�d�p(|dkS)z:Determine if an environment variable is under our control.Z	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>N)rr(r)r*r+rl�evalrr,�listr)r	r0r'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*r:rUrr()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`rar:rUrr(r)r*r+rlr)r	rbr0r'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+rlrrA)r	r0r
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+rlr)r	r0r'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+rlrr)r	r0r'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+rNr'r/rr&rlrr)r	r0r'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'rr[g333333�?)r9spineapple
pear
)rr(r)r*r+r:r;rlrr�encode)r	r0r'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�������?)r9i)
rr(r)r*r+r:r;rlr�len)r	r0r'�_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*rlr&�
assertTrue�closedr'r)r	Z
stdin_pipeZstdout_pipeZstderr_pipe�optionsr0r
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*rlr)r	r0r'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+rNr'rr&rlr)r	�x�yr0Zstring_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+rNr'r/rr&rOrlrr)r	r0r'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&rO�flushrr'�readliner/rNr�)r	r!Zextra_kwargr0r
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+rNr'r/rrlr)r	r0r'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+rlrrA)r	r0r'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+rlrrA)r	r0r
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+rNr'r/rrlrrAr�r�)r	r0r'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)rSz1
2
3
4)r)r*rr(r+rlr)r	r�rnr!�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)rSz[{}])r)r*rr(r+rlr�format)r	r�rrnr!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
rL�mkdtemp�ranger_rvrwrZTESTFN�append�open�O_WRONLY�O_CREAT�OSError�errnoZEMFILE�skipTestr/�poprr(r)r*r+rlr�shutilZrmtree)
r	Zmax_handles�handlesZtmpdir�iZtmpfile�er0�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\"brBz
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+rNr&r/�assertIsNone�pollr_rOr�rr)r	r0r
r
r�	test_poll.s

zProcessTestCase.test_pollcCs6t�tjddg�}|�|��d�|�|��d�dS)Nz-cr�r)rr(r)r*rr)r	r0r
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?)r9z0.0001rYr)rr(r)r*r:r;rrE�strr@r)r	r0rBr
r
r�test_wait_timeout?s
z!ProcessTestCase.test_wait_timeoutc	Cs.|�t��t�tjddgd�WdQRXdS)Nz-cr�r�)r:rdrr(r)r*)r	r
r
r�test_invalid_bufsizeIsz$ProcessTestCase.test_invalid_bufsizecCsNt�tjddgd�}|�|��d�tjtjddgdd�}|�|��d�dS)Nz-cr�r)r2)rr(r)r*rr)r	r0r
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'rr2r�r)rr(r)r*r+r�r&rOr_r/r�r'r�r�SuppressCrashReportr�rrA)r	�linerr�r0Z	read_liner
r
r�_test_bufsize_equal_oneWs"


z'ProcessTestCase._test_bufsize_equal_onecCsd}|j||dd�dS)Nzline
T)r�)r
)r	rr
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	rr
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�r:rzrr(r{r+)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�r{r)r*rr(r+rlrrA)r	rrnr��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�startr:�EnvironmentErrorrr(r{r+rwr_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
d	d
�|j�j|dd���
�|j�j|d
d�|��|�dd|fd|fg��dS)z?Issue21291: Popen.wait() needs to be threadsafe for returncode.z-czimport time; time.sleep(12)NcsN��d���f���������d�jf������d�jf�dS)Nzthread-start-poll-resultzthread-after-kill-and-waitzthread-after-second-wait)r�r�killrrAr
)r�resultsr
r�kill_proc_timer_thread�szDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_threadg�������?r^i����r)r9z*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*rrArZTimerrr
rrw)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!)rwrrDr)r*r�r��ascii)r	rnrFr
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)rL�mkstemprr(r�r_r/�removerrv�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+rNr'r/rr&rl)r	r0r
r
r�test_communicate_epipes
z&ProcessTestCase.test_communicate_epipecCs@tjtjddgtjd�}|�|jj�|��|�	dd�dS)Nz-cr�)r&r1i)
rr(r)r*r+rNr&r/rrl)r	r0r
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)	�signalr4rNr)r*rr+r(rl)r	r7�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)z;Test for the fork() failure fd leak reported in issue16327.z/proc/%d/fdz-cr�)r&r'rN)r_�getpid�listdirr:rr 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!)r:r�rr6rr@�filename)r	rBr
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�)r:r�rr(rr@rB)r	rBr
r
r� test_file_not_found_with_bad_cwdbsz0ProcessTestCase.test_file_not_found_with_bad_cwdN)prrrr1r4r8r<r>rCrGrIrKrRrTrWrXrZrcrjrkrqrrrtryr|�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�rrrrr	r
r
rrrrr$r(r+r0r2r3�
skipUnless�hasattrr8r_r=rv�isdirr>r@rCrFr
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)z4Run Python code in a subprocess using subprocess.runz-c)r)r*r�run)r	rnr"�argvr
r
r�
run_pythonjszRunFuncTestCase.run_pythonc	Cs<|�d�}|�|jd�|�tj��|��WdQRXdS)Nzimport sys; sys.exit(47)r5)rSrrAr:rr?Zcheck_returncode)r	�cpr
r
r�test_returncodeos
zRunFuncTestCase.test_returncodec	Cs:|�tj��}|jddd�WdQRX|�|jjd�dS)Nzimport sys; sys.exit(47)T)�checkr5)r:rr?rSrr@rA)r	rBr
r
r�
test_checkvszRunFuncTestCase.test_checkcCs |jddd�}|�|jd�dS)Nzimport sys; sys.exit(0)T)rVr)rSrrA)r	rTr
r
r�test_check_zero{szRunFuncTestCase.test_check_zeroc	Cs*|�tj��|jddd�WdQRXdS)Nzwhile True: passg-C��6?)r9)r:rr;rS)r	r
r
r�test_timeout�szRunFuncTestCase.test_timeoutcCs"|jdtjd�}|�d|j�dS)Nz
print('BDFL'))r'sBDFL)rSrr+rEr')r	rTr
r
r�test_capture_stdout�sz#RunFuncTestCase.test_capture_stdoutcCs"|jdtjd�}|�d|j�dS)Nz$import sys; sys.stderr.write('BDFL'))rsBDFL)rSrr+rEr)r	rTr
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)rLrMrNr/rOrPrSrr+rEr')r	rQrTr
r
rrR�s

z+RunFuncTestCase.test_check_output_stdin_argcCs$|jddtjd�}|�d|j�dS)Nz6import sys; sys.stdout.write(sys.stdin.read().upper())spear)rSr'sPEAR)rSrr+rEr')r	rTr
r
rrT�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&rSr&rS)rLrMrNr/rOrPr:rUrSrEr@r!)r	rQrBrFr
r
rrX�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)rY)r9r'sBDFL)	r:rr;rSr+rr@rFr')r	rBrTr
r
rrZ�sz)RunFuncTestCase.test_check_output_timeoutcCs2tj��}d|d<|jd|d�}|�|jd�dS)Nr[r\zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31))r]�!)r_r`rarSrrA)r	rbrTr
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)rSrEr'r)r	rTr
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^)
rLrMrNr/r:rUrSrEr@r!)r	rQrBrFr
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^)
rLrMrNr/r:rUrSrEr@r!)r	rQrBrFr
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)zJOutput capturing after a timeout mustn't hang forever on open filehandles.zsleep 3Tg�������?)r}r9r^NzTimeoutExpired not raised.g�?z/TimeoutExpired was delayed! Bad traceback:
```
z```)r)	rZ	monotonicrrQr;�	traceback�
format_excrVZ
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)rrrrSrUrWrXrYrZr[rRrTrXrZr]r_r`rarGrHr
rdr
r
r
rrPis 
rPzPOSIX 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_�chdirrgr��strerror�reprrV)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)z;Test error in the child raised in the parent for a bad cwd.z-cr)r�NzExpected OSError: %s)rmrr(r)r*rgr�rr�rjrV)r	rlr0r�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)zBTest error in the child raised in the parent for a bad executable.z-cr)r*NzExpected OSError: %s)rmrr(r)r*rgr�rr�rjrV)r	rlr0r�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)z?Test error in the child raised in the parent for a bad args[0].z-crNzExpected OSError: %s)	rmrr(rgr�rr�rjrV)r	rlr0r�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)rrrrqr
r
r
r�PopenNoDestructorAsrrz%subprocess._posixsubprocess.fork_execc
CsNdd�}||_tjdtd��(|�t��|�dg�WdQRXWdQRXdS)z>Test error passing done through errpipe_write in the good casecWs0|d}d�tj���}t�|d|d�dS)N�
z{:x}sOSError:�:r)r�r�ZEISDIRr�r_rO)r!�
errpipe_writeZerr_coder
r
r�proper_errorHszHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_errorzsubprocess.os.waitpid)�side_effect�non_existent_commandN)rwr�patch�ChildProcessErrorr:�IsADirectoryErrorrr)r	�	fork_execrvr
r
r�test_exception_errpipe_normalEs
z2POSIXProcessTestCase.test_exception_errpipe_normalc
snd��fdd�}||_tjdtd��*|�tj��}|�dg�WdQRXWdQRX|�t	��t
|j��dS)zZTest error passing done through errpipe_write where its not
        in the expected formats�ޭcs|d}t�|��dS)Nrsr)r_rO)r!ru)�
error_datar
r�	bad_error[szGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_errorzsubprocess.os.waitpid)rwrxN)rwrryrzr:r�SubprocessErrorrrrErkrr@)r	r|rr�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)rrD�
splitlinesr�r��assertNotEqual)r	Zdefault_proc_statusrZdefault_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)rrDr)r*r�r�ZEPERMr_�getpgidr>�intr�)r	rFr�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())rrrr(r)r*rrrAr8�SIGABRT)r	r0r
r
r�test_run_abort�s


z#POSIXProcessTestCase.test_run_abortcCsNt�ttj�d�}t|�}|�d|���|�d|�|�ttj�|�dS)Nzfake cmdr8ZSIG)rr?r�r8r�rrE�lower)r	rp�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?rrE)r	rpr�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?rrE)r	rpr�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	r0r
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?)rUr
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*r�r��_posixsubprocessrUrEr!rV)r	r�r0r�r
r
r�test_preexec_exception�s$z+POSIXProcessTestCase.test_preexec_exceptionc@s eZdZdZdd�Zdd�ZdS)z+POSIXProcessTestCase._TestExecuteChildPopenz3Used to test behavior at the end of _execute_child.cOs||_tjj|f|�|�dS)N)�	_testcaserr(re)r	Ztestcaser!r"r
r
rre�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)rrrr$rer#r
r
r
r�_TestExecuteChildPopen�sr�z	/dev/zeroz/dev/zero required.c	CsHdd�}|�tj��*|j|tjddgtjtjtj|d�WdQRXdS)z6Issue16140: Don't double close pipes on preexec error.cSst�d��dS)Nz-force the _execute_child() errpipe_data path.)rr�r
r
r
rr��szWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_itz-cr�)r&r'rr�N)r:rr�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_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�disablerrr6r)r*�enabler�r:r�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�rNrr6r)r*�BlockingIOError)r	r�r�r�rpZlimitsr�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�r5)rLr-r�rOr�
unix_shellr)r*r_�chmodrr(rr.rrA)r	r#�fname�fobjr0r
r
r�test_args_string/s

z%POSIXProcessTestCase.test_args_stringcCs<|jttjtjddgdd�|jttjtjddgdd�dS)Nz-czimport sys; sys.exit(47)r5)�startupinfo)�
creationflags)r:rUrr6r)r*)r	r
r
rrj=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`rarr(r+rr'r�r)r	rbr0r
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`rarr(r+rr'r�r)r	rbr0r
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�r5)rLr-r�rOrr�r)r*r_r�rr6r.r)r	r#r�r�r7r
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_rvrw�isfiler�r��islinkrr(r+rr'r�r�bytes)r	ZshellsrJ�name�shr0r
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^)r8�SIGINT�default_int_handlerrr(r)r*r+r'r��getattr)r	�methodr!r9r0r
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�rl)r	r�r!r0r
r
r�_kill_dead_process�s


z'POSIXProcessTestCase._kill_dead_processcCs:|�dtj�}|��\}}|�d|�|�|��d�dS)N�send_signalsKeyboardInterruptr)r�r8r�rlrEr�r)r	r0r�rr
r
r�test_send_signal�sz%POSIXProcessTestCase.test_send_signalcCs:|�d�}|��\}}|�|d�|�|��tj�dS)Nr%r�)r�rlrrrr8�SIGKILL)r	r0r�rr
r
r�	test_kill�s
zPOSIXProcessTestCase.test_killcCs:|�d�}|��\}}|�|d�|�|��tj�dS)N�	terminater�)r�rlrrrr8�SIGTERM)r	r0r�rr
r
r�test_terminate�s
z#POSIXProcessTestCase.test_terminatecCs|�dtj�dS)Nr�)r�r8r�)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+rlrrrr�)	r	rr&�	saved_fdsr#r�r�rorpr
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)z=Issue #15798: Popen should work when stdio fds are available.rr^z-cz*print('AssertionError:0:CLOEXEC failure.')N)	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
)rLr-)r�r�r
r
rr�sz?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rYcSsg|]\}}|�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_�unlinkrOr�r��	enumerater�rr(r)r*rr�r�rrrr/)
r	�temps�temp_fdsr#r�r��temp_fdr0rorpr
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
)rLr-)r�r�r
r
rr�Lsz7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rYcSsg|]\}}|�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�rOr�rr(r)r*rr�rrr�rr/)
r	Zstdin_noZ	stdout_noZ	stderr_nor�r�r#r�r�r�r0rorpr
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)NrYr&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�rLrMr_r�r��setr�r/�zipr�r�rr6r)r*rrr��SEEK_SETr�r��mapr�r�r�)r	�from_fds�to_fdsr�Zfrom_fd�fZfd_to_closeZ	arg_namesr"Zto_fdrnZ
skipped_fdr7Z
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)NrYr�)�	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:�)rUr
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)rr6r)r*rUrr�rrr�ZassertIsNotNonerV)r	r�rpr
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�rkr_r`rarrDr)r*rmrr�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*rvr�rr6rr`ra�environb)r	Zabs_programrvZprogramZexitcoder�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+rNrlr�r�r�r�r&r�r'rr)	r	Zsleeper�	fd_status�p1�p2rF�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'rNrr&rOr/�selectr�rr�)
r	ZqcatZqgrepZsubdatar�rrZ	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�rNr/r�r�r��devnullr��add�set_inheritablerr(r)r*r+rlr�r�r�rrrE)
r	rrr�r#r0rF�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)z;Confirm that issue21618 is fixed (may fail under valgrind).z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.N)rrrr(r)r*r�r�r+rlr�rr�r�r�r�rr�r)r	rr0rFZ
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�rHc
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)rrHrr^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�rNr/r�updaterr(r)r*r+rlr�r�r�rErZassertWarns�RuntimeWarningr6rZwarning)r	rrr�rr#r0rFrrZ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�rNr/rr)r*r�r�rrr(r+rlr�r�r�rr�)
r	r�r�Znon_inheritablerr!r0rFrrr
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	�}Wd
QRXdd�|�d
�D�}|�|dddht|�Bd|���d
S)z7Regression test for https://bugs.python.org/issue32270.zfd_status.pyr)rr�r^rT)r&r'rr�riNcSsh|]}t|��qSr
)r�)r�Znumr
r
r�	<setcomp>
sz@POSIXProcessTestCase.test_pass_fds_redirected.<locals>.<setcomp>rzoutput=)rrr�r_r�r�O_RDWRrNr/r�r��insertrr(r)r*r�r�r�	frozenset)	r	rrr�r#Zstdout_rZstdout_wrFrr
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	�inoutr0r
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'r0r
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'r0r
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+rlrrAr�)r	Zsigchild_ignorer0r'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'r2rsapplg)r�
import_modulerr(r)r*r+r'rNr/rr�rErr)r	rr0r�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+rNr'r/rr.�pidr�check_warnings�ResourceWarningr
rrrE)r	r0�identr0r
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+rNr'r/rr.r0rr1r2r_r%r8r�r
rrrErrr:r�r{�waitpidr�)r	r0r3r0rr
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�rNr/rr(r)r*r+rlr�r�r�r�r�)r	rr0rFrrr
)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�rYr)r�r�r�r�r:rdr|r�)r	r��
gc_enabled�funcr!Zexe_listr�Zenv_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
rre�
szSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__cSs|jrd|_|jSt�dS)NF)�firstr�rU)r	r
r
r�__int__�
szRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)rrrr=rer>r
r
r
r�BadInt�
sr?)r9r�rYrrH)rr)���*l)rHr)r��rCr�r^r�zfds_to_keep={})rsfalseTsenvr9rYrr)r�r�r�r�r:rUr�r|rErr@r�)r	r�r?r:rrBr
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*rry�object�BrokenPipeErrorr/rwrlZassert_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*rryrErFrOrwrl�assert_called_once_withr/)r	rrGr
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+rryrEr�r_rrFr�rwr��return_valuerlrI)r	rrGZdev_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�)r9)
rr(r)r*r+rryrErFr/rwrlrI)r	rrGr
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)	zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.z-cr�rrYzsubprocess.os.waitpid)rLN���)
r)r*rr(r0r_r5r�	_testcapirOrryr)r	r!rr0�statusrAr
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�������?)r9)rr(r)r*r+rlr;)r	rr
r
r�1test_communicate_repeated_call_after_stdout_close"s

zFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)drrrrrmrnrorprr(rrrryr}r�rGrHr_rvr/r�r�r�r�r�r�r�r�r�r�r�r)rLr�r�rjr�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_verr r!r&r(r)r*r+r-r4r6r7�cpython_onlyr<rDrHrJrMrNrMrQrNrSrT�
__classcell__r
r
)rhrre�s�%


-0,)0Q"*(	
rezWindows 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^rYz-czimport sys; sys.exit(0))r�)r�STARTUPINFO�dwFlags�wShowWindowr6r)r*)r	�STARTF_USESHOWWINDOW�SW_MAXIMIZEr�r
r
r�test_startupinfo1sz%Win32ProcessTestCase.test_startupinfocCs0d}d}tj||d�}tjtjddg|d�dS)Nr^rY)r[r\z-czimport sys; sys.exit(0))r�)rrZr6r)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)rrZr]r[ZSW_HIDEr\r�r)r*r�r_rr(rJrlrrArZ	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)rrOrr6r*)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�)r:rUrr6r)r*)r	r
r
rrjss
z&Win32ProcessTestCase.test_invalid_argsc	CsBGdd�dt�}|�t��tjtjddg|�d�WdQRXdS)Nc@seZdZdZdS)z4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)rrr�keysr
r
r
r�BadEnv~srgz-cr�)r])�dictr:rdrr(r)r*)r	rgr
r
r�test_issue31471zsz$Win32ProcessTestCase.test_issue31471cCs&tjtjddgdd�}|�|d�dS)Nz-czimport sys; sys.exit(47)T)r�r5)rr6r)r*r)r	r7r
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�sOSErrorra)r'rr�r�z.*overriding close_fds)rr_r�rNr/rr�Z
get_osfhandlerr(r)r*r�r+rlrrAr�rrErZrbrr1r)
r	rrr�r#r0r'rrar�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�)rrZrbr6r)r*)r	r�r
r
r�test_empty_attribute_list�sz.Win32ProcessTestCase.test_empty_attribute_listcCs,t��}dgi|_tjtjddg|d�dS)Nraz-czimport sys; sys.exit(0))r�)rrZrbr6r)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`rarr(r+rEr'r�)r	rbr0r
r
rr��s

z(Win32ProcessTestCase.test_shell_sequencec	CsLtj��}d|d<tjddtj|d�}|�|�d|j���WdQRXdS)Nrmr\r�r^)r}r'r]sphysalis)	r_r`rarr(r+rEr'r�)r	rbr0r
r
rr��s
z&Win32ProcessTestCase.test_shell_stringc
Cs^xXdD]P}tj��}d|d<tjddtj||d�}|�|�d|j��|�WdQRXqWdS)N)�ansiZoemrmr\r�r^)r}r'r]r�)	r_r`rarr(r+rEr'r�)r	�encrbr0r
r
r�test_shell_encodings�s

z)Win32ProcessTestCase.test_shell_encodingscCs t�tjd�}|�|d�dS)Nz -c "import sys; sys.exit(47)"r5)rr6r)r*r)r	r7r
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�rlrrr�)r	r�r!r0r�rrAr
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�rB)rr(r)r*r+r'r�rrr�rlrrr)r	r�r!r0r�rr7r
r
rr�s


z'Win32ProcessTestCase._kill_dead_processcCs|�dtj�dS)Nr�)r�r8r�)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�r8r�)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`rcrerjrrWrirrjrkrlr�r�rpr�r�r�r�r�r�r�r�r�r
r
r
rrY.s,	1

rYc@s^eZdZGdd�dej�Zej�ejd�dd��Z	dd�Z
dd	�Zd
d�Zdd
�Z
dd�ZdS)�	MiscTestscs$eZdZdZgZ�fdd�Z�ZS)zMiscTests.RecordingPopenz<A Popen that saves a reference to each instance for testing.cst�j||�|j�|�dS)N)rfre�instances_createdr�)r	r!r")rhr
rre1sz!MiscTests.RecordingPopen.__init__)rrrr$rrrerXr
r
)rhr�RecordingPopen-srsZ_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)
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().
        Z_waitr(z-czLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')r'Nr^)r9z.no open-ended wait() after the first allowed: g�?r�)r)�KeyboardInterruptrwrryrErr(rsr:r)r*r�Zcall_args_listr�r6r�ZassertLessEqualZ
call_countrr�rrr�r%r)r	ZpopenerZmock__communicater"Z
mock__waitr6Zsigint_callsr<r
r
r�_test_keyboardinterrupt_no_kill5s4

"

z)MiscTests._test_keyboardinterrupt_no_killcCs|jtjdd�dS)NgT㥛� @)r9)rurr6)r	r
r
r�#test_call_keyboardinterrupt_no_killasz-MiscTests.test_call_keyboardinterrupt_no_killcCs|jtjdd�dS)NgT㥛� @)r9)rurrQ)r	r
r
r�"test_run_keyboardinterrupt_no_killdsz,MiscTests.test_run_keyboardinterrupt_no_killcCsdd�}|�|�dS)Nc	_s tj||��
}t�WdQRXdS)N)rr(rt)r!r"Zunused_processr
r
r�popen_via_context_managerhsz[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager)ru)r	rxr
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)rrzZfooztype zcat r)rrZ	getoutputZgetstatusoutputrLr�r_rvrwr
r��rmdir)r	�dirr�rRrFr
r
r�test_getoutputmszMiscTests.test_getoutputcCsrddh}ttj�}t�}ddl}x<tj��D].\}}|�d�r@q,t||jf�rPq,|�	|�q,W|�
|||�dS)z*Ensure that __all__ is populated properly.rZHandlerNr�)r�r�__all__�types�__dict__�itemsr��
isinstance�
ModuleTyperr)r	Zintentionally_excludedZexportedZpossible_exportsrr�r�r
r
r�test__all__�s

zMiscTests.test__all__N)rrrrr(rsrryrErurvrwryr}r�r
r
r
rrq+s,rqZ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])))	rfrrLr-r�r�r_rOr/)r	r�r�)rhr
rr�s


zCommandsWithSpaces.setUpcst�|j�t���dS)N)r_r.r�rfr)r	)rhr
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"r0r
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�rXr
r
)rhrr��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*rrA)r	rr
r
rrU�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+rlrrA)r	rr
r
rr��s


z*ContextManagerTests.test_communicate_stdinc
Cs:|�t��&tjttjtjd��}WdQRXWdQRXdS)N)r'r)r:rzrr(r{r+)r	rr
r
rrj�s
z%ContextManagerTests.test_invalid_argscCsztjtjddgtjtjdd�}|��}|j�	dtj�|�
|j�|�t
|jddd�|�|jd�|�|jj�dS)z9Broken pipe error should not prevent wait() (Issue 21619)z-cr�r�)r&r2r1Nr)rr(r)r*r+rr��	__enter__r&rOrrAr:r��__exit__rr�r�)r	rr
r
r�test_broken_pipe_cleanup�sz,ContextManagerTests.test_broken_pipe_cleanupN)rrrr�rUr�rjr�r
r
r
rr��s

r��__main__)8rGrr�rrr)rLr8r-r�r_r�rLrrbr�rKrr�rr�r�Ztest.supportrZctypesrZctypes.utilrQZPGOZSkipTestr
r�r{r��NotADirectoryError�PermissionErrorrzZTestCaser�	Exceptionrr(r r%rPrHrerMrYrqrNr�r�r�r�mainr
r
r
r�<module>s�




;}d+6