a
     Rhb                    @   s  d dl Z d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ zd dlZW n ey   dZY n0 zd dlZW n ey   dZY n0 zd dlZW n ey:   dZY n0 ejrNe dej dkZ!e!rddZ"ndZ"d	Z#e$e%e&fZ'ej(d
dfa)dd Z*G dd de j+Z,G dd de-Z.G dd dej/Z0G dd de,Z1G dd de,Z2dd Z3e 4e!dG dd de,Z5e 6e!dG dd de,Z7G d d! d!e j+Z8e 6e9ed"d#G d$d% d%e1Z:e 6e!d&G d'd( d(e,Z;G d)d* d*e,Z<e=d+kre >  dS ),    N)mock)support)FakePathztest is not helpful for PGOwin32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY); )Znonexisting_i_hope-cpassc                  C   s@   t d} | d u rd S t| tjr<t| gjdkr<| fad S )Ntruer   )	shutilwhichosaccessX_OK
subprocessrun
returncodeZERO_RETURN_CMD)Z
shell_true r   </opt/python-3.9.24/usr/lib/python3.9/test/test_subprocess.pysetUpModule>   s    
r   c                   @   s   e Zd Zdd Zdd ZdS )BaseTestCasec                 C   s   t   d S N)r   reap_childrenselfr   r   r   setUpI   s    zBaseTestCase.setUpc                 C   sB   t s.tjD ]}|  q
t  | tjd |   t  d S )Nzsubprocess._active not empty)		mswindowsr   _activewait_cleanupassertFalseZ
doCleanupsr   r   )r   instr   r   r   tearDownN   s    

zBaseTestCase.tearDownN__name__
__module____qualname__r   r"   r   r   r   r   r   H   s   r   c                   @   s   e Zd ZdS )PopenTestExceptionN)r$   r%   r&   r   r   r   r   r'   [   s   r'   c                   @   s   e Zd Zdd ZdS )PopenExecuteChildRaisesc                 O   s   t dd S )NzForced Exception for Test)r'   r   argskwargsr   r   r   _execute_childc   s    z&PopenExecuteChildRaises._execute_childN)r$   r%   r&   r,   r   r   r   r   r(   _   s   r(   c                   @   sB  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zee d7d8d9 Z!ee d7d:d; Z"ee d7d<d= Z#d>d? Z$d@dA Z%dBdC Z&dDdE Z'dFdG Z(dHdI Z)ee dJdKdL Z*ee dJdMdN Z+dOdP Z,ee-j.e-j/kdQdRdS Z0ee-j.e-j/kdQee12 dTdUdV Z3dWdX 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e-jEdykdzee1Fd{d|kd}d~d ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd ZhddÄ Ziddń ZjddǄ ZkddɄ Zldd˄ Zmeneoepd̃d͡eneoeqd΃dϡeneoeqdЃdѡddӄ Zreneqjstdequ  dաddׄ Zvee dءddڄ Zwee dءdd܄ Zxddބ ZydS )ProcessTestCasec                 C   s   t jtt jt jt jd}zZ| |jtj | |jtj | |j	tj W |j
  |j
  |j	
  |  n(|j
  |j
  |j	
  |  0 d S )Nstdinstdoutstderr)r   Popenr   PIPEassertIsInstancer/   ioBufferedIOBaser0   r1   closer   r   pr   r   r   test_io_buffered_by_defaulti   s     






z+ProcessTestCase.test_io_buffered_by_defaultc                 C   s   t jtt jt jt jdd}zZ| |jtj | |jtj | |j	tj W |j
  |j
  |j	
  |  n(|j
  |j
  |j	
  |  0 d S )Nr   )r/   r0   r1   bufsize)r   r2   r   r3   r4   r/   r5   	RawIOBaser0   r1   r7   r   r8   r   r   r   test_io_unbuffered_worksw   s     






z(ProcessTestCase.test_io_unbuffered_worksc                 C   s"   t tjddg}| |d d S Nr   import sys; sys.exit(47)/   r   callsys
executableassertEqualr   rcr   r   r   test_call_seq   s    
zProcessTestCase.test_call_seqc                 C   s"   | j tjtjtjddgdd d S )Nr   while True: pass皙?timeout)assertRaisesr   TimeoutExpiredrB   rC   rD   r   r   r   r   test_call_timeout   s    
z!ProcessTestCase.test_call_timeoutc                 C   s   t t}| |d d S Nr   )r   
check_callr   rE   rF   r   r   r   test_check_call_zero   s    
z$ProcessTestCase.test_check_call_zeroc                 C   sR   |  tj"}ttjddg W d    n1 s40    Y  | |jjd d S r>   )	rM   r   CalledProcessErrorrQ   rC   rD   rE   	exceptionr   r   cr   r   r   test_check_call_nonzero   s
    
$z'ProcessTestCase.test_check_call_nonzeroc                 C   s"   t tjddg}| d| d S )Nr   print('BDFL')   BDFLr   check_outputrC   rD   assertInr   outputr   r   r   test_check_output   s    
z!ProcessTestCase.test_check_outputc                 C   sR   |  tj"}ttjddg W d    n1 s40    Y  | |jjd d S )Nr   zimport sys; sys.exit(5)   )	rM   r   rS   r[   rC   rD   rE   rT   r   rU   r   r   r   test_check_output_nonzero   s
    
"z)ProcessTestCase.test_check_output_nonzeroc                 C   s(   t jtjddgt jd}| d| d S )Nr   $import sys; sys.stderr.write('BDFL')r1   rY   )r   r[   rC   rD   STDOUTr\   r]   r   r   r   test_check_output_stderr   s
    
z(ProcessTestCase.test_check_output_stderrc                 C   sN   t  }| |j |d |d tjtj	ddg|d}| 
d| d S )N   pearr   r   6import sys; sys.stdout.write(sys.stdin.read().upper())r/      PEAR)tempfileTemporaryFile
addCleanupr7   writeseekr   r[   rC   rD   r\   )r   tfr^   r   r   r   test_check_output_stdin_arg   s    

z+ProcessTestCase.test_check_output_stdin_argc                 C   s&   t jtjddgdd}| d| d S )Nr   rg   rf   inputri   rZ   r]   r   r   r   test_check_output_input_arg   s    z+ProcessTestCase.test_check_output_input_argc                 C   s&   t jtjddgd d}| d| d S )Nr   3import sys; print('XX' if sys.stdin.read() else '')rq   s   XXr   r[   rC   rD   assertNotInr]   r   r   r   test_check_output_input_none   s    z,ProcessTestCase.test_check_output_input_nonec                 C   s(   t jtjddgd dd}| d| d S )Nr   rt   T)rr   textXXru   r]   r   r   r   !test_check_output_input_none_text   s    z1ProcessTestCase.test_check_output_input_none_textc                 C   s(   t jtjddgd dd}| d| d S )Nr   rt   T)rr   universal_newlinesry   ru   r]   r   r   r   /test_check_output_input_none_universal_newlines   s    z?ProcessTestCase.test_check_output_input_none_universal_newlinesc                 C   sd   |  t2}tjtjddgtjd}| d W d    n1 sB0    Y  | d|j	j
d  d S )Nr   print('will not be run')r0   z-Expected ValueError when stdout arg supplied.r0   r   )rM   
ValueErrorr   r[   rC   rD   r0   failr\   rT   r*   r   rV   r^   r   r   r   test_check_output_stdout_arg   s    
(z,ProcessTestCase.test_check_output_stdout_argc                 C   s   t  }| |j |d |d | t2}tj	t
jddg|dd}| d W d    n1 sj0    Y  | d|jjd  | d	|jjd  d S )
Nrf   r   r   r}      harer/   rr   7Expected ValueError when stdin and input args supplied.r/   rr   )rj   rk   rl   r7   rm   rn   rM   r   r   r[   rC   rD   r   r\   rT   r*   r   ro   rV   r^   r   r   r   &test_check_output_stdin_with_input_arg   s    


(z6ProcessTestCase.test_check_output_stdin_with_input_argc                 C   s`   |  tj0}tjtjddgdd}| d W d    n1 sB0    Y  | |jj	d d S )Nr   Mimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)   rK   zExpected TimeoutExpired.rY   )
rM   r   rN   r[   rC   rD   r   rE   rT   r^   r   r   r   r   test_check_output_timeout   s    	(z)ProcessTestCase.test_check_output_timeoutc                 C   s8   t j }d|d< tjtjddg|d}| |d d S )NbananaFRUITr   z5import sys, os;sys.exit(os.getenv("FRUIT")=="banana")env   )r   environcopyr   rB   rC   rD   rE   )r   newenvrG   r   r   r   test_call_kwargs  s    

z ProcessTestCase.test_call_kwargsc                 C   s~   t  R}| jttjdd tjjjj}dg|d  }| jttjg|R   W d    n1 s`0    Y  | 	|
 d d S )Nr   )Zinvalid_arg_namer   r   )r   Zcaptured_stderrrM   	TypeErrorr   r2   __init____code__co_argcountrE   getvalue)r   sZargcountZtoo_many_argsr   r   r   test_invalid_args  s    
4z!ProcessTestCase.test_invalid_argsc                 C   sR   t jtjddgt jt jd}| |jj | |jj |	  | 
|jd  d S )Nr   print("banana")r0   r1   )r   r2   rC   rD   r3   rl   r0   r7   r1   r   rE   r/   r8   r   r   r   test_stdin_none  s    zProcessTestCase.test_stdin_nonec                 C   sl   d}t jtjd|gt jt jd}| |jj | |jj |	 \}}| 
|jd| | 
| d d S )Nzimport 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   r   s   test_stdout_noner   r2   rC   rD   r3   rl   r0   r7   r1   communicaterE   r   rstripr   coder9   outerrr   r   r   test_stdout_none!  s    z ProcessTestCase.test_stdout_nonec                 C   sR   t jtjddgt jt jd}| |jj | |jj |	  | 
|jd  d S )Nr   r   r/   r0   )r   r2   rC   rD   r3   rl   r0   r7   r/   r   rE   r1   r8   r   r   r   test_stderr_none8  s    z ProcessTestCase.test_stderr_nonec                 K   s6   |dg }t j|fi |}|  | d|j d S Nr?   r@   )r   r2   r   rE   r   )r   pre_argsr+   r*   r9   r   r   r   _assert_pythonA  s    
zProcessTestCase._assert_pythonc                 C   s0   t jt jtjd}| j|dgtjd d S Ndoesnotexistr   rD   )r   pathjoindirnamerC   rD   r   r   r   r   r   r   test_executableI  s    zProcessTestCase.test_executablec                 C   s6   t jt jtjd}| j|dgt tjd d S r   )r   r   r   r   rC   rD   r   fsencoder   r   r   r   test_bytes_executableT  s    

