Uname:Linux ip-10-0-5-176 6.8.0-1057-aws #60~22.04.1-Ubuntu SMP Wed May 27 08:16:59 UTC 2026 x86_64

403WebShell
403Webshell
Server IP : 3.111.61.48  /  Your IP : 216.73.216.67
Web Server : Apache
System : Linux ip-10-0-5-176 6.8.0-1057-aws #60~22.04.1-Ubuntu SMP Wed May 27 08:16:59 UTC 2026 x86_64
User : ubuntu ( 1000)
PHP Version : 8.2.31
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/lib/python3.10/test/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/lib/python3.10/test/__pycache__/test_subprocess.cpython-310.pyc
o

�9jVq�@s�ddlZddlmZddlmZddlmZddlmZddlmZddlmZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZzddlZWne y�dZYnwzddl!Z!Wne y�dZ!Ynwzddl"Z"Wne y�dZ"Ynwzddl#Z#WndZ#Yej$r�e�%d	��e
j&d
kZ'e'r�dZ(ndZ(d
Z)e*e+e,fZ-e
j.ddfa/dd�Z0Gdd�dej1�Z2Gdd�de3�Z4Gdd�de	j5�Z6Gdd�de2�Z7Gdd�de2�Z8dd�Z9e�:e'd�Gdd �d e2��Z;e�<e'd!�Gd"d#�d#e2��Z=Gd$d%�d%ej1�Z>e�<e?ed&�d'�Gd(d)�d)e7��Z@e�<e'd*�Gd+d,�d,e2��ZAGd-d.�d.e2�ZBeCd/k�rke�D�dSdS)0�N)�mock)�support)�check_sanitizer)�
import_helper)�	os_helper)�warnings_helper)�FakePathztest is not helpful for PGO�win32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);�)�nonexisting_i_hope�-c�passcCsHt�d�}|durdSt�|tj�r t�|g�jdkr"|fadSdSdS)N�truer)	�shutil�which�os�access�X_OK�
subprocess�run�
returncode�ZERO_RETURN_CMD)�
shell_true�r�+/usr/lib/python3.10/test/test_subprocess.py�setUpModuleGs

�rc@�eZdZdd�Zdd�ZdS)�BaseTestCasecCst��dS�N)r�
reap_children��selfrrr�setUpRszBaseTestCase.setUpcCsBtstjD]}|��qt��|�tjd�|��t��dS)Nzsubprocess._active not empty)	�	mswindowsr�_active�wait�_cleanup�assertFalse�
doCleanupsrr)r!�instrrr�tearDownWs

�zBaseTestCase.tearDownN��__name__�
__module__�__qualname__r"r*rrrrrQsrc@seZdZdS)�PopenTestExceptionN)r,r-r.rrrrr/dsr/c@seZdZdZdd�ZdS)�PopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when
    _execute_child fails.
    cO�td��)NzForced Exception for Test)r/�r!�args�kwargsrrr�_execute_childl�z&PopenExecuteChildRaises._execute_childN)r,r-r.�__doc__r5rrrrr0hsr0c@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,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Ze� e!d9�d:d;��Z"e� e!d9�d<d=��Z#e� e!d9�d>d?��Z$d@dA�Z%dBdC�Z&dDdE�Z'dFdG�Z(dHdI�Z)dJdK�Z*e� e!dL�dMdN��Z+e� e!dL�dOdP��Z,dQdR�Z-e� e.j/e.j0kdS�dTdU��Z1e� e.j/e.j0kdS�e� e2�3�dV�dWdX���Z4dYdZ�Z5d[d\�Z6d]d^�Z7d_d`�Z8dadb�Z9dcdd�Z:dedf�Z;dgdh�Z<didj�Z=dkdl�Z>dmdn�Z?dodp�Z@dqdr�ZAdsdt�ZBdudv�ZCdwdx�ZDe�EeF�o/eGeFdy�dz�d{d|��ZHe�EeF�o?eGeFdy�dz�d}d~��ZIdd��ZJe� e.jKd�kd��e� e2�Ld��d�kd��e� eMd�d��d��d�d�����ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��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քZte�EeGeud׃dءe�EeGevdكdڡe�EeGevdۃdܡd�dބ���Zwe�Eevjx�yd�ev�z��d�d�d��Z{e� e!d�d�d��Z|e� e!d�d�d��Z}d�d�Z~d�S)��ProcessTestCasecCs�tjttjtjtjd�}z.|�|jtj�|�|jtj�|�|j	tj�W|j�
�|j�
�|j	�
�|��dS|j�
�|j�
�|j	�
�|��w)N��stdin�stdout�stderr)r�Popenr�PIPE�assertIsInstancer:�io�BufferedIOBaser;r<�closer%�r!�prrr�test_io_buffered_by_defaultrs �



�


z+ProcessTestCase.test_io_buffered_by_defaultcCs�tjttjtjtjdd�}z.|�|jtj�|�|jtj�|�|j	tj�W|j�
�|j�
�|j	�
�|��dS|j�
�|j�
�|j	�
�|��w)Nr)r:r;r<�bufsize)rr=rr>r?r:r@�	RawIOBaser;r<rBr%rCrrr�test_io_unbuffered_works�s �



�


