Your IP : 216.73.216.213


Current Path : /proc/242857/root/opt/alt/python34/lib64/python3.4/test/__pycache__/
Upload File :
Current File : //proc/242857/root/opt/alt/python34/lib64/python3.4/test/__pycache__/test_subprocess.cpython-34.pyc

�
f ff��
@s�ddlZddlmZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZyddlZWnek
r"dZYnXejdkZerAdZndZGdd�dej�ZGd	d
�d
e�ZGdd�dej�ZGd
d�de�Z ej!ed�Gdd�de��Z"ej#ed�Gdd�de��Z$Gdd�dej�Z%ej#e&ed�d�Gdd�de ��Z'Gdd�dej�Z(ej#ed�Gdd�de��Z)Gd d!�d!e�Z*d"d#�Z+e,d$kr�ej-�ndS)%�N)�
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/python34/lib64/python3.4/test/test_subprocess.py�setUp)szBaseTestCase.setUpcCs?xtjD]}|j�q
Wtj�|jtjd�dS)Nzsubprocess._active not empty)�
subprocess�_active�waitZ_cleanup�assertFalse)rZinstr	r	r
�tearDown.s
zBaseTestCase.tearDownNcCs2tj|�}|j�}|j|||�dS)N)r�strip_python_stderr�strip�assertEqual)r�stderr�expected�msgZactualr	r	r
�assertStderrEqual4szBaseTestCase.assertStderrEqual)�__name__�
__module__�__qualname__rrrr	r	r	r
r(src@seZdZdS)�PopenTestExceptionN)rrrr	r	r	r
r>s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_childFsz&PopenExecuteChildRaises._execute_childN)rrr�__doc__rr	r	r	r
rBs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:eje$j;dekdf�eje(j<dg�dhk	di�djdk���Z=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��ZZeje[dhkd��d�d���Z\eje[dhkd��d�d���Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zaejbecedd��d��ejbeceed��d��ejbeceed��d��d�d�����Zfejbeejgjhd�eeji��d��d�d���ZjdhS)��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_defaultLs


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)rr,r	r	r
�test_io_unbuffered_worksZs


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_seqhszProcessTestCase.test_call_seqcCs/|jtjtjtjddgdd�dS)Nz-czwhile True: pass�timeoutg�������?)�assertRaisesr�TimeoutExpiredr2r%r&)rr	r	r
�test_call_timeoutnsz!ProcessTestCase.test_call_timeoutcCs/tjtjddg�}|j|d�dS)Nz-czimport sys; sys.exit(0)r)r�
check_callr%r&r)rr3r	r	r
�test_check_call_zerowsz$ProcessTestCase.test_check_call_zerocCsN|jtj�� }tjtjddg�WdQX|j|jjd�dS)Nz-czimport sys; sys.exit(47)r1)	r6r�CalledProcessErrorr9r%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_outputcCsN|jtj�� }tjtjddg�WdQX|j|jjd�dS)Nz-czimport sys; sys.exit(5)�)	r6rr;r@r%r&rr<r=)rr>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r@r%r&�STDOUTrA)rrBr	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r@r%r&rA)r�tfrBr	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r@r%r&rA)rrBr	r	r
�test_check_output_input_arg�s
			z+ProcessTestCase.test_check_output_input_argcCsg|jt��8}tjtjddgdtj�}|jd�WdQX|jd|j	j
d�dS)Nz-czprint('will not be run')r#z-Expected ValueError when stdout arg supplied.r)r6�
ValueErrorrr@r%r&r#�failrAr<r)rr>rBr	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�WdQX|j
d|jjd�|j
d|jjd�dS)	Nspearrz-czprint('will not be run')r"rOsharez7Expected ValueError when stdin and input args supplied.)rHrIrJr+rKrLr6rQrr@r%r&rRrAr<r)rrMr>rBr	r	r
�&test_check_output_stdin_with_input_arg�s

z6ProcessTestCase.test_check_output_stdin_with_input_argcCsc|jtj��5}tjtjddgdd�}|jd�WdQX|j|jj	d�dS)Nz-czMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)r5�zExpected TimeoutExpired.sBDFL)
r6rr7r@r%r&rRrr<rB)rr>rBr	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r2r%r&r)r�newenvr3r	r	r
�test_call_kwargs�s
		z ProcessTestCase.test_call_kwargscCs�tj��Y}|jttjdd�tjjjj}dg|d}|jttj|�WdQX|j	|j