z%ProcessTestCase.test_bytes_executablec                 C   s4   t jt jtjd}| j|dgttjd d S r   )r   r   r   r   rC   rD   r   r   r   r   r   r   test_pathlike_executableZ  s    
z(ProcessTestCase.test_pathlike_executablec                 C   s0   t jdg}| | | jt| j|td d d S )Nr   r   r   )rC   rD   r   rM   NONEXISTING_ERRORSNONEXISTING_CMD)r   r   r   r   r    test_executable_takes_precedence`  s    

z0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellc                 C   s   | j g tjdd d S NT)rD   shell)r   rC   rD   r   r   r   r   test_executable_replaces_shellj  s    z.ProcessTestCase.test_executable_replaces_shellc                 C   s   | j g ttjdd d S r   )r   r   r   rC   rD   r   r   r   r   $test_bytes_executable_replaces_shellp  s    z4ProcessTestCase.test_bytes_executable_replaces_shellc                 C   s   | j g ttjdd d S r   )r   r   rC   rD   r   r   r   r   'test_pathlike_executable_replaces_shellu  s    z7ProcessTestCase.test_pathlike_executable_replaces_shellc                 C   s6   t | t W  d    S 1 s(0    Y  d S r   )r   Z
change_cwdr   getcwd)r   cwdr   r   r   _normalize_cwd{  s    zProcessTestCase._normalize_cwdc                 C   s   t jtj}t j|S r   )r   r   realpathrC   rD   split)r   Zpython_pathr   r   r   _split_python_path  s    z"ProcessTestCase._split_python_pathc                 K   sl   t j|ddgfdt ji|}| |jj |  | d|j t	j
j}| ||||j   d S )Nr   zcimport os, sys; buf = sys.stdout.buffer; buf.write(os.getcwd().encode()); buf.flush(); sys.exit(47)r0   r@   )r   r2   r3   rl   r0   r7   r   rE   r   r   r   normcasereaddecode)r   Zexpected_cwdZ
python_argr+   r9   r   r   r   r   _assert_cwd  s    
zProcessTestCase._assert_cwdc                 C   s(   t  }| |}| j|tj|d d S Nr   )rj   
gettempdirr   r   rC   rD   r   temp_dirr   r   r   test_cwd  s    
zProcessTestCase.test_cwdc                 C   s.   t  }| |}| j|tjt|d d S r   )rj   r   r   r   rC   rD   r   r   r   r   r   r   test_cwd_with_bytes  s    
z#ProcessTestCase.test_cwd_with_bytesc                 C   s,   t  }| |}| j|tjt|d d S r   )rj   r   r   r   rC   rD   r   r   r   r   r   test_cwd_with_pathlike  s    
z&ProcessTestCase.test_cwd_with_pathlikez"pending resolution of issue #15533c                 C   s   |   \}}tjtj|}t R}| tt	j
|g | jtt	j
|g|d | |}| j|||d W d    n1 s|0    Y  d S r   r   r   r   r   curdirr   Ztemp_cwdrM   FileNotFoundErrorr   r2   r   r   )r   
python_dirpython_base
rel_python	wrong_dirr   r   r   test_cwd_with_relative_arg  s    



z*ProcessTestCase.test_cwd_with_relative_argc                 C   s   |   \}}tjtj|}d}t Z}| jtt	j
|g|d | jtt	j
|g||d | |}| j||||d W d    n1 s0    Y  d S )Nsomethingyoudonthaver   rD   r   r   )r   r   r   r   Zdoesntexistr   r   r   r   !test_cwd_with_relative_executable  s    




z1ProcessTestCase.test_cwd_with_relative_executablec                 C   s   |   \}}tj||}tjtj|}t @}| jtt	j
|g|d | |}| j|||d W d    n1 sx0    Y  d S r   )r   r   r   r   r   r   r   rM   r   r   r2   r   r   )r   r   r   Z
abs_pythonr   r   r   r   r   test_cwd_with_absolute_arg  s    


z*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblec                 C   s.   |   \}}| |}| j|dtj|d d S )Nr   r   )r   r   r   rC   rD   )r   r   r   r   r   r   test_executable_with_cwd  s
    
z(ProcessTestCase.test_executable_with_cwdz#need an installed Python. See #7774c                 C   s   | j t dtjd d S )Nr   r   )r   r   r   rC   rD   r   r   r   r   test_executable_without_cwd  s    z+ProcessTestCase.test_executable_without_cwdc                 C   sH   t jtjddgt jd}|jd |j  |  | 	|j
d d S )Nr   0import sys; sys.exit(sys.stdin.read() == "pear")rh   rf   r   )r   r2   rC   rD   r3   r/   rm   r7   r   rE   r   r8   r   r   r   test_stdin_pipe  s    

zProcessTestCase.test_stdin_pipec                 C   sf   t  }| |j | }t|d t|dd tj	t
jddg|d}|  | |jd d S Nrf   r   r   r   rh   r   )rj   rk   rl   r7   filenor   rm   lseekr   r2   rC   rD   r   rE   r   r   ro   dr9   r   r   r   test_stdin_filedes  s    
z"ProcessTestCase.test_stdin_filedesc                 C   sX   t  }| |j |d |d tjtj	ddg|d}|
  | |jd d S r   )rj   rk   rl   r7   rm   rn   r   r2   rC   rD   r   rE   r   r   ro   r9   r   r   r   test_stdin_fileobj  s    


z"ProcessTestCase.test_stdin_fileobjc                 C   sR   t jtjddgt jd}|" | |j d W d    n1 sD0    Y  d S )Nr   &import sys; sys.stdout.write("orange")r~      oranger   r2   rC   rD   r3   rE   r0   r   r8   r   r   r   test_stdout_pipe  s    
z ProcessTestCase.test_stdout_pipec                 C   s`   t  }| |j | }tjtjddg|d}|	  t
|dd | t
|dd d S )Nr   r   r~   r      r   rj   rk   rl   r7   r   r   r2   rC   rD   r   r   r   rE   r   r   r   r   r   test_stdout_filedes  s    
z#ProcessTestCase.test_stdout_filedesc                 C   sP   t  }| |j tjtjddg|d}|  |	d | 
| d d S )Nr   r   r~   r   r   rj   rk   rl   r7   r   r2   rC   rD   r   rn   rE   r   r   r   r   r   test_stdout_fileobj&  s    

z#ProcessTestCase.test_stdout_fileobjc                 C   sR   t jtjddgt jd}|" | |j d W d    n1 sD0    Y  d S )Nr   *import sys; sys.stderr.write("strawberry")rc   
   strawberry)r   r2   rC   rD   r3   rE   r1   r   r8   r   r   r   test_stderr_pipe1  s    