z(ProcessTestCase.test_io_unbuffered_workscCs"t�tjddg�}|�|d�dS�Nr�import sys; sys.exit(47)�/�r�call�sys�
executable�assertEqual�r!�rcrrr�
test_call_seq�s
�zProcessTestCase.test_call_seqcCs"|jtjtjtjddgdd�dS)Nr�while True: pass皙�����?��timeout)�assertRaisesr�TimeoutExpiredrMrNrOr rrr�test_call_timeout�s

�z!ProcessTestCase.test_call_timeoutcCst�t�}|�|d�dS�Nr)r�
check_callrrPrQrrr�test_check_call_zero�s
z$ProcessTestCase.test_check_call_zerocC�R|�tj��}t�tjddg�Wd�n1swY|�|jjd�dSrI)	rXr�CalledProcessErrorr\rNrOrP�	exceptionr�r!�crrr�test_check_call_nonzero�s
��z'ProcessTestCase.test_check_call_nonzerocCs"t�tjddg�}|�d|�dS)Nr�
print('BDFL')�BDFL�r�check_outputrNrO�assertIn�r!�outputrrr�test_check_output�s
�z!ProcessTestCase.test_check_outputcCr^)Nrzimport sys; sys.exit(5)�)	rXrr_rgrNrOrPr`rrarrr�test_check_output_nonzero�s
��z)ProcessTestCase.test_check_output_nonzerocCs(tjtjddgtjd�}|�d|�dS)Nr�$import sys; sys.stderr.write('BDFL')�r<re)rrgrNrO�STDOUTrhrirrr�test_check_output_stderr�s

�z(ProcessTestCase.test_check_output_stderrcCsNt��}|�|j�|�d�|�d�tjtj	ddg|d�}|�
d|�dS)N�pearrr�6import sys; sys.stdout.write(sys.stdin.read().upper())�r:�PEAR)�tempfile�
TemporaryFile�
addCleanuprB�write�seekrrgrNrOrh)r!�tfrjrrr�test_check_output_stdin_arg�s

��z+ProcessTestCase.test_check_output_stdin_argcCs&tjtjddgdd�}|�d|�dS)Nrrsrr��inputrurfrirrr�test_check_output_input_arg����z+ProcessTestCase.test_check_output_input_argcCs&tjtjddgdd�}|�d|�dS)z<input=None has a legacy meaning of input='' on check_output.r�3import sys; print('XX' if sys.stdin.read() else '')Nr}sXX�rrgrNrO�assertNotInrirrr�test_check_output_input_none�r�z,ProcessTestCase.test_check_output_input_nonecC�(tjtjddgddd�}|�d|�dS)Nrr�T)r~�text�XXr�rirrr�!test_check_output_input_none_text����z1ProcessTestCase.test_check_output_input_none_textcCr�)Nrr�T)r~�universal_newlinesr�r�rirrr�/test_check_output_input_none_universal_newlines�r�z?ProcessTestCase.test_check_output_input_none_universal_newlinescCs*tjtjddgdddd�}|�d|�dS)Nrzprint('foo')�utf-8�ignore)r~�encoding�errors�foorfrirrr�,test_check_output_input_none_encoding_errors�s

�z<ProcessTestCase.test_check_output_input_none_encoding_errorscCsd|�t��}tjtjddgtjd�}|�d�Wd�n1s!wY|�d|j	j
d�dS)Nr�print('will not be run')�r;z-Expected ValueError when stdout arg supplied.r;r)rX�
ValueErrorrrgrNrOr;�failrhr`r3�r!rbrjrrr�test_check_output_stdout_arg�s
��z,ProcessTestCase.test_check_output_stdout_argcCs�t��}|�|j�|�d�|�d�|�t��}tj	t
jddg|dd�}|�d�Wd�n1s5wY|�
d|jjd�|�
d	|jjd�dS)
Nrrrrr��hare�r:r~�7Expected ValueError when stdin and input args supplied.r:r~)rvrwrxrBryrzrXr�rrgrNrOr�rhr`r3�r!r{rbrjrrr�&test_check_output_stdin_with_input_arg�s


��z6ProcessTestCase.test_check_output_stdin_with_input_argcCs`|�tj��}tjtjddgdd�}|�d�Wd�n1s!wY|�|jj	d�dS)Nr�Mimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)�rVzExpected TimeoutExpired.re)
rXrrYrgrNrOr�rPr`rjr�rrr�test_check_output_timeouts��	�z)ProcessTestCase.test_check_output_timeoutcCs8tj��}d|d<tjtjddg|d�}|�|d�dS)N�banana�FRUITrz5import sys, os;sys.exit(os.getenv("FRUIT")=="banana")��env�)r�environ�copyrrMrNrOrP)r!�newenvrRrrr�test_call_kwargss

��z ProcessTestCase.test_call_kwargscCs~t���)}|jttjdd�tjjjj}dg|d}|jttjg|�R�Wd�n1s0wY|�	|�
�d�dS)Nr�)�invalid_arg_namerr
)r�captured_stderrrX�	TypeErrorrr=�__init__�__code__�co_argcountrP�getvalue)r!�s�argcount�
too_many_argsrrr�test_invalid_argss
�z!ProcessTestCase.test_invalid_argscC�Rtjtjddgtjtjd�}|�|jj�|�|jj�|�	�|�
|jd�dS)Nr�print("banana")�r;r<)rr=rNrOr>rxr;rBr<r%rPr:rCrrr�test_stdin_none'��zProcessTestCase.test_stdin_nonecC�ld}tjtjd|gtjtjd�}|�|jj�|�|jj�|�	�\}}|�
|jd|�|�
|��d�dS)Nz�import sys; from subprocess import Popen, PIPE;p = Popen([sys.executable, "-c", "print('test_stdout_none')"],          stdin=PIPE, stderr=PIPE);p.wait(); assert p.stdout is None;rr�rstest_stdout_none�
rr=rNrOr>rxr;rBr<�communicaterPr�rstrip�r!�coderD�out�errrrr�test_stdout_none0s�z ProcessTestCase.test_stdout_nonecCr�)Nrr��r:r;)rr=rNrOr>rxr;rBr:r%rPr<rCrrr�test_stderr_noneGr�z ProcessTestCase.test_stderr_nonecKs6|dg}tj|fi|��}|��|�d|j�dS�NrJrK)rr=r%rPr)r!�pre_argsr4r3rDrrr�_assert_pythonPs
zProcessTestCase._assert_pythoncCs0tj�tj�tj�d�}|j|dgtjd�dS�N�doesnotexistr�rO)r�path�join�dirnamerNrOr��r!r�rrr�test_executableXs�zProcessTestCase.test_executablecCs6tj�tj�tj�d�}|j|dgt�tj�d�dSr�)rr�r�r�rNrOr��fsencoder�rrr�test_bytes_executablecs�


�z%ProcessTestCase.test_bytes_executablecCs4tj�tj�tj�d�}|j|dgttj�d�dSr�)rr�r�r�rNrOr�rr�rrr�test_pathlike_executableis�

�z(ProcessTestCase.test_pathlike_executablecCs0tjdg}|�|�|jt|j|tdd�dS)Nrrr�)rNrOr�rX�NONEXISTING_ERRORS�NONEXISTING_CMD)r!r�rrr� test_executable_takes_precedenceos


�z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellcCs|jgtjdd�dS�NT)rO�shell)r�rNrOr rrr�test_executable_replaces_shellysz.ProcessTestCase.test_executable_replaces_shellcCs|jgt�tj�dd�dSr�)r�rr�rNrOr rrr�$test_bytes_executable_replaces_shells
�z4ProcessTestCase.test_bytes_executable_replaces_shellcCs|jgttj�dd�dSr�)r�rrNrOr rrr�'test_pathlike_executable_replaces_shell�s
�z7ProcessTestCase.test_pathlike_executable_replaces_shellcCs6t�|��t��Wd�S1swYdSr)r�
change_cwdr�getcwd)r!�cwdrrr�_normalize_cwd�s$�zProcessTestCase._normalize_cwdcCstj�tj�}tj�|�Sr)rr��realpathrNrO�split)r!�python_pathrrr�_split_python_path�sz"ProcessTestCase._split_python_pathcKsltj|ddgfdtji|��}|�|jj�|��|�d|j�t	j
j}|�||�||j���
���dS)Nrzcimport os, sys; buf = sys.stdout.buffer; buf.write(os.getcwd().encode()); buf.flush(); sys.exit(47)r;rK)rr=r>rxr;rBr%rPrrr��normcase�read�decode)r!�expected_cwd�
python_argr4rDr�rrr�_assert_cwd�s���
�zProcessTestCase._assert_cwdcCs(t��}|�|�}|j|tj|d�dS�N�r�)rv�
gettempdirr�r�rNrO�r!�temp_dirrrr�test_cwd�s
zProcessTestCase.test_cwdcCs.t��}|�|�}|j|tjt�|�d�dSr�)rvr�r�r�rNrOrr�r�rrr�test_cwd_with_bytes�s
z#ProcessTestCase.test_cwd_with_bytescCs,t��}|�|�}|j|tjt|�d�dSr�)rvr�r�r�rNrOrr�rrr�test_cwd_with_pathlike�s
z&ProcessTestCase.test_cwd_with_pathlikez"pending resolution of issue #15533cCs�|��\}}tj�tj|�}t���*}|�tt	j
|g�|jtt	j
|g|d�|�|�}|j|||d�Wd�dS1s?wYdSr��
r�rr�r��curdirr�temp_cwdrX�FileNotFoundErrorrr=r�r�)r!�
python_dir�python_base�
rel_python�	wrong_dirrrr�test_cwd_with_relative_arg�s

�
�
"�z*ProcessTestCase.test_cwd_with_relative_argcCs�|��\}}tj�tj|�}d}t���.}|jtt	j
|g|d�|jtt	j
|g||d�|�|�}|j||||d�Wd�dS1sEwYdS)N�somethingyoudonthaver��rOr�r�)r!r�r�r��doesntexistr�rrr�!test_cwd_with_relative_executable�s 

�
�

�"�z1ProcessTestCase.test_cwd_with_relative_executablecCs�|��\}}tj�||�}tj�tj|�}t���!}|jtt	j
|g|d�|�|�}|j|||d�Wd�dS1s=wYdSr�)
r�rr�r�r�rr�rXr�rr=r�r�)r!r�r��
abs_pythonr�r�rrr�test_cwd_with_absolute_arg�s

�
"�z*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblecCs.|��\}}|�|�}|j|dtj|d�dS)Nr�r�)r�r�r�rNrO)r!r�r�rrr�test_executable_with_cwd�s


�z(ProcessTestCase.test_executable_with_cwdz#need an installed Python. See #7774cCs|jt��dtjd�dS)Nr�r�)r�rr�rNrOr rrr�test_executable_without_cwd�s
�z+ProcessTestCase.test_executable_without_cwdcCsHtjtjddgtjd�}|j�d�|j��|��|�	|j
d�dS)Nr�0import sys; sys.exit(sys.stdin.read() == "pear")rtrrr�)rr=rNrOr>r:ryrBr%rPrrCrrr�test_stdin_pipe�s
��
zProcessTestCase.test_stdin_pipecCsft��}|�|j�|��}t�|d�t�|dd�tj	t
jddg|d�}|��|�
|jd�dS�Nrrrrrrtr�)rvrwrxrB�filenorry�lseekrr=rNrOr%rPr�r!r{�drDrrr�test_stdin_filedess
��z"ProcessTestCase.test_stdin_filedescCsXt��}|�|j�|�d�|�d�tjtj	ddg|d�}|�
�|�|jd�dSr)
rvrwrxrBryrzrr=rNrOr%rPr�r!r{rDrrr�test_stdin_fileobjs


��z"ProcessTestCase.test_stdin_fileobjcC�Ttjtjddgtjd�}|�|�|j��d�Wd�dS1s#wYdS)Nr�&import sys; sys.stdout.write("orange")r��orange�rr=rNrOr>rPr;r�rCrrr�test_stdout_pipe!�
��"�z ProcessTestCase.test_stdout_pipecC�`t��}|�|j�|��}tjtjddg|d�}|�	�t
�|dd�|�t
�
|d�d�dS)Nrrr�r�r
�rvrwrxrBrrr=rNrOr%rrrPr�rrrr�test_stdout_filedes)�
��z#ProcessTestCase.test_stdout_filedescC�Pt��}|�|j�tjtjddg|d�}|��|�	d�|�
|��d�dS)Nrrr�rr
�rvrwrxrBrr=rNrOr%rzrPr�r	rrr�test_stdout_fileobj5�
��
z#ProcessTestCase.test_stdout_fileobjcCr)Nr�*import sys; sys.stderr.write("strawberry")ro�
strawberry)rr=rNrOr>rPr<r�rCrrr�test_stderr_pipe@rz ProcessTestCase.test_stderr_pipecCr)Nrrrorrrrrrrr�test_stderr_filedesHrz#ProcessTestCase.test_stderr_filedescCr)Nrrrorrrr	rrr�test_stderr_fileobjTrz#ProcessTestCase.test_stderr_fileobjcCsRtjtjddgtjtjd�}|��\}}|�|d�|�|d�|�|jd�dS)Nrz�import sys, subprocess;rc = subprocess.call([sys.executable, "-c",    "import sys;"    "sys.stderr.write('42')"],    stderr=subprocess.STDOUT);sys.exit(rc)r�s42�r�rr=rNrOr>r�rPr�r!rDr;r<rrr�,test_stderr_redirect_with_no_stdout_redirect_s
��	z<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectcCsXtjtjddgtjtjd�}|�|�|j��d�Wd�dS1s%wYdS)Nr�Rimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r��appleorange)	rr=rNrOr>rprPr;r�rCrrr�test_stdout_stderr_pipets
��"�z'ProcessTestCase.test_stdout_stderr_pipecCsRt��}|�|j�tjtjddg||d�}|��|�	d�|�
|��d�dS)Nrr#r�rr$rr	rrr�test_stdout_stderr_file�s
��
z'ProcessTestCase.test_stdout_stderr_filecCr�)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 == 18rr�rstest with stdout=1r�r�rrr�test_stdout_filedes_of_stdout�s�z-ProcessTestCase.test_stdout_filedes_of_stdoutcC�2tjtjddgtjd�}|��|�|jd�dS)Nrz'for i in range(10240):print("x" * 1024)r�)rr=rNrO�DEVNULLr%rPr;rCrrr�test_stdout_devnull��
��z#ProcessTestCase.test_stdout_devnullcCr()Nrz=import sys
for i in range(10240):sys.stderr.write("x" * 1024)ro)rr=rNrOr)r%rPr<rCrrr�test_stderr_devnull�s
��z#ProcessTestCase.test_stderr_devnullcCr()Nrzimport sys;sys.stdin.read(1)rt)rr=rNrOr)r%rPr:rCrrr�test_stdin_devnull�r+z"ProcessTestCase.test_stdin_devnull�F_GETPIPE_SZz%fcntl.F_GETPIPE_SZ required for test.c	Cs�t��\}}zt�|tj�}Wt�|�t�|�nt�|�t�|�w|d}|dkr2t�d��tjt	j
ddgtjtjtj|d�}z.|j|j
|jfD]}|�t�|��tj�|�qL|j�d�|j��W|��|��dS|��|��w)N�iz+default pipesize too small to perform test.r�Qimport sys; sys.stdin.read(); sys.stdout.write("out"); sys.stderr.write("error!")�r:r;r<�pipesizerr)r�pipe�fcntlr.rB�unittest�SkipTestrr=rNrOr>r:r;r<rPrry�killr%)r!�test_pipe_r�test_pipe_w�pipesize_defaultr2rD�fiforrr�test_pipesizes�s>

������
zProcessTestCase.test_pipesizesc	Cs�tjtjddgtjtjtjdd�}zMt��\}}z+t�|tj�}|j	|j
|jfD]}|�t�|�
�tj�|�q(Wt�|�t�|�nt�|�t�|�w|j	��W|��|��dS|��|��w)Nrr0���r1)rr=rNrOr>rr3r4r.r:r;r<rPrrBr7r%)r!rD�fp_r�fp_w�default_pipesizer;rrr�test_pipesize_default�s4����

��
z%ProcessTestCase.test_pipesize_defaultcCsjtj��}d|d<tjtjddgtj|d��}|��\}}|�	|d�Wd�dS1s.wYdS)N�oranger�r�2import sys,os;sys.stdout.write(os.getenv("FRUIT"))�r;r�r
)
rr�r�rr=rNrOr>r�rP�r!r�rDr;r<rrr�test_env�s

��"�zProcessTestCase.test_envr	z#cannot test an empty env on Windows�Py_ENABLE_SHAREDr�zEThe Python shared library cannot be loaded with an empty environment.T)�addressz)AddressSanitizer adds to the environment.cs�dd��tjtjddgtjid��*}|��\}}t|���}|�|t	��fdd�|D�}|�
|g�Wd�dS1s>wYdS)	z+Verify that env={} is as empty as possible.cSs*d|vpd|vp|dkp|�d�p|dkS)z:Determine if an environment variable is under our control.�	VERSIONER�__CF�
LD_PRELOAD�SANDBOX�LC_CTYPE)�
startswith)�nrrr�is_env_var_to_ignores���z<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignorerz)import os; print(list(os.environ.keys()))rDcsg|]}�|�s|�qSrr)�.0�k�rPrr�
<listcomp>s
�z2ProcessTestCase.test_empty_env.<locals>.<listcomp>N)rr=rNrOr>r��eval�stripr?�listrP)r!rDr;r<�child_env_namesrrSr�test_empty_envs

	��"�zProcessTestCase.test_empty_envcCs�tjd}|�t��t�|ddg�Wd�n1swY|�t��t�tjddg�Wd�dS1s<wYdS)N�rr
zpass#)rNrOrXr�rr=)r!�cmdrrr�test_invalid_cmd"s
�"�z ProcessTestCase.test_invalid_cmdcCsHtj��}d|d<|�t��tjt|d�Wd�n1s wYtj��}d|d<|�t��tjt|d�Wd�n1sEwYtj��}d|d<|�t��tjt|d�Wd�n1sjwYtj��}d|d<tjtj	d	d
gtj
|d��}|��\}}|�|d�Wd�dS1s�wYdS)
N�cabbagezFRUITVEGETABLEr�zorangeVEGETABLE=cabbager��lemonzFRUIT=ORANGEzorange=lemonrz3import sys, os;sys.stdout.write(os.getenv("FRUIT"))rDsorange=lemon)
rr�r�rXr�rr=rrNrOr>r�rPrErrr�test_invalid_env,s6
�
�
�

��"�z ProcessTestCase.test_invalid_envcCs4tjtjddgtjd�}|�d�|�|jd�dS)Nrz/import sys;sys.exit(sys.stdin.read() == "pear")rtrrr�r rCrrr�test_communicate_stdinJs
��
z&ProcessTestCase.test_communicate_stdincCs@tjtjddgtjd�}|��\}}|�|d�|�|d�dS)Nrz)import sys; sys.stdout.write("pineapple")r��	pineapple�rr=rNrOr>r�rPr!rrr�test_communicate_stdoutR�
��z'ProcessTestCase.test_communicate_stdoutcCs@tjtjddgtjd�}|��\}}|�|d�|�|d�dS)Nrz)import sys; sys.stderr.write("pineapple")rorarbr!rrr�test_communicate_stderrZrdz'ProcessTestCase.test_communicate_stderrcCsttjtjddgtjtjtjd�}|�|jj�|�|jj�|�|j	j�|�
d�\}}|�|d�|�|d�dS)NrzNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())r9�bananara)rr=rNrOr>rxr;rBr<r:r�rPr!rrr�test_communicatebs
��z ProcessTestCase.test_communicatecCsdtjtjddgdtjtjtjd�}|jtj|jddd�|��\}}|�|d�|�|�	�d�dS)	Nrz~import sys,os,time;sys.stderr.write("pineapple\n");time.sleep(1);sys.stderr.write("pear\n");sys.stdout.write(sys.stdin.read())T)r�r:r;r<r�g333333�?rVspineapple
pear
)
rr=rNrOr>rXrYr�rP�encoder!rrr�test_communicate_timeoutqs
��
�z(ProcessTestCase.test_communicate_timeoutcCsLtjtjddgtjd�}|jtj|jdd�|��\}}|�t	|�d�dS)Nrz�import sys,os,time;sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));r�g�������?rVi)
rr=rNrOr>rXrYr�rP�len)r!rDr;�_rrr�%test_communicate_timeout_large_output�s
�	�
z5ProcessTestCase.test_communicate_timeout_large_outputcCs�dD]W}dD]R}dD]M}i}|rtj|d<|rtj|d<|r#tj|d<|s&q
tjtfi|��}|��|jdur?|�|jj�|jdurK|�|jj�|j	durW|�|j	j�q
qqdS)N�FTr:r;r<)
rr>r=rr�r:�
assertTrue�closedr;r<)r!�
stdin_pipe�stdout_pipe�stderr_pipe�optionsrDrrr�test_communicate_pipe_fd_leak�s0