�d�dS)NZinvalid_arg_namerZrr)rZcaptured_stderrr6�	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'rJr#r+rrrr")rr,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'rJr#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'rJr#r+r"rrr)rr,r	r	r
�test_stderr_nones
z ProcessTestCase.test_stderr_nonecKs@|dg}tj||�}|j�|jd|j�dS)Nzimport sys; sys.exit(47)r1)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&rp)rrqr	r	r
�test_executables	zProcessTestCase.test_executablecCs<tjdg}|j|�|jt|j|dd�dS)Nz-cr&rq)r%r&rpr6�FileNotFoundError)rror	r	r
� test_executable_takes_precedence"s
z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs |jgdtjdd�dS)Nr&�shellT)rpr%r&)rr	r	r
�test_executable_replaces_shell+sz.ProcessTestCase.test_executable_replaces_shellcCs$tj|��tj�SWdQXdS)N)rZ
change_cwdr[�getcwd)r�cwdr	r	r
�_normalize_cwd2szProcessTestCase._normalize_cwdcCs%tjjtj�}tjj|�S)N)r[rr�realpathr%r&�split)rZpython_pathr	r	r
�_split_python_path:sz"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#r1zutf-8)rr$r'rJr#r+rrr=r[rr�normcase�read�decode)rZexpected_cwdZ
python_argrr,r�r	r	r
�_assert_cwd@s		
zProcessTestCase._assert_cwdcCs8tj�}|j|�}|j|tjd|�dS)Nr{)rHZ
gettempdirr|r�r%r&)r�temp_dirr	r	r
�test_cwdQszProcessTestCase.test_cwdz"pending resolution of issue #15533c
Cs�|j�\}}tjjtj|�}tj��d}|jtt	j
|g�|jtt	j
|gd|�|j|�}|j||d|�WdQXdS)Nr{)
rr[rrrs�curdirr�temp_cwdr6rvrr$r|r�)r�
python_dir�python_base�
rel_python�	wrong_dirr	r	r
�test_cwd_with_relative_argWs
z*ProcessTestCase.test_cwd_with_relative_argcCs�|j�\}}tjjtj|�}d}tj��v}|jtt	j
|gd|�|jtt	j
|gd|d|�|j|�}|j||d|d|�WdQXdS)N�somethingyoudonthaver&r{)
rr[rrrsr�rr�r6rvrr$r|r�)rr�r�r�Zdoesntexistr�r	r	r
�!test_cwd_with_relative_executablegsz1ProcessTestCase.test_cwd_with_relative_executablec
Cs�|j�\}}tjj||�}tjjtj|�}tj��K}|jtt	j
|gd|�|j|�}|j||d|�WdQXdS)Nr{)
rr[rrrsr�rr�r6rvrr$r|r�)rr�r�Z
abs_pythonr�r�r	r	r
�test_cwd_with_absolute_argzsz*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblecCsD|j�\}}|j|�}|j|ddtjd|�dS)Nr�r&r{)rr|r�r%r&)rr�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[rzr%r&)rr	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"spearrZ)rr$r%r&r'r"rKr+rrr=)rr,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"rZ)rHrIrJr+�filenor[rK�lseekrr$r%r&rrr=)rrM�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"rZ)
rHrIrJr+rKrLrr$r%r&rrr=)rrMr,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'rJr#r+rr�)rr,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)rHrIrJr+r�rr$r%r&rr[r�rr�)rrMr�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)rHrIrJr+rr$r%r&rrLrr�)rrMr,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'rJrr+rr�)rr,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)rHrIrJr+r�rr$r%r&rr[r�rr�)rrMr�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)rHrIrJr+rr$r%r&rrLrr�)rrMr,r	r	r
�test_stderr_fileobj�s		

z#ProcessTestCase.test_stderr_fileobjcCs]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'rFrJr#r+rr�)rr,r	r	r
�test_stdout_stderr_pipe�s		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)rHrIrJr+rr$r%r&rrLrr�)rrMr,r	r	r
�test_stdout_stderr_files		

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'rJr#r+rrhrr=ri)rrjr,rkrlr	r	r
�test_stdout_filedes_of_stdoutsz-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#)rr,r	r	r
�test_stdout_devnull)s
	
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)rr,r	r	r
�test_stderr_devnull1s
	
z#ProcessTestCase.test_stderr_devnullcCsEtjtjddgdtj�}|j�|j|jd�dS)Nz-czimport sys;sys.stdin.read(1)r")rr$r%r&r�rrr")rr,r	r	r
�test_stdin_devnull:s
	
z"ProcessTestCase.test_stdin_devnullc
Csrtjj�}d|d<tjtjddgdtjd|��)}|j�\}}|j	|d�WdQXdS)N�orangerXz-cz2import sys,os;sys.stdout.write(os.getenv("FRUIT"))r#rYsorange)
r[r\r]rr$r%r&r'rhr)rr^r,r#rr	r	r
�test_envBs
		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�WdQXdS)Nz-cz)import os; print(list(os.environ.keys()))r#rY�[]�['__CF_USER_TEXT_ENCODING'])r�r�)rr$r%r&r'rhrAr)rr,r#rr	r	r
�test_empty_envOs		zProcessTestCase.test_empty_envcCsxtjd}|jttf��tj|ddg�WdQX|jttf��tjtjddg�WdQXdS)N�z-c�passzpass#)r%r&r6rQr`rr$)r�cmdr	r	r
�test_invalid_cmdas

