Your IP : 216.73.216.85


Current Path : /opt/alt/python35/lib64/python3.5/test/__pycache__/
Upload File :
Current File : //opt/alt/python35/lib64/python3.5/test/__pycache__/test_subprocess.cpython-35.opt-2.pyc



���]��@sddlZddlmZddlmZddlmZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZyddlZWnek
r>dZYn
XddlZyddlZWnek
rudZYnXejdkZer�dZndZGdd	�d	ej�ZGd
d�de �Z!Gdd
�d
ej"�Z#Gdd�de�Z$Gdd�de�Z%ej&ed�Gdd�de��Z'ej(ed�Gdd�de��Z)Gdd�dej�Z*ej(e+ed�d�Gdd�de$��Z,ej(ed�Gdd �d e��Z-Gd!d"�d"e�Z.d#d$�Z/e0d%krej1�dS)&�N)�mock)�
script_helper)�support�win32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);�c@s7eZdZdd�Zdd�Zddd�ZdS)�BaseTestCasecCstj�dS)N)r�
reap_children)�self�r
�4/opt/alt/python35/lib64/python3.5/test_subprocess.py�setUp2szBaseTestCase.setUpcCs?xtjD]}|j�q
Wtj�|jtjd�dS)Nzsubprocess._active not empty)�
subprocess�_active�wait�_cleanup�assertFalse)r	�instr
r
r�tearDown7s
zBaseTestCase.tearDownNcCs2tj|�}|j�}|j|||�dS)N)r�strip_python_stderr�strip�assertEqual)r	�stderr�expected�msg�actualr
r
r�assertStderrEqual=szBaseTestCase.assertStderrEqual)�__name__�
__module__�__qualname__rrrr
r
r
rr1src@seZdZdS)�PopenTestExceptionN)rrrr
r
r
rrGsrc@seZdZdd�ZdS)�PopenExecuteChildRaisescOstd��dS)NzForced Exception for Test)r)r	�args�kwargsr
r
r�_execute_childOsz&PopenExecuteChildRaises._execute_childN)rrrr#r
r
r
rr Ksr 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,�Zejed-�d.d/��Zd0d1�Zd2d3�Zd4d5�Zd6d7�Z ejed8�d9d:��Z!ejed8�d;d<��Z"d=d>�Z#eje$j%e$j&kd?�d@dA��Z'eje$j%e$j&kd?�eje(j)�dB�dCdD���Z*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;eje$j<dgkdh�eje(j=di�djk	dk�dldm���Z>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[eje\djkd��d�d���Z]eje\djkd��d�d���Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbejcedeed��d��ejcedefd��d��ejcedefd��d��d�d�����Zgejcefjhjid�efjj��d��d�d���ZkdjS)��ProcessTestCasec
Cs�tjtjddgdtjdtjdtj�}zF|j|jtj�|j|j	tj�|j|j
tj�Wd|jj�|j	j�|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_defaultUs


z+ProcessTestCase.test_io_buffered_by_defaultc
Cs�tjtjddgdtjdtjdtjdd�}zF|j|jtj�|j|j	tj�|j|j
tj�Wd|jj�|j	j�|j
j�|j�XdS)Nz-czimport sys; sys.exit(0)r%r&r�bufsizer)
r
r'r(r)r*r+r%r,�	RawIOBaser&rr.r)r	r/r
r
r�test_io_unbuffered_workscs


z(ProcessTestCase.test_io_unbuffered_workscCs/tjtjddg�}|j|d�dS)Nz-czimport sys; sys.exit(47)�/)r
�callr(r)r)r	�rcr
r
r�
test_call_seqqszProcessTestCase.test_call_seqcCs/|jtjtjtjddgdd�dS)Nz-czwhile True: pass�timeoutg�������?)�assertRaisesr
�TimeoutExpiredr5r(r))r	r
r
r�test_call_timeoutwsz!ProcessTestCase.test_call_timeoutcCs/tjtjddg�}|j|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_zerocCsO|jtj�� }tjtjddg�WdQRX|j|jjd�dS)Nz-czimport sys; sys.exit(47)r4)	r9r
�CalledProcessErrorr<r(r)r�	exception�
returncode)r	�cr
r
r�test_check_call_nonzero�sz'ProcessTestCase.test_check_call_nonzerocCs/tjtjddg�}|jd|�dS)Nz-cz
print('BDFL')sBDFL)r
�check_outputr(r)�assertIn)r	�outputr
r
r�test_check_output�sz!ProcessTestCase.test_check_outputcCsO|jtj�� }tjtjddg�WdQRX|j|jjd�dS)Nz-czimport sys; sys.exit(5)�)	r9r
r>rCr(r)rr?r@)r	rAr
r
r�test_check_output_nonzero�sz)ProcessTestCase.test_check_output_nonzerocCs8tjtjddgdtj�}|jd|�dS)Nz-cz$import sys; sys.stderr.write('BDFL')rsBDFL)r
rCr(r)�STDOUTrD)r	rEr
r
r�test_check_output_stderr�sz(ProcessTestCase.test_check_output_stderrcCsktj�}|j|j�|jd�|jd�tjtj	ddgd|�}|j
d|�dS)Nspearrz-cz6import sys; sys.stdout.write(sys.stdin.read().upper())r%sPEAR)�tempfile�
TemporaryFile�
addCleanupr.�write�seekr
rCr(r)rD)r	�tfrEr
r
r�test_check_output_stdin_arg�s

			z+ProcessTestCase.test_check_output_stdin_argcCs5tjtjddgdd�}|jd|�dS)Nz-cz6import sys; sys.stdout.write(sys.stdin.read().upper())�inputspearsPEAR)r
rCr(r)rD)r	rEr
r
r�test_check_output_input_arg�s
			z+ProcessTestCase.test_check_output_input_argcCsh|jt��8}tjtjddgdtj�}|jd�WdQRX|jd|j	j
d�dS)Nz-czprint('will not be run')r&z-Expected ValueError when stdout arg supplied.r)r9�
ValueErrorr
rCr(r)r&�failrDr?r!)r	rArEr
r
r�test_check_output_stdout_arg�sz,ProcessTestCase.test_check_output_stdout_argc
Cs�tj�}|j|j�|jd�|jd�|jt��;}tj	t
jddgd|dd�}|jd�WdQRX|j
d|jjd�|j
d|jjd�dS)	Nspearrz-czprint('will not be run')r%rRsharez7Expected ValueError when stdin and input args supplied.)rKrLrMr.rNrOr9rTr
rCr(r)rUrDr?r!)r	rPrArEr
r
r�&test_check_output_stdin_with_input_arg�s

z6ProcessTestCase.test_check_output_stdin_with_input_argcCsd|jtj��5}tjtjddgdd�}|jd�WdQRX|j|jj	d�dS)Nz-czMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)r8�zExpected TimeoutExpired.sBDFL)
r9r
r:rCr(r)rUrr?rE)r	rArEr
r
r�test_check_output_timeout�s			z)ProcessTestCase.test_check_output_timeoutcCsNtjj�}d|d<tjtjddgd|�}|j|d�dS)N�banana�FRUITz-cz5import sys, os;sys.exit(os.getenv("FRUIT")=="banana")�env�)�os�environ�copyr
r5r(r)r)r	�newenvr6r
r
r�test_call_kwargs�s
		z ProcessTestCase.test_call_kwargscCs�tj��Y}|jttjdd�tjjjj}dg|d}|jttj|�WdQRX|j	|j
�d�dS)NZinvalid_arg_namer]rr)rZcaptured_stderrr9�	TypeErrorr
r'�__init__�__code__�co_argcountr�getvalue)r	�sZargcountZ
too_many_argsr
r
r�test_invalid_args�sz!ProcessTestCase.test_invalid_argscCsttjtjddgdtjdtj�}|j|jj�|j|jj�|j	�|j
|jd�dS)Nz-czprint("banana")r&r)r
r'r(r)r*rMr&r.rrrr%)r	r/r
r
r�test_stdin_none�s
zProcessTestCase.test_stdin_nonecCs�d}tjtjd|gdtjdtj�}|j|jj�|j|jj�|j	�\}}|j
|jd|�|j
|j�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-cr&rrstest_stdout_none)
r
r'r(r)r*rMr&r.r�communicaterr@�rstrip)r	�coder/�out�errr
r
r�test_stdout_none�sz ProcessTestCase.test_stdout_nonecCsttjtjddgdtjdtj�}|j|jj�|j|jj�|j	�|j
|jd�dS)Nz-czprint("banana")r%r&)r
r'r(r)r*rMr&r.r%rrr)r	r/r
r
r�test_stderr_nones
z ProcessTestCase.test_stderr_nonecKs@|dg}tj||�}|j�|jd|j�dS)Nzimport sys; sys.exit(47)r4)r
r'rrr@)r	�pre_argsr"r!r/r
r
r�_assert_pythons

