Your IP : 216.73.217.129


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.pyc



��Yf��@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
�9/opt/alt/python35/lib64/python3.5/test/test_subprocess.py�setUp2szBaseTestCase.setUpcCs?xtjD]}|j�q
Wtj�|jtjd�dS)Nzsubprocess._active not empty)�
subprocess�_active�waitZ_cleanup�assertFalse)r	Zinstr
r
r�tearDown7s
zBaseTestCase.tearDownNcCs2tj|�}|j�}|j|||�dS)N)r�strip_python_stderr�strip�assertEqual)r	�stderr�expected�msgZactualr
r
r�assertStderrEqual=szBaseTestCase.assertStderrEqual)�__name__�
__module__�__qualname__rrrr
r
r
rr1src@seZdZdS)�PopenTestExceptionN)rrrr
r
r
rrGsrc@s"eZdZdZdd�ZdS)�PopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when
    _execute_child fails.
    cOstd��dS)NzForced Exception for Test)r)r	�args�kwargsr
r
r�_execute_childOsz&PopenExecuteChildRaises._execute_childN)rrr�__doc__r r
r
r
rrKsrc@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
�TimeoutExpiredr3r&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	r4r
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)r2)	r7r
�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)�)	r7r
r<rAr&r'rr=r>)r	r?r
r
r�test_check_output_nonzero�sz)ProcessTestCase.test_check_output_nonzerocCs8tjtjddgdtj�}|jd|�dS)Nz-cz$import sys; sys.stderr.write('BDFL')rsBDFL)r
rAr&r'�STDOUTrB)r	rCr
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
rAr&r'rB)r	�tfrCr
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
rAr&r'rB)r	rCr
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)r7�
ValueErrorr
rAr&r'r$�failrBr=r)r	r?rCr
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#rPsharez7Expected ValueError when stdin and input args supplied.)rIrJrKr,rLrMr7rRr
rAr&r'rSrBr=r)r	rNr?rCr
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)r6�zExpected TimeoutExpired.sBDFL)
r7r
r8rAr&r'rSrr=rC)r	r?rCr
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
r3r&r'r)r	�newenvr4r
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_stderrr7�	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(rKr$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(rKr$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(rKr$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)r2)r
r%rrr>)r	�pre_argsrrr-r
r
r�_assert_pythons