z ProcessTestCase.test_stderr_pipec                 C   s`   t  }| |j | }tjtjddg|d}|	  t
|dd | t
|dd d S )Nr   r   rc   r   r   r   r   r   r   r   r   test_stderr_filedes9  s    
z#ProcessTestCase.test_stderr_filedesc                 C   sP   t  }| |j tjtjddg|d}|  |	d | 
| d d S )Nr   r   rc   r   r   r   r   r   r   r   test_stderr_fileobjE  s    

z#ProcessTestCase.test_stderr_fileobjc                 C   sR   t jtjddgt jt jd}| \}}| |d | |d | |jd d S )Nr   zimport sys, subprocess;rc = subprocess.call([sys.executable, "-c",    "import sys;"    "sys.stderr.write('42')"],    stderr=subprocess.STDOUT);sys.exit(rc)r   s   42    r   r   r2   rC   rD   r3   r   rE   r   r   r9   r0   r1   r   r   r   ,test_stderr_redirect_with_no_stdout_redirectP  s    
	z<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectc                 C   sV   t jtjddgt jt jd}|" | |j d W d    n1 sH0    Y  d S )Nr   Rimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r      appleorange)	r   r2   rC   rD   r3   rd   rE   r0   r   r8   r   r   r   test_stdout_stderr_pipee  s    
z'ProcessTestCase.test_stdout_stderr_pipec                 C   sR   t  }| |j tjtjddg||d}|  |	d | 
| d d S )Nr   r   r   r   r   r   r   r   r   r   test_stdout_stderr_fileq  s    

z'ProcessTestCase.test_stdout_stderr_filec                 C   sl   d}t jtjd|gt jt jd}| |jj | |jj |	 \}}| 
|jd| | 
| d d S )Nzimport 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   r   s   test with stdout=1r   r   r   r   r   test_stdout_filedes_of_stdout  s    z-ProcessTestCase.test_stdout_filedes_of_stdoutc                 C   s2   t jtjddgt jd}|  | |jd  d S )Nr   z'for i in range(10240):print("x" * 1024)r~   )r   r2   rC   rD   DEVNULLr   rE   r0   r8   r   r   r   test_stdout_devnull  s    
z#ProcessTestCase.test_stdout_devnullc                 C   s2   t jtjddgt jd}|  | |jd  d S )Nr   z=import sys
for i in range(10240):sys.stderr.write("x" * 1024)rc   )r   r2   rC   rD   r   r   rE   r1   r8   r   r   r   test_stderr_devnull  s    
z#ProcessTestCase.test_stderr_devnullc                 C   s2   t jtjddgt jd}|  | |jd  d S )Nr   zimport sys;sys.stdin.read(1)rh   )r   r2   rC   rD   r   r   rE   r/   r8   r   r   r   test_stdin_devnull  s    
z"ProcessTestCase.test_stdin_devnullc                 C   sh   t j }d|d< tjtjddgtj|d(}| \}}| 	|d W d    n1 sZ0    Y  d S )Noranger   r   2import sys,os;sys.stdout.write(os.getenv("FRUIT"))r0   r   r   )
r   r   r   r   r2   rC   rD   r3   r   rE   r   r   r9   r0   r1   r   r   r   test_env  s    

zProcessTestCase.test_envr   z#cannot test an empty env on WindowsZPy_ENABLE_SHAREDr   zEThe Python shared library cannot be loaded with an empty environment.c                    s   dd  t jtjddgt ji dR}| \}}t| }| |t	  fdd|D }| 
|g  W d    n1 sz0    Y  d S )Nc                 S   s*   d| v p(d| v p(| dkp(|  dp(| dkS )NZ	VERSIONERZ__CFZ
LD_PRELOADZSANDBOXLC_CTYPE)
startswith)nr   r   r   is_env_var_to_ignore  s    z<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignorer   z)import os; print(list(os.environ.keys()))r  c                    s   g | ]} |s|qS r   r   ).0kr  r   r   
<listcomp>  s   z2ProcessTestCase.test_empty_env.<locals>.<listcomp>)r   r2   rC   rD   r3   r   evalstripr4   listrE   )r   r9   r0   r1   Zchild_env_namesr   r  r   test_empty_env  s    	
zProcessTestCase.test_empty_envc                 C   s   t jd }| t  t|ddg W d    n1 s:0    Y  | t" tt jddg W d    n1 sv0    Y  d S )N r   r   zpass# )rC   rD   rM   r   r   r2   )r   cmdr   r   r   test_invalid_cmd  s
    
.z ProcessTestCase.test_invalid_cmdc                 C   sH  t j }d|d< | t tjt|d W d    n1 s@0    Y  t j }d|d< | t tjt|d W d    n1 s0    Y  t j }d|d< | t tjt|d W d    n1 s0    Y  t j }d|d< tjtj	d	d
gtj
|d(}| \}}| |d W d    n1 s:0    Y  d S )NZcabbagezFRUIT VEGETABLEr   zorange VEGETABLE=cabbager   ZlemonzFRUIT=ORANGEzorange=lemonr   z3import sys, os;sys.stdout.write(os.getenv("FRUIT"))r  s   orange=lemon)r   r   r   rM   r   r   r2   r   rC   rD   r3   r   rE   r  r   r   r   test_invalid_env  s.    
,
,
,

z ProcessTestCase.test_invalid_envc                 C   s4   t jtjddgt jd}|d | |jd d S )Nr   z/import sys;sys.exit(sys.stdin.read() == "pear")rh   rf   r   r   r8   r   r   r   test_communicate_stdin  s    

z&ProcessTestCase.test_communicate_stdinc                 C   s@   t jtjddgt jd}| \}}| |d | |d  d S )Nr   z)import sys; sys.stdout.write("pineapple")r~   	   pineappler   r2   rC   rD   r3   r   rE   r   r   r   r   test_communicate_stdout  s    
z'ProcessTestCase.test_communicate_stdoutc                 C   s@   t jtjddgt jd}| \}}| |d  | |d d S )Nr   z)import sys; sys.stderr.write("pineapple")rc   r  r  r   r   r   r   test_communicate_stderr  s    
z'ProcessTestCase.test_communicate_stderrc                 C   st   t jtjddgt jt jt jd}| |jj | |jj | |j	j |
d\}}| |d | |d d S )Nr   zNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())r.      bananar  )r   r2   rC   rD   r3   rl   r0   r7   r1   r/   r   rE   r   r   r   r   test_communicate  s    
z ProcessTestCase.test_communicatec                 C   sd   t jtjddgdt jt jt jd}| jt j|jddd | \}}| |d | |	 d d S )	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/   r0   r1   r   g333333?rK   s   pineapple
pear
)
r   r2   rC   rD   r3   rM   rN   r   rE   encoder   r   r   r   test_communicate_timeout#  s    

z(ProcessTestCase.test_communicate_timeoutc                 C   sL   t jtjddgt jd}| jt j|jdd | \}}| t	|d d S )Nr   zimport 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?rK   i   )
r   r2   rC   rD   r3   rM   rN   r   rE   len)r   r9   r0   _r   r   r   %test_communicate_timeout_large_output6  s    
	
z5ProcessTestCase.test_communicate_timeout_large_outputc                 C   s   dD ]}dD ]}dD ]}i }|r*t j|d< |r8t j|d< |rFt j|d< |sLqt jtfi |}|  |jd ur~| |jj |jd ur| |jj |j	d ur| |j	j qqqd S )NFTr/   r0   r1   )
r   r3   r2   r   r   r/   
assertTrueclosedr0   r1   )r   Z
stdin_pipeZstdout_pipeZstderr_pipeoptionsr9   r   r   r   test_communicate_pipe_fd_leakG  s(    





z-ProcessTestCase.test_communicate_pipe_fd_leakc                 C   s:   t tjddg}| \}}| |d  | |d  d S )Nr   r?   )r   r2   rC   rD   r   rE   r   r   r   r   test_communicate_returns]  s    
z(ProcessTestCase.test_communicate_returnsc                 C   s   t  \}}t | t | tjtjddtj gtj	tj	tj	d}| 
|jj | 
|jj | 
|jj dtj }||\}}| || d S )Nr   zpimport sys,os;sys.stdout.write(sys.stdin.read(47));sys.stderr.write("x" * %d);sys.stdout.write(sys.stdin.read())r.      a)r   piper7   r   r2   rC   rD   r   PIPE_MAX_SIZEr3   rl   r0   r1   r/   r   rE   )r   xyr9   Zstring_to_writer0   r1   r   r   r   test_communicate_pipe_bufe  s$    


	
z)ProcessTestCase.test_communicate_pipe_bufc                 C   s   t jtjddgt jt jt jd}| |jj | |jj | |j	j |j	
d |d\}}| |d | |d d S )Nr   z0import sys,os;sys.stdout.write(sys.stdin.read())r.   r  s   splits   bananasplitr   )r   r2   rC   rD   r3   rl   r0   r7   r1   r/   rm   r   rE   r   r   r   r   test_writes_before_communicate|  s    
z.ProcessTestCase.test_writes_before_communicatec              
   C   s   t jddt d g}dD ]}tj|fi dtjdtj|di}| |jd |j  | 	|j
 d |jd	 |j  | |j
j | 	|j
 d
 | 	|j
dd	 | 	|j
 d W d    q1 s0    Y  qd S )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{   rx   r/   r0   Tzline1
zline3
zline2
   zline4
line5
line6
line7
line8)rC   rD   	SETBINARYr   r2   r3   r/   rm   flushrE   r0   readliner7   rl   r   )r   r*   Zextra_kwargr9   r   r   r    test_universal_newlines_and_text  s4    

z0ProcessTestCase.test_universal_newlines_and_textc                 C   s^   t jtjddt d gt jt jdd}| |jj | |j	j |
 \}}| |d d S )Nr   r1  zbuf = 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   )r1   r0   r{   z#line2
line4
line5
line6
line7
line8)r   r2   rC   rD   r3  r3   rl   r0   r7   r1   r   rE   r   r   r   r   #test_universal_newlines_communicate  s    
z3ProcessTestCase.test_universal_newlines_communicatec                 C   sH   t jtjddt td gt jdd}|d\}}| 	|j
d d S )Nr   r1  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   )r   r2   rC   rD   r3  textwrapdedentr3   r   rE   r   r   r   r   r   )test_universal_newlines_communicate_stdin  s    
	z9ProcessTestCase.test_universal_newlines_communicate_stdinc                 C   s0   t jtt jt jdd}|  | |jd d S )NT)r/   r0   r{   r   )r   r2   r   r3   r   rE   r   r8   r   r   r   .test_universal_newlines_communicate_input_none  s    z>ProcessTestCase.test_universal_newlines_communicate_input_nonec                 C   s   t jtjddt td gt jt jt jdd}| |j	j
 | |jj
 |d\}}| |jd | d| | |d	 d S )
Nr   r1  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/   r1   r0   r{   r8  r   zline1
line2
line3
line4
line5
zeline2
eline6
eline7
)r   r2   rC   rD   r3  r9  r:  r3   rl   r0   r7   r1   r   rE   r   r%  r	  r   r   r   r   7test_universal_newlines_communicate_stdin_stdout_stderr  s    
zGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrc                 C   sT   dD ]J}d| }t jd|g}tj|tjtj|d}|jdd\}}| |d qd S )N)zutf-16z	utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))r   )r/   r0   encodingr   rq   z1
2
3
4)rC   rD   r   r2   r3   r   rE   )r   r>  r   r*   popenr0   r1   r   r   r   -test_universal_newlines_communicate_encodings  s    z=ProcessTestCase.test_universal_newlines_communicate_encodingsc                 C   s\   dD ]R\}}d}t jd|g}tj|tjtjd|d}|jdd\}}| |d| qd S )	N))ignorer   )replaceu   ��)surrogateescapeu   )backslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')r   utf-8)r/   r0   r>  errorsr   rq   z[{}])rC   rD   r   r2   r3   r   rE   format)r   rF  expectedr   r*   r?  r0   r1   r   r   r   test_communicate_errors  s    z'ProcessTestCase.test_communicate_errorsc           
      C   sX  t s
d}nd}g }t }zt|D ]t}z.tj|tj}|	t
|tjtjB  W q& ty } z(|jtjkrv W Y d }~ qW Y d }~q&d }~0 0 q&| d|  tdD ]}t|  qtdD ]>}tjtjddgtjtjtjd}|d	d
 }| |d	 qW |D ]}	t|	 qt| n"|D ]}	t|	 q6t| 0 d S )Ni  i  z4failed to reach the file descriptor limit (tried %d)
      r   z-import sys;sys.stdout.write(sys.stdin.read())r.   s   limer   )r   rj   mkdtempranger   r   r   r   ZTESTFNappendopenO_WRONLYO_CREATOSErrorerrnoZEMFILEskipTestr7   popr   r2   rC   rD   r3   r   rE   r
   rmtree)
r   Zmax_handleshandlestmpdiriZtmpfileer9   datahr   r   r   test_no_leaking-  sF    &
zProcessTestCase.test_no_leakingc                 C   s   |  tg dd |  tg dd |  tg dd |  tg dd |  tg d	d
 |  tg dd |  tg dd |  tddgd d S )N)za b cr   rZ  z"a b c" d e)ab"c\r   z	ab\"c \ d)r^  z \r   zab\"c " \\" d)za\\\bzde fgr\  za\\\b "de fg" h)za\"brV   r   z
a\\\"b c d)za\\b cr   rZ  z"a\\b c" d e)za\\b\ cr   rZ  z"a\\b\ c" d eabr   zab "")rE   r   list2cmdliner   r   r   r   test_list2cmdlineT  s0    z!ProcessTestCase.test_list2cmdlinec                 C   sb   t jtjddgt jd}| |jj | |	  t
|j d |  | |	 d d S )Nr   zimport os; os.read(0, 1)rh      Ar   )r   r2   rC   rD   r3   rl   r/   r7   assertIsNonepollr   rm   r   r   rE   r8   r   r   r   	test_pollf  s    
zProcessTestCase.test_pollc                 C   s.   t t}| | d | | d d S rP   r   r2   r   rE   r   r8   r   r   r   	test_waitq  s    
zProcessTestCase.test_waitc                 C   sv   t tjddg}| t j}|jdd W d    n1 s@0    Y  | dt|j	 | 
|jtjdd d S )Nr   zimport time; time.sleep(0.3)-C6?rK   z0.0001r   )r   r2   rC   rD   rM   rN   r   r\   strrT   rE   r   SHORT_TIMEOUT)r   r9   rV   r   r   r   test_wait_timeoutw  s    *z!ProcessTestCase.test_wait_timeoutc                 C   s:   |  t ttd W d    n1 s,0    Y  d S )Nr  )rM   r   r   r2   r   r   r   r   r   test_invalid_bufsize  s    z$ProcessTestCase.test_invalid_bufsizec                 C   s>   t td }| | d t jtd d}| | d d S )Nr   )r;   rg  r8   r   r   r   test_bufsize_is_none  s    z$ProcessTestCase.test_bufsize_is_nonec              
   C   s   t jtjddgt jt jt jd|d}|j| t	|j
  |j }t 2 z|j	  W n tyv   Y n0 W d    n1 s0    Y  d |_W d    n1 s0    Y  | |jd | || d S )Nr   zDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r   )r/   r0   r1   r;   r{   r   )r   r2   rC   rD   r3   r   r/   rm   r   r7   r   r0   r5  r   SuppressCrashReportrR  rE   r   )r   linerH  r{   r9   Z	read_liner   r   r   _test_bufsize_equal_one  s&    

$$z'ProcessTestCase._test_bufsize_equal_onec                 C   s   d}| j ||dd d S )Nzline
Tr{   )rq  r   rp  r   r   r    test_bufsize_equal_one_text_mode  s    z0ProcessTestCase.test_bufsize_equal_one_text_modec                 C   sN   dt j  }| td  | j|ddd W d    n1 s@0    Y  d S )Ns   linezline bufferingr   Frr  )r   linesepr  ZassertWarnsRegexRuntimeWarningrq  rs  r   r   r   "test_bufsize_equal_one_binary_mode  s    z2ProcessTestCase.test_bufsize_equal_one_binary_modec              	   C   sP   t dD ]B}| t$ tjttjtjd W d    q1 s@0    Y  qd S )Nr   r   )rM  rM   r   r   r2   r   r3   )r   rY  r   r   r   test_leaking_fds_on_error  s    z)ProcessTestCase.test_leaking_fds_on_errorc              	   C   s   zdd l }|j W n  ttfy2   | d Y n0 tdtd}tj	d|g}t
j|t
jdd}| | d }W d    n1 s0    Y  | |d	 | |jd d S )
Nr   zneed 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)r1   r{   r   r   )msvcrtZCrtSetReportModeAttributeErrorImportErrorrT  r9  r:  r   rC   rD   r   r2   r3   r   rE   r   )r   ry  r   r  procr1   r   r   r   test_nonexisting_with_pipes  s"    

*z+ProcessTestCase.test_nonexisting_with_pipesc                    s*  g   fdd}t j|d}|  z| t( tjttjtjtjd W d    n1 s^0    Y  W |	  d } D ]<}zt
| W qz ty } z|}W Y d }~qzd }~0 0 qz|d ur|n`|	  d } D ]>}zt
| W q ty } z|}W Y d }~qd }~0 0 q|d ur$|0 d S )Nc                     s*   t dD ]}  t  td qd S )N   gMbP?)rM  extendr   r+  timesleep)rY  fdsr   r   open_fds  s    z<ProcessTestCase.test_double_close_on_error.<locals>.open_fds)targetr.   )	threadingThreadstartrM   EnvironmentErrorr   r2   r   r3   r   r   r7   rR  )r   r  texcfdrZ  r   r  r   test_double_close_on_error  s:    &
z*ProcessTestCase.test_double_close_on_errorc                    s   t tjddg |  jd  g  fdd}td|}|  t	rPd}nd} j
tjd | j j|d	d
  
  | j j|dd
 |  | dd|fd|fg d S )Nr   zimport time; time.sleep(12)c                      sN    d  f        d jf     d jf d S )Nthread-start-poll-resultthread-after-kill-and-waitthread-after-second-wait)rN  re  killr   r   r   r|  resultsr   r   kill_proc_timer_thread	  s    zDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_thread皙?r   irK   z*unexpected result in wait from main threadmsgz&unexpected result in second main wait.)r  Nr  r  )r   r2   rC   rD   rE   r   r  Timerr  r   r   r   rk  r   )r   r  r  Zexpected_errorcoder   r  r   test_threadsafe_wait  s4    


z$ProcessTestCase.test_threadsafe_waitc                 C   s6   d d}ttjd|g}| |dt| d S )N;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0r   s   Hello World!)r   r   r[   rC   rD   r%  r	  ascii)r   r   r^   r   r   r   test_issue87806  s    
zProcessTestCase.test_issue8780c                 C   s   t  \}}t  \}}t  \}}ztjdg|||d W nN ty   t| t| t| t| t| t| Y n0 | tj	
| | tj	
| | tj	
| d S )N*r.   )rj   mkstempr   r2   rR  r   r7   remover    r   exists)r   ZifhandleZifnameZofhandleZofnameZefhandleZefnamer   r   r    test_handles_closed_on_exceptionA  s"    





z0ProcessTestCase.test_handles_closed_on_exceptionc                 C   sT   t jtt jt jt jd}| |jj | |jj | |jj |	dd  d S )Nr.      x   )
r   r2   r   r3   rl   r0   r7   r1   r/   r   r8   r   r   r   test_communicate_epipeU  s    z&ProcessTestCase.test_communicate_epipec           	   
   C   s   t d}|jj}dddgdd dfg ddd df|dd	d
| dfg}tjjtj	dF |D ]0\}}}}tj	||d}||_
| t|| q^W d    n1 s0    Y  d S )Nz
my-tool.py)lsT{   z#<Popen: returncode: 123 args: 'ls'>)daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTr   zP<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')>r,   r   )pathlibPath	__class__r$   unittestr   patchobjectr   r2   r   rE   repr)	r   Zpath_cmdZpathlib_clsZcasesr  r   r   Zsxr9   r   r   r   	test_repr`  s    

	zProcessTestCase.test_reprc                 C   s8   t jtt jd}| |jj |  |dd  d S )Nrh   r  r  )	r   r2   r   r3   rl   r/   r7   r   r   r8   r   r   r   !test_communicate_epipe_only_stdins  s    z1ProcessTestCase.test_communicate_epipe_only_stdinSIGUSR1zRequires signal.SIGUSR1r  zRequires os.killgetppidzRequires os.getppidc              	   C   s   dd }t  t j|}| t j t j| tjddg}dD ]H}|tji}tj|fi |}|  W d    q81 sv0    Y  q8d S )Nc                 S   s   d S r   r   )signumframer   r   r   handler  s    z7ProcessTestCase.test_communicate_eintr.<locals>.handlerr   z7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r   )	signalr  rl   rC   rD   r   r3   r2   r   )r   r  old_handlerr*   streamkwprocessr   r   r   test_communicate_eintr{  s    
z&ProcessTestCase.test_communicate_eintr/proc/%d/fdzLinux specificc                 C   sp   dt   }t |}| t& tttjtjtjd W d    n1 sL0    Y  t |}| 	|| d S )Nr  r.   )
r   getpidlistdirrM   r'   r(   r   r   r3   rE   )r   Zfd_directoryZfds_before_popenZfds_after_exceptionr   r   r   !test_failed_child_execute_fd_leak  s    
$
z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on Windowsc                 C   sL   |  t}tg d W d    n1 s.0    Y  | |jjd d S )N)/opt/nonexistent_binarywithZsomer*   r  )rM   r   r   rB   rE   rT   filenamerU   r   r   r   %test_file_not_found_includes_filename  s    ,z5ProcessTestCase.test_file_not_found_includes_filenamec                 C   sP   |  t"}tjddgdd W d    n1 s20    Y  | |jjd d S )Nexit0z/some/nonexistent/directoryr   )rM   r   r   r2   rE   rT   r  rU   r   r   r    test_file_not_found_with_bad_cwd  s    0z0ProcessTestCase.test_file_not_found_with_bad_cwdc                 C   s,   |  tjt tj |  tjt tj d S r   )r4   r   r2   bytestypesGenericAliasCompletedProcessrj  r   r   r   r   test_class_getitems  s    z#ProcessTestCase.test_class_getitemsN)zr$   r%   r&   r:   r=   rH   rO   rR   rW   r_   ra   re   rp   rs   rw   rz   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  skipIfr   r   r   r   r   r   r   r   r   r   r   r   r   rC   base_prefixprefixr   	sysconfigZis_python_buildr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  platformZget_config_varr  r  r  r  r  r  r  r   r#  r(  r)  r/  r0  r6  r7  r;  r<  r=  r@  rI  r]  rb  rf  rh  rl  rm  rn  rq  rt  rw  rx  r}  r  r  r  r  r  r  r  
skipUnlesshasattrr  r   r  r   isdirr  r  r  r  r  r   r   r   r   r-   g   s  		

		













	
'')4