zProcessTestCase._assert_pythoncCsDtjjtjjtj�d�}|j|dgdtj�dS)N�doesnotexistz-cr))r^�path�join�dirnamer(r)rs)r	rtr
r
r�test_executable s	zProcessTestCase.test_executablecCs<tjdg}|j|�|jt|j|dd�dS)Nz-cr)rt)r(r)rsr9�FileNotFoundError)r	rrr
r
r� test_executable_takes_precedence+s
z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs |jgdtjdd�dS)Nr)�shellT)rsr(r))r	r
r
r�test_executable_replaces_shell4sz.ProcessTestCase.test_executable_replaces_shellc	Cs%tj|��tj�SWdQRXdS)N)rZ
change_cwdr^�getcwd)r	�cwdr
r
r�_normalize_cwd;szProcessTestCase._normalize_cwdcCs%tjjtj�}tjj|�S)N)r^ru�realpathr(r)�split)r	Zpython_pathr
r
r�_split_python_pathCsz"ProcessTestCase._split_python_pathcKs�tj|ddgdtj|�}|j|jj�|j�|jd|j�t	j
j}|j||�||jj�j
d���dS)Nz-cz;import os, sys; sys.stdout.write(os.getcwd()); sys.exit(47)r&r4zutf-8)r
r'r*rMr&r.rrr@r^ru�normcase�read�decode)r	Zexpected_cwdZ
python_argr"r/r�r
r
r�_assert_cwdIs		
zProcessTestCase._assert_cwdcCs8tj�}|j|�}|j|tjd|�dS)Nr~)rK�
gettempdirrr�r(r))r	�temp_dirr
r
r�test_cwdZszProcessTestCase.test_cwdz"pending resolution of issue #15533c
Cs�|j�\}}tjjtj|�}tj��d}|jtt	j
|g�|jtt	j
|gd|�|j|�}|j||d|�WdQRXdS)Nr~)
r�r^rurv�curdirr�temp_cwdr9ryr
r'rr�)r	�
python_dir�python_base�
rel_python�	wrong_dirr
r
r�test_cwd_with_relative_arg`s
z*ProcessTestCase.test_cwd_with_relative_argcCs�|j�\}}tjjtj|�}d}tj��v}|jtt	j
|gd|�|jtt	j
|gd|d|�|j|�}|j||d|d|�WdQRXdS)N�somethingyoudonthaver)r~)
r�r^rurvr�rr�r9ryr
r'rr�)r	r�r�r�Zdoesntexistr�r
r
r�!test_cwd_with_relative_executablepsz1ProcessTestCase.test_cwd_with_relative_executablec
Cs�|j�\}}tjj||�}tjjtj|�}tj��K}|jtt	j
|gd|�|j|�}|j||d|�WdQRXdS)Nr~)
r�r^rurvr�rr�r9ryr
r'rr�)r	r�r�Z
abs_pythonr�r�r
r
r�test_cwd_with_absolute_arg�sz*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblecCsD|j�\}}|j|�}|j|ddtjd|�dS)Nr�r)r~)r�rr�r(r))r	r�r�r
r
r�test_executable_with_cwd�sz(ProcessTestCase.test_executable_with_cwdz#need an installed Python. See #7774cCs#|jtj�ddtj�dS)Nr�r))r�r^r}r(r))r	r
r
r�test_executable_without_cwd�sz+ProcessTestCase.test_executable_without_cwdcCsbtjtjddgdtj�}|jjd�|jj�|j�|j	|j
d�dS)Nz-cz0import sys; sys.exit(sys.stdin.read() == "pear")r%spearr])r
r'r(r)r*r%rNr.rrr@)r	r/r
r
r�test_stdin_pipe�s	

zProcessTestCase.test_stdin_pipecCs�tj�}|j|j�|j�}tj|d�tj|dd�tj	t
jddgd|�}|j�|j
|jd�dS)Nspearrz-cz0import sys; sys.exit(sys.stdin.read() == "pear")r%r])rKrLrMr.�filenor^rN�lseekr
r'r(r)rrr@)r	rP�dr/r
r
r�test_stdin_filedes�s		
z"ProcessTestCase.test_stdin_filedescCsxtj�}|j|j�|jd�|jd�tjtj	ddgd|�}|j
�|j|jd�dS)Nspearrz-cz0import sys; sys.exit(sys.stdin.read() == "pear")r%r])
rKrLrMr.rNrOr
r'r(r)rrr@)r	rPr/r
r
r�test_stdin_fileobj�s

		
z"ProcessTestCase.test_stdin_fileobjcCsTtjtjddgdtj�}|j|jj�|j|jj	�d�dS)Nz-cz&import sys; sys.stdout.write("orange")r&sorange)
r
r'r(r)r*rMr&r.rr�)r	r/r
r
r�test_stdout_pipe�s
	z ProcessTestCase.test_stdout_pipecCs�tj�}|j|j�|j�}tjtjddgd|�}|j	�t
j|dd�|jt
j
|d�d�dS)Nz-cz&import sys; sys.stdout.write("orange")r&risorange)rKrLrMr.r�r
r'r(r)rr^r�rr�)r	rPr�r/r
r
r�test_stdout_filedes�s		
z#ProcessTestCase.test_stdout_filedescCsntj�}|j|j�tjtjddgd|�}|j�|j	d�|j
|j�d�dS)Nz-cz&import sys; sys.stdout.write("orange")r&rsorange)rKrLrMr.r
r'r(r)rrOrr�)r	rPr/r
r
r�test_stdout_fileobj�s		

z#ProcessTestCase.test_stdout_fileobjcCsTtjtjddgdtj�}|j|jj�|j|jj	�d�dS)Nz-cz*import sys; sys.stderr.write("strawberry")rs
strawberry)
r
r'r(r)r*rMrr.rr�)r	r/r
r
r�test_stderr_pipe�s
	z ProcessTestCase.test_stderr_pipecCs�tj�}|j|j�|j�}tjtjddgd|�}|j	�t
j|dd�|jt
j
|d�d�dS)Nz-cz*import sys; sys.stderr.write("strawberry")rris
strawberry)rKrLrMr.r�r
r'r(r)rr^r�rr�)r	rPr�r/r
r
r�test_stderr_filedes�s		
z#ProcessTestCase.test_stderr_filedescCsntj�}|j|j�tjtjddgd|�}|j�|j	d�|j
|j�d�dS)Nz-cz*import sys; sys.stderr.write("strawberry")rrs
strawberry)rKrLrMr.r
r'r(r)rrOrr�)r	rPr/r
r
r�test_stderr_fileobj�s		

z#ProcessTestCase.test_stderr_fileobjcCsvtjtjddgdtjdtj�}|j�\}}|j|d�|j|d�|j|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)	r
r'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_redirectcCs]tjtjddgdtjdtj�}|j|jj�|j	|jj
�d�dS)Nz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r&rsappleorange)r
r'r(r)r*rIrMr&r.rr�)r	r/r
r
r�test_stdout_stderr_pipes		z'ProcessTestCase.test_stdout_stderr_pipecCsttj�}|j|j�tjtjddgd|d|�}|j�|j	d�|j
|j�d�dS)Nz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r&rrsappleorange)rKrLrMr.r
r'r(r)rrOrr�)r	rPr/r
r
r�test_stdout_stderr_file%s		

z'ProcessTestCase.test_stdout_stderr_filecCs�d}tjtjd|gdtjdtj�}|j|jj�|j|jj�|j	�\}}|j
|jd|�|j
|j�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-cr&rrstest with stdout=1)
r
r'r(r)r*rMr&r.rrkrr@rl)r	rmr/rnror
r
r�test_stdout_filedes_of_stdout4sz-ProcessTestCase.test_stdout_filedes_of_stdoutcCsEtjtjddgdtj�}|j�|j|jd�dS)Nz-cz'for i in range(10240):print("x" * 1024)r&)r
r'r(r)�DEVNULLrrr&)r	r/r
r
r�test_stdout_devnullGs
	
z#ProcessTestCase.test_stdout_devnullcCsEtjtjddgdtj�}|j�|j|jd�dS)Nz-cz=import sys
for i in range(10240):sys.stderr.write("x" * 1024)r)r
r'r(r)r�rrr)r	r/r
r
r�test_stderr_devnullOs
	
z#ProcessTestCase.test_stderr_devnullcCsEtjtjddgdtj�}|j�|j|jd�dS)Nz-czimport sys;sys.stdin.read(1)r%)r
r'r(r)r�rrr%)r	r/r
r
r�test_stdin_devnullXs
	
z"ProcessTestCase.test_stdin_devnullc
Csstjj�}d|d<tjtjddgdtjd|��)}|j�\}}|j	|d�WdQRXdS)N�oranger[z-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT"))r&r\sorange)
r^r_r`r
r'r(r)r*rkr)r	rar/r&rr
r
r�test_env`s
		zProcessTestCase.test_envrz#cannot test an empty env on Windows�Py_ENABLE_SHAREDNz=the python library cannot be loaded with an empty environmentcCs`tjtjddgdtjdi��/}|j�\}}|j|j�d�WdQRXdS)Nz-cz)import os; print(list(os.environ.keys()))r&r\�[]�['__CF_USER_TEXT_ENCODING'])r�r�)r
r'r(r)r*rkrDr)r	r/r&rr
r
r�test_empty_envms		zProcessTestCase.test_empty_envcCsntjd}|jt��tj|ddg�WdQRX|jt��tjtjddg�WdQRXdS)N�z-c�passzpass#)r(r)r9rTr
r')r	�cmdr
r
r�test_invalid_cmds

z ProcessTestCase.test_invalid_cmdcCs`tjj�}d|d<|jt��$tjtjddgd|�WdQRXtjj�}d|d<|jt��$tjtjddgd|�WdQRXtjj�}d|d	<|jt��$tjtjddgd|�WdQRXtjj�}d
|d<tjtjddgdtj	d|��)}|j
�\}}|j|d
�WdQRXdS)NZcabbagezFRUITVEGETABLEz-cr�r\zorangeVEGETABLE=cabbager[ZlemonzFRUIT=ORANGEzorange=lemonz3import sys, os;sys.stdout.write(os.getenv("FRUIT"))r&sorange=lemon)r^r_r`r9rTr
r'r(r)r*rkr)r	rar/r&rr
r
r�test_invalid_env�s(
&
&
&
		z ProcessTestCase.test_invalid_envcCsHtjtjddgdtj�}|jd�|j|jd�dS)Nz-cz/import sys;sys.exit(sys.stdin.read() == "pear")r%spearr])r