z ProcessTestCase.test_invalid_cmdcCshtjj�}d|d<|jttf��$tjtj	ddgd|�WdQXtjj�}d|d<|jttf��$tjtj	ddgd|�WdQXtjj�}d|d	<|jt��$tjtj	ddgd|�WdQXtjj�}d
|d<tjtj	ddgdtj
d|��)}|j�\}}|j|d
�WdQXdS)NZcabbageZFRUITVEGETABLEz-cr�rYZorangeVEGETABLE=cabbagerXZlemonzFRUIT=ORANGEzorange=lemonz3import sys, os;sys.stdout.write(os.getenv("FRUIT"))r#sorange=lemon)
r[r\r]r6rQr`rr$r%r&r'rhr)rr^r,r#rr	r	r
�test_invalid_envks(
%
%
%
		z ProcessTestCase.test_invalid_envcCsHtjtjddgdtj�}|jd�|j|jd�dS)Nz-cz/import sys;sys.exit(sys.stdin.read() == "pear")r"spearrZ)rr$r%r&r'rhrr=)rr,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'rhr)rr,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'rhrr)rr,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'rJr#r+rr"rhrr)rr,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#rrWr5g333333�?spineapple
pear
)rr$r%r&r'r6r7rhrr�encode)rr,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#r5g�������?��@i�i)
rr$r%r&r'r6r7rhr�len)rr,r#�_r	r	r
�$test_communicate_timeout_large_ouput�s	z4ProcessTestCase.test_communicate_timeout_large_ouputcCs"xdD]}x
d	D]}x�d
D]�}i}|rCtj|d<n|rYtj|d<n|rotj|d<n|s{q!ntjtjddf|�}|j�|jdk	r�|j|jj�n|j	dk	r�|j|j	j�n|j
dk	r!|j|j
j�q!q!WqWqWdS)NFTr"r#rz-cr�)FT)FT)FT)rr'r$r%r&rhr"�
assertTrue�closedr#r)rZ
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&rhr)rr,r#rr	r	r
�test_communicate_returns�s
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'rJr#rr"rhr)r�x�yr,Zstring_to_writer#rr	r	r
�test_communicate_pipe_buf�s


		
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#rsbananassplitsbananasplit�)rr$r%r&r'rJr#r+rr"rKrhrr)rr,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�rZzline1
zline3
zline2
�zline4
line5
line6
line7
line8)rr$r%r&�	SETBINARYr'r"rK�flushrr#�readliner+rJr�)rr,r	r	r
�test_universal_newliness$
			

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�rZz#line2
line4
line5
line6
line7
line8)rr$r%r&r�r'rJr#r+rrhr)rr,r#rr	r	r
�#test_universal_newlines_communicate<s
				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�rZzline1
line3
r)rr$r%r&r��textwrap�dedentr'rhrr=)rr,r#rr	r	r
�)test_universal_newlines_communicate_stdinUs

		z9ProcessTestCase.test_universal_newlines_communicate_stdincCsTtjtjddgdtjdtjdd�}|j�|j|jd�dS)Nz-cr�r"r#r�Tr)rr$r%r&r'rhrr=)rr,r	r	r
�.test_universal_newlines_communicate_input_nonecs			
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'rJr#r+rrhrr=r��
startswith)rr,r#rr	r	r
�7test_universal_newlines_communicate_stdin_stdout_stderros

				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#rOrz1
2
3
4)	�_bootlocaler�r%r&rr$r'rhr)	rr�Zold_getpreferredencodingr�rjr�popenr#rr	)r�r
�-test_universal_newlines_communicate_encodings�s			
z=ProcessTestCase.test_universal_newlines_communicate_encodingsc
Cs�tsd}nd}g}tj�}zFx�t|�D]�}y?tjj|tj�}|j	tj
|tjtjB��Wq7t
k
r�}z|jtjkr��nPWYdd}~Xq7Xq7W|jd|�x'td�D]}tj|j��q�Wxmtd�D]_}tjtjddgdtjd	tjd
tj�}|jd�d}|j|d�q	WWdx|D]}	tj|	�qwWtj|�XdS)
Niiz4failed to reach the file descriptor limit (tried %d)�
�z-cz-import sys;sys.stdout.write(sys.stdin.read())r"r#rslimer)�	mswindowsrH�mkdtemp�ranger[rrrsrZTESTFN�append�open�O_WRONLY�O_CREAT�OSError�errnoZEMFILE�skipTestr+�poprr$r%r&r'rhr�shutilZrmtree)
rZmax_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Zlist2cmdline)rr	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'rJr"r+�assertIsNone�pollr[rKr�rr)rr,r	r	r
�	test_poll�s	
zProcessTestCase.test_pollcCsKtjtjddg�}|j|j�d�|j|j�d�dS)Nz-cr�r)rr$r%r&rr)rr,r	r	r
�	test_wait�szProcessTestCase.test_waitc
Cstjtjddg�}|jtj��}|jdd�WdQX|jdt|j	��|j
|jdd�d�dS)Nz-czimport time; time.sleep(0.3)r5g-C��6?z0.0001rUr)rr$r%r&r6r7rrA�strr<r)rr,r>r	r	r
�test_wait_timeout�sz!ProcessTestCase.test_wait_timeoutcCs6|jt��!tjtjddgd�WdQXdS)Nz-cr�r�)r6r`rr$r%r&)rr	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)rr,r	r	r
�test_bufsize_is_nones!z$ProcessTestCase.test_bufsize_is_nonecCs�tjtjddgdtjdtjdtjddd|��k}|jj|�tj	|jj
��|jj�}y|jj	�Wnt
k
r�YnXd|_WdQX|j|jd	�|j||�dS)
Nz-czDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r"r#rr.rZr�r)rr$r%r&r'r�r"rKr[r+r�r#r�r�rr=)r�linerr�r,Z	read_liner	r	r
�_test_bufsize_equal_ones 			
z'ProcessTestCase._test_bufsize_equal_onecCs d}|j||dd�dS)Nzline
r�T)r�)rr�r	r	r
� test_bufsize_equal_one_text_mode#sz0ProcessTestCase.test_bufsize_equal_one_text_modecCs-dtjj�}|j|ddd�dS)Nsliner�r�F)r[�linesepr�r�)rr�r	r	r
�"test_bufsize_equal_one_binary_mode)sz2ProcessTestCase.test_bufsize_equal_one_binary_modecCsxxtd�D]j}|jt��)}tjdgdtjdtj�WdQX|jjtjtj	fkr
|j�q
q
WdS)Ni�nonexisting_i_hoper#r)
r�r6r�rr$r'r<r��ENOENTZEACCES)rr�r>r	r	r
�test_leaking_fds_on_error/s	z)ProcessTestCase.test_leaking_fds_on_errorzthreading requiredcs�g��fdd�}tjd|�}|j�zE|jt��0tjdgdtjdtjdtj�WdQXWd|j�d}xM�D]E}yt	j
|�Wq�tk
r�}z|}WYdd}~Xq�Xq�W|dk	r�|�nXdS)Ncs;x4td�D]&}�jtj��tjd�q
WdS)N�g����MbP?)r��extendr[r��time�sleep)r�)�fdsr	r
�open_fdsBsz<ProcessTestCase.test_double_close_on_error.<locals>.open_fds�targetr�r"r#r)�	threadingZThread�startr6�EnvironmentErrorrr$r'rsr[r+r�)rr�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_threadds


zDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_threadg�������?rZ�	r5rrz*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�rrs)rrrZexpected_errorcoder	)rrr
�test_threadsafe_wait\s*
	

		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)rsrr@r%r&r�r��ascii)rrjrBr	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)rH�mkstemprr$r�r[r+�removerrr�exists)rZifhandleZifnameZofhandleZofnameZefhandleZefnamer	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'rJr#r+rr"rh)rr,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'rJr"r+rrh)rr,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];}itj|6}tj||��}|j�WdQXqSWdS)NcSsdS)Nr	)ZsignumZframer	r	r
�handler�sz7ProcessTestCase.test_communicate_eintr.<locals>.handlerz-cz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r#r)zstdoutzstderr)	�signalr%rJr%r&rr'r$rh)rr'�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	�WdQXtj|�}|j
||�dS)z;Test for the fork() failure fd leak reported in issue16327.z/proc/%d/fdz-cr�r"r#rN)r[�getpid�listdirr6rrr%r&rr'r)rZfd_directoryZfds_before_popenZfds_after_exceptionr	r	r
�!test_failed_child_execute_fd_leak�sz1ProcessTestCase.test_failed_child_execute_fd_leak)krrrr-r0r4r8r:r?rCrErGrNrPrSrTrVr_rfrgrmrnrprurw�unittest�skipIfr�ryr|rr�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��platform�get_config_varr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr r#r$�
skipUnless�hasattrr(r[r,rr�isdirr-r/r	r	r	r
r!Js�		

			

	

# '
$$5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���ZM�S)��POSIXProcessTestCasecst�j�d|_dS)Nz/_this/pa.th/does/not/exist)�superr�_nonexistent_dir)r)�	__class__r	r
r�s
zPOSIXProcessTestCase.setUpcCsvytj|j�WnGtk
r]}z'|}|jdt|j�7_WYdd}~XnX|jd|j�|S)Nz: z,chdir to nonexistant directory %s succeeded.)r[�chdirr=r��strerror�reprrR)rr��desired_exceptionr	r	r
�_get_chdir_exception�s/	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)rCrr$r%r&r=r�rr�r@rR)rrBr,r�r	r	r
�test_exception_cwds)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)rCrr$r%r&r=r�rr�r@rR)rrBr,r�r	r	r
�test_exception_bad_executables)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)	rCrr$r=r�rr�r@rR)rrBr,r�r	r	r
�test_exception_bad_args_0s)z.POSIXProcessTestCase.test_exception_bad_args_0cCsBtjtjddgdd�tjtjddgdd�dS)Nz-crZrestore_signalsTF)rr2r%r&)rr	r	r
�test_restore_signals,sz)POSIXProcessTestCase.test_restore_signalscCs�y%tjtjddgdd�}Wn=tk
rd}z|jtjkrR�nWYdd}~Xn2Xtjtj	��}t
|�}|j||�dS)Nz-cz)import os; print(os.getpgid(os.getpid()))Zstart_new_sessionT)rr@r%r&r�r�ZEPERMr[�getpgidr-�int�assertNotEqual)rrBr�Zparent_pgidZ
child_pgidr	r	r
�test_start_new_session3s		
z+POSIXProcessTestCase.test_start_new_sessioncCsStj��*tjtjddg�}|j�WdQX|j|jt	j
�dS)Nz-czimport os; os.abort())rZSuppressCrashReportrr$r%r&rrr=r(�SIGABRT)rr,r	r	r
�test_run_abortDs

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)NrX�apple)r[�putenvr	r	r	r
�<lambda>Ssz3POSIXProcessTestCase.test_preexec.<locals>.<lambda>sapple)
rr$r%r&r'rJr#r+rr�)rr,r	r	r
�test_preexecLs		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?)rQr	r	r	r
�raise_itXsz=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��_posixsubprocessrQrArrR)rrSr,r�r	r	r
�test_preexec_exceptionWs
*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$ra)rZtestcaserrr	r	r
rais	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>ts	zNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>�rz!At least one fd was closed early.)rr$rr�rW�assertNotInr"r�r#rr[r+)rrrZdevzero_fdsr
r	r	r
rms	
	