r-   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zeed%d&d' Zd(S ))RunFuncTestCasec                 K   s   t jd|g}tj|fi |S )Nr   )rC   rD   r   r   )r   r   r+   argvr   r   r   
run_python  s    zRunFuncTestCase.run_pythonc                 C   sP   |  d}| |jd | tj |  W d    n1 sB0    Y  d S r   )r  rE   r   rM   r   rS   check_returncoder   cpr   r   r   test_returncode  s    
zRunFuncTestCase.test_returncodec                 C   sN   |  tj}| jddd W d    n1 s00    Y  | |jjd d S )Nr?   Tcheckr@   )rM   r   rS   r  rE   rT   r   rU   r   r   r   
test_check  s    ,zRunFuncTestCase.test_checkc                 C   s    t jtdd}| |jd d S )NTr  r   )r   r   r   rE   r   r  r   r   r   test_check_zero  s    zRunFuncTestCase.test_check_zeroc                 C   s>   |  tj | jddd W d    n1 s00    Y  d S )NrI   ri  rK   )rM   r   rN   r  r   r   r   r   test_timeout  s    zRunFuncTestCase.test_timeoutc                 C   s"   | j dtjd}| d|j d S )NrX   r~   rY   r  r   r3   r\   r0   r  r   r   r   test_capture_stdout  s    z#RunFuncTestCase.test_capture_stdoutc                 C   s"   | j dtjd}| d|j d S )Nrb   rc   rY   )r  r   r3   r\   r1   r  r   r   r   test_capture_stderr  s    z#RunFuncTestCase.test_capture_stderrc                 C   sL   t  }| |j |d |d | jd|tjd}| 	d|j
 d S )Nrf   r   rg   r   ri   )rj   rk   rl   r7   rm   rn   r  r   r3   r\   r0   )r   ro   r  r   r   r   rp     s    

z+RunFuncTestCase.test_check_output_stdin_argc                 C   s$   | j ddtjd}| d|j d S )Nrg   rf   )rr   r0   ri   r  r  r   r   r   rs     s
    z+RunFuncTestCase.test_check_output_input_argc                 C   s   t  }| |j |d |d | jtdd }| jd|dd}W d    n1 s\0    Y  | 	d|j
jd  | 	d	|j
jd  d S )
Nrf   r   r   r  r}   r   r   r/   rr   )rj   rk   rl   r7   rm   rn   rM   r   r  r\   rT   r*   r   r   r   r   r     s    

$z6RunFuncTestCase.test_check_output_stdin_with_input_argc                 C   sb   |  tj"}| jddtjd}W d    n1 s40    Y  | |jjd | |jjd d S )Nr   r   )rL   r0   rY   )	rM   r   rN   r  r3   rE   rT   r^   r0   )r   rV   r  r   r   r   r     s    $z)RunFuncTestCase.test_check_output_timeoutc                 C   s2   t j }d|d< | jd|d}| |jd d S )Nr   r   zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)r   !   )r   r   r   r  rE   r   )r   r   r  r   r   r   test_run_kwargs  s    
zRunFuncTestCase.test_run_kwargsc                 C   s   t rdnd}t|}|d u r.| | d t|}tj|tjd}| |j	d | 
t" tj|tjdd W d    n1 s0    Y  d S )Nztree.comr  z required for this testr~   r   T)r0   r   )r   r
   r   rT  r   r   r   r   rE   r   rM   r   )r   progr   resr   r   r   test_run_with_pathlike_path  s    
z+RunFuncTestCase.test_run_with_pathlike_pathc                 C   s2   t tj}|ddg}t|}| |jd d S )Nr   s   import sys; sys.exit(57)9   )r   r   rC   rD   r   r   rE   r   r   r   r*   r  r   r   r   &test_run_with_bytes_path_and_arguments"  s    

z6RunFuncTestCase.test_run_with_bytes_path_and_argumentsc                 C   s0   t tj}|ddg}t|}| |jd d S )Nr   zimport sys; sys.exit(57)r  )r   rC   rD   r   r   rE   r   r  r   r   r   )test_run_with_pathlike_path_and_arguments)  s    


z9RunFuncTestCase.test_run_with_pathlike_path_and_argumentsc                 C   s.   | j ddd}| d|j | d|j d S )Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)capture_outputrY   s   FLUFL)r  r\   r0   r1   r  r   r   r   test_capture_output0  s
    z#RunFuncTestCase.test_capture_outputc                 C   s~   t  }| |j | jtdd }| jdd|d}W d    n1 sH0    Y  | d|jj	d  | d|jj	d  d S )	NzAExpected ValueError when stdout and capture_output args supplied.r  r}   T)r  r0   r0   r   r  
rj   rk   rl   r7   rM   r   r  r\   rT   r*   r   r   r   r   #test_stdout_with_capture_output_arg8  s    $z3RunFuncTestCase.test_stdout_with_capture_output_argc                 C   s~   t  }| |j | jtdd }| jdd|d}W d    n1 sH0    Y  | d|jj	d  | d|jj	d  d S )	NzAExpected ValueError when stderr and capture_output args supplied.r  r}   T)r  r1   r1   r   r  r  r   r   r   r   #test_stderr_with_capture_output_argD  s    $z3RunFuncTestCase.test_stderr_with_capture_output_argz)requires posix like 'sleep' shell commandc              
   C   s   t  }ztjddddd W n6 tjyT } zt  }t }W Y d }~nd }~0 0 | d | j|| dd| dd	 d S )
Nzsleep 3TrJ   )r   rL   r  zTimeoutExpired not raised.g      ?z/TimeoutExpired was delayed! Bad traceback:
```
z```r  )	r  	monotonicr   r   rN   	traceback
format_excr   Z
assertLess)r   Zbefore_secsr  Z
after_secsZstacksr   r   r   .test_run_with_shell_timeout_and_capture_outputT  s    


z>RunFuncTestCase.test_run_with_shell_timeout_and_capture_outputN)r$   r%   r&   r  r  r  r  r  r  r  rp   rs   r   r   r  r  r  r  r  r  r  r  r  r   r  r   r   r   r   r    s(   
r  c               	   C   sJ   dD ]6} t rzt |  W n ty0   Y qY n0 |   S qtdd S )N)ZstaffZnogroupgrpnobodyZ	nfsnobodyz?No identified group name to use for this test on this platform.)r  getgrnamKeyErrorr  SkipTest)
name_groupr   r   r   _get_test_grp_namee  s    

r  zPOSIX specific testsc                       s  e Zd Z fddZdd Zdd Zdd Zd	d
 ZG dd dej	Z
eddd Zeddd Zeejd ddd Zdd Zeeedddd Zeeedddd Zeeedd d!d" Zeeedd#d$d% Zeeed&d'd(d) Zeeed&d*d+d, Zeep@eed- d.d/d0 Zd1d2 Z d3d4 Z!d5d6 Z"d7d8 Z#d9d: Z$d;d< Z%G d=d> d>ej	Z&eejd? d@dAdB Z'dCdD Z(ee)j*dEkdF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~ ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPee)j*3do,eQdjReQdjRkddd ZSeTUdddd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`eTjadd ZbeTjadd Zcdd Zddd Zedd Zfdd Zgeehduoeehdddd ZiddÄ Zjddń ZkddǄ Zl  ZmS )POSIXProcessTestCasec                    s   t    d| _d S )Nz/_this/pa.th/does/not/exist)superr   _nonexistent_dirr   r  r   r   r   t  s    
zPOSIXProcessTestCase.setUpc              
   C   sN   zt | j W n( ty8 } z|}W Y d }~nd }~0 0 | d| j  |S )Nz,chdir to nonexistent directory %s succeeded.)r   chdirr   rR  r   )r   rZ  desired_exceptionr   r   r   _get_chdir_exceptionx  s    z)POSIXProcessTestCase._get_chdir_exceptionc              
   C   s   |   }ztjtjddg| jd}W nT tyx } z<| |j|j | |j	|j	 | |j
|j
 W Y d }~nd }~0 0 | d|  d S )Nr   r   r   Expected OSError: %sr  r   r2   rC   rD   r   rR  rE   rS  strerrorr  r   r   r  r9   rZ  r   r   r   test_exception_cwd  s    
&z'POSIXProcessTestCase.test_exception_cwdc              
   C   s   |   }ztjtjddg| jd}W nT tyx } z<| |j|j | |j	|j	 | |j
|j
 W Y d }~nd }~0 0 | d|  d S )Nr   r   r   r  r  r  r   r   r   test_exception_bad_executable  s    
&z2POSIXProcessTestCase.test_exception_bad_executablec              
   C   s   |   }zt| jddg}W nT tyr } z<| |j|j | |j|j | |j|j W Y d }~nd }~0 0 | 	d|  d S )Nr   r   r  )
r  r   r2   r   rR  rE   rS  r  r  r   r  r   r   r   test_exception_bad_args_0  s    &z.POSIXProcessTestCase.test_exception_bad_args_0c                   @   s   e Zd Zdd ZdS )z&POSIXProcessTestCase.PopenNoDestructorc                 C   s   d S r   r   r   r   r   r   __del__  s    z.POSIXProcessTestCase.PopenNoDestructor.__del__N)r$   r%   r&   r  r   r   r   r   PopenNoDestructor  s   r  z%subprocess._posixsubprocess.fork_execc              	   C   sv   dd }||_ tjdtdF | t | dg W d    n1 sJ0    Y  W d    n1 sh0    Y  d S )Nc                  W   s0   | d }d tj }t|d| d  dS )N   z{:x}s   OSError:   :r   )rG  rS  ZEISDIRr  r   rm   )r*   errpipe_writeZerr_coder   r   r   proper_error  s    zHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_errorsubprocess.os.waitpidside_effectnon_existent_command)r  r   r  ChildProcessErrorrM   IsADirectoryErrorr  )r   	fork_execr  r   r   r   test_exception_errpipe_normal  s    z2POSIXProcessTestCase.test_exception_errpipe_normalc              	      s   d  fdd}||_ tjdtdH | tj}| dg W d    n1 sT0    Y  W d    n1 sr0    Y  | t	 t
|j d S )Ns    ޭc                     s   | d }t |  dS )Nr  r   )r   rm   )r*   r  Z
error_datar   r   	bad_error  s    zGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_errorr  r  r  )r  r   r  r  rM   r   SubprocessErrorr  r\   r  rj  rT   )r   r  r  rZ  r   r  r   test_exception_errpipe_bad_data  s    Hz4POSIXProcessTestCase.test_exception_errpipe_bad_data/proc/self/statuszneed /proc/self/statusc                 C   s   t jddgdd}| D ]}|dr|} q<q| d t jddgdd}| D ]}|drV|} qnqV| j||dd	 d S )
Ncatr  F)restore_signalss   SigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.r  )r   r[   
splitlinesr	  rT  assertNotEqual)r   Zdefault_proc_statusrp  Zdefault_sig_ign_maskZrestored_proc_statusZrestored_sig_ign_maskr   r   r   test_restore_signals  s(    


z)POSIXProcessTestCase.test_restore_signalsc              
   C   sp   zt jtjddgdd}W n2 tyL } z|jtjkr8 W Y d }~n(d }~0 0 td}t	|}| 
|| d S )Nr   zimport os; print(os.getsid(0))T)start_new_sessionr   )r   r[   rC   rD   rR  rS  EPERMr   getsidintr"  )r   r^   rZ  Z
parent_sidZ	child_sidr   r   r   test_start_new_session  s    


z+POSIXProcessTestCase.test_start_new_sessionsetreuidzno setreuid on platformc           
      C   s  t  }|dkrdnd|g}tjdkr*dnd}td urfzt| || W n tyd   d }Y n0 |D ]}dD ]}| j||d zt	j