r'r(r)r*rkrr@)r	r/r
r
r�test_communicate_stdin�s
	
z&ProcessTestCase.test_communicate_stdincCsZtjtjddgdtj�}|j�\}}|j|d�|j|d�dS)Nz-cz)import sys; sys.stdout.write("pineapple")r&s	pineapple)r
r'r(r)r*rkr)r	r/r&rr
r
r�test_communicate_stdout�s	z'ProcessTestCase.test_communicate_stdoutcCsZtjtjddgdtj�}|j�\}}|j|d�|j|d�dS)Nz-cz)import sys; sys.stderr.write("pineapple")rs	pineapple)r
r'r(r)r*rkrr)r	r/r&rr
r
r�test_communicate_stderr�s	z'ProcessTestCase.test_communicate_stderrcCs�tjtjddgdtjdtjdtj�}|j|jj�|j|jj�|j|j	j�|j
d�\}}|j|d�|j|d�dS)Nz-czNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())r%r&rsbananas	pineapple)
r
r'r(r)r*rMr&r.rr%rkrr)r	r/r&rr
r
r�test_communicate�s			z ProcessTestCase.test_communicatec
Cs�tjtjddgdddtjdtjdtj�}|jtj|jdd	d
�|j�\}}|j|d�|j	|j
�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())�universal_newlinesTr%r&rrZr8g333333�?spineapple
pear
)r
r'r(r)r*r9r:rkrr�encode)r	r/r&rr
r
r�test_communicate_timeout�s			z(ProcessTestCase.test_communicate_timeoutcCsltjtjddgdtj�}|jtj|jdd�|j�\}}|jt	|�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&r8g�������?��@i�i)
r
r'r(r)r*r9r:rkr�len)r	r/r&�_r
r
r�%test_communicate_timeout_large_output�s	z5ProcessTestCase.test_communicate_timeout_large_outputcCs
xdD]�}x�d	D]�}x�d
D]�}i}|r@tj|d<|rStj|d<|rftj|d<|soq!tjtjddf|�}|j�|jdk	r�|j|jj�|j	dk	r�|j|j	j�|j
dk	r!|j|j
j�q!WqWqWdS)NFTr%r&rz-cr�)FT)FT)FT)r
r*r'r(r)rkr%�
assertTrue�closedr&r)r	Z
stdin_pipeZstdout_pipeZstderr_pipe�optionsr/r
r
r�test_communicate_pipe_fd_leak�s(






z-ProcessTestCase.test_communicate_pipe_fd_leakcCsQtjtjddg�}|j�\}}|j|d�|j|d�dS)Nz-czimport sys; sys.exit(47))r
r'r(r)rkr)r	r/r&rr
r
r�test_communicate_returnss
z(ProcessTestCase.test_communicate_returnscCs�tj�\}}tj|�tj|�tjtjddtjgdtj	dtj	dtj	�}|j
|jj�|j
|jj�|j
|j
j�dtj}|j|�\}}|j||�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.r
r'r(r)r�
PIPE_MAX_SIZEr*rMr&rr%rkr)r	�x�yr/Zstring_to_writer&rr
r
r�test_communicate_pipe_bufs


		
z)ProcessTestCase.test_communicate_pipe_bufcCs�tjtjddgdtjdtjdtj�}|j|jj�|j|jj�|j|j	j�|j	j
d�|jd�\}}|j|d�|j
|d	�dS)
Nz-cz0import sys,os;sys.stdout.write(sys.stdin.read())r%r&rsbananassplitsbananasplitr�)r
r'r(r)r*rMr&r.rr%rNrkrr)r	r/r&rr
r
r�test_writes_before_communicate's			z.ProcessTestCase.test_writes_before_communicatecCs�tjtjddtdgdtjdtjdd�}|jjd�|jj�|j	|j
j�d�|jjd	�|jj�|j
|j
j�|j	|j
j�d
�|j	|j
jd�d	�|j	|j
j�d�dS)
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%r&r�r]zline1
zline3
zline2
�zline4
line5
line6
line7
line8)r
r'r(r)�	SETBINARYr*r%rN�flushrr&�readliner.rMr�)r	r/r
r
r�test_universal_newlines7s$
			

z'ProcessTestCase.test_universal_newlinescCs�tjtjddtdgdtjdtjdd�}|j|jj�|j|j	j�|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");rr&r�r]z#line2
line4
line5
line6
line7
line8)r
r'r(r)r�r*rMr&r.rrkr)r	r/r&rr
r
r�#test_universal_newlines_communicateZs
				z3ProcessTestCase.test_universal_newlines_communicatecCsgtjtjddttjd�gdtjdd�}|jd�\}}|j	|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)r
r'r(r)r��textwrap�dedentr*rkrr@)r	r/r&rr
r
r�)test_universal_newlines_communicate_stdinss

		z9ProcessTestCase.test_universal_newlines_communicate_stdincCsTtjtjddgdtjdtjdd�}|j�|j|jd�dS)Nz-cr�r%r&r�Tr)r
r'r(r)r*rkrr@)r	r/r
r
r�.test_universal_newlines_communicate_input_none�s			
z>ProcessTestCase.test_universal_newlines_communicate_input_nonec
Cs�tjtjddttjd�gdtjdtjdtjdd�}|j|j	j
�|j|jj
�|jd	�\}}|j
|jd
�|j
d|�|j|jd��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")
                              r%rr&r�Tzline1
line3
rzline1
line2
line3
line4
line5
zeline2
eline6
eline7
)r
r'r(r)r�r�r�r*rMr&r.rrkrr@r��
startswith)r	r/r&rr
r
r�7test_universal_newlines_communicate_stdin_stdout_stderr�s

				zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrc	s�ddl}x�ddgD]��|j}d�fdd�}d�}tjd|g}zL||_tj|d	dd
tjdtj�}|jdd
�\}}Wd||_X|j|d�qWdS)Nrzutf-16z	utf-32-beTcs�S)Nr
)�do_setlocale)�encodingr
r�getpreferredencoding�sz[ProcessTestCase.test_universal_newlines_communicate_encodings.<locals>.getpreferredencodingz@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))z-cr�r%r&rRrz1
2
3
4)	�_bootlocaler�r(r)r
r'r*rkr)	r	r�Zold_getpreferredencodingr�rmr!�popenr&rr
)r�r�-test_universal_newlines_communicate_encodings�s			
z=ProcessTestCase.test_universal_newlines_communicate_encodingsc
Cs�tsd}nd}g}tj�}zCx�t|�D]�}y?tjj|tj�}|j	tj
|tjtjB��Wq7t
k
r�}z|jtjkr��PWYdd}~Xq7Xq7W|jd|�x'td�D]}tj|j��q�Wxmtd�D]_}tjtjddgdtjd	tjd
tj�}|jd�d}|j|d�qWWdx|D]}	tj|	�qtWtj|�XdS)
Niiz4failed to reach the file descriptor limit (tried %d)�
�z-cz-import sys;sys.stdout.write(sys.stdin.read())r%r&rslimer)�	mswindowsrK�mkdtemp�ranger^rurvrZTESTFN�append�open�O_WRONLY�O_CREAT�OSError�errnoZEMFILE�skipTestr.�popr
r'r(r)r*rkr�shutil�rmtree)
r	Zmax_handlesZhandlesZtmpdir�iZtmpfile�er/�data�hr
r
r�test_no_leaking�s:	'				
zProcessTestCase.test_no_leakingcCs|jtjdddg�d�|jtjdddg�d�|jtjdddg�d	�|jtjd
ddg�d
�|jtjdddg�d�|jtjdddg�d�|jtjdddg�d�|jtjddg�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 e�abrzab "")rr
�list2cmdline)r	r
r
r�test_list2cmdline�s z!ProcessTestCase.test_list2cmdlinecCs�tjtjddgdtj�}|j|jj�|j|j	��t
j|jj�d�|j
�|j|j	�d�dS)Nz-czimport os; os.read(0, 1)r%�Ar)r
r'r(r)r*rMr%r.�assertIsNone�pollr^rNr�rr)r	r/r
r
r�	test_polls	
zProcessTestCase.test_pollcCsKtjtjddg�}|j|j�d�|j|j�d�dS)Nz-cr�r)r
r'r(r)rr)r	r/r
r
r�	test_waitszProcessTestCase.test_waitcCs�tjtjddg�}|jtj��}|jdd�WdQRX|jdt|j	��|j
|jdd�d�dS)Nz-czimport time; time.sleep(0.3)r8g-C��6?z0.0001rXr)r
r'r(r)r9r:rrD�strr?r)r	r/rAr
r
r�test_wait_timeoutsz!ProcessTestCase.test_wait_timeoutcCs7|jt��!tjtjddgd�WdQRXdS)Nz-cr�r�)r9rcr
r'r(r))r	r
r
r�test_invalid_bufsizesz$ProcessTestCase.test_invalid_bufsizecCsotjtjddgd�}|j|j�d�tjtjddgdd�}|j|j�d�dS)Nz-cr�rr1)r
r'r(r)rr)r	r/r
r
r�test_bufsize_is_none$s!z$ProcessTestCase.test_bufsize_is_nonecCs�tjtjddgdtjdtjdtjddd|��k}|jj|�tj	|jj
��|jj�}y|jj	�Wnt
k
r�YnXd|_WdQRX|j|jd	�|j||�dS)
Nz-czDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r%r&rr1r]r�r)r
r'r(r)r*r�r%rNr^r.r�r&r�r�rr@)r	�linerr�r/Z	read_liner
r
r�_test_bufsize_equal_one,s 			
z'ProcessTestCase._test_bufsize_equal_onecCs d}|j||dd�dS)Nzline
r�T)r)r	rr
r
r� test_bufsize_equal_one_text_modeAsz0ProcessTestCase.test_bufsize_equal_one_text_modecCs-dtjj�}|j|ddd�dS)Nsliner�r�F)r^�linesepr�r)r	rr
r
r�"test_bufsize_equal_one_binary_modeGsz2ProcessTestCase.test_bufsize_equal_one_binary_modecCs}xvtd�D]h}|jt��)}tjdgdtjdtj�WdQRX|jjtjtj	fkr
|j�q
WdS)Ni�nonexisting_i_hoper&r)
r�r9r�r
r'r*r?r��ENOENTZEACCES)r	r�rAr
r
r�test_leaking_fds_on_errorMs	z)ProcessTestCase.test_leaking_fds_on_errorzthreading requiredcs�g��fdd�}tjd|�}|j�zF|jt��0tjdgdtjdtjdtj�WdQRXWd|j�d}xM�D]E}yt	j
|�Wq�tk
r�}z|}WYdd}~Xq�Xq�W|dk	r�|�XdS)Ncs;x4td�D]&}�jtj��tjd�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�targetrr%r&r)�	threading�Thread�startr9�EnvironmentErrorr
r'r*rvr^r.r�)r	r�t�exc�fdr�r
)rr�test_double_close_on_error\s&
		