z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)rrrr rarr	r	r	r
�_TestExecuteChildPopengsr]z	/dev/zeroz/dev/zero required.cCsfdd�}|jtj��B|j|tjddgdtjdtjdtjd|�Wd	QXd	S)
z6Issue16140: Don't double close pipes on preexec error.cSstjd��dS)Nz-force the _execute_child() errpipe_data path.)rrTr	r	r	r
rS�szWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_itz-cr�r"r#rrNN)r6rrTr]r%r&r')rrSr	r	r
�0test_preexec_errpipe_does_not_double_close_pipes�szEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipesc
Csvdd�}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_|sqtj�nXdS)
NcSstd��dS)Nzthis shouldn't escape)�RuntimeErrorr	r	r	r
�raise_runtime_error�szPPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.raise_runtime_errorz-crrNcSsdS)Nr	r	r	r	r
rQ�szEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>z#Popen enabled gc when it shouldn't.cSsdS)Nr	r	r	r	r
rQ�szPopen left gc disabled.cSsdS)Nr	r	r	r	r
rQ�scSsdS)Nr	r	r	r	r
rQ�s)�gc�	isenabled�disablerrr2r%r&�enabler�r6r_r$�AttributeError)rr`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|||�|jt��*t	j
tjddgddd��WdQXdS)Nr)�	getrlimit�	setrlimit�RLIMIT_NPROCz-crrNcSsdS)Nr	r	r	r	r
rQ�sz@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>)
Zresourcerhrirj�ImportErrorr�rJr6�BlockingIOErrorrr2r%r&)rrhrirjrlZlimitsr�Zhardr	r	r
�test_preexec_fork_failure�s  z.POSIXProcessTestCase.test_preexec_fork_failurec
Cs�tj�\}}t|ddd��(}|jd�|jdtj�WdQXtj|d�tj	|�}|j
�tj|�|j|j
d�dS)N�w�errors�surrogateescapez
#!/bin/sh
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r1)rHrr�rKr%r&r[�chmodrr$rrrr=)rr
�fname�fobjr,r	r	r
�test_args_string�s
	

z%POSIXProcessTestCase.test_args_stringcCsT|jttjtjddgdd�|jttjtjddgdd�dS)Nz-czimport sys; sys.exit(47)�startupinfor1�
creationflags)r6rQrr2r%r&)rr	r	r
rf�s				z&POSIXProcessTestCase.test_invalid_argscCsytjj�}d|d<tjdgdddtjd|�}|j|jj�|j	|jj
�jd�d	�dS)
NrOrXzecho $FRUITrxrZr#rYs 	
sapple)r[r\r]rr$r'rJr#r+rr�r)rr^r,r	r	r
�test_shell_sequence�s
		z(POSIXProcessTestCase.test_shell_sequencecCsvtjj�}d|d<tjddddtjd|�}|j|jj�|j	|jj
�jd�d	�dS)
NrOrXzecho $FRUITrxrZr#rYs 	
sapple)r[r\r]rr$r'rJr#r+rr�r)rr^r,r	r	r
�test_shell_string�s
		z&POSIXProcessTestCase.test_shell_stringc
Cs�tj�\}}t|ddd��(}|jd�|jdtj�WdQXtj|d�tj	|�}tj
|�|j|d�dS)Nrnrorpz
#!/bin/sh
z(exec '%s' -c 'import sys; sys.exit(47)'
i�r1)rHrr�rKr%r&r[rqrr2rr)rr
rrrsr3r	r	r
�test_call_string�s
	
z%POSIXProcessTestCase.test_call_stringc	Cs3g}xedddgD]T}xKddgD]=}tjj||�}tjj|�r)|j|�q)q)WqW|s�|jd�nd}tjj|�r�tjj|�r�|j|�nxm|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&rxTr#r)r[rrrs�isfiler�r��islinkrr$r'rJr#r+rr�r�bytes)rZshellsr3�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#rrZ)r(�SIGINT�default_int_handlerrr$r%r&r'r#r��getattr)r�methodrr)r,r	r	r
�
_kill_processs			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()
                             rTr"r#rrZ)rr$r%r&r'r#r�rrr�rh)rr�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�rhrArJr)rr,r�rr	r	r
�test_send_signalCsz%POSIXProcessTestCase.test_send_signalcCsO|jd�}|j�\}}|j|d�|j|j�tj�dS)Nrr�)r�rhrrrr(�SIGKILL)rr,r�rr	r	r
�	test_killIszPOSIXProcessTestCase.test_killcCsO|jd�}|j�\}}|j|d�|j|j�tj�dS)N�	terminater�)r�rhrrrr(�SIGTERM)rr,r�rr	r	r
�test_terminateOsz#POSIXProcessTestCase.test_terminatecCs|jdtj�dS)Nr�)r�r(r�)rr	r	r
�test_send_signal_deadUsz*POSIXProcessTestCase.test_send_signal_deadcCs|jd�dS)Nr)r�)rr	r	r
�test_kill_deadYsz#POSIXProcessTestCase.test_kill_deadcCs|jd�dS)Nr�)r�)rr	r	r
�test_terminate_dead]sz(POSIXProcessTestCase.test_terminate_deadcCsOg}xB|D]:}tj|�}tj|�}|j|||f�q
W|S)N)r[�get_inheritable�dupr�)rZsave_fdsrr
�inheritable�savedr	r	r
�	_save_fdsas
zPOSIXProcessTestCase._save_fdscCsAx:|D]2\}}}tj||d|�tj|�qWdS)Nr�)r[�dup2r+)rrr
r�r�r	r	r
�_restore_fdsisz!POSIXProcessTestCase._restore_fdsc	Cs�d}|j|�}x-|D]%\}}}|dkr|}PqqWz�x|D]}tj|�qOWtjtjddgd|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'rhrrrr�)	rrr"�	saved_fdsr
r�r�rkrlr	r	r
�check_close_std_fdsns"
		z(POSIXProcessTestCase.check_close_std_fdscCs|jdg�dS)Nr)r�)rr	r	r
�test_close_fd_0�sz$POSIXProcessTestCase.test_close_fd_0cCs|jdg�dS)NrZ)r�)rr	r	r
�test_close_fd_1�sz$POSIXProcessTestCase.test_close_fd_1cCs|jdg�dS)Nr")r�)rr	r	r
�test_close_fd_2�sz$POSIXProcessTestCase.test_close_fd_2cCs|jddg�dS)NrrZ)r�)rr	r	r
�test_close_fds_0_1�sz'POSIXProcessTestCase.test_close_fds_0_1cCs|jddg�dS)Nrr")r�)rr	r	r
�test_close_fds_0_2�sz'POSIXProcessTestCase.test_close_fds_0_2cCs|jddg�dS)NrZr")r�)rr	r	r
�test_close_fds_1_2�sz'POSIXProcessTestCase.test_close_fds_1_2cCs|jdddg�dS)NrrZr")r�)rr	r	r
�test_close_fds_0_1_2�sz)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.rrZz-cz*print('AssertionError:0:CLOEXEC failure.')N)	r[r�r+rr$r%r&rr�)rZ	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	)rHr)rYr�r	r	r
rZ�s	z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rUcSsg|]\}}|�qSr	r	)rYr
rrr	r	r
rZ�s	rZsSTDINrz-czZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")r"r#r"ris	got STDINserr)r�r[�unlinkrKr�r��	enumerater�rr$r%r&rr�r�rrrr+)
r�temps�temp_fdsr
rrr��temp_fdr,rkrlr	r	r
�test_remapping_std_fds�s4	




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	)rHr)rYr�r	r	r
rZ�s	z7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rUcSsg|]\}}|�qSr	r	)rYr
rrr	r	r
rZ�s	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�rKr�rr$r%r&rr�rrr�rr+)
rZstdin_noZ	stdout_noZ	stderr_nor�r�r
rrr�r�r,rkrlr	r	r
�check_swap_fds�s4		


z#POSIXProcessTestCase.check_swap_fdscCsv|jddd�|jddd�|jddd�|jddd�|jddd�|jddd�dS)NrrZr")r�)rr	r	r
�
test_swap_fdss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:�)rQr	r	r	r
�prepareszCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparez-cr�rNu
surrogate:�z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)rr2r%r&rQr�rUrr�rTZassertIsNotNonerR)rr�rlr	r	r
�test_surrogates_error_messages()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��42rrpz&import os; print(ascii(os.getenv(%s)))�C�LC_ALL�aix�latin1z-crYs

z'import os; print(ascii(os.getenvb(%s)))�ztestr��r�r�)r�r�)r�rAr[r\r]r%r6r�r�rr@r&rirr)r�key�valueZ
encoded_value�scriptrYZ
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 passrxT�PATHrYsPATH)r[�fsencoder%r&rrr~rr2rr\r]�environb)rZabs_programrrZprogramZexitcoder�rYZenvbr	r	r
�test_bytes_programNs 
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#rrFr��,z5Expected no fds from %r to be open in child, found %r)r�findfilerr$r%r&r'rJrh�set�maprIr~r"r�r#rr)	rZsleeper�	fd_status�p1�p2rB�errorZ
result_fdsZunwanted_fdsr	r	r
�test_pipe_cloexechs
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#rFcs'y�j�Wntk
r"YnXdS)N)r��ProcessLookupErrorr	)r�r	r
�kill_p1�s
zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1cs'y�j�Wntk
r"YnXdS)N)r�r�r	)r�r	r
�kill_p2�s
zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2r�zThe child hung)rr�rr$r%r&r'r#rJrr"rKr+�selectr�rr�)
rZqcatZqgrepZsubdatar�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�rrZrTr#rFr�zSome fds were closedzSome fds were left openzSubprocess failedc3s|]}�j�VqdS)N)r�)rYr�)rr	r
�	<genexpr>�sz6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>r[�pass_fdsz'Some fds not in pass_fds were left open)rr�r[r�rJr+r�r�r��devnullrX�add�set_inheritablerr$r%r&r'rhr�rIr~rrrA)
rr�rr�r
r,rB�ignored�
remaining_fdsZfds_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)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�rZzSome fds were left open.N)rr�rr$r%r&r�r�r'rh�
splitlinesrr�r�r�rIrr~r)rr�r,rBZ
unused_stderrZoutput_linesZ
opened_fdsr�r	r	r
�%test_close_fds_when_max_fd_is_lowered�s
0((z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredr�rDc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��WdQX|jdt|j��q�WdS)Nzfd_status.pyr�r�rDrrZTr#rr�r�zfd to be passed not passedzfd to be closed passedz-czimport sys; sys.exit(0)Fzoverriding close_fds)rr�r�r�r[r�rJr+r��updaterr$r%r&r'rhr�rIr~rArZassertWarns�RuntimeWarningr2r�Zwarning)rr�rr�rr
r,rBr�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#rr�r�z	output=%a)rr�r[r�rJr+r�r%r&�listr�r�rr$r'rhr�rIr~rr�)
rr�r�Znon_inheritabler�rr,rBr�rr	r	r
�test_pass_fds_inheritableMs"	z.POSIXProcessTestCase.test_pass_fds_inheritablec
CsStjtjd��8}tjtjddgd|d|�}|j�WdQXdS)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_fdgsz:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdc
CsStjtjd��8}tjtjddgd|d|�}|j�WdQXdS)Nzr+z-czimport sys; sys.exit(0)r#r)	r)r�r[r�rr$r%r&r)rr�r,r	r	r
�&test_stdout_stderr_are_single_inout_fdmsz;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdc
CsStjtjd��8}tjtjddgd|d|�}|j�WdQXdS)Nzr+z-czimport sys; sys.exit(0)rr")	r)r�r[r�rr$r%r&r)rr�r,r	r	r
�%test_stderr_stdin_are_single_inout_fdssz: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'rhrr=r�)rZsigchild_ignorer,r#rr	r	r
�test_wait_when_sigchild_ignoredys	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#rJr+rr�rAr�r)rr�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	r
rZ�s	zEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)
rr$r%r&r'rJr#r+rr��pidrAr
)rr,�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��4}tjdgdtjdtj��}WdQXWdQX|jttj|d	�|j|d
d�tjD��dS)Nz-czimport time;time.sleep(3)r#rcSsg|]}t|��qSr	)r�)rYr�r	r	r
rZ�s	zJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>g�������?r�rcSsg|]}t|��qSr	)r�)rYr�r	r	r
rZ�s	)rr$r%r&r'rJr#r+rr�r�r[rr(r�rAr
rrr6r��waitpidr\)rr,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�rZr#rTrNcstjd��S)NrZ)r[r�r	)r
r	r
rQ�szCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>r�)rr�r[r�rJr+rr$r%r&r'rhr�r�rIr~r\)rr�r,rBr�r�r	)r
r
�test_close_fds_after_preexec�sz1POSIXProcessTestCase.test_close_fds_after_preexecc	 Csddl}tj�}z�dd�}tj�d}x�ddgddgfdgdddgfdgdgddgfdgdgddffD]e\}}}}|jt��B|j||d	g||ddddd
ddd
d	d	|�WdQXq�WWd|stj�nXdS)NrcSsdS)Nr	r	r	r	r
rQ�sz5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>�exec�{sexesenvsargTrZr"rUr����r�r�r�)rUrarbrdr6r`Z	fork_execrc)	rrUZ
gc_enabled�funcZexecutable_listrZexe_listr{Zenv_listr	r	r
�test_fork_exec�s(
+z#POSIXProcessTestCase.test_fork_exec)r�r�)NrrrrrCrDrErFrGrKrMrRrVrr$r]r0r1r[rrrr^rfr%r6rmrtrfrwrxryr~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�r�r�r�Zcpython_onlyr�r	r	)r>r
r;�s�
+%!


-0#)0!Q" r;zWindows 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)NrZrUz-czimport sys; sys.exit(0)ru)rZSTARTUPINFOZdwFlagsZwShowWindowr2r%r&)rZSTARTF_USESHOWWINDOWZSW_MAXIMIZErur	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)"rv)r%rrKrr2r&)rZCREATE_NEW_CONSOLEr	r	r
�test_creationflags	s
z'Win32ProcessTestCase.test_creationflagscCsc|jttjtjddgddd��|jttjtjddgdtjdd�dS)	Nz-czimport sys; sys.exit(47)rNcSsdS)NrZr	r	r	r	r
rQ	sz8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>r#rT)r6rQrr2r%r&r')rr	r	r
rf	s		
			z&Win32ProcessTestCase.test_invalid_argscCs5tjtjddgdd�}|j|d�dS)Nz-czimport sys; sys.exit(47)rTr1)rr2r%r&r)rr3r	r	r