zProcessTestCase._assert_pythoncCsDtjjtjjtj�d�}|j|dgdtj�dS)N�doesnotexistz-cr')r\�path�join�dirnamer&r'rq)r	rrr
r
r�test_executable s	zProcessTestCase.test_executablecCs<tjdg}|j|�|jt|j|dd�dS)Nz-cr'rr)r&r'rqr7�FileNotFoundError)r	rpr
r
r� test_executable_takes_precedence+s
z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs |jgdtjdd�dS)Nr'�shellT)rqr&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\rs�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$r2zutf-8)r
r%r(rKr$r,rrr>r\rs�normcase�read�decode)r	Zexpected_cwdZ
python_argrr-r�r
r
r�_assert_cwdIs		
zProcessTestCase._assert_cwdcCs8tj�}|j|�}|j|tjd|�dS)Nr|)rIZ
gettempdirr}r�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\rsrt�curdirr�temp_cwdr7rwr
r%r}r�)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\rsrtr�rr�r7rwr
r%r}r�)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\rsrtr�rr�r7rwr
r%r}r�)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�r}r�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#rLr,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[)rIrJrKr,�filenor\rL�lseekr
r%r&r'rrr>)r	rN�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[)
rIrJrKr,rLrMr
r%r&r'rrr>)r	rNr-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(rKr$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)rIrJrKr,r�r
r%r&r'rr\r�rr�)r	rNr�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)rIrJrKr,r
r%r&r'rrMrr�)r	rNr-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(rKrr,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)rIrJrKr,r�r
r%r&r'rr\r�rr�)r	rNr�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)rIrJrKr,r
r%r&r'rrMrr�)r	rNr-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(rirrr>)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(rGrKr$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)rIrJrKr,r
r%r&r'rrMrr�)r	rNr-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(rKr$r,rrirr>rj)r	rkr-rlrmr
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�orangerYz-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT"))r$rZsorange)
r\r]r^r
r%r&r'r(rir)r	r_r-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$rZ�[]�['__CF_USER_TEXT_ENCODING'])r�r�)r
r%r&r'r(rirBr)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'r7rRr
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�rZzorangeVEGETABLE=cabbagerYZlemonzFRUIT=ORANGEzorange=lemonz3import sys, os;sys.stdout.write(os.getenv("FRUIT"))r$sorange=lemon)r\r]r^r7rRr
r%r&r'r(rir)r	r_r-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(rirr>)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(rir)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(rirr)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(rKr$r,rr#rirr)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$rrXr6g333333�?spineapple
pear
)r
r%r&r'r(r7r8rirr�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$r6g�������?��@i�i)
r
r%r&r'r(r7r8rir�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'rir#�
assertTrue�closedr$r)r	Z
stdin_pipeZstdout_pipeZstderr_pipeZoptionsr-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'rir)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(rKr$rr#rir)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(rKr$r,rr#rLrirr)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#rL�flushrr$�readliner,rKr�)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(rKr$r,rrir)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(rirr>)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(rirr>)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(rKr$r,rrirr>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$rPrz1
2
3
4)	�_bootlocaler�r&r'r
r%r(rir)	r	r�Zold_getpreferredencodingr�rkr�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)�	mswindowsrI�mkdtemp�ranger\rsrtrZTESTFN�append�open�O_WRONLY�O_CREAT�OSError�errnoZEMFILE�skipTestr,�popr
r%r&r'r(rir�shutilZrmtree)
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\"br?z
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_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(rKr#r,�assertIsNone�pollr\rLr�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)r6g-C��6?z0.0001rVr)r
r%r&r'r7r8rrB�strr=r)r	r-r?r
r
r�test_wait_timeoutsz!ProcessTestCase.test_wait_timeoutcCs7|jt��!tjtjddgd�WdQRXdS)Nz-cr�r�)r7rar
r%r&r')r	r
r
r�test_invalid_bufsizesz$ProcessTestCase.test_invalid_bufsizecCsotjtjddgd�}|j|j�d�tjtjddgdd�}|j|j�d�dS)Nz-cr�rr/)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$rr/r[r�r)r
r%r&r'r(r�r#rLr\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	r�r
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	r�r
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�r7r�r
r%r(r=r��ENOENTZEACCES)r	r�r?r
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)�	threadingZThread�startr7�EnvironmentErrorr
r%r(rtr\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
d	d
�|j�j|dd��j
�|j�j|dd
�|j�|jdd|fd|fg��dS)z?Issue21291: Popen.wait() needs to be threadsafe for returncode.z-czimport time; time.sleep(12)Ncsg�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[�	r6rrz*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>rZTimerrr�rrt)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!)rrr)rtr
rAr&r'r�r��ascii)r	rkrCr
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)rI�mkstempr
r%r�r\r,�removerrs�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�ri)r
r%r&r'r(rKr$r,rr#ri)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%ri)
r
r%r&r'r(rKr#r,rri)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
)Zsignum�framer
r
r�handler�sz7ProcessTestCase.test_communicate_eintr.<locals>.handlerz-cz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r$r)r$r)	�signalr(rKr&r'r
r(r%ri)r	r+�old_handlerr�stream�kwZprocessr
r
r�test_communicate_eintr�s		
z&ProcessTestCase.test_communicate_eintrz/proc/%d/fdzLinux specificcCs�dtj�}tj|�}|jt��6ttjddgdtj	dtj	dtj	�WdQRXtj|�}|j
||�dS)z;Test for the fork() failure fd leak reported in issue16327.z/proc/%d/fdz-cr�r#r$rN)r\�getpid�listdirr7rrr&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)lrrrr.r1r5r9r;r@rDrFrHrOrQrTrUrWr`rgrhrnrorqrvrx�unittest�skipIfr�rzr}r�r�r�r�r�r�r&�base_prefix�prefixr��	sysconfig�is_python_buildr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��platform�get_config_varr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrr#r&r'�
skipUnless�hasattrr,r\r0rs�isdirr1r3r
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)z4Run Python code in a subprocess using subprocess.runz-c)r&r'r
Zrun)r	rkr�argvr
r
r�
run_pythonszRunFuncTestCase.run_pythonc	CsJ|jd�}|j|jd�|jtj��|j�WdQRXdS)Nzimport sys; sys.exit(47)r2)rArr>r7r
r<Zcheck_returncode)r	�cpr
r
r�test_returncodeszRunFuncTestCase.test_returncodecCsI|jtj��}|jddd�WdQRX|j|jjd�dS)Nzimport sys; sys.exit(47)�checkTr2)r7r
r<rArr=r>)r	r?r
r
r�
test_checkszRunFuncTestCase.test_checkcCs,|jddd�}|j|jd�dS)Nzimport sys; sys.exit(0)rDTr)rArr>)r	rBr
r
r�test_check_zeroszRunFuncTestCase.test_check_zerocCs1|jtj��|jddd�WdQRXdS)Nzwhile True: passr6g-C��6?)r7r
r8rA)r	r
r
r�test_timeout$szRunFuncTestCase.test_timeoutcCs/|jddtj�}|jd|j�dS)Nz
print('BDFL')r$sBDFL)rAr
r(rBr$)r	rBr
r
r�test_capture_stdout,sz#RunFuncTestCase.test_capture_stdoutcCs/|jddtj�}|jd|j�dS)Nz$import sys; sys.stderr.write('BDFL')rsBDFL)rAr
r(rBr)r	rBr
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)rIrJrKr,rLrMrAr
r(rBr$)r	rNrBr
r
rrO6s