z*ProcessTestCase.test_double_close_on_errorcs�tjtjddg��|j�jd�g���fdd�}tjd|�}|j�t	rtd}nd}�j
dd	�|j�j|d
d��j
�|j�j|d
d�|j�|jdd|fd|fg��dS)Nz-czimport time; time.sleep(12)csg�jd�j�f��j��j��jd�jf��j��jd�jf�dS)Nzthread-start-poll-resultzthread-after-kill-and-waitzthread-after-second-wait)r�r��killrr@r
)�proc�resultsr
r�kill_proc_timer_thread�s


zDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_threadg�������?r]�	r8r
rz*unexpected result in wait from main threadz&unexpected result in second main wait.�thread-start-poll-resultzthread-after-kill-and-waitzthread-after-second-waiti����)rN)r
r'r(r)rr@r�Timerrr�rrv)r	rrZexpected_errorcoder
)rrr�test_threadsafe_waitzs*
	

		z$ProcessTestCase.test_threadsafe_waitcCsMdjd�}tjtjd|g�}|j|jd�t|��dS)N�;�import subprocess, sys�Jretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])�assert retcode == 0z-csHello World!)r"r#r$)rvr
rCr(r)r�r��ascii)r	rmrEr
r
r�test_issue8780�s	zProcessTestCase.test_issue8780cCstj�\}}tj�\}}tj�\}}y&tjdgd|d|d|�Wn`tk
r�tj|�tj|�tj|�tj|�tj|�tj|�YnX|jtj	j
|��|jtj	j
|��|jtj	j
|��dS)N�*r%r&r)rK�mkstempr
r'r�r^r.�removerru�exists)r	ZifhandleZifnameZofhandleZofnameZefhandleZefnamer
r
r� test_handles_closed_on_exception�s 





z0ProcessTestCase.test_handles_closed_on_exceptioncCs�tjtjddgdtjdtjdtj�}|j|jj�|j|jj�|j|j	j�|j
dd	�dS)
Nz-cr�r%r&r�x�r
i)r
r'r(r)r*rMr&r.rr%rk)r	r/r
r
r�test_communicate_epipe�s		z&ProcessTestCase.test_communicate_epipecCsVtjtjddgdtj�}|j|jj�|j�|j	dd�dS)Nz-cr�r%r,r-r
i)
r
r'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.SIGUSR1rzRequires os.kill�getppidzRequires os.getppidc
Cs�dd�}tjtj|�}|jtjtj|�tjddg}xCdD];}|tji}tj||��}|j�WdQRXqSWdS)NcSsdS)Nr
)�signum�framer
r
r�handler�sz7ProcessTestCase.test_communicate_eintr.<locals>.handlerz-cz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r&r)r&r)	�signalr0rMr(r)r
r*r'rk)r	r4�old_handlerr!�stream�kw�processr
r
r�test_communicate_eintr�s		
z&ProcessTestCase.test_communicate_eintrz/proc/%d/fdzLinux specificcCs�dtj�}tj|�}|jt��6ttjddgdtj	dtj	dtj	�WdQRXtj|�}|j
||�dS)Nz/proc/%d/fdz-cr�r%r&r)r^�getpid�listdirr9rr r(r)r
r*r)r	Zfd_directoryZfds_before_popenZfds_after_exceptionr
r
r�!test_failed_child_execute_fd_leak�sz1ProcessTestCase.test_failed_child_execute_fd_leak)lrrrr0r3r7r;r=rBrFrHrJrQrSrVrWrYrbrirjrprqrsrxrz�unittest�skipIfr�r|rr�r�r�r�r�r�r(�base_prefix�prefixr��	sysconfig�is_python_buildr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��platform�get_config_varr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr	rrr r&r+r.r/�
skipUnless�hasattrr5r^r:ru�isdirr;r=r
r
r
rr$Ss�		

			

	

# '
$$5r$c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�RunFuncTestCasecKs"tjd|g}tj||�S)Nz-c)r(r)r
�run)r	rmr"�argvr
r
r�
run_pythonszRunFuncTestCase.run_pythonc	CsJ|jd�}|j|jd�|jtj��|j�WdQRXdS)Nzimport sys; sys.exit(47)r4)rLrr@r9r
r>�check_returncode)r	�cpr
r
r�test_returncodeszRunFuncTestCase.test_returncodecCsI|jtj��}|jddd�WdQRX|j|jjd�dS)Nzimport sys; sys.exit(47)�checkTr4)r9r
r>rLrr?r@)r	rAr
r
r�
test_checkszRunFuncTestCase.test_checkcCs,|jddd�}|j|jd�dS)Nzimport sys; sys.exit(0)rPTr)rLrr@)r	rNr
r
r�test_check_zeroszRunFuncTestCase.test_check_zerocCs1|jtj��|jddd�WdQRXdS)Nzwhile True: passr8g-C��6?)r9r
r:rL)r	r
r
r�test_timeout$szRunFuncTestCase.test_timeoutcCs/|jddtj�}|jd|j�dS)Nz
print('BDFL')r&sBDFL)rLr
r*rDr&)r	rNr
r
r�test_capture_stdout,sz#RunFuncTestCase.test_capture_stdoutcCs/|jddtj�}|jd|j�dS)Nz$import sys; sys.stderr.write('BDFL')rsBDFL)rLr
r*rDr)r	rNr
r
r�test_capture_stderr1sz#RunFuncTestCase.test_capture_stderrcCsktj�}|j|j�|jd�|jd�|jdd|dtj�}|j	d|j
�dS)Nspearrz6import sys; sys.stdout.write(sys.stdin.read().upper())r%r&sPEAR)rKrLrMr.rNrOrLr
r*rDr&)r	rPrNr
r
rrQ6s

z+RunFuncTestCase.test_check_output_stdin_argcCs5|jddddtj�}|jd|j�dS)Nz6import sys; sys.stdout.write(sys.stdin.read().upper())rRspearr&sPEAR)rLr
r*rDr&)r	rNr
r
rrSAsz+RunFuncTestCase.test_check_output_input_argc
Cs�tj�}|j|j�|jd�|jd�|jtdd��"}|jdd|dd�}WdQRX|j	d|j
jd�|j	d|j
jd�dS)	Nspearrrz7Expected ValueError when stdin and input args supplied.zprint('will not be run')r%rRshare)rKrLrMr.rNrOr9rTrLrDr?r!)r	rPrArEr
r
rrWHs

z6RunFuncTestCase.test_check_output_stdin_with_input_argc
Csj|jtj��%}|jddddtj�}WdQRX|j|jjd�|j|jjd�dS)NzMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)r8rXr&sBDFL)	r9r
r:rLr*rr?rEr&)r	rArNr
r
rrYUsz)RunFuncTestCase.test_check_output_timeoutcCsEtjj�}d|d<|jdd|�}|j|jd�dS)NrZr[zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)r\�!)r^r_r`rLrr@)r	rarNr
r
r�test_run_kwargscs

	zRunFuncTestCase.test_run_kwargsN)rrrrLrOrQrRrSrTrUrQrSrWrYrWr