r� 	s		z#Win32ProcessTestCase.test_close_fdscCsptjj�}d|d<tjdgdddtjd|�}|j|jj�|j	d|jj
��dS)	N�physalisrXr�rxrZr#rYsphysalis)r[r\r]rr$r'rJr#r+rAr�)rr^r,r	r	r
rw'	s
		z(Win32ProcessTestCase.test_shell_sequencecCsmtjj�}d|d<tjddddtjd|�}|j|jj�|j	d|jj
��dS)	Nr�rXr�rxrZr#rYsphysalis)r[r\r]rr$r'rJr#r+rAr�)rr^r,r	r	r
rx1	s
		z&Win32ProcessTestCase.test_shell_stringcCs*tjtjd�}|j|d�dS)Nz -c "import sys; sys.exit(47)"r1)rr2r%r&r)rr3r	r	r
ry;	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#rrZr�r)rr$r%r&r'rJr#r+rr"r�r�rhrrrJ)rr�rr,r�rr=r	r	r
r�A	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#rrZr��*)rr$r%r&r'rJr#r+rr"r�rrr�rhrrr)rr�rr,r�rr3r	r	r
r�X	s			
z'Win32ProcessTestCase._kill_dead_processcCs|jdtj�dS)Nr�)r�r(r�)rr	r	r
r�q	sz%Win32ProcessTestCase.test_send_signalcCs|jd�dS)Nr)r�)rr	r	r
r�t	szWin32ProcessTestCase.test_killcCs|jd�dS)Nr�)r�)rr	r	r
r�w	sz#Win32ProcessTestCase.test_terminatecCs|jdtj�dS)Nr�)r�r(r�)rr	r	r
r�z	sz*Win32ProcessTestCase.test_send_signal_deadcCs|jd�dS)Nr)r�)rr	r	r
r�}	sz#Win32ProcessTestCase.test_kill_deadcCs|jd�dS)Nr�)r�)rr	r	r
r��	sz(Win32ProcessTestCase.test_terminate_deadN)rrrr�r�rfr�rwrxryr�r�r�r�r�r�r�r�r	r	r	r
r��s