tjdd	g||d}W nH ty   Y nj ty } z |jtjtjfvrւ W Y d }~n<d }~0 0 t|trt|j}n|}t|}	| |	| W d    qr1 s40    Y  qrqj| t t	jtd
d W d    n1 sr0    Y  | t& t	jtt jt jdd W d    n1 s0    Y  td u r|d ur| t t	jt|d W d    n1 s0    Y  d S )N    darwinr  unknownr$  )user	close_fdsr   zimport os; print(os.getuid())r.              )r   r   r.  )r   geteuidrC   r  pwdgetpwnamrN  r  subTestr   r[   rD   PermissionErrorrR  rS  ZEACCESr%  
isinstancerj  pw_uidr'  rE   rM   r   rQ   r   OverflowErrorr   r   )
r   uidZ
test_usersZname_uidr.  r/  r^   rZ  Zuser_uidZ
child_userr   r   r   	test_user  sN    


0.
&zPOSIXProcessTestCase.test_userz setreuid() available on platformc                 C   s<   |  t tjtdd W d    n1 s.0    Y  d S )N  r1  rM   r   r   rQ   r   r   r   r   r   test_user_error?  s    z$POSIXProcessTestCase.test_user_errorsetregidzno setregid() on platformc           	      C   s  t  }|dkrdndg}t }td ur2|| ||g D ]}dD ]}| j||dp ztjtj	ddg||d}W n t
y   Y n20 t|trt|j}n|}t|}| || W d    qD1 s0    Y  qDq<| t tjtdd W d    n1 s
0    Y  | t& tjtt jt jd	d
 W d    n1 sL0    Y  td u r| t tjt|d W d    n1 s0    Y  d S )Nr*  r+  r$  )groupr/  r   zimport os; print(os.getgid())r0  rA  r2  )r   r   rA  )r   getegidr  r  rN  r6  r   r[   rC   rD   r7  r8  rj  r  gr_gidr'  rE   rM   r   rQ   r   r:  r   r   )	r   gid
group_listr  rA  r/  r^   Z	group_gidZchild_groupr   r   r   
test_groupD  s@    


..
&
zPOSIXProcessTestCase.test_groupz setregid() available on platformc                 C   s<   |  t tjtdd W d    n1 s.0    Y  d S )Nr=  rB  r>  r   r   r   r   test_group_errorn  s    z%POSIXProcessTestCase.test_group_error	setgroupszno setgroups() on platformc           
   
   C   s  t  }|dkrdndg}t }d}td ur6|| ztjtjddg|d}W n6 t	y } z|j
t
jkrn d}W Y d }~nfd }~0 0 t  }t|}td urdd	 |D }	n|}	|r| t|t| n| t|	t| | t  tjtd
gd W d    n1 s0    Y  | t( tjtt jt jdgd W d    n1 sZ0    Y  td u r| t  tjt|gd W d    n1 s0    Y  d S )Nr*  r+  Fr   z;import os, sys, json; json.dump(os.getgroups(), sys.stdout)extra_groupsTc                 S   s&   g | ]}t |trt|jn|qS r   )r8  rj  r  r  rD  )r  gr   r   r   r    s   z:POSIXProcessTestCase.test_extra_groups.<locals>.<listcomp>r0  r2  )r   r   rK  )r   rC  r  r  rN  r   r[   rC   rD   rR  rS  r%  	getgroupsjsonloadsrE   setrM   r   rQ   r   r   r   )
r   rE  rF  r  Z
perm_errorr^   exZparent_groupsZchild_groupsZdesired_gidsr   r   r   test_extra_groupss  sN    


0&
z&POSIXProcessTestCase.test_extra_groupsz!setgroups() available on platformc                 C   s<   |  t tjtg d W d    n1 s.0    Y  d S )NrJ  r>  r   r   r   r   test_extra_groups_error  s    z,POSIXProcessTestCase.test_extra_groups_errorumaskzPOSIX umask() is not available.c              	   C   s   d }zt  }tj|d}tjtjdd|dgdd t	|j
d@ }d}| j||t| d	t| d
 W |d urt| n|d urt| 0 d S )NZbeansr   zopen(z, 'w').close()+   )rT  i  i  z != r  )rj   rL  r   r   r   r   rQ   rC   rD   statst_moderE   octr
   rV  )r   rX  namerW  Zexpected_moder   r   r   
test_umask  s"    zPOSIXProcessTestCase.test_umaskc                 C   sX   t  * ttjddg}|  W d    n1 s80    Y  | |j t	j
 d S )Nr   zimport os; os.abort())r   ro  r   r2   rC   rD   r   rE   r   r  SIGABRTr8   r   r   r   test_run_abort  s    

&z#POSIXProcessTestCase.test_run_abortc                 C   sN   t ttj d}t|}| d|  | d| | ttj| d S )Nfake cmdr  ZSIG)r   rS   r'  r  r[  rj  r\   lowerr   r   Zerror_stringr   r   r   "test_CalledProcessError_str_signal  s
    z7POSIXProcessTestCase.test_CalledProcessError_str_signalc                 C   s$   t dd}t|}| d| d S )NiKir]  zunknown signal 9876543.r   rS   rj  r\   r_  r   r   r   *test_CalledProcessError_str_unknown_signal  s    z?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalc                 C   s$   t dd}t|}| d| d S )N   r]  znon-zero exit status 2.ra  r_  r   r   r   $test_CalledProcessError_str_non_zero  s    z9POSIXProcessTestCase.test_CalledProcessError_str_non_zeroc                 C   sX   t jtjddgt jdd d}|" | |j d W d    n1 sJ0    Y  d S )Nr   r  c                   S   s   t ddS )Nr   apple)r   putenvr   r   r   r   <lambda>  r   z3POSIXProcessTestCase.test_preexec.<locals>.<lambda>)r0   
preexec_fn   appler   r8   r   r   r   test_preexec  s    
z!POSIXProcessTestCase.test_preexecc              
   C   s   dd }zt jtjddg|d}W nh t jyV } z| t jd W Y d }~nHd }~0  ty } z| d|j	d  W Y d }~nd }~0 0 | 
d	 d S )
Nc                   S   s   t dd S )Nz'What if two swallows carried a coconut?r   r   r   r   r   raise_it  s    z=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itr   r   rh  z)Expected a ValueError from the preexec_fnZcoconutr   zEException raised by preexec_fn did not make it to the parent process.)r   r2   rC   rD   r  r%  _posixsubprocessr   r\   r*   r   )r   rl  r9   rZ  r   r   r   test_preexec_exception  s    
(z+POSIXProcessTestCase.test_preexec_exceptionc                   @   s   e Zd Zdd Zdd ZdS )z+POSIXProcessTestCase._TestExecuteChildPopenc                 O   s$   || _ tjj| g|R i | d S r   )	_testcaser   r2   r   )r   Ztestcaser*   r+   r   r   r   r     s    z4POSIXProcessTestCase._TestExecuteChildPopen.__init__c                 O   s  zt jj| g|R i | W dd tdD }zL|D ].}| jj|| j | j | j	 fdd q6W |D ]}t
| qln|D ]}t
| q0 nxdd tdD }zL|D ].}| jj|| j | j | j	 fdd qW |D ]}t
| qn|D ]}t
| q0 0 d S )Nc                 S   s   g | ]}t d t jqS )	/dev/zero)r   rO  O_RDONLYr  r"  r   r   r   r    s   zNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>   z!At least one fd was closed early.r  )r   r2   r,   rM  rp  rv   r/   r   r0   r1   r   r7   )r   r*   r+   Zdevzero_fdsr  r   r   r   r,     s@    

z:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)r$   r%   r&   r   r,   r   r   r   r   _TestExecuteChildPopen  s   ru  rq  z/dev/zero required.c              	   C   sT   dd }|  tj, | j| ttjtjtj|d W d    n1 sF0    Y  d S )Nc                   S   s   t dd S )Nz-force the _execute_child() errpipe_data path.)r   r  r   r   r   r   rl    s    zWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_it)r/   r0   r1   rh  )rM   r   r  ru  r   r3   )r   rl  r   r   r   0test_preexec_errpipe_does_not_double_close_pipes  s    zEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipesc                 C   s&  dd }t  }t j}t j}zt   | t   tjtjddgdd d | t  d t   | 	t   tjtjddgd	d d | 	t  d
 |t _| j
ttjtjddgdd d t `| j
ttjtjddgdd d W |t _|t _|s"t   n|t _|t _|s t   0 d S )Nc                   S   s   t dd S )Nzthis shouldn't escape)RuntimeErrorr   r   r   r   raise_runtime_error!  s    zPPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.raise_runtime_errorr   r   c                   S   s   d S r   r   r   r   r   r   rg  *  r   zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>rm  z#Popen enabled gc when it shouldn't.c                   S   s   d S r   r   r   r   r   r   rg  1  r   zPopen left gc disabled.c                   S   s   d S r   r   r   r   r   r   rg  7  r   c                   S   s   d S r   r   r   r   r   r   rg  <  r   )gc	isenableddisabler    r   rB   rC   rD   enabler%  rM   rw  r2   rz  )r   rx  ZenabledZorig_gc_disableZorig_gc_isenabledr   r   r   test_preexec_gc_module_failure  sJ    





z3POSIXProcessTestCase.test_preexec_gc_module_failurer,  z!setrlimit() seems to fail on OS Xc              
   C   s   zddl m}m}m} W n. tyF } z| | W Y d }~n
d }~0 0 ||}|\}}||d|f | ||| ztjt	j
ddgdd d W n ty   Y n0 | d d S )	Nr   )	getrlimit	setrlimitRLIMIT_NPROCr   r   c                   S   s   d S r   r   r   r   r   r   rg  R  r   z@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>rm  z.RLIMIT_NPROC had no effect; probably superuser)resourcer~  r  r  r{  rT  rl   r   rB   rC   rD   BlockingIOError)r   r~  r  r  r   Zlimitsr"  Zhardr   r   r   test_preexec_fork_failureC  s     
z.POSIXProcessTestCase.test_preexec_fork_failurec                 C   s   t  \}}t|ddd0}|dtj  |dtj  W d    n1 sP0    Y  t	|d t
|}|  t| | |jd d S NwrC  )rF  z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
i  r@   )rj   r  rO  rm   r   
unix_shellrC   rD   r   chmodr   r2   r   r  rE   r   )r   r  fnamefobjr9   r   r   r   test_args_stringY  s    $

z%POSIXProcessTestCase.test_args_stringc                 C   s<   | j ttjtjddgdd | j ttjtjddgdd d S )Nr   r?   r@   startupinfocreationflagsrM   r   r   rB   rC   rD   r   r   r   r   r   g  s    

z&POSIXProcessTestCase.test_invalid_argsc                 C   sh   t j }d|d< tjdgdtj|d}|( | |j 	dd W d    n1 sZ0    Y  d S Nre  r   zecho $FRUITr   r   r0   r   s    	
ri  
r   r   r   r   r2   r3   rE   r0   r   r  r   r   r9   r   r   r   test_shell_sequencer  s    

z(POSIXProcessTestCase.test_shell_sequencec                 C   sf   t j }d|d< tjddtj|d}|( | |j 	dd W d    n1 sX0    Y  d S r  r  r  r   r   r   test_shell_string|  s    
z&POSIXProcessTestCase.test_shell_stringc                 C   s   t  \}}t|ddd0}|dtj  |dtj  W d    n1 sP0    Y  t	|d t
|}t| | |d d S r  )rj   r  rO  rm   r   r  rC   rD   r   r  r   rB   r  rE   )r   r  r  r  rG   r   r   r   test_call_string  s    $

z%POSIXProcessTestCase.test_call_stringc              	   C   s   g }dD ]2}dD ](}t j||}t j|r|| qq|sJ| d d}t j|rpt j|sp|| |D ]X}tjd|dtj	d}|, | 
|j  t|d W d    qt1 s0    Y  qtd S )	N)z/binz	/usr/bin/z/usr/local/bin)ZbashZkshz"bash or ksh required for this testz/bin/shzecho $0T)rD   r   r0   r  )r   r   r   isfilerN  rT  islinkr   r2   r3   rE   r0   r   r  r  )r   Zshellsr  rY  shr9   r   r   r   test_specific_shell  s"    


z(POSIXProcessTestCase.test_specific_shellc              
   G   st   t  t jt j}z4tjtjddgdtjtjtjd}W t  t j| nt  t j| 0 |j	d t
|||  |S )Nr   zif 1:
                                 import sys, time
                                 sys.stdout.write('x\n')
                                 sys.stdout.flush()
                                 time.sleep(30)
                                 Tr/  r/   r0   r1   r   )r  SIGINTdefault_int_handlerr   r2   rC   rD   r3   r0   r   getattr)r   methodr*   r  r9   r   r   r   _kill_process  s     z"POSIXProcessTestCase._kill_process)ZnetbsdZopenbsdz"Due to known OS bug (issue #16762)c                 G   sR   t jtjddgdt jt jt jd}|jd td t	|||  |
  d S )Nr   zif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             Tr  r   )r   r2   rC   rD   r3   r0   r   r  r  r  r   )r   r  r*   r9   r   r   r   _kill_dead_process  s    
z'POSIXProcessTestCase._kill_dead_processc                 C   s:   |  dtj}| \}}| d| | | d d S )Nsend_signals   KeyboardInterruptr   )r  r  r  r   r\   r"  r   r   r9   r"  r1   r   r   r   test_send_signal  s    z%POSIXProcessTestCase.test_send_signalc                 C   s:   |  d}| \}}| |d | | tj  d S )Nr  r   )r  r   rE   r   r  SIGKILLr  r   r   r   	test_kill  s    
zPOSIXProcessTestCase.test_killc                 C   s:   |  d}| \}}| |d | | tj  d S )N	terminater   )r  r   rE   r   r  SIGTERMr  r   r   r   test_terminate  s    
z#POSIXProcessTestCase.test_terminatec                 C   s   |  dtj d S Nr  )r  r  r  r   r   r   r   test_send_signal_dead  s    z*POSIXProcessTestCase.test_send_signal_deadc                 C   s   |  d d S Nr  r  r   r   r   r   test_kill_dead  s    z#POSIXProcessTestCase.test_kill_deadc                 C   s   |  d d S Nr  r  r   r   r   r   test_terminate_dead  s    z(POSIXProcessTestCase.test_terminate_deadc                 C   s6   g }|D ](}t |}t |}||||f q|S r   )r   get_inheritableduprN  )r   Zsave_fdsr  r  inheritablesavedr   r   r   	_save_fds  s    

zPOSIXProcessTestCase._save_fdsc                 C   s.   |D ]$\}}}t j|||d t | qd S )N)r  )r   dup2r7   )r   r  r  r  r  r   r   r   _restore_fds  s    z!POSIXProcessTestCase._restore_fdsc           	   	   C   s   d}|  |}|D ]\}}}|dkr|} q.qz`|D ]}t| q4tjtjddg|tjtjd \}}| 	|d | 	|d W | 
| n| 
| 0 d S )Nr   r   r   r.   ri  r   )r  r   r7   r   r2   rC   rD   r3   r   rE   r  )	r   r  r/   	saved_fdsr  r  r  r   r   r   r   r   check_close_std_fds	  s&    