r
r
rrI
s
rIzPOSIX specific testscs"eZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZGdd�de
j�Zejejjd�d�dd��Zdd�Zejejdkd�dd ��Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z ejejj!d��d1�d2d3��Z"d4d5�Z#d6d7�Z$d8d9�Z%d:d;�Z&d<d=�Z'd>d?�Z(d@dA�Z)dBdC�Z*dDdE�Z+dFdG�Z,dHdI�Z-dJdK�Z.dLdM�Z/dNdO�Z0dPdQ�Z1dRdS�Z2dTdU�Z3dVdW�Z4dXdY�Z5dZd[�Z6d\d]�Z7d^d_�Z8d`da�Z9dbdc�Z:ddde�Z;dfdg�Z<ejejj!dh�o�ej=di�j>ej=dj�j>kdk�dldm��Z?e@jAdndo�dpdq��ZBdrds�ZCdtdu�ZDdvdw�ZEdxdy�ZFdzd{�ZGd|d}�ZHd~d�ZId�d��ZJd�d��ZKe@jLd�d���ZMe@jLd�d���ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRejeSd��ejejTd��d�d����ZU�S)��POSIXProcessTestCasecst�j�d|_dS)Nz/_this/pa.th/does/not/exist)�superr�_nonexistent_dir)r	)�	__class__r
rros
zPOSIXProcessTestCase.setUpcCsvytj|j�WnGtk
r]}z'|}|jdt|j�7_WYdd}~XnX|jd|j�|S)Nz: z,chdir to nonexistent directory %s succeeded.)r^�chdirrZr��strerror�reprrU)r	r��desired_exceptionr
r
r�_get_chdir_exceptionss/	z)POSIXProcessTestCase._get_chdir_exceptioncCs�|j�}y(tjtjddgd|j�}WnQtk
r�}z1|j|j|j�|j|j	|j	�WYdd}~XnX|j
d|�dS)Nz-crr~zExpected OSError: %s)r`r
r'r(r)rZr�rr�r]rU)r	r_r/r�r
r
r�test_exception_cwd�s)z'POSIXProcessTestCase.test_exception_cwdcCs�|j�}y(tjtjddgd|j�}WnQtk
r�}z1|j|j|j�|j|j	|j	�WYdd}~XnX|j
d|�dS)Nz-crr)zExpected OSError: %s)r`r
r'r(r)rZr�rr�r]rU)r	r_r/r�r
r
r�test_exception_bad_executable�s)z2POSIXProcessTestCase.test_exception_bad_executablecCs�|j�}ytj|jddg�}WnQtk
r~}z1|j|j|j�|j|j|j�WYdd}~XnX|jd|�dS)Nz-crzExpected OSError: %s)	r`r
r'rZr�rr�r]rU)r	r_r/r�r
r
r�test_exception_bad_args_0�s)z.POSIXProcessTestCase.test_exception_bad_args_0cCsBtjtjddgdd�tjtjddgdd�dS)Nz-cr�restore_signalsTF)r
r5r(r))r	r
r
r�test_restore_signals�sz)POSIXProcessTestCase.test_restore_signalscCs�y%tjtjddgdd�}Wn:tk
ra}z|jtjkrO�WYdd}~Xn2Xtjtj	��}t
|�}|j||�dS)Nz-cz)import os; print(os.getpgid(os.getpid()))�start_new_sessionT)r
rCr(r)r�r��EPERMr^�getpgidr;�int�assertNotEqual)r	rEr�Zparent_pgidZ
child_pgidr
r
r�test_start_new_session�s		
z+POSIXProcessTestCase.test_start_new_sessioncCsTtj��*tjtjddg�}|j�WdQRX|j|jt	j
�dS)Nz-czimport os; os.abort())rZSuppressCrashReportr
r'r(r)rrr@r5�SIGABRT)r	r/r
r
r�test_run_abort�s

z#POSIXProcessTestCase.test_run_abortcCs`tjtjddgdtjddd��}|j|jj�|j|jj	�d�dS)Nz-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT"))r&�
preexec_fncSstjdd�S)Nr[�apple)r^�putenvr
r
r
r�<lambda>�sz3POSIXProcessTestCase.test_preexec.<locals>.<lambda>sapple)
r
r'r(r)r*rMr&r.rr�)r	r/r
r
r�test_preexec�s		z!POSIXProcessTestCase.test_preexeccCs�dd�}y%tjtjddgd|�}Wnvtjk
rn}z|jtjd�WYdd}~XnItk
r�}z|jd|j	d�WYdd}~XnX|j
d	�dS)
NcSstd��dS)Nz'What if two swallows carried a coconut?)rTr
r
r
r�raise_it�sz=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itz-crrnz)Expected a ValueError from the preexec_fnZcoconutrzEException raised by preexec_fn did not make it to the parent process.)r
r'r(r)�SubprocessErrorr��_posixsubprocessrTrDr!rU)r	rsr/r�r
r
r�test_preexec_exception�s
*z+POSIXProcessTestCase.test_preexec_exceptionc@s(eZdZdd�Zdd�ZdS)z+POSIXProcessTestCase._TestExecuteChildPopencOs#||_tjj|||�dS)N)�	_testcaser
r'rd)r	Ztestcaser!r"r
r
rrd�s	z4POSIXProcessTestCase._TestExecuteChildPopen.__init__cOs�ztjj|||�Wddd�td�D�}zRxK|D]C}|jj||jj�|jj�|j	j�fdd�q@WWdx|D]}t
j|�q�WXXdS)NcSs%g|]}tjdtj��qS)z	/dev/zero)r^r��O_RDONLY)�.0r�r
r
r�
<listcomp>�s	zNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>�rz!At least one fd was closed early.)r
r'r#r�rw�assertNotInr%r�r&rr^r.)r	r!r"Zdevzero_fdsrr
r
rr#�s	
	
z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)rrrrdr#r
r
r
r�_TestExecuteChildPopen�sr}z	/dev/zeroz/dev/zero required.cCsgdd�}|jtj��B|j|tjddgdtjdtjdtjd|�WdQRXdS)	NcSstjd��dS)Nz-force the _execute_child() errpipe_data path.)r
rtr
r
r
rrsszWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_itz-cr�r%r&rrn)r9r
rtr}r(r)r*)r	rsr
r
r�0test_preexec_errpipe_does_not_double_close_pipes�szEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipesc
Cssdd�}tj�}tj}tj}ztj�|jtj��tjtjddgddd��|jtj�d�tj�|j	tj��tjtjddgdd	d��|j	tj�d
�|t_|j
ttjtjddgddd��t`|j
t
tjtjddgddd��Wd|t_|t_|sntj�XdS)
NcSstd��dS)Nzthis shouldn't escape)�RuntimeErrorr
r
r
r�raise_runtime_errorszPPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.raise_runtime_errorz-crrncSsdS)Nr
r
r
r
rrqszEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>z#Popen enabled gc when it shouldn't.cSsdS)Nr
r
r
r
rrqszPopen left gc disabled.cSsdS)Nr
r
r
r
rrq%scSsdS)Nr
r
r
r
rrq*s)�gc�	isenabled�disablerr
r5r(r)�enabler�r9rr'�AttributeError)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 XcCs�y ddlm}m}m}Wn2tk
rT}z|j|�WYdd}~XnX||�}|\}}||d|f�|j|||�y)tjt	j
ddgddd��Wntk
r�YnX|jd�dS)	Nr)�	getrlimit�	setrlimit�RLIMIT_NPROCz-crrncSsdS)Nr
r
r
r
rrq@sz@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>z.RLIMIT_NPROC had no effect; probably superuser)Zresourcer�r�r��ImportErrorr�rMr
r5r(r)�BlockingIOError)r	r�r�r�roZlimitsr�Zhardr
r
r�test_preexec_fork_failure1s  
z.POSIXProcessTestCase.test_preexec_fork_failurec
Cs�tj�\}}t|ddd��(}|jd�|jdtj�WdQRXtj|d�tj	|�}|j
�tj|�|j|j
d�dS)N�w�errors�surrogateescapez
#!/bin/sh
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r4)rKr(r�rNr(r)r^�chmodr
r'rr)rr@)r	r�fname�fobjr/r
r
r�test_args_stringGs
	

z%POSIXProcessTestCase.test_args_stringcCsT|jttjtjddgdd�|jttjtjddgdd�dS)Nz-czimport sys; sys.exit(47)�startupinfor4�
creationflags)r9rTr
r5r(r))r	r
r
rriUs				z&POSIXProcessTestCase.test_invalid_argscCsytjj�}d|d<tjdgdddtjd|�}|j|jj�|j	|jj
�jd�d	�dS)
Nror[zecho $FRUITr{r]r&r\s 	
sapple)r^r_r`r
r'r*rMr&r.rr�r)r	rar/r
r
r�test_shell_sequence`s
		z(POSIXProcessTestCase.test_shell_sequencecCsvtjj�}d|d<tjddddtjd|�}|j|jj�|j	|jj
�jd�d	�dS)
Nror[zecho $FRUITr{r]r&r\s 	
sapple)r^r_r`r
r'r*rMr&r.rr�r)r	rar/r
r
r�test_shell_stringjs
		z&POSIXProcessTestCase.test_shell_stringc
Cs�tj�\}}t|ddd��(}|jd�|jdtj�WdQRXtj|d�tj	|�}tj
|�|j|d�dS)Nr�r�r�z
#!/bin/sh
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r4)rKr(r�rNr(r)r^r�r
r5r)r)r	rr�r�r6r
r
r�test_call_stringts
	
z%POSIXProcessTestCase.test_call_stringc	Cs*g}xbdddgD]Q}xHddgD]:}tjj||�}tjj|�r)|j|�q)WqW|s~|jd�d}tjj|�r�tjj|�r�|j|�xm|D]e}tjdd	|d
ddtj	�}|j
|jj�|j
|jj�j�t|d
��q�WdS)Nz/binz	/usr/bin/z/usr/local/binZbashZkshz"bash or ksh required for this testz/bin/shzecho $0r)r{Tr&r%)r^rurv�isfiler�r��islinkr
r'r*rMr&r.rr�r�bytes)r	ZshellsrA�name�shr/r
r
r�test_specific_shell�s 
%

z(POSIXProcessTestCase.test_specific_shellcGs�tjtjtj�}z@tjtjddgdddtjdtjdtj�}Wdtjtj|�X|jj	d�t
||�|�|S)	Nz-cz�if 1:
                                 import sys, time
                                 sys.stdout.write('x\n')
                                 sys.stdout.flush()
                                 time.sleep(30)
                                 �	close_fdsTr%r&rr])r5�SIGINT�default_int_handlerr