r�c@seZdZdd�ZdS)�CommandTestscCs�|jtjd�d�|jtjd�d�d}zZtj�}tjj|d�}tjt	rndnd|�\}}|j
|d�Wd|dk	r�tj|�nXdS)Nz
echo xyzzy�xyzzyrZfooztype zcat )rr)rrZ	getoutputZgetstatusoutputrHr�r[rrrsr�rJ�rmdir)r�dirr}ZstatusrBr	r	r
�test_getoutput�	szCommandTests.test_getoutputN)rrrrr	r	r	r
r��	sr�ZPollSelectorz!Test needs selectors.PollSelectorc@s(eZdZdd�Zdd�ZdS)�ProcessTestCaseNoPollcCs)tj|_tjt_tj|�dS)N)r�_PopenSelector�
orig_selector�	selectorsZSelectSelectorr!r)rr	r	r
r�	szProcessTestCaseNoPoll.setUpcCs|jt_tj|�dS)N)rrrr!r)rr	r	r
r�	szProcessTestCaseNoPoll.tearDownN)rrrrrr	r	r	r
r�	src@s.eZdZejed�dd��ZdS)�HelperFunctionTestsz(errno and EINTR make no sense on windowscs�g��fdd�}|jdtj|dd��|jdg��|jdtj|d��|jd	d
dg��dS)NcsD�j|�t��dkr4ttjd��ntt|��S)Nr"zfake interrupted system call)r�r�r�r�ZEINTR�tuple�reversed)r)�record_callsr	r
�fake_os_func�	s
z?HelperFunctionTests.test_eintr_retry_call.<locals>.fake_os_func��r��)r
r�)r�r
)r)r�r
)r)r)rrZ_eintr_retry_call)rrr	)rr
�test_eintr_retry_call�	s		z)HelperFunctionTests.test_eintr_retry_callN)rrrr0r1r�rr	r	r	r
r�	srzWindows-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])))	r<rrHr�lowerrrr[rKr+)rr�rr)r>r	r
r�	s