z(POSIXProcessTestCase.check_close_std_fdsc                 C   s   |  dg d S rP   r  r   r   r   r   test_close_fd_0	  s    z$POSIXProcessTestCase.test_close_fd_0c                 C   s   |  dg d S Nr   r  r   r   r   r   test_close_fd_1	  s    z$POSIXProcessTestCase.test_close_fd_1c                 C   s   |  dg d S )Nrc  r  r   r   r   r   test_close_fd_2!	  s    z$POSIXProcessTestCase.test_close_fd_2c                 C   s   |  ddg d S )Nr   r   r  r   r   r   r   test_close_fds_0_1$	  s    z'POSIXProcessTestCase.test_close_fds_0_1c                 C   s   |  ddg d S )Nr   rc  r  r   r   r   r   test_close_fds_0_2'	  s    z'POSIXProcessTestCase.test_close_fds_0_2c                 C   s   |  ddg d S )Nr   rc  r  r   r   r   r   test_close_fds_1_2*	  s    z'POSIXProcessTestCase.test_close_fds_1_2c                 C   s   |  g d d S )N)r   r   rc  r  r   r   r   r   test_close_fds_0_1_2-	  s    z)POSIXProcessTestCase.test_close_fds_0_1_2c              
   C   s   t d}t d}zZt d t d ttjddg  W t |d t |d t | t | n.t |d t |d t | t | 0 d S )Nr   r   r   z*print('AssertionError:0:CLOEXEC failure.'))	r   r  r7   r   r2   rC   rD   r   r  )r   Z	new_stdinZ
new_stdoutr   r   r   test_small_errpipe_write_fd2	  s"    





z0POSIXProcessTestCase.test_small_errpipe_write_fdc           
   
   C   s^  dd t dD }z,dd |D }|D ]\}}t| q(t|d d t|d dd | t d}zZt|D ]\}}t|| qvtj	t
jdd	g|d |d
 |d d}|  W | | n| | 0 |D ]}t|dd qt|d
 d}t|d d }	| |d | |	d W |D ]}t| q.n|D ]}t| qF0 d S )Nc                 S   s   g | ]}t  qS r   rj   r  r  rY  r   r   r   r  I	  r   z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>r   c                 S   s   g | ]\}}|qS r   r   r  r  r  r   r   r   r  K	  r   r      STDINr   r   Zimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")rc  r.   r   	   got STDIN   err)rM  r   unlinkrm   r   r  	enumerater  r   r2   rC   rD   r   r  r   r  rE   r7   )
r   tempstemp_fdsr  r  r  temp_fdr9   r   r   r   r   r   test_remapping_std_fdsG	  s<    

z+POSIXProcessTestCase.test_remapping_std_fdsc              
   C   sB  dd t dD }dd |D }z|D ]\}}t| q(| t d}zt|D ]\}}	t|	| qTt|d t|dd tj	t
jddg|||d	}
|
  |D ]}t|dd qt|d
}t|d
 }W | | n| | 0 | |d | |d W |D ]}t| qn|D ]}t| q*0 d S )Nc                 S   s   g | ]}t  qS r   r  r  r   r   r   r  v	  r   z7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>r   c                 S   s   g | ]\}}|qS r   r   r  r   r   r   r  w	  r   r  r   r   r  r.   r   r  r  )rM  r   r  r  r  r  rm   r   r   r2   rC   rD   r   r   r  r  rE   r7   )r   Zstdin_noZ	stdout_noZ	stderr_nor  r  r  r  r  r  r9   r   r   r   r   r   check_swap_fdst	  s<    
z#POSIXProcessTestCase.check_swap_fdsc                 C   sX   |  ddd |  ddd |  ddd |  ddd |  ddd |  ddd d S )Nr   r   rc  )r  r   r   r   r   test_swap_fds	  s    z"POSIXProcessTestCase.test_swap_fdsc                 C   s  |  td}zj|D ]<}t  }t| | W d    q1 sH0    Y  qttdt|  }t	| g d}i }t
||D ]\}}	||||	 < qtd}
ttdt|  }tjtjd|
t|gfi |}| |d t
||D ]r\}}	t|dtj t|d}ttt|d}td| d	| d
| d| d|	 d}| |	g|| qW | | n| | 0 d S )Nr   r.   z
                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   r   r   r  z"
                    When testing z to z4 redirection,
                    parent descriptor z5 got redirected
                    to descriptor(s) z instead of descriptor z.
                )r  rM  rj   rk   r   r  r   rP  rU  r7   zipr9  r:  r   rB   rC   rD   rj  rE   r   SEEK_SETr   r  mapr'  r   r  )r   from_fdsto_fdsr  Zfrom_fdfZfd_to_close	arg_namesr+   Zto_fdr   Z
skipped_fdrG   
read_bytesZread_fdsr  r   r   r   #_check_swap_std_fds_with_one_closed	  sD    
0


z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedc                 C   s<   t tddD ]&}t tddD ]}| || q$qd S )Nr   rc  )	itertoolscombinationsrM  permutationsr  )r   r  r  r   r   r   !test_swap_std_fds_with_one_closed	  s    z6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc              
   C   s   dd }zt jt|d W n tyZ } z(| t j | t|d W Y d }~nTd }~0  t jy } z(| 	t j | t|d W Y d }~nd }~0 0 | 
d d S )Nc                   S   s   t dd S )N   surrogate:rk  r   r   r   r   prepare	  s    zCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparerm  r  z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)r   rB   r   r   rd  rn  rE   rj  r  assertIsNotNoner   )r   r  r   r   r   r   test_surrogates_error_message	  s    
$&z2POSIXProcessTestCase.test_surrogates_error_messagec                 C   s   dD ]\}}| dd}dt| }tj }|||< d|d< |}tjtjd|g|d}|	d	}| 
|dt| | dd}d
t| }tj }|||< tjtjd|g|d}|	d	}| 
|dt| qd S )N))testu   abc)u   testZ42r  rC  z&import os; print(ascii(os.getenv(%s)))CLC_ALLr   r   s   
z'import os; print(ascii(os.getenvb(%s))))r  r  r   r   r   r   r[   rC   rD   r   rE   r   r  )r   keyvalueZencoded_valuescriptr   Zdecoded_valuer0   r   r   r   test_undecodable_env	  s.    





z)POSIXProcessTestCase.test_undecodable_envc           	      C   s   t td }ttdd  }t jtd \}}t |}t|g| }| |d d|d	|
df }tj|dd}| |d t j }||d< tj|g| |d	}| |d t j }t ||d
< tj|g| |d	}| |d d S )Nr   r   s   '%s' %s rE  Tr  PATHr   s   PATH)r   r   r   r  r   r   r   rB   rE   r   r  r   r   environb)	r   Zabs_programr*   r   Zprogramexitcoder  r   Zenvbr   r   r   test_bytes_program
  s"    


z'POSIXProcessTestCase.test_bytes_programc           	      C   s   t jddd}t jddd}tjtj|gtjtjtjdd}| |jd tjtj|gtjdd}| \}}t	t
t|d	}t	|j |j |j g}| ||@ d
|||@ f  d S )Nzinput_reader.pysubprocessdataZsubdirfd_status.pyF)r/   r0   r1   r/  r   r0   r/     ,z5Expected no fds from %r to be open in child, found %r)r   findfiler   r2   rC   rD   r3   rl   r   rP  r  r'  r   r/   r   r0   r1   r    )	r   Zsleeper	fd_statusp1p2r^   errorZ
result_fdsZunwanted_fdsr   r   r   test_pipe_cloexec(
  s(    

z&POSIXProcessTestCase.test_pipe_cloexecc           
         s  t jddd}t jddd}d}|d d }tjtj|gtjtjdd	 tjtj||g jtjdd	|  j	 | j	  fd
d}fdd}| | | |  j
|  j
  tjgg g d\}}}	| |d | j |  j  j  d S )Nzqcat.pyr  r  zqgrep.pys   zxcvbn      
F)r/   r0   r/  c                      s$   z    W n ty   Y n0 d S r   r  ProcessLookupErrorr   )r  r   r   kill_p1P
  s    zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1c                      s$   z    W n ty   Y n0 d S r   r  r   )r  r   r   kill_p2U
  s    zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2rJ  zThe child hung)r   r  r   r2   rC   rD   r3   r0   rl   r   r/   rm   r7   selectr%  rE   r   )
r   ZqcatZqgrepZsubdatar[  r  r   Z	readfilesZignored1Zignored2r   )r  r  r   test_pipe_cloexec_real_tools?
  s2    



z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc           
         s  t jddd}t }| tj|d  | tj|d  t| tdD ],}ttj	tj
}| tj|  | qJ D ]}t|d q|tjtj|gtjdd	}| \}}ttt|d
}| | @  d tjtj|gtjdd	}| \}}ttt|d
}| | @ d | d|d t fddtdD }	tjtj|gtjd|	d}| \}}ttt|d
}| ||	  @ d | d|d d S )Nr  r  r  r   r   	   TFr  r  zSome fds were closedzSome fds were left openzSubprocess failedc                 3   s   | ]}   V  qd S r   )rU  rs  r  r   r   	<genexpr>
  r   z6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>rt  r0   r/  pass_fdsz'Some fds not in pass_fds were left open)r   r  r   r+  rl   r7   rP  rM  rO  devnullrr  addset_inheritabler   r2   rC   rD   r3   r   r  r'  r   rE   r    r\   )
r   r  r  r"  r  r9   r^   ignoredremaining_fdsfds_to_keepr   r  r   test_close_fdsh
  sN    
z#POSIXProcessTestCase.test_close_fdsZfreebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.c                 C   s   t jddd}tjtjdtd| gtjd}|	 \}}|
 }| jt|dd| d	 ttt|d
  d}ttt|d  d}| j||@ dd	 d S )Nr  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~   rc  z(expected exactly two lines of output:
%rr  r   r  r   zSome fds were left open.)r   r  r   r2   rC   rD   r9  r:  r3   r   r!  rE   r!  rP  r  r'  r  r   r    )r   r  r9   r^   Zunused_stderrZoutput_linesZ
opened_fdsr  r   r   r   %test_close_fds_when_max_fd_is_lowered
  s$    /02
z:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredrJ  r`   c              	   C   s@  t jddd}t }tdD ]Z}t }| tj|d  | tj|d  t|d d t|d d |	| q|D ]}t
jtj|gt
jd|fd}| \}}ttt|d	}	||h }
| ||	d
 | |	|
@ d | t(}| t
jtd|fd W d    n1 s0    Y  | dt|j q|d S )Nr  r  r  r`   r   r   Tr  r  zfd to be passed not passedzfd to be closed passedF)r/  r  zoverriding close_fds)r   r  rP  rM  r   r+  rl   r7   r
  updater   r2   rC   rD   r3   r   r  r'  r   r\   r    ZassertWarnsrv  rB   r   rj  warning)r   r  r  r-  r  r  r9   r^   r  r  Zto_be_closedcontextr   r   r   test_pass_fds
  s6    

(z"POSIXProcessTestCase.test_pass_fdsc           
      C   s   t jddd}t \}}| tj| | tj| t|d t|d ||f}tj|g}|t	t
t|7 }tj|tjd|d}| \}}tt
t|d}	| |	t|d|  | t|d | t|d d S )	Nr  r  r  TFr  r  z	output=%a)r   r  r   r+  rl   r7   r
  rC   rD   r  r  rj  r   r2   r3   r   rP  r'  r   rE   r  )
r   r  r  Znon_inheritabler  r*   r9   r^   r  r  r   r   r   test_pass_fds_inheritable  s$    
z.POSIXProcessTestCase.test_pass_fds_inheritablec           	      C   s  t jddd}g }tdD ],}ttjtj}| tj| |	| qt
 \}}| tj| | tj| |d| tjtj|g|d |d |d d|d t|d	}W d    n1 s0    Y  d
d |dD }| |h dt|B d| d S )Nr  r  r  rc  r   r   T)r/   r0   r1   r/  r  r   c                 S   s   h | ]}t |qS r   )r'  )r  numr   r   r   	<setcomp>@  r   z@POSIXProcessTestCase.test_pass_fds_redirected.<locals>.<setcomp>r  >   r   r   rc  zoutput=)r   r  rM  r   rO  r  O_RDWRrl   r7   rN  r+  insertr   r2   rC   rD   r   r   rE   	frozenset)	r   r  r  r"  r  Zstdout_rZstdout_wr^   r  r   r   r   test_pass_fds_redirected+  s(    *z-POSIXProcessTestCase.test_pass_fds_redirectedc                 C   sJ   t tjd(}tjt||d}|  W d    n1 s<0    Y  d S )Nr+)r0   r/   r5   rO  r   r  r   r2   r   r   r   Zinoutr9   r   r   r   %test_stdout_stdin_are_single_inout_fdE  s
    z:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdc                 C   sJ   t tjd(}tjt||d}|  W d    n1 s<0    Y  d S )Nr  r   r  r  r   r   r   &test_stdout_stderr_are_single_inout_fdK  s
    z;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdc                 C   sJ   t tjd(}tjt||d}|  W d    n1 s<0    Y  d S )Nr  )r1   r/   r  r  r   r   r   %test_stderr_stdin_are_single_inout_fdQ  s
    z:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdc                 C   sR   t jddd}tjtj|gtjtjd}| \}}| d|j	d|
d  d S )Nzsigchild_ignore.pyr  r  r   r   z6sigchild_ignore.py exited non-zero with this error:
%srE  )r   r  r   r2   rC   rD   r3   r   rE   r   r   )r   Zsigchild_ignorer9   r0   r1   r   r   r   test_wait_when_sigchild_ignoredW  s    z4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc              	   C   s   t d}tjtjddgtjdd}|j}| |j	 z<| 
|dd | |||gg g dd  W |  n
|  0 d S )	Nr  r   z$import sys;sys.stdout.write("apple")r   )r0   r;   r  s   applg        )r   import_moduler   r2   rC   rD   r3   r0   rl   r7   rE   r   r\   r  r   )r   r  r9   r  r   r   r   test_select_unbufferedb  s    

 z+POSIXProcessTestCase.test_select_unbufferedc                 C   s   t jtjddgt jt jd}| |jj | |jj t	|}|j
}tdtf d }W d    n1 sn0    Y  tr| t j n| |dd t jD  d S )Nr   z import sys, time;time.sleep(0.2)r   r   c                 S   s   g | ]}t |qS r   idr  or   r   r   r    r   zEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)r   r2   rC   rD   r3   rl   r0   r7   r1   r%  pidr   check_warningsResourceWarningr   rd  r   r\   )r   r9   identr(  r   r   r   test_zombie_fast_process_dels  s    
"z1POSIXProcessTestCase.test_zombie_fast_process_delc              	   C   sd  t jtjddgt jt jd}| |jj | |jj t	|}|j
}tdtf d }t  W d    n1 sv0    Y  t|tj tr| t j n| |dd t jD  td | tD t jtt jt jd}W d    n1 s0    Y  W d    n1 s0    Y  | ttj|d trH| t j n| |d	d t jD  d S )
Nr   zimport time;time.sleep(3)r   r   c                 S   s   g | ]}t |qS r   r$  r&  r   r   r   r    r   zJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>r  r   c                 S   s   g | ]}t |qS r   r$  r&  r   r   r   r    r   )r   r2   rC   rD   r3   rl   r0   r7   r1   r%  r(  r   r)  r*  
gc_collectr   r  r  r  r   rd  r   r\   r  r  rM   rR  r   waitpidrv   )r   r9   r+  r(  r|  r   r   r   !test_leak_fast_process_del_killed  s:    
&
>z6POSIXProcessTestCase.test_leak_fast_process_del_killedc                    sx   t jddd}td | tj  tjtj	|gtj
d fddd}| \}}ttt|d	}|  | d S )
Nr  r  r  r   Tc                      s   t d S r  )r   r  r   r  r   r   rg    r   zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>)r0   r/  rh  r  )r   r  r   r  rl   r7   r   r2   rC   rD   r3   r   rP  r  r'  r   rv   )r   r  r9   r^   r  r  r   r0  r   test_close_fds_after_preexec  s    

z1POSIXProcessTestCase.test_close_fds_after_preexecc           	      C   s   dd l }t }zdd }t  ddgd dgfdgdd dgfdgdgddgfdgdgd dffD ]z\}}}}| tB}|||dd	||d
d
d
d
dddddddg dd
| W d    n1 s0    Y  | dt|j	 q`W |st
  n|st
  0 d S )Nr   c                   S   s   d S r   r   r   r   r   r   rg    r   z5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>r  s   exe   envs   argTr   r0  r   rc  r   r  Fztakes exactly)rn  ry  rz  r|  rM   r   r  rv   rj  rT   r{  )	r   rn  
gc_enabledfuncr*   Zexe_listr   env_listr   r   r   r   test_fork_exec  s2    "
z#POSIXProcessTestCase.test_fork_execc                 C   s   dd l }G dd d}t }zt  ddddd|d	|d
ffD ]}| jtd|dH}|dgdgd|d dgddddd	d
ddddd d d dd  W d    n1 s0    Y  | dt	|j
 qDW |st  n|st  0 d S )Nr   c                   @   s    e Zd ZdZdd Zdd ZdS )zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadIntTc                 S   s
   || _ d S r   )r  )r   r  r   r   r   r     s    zSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__c                 S   s   | j rd| _ | jS td S )NF)firstr  r   r   r   r   r   __int__  s    zRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)r$   r%   r&   r7  r   r8  r   r   r   r   BadInt  s   r9  )r0  rc  r   r  r`   )rj  r  )      *   l            )r`   r  )r2  r  r  rt  r   rc  zfds_to_keep={}r  s   falseTr2  r0  r   r  r  )rn  ry  rz  r|  rM   r   rG  r  r\   rj  rT   r{  )r   rn  r9  r3  r  rV   r   r   r   %test_fork_exec_sorted_fd_sanity_check  s>    

"
z:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc              	   C   sz   t t}|X tj|d*}t|j_|	  |j
  W d    n1 sN0    Y  W d    n1 sl0    Y  d S )Nr/   )r   r2   r   r   r  r  BrokenPipeErrorr7   r  r   Zassert_called_withr   r|  mock_proc_stdinr   r   r   ,test_communicate_BrokenPipeError_stdin_close  s
    
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec              	   C   s   t t}|f tj|d8}t|j_|	d |j
d |j
  W d    n1 s\0    Y  W d    n1 sz0    Y  d S )Nr/      stuff)r   r2   r   r   r  r  r>  rm   r  r   assert_called_once_withr7   r?  r   r   r   ,test_communicate_BrokenPipeError_stdin_write"  s    

zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writec              
   C   s   t jtjdgt jt jd}| tj|dd}tt	j
d8}t|j_| |j_|d |j  W d    n1 sz0    Y  W d    n1 s0    Y  W d    n1 s0    Y  d S )N-hr   r/   wbrB  )r   r2   rC   rD   r3   r   r  r  rO  r   r  r>  r4  r  r   return_valuer   rC  )r   r|  r@  Zdev_nullr   r   r   ,test_communicate_BrokenPipeError_stdin_flush,  s    

zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc              	   C   s   t jtjdgt jt jd}|\ tj|d.}t|j	_
|jdd |j	  W d    n1 sb0    Y  W d    n1 s0    Y  d S )NrE  r   r/   i  rK   )r   r2   rC   rD   r3   r   r  r  r>  r7   r  r   rC  r?  r   r   r   9test_communicate_BrokenPipeError_stdin_close_with_timeout;  s    zNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutN
W_STOPCODEzneed _testcapi.W_STOPCODEc                 C   st   t }t|}tj|jdd td}tj	d|j|fd |
 }W d    n1 sZ0    Y  | |d d S )Nr   r  r   r  )rG  )r   r   r2   r   wait_processr(  	_testcapirJ  r   r  r   rE   )r   r*   r|  statusr   r   r   r   test_stoppedG  s    

&z!POSIXProcessTestCase.test_stoppedc                 C   st   t t}tj|jdd | |j t	d}|
tj W d    n1 sR0    Y  |  | |j d S )Nr   rK  zos.kill)r   r2   r   r   rM  r(  rd  r   r   r  r  r  r  Zassert_not_calledr  )r   r|  Z	mock_killr   r   r   test_send_signal_raceX  s    
*z*POSIXProcessTestCase.test_send_signal_racec                 C   sn   t tjddg}|js"|  qtjj|ddd d" d |_|	t
j W d    n1 s`0    Y  d S )Nr   zexit(1)re  c                   S   s   d S r   r   r   r   r   r   rg  w  r   z=POSIXProcessTestCase.test_send_signal_race2.<locals>.<lambda>)new)r   r2   rC   rD   r   re  r   r  r  r  r  r  r8   r   r   r   test_send_signal_race2n  s    
z+POSIXProcessTestCase.test_send_signal_race2c                 C   sF   t jtjddgt jd}z|jdd W d S  t jy>   Y q0 qd S )Nr   z+import os, time; os.close(1), time.sleep(2)r~   rJ   rK   )r   r2   rC   rD   r3   r   rN   r   r|  r   r   r   1test_communicate_repeated_call_after_stdout_close{  s    
zFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)nr$   r%   r&   r   r  r	  r
  r  r   r2   r  r   r  r  r  r  r  r   r   r  r#  r(  r  r  r<  r?  rG  rH  rR  rS  r   rZ  r\  r`  rb  rd  rj  ro  ru  rv  r}  rC   r  r  r  r   r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rV  st_devr  r   Zrequires_mac_verr  r  r  r  r  r   r!  r#  r,  r/  r1  cpython_onlyr6  r=  rA  rD  rH  rI  rN  rP  rQ  rS  rU  __classcell__r   r   r  r   r  q  s   



3

)

0


%




-0,)0
P

!+
'
)	

r  zWindows specific testsc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-S ).Win32ProcessTestCasec                 C   s.   d}d}t  }||_||_t jt|d d S )Nr   r   r  )r   STARTUPINFOdwFlagswShowWindowrB   r   )r   STARTF_USESHOWWINDOWSW_MAXIMIZEr  r   r   r   test_startupinfo  s    z%Win32ProcessTestCase.test_startupinfoc                 C   s(   d}d}t j||d}t jt|d d S )Nr   r   )r[  r\  r  )r   rZ  rB   r   )r   ZSTARTF_USERSHOWWINDOWr^  r  r   r   r   test_startupinfo_keywords  s    z.Win32ProcessTestCase.test_startupinfo_keywordsc              
   C   s   t  }t j|_t j|_tdD ]}t}tt	j