����z-ProcessTestCase.test_communicate_pipe_fd_leakcCs:t�tjddg�}|��\}}|�|d�|�|d�dS)NrrJ)rr=rNrOr�rPr!rrr�test_communicate_returns�s
�z(ProcessTestCase.test_communicate_returnscCs�t��\}}t�|�t�|�tjtjddtjgtj	tj	tj	d�}|�
|jj�|�
|jj�|�
|j
j�dtj}|�|�\}}|�||�dS)Nrzpimport sys,os;sys.stdout.write(sys.stdin.read(47));sys.stderr.write("x" * %d);sys.stdout.write(sys.stdin.read())r9�a)rr3rBrr=rNrOr�
PIPE_MAX_SIZEr>rxr;r<r:r�rP)r!�x�yrD�string_to_writer;r<rrr�test_communicate_pipe_buf�s$


���	
z)ProcessTestCase.test_communicate_pipe_bufcCs�tjtjddgtjtjtjd�}|�|jj�|�|jj�|�|j	j�|j	�
d�|�d�\}}|�|d�|�|d�dS)Nrz0import sys,os;sys.stdout.write(sys.stdin.read())r9rfssplitsbananasplitr)
rr=rNrOr>rxr;rBr<r:ryr�rPr!rrr�test_writes_before_communicate�s
��z.ProcessTestCase.test_writes_before_communicatec
Cs�tjddtdg}dD]g}tj|fidtjdtj|di��}|�J|j�d�|j��|�	|j
��d�|j�d	�|j��|�
|j
j�|�	|j
��d
�|�	|j
�d�d	�|�	|j
��d�Wd�n1snwYqdS)
Nr�import 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;Tzline1
zline3
zline2
�zline4
line5
line6
line7
line8)rNrO�	SETBINARYrr=r>r:ry�flushrPr;�readlinerBrxr�)r!r3�extra_kwargrDrrr� test_universal_newlines_and_text�s:���

������z0ProcessTestCase.test_universal_newlines_and_textcCs^tjtjddtdgtjtjdd�}|�|jj�|�|j	j�|�
�\}}|�|d�dS)Nrr}z�buf = sys.stdout.buffer;buf.write(b"line2\n");buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");r�)r<r;r�z#line2
line4
line5
line6
line7
line8)rr=rNrOrr>rxr;rBr<r�rPr!rrr�#test_universal_newlines_communicates
����z3ProcessTestCase.test_universal_newlines_communicatecCsHtjtjddtt�d�gtjdd�}|�d�\}}|�	|j
d�dS)Nrr}a
                               s = sys.stdin.readline()
                               assert s == "line1\n", repr(s)
                               s = sys.stdin.read()
                               assert s == "line3\n", repr(s)
                              r�)r:r��line1
line3
r)rr=rNrOr�textwrap�dedentr>r�rPrr!rrr�)test_universal_newlines_communicate_stdins
��	z9ProcessTestCase.test_universal_newlines_communicate_stdincCs0tjttjtjdd�}|��|�|jd�dS)NT)r:r;r�r)rr=rr>r�rPrrCrrr�.test_universal_newlines_communicate_input_none(s�z>ProcessTestCase.test_universal_newlines_communicate_input_nonecCs�tjtjddtt�d�gtjtjtjdd�}|�|j	j
�|�|jj
�|�d�\}}|�
|jd�|�
d|�|�|�d	��dS)
Nrr}a�
                               s = sys.stdin.buffer.readline()
                               sys.stdout.buffer.write(s)
                               sys.stdout.buffer.write(b"line2\r")
                               sys.stderr.buffer.write(b"eline2\n")
                               s = sys.stdin.buffer.read()
                               sys.stdout.buffer.write(s)
                               sys.stdout.buffer.write(b"line4\n")
                               sys.stdout.buffer.write(b"line5\r\n")
                               sys.stderr.buffer.write(b"eline6\r")
                               sys.stderr.buffer.write(b"eline7\r\nz")
                              T)r:r<r;r�r�rzline1
line2
line3
line4
line5
zeline2
eline6
eline7
)rr=rNrOrr�r�r>rxr;rBr<r�rPrrnrNr!rrr�7test_universal_newlines_communicate_stdin_stdout_stderr4s
�
�zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrcCsTdD]%}d|}tjd|g}tj|tjtj|d�}|jdd�\}}|�|d�qdS)N)zutf-16z	utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))r)r:r;r�r
r}z1
2
3
4)rNrOrr=r>r�rP)r!r�r�r3�popenr;r<rrr�-test_universal_newlines_communicate_encodingsPs���z=ProcessTestCase.test_universal_newlines_communicate_encodingscCs\dD])\}}d}tjd|g}tj|tjtjd|d�}|jdd�\}}|�|d�|��qdS)	N))r�r
)�replaceu��)�surrogateescapeu��)�backslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')rr�)r:r;r�r�r
r}z[{}])rNrOrr=r>r�rP�format)r!r��expectedr�r3r�r;r<rrr�test_communicate_errorsfs��z'ProcessTestCase.test_communicate_errorsc
CsBtsd}nd}g}t��}z�t|�D]3}ztj�|tj�}|�	t�
|tjtjB��Wqt
yE}z|jtjkr:�WYd}~nd}~ww|�d|�td�D]	}t�|���qQtd�D]}tjtjddgtjtjtjd�}|�d	�d
}|�|d	�q_W|D]}	t�|	�q�t�|�dS|D]}	t�|	�q�t�|�w)Niiz4failed to reach the file descriptor limit (tried %d)�
�rz-import sys;sys.stdout.write(sys.stdin.read())r9slimer)r#rv�mkdtemp�rangerr�r�r�TESTFN�append�open�O_WRONLY�O_CREAT�OSError�errno�EMFILE�skipTestrB�poprr=rNrOr>r�rPr�rmtree)
r!�max_handles�handles�tmpdir�i�tmpfile�erD�data�hrrr�test_no_leaking{sL���
���
�zProcessTestCase.test_no_leakingcCs�|�t�gd��d�|�t�gd��d�|�t�gd��d�|�t�gd��d�|�t�gd	��d
�|�t�gd��d�|�t�gd
��d�|�t�ddg�d�dS)N)za b crr�z"a b c" d e)�ab"c�\rz	ab\"c \ d)r�z \rz
ab\"c " \\" d)za\\\bzde fgr�za\\\b "de fg" h)za\"brbrz
a\\\"b c d)za\\b crr�z"a\\b c" d e)za\\b\ crr�z
"a\\b\ c" d e�abr
zab "")rPr�list2cmdliner rrr�test_list2cmdline�s0��������z!ProcessTestCase.test_list2cmdlinecCsbtjtjddgtjd�}|�|jj�|�|�	��t
�|j��d�|�
�|�|�	�d�dS)Nrzimport os; os.read(0, 1)rt�Ar)rr=rNrOr>rxr:rB�assertIsNone�pollrryrr%rPrCrrr�	test_poll�s
��zProcessTestCase.test_pollcCs.t�t�}|�|��d�|�|��d�dSr[�rr=rrPr%rCrrr�	test_wait�s
zProcessTestCase.test_waitcCsvt�tjddg�}|�tj��}|jdd�Wd�n1s wY|�dt|j	��|�
|jtjd�d�dS)Nrzimport time; time.sleep(0.3)�-C��6?rVz0.0001r)
rr=rNrOrXrYr%rh�strr`rPr�
SHORT_TIMEOUT)r!rDrbrrr�test_wait_timeout�s��z!ProcessTestCase.test_wait_timeoutcCs<|�t��t�td�Wd�dS1swYdS)NrB)rXr�rr=rr rrr�test_invalid_bufsize�s"�z$ProcessTestCase.test_invalid_bufsizecCs>t�td�}|�|��d�tjtdd�}|�|��d�dS)Nr)rFr�rCrrr�test_bufsize_is_none�sz$ProcessTestCase.test_bufsize_is_nonec
Cs�tjtjddgtjtjtjd|d��C}|j�|�t�	|j�
��|j��}t
���z|j�	�Wn	ty;YnwWd�n1sFwYd|_Wd�n1sXwY|�|jd�|�||�dS)NrzDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r�)r:r;r<rFr�r)rr=rNrOr>r)r:ryrrBrr;r�r�SuppressCrashReportr�rPr)r!�liner�r�rD�	read_linerrr�_test_bufsize_equal_one�s.�

����z'ProcessTestCase._test_bufsize_equal_onecCsd}|j||dd�dS)Nzline
T�r�)r��r!r�rrr� test_bufsize_equal_one_text_mode�sz0ProcessTestCase.test_bufsize_equal_one_text_modecCsPdtj��}|�td��|j|ddd�Wd�dS1s!wYdS)Nslinezline bufferingrFr�)r�lineseprh�assertWarnsRegex�RuntimeWarningr�r�rrr�"test_bufsize_equal_one_binary_mode�s"�z2ProcessTestCase.test_bufsize_equal_one_binary_modec	CsPtd�D]!}|�t��tjttjtjd�Wd�n1s wYqdS)Nrr�)r�rXr�rr=r�r>)r!r�rrr�test_leaking_fds_on_error�s����z)ProcessTestCase.test_leaking_fds_on_errorc	Cs�z	ddl}|jWnttfy|�d�Ynwt�dt�d��}tj	d|g}t
j|t
jdd�}|�|�
�d}Wd�n1sEwY|�|d	�|�|jd�dS)
Nrzneed msvcrt.CrtSetReportModezL
            import msvcrt
            import subprocess

            cmd = a

            for report_type in [msvcrt.CRT_WARN,
                                msvcrt.CRT_ERROR,
                                msvcrt.CRT_ASSERT]:
                msvcrt.CrtSetReportMode(report_type, msvcrt.CRTDBG_MODE_FILE)
                msvcrt.CrtSetReportFile(report_type, msvcrt.CRTDBG_FILE_STDERR)

            try:
                subprocess.Popen(cmd,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            except OSError:
                pass
        rT)r<r�r�r
)�msvcrt�CrtSetReportMode�AttributeError�ImportErrorr�r�r�r�rNrOrr=r>r�rPr)r!r�r�r[�procr<rrr�test_nonexisting_with_pipes
s&
�
���z+ProcessTestCase.test_nonexisting_with_pipescs g��fdd�}tj|d�}|��zP|�t��tjttjtjtjd�Wd�n1s/wYW|�	�d}�D]}zt
�|�Wq=tyZ}z|}WYd}~q=d}~ww|dura|�dS|�	�d}�D]}zt
�|�Wqkty�}z|}WYd}~qkd}~ww|dur�|�w)Ncs*td�D]}��t���t�d�qdS)N�g����MbP?)r��extendrr3�time�sleep)r���fdsrr�open_fds6s�z<ProcessTestCase.test_double_close_on_error.<locals>.open_fds)�targetr9)
�	threading�Thread�startrX�EnvironmentErrorrr=r�r>r�rrBr�)r!r��t�exc�fdr�rr�r�test_double_close_on_error3sH���������z*ProcessTestCase.test_double_close_on_errorcs�t�tjddg��|��jd�g���fdd�}t�d|�}|��t	r(d}nd}�j
tjd	�|j�j|d
d���
�|j�j|dd�|�
�|�d
d|fd|fg��dS)z?Issue21291: Popen.wait() needs to be threadsafe for returncode.rzimport time; time.sleep(12)NcsN��d���f���������d�jf������d�jf�dS)N�thread-start-poll-result�thread-after-kill-and-wait�thread-after-second-wait)r�r�r7r%rr�r��resultsrr�kill_proc_timer_threadWszDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_thread皙�����?r�i����rVz*unexpected result in wait from main thread��msgz&unexpected result in second main wait.)r�Nr�r�)rr=rNrOrPrr��Timerr�r#r%rr�r�)r!r�r��expected_errorcoderr�r�test_threadsafe_waitPs4
�
�
���z$ProcessTestCase.test_threadsafe_waitcCs6d�d�}t�tjd|g�}|�|�d�t|��dS)N�;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0rsHello World!)r�rrgrNrOrnrN�ascii)r!r�rjrrr�test_issue8780�s
zProcessTestCase.test_issue8780cCs�t��\}}t��\}}t��\}}ztjdg|||d�Wn'tyEt�|�t�|�t�|�t�|�t�|�t�|�Ynw|�tj	�
|��|�tj	�
|��|�tj	�
|��dS)N�*r9)rv�mkstemprr=r�rrB�remover'r��exists)r!�ifhandle�ifname�ofhandle�ofname�efhandle�efnamerrr� test_handles_closed_on_exception�s$
�




�z0ProcessTestCase.test_handles_closed_on_exceptioncCsTtjttjtjtjd�}|�|jj�|�|jj�|�|jj�|�	dd�dS)Nr9�x�)
rr=rr>rxr;rBr<r:r�rCrrr�test_communicate_epipe�s�z&ProcessTestCase.test_communicate_epipec	
Cs�t�d�}|jj}dddgdddfgd�dddf|dd	d
|�d�fg}tjj�tj	d��$|D]\}}}}tj	||d
�}||_
|�t|�|�q/Wd�dS1sSwYdS)Nz
my-tool.py)�lsT�{z#<Popen: returncode: 123 args: 'ls'>)�daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTrzP<Popen: returncode: 0 args: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...>r�Fz&<Popen: returncode: None args: ['ls']>)r�z	--my-optsr�zP<Popen: returncode: None args: ['ls', '--my-opts', 'aaaaaaaaaaaaaaaaaaaaaaaa...>�z<Popen: returncode: 7 args: z('my-tool.py')>r5�r�)
�pathlib�Path�	__class__r,r5r�patch�objectrr=rrP�repr)	r!�path_cmd�pathlib_cls�casesr[r�r��sxrDrrr�	test_repr�s"

��	�"�zProcessTestCase.test_reprcCs8tjttjd�}|�|jj�|��|�dd�dS)Nrtr�r�)	rr=rr>rxr:rBr%r�rCrrr�!test_communicate_epipe_only_stdin�s�z1ProcessTestCase.test_communicate_epipe_only_stdin�SIGUSR1zRequires signal.SIGUSR1r7zRequires os.kill�getppidzRequires os.getppidc	Cs�dd�}t�tj|�}|�tjtj|�tjddg}dD]$}|tji}tj|fi|���}|��Wd�n1s;wYqdS)NcS�dSrr)�signum�framerrr�handler��z7ProcessTestCase.test_communicate_eintr.<locals>.handlerrz7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r�)	�signalrrxrNrOrr>r=r�)r!r�old_handlerr3�stream�kw�processrrr�test_communicate_eintr�s�

���z&ProcessTestCase.test_communicate_eintr�/proc/%d/fdzLinux specificcCspdt��}t�|�}|�t��tttjtjtjd�Wd�n1s&wYt�|�}|�	||�dS)z;Test for the fork() failure fd leak reported in issue16327.rr9N)
r�getpid�listdirrXr/r0rrr>rP)r!�fd_directory�fds_before_popen�fds_after_exceptionrrr�!test_failed_child_execute_fd_leak�s
��
	z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on WindowscCsL|�t��}t�gd��Wd�n1swY|�|jjd�dS)N)�/opt/nonexistent_binary�with�somer3r )rXr�rrMrPr`�filenamerarrr�%test_file_not_found_includes_filename�s�z5ProcessTestCase.test_file_not_found_includes_filenamecCsP|�t��}tjddgdd�Wd�n1swY|�|jjd�dS)N�exit�0z/some/nonexistent/directoryr�)rXr�rr=rPr`r#rarrr� test_file_not_found_with_bad_cwd�s�z0ProcessTestCase.test_file_not_found_with_bad_cwdcCs,|�tjttj�|�tjttj�dSr)r?rr=�bytes�types�GenericAlias�CompletedProcessr�r rrr�test_class_getitemssz#ProcessTestCase.test_class_getitemsN)r,r-r.rErHrSrZr]rcrkrmrqr|rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r5�skipIfr#r�r�r�r�r�r�r�r�r�r�r�r�rN�base_prefix�prefixr��	sysconfig�is_python_buildrrrr
rrrrrrr"r%r&r'r*r,r-�
skipUnlessr4�hasattrr<rArF�platform�get_config_varrrYr\r_r`rcrergrirlrtrur{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
rrrrr��isdirrrr$r'r,rrrrr8ps*		

		










�
�
�

	�
 �

���
'')4����




r8c@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$�Ze�ed%�d&d'��Ze�e�d(�d)�d*d+��Zd,S)-�RunFuncTestCasecKstjd|g}tj|fi|��S)z4Run Python code in a subprocess using subprocess.runr)rNrOrr)r!r�r4�argvrrr�
run_pythonszRunFuncTestCase.run_pythoncCsR|�d�}|�|jd�|�tj��
|��Wd�dS1s"wYdSr�)r9rPrrXrr_�check_returncode�r!�cprrr�test_returncode
s


"�zRunFuncTestCase.test_returncodecCsN|�tj��}|jddd�Wd�n1swY|�|jjd�dS)NrJT��checkrK)rXrr_r9rPr`rrarrr�
test_checks�zRunFuncTestCase.test_checkcCs tjtdd�}|�|jd�dS)NTr>r)rrrrPrr;rrr�test_check_zeroszRunFuncTestCase.test_check_zerocCs@|�tj��|jddd�Wd�dS1swYdS)NrTr�rV)rXrrYr9r rrr�test_timeouts"�zRunFuncTestCase.test_timeoutcC�"|jdtjd�}|�d|j�dS)Nrdr�re�r9rr>rhr;r;rrr�test_capture_stdout#sz#RunFuncTestCase.test_capture_stdoutcCrC)Nrnrore)r9rr>rhr<r;rrr�test_capture_stderr(s�z#RunFuncTestCase.test_capture_stderrcCsLt��}|�|j�|�d�|�d�|jd|tjd�}|�	d|j
�dS)Nrrrrsr�ru)rvrwrxrBryrzr9rr>rhr;)r!r{r<rrrr|-s

�z+RunFuncTestCase.test_check_output_stdin_argcCs$|jddtjd�}|�d|j�dS)Nrsrr)r~r;rurDr;rrrr8s
�z+RunFuncTestCase.test_check_output_input_argcCs�t��}|�|j�|�d�|�d�|jtdd��}|jd|dd�}Wd�n1s.wY|�	d|j
jd�|�	d	|j
jd�dS)
Nrrrr�r�r�r�r�r:r~)rvrwrxrBryrzrXr�r9rhr`r3r�rrrr�?s

���z6RunFuncTestCase.test_check_output_stdin_with_input_argcCsb|�tj��}|jddtjd�}Wd�n1swY|�|jjd�|�|jjd�dS)Nr�r�)rWr;re)	rXrrYr9r>rPr`rjr;)r!rbr<rrrr�Ls��	z)RunFuncTestCase.test_check_output_timeoutcCs2tj��}d|d<|jd|d�}|�|jd�dS)Nr�r�zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)r��!)rr�r�r9rPr)r!r�r<rrr�test_run_kwargsZs
�zRunFuncTestCase.test_run_kwargscCs�trdnd}t�|�}|dur|�|�d��t|�}tj|tjd�}|�|j	d�|�
t��tj|tjdd�Wd�dS1sDwYdS)Nztree.comr�z required for this testr�rT)r;r�)r#rrr�rrrr)rPrrXr�)r!�progr��resrrr�test_run_with_pathlike_pathbs
"�z+RunFuncTestCase.test_run_with_pathlike_pathcCs2t�tj�}|ddg}t�|�}|�|jd�dS)Nrsimport sys; sys.exit(57)�9)rr�rNrOrrrPr�r!r�r3rJrrr�&test_run_with_bytes_path_and_argumentsps

z6RunFuncTestCase.test_run_with_bytes_path_and_argumentscCs0ttj�}|ddg}t�|�}|�|jd�dS)Nrzimport sys; sys.exit(57)rL)rrNrOrrrPrrMrrr�)test_run_with_pathlike_path_and_argumentsws


z9RunFuncTestCase.test_run_with_pathlike_path_and_argumentscCs.|jddd�}|�d|j�|�d|j�dS)Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)�capture_outputresFLUFL)r9rhr;r<r;rrr�test_capture_output~s
�z#RunFuncTestCase.test_capture_outputcC�~t��}|�|j�|jtdd��}|jdd|d�}Wd�n1s$wY|�d|jj	d�|�d|jj	d�dS)	NzAExpected ValueError when stdout and capture_output args supplied.r�r�T)rPr;r;rrP�
rvrwrxrBrXr�r9rhr`r3r�rrr�#test_stdout_with_capture_output_arg�����z3RunFuncTestCase.test_stdout_with_capture_output_argcCrR)	NzAExpected ValueError when stderr and capture_output args supplied.r�r�T)rPr<r<rrPrSr�rrr�#test_stderr_with_capture_output_arg�rUz3RunFuncTestCase.test_stderr_with_capture_output_argz)requires posix like 'sleep' shell commandc
Cs�t��}ztjddddd�Wntjy*}zt��}t��}WYd}~n
d}~ww|�d�|j||dd|�d	�d
�dS)zJOutput capturing after a timeout mustn't hang forever on open filehandles.zsleep 3TrU)r�rWrPNzTimeoutExpired not raised.g�?z/TimeoutExpired was delayed! Bad traceback:
```
z```r�)	r��	monotonicrrrY�	traceback�
format_excr��
assertLess)r!�before_secsr��
after_secs�stacksrrr�.test_run_with_shell_timeout_and_capture_output�s 

���
�
�z>RunFuncTestCase.test_run_with_shell_timeout_and_capture_output�
HAVE_VFORKz!vfork() not enabled by configure.cCs�|�tj�tj�tdd��|j|�d�jddd�Wd�n1s%wYGdd�d�}tj�td|���#|j|�d�jdd	d�t`|j|�d�jdd
d�Wd�dS1s`wYdS)N�
_USE_VFORKFr
rzFalse _USE_VFORK failedr�c@�eZdZdd�ZdS)z4RunFuncTestCase.test__use_vfork.<locals>.RaisingBoolcSr1)Nz"force PyObject_IsTrue to return -1)�RuntimeErrorr rrr�__bool__�r6z=RunFuncTestCase.test__use_vfork.<locals>.RaisingBool.__bool__N)r,r-r.rcrrrr�RaisingBool��rdz"odd bool()-error _USE_VFORK failedz%lack of a _USE_VFORK attribute failed)	rnrr`rrrrPr9r)r!rdrrr�test__use_vfork�s ����"�zRunFuncTestCase.test__use_vforkN)r,r-r.r9r=r@rArBrErFr|rr�r�rHrKrNrOrQrTrVr5r-r#r^r0r5rfrrrrr7s2


�r7c	Cs@dD]}trz
t�|�W|StyYqwqt�d��)N)�staff�nogroup�grp�nobody�	nfsnobodyz?No identified group name to use for this test on this platform.)ri�getgrnam�KeyErrorr5r6)�
name_grouprrr�_get_test_grp_name�s���
rozPOSIX specific testscseZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�ZGdd�dej	�Z
e�d
�dd��Z
e�d
�dd��Ze�ej�d�d�dd��Zdd�Ze�eed�d�dd��Ze�eed�d�dd��Ze�eed�d �d!d"��Ze�eed�d#�d$d%��Ze�eed&�d'�d(d)��Ze�eed&�d*�d+d,��Ze�ep�eed-�d.�d/d0��Zd1d2�Z d3d4�Z!d5d6�Z"d7d8�Z#d9d:�Z$d;d<�Z%Gd=d>�d>ej	�Z&e�ej�d?�d@�dAdB��Z'dCdD�Z(e�e)j*dEkdF�dGdH��Z+dIdJ�Z,dKdL�Z-dMdN�Z.dOdP�Z/dQdR�Z0dSdT�Z1dUdV�Z2e�e)j*�3dW�dX�dYdZ��Z4d[d\�Z5d]d^�Z6d_d`�Z7dadb�Z8dcdd�Z9dedf�Z:dgdh�Z;didj�Z<dkdl�Z=dmdn�Z>dodp�Z?dqdr�Z@dsdt�ZAdudv�ZBdwdx�ZCdydz�ZDd{d|�ZEd}d~�ZFdd��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPe�e)j*�3d���o�e�Qd��jRe�Qd��jRkd��d�d���ZSeT�Ud�d��d�d���ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`eTjad�d���ZbeTjad�d���Zcd�d��Zdd�d��Zed�d��Zfd�d��Zge�ehd�u�o�eehd��d��d�d���Zid�dÄZjd�dńZkd�dDŽZl�ZmS)��POSIXProcessTestCasecst���d|_dS)Nz/_this/pa.th/does/not/exist)�superr"�_nonexistent_dirr �rrrr"�s