z+RunFuncTestCase.test_check_output_stdin_argcCs5|jddddtj�}|jd|j�dS)Nz6import sys; sys.stdout.write(sys.stdin.read().upper())rPspearr$sPEAR)rAr
r(rBr$)r	rBr
r
rrQAsz+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#rPshare)rIrJrKr,rLrMr7rRrArBr=r)r	rNr?rCr
r
rrUHs

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)r6rVr$sBDFL)	r7r
r8rAr(rr=rCr$)r	r?rBr
r
rrWUsz)RunFuncTestCase.test_check_output_timeoutcCsEtjj�}d|d<|jdd|�}|j|jd�dS)NrXrYzCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)rZ�!)r\r]r^rArr>)r	r_rBr
r
r�test_run_kwargscs

	zRunFuncTestCase.test_run_kwargsN)rrrrArCrErFrGrHrIrOrQrUrWrKr
r
r
rr?
s
r?zPOSIX 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\�chdirrNr��strerror�reprrS)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)z;Test error in the child raised in the parent for a bad cwd.z-crr|NzExpected OSError: %s)rTr
r%r&r'rNr�rr�rQrS)r	rSr-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)zBTest error in the child raised in the parent for a bad executable.z-crr'NzExpected OSError: %s)rTr
r%r&r'rNr�rr�rQrS)r	rSr-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)z?Test error in the child raised in the parent for a bad args[0].z-crNzExpected OSError: %s)	rTr
r%rNr�rr�rQrS)r	rSr-r�r
r
r�test_exception_bad_args_0�s)z.POSIXProcessTestCase.test_exception_bad_args_0cCsBtjtjddgdd�tjtjddgdd�dS)Nz-crZrestore_signalsTF)r
r3r&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()))Zstart_new_sessionT)r
rAr&r'r�r�ZEPERMr\�getpgidr1�int�assertNotEqual)r	rCr�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>r,�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)NrY�apple)r\�putenvr
r
r
r�<lambda>�sz3POSIXProcessTestCase.test_preexec.<locals>.<lambda>sapple)
r
r%r&r'r(rKr$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?)rRr
r
r
r�raise_it�sz=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itz-crr_z)Expected a ValueError from the preexec_fnZcoconutrzEException raised by preexec_fn did not make it to the parent process.)r
r%r&r'�SubprocessErrorr��_posixsubprocessrRrBrrS)r	rdr-r�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|||�dS)N)�	_testcaser
r%rb)r	Ztestcaserrr
r
rrb�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�rh�assertNotInr#r�r$rr\r,)r	rrZdevzero_fdsrr
r
rr �s	
	