r'r(r)r*r&r��getattr)r	�methodr!r6r/r
r
r�
_kill_process�s			z"POSIXProcessTestCase._kill_process�netbsd�openbsdz"Due to known OS bug (issue #16762)c
Gsztjtjddgdddtjdtjdtj�}|jjd�tjd�t	||�|�|j
�dS)	Nz-cz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             r�Tr%r&rr])r
r'r(r)r*r&r�rr
r�rk)r	r�r!r/r
r
r�_kill_dead_process�s			
z'POSIXProcessTestCase._kill_dead_processcCsQ|jdtj�}|j�\}}|jd|�|j|j�d�dS)N�send_signalsKeyboardInterruptr)r�r5r�rkrDrjr)r	r/r�rr
r
r�test_send_signal�sz%POSIXProcessTestCase.test_send_signalcCsO|jd�}|j�\}}|j|d�|j|j�tj�dS)Nrr�)r�rkrrrr5�SIGKILL)r	r/r�rr
r
r�	test_kill�szPOSIXProcessTestCase.test_killcCsO|jd�}|j�\}}|j|d�|j|j�tj�dS)N�	terminater�)r�rkrrrr5�SIGTERM)r	r/r�rr
r
r�test_terminate�sz#POSIXProcessTestCase.test_terminatecCs|jdtj�dS)Nr�)r�r5r�)r	r
r
r�test_send_signal_dead�sz*POSIXProcessTestCase.test_send_signal_deadcCs|jd�dS)Nr)r�)r	r
r
r�test_kill_dead�sz#POSIXProcessTestCase.test_kill_deadcCs|jd�dS)Nr�)r�)r	r
r
r�test_terminate_dead�sz(POSIXProcessTestCase.test_terminate_deadcCsOg}xB|D]:}tj|�}tj|�}|j|||f�q
W|S)N)r^�get_inheritable�dupr�)r	Zsave_fdsrr�inheritable�savedr
r
r�	_save_fds�s
zPOSIXProcessTestCase._save_fdscCsAx:|D]2\}}}tj||d|�tj|�qWdS)Nr�)r^�dup2r.)r	rrr�r�r
r
r�_restore_fds�sz!POSIXProcessTestCase._restore_fdsc	Cs�d}|j|�}x*|D]"\}}}|dkr|}PqWz�x|D]}tj|�qLWtjtjddgd|dtjdtj�j�\}}t	j
|�}|j||fd	�Wd|j|�XdS)
Nrz-czRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r%r&r�apple�orange)r�r�)
r�r^r.r
r'r(r)r*rkrrrr�)	r	rr%�	saved_fdsrr�r�rnror
r
r�check_close_std_fds�s"
		z(POSIXProcessTestCase.check_close_std_fdscCs|jdg�dS)Nr)r�)r	r
r
r�test_close_fd_0	sz$POSIXProcessTestCase.test_close_fd_0cCs|jdg�dS)Nr])r�)r	r
r
r�test_close_fd_1sz$POSIXProcessTestCase.test_close_fd_1cCs|jdg�dS)Nr-)r�)r	r
r
r�test_close_fd_2sz$POSIXProcessTestCase.test_close_fd_2cCs|jddg�dS)Nrr])r�)r	r
r
r�test_close_fds_0_1sz'POSIXProcessTestCase.test_close_fds_0_1cCs|jddg�dS)Nrr-)r�)r	r
r
r�test_close_fds_0_2sz'POSIXProcessTestCase.test_close_fds_0_2cCs|jddg�dS)Nr]r-)r�)r	r
r
r�test_close_fds_1_2sz'POSIXProcessTestCase.test_close_fds_1_2cCs|jdddg�dS)Nrr]r-)r�)r	r
r
r�test_close_fds_0_1_2sz)POSIXProcessTestCase.test_close_fds_0_1_2cCs�tjd�}tjd�}z=tjd�tjd�tjtjddg�j�Wdtj|d�tj|d�tj|�tj|�XdS)Nrr]z-cz*print('AssertionError:0:CLOEXEC failure.'))	r^r�r.r
r'r(r)rr�)r	Z	new_stdinZ
new_stdoutr
r
r�test_small_errpipe_write_fd s

	
z0POSIXProcessTestCase.test_small_errpipe_write_fdc
Cs�dd�td�D�}zydd�|D�}x!|D]\}}tj|�q6Wtj|dd�tj|ddd�|jtd��}ztx*t|�D]\}}tj||�q�Wtj	t
jdd	gd
|dd|dd
|d�}|j�Wd|j
|�Xx!|D]}tj|dd�qWtj|dd�}tjtj|dd��}	|j|d�|j|	d�Wdx|D]}tj|�q�WXdS)NcSsg|]}tj��qSr
)rKr()ryr�r
r
rrz7s	z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rXcSsg|]\}}|�qSr
r
)ryrr�r
r
rrz9s	r]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�r
r'r(r)rr�r�rrrr.)
r	�temps�temp_fdsrr�r��temp_fdr/rnror
r
r�test_remapping_std_fds5s4	




z+POSIXProcessTestCase.test_remapping_std_fdsc
Cs�dd�td�D�}dd�|D�}zJx!|D]\}}tj|�q6W|jtd��}z�x*t|�D]\}}	tj|	|�qxWtj|d�tj|dd�tj	t
jddgd	|d
|d|�}
|
j�x!|D]}tj|dd�q�Wtj
|d�}tjtj
|d��}Wd|j|�X|j|d
�|j|d�Wdx|D]}tj|�q�WXdS)NcSsg|]}tj��qSr
)rKr()ryr�r
r
rrzds	z7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rXcSsg|]\}}|�qSr
r
)ryrr�r
r
rrzes	sSTDINrz-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�r
r'r(r)rr�rrr�rr.)
r	Zstdin_noZ	stdout_noZ	stderr_nor�r�rr�r�r�r/rnror
r
r�check_swap_fdsbs4		


z#POSIXProcessTestCase.check_swap_fdscCsv|jddd�|jddd�|jddd�|jddd�|jddd�|jddd�dS)Nrr]r-)r�)r	r
r
r�
test_swap_fds�sz"POSIXProcessTestCase.test_swap_fdscCs�dd�}y#tjtjddgd|�Wn�tk
r|}z+|jtj�|jt|�d�WYdd}~Xn[tj	k
r�}z+|j
tj�|jt|�d�WYdd}~XnX|jd�dS)	NcSstd��dS)Nu
surrogate:�)rTr
r
r
r�prepare�szCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparez-cr�rnu
surrogate:�z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)r
r5r(r)rTr�rurr�rtZassertIsNotNonerU)r	r�ror
r
r�test_surrogates_error_message�s()z2POSIXProcessTestCase.test_surrogates_error_messagecCsfx_dD]W\}}|jdd�}dt|�}tjj�}|||<d|d	<tjjd
�r|jdd�}n|}t	j
tjd|gd
|�}|jd�}|j
|jd�t|��|jdd�}dt|�}tjj�}|||<t	j
tjd|gd
|�}|jd�}|j
|jd�t|��qWdS)N�test�abc��test��42r%r�z&import os; print(ascii(os.getenv(%s)))�C�LC_ALL�aix�latin1z-cr\s

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

	
	z)POSIXProcessTestCase.test_undecodable_envcCs2tjtj�}tjjtj�\}}tj|�}tj|ddg�}|j|d�d|d}tj|dd�}|j|d�tj	j