d^}t j||t j|d}| |  W d    n1 sl0    Y  | |jd W d    n1 s0    Y  | |jt j | |j | |j | |j | |jt j | |jdg i q d S )Nrc  r  )r0   r1   r  r   handle_list)r   rZ  r]  r[  ZSW_HIDEr\  rM  r   rO  r   r  r2   rd   r   rE   r   rd  Z	hStdInputZ
hStdOutputZ	hStdErrorlpAttributeList)r   r  r"  r  Znullr|  r   r   r   test_startupinfo_copy  s,    &,z*Win32ProcessTestCase.test_startupinfo_copyc                 C   s(   d}t jd tjt jd |d d S )N   z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)"r  )rC   r1   rm   r   rB   rD   )r   ZCREATE_NEW_CONSOLEr   r   r   test_creationflags  s    z'Win32ProcessTestCase.test_creationflagsc                 C   s$   | j ttjtjddgdd d d S )Nr   r?   c                   S   s   dS r  r   r   r   r   r   rg    r   z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>rm  r  r   r   r   r   r     s    
z&Win32ProcessTestCase.test_invalid_argsc                 C   sN   G dd dt }| t  tjt| d W d    n1 s@0    Y  d S )Nc                   @   s   e Zd ZdZdS )z4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)r$   r%   r&   keysr   r   r   r   BadEnv  s   rg  r   )dictrM   r   r   r2   r   )r   rg  r   r   r   test_issue31471  s    z$Win32ProcessTestCase.test_issue31471c                 C   s&   t jtjddgdd}| |d d S )Nr   r?   T)r/  r@   rA   rF   r   r   r   r    s    
z#Win32ProcessTestCase.test_close_fdsc           
      C   s  dd l }t }| tj|d  | tj|d  g }|D ] }t|d ||| q<tj	t
jdd|d gtjdd}| \}}| |jd t|  tj	t
jdd|d gtjtjdd}| \}}| |jd | d	| g }t }	d
|i|	_tj	t
jdd|d gtjtj|	dd}| \}}| |jd | d	| tdtfn t }	d
|d d  i|	_tj	t
jdd|d gtjtj|	dd}| \}}| |jd W d    n1 s0    Y  d S )Nr   r   Tr   z2import msvcrt; print(msvcrt.open_osfhandle({}, 0))Fr  )r0   r1   r/  s   OSErrorra  )r0   r1   r  r/  z.*overriding close_fds)ry  r   r+  rl   r7   r
  rN  Zget_osfhandler   r2   rC   rD   rG  r3   r   rE   r   r'  r  r\   rZ  rb  r   r)  rv  )
r   ry  r  rW  r  r9   r0   r1   ra  r  r   r   r   test_close_fds_with_stdio  s^    





z.Win32ProcessTestCase.test_close_fds_with_stdioc                 C   s    t  }i |_t jt|d d S )Nr  r   rZ  rb  rB   r   r   r  r   r   r   test_empty_attribute_list  s
    z.Win32ProcessTestCase.test_empty_attribute_listc                 C   s$   t  }dg i|_t jt|d d S )Nra  r  rk  rl  r   r   r   test_empty_handle_list  s
    
z+Win32ProcessTestCase.test_empty_handle_listc                 C   sb   t j }d|d< tjdgdtj|d}|" | d|j  W d    n1 sT0    Y  d S Nphysalisr   rP  r   r  s   physalis	r   r   r   r   r2   r3   r\   r0   r   r  r   r   r   r     s    

z(Win32ProcessTestCase.test_shell_sequencec                 C   s`   t j }d|d< tjddtj|d}|" | d|j  W d    n1 sR0    Y  d S ro  rq  r  r   r   r   r  *  s    
z&Win32ProcessTestCase.test_shell_stringc              	   C   sn   dD ]d}t j }d|d< tjddtj||d}|$ | d|j | W d    q1 s^0    Y  qd S )N)ansiZoemrp  r   rP  r   )r   r0   r   r>  rq  )r   encr   r9   r   r   r   test_shell_encodings4  s    
z)Win32ProcessTestCase.test_shell_encodingsc                 C   s    t tjd }| |d d S )Nz -c "import sys; sys.exit(47)"r@   rA   rF   r   r   r   r  @  s    z%Win32ProcessTestCase.test_call_stringc                 G   s   t jtjddgt jt jt jd}|J |jd t|||  | \}}| 	|d |
 }W d    n1 st0    Y  | |d d S )Nr   zif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             time.sleep(30)
                             r.   r   r   r   )r   r2   rC   rD   r3   r0   r   r  r   rE   r   r"  )r   r  r*   r9   r"  r1   r   r   r   r   r  F  s    	&z"Win32ProcessTestCase._kill_processc                 G   s   t jtjddgt jt jt jd}|T |jd td t	|||  |
 \}}| |d | }W d    n1 s~0    Y  | |d d S )Nr   zif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             r.   r   r   r<  )r   r2   rC   rD   r3   r0   r   r  r  r  r   rE   r   )r   r  r*   r9   r"  r1   rG   r   r   r   r  [  s    	
&z'Win32ProcessTestCase._kill_dead_processc                 C   s   |  dtj d S r  )r  r  r  r   r   r   r   r  r  s    z%Win32ProcessTestCase.test_send_signalc                 C   s   |  d d S r  r  r   r   r   r   r  u  s    zWin32ProcessTestCase.test_killc                 C   s   |  d d S r  ru  r   r   r   r   r  x  s    z#Win32ProcessTestCase.test_terminatec                 C   s   |  dtj d S r  )r  r  r  r   r   r   r   r  {  s    z*Win32ProcessTestCase.test_send_signal_deadc                 C   s   |  d d S r  r  r   r   r   r   r  ~  s    z#Win32ProcessTestCase.test_kill_deadc                 C   s   |  d d S r  r  r   r   r   r   r    s    z(Win32ProcessTestCase.test_terminate_deadN)r$   r%   r&   r_  r`  rc  re  r   r   rW  ri  r  rj  rm  rn  r  r  rt  r  r  r  r  r  r  r  r  r  r   r   r   r   rY    s.   
1

rY  c                   @   s^   e Zd ZG dd dejZejejddd Z	dd Z
dd	 Zd
d Zdd Zdd ZdS )	MiscTestsc                       s    e Zd Zg Z fddZ  ZS )zMiscTests.RecordingPopenc                    s"   t  j|i | | j|  d S r   )r  r   instances_createdrN  r)   r  r   r   r     s    z!MiscTests.RecordingPopen.__init__)r$   r%   r&   rw  r   rX  r   r   r  r   RecordingPopen  s   rx  _communicatec              
   K   s  t |_zjtjtjd}t |_tjtd| jX | t . |t	j
ddgfdtji| W d    n1 sv0    Y  W d    n1 s0    Y  |jdd  D ]"}| |tjd dd|j  qg }|jD ]}|tjd	dkr|| q| j|jd
|jd | jt|d|jd W d    n1 s:0    Y  W | jj }|  |  | g | jj n.| jj }|  |  | g | jj 0 d S )N_waitr2   r   zLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')r0   r   rK   z.no open-ended wait() after the first allowed: g      ?rc  r  )KeyboardInterruptr  r   r  r  r   r2   rx  rM   rC   rD   r   Zcall_args_listr"  rB   rN  ZassertLessEqualZ
call_countrE   r!  rw  rU  r  r   )r   ZpopenerZmock__communicater+   Z
mock__waitrB   Zsigint_callsr  r   r   r   _test_keyboardinterrupt_no_kill  sP    
B

(z)MiscTests._test_keyboardinterrupt_no_killc                 C   s   | j tjdd d S NgT㥛 @rK   )r|  r   rB   r   r   r   r   #test_call_keyboardinterrupt_no_kill  s    z-MiscTests.test_call_keyboardinterrupt_no_killc                 C   s   | j tjdd d S r}  )r|  r   r   r   r   r   r   "test_run_keyboardinterrupt_no_kill  s    z,MiscTests.test_run_keyboardinterrupt_no_killc                 C   s   dd }|  | d S )Nc                  _   s8   t j| i |}tW d    n1 s*0    Y  d S r   )r   r2   r{  )r*   r+   Zunused_processr   r   r   popen_via_context_manager  s    z[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager)r|  )r   r  r   r   r   .test_context_manager_keyboardinterrupt_no_kill  s    z8MiscTests.test_context_manager_keyboardinterrupt_no_killc              	   C   s   |  tdd |  tdd d }zRt }tj|d}tt	rLdnd| \}}| 
|d W |d urt| n|d urt| 0 d S )Nz
echo xyzzyxyzzy)r   r  Zfooztype zcat r   )rE   r   	getoutputgetstatusoutputrj   rL  r   r   r   r   r"  rmdir)r   dirrY  rO  r^   r   r   r   test_getoutput  s     zMiscTests.test_getoutputc                 C   sn   h d}t tj}t  }dd l}tj D ].\}}|dr>q*t||jfrNq*|	| q*| 
|||  d S )N>   ra  r  r4  Handler   r"  )rP  r   __all__r  __dict__itemsr	  r8  
ModuleTyper	  rE   )r   Zintentionally_excludedZexportedZpossible_exportsr  rY  r  r   r   r   test__all__  s    

zMiscTests.test__all__N)r$   r%   r&   r   r2   rx  r   r  r  r|  r~  r  r  r  r  r   r   r   r   rv    s   
+rv  PollSelectorz!Test needs selectors.PollSelectorc                   @   s   e Zd Zdd Zdd ZdS )ProcessTestCaseNoPollc                 C   s   t j| _tjt _t|  d S r   )r   _PopenSelectororig_selector	selectorsSelectSelectorr-   r   r   r   r   r   r     s    zProcessTestCaseNoPoll.setUpc                 C   s   | j t_t|  d S r   )r  r   r  r-   r"   r   r   r   r   r"     s    zProcessTestCaseNoPoll.tearDownNr#   r   r   r   r   r    s   r  zWindows-specific testsc                       sP   e Zd Z fddZ fddZdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )CommandsWithSpacesc                    s>   t    tdd\}}| | _t|d t| d S )Nz.pyzte stsV   import sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	r  r   rj   r  r^  r  r   rm   r7   )r   r  r  r  r   r   r     s
    

zCommandsWithSpaces.setUpc                    s   t | j t   d S r   )r   r  r  r  r"   r   r  r   r   r"     s    zCommandsWithSpaces.tearDownc                 O   s`   t j|d< t j|i |}|. | |j dd| j  W d    n1 sR0    Y  d S )Nr0   mbcsz2 [%r, 'ab cd'])r   r3   r2   rE   r0   r   r   r  )r   r*   r+   r9   r   r   r   with_spaces  s    
zCommandsWithSpaces.with_spacesc                 C   s    | j dtj| jdf dd d S )N"%s" "%s" "%s"ab cdr   r  r  rC   rD   r  r   r   r   r   test_shell_string_with_spaces  s
    z0CommandsWithSpaces.test_shell_string_with_spacesc                 C   s   | j tj| jdgdd d S )Nr  r   r  r  r   r   r   r   test_shell_sequence_with_spaces  s    z2CommandsWithSpaces.test_shell_sequence_with_spacesc                 C   s   |  dtj| jdf  d S )Nr  r  r  r   r   r   r   test_noshell_string_with_spaces  s    z2CommandsWithSpaces.test_noshell_string_with_spacesc                 C   s   |  tj| jdg d S )Nr  r  r   r   r   r   !test_noshell_sequence_with_spaces  s    z4CommandsWithSpaces.test_noshell_sequence_with_spaces)r$   r%   r&   r   r"   r  r  r  r  r  rX  r   r   r  r   r    s   		r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ContextManagerTestsc                 C   s   t jtjddgt jt jd4}| |j d | |j d W d    n1 sV0    Y  | 	|jj
 | 	|jj
 d S )Nr   zAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');r   s   stdouts   stderr)r   r2   rC   rD   r3   rE   r0   r   r1   r%  r&  rT  r   r   r   	test_pipe#  s    
0zContextManagerTests.test_pipec                 C   sD   t tjddg}W d    n1 s(0    Y  | |jd d S )Nr   zimport sys; sys.exit(100)d   )r   r2   rC   rD   rE   r   rT  r   r   r   r  0  s    
z#ContextManagerTests.test_returncodec                 C   sT   t jtjddgt jd(}|d | |jd W d    n1 sF0    Y  d S )Nr   z2import sys;sys.exit(sys.stdin.read() == 'context')rh   s   contextr   r   rT  r   r   r   r  7  s    

z*ContextManagerTests.test_communicate_stdinc              	   C   sb   |  tD tjttjtjd}W d    n1 s60    Y  W d    n1 sT0    Y  d S )Nr   )rM   r   r   r2   r   r3   rT  r   r   r   r   ?  s    z%ContextManagerTests.test_invalid_argsc                 C   sr   t jtt jtjd d}| }|jdtj  | 	|j
 | t|jd d d  | |j
d | |jj d S )Nrc  )r/   r;   r  r   )r   r2   r   r3   r   r,  	__enter__r/   rm   rd  r   rM   rR  __exit__rE   r%  r&  rT  r   r   r   test_broken_pipe_cleanupF  s    z,ContextManagerTests.test_broken_pipe_cleanupN)r$   r%   r&   r  r  r  r   r  r   r   r   r   r  !  s
   r  __main__)?r  r   r  r   r   rC   r  r5   r  r   rS  rj   r  r  r  r  r  r  r
   r  ry  r9  rN  r  Ztest.supportr   rN  r{  r4  r  ZPGOr  r  r   r3  r   r   NotADirectoryErrorr7  r   rD   r   r   ZTestCaser   	Exceptionr'   r2   r(   r-   r  r  r  r  r  rY  rv  r  r  r  r  r$   mainr   r   r   r   <module>   s   






          Y 0
            !
 }d
+6