zCommandsWithSpaces.setUpcs!tj|j�t�j�dS)N)r[rrrr<r)r)r>r	r
r�	szCommandsWithSpaces.tearDowncOs_tj|d<tj||�}|j|jj�|j|jj�jd�d|j	�dS)Nr#�mbcsz2 [%r, 'ab cd'])
rr'r$rJr#r+rr�r�rr)rrrr,r	r	r
�with_spaces�	s
zCommandsWithSpaces.with_spacescCs*|jdtj|jdfdd�dS)Nz"%s" "%s" "%s"zab cdrxrZ)rr%r&rr)rr	r	r
�test_shell_string_with_spaces�	sz0CommandsWithSpaces.test_shell_string_with_spacescCs&|jtj|jdgdd�dS)Nzab cdrxrZ)rr%r&rr)rr	r	r
�test_shell_sequence_with_spaces�	sz2CommandsWithSpaces.test_shell_sequence_with_spacescCs$|jdtj|jdf�dS)Nz"%s" "%s" "%s"zab cd)rr%r&rr)rr	r	r
�test_noshell_string_with_spaces�	sz2CommandsWithSpaces.test_noshell_string_with_spacescCs |jtj|jdg�dS)Nzab cd)rr%r&rr)rr	r	r
�!test_noshell_sequence_with_spaces�	sz4CommandsWithSpaces.test_noshell_sequence_with_spaces)
rrrrrrrrrrr	r	)r>r
r�	s		rc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ContextManagerTestsc
Cs�tjtjddgdtjdtj��9}|j|jj�d�|j|j	j�d�WdQX|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�)rrr	r	r
�	test_pipe�	s		zContextManagerTests.test_pipec	Cs;tjtjddg��}WdQX|j|jd�dS)Nz-czimport sys; sys.exit(100)�d)rr$r%r&rr=)rrr	r	r
�test_returncode�	sz#ContextManagerTests.test_returncodec
CsQtjtjddgdtj��'}|jd�|j|jd�WdQXdS)Nz-cz2import sys;sys.exit(sys.stdin.read() == 'context')r"scontextrZ)rr$r%r&r'rhrr=)rrr	r	r
r��	s
	
z*ContextManagerTests.test_communicate_stdincCsI|jt��4}tjdgdtjdtj��}WdQXWdQXdS)Nr�r#r)r6rvrr$r')rr>rr	r	r
rf
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"rKr�r=r6r��__exit__rr�r�)rrr	r	r
�test_broken_pipe_cleanup	
s	z,ContextManagerTests.test_broken_pipe_cleanupN)rrrrrr�rfrr	r	r	r
r�	s

rcCs9ttttttttf}tj	|�tj
�dS)N)r!r;r�r�rrrrrZrun_unittestr)Z
unit_testsr	r	r
�	test_main
s	
r�__main__).r0r�rrrr%r(r)Zlocaler[r�rHr�rerr4�warningsr�r�rar�rrkr6r�r�ZTestCaser�	Exceptionrr$rr!r1r;r8r�r�r9rrrrrr�mainr	r	r	r
�<module>sl
	����������+6