�}||d<tj|ddgd	|�}|j|d�tjj
�}tj|�|d
<tj|ddgd	|�}|j|d�dS)Nz-cr�r�'s	' -c passr{T�PATHr\sPATH)r^�fsencoder(r)rur�r
r5rr_r`�environb)r	Zabs_programruZprogram�exitcoder�r\Zenvbr
r
r�test_bytes_program�s 
z'POSIXProcessTestCase.test_bytes_programc	
Cs#tjddd�}tjddd�}tjtj|gdtjdtjdtjdd	�}|j|jd
�tjtj|gdtjdd	�}|j�\}}t	t
t|jd���}t	|j
j�|jj�|jj�g�}|j||@d|||@f�dS)
Nzinput_reader.py�subdir�subprocessdatazfd_status.pyr%r&rr�Fr��,z5Expected no fds from %r to be open in child, found %r)r�findfiler
r'r(r)r*rMrk�set�maprir�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
s�tjddd�}tjddd�}d}|dd}tjtj|gdtjd	tjd
d��tjtj||gd�jd	tjd
d��|j�j	�|j�j	��fdd
�}�fdd�}|j|�|j|��j
j|��j
j�t
j
�jgggd�\}}}	|j|d�|j�jj�|��jj��jj�dS)Nzqcat.pyr�r�zqgrep.pyszxcvbnr�s
r%r&r�Fcs'y�j�Wntk
r"YnXdS)N)r��ProcessLookupErrorr
)r�r
r�kill_p1s
zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1cs'y�j�Wntk
r"YnXdS)N)r�r�r
)r�r
r�kill_p2s
zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2r�zThe child hung)rr�r
r'r(r)r*r&rMrr%rNr.�selectr�rr�)
r	ZqcatZqgrepZsubdatar�r�r�Z	readfilesZignored1Zignored2r
)r�r�r�test_pipe_cloexec_real_toolss.		


'
z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc
shtjddd�}tj�}|jtj|d�|jtj|d�t|��xLtd�D]>}tjtj	tj
�}|jtj|��j|�qhWx�D]}tj|d�q�Wt
jtj|gdt
jd	d
�}|j�\}}ttt|jd���}|j|�@�d�t
jtj|gdt
jd	d�}|j�\}}ttt|jd���}|j|�@d
�|jd|d�t�fdd�td�D��}	t
jtj|gdt
jd	ddf�}|j�\}}ttt|jd���}|j||	@�@d�|jd|d�dS)Nzfd_status.pyr�r�rr]rTr&r�Fr�zSome fds were closedzSome fds were left openzSubprocess failedc3s|]}�j�VqdS)N)r�)ryr�)rr
r�	<genexpr>Nsz6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>r{�pass_fdsz'Some fds not in pass_fds were left open)rr�r^r�rMr.r�r�r��devnullrx�add�set_inheritabler
r'r(r)r*rkr�rir�rrrD)
r	r�rr�rr/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�}tjtjdtjd|�gdtj�}|j	�\}}|j
�}|jt|�ddd	|�t
tt|d
j�jd���}t
tt|dj�jd���}|j||@dd
�dS)Nzfd_status.pyr�r�z-caK
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

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

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

        max_fd_open = max(open_fds)

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

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        r&r-rz(expected exactly two lines of output:
%rrr�r]zSome fds were left open.)rr�r
r'r(r)r�r�r*rk�
splitlinesrr�r�r�rirr�r)r	r�r/rEZ
unused_stderrZoutput_linesZ
opened_fdsr�r
r
r�%test_close_fds_when_max_fd_is_loweredZs
0((z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredr�rGcCs�tjddd�}t�}x�td�D]u}tj�}|jtj|d�|jtj|d�tj|dd�tj|dd�|j	|�q+Wx|D]�}t
jtj
|gdt
jd	dd
|f�}|j�\}}ttt|jd���}	||h}
|j||	d�|j|	|
@d
�|jt��8}|jt
jtj
ddgd	dd
|f��WdQRX|jdt|j��q�WdS)Nzfd_status.pyr�r�rGrr]Tr&r�r�r�zfd to be passed not passedzfd to be closed passedz-czimport sys; sys.exit(0)Fzoverriding close_fds)rr�r�r�r^r�rMr.r��updater
r'r(r)r*rkr�rir�rDrZassertWarns�RuntimeWarningr5r��warning)r	r�rr�rrr/rEr�r�Zto_be_closed�contextr
r
r�
test_pass_fds�s0	


z"POSIXProcessTestCase.test_pass_fdsc
CsHtjddd�}tj�\}}|jtj|�|jtj|�tj|d�tj|d�||f}tj|g}|t	t
t|��7}tj
|dtjddd|�}|j�\}}tt
t|jd	���}	|j|	t|�d
|�|jtj|�d�|jtj|�d�dS)Nzfd_status.pyr�r�TFr&r�r�r�z	output=%a)rr�r^r�rMr.r�r(r)�listr�r�r
r'r*rkr�rir�rr�)
r	r�r�Znon_inheritabler�r!r/rEr�rr
r
r�test_pass_fds_inheritable�s"	z.POSIXProcessTestCase.test_pass_fds_inheritablec
CsTtjtjd��8}tjtjddgd|d|�}|j�WdQRXdS)Nzr+z-czimport sys; sys.exit(0)r&r%)	r,r�r^r�r
r'r(r)r)r	�inoutr/r
r
r�%test_stdout_stdin_are_single_inout_fd�sz:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdc
CsTtjtjd��8}tjtjddgd|d|�}|j�WdQRXdS)Nzr+z-czimport sys; sys.exit(0)r&r)	r,r�r^r�r
r'r(r)r)r	rr/r
r
r�&test_stdout_stderr_are_single_inout_fd�sz;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdc
CsTtjtjd��8}tjtjddgd|d|�}|j�WdQRXdS)Nzr+z-czimport sys; sys.exit(0)rr%)	r,r�r^r�r
r'r(r)r)r	rr/r
r
r�%test_stderr_stdin_are_single_inout_fd�sz:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdcCsxtjddd�}tjtj|gdtjdtj�}|j�\}}|jd|j	d|j
d��dS)	Nzsigchild_ignore.pyr�r�r&rrz6sigchild_ignore.py exited non-zero with this error:
%szutf-8)rr�r
r'r(r)r*rkrr@r�)r	Zsigchild_ignorer/r&rr
r
r�test_wait_when_sigchild_ignored�s	z4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc
Cs�tjd�}tjtjddgdtjdd�}|j}|j|j	�zF|j
|jd�d�|j||j
|gggd	�d�Wd|j�XdS)
Nr�z-cz$import sys;sys.stdout.write("apple")r&r1rr�sapplg)r�
import_moduler
r'r(r)r*r&rMr.rr�rDr�r)r	r�r/�fr
r
r�test_select_unbuffered	s				-z+POSIXProcessTestCase.test_select_unbufferedcCs�tjtjddgdtjdtj�}|j|jj�|j|jj�t	|�}|j
}~|j|dd�tjD��dS)Nz-cz import sys, time;time.sleep(0.2)r&rcSsg|]}t|��qSr
)�id)ry�or
r
rrz'	s	zEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)
r
r'r(r)r*rMr&r.rr�pidrDr)r	r/�identrr
r
r�test_zombie_fast_process_del	s			z1POSIXProcessTestCase.test_zombie_fast_process_delcCs/tjtjddgdtjdtj�}|j|jj�|j|jj�t	|�}|j
}~tj|t
j�|j|dd�tjD��tjd�|jt��5}tjdgdtjdtj��}WdQRXWdQRX|jttj|d	�|j|d
d�tjD��dS)Nz-czimport time;time.sleep(3)r&rcSsg|]}t|��qSr
)r)ryrr
r
rrz;	s	zJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>g�������?rrcSsg|]}t|��qSr
)r)ryrr
r
rrzG	s	)r
r'r(r)r*rMr&r.rrrr^rr5r�rDrrr
r9r��waitpidr|)r	r/rrrArr
r
r�!test_leak_fast_process_del_killed)	s&			 
	z6POSIXProcessTestCase.test_leak_fast_process_del_killedc
s�tjddd�}tjd��|jtj��tjtj	|gdtj
ddd�fd	d
��}|j�\}}tt
t|jd���}|j�|�dS)Nzfd_status.pyr�r�r]r&r�Trncstjd��S)Nr])r^r�r
)rr
rrqS	szCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>r�)rr�r^r�rMr.r
r'r(r)r*rkr�r�rir�r|)r	r�r/rEr�r�r
)rr�test_close_fds_after_preexecI	sz1POSIXProcessTestCase.test_close_fds_after_preexecc Csddl}tj�}z�dd�}tj�x�ddgddgfdgdddgfdgdgddgfdgdgddffD]f\}}}}|jt��B|j||df||d
dddd	d
dddd|�WdQRXq�WWd|s
tj�XdS)NrcSsdS)Nr
r
r
r
rrqd	sz5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>�{sexesenvsargTr]r-rXr����rrr)rur�r�r�r9rc�	fork_execr�)r	ru�
gc_enabled�funcr!Zexe_listr~�env_listr
r
r�test_fork_execZ	s&
+z#POSIXProcessTestCase.test_fork_execc Cs
ddl}Gdd�d�}tj�}z�tj�x�ddddd|d�|d�ffD]�}|jtddj|���M}|jdgdgd|ddgddd d!ddddddd�WdQRX|jdt	|j
��qcWWd|stj�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__�	s		zRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)rrrrrdrr
r
r
r�BadInt|	srr]r-rXr�rGr����*�?r��r{rzfds_to_keep={}sfalseTsenvr�r)rr-rXr�rG)r�r��)r r!r"r%)rGr�)r�r$r$r{rrrr)rur�r�r�r9rT�formatrrDr�r?r�)r	rurrr�rAr
r
r�%test_fork_exec_sorted_fd_sanity_checkx	s0

!z:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkcCsotjtjddg�}|�Gtjj|d��*}t|j_	|j
�|jj�WdQRXWdQRXdS)Nz-cr�r%)r
r'r(r)r�patch�object�BrokenPipeErrorr.�side_effectrkZassert_called_with)r	r�mock_proc_stdinr
r
r�,test_communicate_BrokenPipeError_stdin_close�	s

zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closecCs�tjtjddg�}|�Ztjj|d��=}t|j_	|j
d�|jjd�|jj�WdQRXWdQRXdS)Nz-cr�r%sstuff)
r
r'r(r)rr(r)r*rNr+rk�assert_called_once_withr.)r	rr,r
r
r�,test_communicate_BrokenPipeError_stdin_write�	s
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writecCs�tjtjdgdtjdtj�}|�xtjj|d��[}tt	j
d��?}t|j_
|j�|j_|jd�|jj�WdQRXWdQRXWdQRXdS)Nz-hr%r&�wbsstuff)r
r'r(r)r*rr(r)r�r^r�r*r�r+r�Zreturn_valuerkr.)r	rr,Zdev_nullr
r
r�,test_communicate_BrokenPipeError_stdin_flush�	s	
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushcCs�tjtjdgdtjdtj�}|�Mtjj|d��0}t|j	_
|jdd�|j	j�WdQRXWdQRXdS)Nz-hr%r&r8i�)
r
r'r(r)r*rr(r)r*r.r+rkr.)r	rr,r
r
r�9test_communicate_BrokenPipeError_stdin_close_with_timeout�	s	zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutzctypes module requiredzTest requires sys.executablec	Csd}tjjd�}tj|�}t|d�sEtjd��tjdj	d|d|��}t
jtj
d|g�}|j�dkr�tjd	��|tjd
�7}t
jtj
d|g�}y|j�}Wn|j��YnX|jd|�|j|d�dS)NrrAZptracezptrace() requiredz�
             import ctypes
             import faulthandler
             from test.support import SuppressCrashReport

             libc = ctypes.CDLL({libc_name!r})
             libc.ptrace({PTRACE_TRACEME}, 0, 0)
        �	libc_name�PTRACE_TRACEMEz-cz ptrace() failed - unable to testz~
             with SuppressCrashReport():
                # Crash the process
                faulthandler._sigsegv()
        )�ctypes�utilZfind_libraryZCDLLrGr>ZSkipTestr�r�r&r
r'r(r)rrrjZ
assertLess)r	r4r3ZlibcrmZchildr@r
r
r�&test_child_terminated_in_stopped_state�	s(	

z;POSIXProcessTestCase.test_child_terminated_in_stopped_state)r�r�)Vrrrrr`rarbrcrerkrmrrrvr
r'r}r>r?r^rur*r~r�r(rDr�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�r�r��stat�st_devr�rZrequires_mac_verrrrrr	r
r
rrrZcpython_onlyrr'r-r/r1r2r5r)r7r
r
)r[rrXls�
+%!


-0#)0!Q" (	
rXzWindows specific testsc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS) �Win32ProcessTestCasecCsMd}d}tj�}||_||_tjtjddgd|�dS)Nr]rXz-czimport sys; sys.exit(0)r�)r
�STARTUPINFOZdwFlagsZwShowWindowr5r(r))r	ZSTARTF_USESHOWWINDOWZSW_MAXIMIZEr�r
r
r�test_startupinfo�	s		z%Win32ProcessTestCase.test_startupinfocCs4d}tjjd�tjtjdd|�dS)N�z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)"r�)r(rrNr
r5r))r	ZCREATE_NEW_CONSOLEr
r
r�test_creationflags
s
z'Win32ProcessTestCase.test_creationflagscCsc|jttjtjddgddd��|jttjtjddgdtjdd�dS)	Nz-czimport sys; sys.exit(47)rncSsdS)Nr]r
r
r
r
rrq
sz8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>r&r�T)r9rTr
r5r(r)r*)r	r
r
rri
s		
			z&Win32ProcessTestCase.test_invalid_argscCs5tjtjddgdd�}|j|d�dS)Nz-czimport sys; sys.exit(47)r�Tr4)r