z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)rrrr!rbr r
r
r
r�_TestExecuteChildPopen�srnz	/dev/zeroz/dev/zero required.cCsgdd�}|jtj��B|j|tjddgdtjdtjdtjd|�Wd	QRXd	S)
z6Issue16140: Don't double close pipes on preexec error.cSstjd��dS)Nz-force the _execute_child() errpipe_data path.)r
rer
r
r
rrdszWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_itz-cr�r#r$rr_N)r7r
rernr&r'r()r	rdr
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-crr_cSsdS)Nr
r
r
r
rrbszEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>z#Popen enabled gc when it shouldn't.cSsdS)Nr
r
r
r
rrbszPopen left gc disabled.cSsdS)Nr
r
r
r
rrb%scSsdS)Nr
r
r
r
rrb*s)�gc�	isenabled�disablerr
r3r&r'�enabler�r7rpr%�AttributeError)r	rqZenabledZorig_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-crr_cSsdS)Nr
r
r
r
rrb@sz@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>z.RLIMIT_NPROC had no effect; probably superuser)Zresourceryrzr{�ImportErrorr�rKr
r3r&r'�BlockingIOError)r	ryrzr{rmZlimitsr�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�r2)rIr r�rLr&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)�startupinfor2�
creationflags)r7rRr
r3r&r')r	r
r
rrgUs				z&POSIXProcessTestCase.test_invalid_argscCsytjj�}d|d<tjdgdddtjd|�}|j|jj�|j	|jj
�jd�d	�dS)
Nr`rYzecho $FRUITryr[r$rZs 	
sapple)r\r]r^r
r%r(rKr$r,rr�r)r	r_r-r
r
r�test_shell_sequence`s
		z(POSIXProcessTestCase.test_shell_sequencecCsvtjj�}d|d<tjddddtjd|�}|j|jj�|j	|jj