zPOSIXProcessTestCase.setUpc
CsPzt�|j�Wnty}z	|}WYd}~|Sd}~ww|�d|j�|S)Nz,chdir to nonexistent directory %s succeeded.)r�chdirrrr�r�)r!r��desired_exceptionrrr�_get_chdir_exception�s���z)POSIXProcessTestCase._get_chdir_exceptionc
C�|��}ztjtjddg|jd�}Wn+ty=}z|�|j|j�|�|j	|j	�|�|j
|j
�WYd}~dSd}~ww|�d|�dS)z;Test error in the child raised in the parent for a bad cwd.rr
r�N�Expected OSError: %s�rvrr=rNrOrrr�rPr��strerrorr#r��r!rurDr�rrr�test_exception_cwd��
���z'POSIXProcessTestCase.test_exception_cwdc
Crw)zBTest error in the child raised in the parent for a bad executable.rr
r�Nrxryr{rrr�test_exception_bad_executable�r}z2POSIXProcessTestCase.test_exception_bad_executablec
Cs�|��}zt�|jddg�}Wn+ty:}z|�|j|j�|�|j|j�|�|j|j�WYd}~dSd}~ww|�	d|�dS)z?Test error in the child raised in the parent for a bad args[0].rr
Nrx)
rvrr=rrr�rPr�rzr#r�r{rrr�test_exception_bad_args_0s��z.POSIXProcessTestCase.test_exception_bad_args_0c@ra)z&POSIXProcessTestCase.PopenNoDestructorcCrrrr rrr�__del__rz.POSIXProcessTestCase.PopenNoDestructor.__del__N)r,r-r.r�rrrr�PopenNoDestructorrer�z%subprocess._posixsubprocess.fork_execc	Cs�dd�}||_tjdtd��,|�t��|�dg�Wd�n1s%wYWd�dSWd�dS1s=wYdS)z>Test error passing done through errpipe_write in the good casecWs0|d}d�tj���}t�|d|d�dS)N�
z{:x}sOSError:�:r)r�r��EISDIRrhrry)r3�
errpipe_write�err_coderrr�proper_error#szHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_error�subprocess.os.waitpid��side_effect�non_existent_commandN)r�rr�ChildProcessErrorrX�IsADirectoryErrorr�)r!�	fork_execr�rrr�test_exception_errpipe_normal s���"�z2POSIXProcessTestCase.test_exception_errpipe_normalc	s�d��fdd�}||_tjdtd��$|�tj��}|�dg�Wd�n1s*wYWd�n1s9wY|�t	��t
|j��dS)zZTest error passing done through errpipe_write where its not
        in the expected formats�ޭcs|d}t�|��dS)Nr�r)rry)r3r���
error_datarr�	bad_error6szGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_errorr�r�r�N)r�rrr�rXr�SubprocessErrorr�rhrr�r`)r!r�r�r�rr�r�test_exception_errpipe_bad_data1s����z4POSIXProcessTestCase.test_exception_errpipe_bad_data�/proc/self/statuszneed /proc/self/statuscCs�tjddgdd�}|��D]}|�d�r|}nq
|�d�tjddgdd�}|��D]}|�d�r6|}nq+|j||dd	�dS)
N�catr�F)�restore_signalssSigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.r�)rrg�
splitlinesrNr��assertNotEqual)r!�default_proc_statusr��default_sig_ign_mask�restored_proc_status�restored_sig_ign_maskrrr�test_restore_signalsGs,�
�
�
�
�z)POSIXProcessTestCase.test_restore_signalsc
Csrz
tjtjddgdd�}Wnty'}z|jtjkr�WYd}~dSd}~wwt�d�}t	|�}|�
||�dS)Nrzimport os; print(os.getsid(0))T)�start_new_sessionr)rrgrNrOr�r��EPERMr�getsid�intr�)r!rjr��
parent_sid�	child_sidrrr�test_start_new_session_s

����
z+POSIXProcessTestCase.test_start_new_session�setreuidzno setreuid on platformc

Cst��}|dkr
dnd|g}tjdkrdnd}tdur3zt�|�|�|�Wnty2d}Ynw|D]i}dD]d}|j||d��Szt	j
tjdd	g||d�}Wn$tyZYn4t
yu}z|jtjtjfvrk�WYd}~nd}~wwt|t�r�t�|�j}n|}t|�}	|�|	|�Wd�n1s�wYq9q5|�t��t	jtd
d�Wd�n1s�wY|�t��t	jttjtjdd
�Wd�n1s�wYtdu�r|du�r|�t��t	jt|d�Wd�dS1s�wYdSdSdS)N���darwinrj�unknownrm)�user�	close_fdsrzimport os; print(os.getuid())r=�r��)r�r�r�)r�geteuidrNr4�pwd�getpwnamr�rm�subTestrrgrO�PermissionErrorr�r��EACCESr��
isinstancer��pw_uidr�rPrXr�r\r�
OverflowErrorr�r�)
r!�uid�
test_users�name_uidr�r�rjr��user_uid�
child_userrrr�	test_userosf
��
����
�����
��"��zPOSIXProcessTestCase.test_userz setreuid() available on platformcC�>|�t��tjtdd�Wd�dS1swYdS)N�r��rXr�rr\rr rrr�test_user_error��"�z$POSIXProcessTestCase.test_user_error�setregidzno setregid() on platformc	Cs�t��}|dkr
dndg}t�}tdur|�|�||gD]N}dD]I}|j||d��8ztjtj	ddg||d�}Wn	t
yCYnwt|t�rPt�
|�j}n|}t|�}|�||�Wd�n1sfwYq"q|�t��tjtdd�Wd�n1s�wY|�t��tjttjtjd	d
�Wd�n1s�wYtdur�|�t��tjt|d�Wd�dS1s�wYdSdS)Nr�r�rm)�groupr�rzimport os; print(os.getgid())r=�r�r�)r�r�r�)r�getegidrorir�r�rrgrNrOr�r�r�rl�gr_gidr�rPrXr�r\rr�r�r�)	r!�gid�
group_listrnr�r�rj�	group_gid�child_grouprrr�
test_group�sR
�
��
�����
��"��zPOSIXProcessTestCase.test_groupz setregid() available on platformcCr�)Nr�r�r�r rrr�test_group_error�r�z%POSIXProcessTestCase.test_group_error�	setgroupszno setgroups() on platformc

Cs�t��}|dkr
dndg}t�}d}tdur|�|�z
tjtjddg|d�}Wnt	yC}z|j
t
jkr7�d}WYd}~n3d}~wwt��}t
�|�}tdurYdd	�|D�}	n|}	|rh|�t|�t|��n
|�t|	�t|��|�t��tjtd
gd�Wd�n1s�wY|�t��tjttjtjdgd�Wd�n1s�wYtdur�|�t��tjt|gd�Wd�dS1s�wYdSdS)
Nr�r�Frz;import os, sys, json; json.dump(os.getgroups(), sys.stdout)��extra_groupsTcSs&g|]}t|t�rt�|�jn|�qSr)r�r�rirlr�)rQ�grrrrT�s�z:POSIXProcessTestCase.test_extra_groups.<locals>.<listcomp>r=r�)r�r�r�)rr�rorir�rrgrNrOr�r�r��	getgroups�json�loadsrP�setrXr�r\rr�r�)
r!r�r�rn�
perm_errorrj�ex�
parent_groups�child_groups�desired_gidsrrr�test_extra_groups�sZ
�
���
�����"��z&POSIXProcessTestCase.test_extra_groupsz!setgroups() available on platformcCs>|�t��tjtgd�Wd�dS1swYdS)Nr�r�r rrr�test_extra_groups_errorr�z,POSIXProcessTestCase.test_extra_groups_error�umaskzPOSIX umask() is not available.c	Cs�d}zCt��}tj�|d�}tjtjdd|�d�gdd�t�	|�j
d@}d}|j||t|��d	t|���d
�W|durDt
�|�dSdS|durPt
�|�ww)N�beansrzopen(z, 'w').close()�+)r�i�i�z != r�)rvr�rr�r�rr\rNrO�stat�st_moderP�octrr�)r!r��namer��
expected_moderrr�
test_umask
s$����zPOSIXProcessTestCase.test_umaskcCsXt���t�tjddg�}|��Wd�n1swY|�|jt	j
�dS)Nrzimport os; os.abort())rr�rr=rNrOr%rPrr�SIGABRTrCrrr�test_run_abort#s

�
�z#POSIXProcessTestCase.test_run_abortcCsNt�ttj�d�}t|�}|�d|���|�d|�|�ttj�|�dS)N�fake cmdr�SIG)rr_r�rr�r�rh�lower�r!r��error_stringrrr�"test_CalledProcessError_str_signal+s
z7POSIXProcessTestCase.test_CalledProcessError_str_signalcC�$t�dd�}t|�}|�d|�dS)Ni�Ki�r�zunknown signal 9876543.�rr_r�rhr�rrr�*test_CalledProcessError_str_unknown_signal6�z?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalcCr�)Nr/r�znon-zero exit status 2.r�r�rrr�$test_CalledProcessError_str_non_zero;r�z9POSIXProcessTestCase.test_CalledProcessError_str_non_zerocCsZtjtjddgtjdd�d�}|�|�|j��d�Wd�dS1s&wYdS)NrrCcSst�dd�S)Nr��apple)r�putenvrrrr�<lambda>G�z3POSIXProcessTestCase.test_preexec.<locals>.<lambda>)r;�
preexec_fn�applerrCrrr�test_preexec@s
��"�z!POSIXProcessTestCase.test_preexecc
Cs�dd�}z
tjtjddg|d�}Wn6tjy,}z|�tjd�WYd}~dSd}~wtyG}z|�d|j	d�WYd}~dSd}~ww|�
d	�dS)
NcSr1)Nz'What if two swallows carried a coconut?�r�rrrr�raise_itLr6z=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itrr
�r�z)Expected a ValueError from the preexec_fn�coconutrzEException raised by preexec_fn did not make it to the parent process.)rr=rNrOr�rn�_posixsubprocessr�rhr3r�)r!r�rDr�rrr�test_preexec_exceptionKs 
��� ��z+POSIXProcessTestCase.test_preexec_exceptionc@� eZdZdZdd�Zdd�ZdS)z+POSIXProcessTestCase._TestExecuteChildPopenz3Used to test behavior at the end of _execute_child.cOs$||_tjj|g|�Ri|��dSr)�	_testcaserr=r�)r!�testcaser3r4rrrr�]sz4POSIXProcessTestCase._TestExecuteChildPopen.__init__cOszJtjj|g|�Ri|��Wdd�td�D�}z'|D]}|jj||j��|j��|j	��fdd�qW|D]}t
�|�q6dS|D]}t
�|�qBwdd�td�D�}z&|D]}|jj||j��|j��|j	��fdd�qWW|D]}t
�|�qrw|D]}t
�|�q}w)NcSsg|]	}t�dtj��qS)�	/dev/zero)rr��O_RDONLY�rQrkrrrrThs�zNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>�z!At least one fd was closed early.r�)rr=r5r�rr�r:rr;r<rrB)r!r3r4�devzero_fdsr�rrrr5asH�����������
��z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)r,r-r.r7r�r5rrrr�_TestExecuteChildPopen[srrz/dev/zero required.c	CsVdd�}|�tj��|j|ttjtjtj|d�Wd�dS1s$wYdS)z6Issue16140: Don't double close pipes on preexec error.cSs
t�d��)Nz-force the _execute_child() errpipe_data path.)rr�rrrrr�xs�zWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_it)r:r;r<r�N)rXrr�rrr>)r!r�rrr�0test_preexec_errpipe_does_not_double_close_pipests�"�zEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipescCs�t��}zKt��|�t���tjtjddgdd�d�|�t��d�t��|�	t���tjtjddgdd�d�|�	t��d�W|sNt��dSdS|sWt��ww)	Nrr
cSrrrrrrrr���zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>r�z#Popen enabled gc when it shouldn't.cSrrrrrrrr��r
zPopen left gc disabled.)
�gc�	isenabled�disabler'rrMrNrO�enablern)r!�enabledrrr�test_preexec_gc_module_failure�s*�
���
�z3POSIXProcessTestCase.test_preexec_gc_module_failurer�z!setrlimit() seems to fail on OS Xc
Cs�zddlm}m}m}Wnty#}z|�|�WYd}~nd}~ww||�}|\}}||d|f�|�|||�ztjt	j
ddgdd�d�Wn
tySYdSw|�d�dS)	Nr)�	getrlimit�	setrlimit�RLIMIT_NPROCrr
cSrrrrrrrr��r
z@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>r�z.RLIMIT_NPROC had no effect; probably superuser)�resourcerrrr�r�rxrrMrNrO�BlockingIOError)r!rrrr��limitsrk�hardrrr�test_preexec_fork_failure�s$��
��z.POSIXProcessTestCase.test_preexec_fork_failurecCs�t��\}}t|ddd��}|�dtj�|�dtj�Wd�n1s(wYt�	|d�t
�|�}|��t�
|�|�|jd�dS�N�wr�)r�z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
i�rK)rvr�r�ryr�
unix_shellrNrOr�chmodrr=r%r�rPr)r!r��fname�fobjrDrrr�test_args_string�s��

z%POSIXProcessTestCase.test_args_stringcCs<|jttjtjddgdd�|jttjtjddgdd�dS)NrrJrK��startupinfo��
creationflags�rXr�rrMrNrOr rrrr��s
��
�
�z&POSIXProcessTestCase.test_invalid_argscCsjtj��}d|d<tjdgdtj|d�}|�|�|j���	d�d�Wd�dS1s.wYdS�Nr�r�zecho $FRUITr��r�r;r�s 	
r��
rr�r�rr=r>rPr;r�rV�r!r�rDrrr�test_shell_sequence�s

�"�z(POSIXProcessTestCase.test_shell_sequencecCshtj��}d|d<tjddtj|d�}|�|�|j���	d�d�Wd�dS1s-wYdSr%r'r(rrr�test_shell_string�s
�"�z&POSIXProcessTestCase.test_shell_stringcCs�t��\}}t|ddd��}|�dtj�|�dtj�Wd�n1s(wYt�	|d�t
�|�}t�|�|�
|d�dSr)rvr�r�ryrrrNrOrrrrMr�rP)r!r�rrrRrrr�test_call_string�s��

z%POSIXProcessTestCase.test_call_stringc	Cs�g}dD]}dD]}tj�||�}tj�|�r|�|�qq|s%|�d�d}tj�|�r8tj�|�s8|�|�|D],}tjd|dtj	d�}|�|�
|j���
�t|d��Wd�n1sawYq:dS)	N)z/binz	/usr/bin/z/usr/local/bin)�bash�kshz"bash or ksh required for this testz/bin/shzecho $0T)rOr�r;r�)rr�r��isfiler�r��islinkrr=r>rPr;r�rVr()r!�shellsr/r��shrDrrr�test_specific_shell�s,
��


����z(POSIXProcessTestCase.test_specific_shellc
Gstt�tjtj�}ztjtjddgdtjtjtjd�}Wt�tj|�nt�tj|�w|j�	d�t
||�|�|S)Nrz�if 1:
                                 import sys, time
                                 sys.stdout.write('x\n')
                                 sys.stdout.flush()
                                 time.sleep(30)
                                 T�r�r:r;r<r�)r�SIGINT�default_int_handlerrr=rNrOr>r;r��getattr)r!�methodr3rrDrrr�
_kill_process�s� z"POSIXProcessTestCase._kill_process)�netbsd�openbsdz"Due to known OS bug (issue #16762)cGsRtjtjddgdtjtjtjd�}|j�d�t�d�t	||�|�|�
�dS)Nrz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             Tr3r�)rr=rNrOr>r;r�r�r�r6r�)r!r7r3rDrrr�_kill_dead_process	s�
z'POSIXProcessTestCase._kill_dead_processcCs:|�dtj�}|��\}}|�d|�|�|��d�dS)N�send_signalsKeyboardInterruptr)r8rr4r�rhr�r%�r!rDrkr<rrr�test_send_signal+	sz%POSIXProcessTestCase.test_send_signalcC�:|�d�}|��\}}|�|d�|�|��tj�dS)Nr7r)r8r�rPr%r�SIGKILLr=rrr�	test_kill1	�
zPOSIXProcessTestCase.test_killcCr?)N�	terminater)r8r�rPr%r�SIGTERMr=rrr�test_terminate7	rBz#POSIXProcessTestCase.test_terminatecC�|�dtj�dS�Nr<)r;rr4r rrr�test_send_signal_dead=	sz*POSIXProcessTestCase.test_send_signal_deadcC�|�d�dS�Nr7�r;r rrr�test_kill_deadA	�z#POSIXProcessTestCase.test_kill_deadcCrI�NrCrKr rrr�test_terminate_deadE	rMz(POSIXProcessTestCase.test_terminate_deadcCs6g}|D]}t�|�}t�|�}|�|||f�q|Sr)r�get_inheritable�dupr�)r!�save_fdsr�r��inheritable�savedrrr�	_save_fdsI	s

zPOSIXProcessTestCase._save_fdscCs.|D]\}}}tj|||d�t�|�qdS)N)rS)r�dup2rB)r!r�r�rTrSrrr�_restore_fdsQ	s�z!POSIXProcessTestCase._restore_fdsc		Cs�d}|�|�}|D]
\}}}|dkr|}nq	z1|D]}t�|�qtjtjddg|tjtjd���\}}|�	|d�|�	|d�W|�
|�dS|�
|�w)Nrrr#r9r�r
)rUrrBrr=rNrOr>r�rPrW)	r!r�r:�	saved_fdsr�rTrSr�r�rrr�check_close_std_fdsV	s,
�
���z(POSIXProcessTestCase.check_close_std_fdscC�|�dg�dSr[�rYr rrr�test_close_fd_0o	�z$POSIXProcessTestCase.test_close_fd_0cCrZ�Nr�r[r rrr�test_close_fd_1r	r]z$POSIXProcessTestCase.test_close_fd_1cCrZ)Nr/r[r rrr�test_close_fd_2u	r]z$POSIXProcessTestCase.test_close_fd_2cC�|�ddg�dS)Nrr�r[r rrr�test_close_fds_0_1x	�z'POSIXProcessTestCase.test_close_fds_0_1cCra)Nrr/r[r rrr�test_close_fds_0_2{	rcz'POSIXProcessTestCase.test_close_fds_0_2cCra)Nr�r/r[r rrr�test_close_fds_1_2~	rcz'POSIXProcessTestCase.test_close_fds_1_2cCs|�gd��dS)N)rr�r/r[r rrr�test_close_fds_0_1_2�	sz)POSIXProcessTestCase.test_close_fds_0_1_2c
Cs�t�d�}t�d�}z.t�d�t�d�t�tjddg���Wt�|d�t�|d�t�|�t�|�dSt�|d�t�|d�t�|�t�|�w)z=Issue #15798: Popen should work when stdio fds are available.rr�rz*print('AssertionError:0:CLOEXEC failure.')N)	rrQrBrr=rNrOr%rV)r!�	new_stdin�
new_stdoutrrr�test_small_errpipe_write_fd�	s$



�
�
z0POSIXProcessTestCase.test_small_errpipe_write_fdc

CsVdd�td�D�}z�dd�|D�}|D]	\}}t�|�qt�|dd�t�|ddd�|�td��}z-t|�D]
\}}t�||�q:tj	t
jdd	g|d|d
|dd�}|��W|�
|�n|�
|�w|D]	}t�|dd�qkt�|d
d�}t�|dd���}	|�|d
�|�|	d�W|D]}t�|�q�dS|D]}t�|�q�w)NcS�g|]}t���qSr�rvr��rQr�rrrrT�	�z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>r�cS�g|]\}}|�qSrr�rQr�rrrrrT�	rmr��STDINrr�Zimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")r/r9r�	got STDIN�err)r�r�unlinkryrrU�	enumeraterVrr=rNrOr%rWr�rVrPrB)
r!�temps�temp_fdsr�rrX�temp_fdrDr�r�rrr�test_remapping_std_fds�	s>
��
��z+POSIXProcessTestCase.test_remapping_std_fdsc

Cs:dd�td�D�}dd�|D�}z�|D]	\}}t�|�q|�td��}zNt|�D]
\}}	t�|	|�q)t�|d�t�|dd�tj	t
jddg|||d	�}
|
��|D]	}t�|dd�qTt�
|d
�}t�
|d
���}W|�|�n|�|�w|�|d�|�|d�W|D]}t�|�q�dS|D]}t�|�q�w)
NcSrjrrkrlrrrrT�	rmz7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>r�cSrnrrrorrrrT�	rmrprrrqr9rrrrs)r�rrtrUrurVryrrr=rNrOr%r�rVrWrPrB)
r!�stdin_no�	stdout_no�	stderr_norvrwr�rrXrxrDr�r�rrr�check_swap_fds�	s>
����z#POSIXProcessTestCase.check_swap_fdscCsX|�ddd�|�ddd�|�ddd�|�ddd�|�ddd�|�ddd�dS)Nrr�r/)r}r rrr�
test_swap_fds�	sz"POSIXProcessTestCase.test_swap_fdscCs�|�td��}z�|D]}t���}t�|��|�Wd�n1s#wYq
ttd��t|���}t�	|�gd�}i}t
||�D]
\}}	||||	<qEt�d�}
ttd��t|���}t
jtjd|
t|�gfi|��}|�|d�t
||�D]9\}}	t�|dtj�t�|d�}
ttt|
�d���}t�d|�d	|�d
|�d|�d|	�d
��}|�|	g||�q|W|�|�dS|�|�w)Nr�r9z�
                import os, sys
                skipped_fd = int(sys.argv[1])
                for fd in range(3):
                    if fd != skipped_fd:
                        os.write(fd, str(fd).encode('ascii'))
            rrrr�z"
                    When testing z to z4 redirection,
                    parent descriptor z5 got redirected
                    to descriptor(s) z instead of descriptor z.
                )rUr�rvrwrrVrr�r�rB�zipr�r�rrMrNrOr�rPr�SEEK_SETr�rW�mapr�r�rW)r!�from_fds�to_fdsrX�from_fd�f�fd_to_close�	arg_namesr4�to_fdr��
skipped_fdrR�
read_bytes�read_fdsr�rrr�#_check_swap_std_fds_with_one_closed
sJ
��

�����
��z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedcCs<t�td�d�D]}t�td�d�D]}|�||�qqdS)Nr�r/)�	itertools�combinationsr��permutationsr�)r!r�r�rrr�!test_swap_std_fds_with_one_closed,
s
��z6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc
Cs�dd�}z	tjt|d�WnBty.}z|�tj�|�t|�d�WYd}~dSd}~wtjyO}z|�	tj�|�t|�d�WYd}~dSd}~ww|�
d�dS)NcSr1)N�
surrogate:�r�rrrr�prepare2
r6zCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparer�r�z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)rrMrr�r�r�rPr�r��assertIsNotNoner�)r!r�r�rrr�test_surrogates_error_message1
s 
����z2POSIXProcessTestCase.test_surrogates_error_messagecCs�dD]j\}}|�dd�}dt|�}tj��}|||<d|d<|}tjtjd|g|d�}|�	d	�}|�
|�d�t|��|�dd�}d
t|�}tj��}|||<tjtjd|g|d�}|�	d	�}|�
|�d�t|��qdS)N))�testuabc�)utest��42r�r�z&import os; print(ascii(os.getenv(%s)))�C�LC_ALLrr�s

z'import os; print(ascii(os.getenvb(%s))))
rhrrr�r�rrgrNrOr�rPr�r�)r!�key�value�
encoded_value�scriptr��
decoded_valuer;rrr�test_undecodable_envD
s0

�


�
�z)POSIXProcessTestCase.test_undecodable_envc	Cs�t�td�}ttdd��}tj�td�\}}t�|�}t�|g|�}|�|d�d|d�	|��
d�f}tj|dd�}|�|d�tj��}||d<tj|g||d	�}|�|d�tj
��}t�|�|d
<tj|g||d	�}|�|d�dS)Nrr�s'%s' %s� r�Tr��PATHr�sPATH)rr�rrWr�r�rrMrPr�rhr�r��environb)	r!�abs_programr3r��program�exitcoder[r��envbrrr�test_bytes_programa
s"


z'POSIXProcessTestCase.test_bytes_programc	Cs�tjddd�}tjddd�}tjtj|gtjtjtjdd�}|�|jd�tjtj|gtjdd�}|��\}}t	t
t|�d	���}t	|j
��|j��|j��g�}|�||@d
|||@f�dS)Nzinput_reader.py�subprocessdata��subdir�fd_status.pyF)r:r;r<r�r�r;r��,z5Expected no fds from %r to be open in child, found %r)r�findfilerr=rNrOr>rxr�r�r�r�r�r:rr;r<r')	r!�sleeper�	fd_status�p1�p2rj�error�
result_fds�unwanted_fdsrrr�test_pipe_cloexec|
s(���

��z&POSIXProcessTestCase.test_pipe_cloexecc
stjddd�}tjddd�}d}|dd}tjtj|gtjtjdd	��tjtj||g�jtjdd	��|��j	�|��j	��fd
d�}�fdd
�}|�|�|�|��j
�|��j
��t
�
�jgggd�\}}}	|�|d�|��j��|��j���j��dS)Nzqcat.pyr�r�zqgrep.pyszxcvbn��
F)r:r;r�c�$z���WdStyYdSwr�rC�ProcessLookupErrorr)r�rr�kill_p1�
�
�zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1cr�rr�r)r�rr�kill_p2�
r�zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2r�zThe child hung)rr�rr=rNrOr>r;rxr%r:ryrB�selectrnrPr�)
r!�qcat�qgrep�subdatar�r�r��	readfiles�ignored1�ignored2r)r�r�r�test_pipe_cloexec_real_tools�
s2��



z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc
s�tjddd�}t��}|�tj|d�|�tj|d�t|��td�D]}t�tj	tj
�}|�tj|���|�q%�D]}t�|d�q>t
jtj|gt
jdd	�}|��\}}ttt|�d
���}|�|�@�d�t
jtj|gt
jdd	�}|��\}}ttt|�d
���}|�|�@d�|�d|d
�t�fdd�td�D��}	t
jtj|gt
jd|	d�}|��\}}ttt|�d
���}|�||	�@d�|�d|d
�dS)Nr�r�r�rr��	TFr�r�zSome fds were closedzSome fds were left openzSubprocess failedc3s�|]}���VqdSr)r�r�r�rr�	<genexpr>�
s�z6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>r�r;r��pass_fdsz'Some fds not in pass_fds were left open)rr�rr3rxrBr�r�r��devnullr�add�set_inheritablerr=rNrOr>r�r�r�r�rPr'rh)
r!r�r�rkr�rDrj�ignored�
remaining_fds�fds_to_keeprr�r�test_close_fds�
sN���
���z#POSIXProcessTestCase.test_close_fds�freebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.cCs�tjddd�}tjtjdt�d|�gtjd�}|�	�\}}|�
�}|jt|�dd|d	�t
tt|d
���d���}t
tt|d���d���}|j||@d
d	�dS)z;Confirm that issue21618 is fixed (may fail under valgrind).r�r�r�raK
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

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

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

        max_fd_open = max(open_fds)

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

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        r�r/z(expected exactly two lines of output:
%rr�rr�r�zSome fds were left open.N)rr�rr=rNrOr�r�r>r�r�rPrjr�r�r�rVr�r')r!r�rDrj�
unused_stderr�output_lines�
opened_fdsr�rrr�%test_close_fds_when_max_fd_is_lowered�
s$
/��0�2�

�z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredr�rlc	Cs>tjddd�}t�}td�D]-}t��}|�tj|d�|�tj|d�t�|dd�t�|dd�|�	|�q|D]^}t
jtj
|gt
jd|fd�}|��\}}ttt|�d	���}	||h}
|�||	d
�|�|	|
@d�|�t��}|�t
jtd|fd
��Wd�n1s�wY|�dt|j��q>dS)Nr�r�r�rlrr�Tr�r�zfd to be passed not passedzfd to be closed passedF)r�r�zoverriding close_fds)rr�r�r�rr3rxrBr��updaterr=rNrOr>r�r�r�r�rhr'�assertWarnsr�rMrr��warning)r!r�r�rxr�r�rDrjr�r��to_be_closed�contextrrr�
test_pass_fds?s:�

�
���z"POSIXProcessTestCase.test_pass_fdsc
Cs�tjddd�}t��\}}|�tj|�|�tj|�t�|d�t�|d�||f}tj|g}|t	t
t|��7}tj
|tjd|d�}|��\}}tt
t|�d���}	|�|	t|�d|�|�t�|�d�|�t�|�d�dS)	Nr�r�r�TFr�r�z	output=%a)rr�rr3rxrBr�rNrOrWr�r�rr=r>r�r�r�r�rPrP)
r!r�rS�non_inheritabler�r3rDrjr�r�rrr�test_pass_fds_inheritableas$
�z.POSIXProcessTestCase.test_pass_fds_inheritablec	Cstjddd�}g}td�D]}t�tjtj�}|�tj|�|�	|�q
t�
�\}}|�tj|�|�tj|�|�d|�tj
tj|g|d|d|dd|d��t�|d	�}Wd
�n1scwYdd�|�d
�D�}|�|hd�t|�Bd|���d
S)z7Regression test for https://bugs.python.org/issue32270.r�r�r�r/r�rT)r:r;r<r�r�rNcSsh|]}t|��qSr)r�)rQ�numrrr�	<setcomp>�rmz@POSIXProcessTestCase.test_pass_fds_redirected.<locals>.<setcomp>r�>rr�r/zoutput=)rr�r�rr�r��O_RDWRrxrBr�r3�insertrr=rNrOr�r�rP�	frozenset)	r!r�r�rkr��stdout_r�stdout_wrjr�rrr�test_pass_fds_redirecteds*��$z-POSIXProcessTestCase.test_pass_fds_redirectedcC�Lt�tjd��}tjt||d�}|��Wd�dS1swYdS)N�r+)r;r:�r@r�rr�rr=rr%�r!�inoutrDrrr�%test_stdout_stdin_are_single_inout_fd���
"�z:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdcCr�)Nr�r�r�r�rrr�&test_stdout_stderr_are_single_inout_fd�r�z;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdcCr�)Nr�)r<r:r�r�rrr�%test_stderr_stdin_are_single_inout_fd�r�z:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdcCsRtjddd�}tjtj|gtjtjd�}|��\}}|�d|j	d|�
d��dS)Nzsigchild_ignore.pyr�r�r�rz6sigchild_ignore.py exited non-zero with this error:
%sr�)rr�rr=rNrOr>r�rPrr�)r!�sigchild_ignorerDr;r<rrr�test_wait_when_sigchild_ignored�s��
�z4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc	Cs�t�d�}tjtjddgtjdd�}|j}|�|j	�z|�
|�d�d�|�||�
|gggd�d�W|��dS|��w)	Nr�rz$import sys;sys.stdout.write("apple")r)r;rFr�sapplg)r�
import_modulerr=rNrOr>r;rxrBrPr�rhr�r%)r!r�rDr�rrr�test_select_unbuffered�s

�� z+POSIXProcessTestCase.test_select_unbufferedcCs�tjtjddgtjtjd�}|�|jj�|�|jj�t	|�}|j
}t�dt
f��
d}Wd�n1s7wYtrF|�tj�dS|�|dd�tjD��dS)Nrz import sys, time;time.sleep(0.2)r�r
cS�g|]}t|��qSr��id�rQ�orrrrT�rmzEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)rr=rNrOr>rxr;rBr<r��pidr�check_warnings�ResourceWarningr#r�r$rh)r!rD�identr�rrr�test_zombie_fast_process_del�s 
���z1POSIXProcessTestCase.test_zombie_fast_process_delc	Csbtjtjddgtjtjd�}|�|jj�|�|jj�t	|�}|j
}t�dt
f��d}t��Wd�n1s;wYt�|tj�trP|�tj�n|�|dd�tjD��t�d�|�t��"tjttjtjd��}Wd�n1s|wYWd�n1s�wY|�ttj|d�tr�|�tj�dS|�|d	d�tjD��dS)
Nrzimport time;time.sleep(3)r�r
cSr�rr�r�rrrrT�rmzJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>r�rcSr�rr�r�rrrrTrm)rr=rNrOr>rxr;rBr<r�r�rr�r�r�
gc_collectrr7rr@r#r�r$rhr�r�rXr�r��waitpidr�)r!rDr�r�r�rrr�!test_leak_fast_process_del_killed�sB
��
�
����z6POSIXProcessTestCase.test_leak_fast_process_del_killedcsxtjddd�}t�d��|�tj��tjtj	|gtj
d�fdd�d�}|��\}}tt
t|�d	���}|��|�dS)
Nr�r�r�r�Tcst�d��Sr^)rrVr�r�rrr�r�zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>)r;r�r�r�)rr�rrQrxrBrr=rNrOr>r�r�r�r�r�r�)r!r�rDrjr�r�rrr�test_close_fds_after_preexec
s

�z1POSIXProcessTestCase.test_close_fds_after_preexecc	Csddl}t��}zpdd�}t��ddgddgfdgdddgfdgdgddgfdgdgddffD]=\}}}}|�t��!}|�||dd	||d
d
d
d
ddd
ddddgdd
|�Wd�n1s_wY|�dt|j	��q0W|swt�
�dSdS|s�t�
�ww)NrcSrrrrrrrr�%r
z5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>r�sexe�envsargTrr=r�r/r�r�Fz
takes exactly)r�rrrrXr�r�r�r�r`r
)	r!r��
gc_enabled�funcr3�exe_listr��env_listr�rrr�test_fork_execs8�����
�z#POSIXProcessTestCase.test_fork_execcCs�ddl}Gdd�d�}t��}z_t��ddddd|d	�|d
�ffD]A}|jtd�|�d��$}|�d
gd
gd|ddgddddd	d
ddddddddd�Wd�n1sUwY|�dt	|j
��q"W|smt��dSdS|svt��ww)Nrc@r)zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadIntTcSs
||_dSr)r�)r!r�rrrr�Is
zSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__cSs|jr	d|_|jSt�)NF)�firstr�r�r rrr�__int__KszRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)r,r-r.r	r�r
rrrr�BadIntGsr)r=r/r�r�rl)r�r�)���*l)rlr�)r~r�r�rr�r/zfds_to_keep={}r�sfalseTrr=r�r�r�)r�rrrrXr�r�r�rhr�r`r
)r!r�rrr�rbrrr�%test_fork_exec_sorted_fd_sanity_checkCsD
��
����
�z:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc	Cs�t�t�}|�5tj�|d��}t|j_|�	�|j�
�Wd�n1s'wYWd�dSWd�dS1s?wYdS)Nr:)rr=rrrr�BrokenPipeErrorrBr�r��assert_called_with�r!r��mock_proc_stdinrrr�,test_communicate_BrokenPipeError_stdin_closems
P�zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec	Cs�t�t�}|�<tj�|d��}t|j_|�	d�|j�
d�|j�
�Wd�n1s.wYWd�dSWd�dS1sFwYdS)Nr:�stuff)rr=rrrrrryr�r��assert_called_once_withrBrrrr�,test_communicate_BrokenPipeError_stdin_writevs

P�zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writec
Cs�tjtjdgtjtjd�}|�Rtj�|d��2}tt	j
d��}t|j_
|��|j_|�d�|j��Wd�n1s=wYWd�n1sLwYWd�dSWd�dS1sdwYdS)N�-hr�r:�wbr)rr=rNrOr>rrrr�rr�rr�r�r�return_valuer�r)r!r�r�dev_nullrrr�,test_communicate_BrokenPipeError_stdin_flush�s�
�
��PzAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc	Cs�tjtjdgtjtjd�}|�7tj�|d��}t|j	_
|jdd�|j	��Wd�n1s1wYWd�dSWd�dS1sIwYdS)Nrr�r:i�rV)
rr=rNrOr>rrrrrBr�r�rrrrr�9test_communicate_BrokenPipeError_stdin_close_with_timeout�s�P�zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutN�
W_STOPCODEzneed _testcapi.W_STOPCODEcCstt}t�|�}tj|jdd�t�d�}tj	d|j|fd��|�
�}Wd�n1s-wY|�|d�dS)zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.r�r�r�r�)rN���)rrr=r�wait_processr��	_testcapirrrr%rP)r!r3r��statusrrrr�test_stopped�s


�z!POSIXProcessTestCase.test_stoppedcCstt�t�}tj|jdd�|�|j�t�	d��}|�
tj�Wd�n1s)wY|�
�|�|j�dS)Nrrzos.kill)rr=rrr!r�r�rrrr<rrD�assert_not_calledr�)r!r��	mock_killrrr�test_send_signal_race�s
�z*POSIXProcessTestCase.test_send_signal_racecCstt�tjddg�}|js|��|jrtjj|ddd�d��d|_|�	t
j�Wd�dS1s3wYdS)Nrzexit(1)r�cSrrrrrrrr��r
z=POSIXProcessTestCase.test_send_signal_race2.<locals>.<lambda>)�new)rr=rNrOrr�rrrr<rrDrCrrr�test_send_signal_race2�s�"�z+POSIXProcessTestCase.test_send_signal_race2cCsDtjtjddgtjd�}	z	|jdd�WdStjy Ynwq
)Nrz+import os, time; os.close(1), time.sleep(2)r�TrUrV)rr=rNrOr>r�rY�r!r�rrr�1test_communicate_repeated_call_after_stdout_close�s
����zFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)nr,r-r.r"rvr|r~rrr=r�rrr�r�r5r-rr�r�r�r�r2r3r�r�r�r�r�r�r#r�r�r�r�r�r�r�rr	rrNr4rrr�r)r*r+r2r8rNr;r>rArErHrLrOrUrWrYr\r_r`rbrdrerfriryr}r~r�r�r�r�r�r�r�r�r��st_devr�r�requires_mac_verr�r�r�r�r�r�r�r�r�rr�cpython_onlyrrrrrrr"r$r'r)r+�
__classcell__rrrsrrp�s�


�

3

)

0
�



�



�
-0,)0�

P
!+
'
)	
�

rpzWindows specific testsc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zej	dd��Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-S).�Win32ProcessTestCasecCs.d}d}t��}||_||_tjt|d�dS)Nr�r�r )r�STARTUPINFO�dwFlags�wShowWindowrMr)r!�STARTF_USESHOWWINDOW�SW_MAXIMIZEr!rrr�test_startupinfo�s
�z%Win32ProcessTestCase.test_startupinfocCs(d}d}tj||d�}tjt|d�dS)Nr�r�)r2r3r )rr1rMr)r!�STARTF_USERSHOWWINDOWr5r!rrr�test_startupinfo_keywords�s�
�z.Win32ProcessTestCase.test_startupinfo_keywordsc
Cs�t��}tj|_tj|_td�D]l}t}tt	j
d��/}tj||tj|d�}|�|�
�Wd�n1s6wY|�|jd�Wd�n1sLwY|�|jtj�|�|j�|�|j�|�|j�|�|jtj�|�|jdgi�qdS)Nr/r)r;r<r!r�handle_list)rr1r4r2�SW_HIDEr3r�rr�rr�r=rpr�rPrr��	hStdInput�
hStdOutput�	hStdError�lpAttributeList)r!r!rkr[�nullr�rrr�test_startupinfo_copy�s2�
��	��z*Win32ProcessTestCase.test_startupinfo_copycCs(d}tj�d�tjtjd|d�dS)N�z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)"r")rNr<ryrrMrO)r!�CREATE_NEW_CONSOLErrr�test_creationflags
s�
�z'Win32ProcessTestCase.test_creationflagscCs$|jttjtjddgdd�d�dS)NrrJcSsdSr^rrrrrr�%
r
z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>r�r$r rrrr� 
s
�
�z&Win32ProcessTestCase.test_invalid_argscCsPGdd�dt�}|�t��tjt|�d�Wd�dS1s!wYdS)Nc@seZdZdZdS)z4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)r,r-r.�keysrrrr�BadEnv+
srEr�)�dictrXr�rr=r)r!rErrr�test_issue31471'
s"�z$Win32ProcessTestCase.test_issue31471cCs&tjtjddgdd�}|�|d�dS)NrrJT)r�rKrLrQrrrr�0
s
��z#Win32ProcessTestCase.test_close_fdsc
Cs�ddl}t��}|�tj|d�|�tj|d�g}|D]}t�|d�|�|�|��qtj	t
jdd�|d�gtj
dd�}|��\}}|�|jd�t|���tj	t
jdd�|d�gtj
tj
dd�}|��\}}|�|jd�|�d	|�g}t��}	d
|i|	_tj	t
jdd�|d�gtj
tj
|	dd�}|��\}}|�|jd�|�d	|�t�dtf��8t��}	d
|dd�i|	_tj	t
jdd�|d�gtj
tj
|	dd�}|��\}}|�|jd�Wd�dS1s�wYdS)
Nrr�Trz2import msvcrt; print(msvcrt.open_osfhandle({}, 0))Fr�)r;r<r�sOSErrorr9)r;r<r!r�z.*overriding close_fds)r�rr3rxrBr�r��
get_osfhandlerr=rNrOr�r>r�rPrr�rVrhr1r>rr�r�)
r!r�r�r�r�rDr;r<r9r!rrr�test_close_fds_with_stdio7
sd
��
�
�

���
��"�z.Win32ProcessTestCase.test_close_fds_with_stdiocCs t��}i|_tjt|d�dS)Nr �rr1r>rMr�r!r!rrr�test_empty_attribute_listi
s

�z.Win32ProcessTestCase.test_empty_attribute_listcCs$t��}dgi|_tjt|d�dS)Nr9r rJrKrrr�test_empty_handle_listo
s


�z+Win32ProcessTestCase.test_empty_handle_listcCsdtj��}d|d<tjdgdtj|d�}|�|�d|j���Wd�dS1s+wYdS�N�physalisr�r�r�r&sphysalis�	rr�r�rr=r>rhr;r�r(rrrr)u
s

�"�z(Win32ProcessTestCase.test_shell_sequencecCsbtj��}d|d<tjddtj|d�}|�|�d|j���Wd�dS1s*wYdSrNrPr(rrrr*
s
�"�z&Win32ProcessTestCase.test_shell_stringc	CsndD]2}tj��}d|d<tjddtj||d�}|�|�d|j��|�Wd�n1s/wYqdS)N)�ansi�oemrOr�r�r�)r�r;r�r�rP)r!�encr�rDrrr�test_shell_encodings�
s
����z)Win32ProcessTestCase.test_shell_encodingscCs t�tjd�}|�|d�dS)Nz -c "import sys; sys.exit(47)"rKrLrQrrrr+�
s�z%Win32ProcessTestCase.test_call_stringcGs�tjtjddgtjtjtjd�}|�%|j�d�t||�|�|��\}}|�	|d�|�
�}Wd�n1s:wY|�|d�dS)Nrz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             time.sleep(30)
                             r9r�rr)rr=rNrOr>r;r�r6r�rPr%r�)r!r7r3rDrkr<rrrrr8�
s�	
�z"Win32ProcessTestCase._kill_processcGs�tjtjddgtjtjtjd�}|�*|j�d�t�d�t	||�|�|�
�\}}|�|d�|��}Wd�n1s?wY|�|d�dS)Nrz�if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             r9r�rr)
rr=rNrOr>r;r�r�r�r6r�rPr%)r!r7r3rDrkr<rRrrrr;�
s�	

�z'Win32ProcessTestCase._kill_dead_processcCrFrG)r8rrDr rrrr>�
rcz%Win32ProcessTestCase.test_send_signalcCrIrJ�r8r rrrrA�
�zWin32ProcessTestCase.test_killcCrIrNrUr rrrrE�
rVz#Win32ProcessTestCase.test_terminatecCrFrG)r;rrDr rrrrH�
rcz*Win32ProcessTestCase.test_send_signal_deadcCrIrJrKr rrrrL�
rVz#Win32ProcessTestCase.test_kill_deadcCrIrNrKr rrrrO�
rVz(Win32ProcessTestCase.test_terminate_deadN)r,r-r.r6r8r@rCr�rr.rGr�rIrLrMr)r*rTr+r8r;r>rArErHrLrOrrrrr0�s0
2

r0c@s^eZdZGdd�dej�Zej�ejd�dd��Z	dd�Z
dd	�Zd
d�Zdd
�Z
dd�ZdS)�	MiscTestscs$eZdZdZgZ�fdd�Z�ZS)zMiscTests.RecordingPopenz<A Popen that saves a reference to each instance for testing.cs"t�j|i|��|j�|�dSr)rqr��instances_createdr�r2rsrrr��
sz!MiscTests.RecordingPopen.__init__)r,r-r.r7rXr�r/rrrsr�RecordingPopen�
srY�_communicatec
Ks�t|_z�tj�tjd���}t|_tj�td|j��,|�t��|t	j
ddgfdtji|��Wd�n1s9wYWd�n1sHwY|jdd�D]}|�
|tjdd�d	|j���qTg}|jD]}|tjd
d�krz|�|�qk|j|jd|jd�|jt|�d|jd�Wd�n!1s�wYW|jj��}|��|��|�g|jj�dSW|jj��}|��|��|�g|jj�dS|jj��}|��|��|�g|jj�w)
a�Fake a SIGINT happening during Popen._communicate() and ._wait().

        This avoids the need to actually try and get test environments to send
        and receive signals reliably across platforms.  The net effect of a ^C
        happening during a blocking subprocess execution which we want to clean
        up from is a KeyboardInterrupt coming out of communicate() or wait().
        �_waitr=rzLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')r;Nr�rVz.no open-ended wait() after the first allowed: g�?r/r�)�KeyboardInterruptr�rrrrr=rYrXrNrOr)�call_args_listr�rMr��assertLessEqual�
call_countrPrjrXr�r7r%)r!�popener�mock__communicater4�
mock__waitrM�sigint_callsrrrr�_test_keyboardinterrupt_no_kill�
sd
���������

�
�����z)MiscTests._test_keyboardinterrupt_no_killcC�|jtjdd�dS�NgT㥛� @rV)rdrrMr rrr�#test_call_keyboardinterrupt_no_kill�z-MiscTests.test_call_keyboardinterrupt_no_killcCrerf)rdrrr rrr�"test_run_keyboardinterrupt_no_killrhz,MiscTests.test_run_keyboardinterrupt_no_killcCsdd�}|�|�dS)Nc_s*tj|i|���}t�1swYdSr)rr=r\)r3r4�unused_processrrr�popen_via_context_managers�z[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager)rd)r!rkrrr�.test_context_manager_keyboardinterrupt_no_killsz8MiscTests.test_context_manager_keyboardinterrupt_no_killc	Cs�|�t�d�d�|�t�d�d�d}z,t��}tj�|d�}t�t	r&dnd|�\}}|�
|d�W|dur?t�|�dSdS|durKt�|�ww)Nz
echo xyzzy�xyzzy)rrmr�ztype zcat r)rPr�	getoutput�getstatusoutputrvr�rr�r�r#r��rmdir)r!�dirr�r#rjrrr�test_getoutputs"����zMiscTests.test_getoutputcCsnhd�}ttj�}t�}ddl}tj��D]\}}|�d�rqt||jf�r'q|�	|�q|�
|||�dS)z*Ensure that __all__ is populated properly.>rir�r4�Handler�rNrk)r�r�__all__r)�__dict__�itemsrNr��
ModuleTyper�rP)r!�intentionally_excluded�exported�possible_exportsr)r�r�rrr�test__all__.s

zMiscTests.test__all__N)r,r-r.rr=rYrrrrdrgrirlrrr{rrrrrW�
s
+rW�PollSelectorz!Test needs selectors.PollSelectorc@r)�ProcessTestCaseNoPollcCstj|_tjt_t�|�dSr)r�_PopenSelector�
orig_selector�	selectors�SelectSelectorr8r"r rrrr"@szProcessTestCaseNoPoll.setUpcCs|jt_t�|�dSr)rrr~r8r*r rrrr*EszProcessTestCaseNoPoll.tearDownNr+rrrrr}=sr}zWindows-specific testscsPeZdZ�fdd�Z�fdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	�Z
S)�CommandsWithSpacescs>t���t�dd�\}}|��|_t�|d�t�|�dS)Nz.pyzte stsVimport sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	rqr"rvr�r�rrryrB)r!r�rrsrrr"Ms


zCommandsWithSpaces.setUpcst�|j�t���dSr)rr�rrqr*r rsrrr*VszCommandsWithSpaces.tearDowncOsbtj|d<tj|i|��}|�|�|j���d�d|j�Wd�dS1s*wYdS)Nr;�mbcsz2 [%r, 'ab cd'])rr>r=rPr;r�r�r)r!r3r4rDrrr�with_spacesZs
�"�zCommandsWithSpaces.with_spacescCs |jdtj|jdfdd�dS)N�"%s" "%s" "%s"�ab cdr�r��r�rNrOrr rrr�test_shell_string_with_spacescs
�
�z0CommandsWithSpaces.test_shell_string_with_spacescCs|jtj|jdgdd�dS)Nr�r�r�r�r rrr�test_shell_sequence_with_spaceshsz2CommandsWithSpaces.test_shell_sequence_with_spacescCs|�dtj|jdf�dS)Nr�r�r�r rrr�test_noshell_string_with_spacesls�z2CommandsWithSpaces.test_noshell_string_with_spacescCs|�tj|jdg�dS)Nr�r�r rrr�!test_noshell_sequence_with_spacesqsz4CommandsWithSpaces.test_noshell_sequence_with_spaces)r,r-r.r"r*r�r�r�r�r�r/rrrsrr�Js		r�c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ContextManagerTestscCs�tjtjddgtjtjd��}|�|j��d�|�|j��d�Wd�n1s+wY|�	|jj
�|�	|jj
�dS)NrzAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');r�sstdoutsstderr)rr=rNrOr>rPr;r�r<rnror*rrr�	test_pipexs
���	zContextManagerTests.test_pipecCsDt�tjddg��}Wd�n1swY|�|jd�dS)Nrzimport sys; sys.exit(100)�d)rr=rNrOrPrr*rrrr=�s
��z#ContextManagerTests.test_returncodecCsVtjtjddgtjd��}|�d�|�|jd�Wd�dS1s$wYdS)Nrz2import sys;sys.exit(sys.stdin.read() == 'context')rtscontextr�r r*rrrr`�s
��
"�z*ContextManagerTests.test_communicate_stdinc	Cst|�t��+tjttjtjd��}Wd�n1swYWd�dSWd�dS1s3wYdS)Nr�)rXr�rr=r�r>r*rrrr��s���"�z%ContextManagerTests.test_invalid_argscCsrtjttjtjdd�}|��}|j�dtj�|�	|j
�|�t|j
ddd�|�|j
d�|�|jj�dS)z9Broken pipe error should not prevent wait() (Issue 21619)r/)r:rFr�Nr)rr=rr>rrw�	__enter__r:ryr�rrXr��__exit__rPrnror*rrr�test_broken_pipe_cleanup�s�z,ContextManagerTests.test_broken_pipe_cleanupN)r,r-r.r�r=r`r�r�rrrrr�vs
r��__main__)Er5rr�r�test.supportrrrrrrNrr@r�rr�rvr�rXr)r�r0r�rr�rr�r�r�test.support.os_helperrr"r�r�rir4�PGOr6r4r#rr�r��NotADirectoryErrorr�r�rOrr�TestCaser�	Exceptionr/r=r0r8r7ror-rpr2r0rWr3r}r�r�r,�mainrrrr�<module>s����



F

~d�
+
6�

Youez - 2016 - github.com/yon3zu
LinuXploit