r5r(r)r)r	r6r
r
rr�
s		z#Win32ProcessTestCase.test_close_fdscCsptjj�}d|d<tjdgdddtjd|�}|j|jj�|j	d|jj
��dS)	N�physalisr[r�r{r]r&r\sphysalis)r^r_r`r
r'r*rMr&r.rDr�)r	rar/r
r
rr�!
s
		z(Win32ProcessTestCase.test_shell_sequencecCsmtjj�}d|d<tjddddtjd|�}|j|jj�|j	d|jj
��dS)	Nr?r[r�r{r]r&r\sphysalis)r^r_r`r
r'r*rMr&r.rDr�)r	rar/r
r
rr�+
s
		z&Win32ProcessTestCase.test_shell_stringcCs*tjtjd�}|j|d�dS)Nz -c "import sys; sys.exit(47)"r4)r
r5r(r)r)r	r6r
r
rr�5
s
z%Win32ProcessTestCase.test_call_stringcGs�tjtjddgdtjdtjdtj�}|j|jj�|j|jj�|j|j	j�|jj
d�t||�|�|j�\}}|j
|d�|j�}|j|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)r
r'r(r)r*rMr&r.rr%r�r�rkrrrj)r	r�r!r/r�rr@r
r
rr�;
s			z"Win32ProcessTestCase._kill_processcGs�tjtjddgdtjdtjdtj�}|j|jj�|j|jj�|j|j	j�|jj
d�tjd�t
||�|�|j�\}}|j|d�|j�}|j|d�dS)	Nz-cz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             r%r&rr]r�r")r
r'r(r)r*rMr&r.rr%r�rr
r�rkrrr)r	r�r!r/r�rr6r
r
rr�R
s			
z'Win32ProcessTestCase._kill_dead_processcCs|jdtj�dS)Nr�)r�r5r�)r	r
r
rr�k
sz%Win32ProcessTestCase.test_send_signalcCs|jd�dS)Nr)r�)r	r
r
rr�n
szWin32ProcessTestCase.test_killcCs|jd�dS)Nr�)r�)r	r
r
rr�q
sz#Win32ProcessTestCase.test_terminatecCs|jdtj�dS)Nr�)r�r5r�)r	r
r
rr�t
sz*Win32ProcessTestCase.test_send_signal_deadcCs|jd�dS)Nr)r�)r	r
r
rr�w
sz#Win32ProcessTestCase.test_kill_deadcCs|jd�dS)Nr�)r�)r	r
r
rr�z
sz(Win32ProcessTestCase.test_terminate_deadN)rrrr<r>rir�r�r�r�r�r�r�r�r�r�r�r�r
r
r
rr:�	s

r:c@s(eZdZdd�Zdd�ZdS)�	MiscTestscCs�|jtjd�d�|jtjd�d�d}zZtj�}tjj|d�}tjt	rndnd|�\}}|j
|d�Wd|dk	r�tj|�XdS)Nz
echo xyzzy�xyzzyrZfooztype zcat )rrA)rr
�	getoutput�getstatusoutputrKr�r^rurvr�rj�rmdir)r	�dirr��statusrEr
r
r�test_getoutput~
szMiscTests.test_getoutputcCs�dddh}ttj�}t�}ddl}xTtjj�D]C\}}|jd�raqCt||jf�ryqC|j	|�qCW|j
|||�dS)Nr�r;ZHandlerr�)r�r
�__all__�types�__dict__�itemsr��
isinstance�
ModuleTyper�r)r	Zintentionally_excludedZexportedZpossible_exportsrIr�r�r
r
r�test__all__�
s	zMiscTests.test__all__N)rrrrGrNr
r
r
rr@}
sr@�PollSelectorz!Test needs selectors.PollSelectorc@s(eZdZdd�Zdd�ZdS)�ProcessTestCaseNoPollcCs)tj|_tjt_tj|�dS)N)r
�_PopenSelector�
orig_selector�	selectors�SelectSelectorr$r)r	r
r
rr�
szProcessTestCaseNoPoll.setUpcCs|jt_tj|�dS)N)rRr
rQr$r)r	r
r
rr�
szProcessTestCaseNoPoll.tearDownN)rrrrrr
r
r
rrP�
srPzWindows-specific testscspeZdZ�fdd�Z�fdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	�S)�CommandsWithSpacescsUt�j�tjdd�\}}|j�|_tj|d�tj|�dS)Nz.pyzte stsVimport sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	rYrrKr(�lowerr�r^rNr.)r	rr�)r[r
rr�
s

zCommandsWithSpaces.setUpcs!tj|j�t�j�dS)N)r^r)r�rYr)r	)r[r
rr�
szCommandsWithSpaces.tearDowncOs_tj|d<tj||�}|j|jj�|j|jj�jd�d|j	�dS)Nr&�mbcsz2 [%r, 'ab cd'])
r
r*r'rMr&r.rr�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])rXr(r)r�)r	r
r
r�test_shell_string_with_spaces�
sz0CommandsWithSpaces.test_shell_string_with_spacescCs&|jtj|jdgdd�dS)Nzab cdr{r])rXr(r)r�)r	r
r
r�test_shell_sequence_with_spaces�
sz2CommandsWithSpaces.test_shell_sequence_with_spacescCs$|jdtj|jdf�dS)Nz"%s" "%s" "%s"zab cd)rXr(r)r�)r	r
r
r�test_noshell_string_with_spaces�
sz2CommandsWithSpaces.test_noshell_string_with_spacescCs |jtj|jdg�dS)Nzab cd)rXr(r)r�)r	r
r
r�!test_noshell_sequence_with_spaces�
sz4CommandsWithSpaces.test_noshell_sequence_with_spaces)
rrrrrrXrYrZr[r\r
r
)r[rrU�
s		rUc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ContextManagerTestsc
Cs�tjtjddgdtjdtj��9}|j|jj�d�|j|j	j�d�WdQRX|j
|jj�|j
|j	j�dS)Nz-czAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');r&rsstdoutsstderr)r
r'r(r)r*rr&r�rrr�r�)r	rr
r
r�	test_pipe�
s		 zContextManagerTests.test_pipec
Cs<tjtjddg��}WdQRX|j|jd�dS)Nz-czimport sys; sys.exit(100)�d)r
r'r(r)rr@)r	rr
r
rrO�
sz#ContextManagerTests.test_returncodec
CsRtjtjddgdtj��'}|jd�|j|jd�WdQRXdS)Nz-cz2import sys;sys.exit(sys.stdin.read() == 'context')r%scontextr])r
r'r(r)r*rkrr@)r	rr
r
rr��
s
	
z*ContextManagerTests.test_communicate_stdincCsK|jt��5}tjdgdtjdtj��}WdQRXWdQRXdS)Nrr&r)r9ryr
r'r*)r	rArr
r
rri�
s
	z%ContextManagerTests.test_invalid_argscCs�tjtjddgdtjdtjd�}|j�}|jj	dtj�|j
|j�|jt
|jddd�|j|jd�|j|jj�dS)Nz-cr�r%r1r-r,r)r
r'r(r)r*rr��	__enter__r%rNr�r@r9r��__exit__rr�r�)r	rr
r
r�test_broken_pipe_cleanup�
s	z,ContextManagerTests.test_broken_pipe_cleanupN)rrrr^rOr�rirbr
r
r
rr]�
s

r]cCs9ttttttttf}tj	|�tj
�dS)N)r$rXr:r@rPrUr]rIrZrun_unittestr)Z
unit_testsr
r
r�	test_mains	
rc�__main__)2r>rZtest.supportrr�rr
r(rDr5r,�localer^r�rKr�rerSrB�warningsr�r�r�r�r5r�Zctypes.utilrr�r�ZTestCaser�	Exceptionrr'r r$rIr?rXrFr:r@rGrPrUr]rcr�mainr
r
r
r�<module>sz

	�����_������$+6