�jd�d	�dS)
Nr`rYzecho $FRUITryr[r$rZs 	
sapple)r\r]r^r
r%r(rKr$r,rr�r)r	r_r-r
r
r�test_shell_stringjs
		z&POSIXProcessTestCase.test_shell_stringc
Cs�tj�\}}t|ddd��(}|jd�|jdtj�WdQRXtj|d�tj	|�}tj
|�|j|d�dS)Nrr�r�z
#!/bin/sh
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r2)rIr r�rLr&r'r\r�r
r3r!r)r	rr�r�r4r
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'ryTr$r)r\rsrt�isfiler�r��islinkr
r%r(rKr$r,rr�r�bytes)r	Zshellsr7�nameZshr-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[)r,�SIGINT�default_int_handlerr
r%r&r'r(r$r��getattr)r	�methodrr-r-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�rrr�ri)r	r�rr-r
r
r�_kill_dead_process�s			
z'POSIXProcessTestCase._kill_dead_processcCsQ|jdtj�}|j�\}}|jd|�|j|j�d�dS)N�send_signalsKeyboardInterruptr)r�r,r�rirBr[r)r	r-r�rr
r
r�test_send_signal�sz%POSIXProcessTestCase.test_send_signalcCsO|jd�}|j�\}}|j|d�|j|j�tj�dS)Nrr�)r�rirrrr,�SIGKILL)r	r-r�rr
r
r�	test_kill�szPOSIXProcessTestCase.test_killcCsO|jd�}|j�\}}|j|d�|j|j�tj�dS)N�	terminater�)r�rirrrr,�SIGTERM)r	r-r�rr
r
r�test_terminate�sz#POSIXProcessTestCase.test_terminatecCs|jdtj�dS)Nr�)r�r,r�)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(rirrrr�)	r	rr#�	saved_fdsrr�r�rlrmr
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)z=Issue #15798: Popen should work when stdio fds are available.rr[z-cz*print('AssertionError:0:CLOEXEC failure.')N)	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
)rIr )rjr�r
r
rrk7s	z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rVcSsg|]\}}|�qSr
r
)rjrr�r
r
rrk9s	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\�unlinkrLr�r��	enumerater�r
r%r&r'rr�r�rrrr,)
r	�temps�temp_fdsrr�r��temp_fdr-rlrmr
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
)rIr )rjr�r
r
rrkds	z7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rVcSsg|]\}}|�qSr
r
)rjrr�r
r
rrkes	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�rLr�r
r%r&r'rr�rrr�rr,)
r	Zstdin_noZ	stdout_noZ	stderr_nor�r�rr�r�r�r-rlrmr
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:�)rRr
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)r
r3r&r'rRr�rfrr�reZassertIsNotNonerS)r	r�rmr
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��42rr�z&import os; print(ascii(os.getenv(%s)))�C�LC_ALL�aix�latin1z-crZs

z'import os; print(ascii(os.getenvb(%s)))�r�r��r�r�)r�r�)r�rRr\r]r^r&r:r�r�r
rAr'rjrr)r	�key�valueZ
encoded_value�scriptrZZ
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 passryT�PATHrZsPATH)r\�fsencoder&r'rsrr
r3rr]r^�environb)r	Zabs_programrsZprogramZexitcoder�rZZenvbr
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(rKri�set�maprZrr#r�r$rr)	r	Zsleeper�	fd_status�p1�p2rC�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$rKrr#rLr,�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�)rjr�)r	r
r�	<genexpr>Nsz6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>rl�pass_fdsz'Some fds not in pass_fds were left open)rr�r\r�rKr,r�r�r��devnullri�add�set_inheritabler
r%r&r'r(rir�rZrrrrB)
r	r�rr�rr-rC�ignored�
remaining_fds�fds_to_keepr
)r	r�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)z;Confirm that issue21618 is fixed (may fail under valgrind).zfd_status.pyr�r�z-caK
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

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

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

        max_fd_open = max(open_fds)

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

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        r$r%rz(expected exactly two lines of output:
%rrr�r[zSome fds were left open.N)rr�r
r%r&r'r�r�r(ri�
splitlinesrr�r�r�rZrrr)r	r�r-rCZ
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�rEc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�rErr[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�rKr,r��updater
r%r&r'r(rir�rZrrBrZassertWarns�RuntimeWarningr3r�Zwarning)r	r�r	r�rrr-rCr�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�rKr,r�r&r'�listr�r�r
r%r(rir�rZrrr�)
r	r�r�Znon_inheritabler�rr-rCr�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	r�r-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	r�r-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(rirr>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$r/rr�sapplg)r�
import_moduler
r%r&r'r(r$rKr,rr�rBr�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)rj�or
r
rrk'	s	zEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)
r
r%r&r'r(rKr$r,rr��pidrBr)r	r-�identr�r
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�)rjr�r
r
rrk;	s	zJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>g�������?rrcSsg|]}t|��qSr
)r�)rjr�r
r
rrkG	s	)r
r%r&r'r(rKr$r,rr�r�r\rr,r�rBrrrr7r��waitpidrm)r	r-r�r�r?rr
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�Tr_cstjd��S)Nr[)r\r�r
)rr
rrbS	szCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>r�)rr�r\r�rKr,r
r%r&r'r(rir�r�rZrrm)r	r�r-rCr�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
rrbd	sz5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>�{sexesenvsargTr[r%rVr����rrr)rfrrrsrur7ra�	fork_execrt)r	rf�
gc_enabled�funcrZexe_listr|Zenv_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
rrb~	szSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__cSs#|jrd|_|jSt�dS)NF)�firstr�rR)r	r
r
r�__int__�	s		zRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)rrrr
rbrr
r
r
r�BadInt|	srr[r%rVr�rEr����*�?r��rlrzfds_to_keep={}sfalseTsenvr�r)rr%rVr�rE)r�r��)r
rrr)rEr�)r�rrrlrrrr)rfrrrsrur7rR�formatrrBr�r=rt)r	rfrrr�r?r
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_effectriZassert_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'rrrrrLrri�assert_called_once_withr,)r	rrr
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(rrrr�r\r�rr�rr�Zreturn_valuerir)r	rrZdev_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$r6i�)
r
r%r&r'r(rrrrr,rrir)r	rrr
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)zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.rr?Zptracezptrace() 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()
        N)�ctypes�utilZfind_libraryZCDLLr=r4ZSkipTestr�r�rr
r%r&r'rrr[Z
assertLess)r	r!r ZlibcrkZchildr>r
r
r�&test_child_terminated_in_stopped_state�	s(	

z;POSIXProcessTestCase.test_child_terminated_in_stopped_state)r�r�)VrrrrrTrUrVrWrXr\r^rcrgr
r%rnr4r5r\rsr"rorwr&r:r~r�rgr�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_verr�r�r�r�r�r�r�rrrZcpython_onlyr	rrrrrr"r'r$r
r
)rOrrLls�
+%!


-0#)0!Q" (	
rLzWindows 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[rVz-czimport sys; sys.exit(0)r�)r
�STARTUPINFOZdwFlagsZwShowWindowr3r&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&rrLr
r3r')r	ZCREATE_NEW_CONSOLEr
r
r�test_creationflags
s
z'Win32ProcessTestCase.test_creationflagscCsc|jttjtjddgddd��|jttjtjddgdtjdd�dS)	Nz-czimport sys; sys.exit(47)r_cSsdS)Nr[r
r
r
r
rrb
sz8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>r$r�T)r7rRr
r3r&r'r()r	r
r
rrg
s		
			z&Win32ProcessTestCase.test_invalid_argscCs5tjtjddgdd�}|j|d�dS)Nz-czimport sys; sys.exit(47)r�Tr2)r
r3r&r'r)r	r4r
r
rr�
s		z#Win32ProcessTestCase.test_close_fdscCsptjj�}d|d<tjdgdddtjd|�}|j|jj�|j	d|jj
��dS)	N�physalisrYr�ryr[r$rZsphysalis)r\r]r^r
r%r(rKr$r,rBr�)r	r_r-r
r
rr�!
s
		z(Win32ProcessTestCase.test_shell_sequencecCsmtjj�}d|d<tjddddtjd|�}|j|jj�|j	d|jj
��dS)	Nr,rYr�ryr[r$rZsphysalis)r\r]r^r
r%r(rKr$r,rBr�)r	r_r-r
r
rr�+
s
		z&Win32ProcessTestCase.test_shell_stringcCs*tjtjd�}|j|d�dS)Nz -c "import sys; sys.exit(47)"r2)r
r3r&r'r)r	r4r
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(rKr$r,rr#r�r�rirrr[)r	r�rr-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(rKr$r,rr#r�rrr�rirrr)r	r�rr-r�rr4r
r
rr�R
s			
z'Win32ProcessTestCase._kill_dead_processcCs|jdtj�dS)Nr�)r�r,r�)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�r,r�)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+rgr�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 )rr.)rr
Z	getoutputZgetstatusoutputrIr�r\rsrtr�r[�rmdir)r	�dirr�ZstatusrCr
r
r�test_getoutput~
szMiscTests.test_getoutputcCs�dddh}ttj�}t�}ddl}xTtjj�D]C\}}|jd�raqCt||jf�ryqC|j	|�qCW|j
|||�dS)z*Ensure that __all__ is populated properly.r�r(ZHandlerNr�)r�r
�__all__�types�__dict__�itemsr��
isinstance�
ModuleTyper�r)r	Zintentionally_excludedZexportedZpossible_exportsr3r�r�r
r
r�test__all__�
s	zMiscTests.test__all__N)rrrr1r8r
r
r
rr-}
sr-ZPollSelectorz!Test needs selectors.PollSelectorc@s(eZdZdd�Zdd�ZdS)�ProcessTestCaseNoPollcCs)tj|_tjt_tj|�dS)N)r
�_PopenSelector�
orig_selector�	selectorsZSelectSelectorr"r)r	r
r
rr�
szProcessTestCaseNoPoll.setUpcCs|jt_tj|�dS)N)r;r
r:r"r)r	r
r
rr�
szProcessTestCaseNoPoll.tearDownN)rrrrrr
r
r
rr9�
sr9zWindows-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])))	rMrrIr �lowerr�r\rLr,)r	r�r�)rOr
rr�
s

zCommandsWithSpaces.setUpcs!tj|j�t�j�dS)N)r\r!r�rMr)r	)rOr
rr�
szCommandsWithSpaces.tearDowncOs_tj|d<tj||�}|j|jj�|j|jj�jd�d|j	�dS)Nr$�mbcsz2 [%r, 'ab cd'])
r
r(r%rKr$r,rr�r�r�)r	rrr-r
r
r�with_spaces�
s
zCommandsWithSpaces.with_spacescCs*|jdtj|jdfdd�dS)Nz"%s" "%s" "%s"zab cdryr[)r@r&r'r�)r	r
r
r�test_shell_string_with_spaces�
sz0CommandsWithSpaces.test_shell_string_with_spacescCs&|jtj|jdgdd�dS)Nzab cdryr[)r@r&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)r@r&r'r�)r	r
r
r�test_noshell_string_with_spaces�
sz2CommandsWithSpaces.test_noshell_string_with_spacescCs |jtj|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@rArBrCrDr
r
)rOrr=�
s		r=c@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
rrC�
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(rirr>)r	rr
r
rr��
s
	
z*ContextManagerTests.test_communicate_stdincCsK|jt��5}tjdgdtjdtj��}WdQRXWdQRXdS)Nrr$r)r7rwr
r%r()r	r?rr
r
rrg�
s
	z%ContextManagerTests.test_invalid_argscCs�tjtjddgdtjdtjd�}|j�}|jj	dtj�|j
|j�|jt
|jddd�|j|jd�|j|jj�dS)	z9Broken pipe error should not prevent wait() (Issue 21619)z-cr�r#r/r%r$Nr)r
r%r&r'r(rr��	__enter__r#rLr�r>r7r��__exit__rr�r�)r	rr
r
r�test_broken_pipe_cleanup�
s	z,ContextManagerTests.test_broken_pipe_cleanupN)rrrrFrCr�rgrJr
r
r
rrE�
s

rEcCs9ttttttttf}tj	|�tj
�dS)N)r"rLr'r-r9r=rEr?rZrun_unittestr)Z
unit_testsr
r
r�	test_mains	
rK�__main__)2r4rZtest.supportrr�rr
r&r:r,r*Zlocaler\r�rIr�rer<r8�warningsr�r�rrr�r"r|Zctypes.utilrr�r�ZTestCaser�	Exceptionrr%rr"r?r5rLr<r'r-r=r9r=rErKr�mainr
r
r
r�<module>sz

	�����_������$+6