
    daf݈                       d dl Z d dl mZ d dlmZ d dlmZ d dlmZ d dlm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mZ 	 d dl Z 	 d dl"Z"	 d dl#Z#	 d dl$Z$ejJ                  r e jL                  d
      ejN                  s e jL                  d      ejP                  dk(  Z)e)rdZ*ndZ*dZ+e,e-e.fZ/ej`                  ddfa1d Z2 G d de jf                        Z4 G d de5      Z6 G d dejn                        Z8 G d de4      Z9 G d de4      Z:d Z; e jx                  e)d       G d d e4             Z= e j|                  e)d!       G d" d#e4             Z? G d$ d%e jf                        Z@ e j|                   eAed&      d'       G d( d)e9             ZB e j|                  e)d*       G d+ d,e4             ZC G d- d.e4      ZDeEd/k(  r e j                          yy# e!$ r dZ Y w xY w# e!$ r dZ"Y w xY w# e!$ r dZ#Y w xY w#  dZ$Y xY w)0    N)mock)support)check_sanitizer)import_helper)	os_helper)warnings_helper)assert_python_ok)FakePathztest is not helpful for PGOztest module requires subprocesswin32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY); )nonexisting_i_hope-cpassc                      t        j                  d      } | y t        j                  | t        j                        r(t        j                  | g      j                  dk(  r| fay y y )Ntruer   )	shutilwhichosaccessX_OK
subprocessrun
returncodeZERO_RETURN_CMD)
shell_trues    //root/Python-3.12.4/Lib/test/test_subprocess.pysetUpModuler   J   sU    f%J
		*bgg&
|$//14%- 	5 	'    c                       e Zd Zd Zd Zy)BaseTestCasec                 ,    t        j                          y N)r   reap_childrenselfs    r   setUpzBaseTestCase.setUpU   s     	r   c                 
   t         sYt        j                  D ]  }|j                           t        j                          | j                  t        j                  d       | j                          t        j                          y )Nzsubprocess._active not empty)		mswindowsr   _activewait_cleanupassertFalse
doCleanupsr   r#   )r%   insts     r   tearDownzBaseTestCase.tearDownZ   sa    "** 		!""$B 	r   N__name__
__module____qualname__r&   r/    r   r   r    r    T   s     

 r   r    c                       e Zd Zy)PopenTestExceptionN)r1   r2   r3   r4   r   r   r6   r6   g   s    r   r6   c                       e Zd ZdZd Zy)PopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when
    _execute_child fails.
    c                     t        d      )NzForced Exception for Test)r6   )r%   argskwargss      r   _execute_childz&PopenExecuteChildRaises._execute_childo   s     !<==r   N)r1   r2   r3   __doc__r<   r4   r   r   r8   r8   k   s    >r   r8   c                   x	   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z ej*                  d      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z  e!jD                  e#d      d        Z$ e!jD                  e#d      d         Z% e!jD                  e#d      d!        Z&d" Z'd# Z(d$ Z)d% Z*d& Z+d' Z, e!jD                  e#d(      d)        Z- e!jD                  e#d(      d*        Z.d+ Z/ e!jD                  e0jb                  e0jd                  k7  d,      d-        Z3 e!jD                  e0jb                  e0jd                  k7  d,       e!jD                   e4jj                         d.      d/               Z6d0 Z7d1 Z8d2 Z9d3 Z:d4 Z;d5 Z<d6 Z=d7 Z>d8 Z?d9 Z@d: ZAd; ZBd< ZCd= ZDd> ZEd? ZF e!j                  eHxr	  eIeHd@      dA      dB        ZJ e!j                  eHxr	  eIeHd@      dA      dC        ZKdD ZL e!j                  e0j                  dEk(  dF      dG        ZN e!jD                  e0j                  dEk(  dH       e!jD                   e4j                  dI      dJk(  dK       e!jD                   ePdLM      dN      dO                      ZQ e!jD                   e4j                  dI      dJk(  dP       e!jD                   ePdLM      dN      dQ               ZRdR ZSdS ZT e!j                  e0j                  dEk(  dF      dT        ZUdU ZVdV ZWdW ZXdX ZYdY ZZdZ Z[d[ Z\d\ Z]d] Z^d^ Z_d_ Z`d` Zada Zbdb Zcdc Zddd Zede Zfdf Zgdg Zhdh Zidi Zjdj Zkdk Zldl Zmdm Zndn Zodo Zp ej*                  dp      dq        Zqdr Zrds Zsdt Ztdu Zudv Zvdw Zwdx Zxdy Zy e!j                   eIezdz      d{       e!j                   eIe{d|      d}       e!j                   eIe{d~      d      d                      Z| e!j                  e{j                  j                  d e{j                         z        d      d        Z e!jD                  e#d      d        Z e!jD                  e#d      d        Zd Z e!jD                   e4j                  d       d       ej
                  d      d               Z e!j                   eIed      d      d        Zy)ProcessTestCasec                    t        j                  t        t         j                  t         j                  t         j                        }	 | j	                  |j
                  t        j                         | j	                  |j                  t        j                         | j	                  |j                  t        j                         |j
                  j                          |j                  j                          |j                  j                          |j                          y # |j
                  j                          |j                  j                          |j                  j                          |j                          w xY w)Nstdinstdoutstderr)r   Popenr   PIPEassertIsInstancerB   ioBufferedIOBaserC   rD   closer*   r%   ps     r   test_io_buffered_by_defaultz+ProcessTestCase.test_io_buffered_by_defaultu   s    _#-??:??$.OO5	!!!''2+<+<=!!!((B,=,=>!!!((B,=,=>GGMMOHHNNHHNNFFH GGMMOHHNNHHNNFFHs   	A>D& &A Fc                    t        j                  t        t         j                  t         j                  t         j                  d      }	 | j	                  |j
                  t        j                         | j	                  |j                  t        j                         | j	                  |j                  t        j                         |j
                  j                          |j                  j                          |j                  j                          |j                          y # |j
                  j                          |j                  j                          |j                  j                          |j                          w xY w)Nr   )rB   rC   rD   bufsize)r   rE   r   rF   rG   rB   rH   	RawIOBaserC   rD   rJ   r*   rK   s     r   test_io_unbuffered_worksz(ProcessTestCase.test_io_unbuffered_works   s    _#-??:??$.OOQ@	!!!''2<<8!!!((BLL9!!!((BLL9GGMMOHHNNHHNNFFH GGMMOHHNNHHNNFFHs   
A>D' 'A Fc                 t    t        j                  t        j                  ddg      }| j	                  |d       y Nr   import sys; sys.exit(47)/   r   callsys
executableassertEqualr%   rcs     r   test_call_seqzProcessTestCase.test_call_seq   s0    __cnnd8: ;R r   c                     | j                  t        j                  t        j                  t        j
                  ddgd       y )Nr   while True: pass皙?timeout)assertRaisesr   TimeoutExpiredrW   rX   rY   r$   s    r   test_call_timeoutz!ProcessTestCase.test_call_timeout   s7    
 	*33Z__>>41CD"% 	 	'r   c                 Z    t        j                  t              }| j                  |d       y Nr   )r   
check_callr   rZ   r[   s     r   test_check_call_zeroz$ProcessTestCase.test_check_call_zero   s"    ""?3Qr   c                    | j                  t        j                        5 }t        j                  t        j
                  ddg       d d d        | j                  j                  j                  d       y # 1 sw Y   0xY wrS   )	rc   r   CalledProcessErrorrh   rX   rY   rZ   	exceptionr   r%   cs     r   test_check_call_nonzeroz'ProcessTestCase.test_check_call_nonzero   sl    z<<= 	@!!3>>4#=#? @	@ 	//4	@ 	@   'A66A?c                 |   t        j                  t        j                  ddg      }| j	                  d|       | j                  t        d      5  t        j                  g d        d d d        | j                  t        d      5  t        j                  g d       d d d        y # 1 sw Y   @xY w# 1 sw Y   y xY w)	Nr   print('BDFL')   BDFLz2stdout argument not allowed, it will be overriddenrC   z1check argument not allowed, it will be overriddenFcheck)r   check_outputrX   rY   assertInassertRaisesRegex
ValueErrorr%   outputs     r   test_check_outputz!ProcessTestCase.test_check_output   s    ((79gv&##JDF 	5##Bt4	5 ##JCE 	5##Be4	5 	5		5 	5	5 	5s   B&B2&B/2B;c                    | j                  t        j                        5 }t        j                  t        j
                  ddg       d d d        | j                  j                  j                  d       y # 1 sw Y   0xY w)Nr   zimport sys; sys.exit(5)   )	rc   r   rk   rw   rX   rY   rZ   rl   r   rm   s     r   test_check_output_nonzeroz)ProcessTestCase.test_check_output_nonzero   sk    z<<= 	G##^^T+DEG	G 	//3	G 	Grp   c                     t        j                  t        j                  ddgt         j                        }| j                  d|       y )Nr   $import sys; sys.stderr.write('BDFL')rD   rs   )r   rw   rX   rY   STDOUTrx   r{   s     r   test_check_output_stderrz(ProcessTestCase.test_check_output_stderr   s:    (('MN!((* 	gv&r   c                    t        j                         }| j                  |j                         |j	                  d       |j                  d       t        j                  t        j                  ddg|      }| j                  d|       y )N   pearr   r   6import sys; sys.stdout.write(sys.stdin.read().upper())rB      PEAR)tempfileTemporaryFile
addCleanuprJ   writeseekr   rw   rX   rY   rx   )r%   tfr|   s      r   test_check_output_stdin_argz+ProcessTestCase.test_check_output_stdin_arg   sl    ##%!


((IK 	gv&r   c                 x    t        j                  t        j                  ddgd      }| j	                  d|       y )Nr   r   r   inputr   r   rw   rX   rY   rx   r{   s     r   test_check_output_input_argz+ProcessTestCase.test_check_output_input_arg   s7    ((IK 	gv&r   c                 x    t        j                  t        j                  ddgd      }| j	                  d|       y)z<input=None has a legacy meaning of input='' on check_output.r   3import sys; print('XX' if sys.stdin.read() else '')Nr   s   XXr   rw   rX   rY   assertNotInr{   s     r   test_check_output_input_nonez,ProcessTestCase.test_check_output_input_none   s9    ((FH 	'r   c                 z    t        j                  t        j                  ddgd d      }| j	                  d|       y )Nr   r   T)r   textXXr   r{   s     r   !test_check_output_input_none_textz1ProcessTestCase.test_check_output_input_none_text   s;    ((FH' 	v&r   c                 z    t        j                  t        j                  ddgd d      }| j	                  d|       y )Nr   r   T)r   universal_newlinesr   r   r{   s     r   /test_check_output_input_none_universal_newlinesz?ProcessTestCase.test_check_output_input_none_universal_newlines   s;    ((FHt5 	v&r   c                 |    t        j                  t        j                  ddgd dd      }| j	                  d|       y )Nr   zprint('foo')utf-8ignore)r   encodingerrorsfoor   r{   s     r   ,test_check_output_input_none_encoding_errorsz<ProcessTestCase.test_check_output_input_none_encoding_errors   s7    ((~6WX? 	eV$r   c                 8   | j                  t              5 }t        j                  t        j
                  ddgt        j                        }| j                  d       d d d        | j                  dj                  j                  d          y # 1 sw Y   3xY w)Nr   print('will not be run')rt   z-Expected ValueError when stdout arg supplied.rC   r   )rc   rz   r   rw   rX   rY   rC   failrx   rl   r:   r%   rn   r|   s      r   test_check_output_stdout_argz,ProcessTestCase.test_check_output_stdout_arg   s    z* 	Ga,,^^T+EF::'F IIEF		G
 	h 0 0 34	G 	Gs   ABBc                    t        j                         }| j                  |j                         |j	                  d       |j                  d       | j                  t              5 }t        j                  t        j                  ddg|d      }| j                  d       d d d        | j                  dj                  j                  d          | j                  d	|j                  j                  d          y # 1 sw Y   \xY w)
Nr   r   r   r      harerB   r   7Expected ValueError when stdin and input args supplied.rB   r   )r   r   r   rJ   r   r   rc   rz   r   rw   rX   rY   r   rx   rl   r:   r%   r   rn   r|   s       r   &test_check_output_stdin_with_input_argz6ProcessTestCase.test_check_output_stdin_with_input_arg  s    ##%!


z* 	Qa,,^^T+EFG-F IIOP		Q
 	gq{{//23gq{{//23	Q 	Qs   ';C==Dwalltimec                 *   | j                  t        j                        5 }t        j                  t        j
                  ddgd      }| j                  d       d d d        | j                  j                  j                  d       y # 1 sw Y   0xY w)Nr   Mimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)   ra   zExpected TimeoutExpired.rs   )
rc   r   rd   rw   rX   rY   r   rZ   rl   r|   r   s      r   test_check_output_timeoutz)ProcessTestCase.test_check_output_timeout  s     z889 
	2Q,,^^T() F II01
	2 	++W5
	2 
	2s   :B		Bc                     t         j                  j                         }d|d<   t        j                  t
        j                  ddg|      }| j                  |d       y )NbananaFRUITr   z5import sys, os;sys.exit(os.getenv("FRUIT")=="banana")env   )r   environcopyr   rW   rX   rY   rZ   )r%   newenvr\   s      r   test_call_kwargsz ProcessTestCase.test_call_kwargs  sT    ""w__cnndGH "() 	Qr   c                    t        j                         5 }| j                  t        t        j
                  d       t        j
                  j                  j                  j                  }dg|dz   z  } | j                  t        t        j
                  g|  d d d        | j                  j                         d       y # 1 sw Y   *xY w)Nr   )invalid_arg_namer   r   )r   captured_stderrrc   	TypeErrorr   rE   __init____code__co_argcountrZ   getvalue)r%   sargcounttoo_many_argss       r   test_invalid_argsz!ProcessTestCase.test_invalid_args)  s     $$& 	K!i)9)9AN!''0099EEHC8a<0MDi)9)9JMJ		K
 	r*	K 	Ks   BCCc                 z   t        j                  t        j                  ddgt         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         |j                          | j                  |j                  d        y )Nr   print("banana")rC   rD   )r   rE   rX   rY   rF   r   rC   rJ   rD   r*   rZ   rB   rK   s     r   test_stdin_nonezProcessTestCase.test_stdin_none3  ss    cnnd4EF *
I''	$'r   c                    d}t        j                  t        j                  d|gt         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         |j                         \  }}| j                  |j                  d|       | j                  |j                         d       y )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   rE   rX   rY   rF   r   rC   rJ   rD   communicaterZ   r   rstripr%   coderL   outerrs        r   test_stdout_nonez ProcessTestCase.test_stdout_none<  s    5 cnndD9$.OOJOOM''==?Sq#.':;r   c                 z   t        j                  t        j                  ddgt         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         |j                          | j                  |j                  d        y )Nr   r   rB   rC   )r   rE   rX   rY   rF   r   rC   rJ   rB   r*   rZ   rD   rK   s     r   test_stderr_nonez ProcessTestCase.test_stderr_noneS  ss    cnnd4EF)zH'&	4(r   c                     |dgz   }t        j                  |fi |}|j                          | j                  d|j                         y NrT   rU   )r   rE   r*   rZ   r   )r%   pre_argsr;   r:   rL   s        r   _assert_pythonzProcessTestCase._assert_python\  sD     566T,V,	Q\\*r   c                     t         j                  j                  t         j                  j                  t        j
                        d      }| j                  |dgt        j
                         y Ndoesnotexistr   rY   )r   pathjoindirnamerX   rY   r   r%   r   s     r   test_executablezProcessTestCase.test_executabled  sH     ww||BGGOOCNN$C$24\40S^^Lr   c                    t         j                  j                  t         j                  j                  t        j
                        d      }| j                  |dgt        j                  t        j
                               y r   )r   r   r   r   rX   rY   r   fsencoder   s     r   test_bytes_executablez%ProcessTestCase.test_bytes_executableo  sU    ww||BGGOOCNN$C$24\40'){{3>>'B 	 	Dr   c                     t         j                  j                  t         j                  j                  t        j
                        d      }| j                  |dgt        t        j
                               y r   )r   r   r   r   rX   rY   r   r
   r   s     r   test_pathlike_executablez(ProcessTestCase.test_pathlike_executableu  sQ    ww||BGGOOCNN$C$24\40'/'? 	 	Ar   c                     t         j                  dg}| j                  |       | j                  t        | j                  |t
        d          y )Nr   r   r   )rX   rY   r   rc   NONEXISTING_ERRORSNONEXISTING_CMD)r%   r   s     r    test_executable_takes_precedencez0ProcessTestCase.test_executable_takes_precedence{  sI     NND)H%,--x%4Q%7 	 	9r   z"executable argument replaces shellc                 H    | j                  g t        j                  d       y NT)rY   shell)r   rX   rY   r$   s    r   test_executable_replaces_shellz.ProcessTestCase.test_executable_replaces_shell  s     	B3>>Fr   c                 n    | j                  g t        j                  t        j                        d       y r   )r   r   r   rX   rY   r$   s    r   $test_bytes_executable_replaces_shellz4ProcessTestCase.test_bytes_executable_replaces_shell  s)    B2;;s~~+F"& 	 	(r   c                 Z    | j                  g t        t        j                        d       y r   )r   r
   rX   rY   r$   s    r   'test_pathlike_executable_replaces_shellz7ProcessTestCase.test_pathlike_executable_replaces_shell  s%    B8CNN+C"& 	 	(r   c                     t        j                  |      5  t        j                         cd d d        S # 1 sw Y   y xY wr"   )r   
change_cwdr   getcwd)r%   cwds     r   _normalize_cwdzProcessTestCase._normalize_cwd  s0     !!#& 	99;	 	 	s   4=c                     t         j                  j                  t        j                        }t         j                  j                  |      S r"   )r   r   realpathrX   rY   split)r%   python_paths     r   _split_python_pathz"ProcessTestCase._split_python_path  s-    gg&&s~~6ww}}[))r   c                    t        j                  |ddgfdt         j                  i|}| j                  |j                  j
                         |j                          | j                  d|j                         t        j                  j                  }| j                   ||       ||j                  j                         j                                      y )Nr   zcimport os, sys; buf = sys.stdout.buffer; buf.write(os.getcwd().encode()); buf.flush(); sys.exit(47)rC   rU   )r   rE   rF   r   rC   rJ   r*   rZ   r   r   r   normcasereaddecode)r%   expected_cwd
python_argr;   rL   r	  s         r   _assert_cwdzProcessTestCase._assert_cwd  s     j$-. ( &0__( !'( 	'	Q\\*77##,/!!((--/"8"8":;	=r   c                     t        j                         }| j                  |      }| j                  |t        j
                  |       y Nr  )r   
gettempdirr  r  rX   rY   r%   temp_dirs     r   test_cwdzProcessTestCase.test_cwd  s9    &&(&&x03>>x@r   c                     t        j                         }| j                  |      }| j                  |t        j
                  t        j                  |             y r  )r   r  r  r  rX   rY   r   r   r  s     r   test_cwd_with_bytesz#ProcessTestCase.test_cwd_with_bytes  sB    &&(&&x03>>r{{87LMr   c                     t        j                         }| j                  |      }| j                  |t        j
                  t        |             y r  )r   r  r  r  rX   rY   r
   r  s     r   test_cwd_with_pathlikez&ProcessTestCase.test_cwd_with_pathlike  s>    &&(&&x03>>x7IJr   z"pending resolution of issue #15533c                    | j                         \  }}t        j                  j                  t        j                  |      }t        j                         5 }| j                  t        t        j                  |g       | j                  t        t        j                  |g|       | j                  |      }| j                  |||       d d d        y # 1 sw Y   y xY wr  r  r   r   r   curdirr   temp_cwdrc   FileNotFoundErrorr   rE   r  r  )r%   
python_dirpython_base
rel_python	wrong_dirs        r   test_cwd_with_relative_argz*ProcessTestCase.test_cwd_with_relative_arg  s     #'"9"9";
KWW\\"))[9
! 	EY /1A1A)l,/1A1A)l	  ;,,Z8JZD	E 	E 	Es   A4CCc                    | j                         \  }}t        j                  j                  t        j                  |      }d}t        j                         5 }| j                  t        t        j                  |g|       | j                  t        t        j                  |g||       | j                  |      }| j                  ||||       d d d        y # 1 sw Y   y xY w)Nsomethingyoudonthaver   rY   r  r  )r%   r  r   r!  doesntexistr"  s         r   !test_cwd_with_relative_executablez1ProcessTestCase.test_cwd_with_relative_executable  s     #'"9"9";
KWW\\"))[9
,! 
	-Y /1A1A*m
  D/1A1A*m
"+  - ,,Z8JZ!+  -
	- 
	- 
	-s   A8CC"c                    | j                         \  }}t        j                  j                  ||      }t        j                  j                  t        j                  |      }t        j                         5 }| j                  t        t        j                  |g|       | j                  |      }| j                  |||       d d d        y # 1 sw Y   y xY wr  )r  r   r   r   r  r   r  rc   r  r   rE   r  r  )r%   r  r   
abs_pythonr!  r"  s         r   test_cwd_with_absolute_argz*ProcessTestCase.test_cwd_with_absolute_arg  s     #'"9"9";
KWW\\*k:
WW\\"))[9
! 	CY /1A1A)l	  ;++I6IY
	B	C 	C 	Cs   6ACCzTest is not venv-compatiblec                     | j                         \  }}| j                  |      }| j                  |dt        j                  |       y )Nr%  r&  )r  r  r  rX   rY   )r%   r  r   s      r   test_executable_with_cwdz(ProcessTestCase.test_executable_with_cwd  sI     #'"9"9";
K((4
%;$'NN
 	 	Dr   z#need an installed Python. See #7774c                 l    | j                  t        j                         dt        j                         y )Nr%  r   )r  r   r   rX   rY   r$   s    r   test_executable_without_cwdz+ProcessTestCase.test_executable_without_cwd   s)     	&<$'NN 	 	4r   c                 2   t        j                  t        j                  ddgt         j                        }|j
                  j                  d       |j
                  j                          |j                          | j                  |j                  d       y )Nr   0import sys; sys.exit(sys.stdin.read() == "pear")r   r   r   )r   rE   rX   rY   rF   rB   r   rJ   r*   rZ   r   rK   s     r   test_stdin_pipezProcessTestCase.test_stdin_pipe
  sf    cnndKM(oo/ 	
g		q)r   c                    t        j                         }| j                  |j                         |j	                         }t        j                  |d       t        j                  |dd       t        j                  t        j                  ddg|      }|j                          | j                  |j                  d       y Nr   r   r   r1  r   r   )r   r   r   rJ   filenor   r   lseekr   rE   rX   rY   r*   rZ   r   r%   r   drL   s       r   test_stdin_filedesz"ProcessTestCase.test_stdin_filedes  s    ##%!IIK
G
AqcnndKM " 	
q)r   c                 N   t        j                         }| j                  |j                         |j	                  d       |j                  d       t        j                  t        j                  ddg|      }|j                          | j                  |j                  d       y r4  )r   r   r   rJ   r   r   r   rE   rX   rY   r*   rZ   r   r%   r   rL   s      r   test_stdin_fileobjz"ProcessTestCase.test_stdin_fileobj!  sz    ##%!


cnndKM!# 	
q)r   c                     t        j                  t        j                  ddgt         j                        }|5  | j                  |j                  j                         d       d d d        y # 1 sw Y   y xY w)Nr   &import sys; sys.stdout.write("orange")rt      oranger   rE   rX   rY   rF   rZ   rC   r
  rK   s     r   test_stdout_pipez ProcessTestCase.test_stdout_pipe-  s^    cnndBD *1  	9QXX]]_i8	9 	9 	9   +A--A6c                 l   t        j                         }| j                  |j                         |j	                         }t        j                  t        j                  ddg|      }|j                          t        j                  |dd       | j                  t        j                  |d      d       y )Nr   r>  rt   r      r?  r   r   r   rJ   r5  r   rE   rX   rY   r*   r   r6  rZ   r
  r7  s       r   test_stdout_filedesz#ProcessTestCase.test_stdout_filedes5  s    ##%!IIKcnndBD !# 	

AqD)95r   c                 4   t        j                         }| j                  |j                         t	        j
                  t        j                  ddg|      }|j                          |j                  d       | j                  |j                         d       y )Nr   r>  rt   r   r?  r   r   r   rJ   r   rE   rX   rY   r*   r   rZ   r
  r;  s      r   test_stdout_fileobjz#ProcessTestCase.test_stdout_fileobjA  sp    ##%!cnndBD "$ 	


I.r   c                     t        j                  t        j                  ddgt         j                        }|5  | j                  |j                  j                         d       d d d        y # 1 sw Y   y xY w)Nr   *import sys; sys.stderr.write("strawberry")r   
   strawberry)r   rE   rX   rY   rF   rZ   rD   r
  rK   s     r   test_stderr_pipez ProcessTestCase.test_stderr_pipeL  s^    cnndFH *1  	=QXX]]_m<	= 	= 	=rB  c                 l   t        j                         }| j                  |j                         |j	                         }t        j                  t        j                  ddg|      }|j                          t        j                  |dd       | j                  t        j                  |d      d       y )Nr   rK  r   r   rD  rL  rE  r7  s       r   test_stderr_filedesz#ProcessTestCase.test_stderr_filedesT  s    ##%!IIKcnndFH !# 	

AqD)=9r   c                 4   t        j                         }| j                  |j                         t	        j
                  t        j                  ddg|      }|j                          |j                  d       | j                  |j                         d       y )Nr   rK  r   r   rL  rH  r;  s      r   test_stderr_fileobjz#ProcessTestCase.test_stderr_fileobj`  sp    ##%!cnndFH "$ 	


M2r   c                 4   t        j                  t        j                  ddgt         j                  t         j                        }|j                         \  }}| j                  |d       | j                  |d       | j                  |j                  d       y )Nr   zimport sys, subprocess;rc = subprocess.call([sys.executable, "-c",    "import sys;"    "sys.stderr.write('42')"],    stderr=subprocess.STDOUT);sys.exit(rc)r   s   42r   r   r   rE   rX   rY   rF   r   rZ   r   r%   rL   rC   rD   s       r   ,test_stderr_redirect_with_no_stdout_redirectz<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectk  s{     cnnd-. %/OO$.OO5 '%q)r   c                    t        j                  t        j                  ddgt         j                  t         j
                        }|5  | j                  |j                  j                         d       d d d        y # 1 sw Y   y xY w)Nr   Rimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r      appleorange)	r   rE   rX   rY   rF   r   rZ   rC   r
  rK   s     r   test_stdout_stderr_pipez'ProcessTestCase.test_stdout_stderr_pipe  sj    cnnd;<
 %/OO$.$5$57  	>QXX]]_n=	> 	> 	>s   +A<<Bc                 6   t        j                         }| j                  |j                         t	        j
                  t        j                  ddg||      }|j                          |j                  d       | j                  |j                         d       y )Nr   rW  r   r   rX  rH  r;  s      r   test_stdout_stderr_filez'ProcessTestCase.test_stdout_stderr_file  sv    ##%!cnnd;<
 %'$&( 	


N3r   c                    d}t        j                  t        j                  d|gt         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         |j                         \  }}| j                  |j                  d|       | j                  |j                         d       y )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   s        r   test_stdout_filedes_of_stdoutz-ProcessTestCase.test_stdout_filedes_of_stdout  s    "
 cnndD9$.OOJOOM''==?Sq#.'<=r   c                     t        j                  t        j                  ddgt         j                        }|j                          | j                  |j                  d        y )Nr   z'for i in range(10240):print("x" * 1024)rt   )r   rE   rX   rY   DEVNULLr*   rZ   rC   rK   s     r   test_stdout_devnullz#ProcessTestCase.test_stdout_devnull  sN    cnnd23 &0%7%79 	
4(r   c                     t        j                  t        j                  ddgt         j                        }|j                          | j                  |j                  d        y )Nr   z=import sys
for i in range(10240):sys.stderr.write("x" * 1024)r   )r   rE   rX   rY   r_  r*   rZ   rD   rK   s     r   test_stderr_devnullz#ProcessTestCase.test_stderr_devnull  sN    cnnd=> &0%7%7	9
 	
4(r   c                     t        j                  t        j                  ddgt         j                        }|j                          | j                  |j                  d        y )Nr   zimport sys;sys.stdin.read(1)r   )r   rE   rX   rY   r_  r*   rZ   rB   rK   s     r   test_stdin_devnullz"ProcessTestCase.test_stdin_devnull  sN    cnnd23 %/$6$68 	
$'r   F_GETPIPE_SZz%fcntl.F_GETPIPE_SZ required for test.c                 p   t        j                         \  }}	 t        j                  |t        j                        }t        j                  |       t        j                  |       |dz  }t        j                         }||k  rt        j                  d      t        j                  t        j                  ddgt        j                  t        j                  t        j                  |      }	 |j                  |j                  |j                   fD ]D  }| j#                  t        j                  |j%                         t        j                        |       F |j                  j'                  d       |j                  j	                          |j                  j	                          |j                   j	                          |j)                          |j+                          y # t        j                  |       t        j                  |       w xY w# |j)                          |j+                          w xY w)N   z+default pipesize too small to perform test.r   Qimport sys; sys.stdin.read(); sys.stdout.write("out"); sys.stderr.write("error!")rB   rC   rD   pipesizer   )r   pipefcntlre  rJ   r   get_pagesizeunittestSkipTestr   rE   rX   rY   rF   rB   rC   rD   rZ   r5  r   killr*   )r%   test_pipe_rtest_pipe_wpipesize_defaultrj  pagesize_defaultrL   fifos           r   test_pipesizeszProcessTestCase.test_pipesizes  s    $&779 [	"${{;8J8JKHH[!HH[!#q("//1&&##=? ?^^T*+ //*//??X7	!((AHH5   KKu/A/AB GGMM'"GGMMOHHNNHHNNFFHFFH7 HH[!HH[!2 FFHFFHs   $G$ 0CH $,H"H5c                 d   t        j                  t        j                  ddgt         j                  t         j                  t         j                  d      }|5  	 t        j                         \  }}	 t        j                  |t        j                        }t        j                  |t        j                        }t        j                  |       t        j                  |       | j                  t        j                  |j                  j                         t        j                        |       | j                  t        j                  |j                  j                         t        j                        |       | j                  t        j                  |j                  j                         t        j                        |       |j                          	 d d d        y # t        j                  |       t        j                  |       w xY w# |j                          w xY w# 1 sw Y   y xY w)Nr   rh  ri  )r   rE   rX   rY   rF   r   rk  rl  re  rJ   rZ   rB   r5  rC   rD   rp  )r%   procfp_rfp_wdefault_read_pipesizedefault_write_pipesizes         r   test_pipesize_defaultz%ProcessTestCase.test_pipesize_default  s    ^^T*+ //*//??R1  	WWY
d#,1KKe>P>P,Q)-2[[u?Q?Q-R*HHTNHHTN  KK

 1 1 3U5G5GH)+   KK 2 2 4e6H6HI*,   KK 2 2 4e6H6HI*, 		-	 	 HHTNHHTN 		-	 	s>   H&H2AG":DHH&",HHH##H&&H/c                 ,   t         j                  j                         }d|d<   t        j                  t
        j                  ddgt        j                  |      5 }|j                         \  }}| j                  |d       d d d        y # 1 sw Y   y xY w)Noranger   r   2import sys,os;sys.stdout.write(os.getenv("FRUIT"))rC   r   r?  )
r   r   r   r   rE   rX   rY   rF   r   rZ   r%   r   rL   rC   rD   s        r   test_envzProcessTestCase.test_env  s    ""ws~~t FG &0__"(	* 	0 ./]]_NFFVY/	0 	0 	0s   &B

Br   zWindows only issuec                 H   t         j                  j                         }d|d<   d|d<   d|d<   d|d<   t        j                  g d	t        j
                  |
      5 }|j                         \  }}| j                  |j                         d       d d d        y # 1 sw Y   y xY w)NcherryfRUitlemonfruitr  r   r   frUitCMDz/cSETr  r  s   frUit=banana)	r   r   r   r   rE   rF   r   rZ   strip)r%   r   rL   rC   _s        r   test_win32_duplicate_envsz)ProcessTestCase.test_win32_duplicate_envs  s    ""w!w"w"w;%/__"(* 	>-.IFAV\\^_=		> 	> 	>s   4BB!z#cannot test an empty env on WindowsPy_ENABLE_SHAREDr   zEThe Python shared library cannot be loaded with an empty environment.T)addressz)AddressSanitizer adds to the environment.c                    d }t        j                  t        j                  ddgt         j                  i       5 }|j                         \  }}t        |j                               }| j                  |t               |D cg c]  } ||      s| }}| j                  |g        ddd       yc c}w # 1 sw Y   yxY w)z+Verify that env={} is as empty as possible.c                 X    d| v xs% d| v xs | dk(  xs | j                  d      xs | dk(  S )z:Determine if an environment variable is under our control.	VERSIONER__CF
LD_PRELOADSANDBOXLC_CTYPE)
startswith)ns    r   is_env_var_to_ignorez<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignore2  sF    
  1$ $! $%$)*i)@$O%r   r   z)import os; print(list(os.environ.keys()))r  N)r   rE   rX   rY   rF   r   evalr  rG   listrZ   )r%   r  rL   rC   rD   child_env_namesks          r   test_empty_envzProcessTestCase.test_empty_env(  s    	% s~~tJL%/__"> 	2AB]]_NFF"6<<>2O!!/48*9 ?Q&:1&=  ! ?O ?_b1	2 	2?	2 	2s   AB5B0B50B55B>zLThe Python shared library cannot be loaded without some system environments.c                 :   ddi}t         j                  ddg}t         j                  dk(  rg d}t        j                  |t        j
                  t        j
                  |      5 }|j                         \  }}|j                  rHt        j                  r8t        d|j                  d	d
             t        d|j                  d	d
             | j                  |j                  d       | j                  |j                         d       d d d        y # 1 sw Y   y xY w)Nr  r  r   z;import sys,os;sys.stdout.write("fruit="+os.getenv("fruit"))r   r  )rC   rD   r   zSTDOUT:asciireplacezSTDERR:r   s   fruit=orange)rX   rY   platformr   rE   rF   r   r   r   verboseprintr  rZ   r  )r%   r   cmdrL   rC   rD   s         r   test_one_environment_variablez-ProcessTestCase.test_one_environment_variableE  s     8$~~t OP <<7"/Cc*//*//W]^ 	>bc]]_NFF||iw	!BCiw	!BCQ\\1-V\\^_=	> 	> 	>s   $B$DDc                 N   t         j                  dz   }| j                  t              5  t	        j
                  |ddg       d d d        | j                  t              5  t	        j
                  t         j                  ddg       d d d        y # 1 sw Y   NxY w# 1 sw Y   y xY w)N r   r   zpass# )rX   rY   rc   rz   r   rE   )r%   r  s     r   test_invalid_cmdz ProcessTestCase.test_invalid_cmdY  s    nnt#z* 	2c401	2 z* 	@cnndI>?	@ 	@		2 	2	@ 	@s   B'BBB$c                    t         j                  j                         }d|d<   | j                  t              5  t        j                  t        |       d d d        t         j                  j                         }d|d<   | j                  t              5  t        j                  t        |       d d d        t         j                  j                         }d|d<   | j                  t              5  t        j                  t        |       d d d        t         j                  j                         }d|d<   t        j                  t        j                  d	d
gt
        j                  |      5 }|j                         \  }}| j                  |d       d d d        y # 1 sw Y   KxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)NcabbagezFRUIT VEGETABLEr   zorange VEGETABLE=cabbager   r  zFRUIT=ORANGEzorange=lemonr   z3import sys, os;sys.stdout.write(os.getenv("FRUIT"))r  s   orange=lemon)r   r   r   rc   rz   r   rE   r   rX   rY   rF   r   rZ   r  s        r   test_invalid_envz ProcessTestCase.test_invalid_envc  st   "%.!"z* 	:_&9	: "5wz* 	:_&9	: "!(~z* 	:_&9	: "(ws~~t FG &0__"(	* 	6 ./]]_NFFV_5	6 	6%	: 	:	: 	:	: 	:	6 	6s/   FF+1F7/&GF(+F47G Gc                    t         j                  j                         }d|d<   | j                  t              5  t        j                  t        |       d d d        t         j                  j                         }d|d<   | j                  t              5  t        j                  t        |       d d d        y # 1 sw Y   fxY w# 1 sw Y   y xY w)Nr  zFRUIT=VEGETABLEr   z==FRUIT)r   r   r   rc   rz   r   rE   r   )r%   r   s     r   test_win32_invalid_envz&ProcessTestCase.test_win32_invalid_env  s     "$- !z* 	:_&9	: "%yz* 	:_&9	: 	:	: 	:
	: 	:s   B:C:CCc                     t        j                  t        j                  ddgt         j                        }|j                  d       | j                  |j                  d       y )Nr   z/import sys;sys.exit(sys.stdin.read() == "pear")r   r   r   rS  rK   s     r   test_communicate_stdinz&ProcessTestCase.test_communicate_stdin  sQ    cnndEF $.??4 	
gq)r   c                     t        j                  t        j                  ddgt         j                        }|j                         \  }}| j                  |d       | j                  |d        y )Nr   z)import sys; sys.stdout.write("pineapple")rt   	   pineappler   rE   rX   rY   rF   r   rZ   rT  s       r   test_communicate_stdoutz'ProcessTestCase.test_communicate_stdout  s\    cnndIK$.OO5 ==?.&r   c                     t        j                  t        j                  ddgt         j                        }|j                         \  }}| j                  |d        | j                  |d       y )Nr   z)import sys; sys.stderr.write("pineapple")r   r  r  rT  s       r   test_communicate_stderrz'ProcessTestCase.test_communicate_stderr  s\    cnndIK$.OO5 ==?&.r   c                    t        j                  t        j                  ddgt         j                  t         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         | j                  |j                  j                         |j                  d      \  }}| j                  |d       | j                  |d       y )Nr   zNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())rA      bananar  )r   rE   rX   rY   rF   r   rC   rJ   rD   rB   r   rZ   rT  s       r   test_communicatez ProcessTestCase.test_communicate  s    cnndCD $.??$.OO$.OO5 	''&==3+.r   c                    t        j                  t        j                  ddgdt         j                  t         j                  t         j                        }| j                  t         j                  |j                  dd       |j                         \  }}| j                  |d       | j                  |j                         d       y )	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   rB   rC   rD   r   g333333?ra   s   pineapple
pear
)
r   rE   rX   rY   rF   rc   rd   r   rZ   encoderT  s       r   test_communicate_timeoutz(ProcessTestCase.test_communicate_timeout  s    cnndCD 15#-??$.OO$.OO	5 	*33Q]]H"% 	 	' ==?**>?r   c                 $   t        j                  t        j                  ddgt         j                        }| j                  t         j                  |j                  d       |j                         \  }}| j                  t        |      d       y )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));rt   g?ra   i   )
r   rE   rX   rY   rF   rc   rd   r   rZ   len)r%   rL   rC   r  s       r   %test_communicate_timeout_large_outputz5ProcessTestCase.test_communicate_timeout_large_output  ss    cnndEF %/OO	5 	*33Q]]CPmmoVm4r   c                 >   dD ]  }dD ]  }dD ]  }i }|rt         j                  |d<   |rt         j                  |d<   |rt         j                  |d<   |sHt        j                  t        fi |}|j	                          |j
                  %| j                  |j
                  j                         |j                  %| j                  |j                  j                         |j                  | j                  |j                  j                            y )NFTrB   rC   rD   )
r   rF   rE   r   r   rB   
assertTrueclosedrC   rD   )r%   
stdin_pipestdout_pipestderr_pipeoptionsrL   s         r   test_communicate_pipe_fd_leakz-ProcessTestCase.test_communicate_pipe_fd_leak  s    ' 	9J, 9#0 9K G!+5??(",6OO)",6OO)" "((DGDAMMOww*7xx+8xx+8#99	9r   c                     t        j                  t        j                  ddg      }|j	                         \  }}| j                  |d        | j                  |d        y )Nr   rT   )r   rE   rX   rY   r   rZ   rT  s       r   test_communicate_returnsz(ProcessTestCase.test_communicate_returns  sR    cnnd8: ;==?&&r   c                    t        j                         \  }}t        j                  |       t        j                  |       t        j                  t
        j                  ddt        j                  z  gt        j                  t        j                  t        j                        }| j                  |j                  j                         | j                  |j                  j                         | j                  |j                  j                         dt        j                  z  }|j                  |      \  }}| j                  ||       y )Nr   zpimport sys,os;sys.stdout.write(sys.stdin.read(47));sys.stderr.write("x" * %d);sys.stdout.write(sys.stdin.read())rA      a)r   rk  rJ   r   rE   rX   rY   r   PIPE_MAX_SIZErF   r   rC   rD   rB   r   rZ   )r%   xyrL   string_to_writerC   rD   s          r   test_communicate_pipe_bufz)ProcessTestCase.test_communicate_pipe_buf  s     wwy1

cnndC &33	45 $.??$.OO$.OO5 	''&!6!66==91r   c                 0   t        j                  t        j                  ddgt         j                  t         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         | j                  |j                  j                         |j                  j                  d       |j                  d      \  }}| j                  |d       | j                  |d       y )Nr   z0import sys,os;sys.stdout.write(sys.stdin.read())rA   r  s   splits   bananasplitr   )r   rE   rX   rY   rF   r   rC   rJ   rD   rB   r   r   rZ   rT  s       r   test_writes_before_communicatez.ProcessTestCase.test_writes_before_communicate  s    cnndCD $.??$.OO$.OO5 	''&	i ==20%r   c                 `   t         j                  ddt        z   dz   g}dD ]~  }t        j                  |fi dt        j
                  dt        j
                  |di}|5  |j                  j                  d       |j                  j                          | j                  |j                  j                         d       |j                  j                  d	       |j                  j                          | j                  |j                  j                         | j                  |j                  j                         d
       | j                  |j                  j                  d      d	       | j                  |j                  j                         d       d d d         y # 1 sw Y   xY w)Nr   import sys,os;a@  buf = sys.stdout.buffer;buf.write(sys.stdin.readline().encode());buf.flush();buf.write(b"line2\n");buf.flush();buf.write(sys.stdin.read().encode());buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");)r   r   rB   rC   Tzline1
zline3
zline2
   zline4
line5
line6
line7
line8)rX   rY   	SETBINARYr   rE   rF   rB   r   flushrZ   rC   readlinerJ   r   r
  )r%   r:   extra_kwargrL   s       r    test_universal_newlines_and_textz0ProcessTestCase.test_universal_newlines_and_text  sV   NNDy(&&'( : 	FK   >':??*2JOO*5t*= >A  Fi(  !2!2!4i@i(/  !2!2!4!*,  q!1!*,  !DFF F		FF Fs   D9F##F-	c                    t        j                  t        j                  ddt        z   dz   gt         j
                  t         j
                  d      }| j                  |j                  j                         | j                  |j                  j                         |j                         \  }}| j                  |d       y )Nr   r  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   )rD   rC   r   z#line2
line4
line5
line6
line7
line8)r   rE   rX   rY   r  rF   r   rC   rJ   rD   r   rZ   rT  s       r   #test_universal_newlines_communicatez3ProcessTestCase.test_universal_newlines_communicateE  s    cnnd.:889 %/OO$.OO01!3" 	''==?C	Er   c                    t        j                  t        j                  ddt        z   t        j                  d      z   gt         j                  d      }|j                  d      \  }}| j                  |j                  d       y )Nr   r  a  
                               s = sys.stdin.readline()
                               assert s == "line1\n", repr(s)
                               s = sys.stdin.read()
                               assert s == "line3\n", repr(s)
                              r   )rB   r   line1
line3
r   )r   rE   rX   rY   r  textwrapdedentrF   r   rZ   r   rT  s       r   )test_universal_newlines_communicate_stdinz9ProcessTestCase.test_universal_newlines_communicate_stdin^  ss    cnnd.:X__ N" ># #$ $.??013 ==)9:q)r   c                     t        j                  t        t         j                  t         j                  d      }|j	                          | j                  |j                  d       y )NT)rB   rC   r   r   )r   rE   r   rF   r   rZ   r   rK   s     r   .test_universal_newlines_communicate_input_nonez>ProcessTestCase.test_universal_newlines_communicate_input_nonel  sF    
 _#-??$.OO046 	
q)r   c                 @   t        j                  t        j                  ddt        z   t        j                  d      z   gt         j                  t         j                  t         j                  d      }| j                  |j                  j                         | j                  |j                  j                         |j                  d      \  }}| j                  |j                  d       | j                  d|       | j                  |j!                  d	             y )
Nr   r  a  
                               s = sys.stdin.buffer.readline()
                               sys.stdout.buffer.write(s)
                               sys.stdout.buffer.write(b"line2\r")
                               sys.stderr.buffer.write(b"eline2\n")
                               s = sys.stdin.buffer.read()
                               sys.stdout.buffer.write(s)
                               sys.stdout.buffer.write(b"line4\n")
                               sys.stdout.buffer.write(b"line5\r\n")
                               sys.stderr.buffer.write(b"eline6\r")
                               sys.stderr.buffer.write(b"eline7\r\nz")
                              T)rB   rD   rC   r   r  r   zline1
line2
line3
line4
line5
zeline2
eline6
eline7
)r   rE   rX   rY   r  r  r  rF   r   rC   rJ   rD   r   rZ   r   r  r  rT  s       r   7test_universal_newlines_communicate_stdin_stdout_stderrzGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrx  s    cnnd.:X__ N" ># #$ $.??$.OO$.OO04!6" 	''==)9:q)>G 	))*DEFr   c                     dD ]v  }d|z  }t         j                  d|g}t        j                  |t        j                  t        j                  |      }|j                  d      \  }}| j                  |d       x y )N)zutf-16z	utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))r   )rB   rC   r   r   r   z1
2
3
4)rX   rY   r   rE   rF   r   rZ   )r%   r   r   r:   popenrC   rD   s          r   -test_universal_newlines_communicate_encodingsz=ProcessTestCase.test_universal_newlines_communicate_encodings  s     0 	3HLD NND$/D $$T+5??,6OO.68E #..R.8NFFV\2	3r   c                    dD ]  \  }}d}t         j                  d|g}t        j                  |t        j                  t        j                  d|      }|j                  d      \  }}| j                  |dj                  |              y )	N))r   r   )r  u   ��)surrogateescapeu   )backslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')r   r   )rB   rC   r   r   r   r   z[{}])rX   rY   r   rE   rF   r   rZ   format)r%   r   expectedr   r:   r  rC   rD   s           r   test_communicate_errorsz'ProcessTestCase.test_communicate_errors  s    !
 	>FH>DNND$/D $$T+5??,6OO.5,2	4E
 #..R.8NFFVV]]8%<=%	>r   c                 ,   t         sd}nd}g }t        j                         }	 t        |      D ]u  }	 t        j
                  j                  |t        j                        }|j                  t	        j                  |t        j                  t        j                  z               w | j!                  d|z         t        d      D ]%  }t	        j"                  |j%                                ' t        d      D ]|  }t'        j(                  t*        j,                  ddgt&        j.                  t&        j.                  t&        j.                        }|j1                  d	      d
   }| j3                  |d	       ~ 	 |D ]  }	t	        j"                  |	        t5        j6                  |       y # t        $ r*}|j                  t        j                  k7  r Y d }~ d }~ww xY w# |D ]  }	t	        j"                  |	        t5        j6                  |       w xY w)Ni  i  z4failed to reach the file descriptor limit (tried %d)
      r   z-import sys;sys.stdout.write(sys.stdin.read())rA   s   limer   )r(   r   mkdtempranger   r   r   r   TESTFNappendopenO_WRONLYO_CREATOSErrorerrnoEMFILEskipTestrJ   popr   rE   rX   rY   rF   r   rZ   r   rmtree)
r%   max_handleshandlestmpdiritmpfileerL   datahs
             r   test_no_leakingzProcessTestCase.test_no_leaking  s   KK!!#	";' 
0 ggll693C3CDGNN2777BKK

4J#KL
0  !#./ 0 2Y ('( 2Y 0$$cnnd'K&L ,6??,6OO,6OO= }}W-a0  w/0  MM&!1  ww%,,.,  MM&!s6   G  A2F*$CG  *	G3GG  GG   3Hc                 t   | j                  t        j                  g d      d       | j                  t        j                  g d      d       | j                  t        j                  g d      d       | j                  t        j                  g d      d       | j                  t        j                  g d	      d
       | j                  t        j                  g d      d       | j                  t        j                  g d      d       | j                  t        j                  ddg      d       y )N)za b cr8  r  z"a b c" d e)ab"c\r8  z	ab\"c \ d)r  z \r8  zab\"c " \\" d)za\\\bzde fgr
  za\\\b "de fg" h)za\"brn   r8  z
a\\\"b c d)za\\b cr8  r  z"a\\b c" d e)za\\b\ cr8  r  z"a\\b\ c" d eabr   zab "")rZ   r   list2cmdliner$   s    r   test_list2cmdlinez!ProcessTestCase.test_list2cmdline  s    001DE&	(001DE&	(001EF+	-001KL-	/001DE(	*001GH)	+001IJ+	-00$< 	"r   c                    t        j                  t        j                  ddgt         j                        }| j                  |j                  j                         | j                  |j                                t        j                  |j                  j                         d       |j                          | j                  |j                         d       y )Nr   zimport os; os.read(0, 1)r      Ar   )r   rE   rX   rY   rF   r   rB   rJ   assertIsNonepollr   r   r5  r*   rZ   rK   s     r   	test_pollzProcessTestCase.test_poll  s    cnnd8:#-??4 	&!&&(#
!4(	1%r   c                     t        j                  t              }| j                  |j	                         d       | j                  |j	                         d       y rg   r   rE   r   rZ   r*   rK   s     r   	test_waitzProcessTestCase.test_wait  s>    _-1%1%r   c                    t        j                  t        j                  ddg      }| j	                  t         j
                        5 }|j                  d       d d d        | j                  dt        j                               | j                  |j                  t        j                        d       y # 1 sw Y   _xY w)Nr   zimport time; time.sleep(0.3)-C6?ra   z0.0001r   )r   rE   rX   rY   rc   rd   r*   rx   strrl   rZ   r   SHORT_TIMEOUT)r%   rL   rn   s      r   test_wait_timeoutz!ProcessTestCase.test_wait_timeout	  s    cnn"$BD Ez889 	#QFF6F"	#hAKK 01(=(=>B	# 	#s   B77C c                     | j                  t              5  t        j                  t        d       d d d        y # 1 sw Y   y xY w)Nr  )rc   r   r   rE   r   r$   s    r   test_invalid_bufsizez$ProcessTestCase.test_invalid_bufsize  s7     y) 	8_h7	8 	8 	8s	   :Ac                     t        j                  t        d       }| j                  |j	                         d       t        j                  t        d       }| j                  |j	                         d       y )Nr   )rO   r  rK   s     r   test_bufsize_is_nonez$ProcessTestCase.test_bufsize_is_none  sR    _d31%_d;1%r   c                    t        j                  t        j                  ddgt         j                  t         j                  t         j
                  d|      5 }|j                  j                  |       t        j                  |j                  j                                |j                  j                         }t        j                         5  	 |j                  j                          d d d        d |_        d d d        | j!                  j"                  d       | j!                  |       y # t        $ r Y Qw xY w# 1 sw Y   VxY w# 1 sw Y   SxY w)Nr   zDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r   )rB   rC   rD   rO   r   r   )r   rE   rX   rY   rF   r_  rB   r   r   rJ   r5  rC   r  r   SuppressCrashReportr  rZ   r   )r%   liner  r   rL   	read_lines         r   _test_bufsize_equal_onez'ProcessTestCase._test_bufsize_equal_one  s   s~~t 64 5 %/OO%/__%/%7%7&'1CE 	 IJGGMM$HHQWW^^%&))+I,,. GGMMO
 AG!	" 	q)H-	   	 	sC   A7ED?D0*E0	D<9D?;D<<D??E	EEc                 0    d}| j                  ||d       y )Nzline
Tr   )r'  r%   r%  s     r    test_bufsize_equal_one_text_modez0ProcessTestCase.test_bufsize_equal_one_text_mode5  s     $$T4D$Ir   c                     dt         j                  j                         z   }| j                  t        d      5  | j                  |dd       d d d        y # 1 sw Y   y xY w)Ns   linezline bufferingr   Fr)  )r   linesepr  assertWarnsRegexRuntimeWarningr'  r*  s     r   "test_bufsize_equal_one_binary_modez2ProcessTestCase.test_bufsize_equal_one_binary_mode;  sZ     **,,"">3CD 	N((su(M	N 	N 	Ns   AAcpuc                     t        d      D ]X  }| j                  t              5  t        j                  t
        t        j                  t        j                         d d d        Z y # 1 sw Y   exY w)NrD  r   )r  rc   r   r   rE   r   rF   )r%   r  s     r   test_leaking_fds_on_errorz)ProcessTestCase.test_leaking_fds_on_errorB  s^     t 	9A""#56 9  (2(299 9	99 9s   9A((A1	c                    	 dd l }|j                   t        j                  dt        d      }t        j                  d|g}t        j                  |t        j                  d      }|5  |j                         d   }d d d        | j                  d	       | j                  |j                  d       y # t        t        f$ r | j	                  d       Y w xY w# 1 sw Y   ^xY w)
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)rD   r   r   r   )msvcrtCrtSetReportModeAttributeErrorImportErrorr   r  r  r   rX   rY   r   rE   rF   r   rZ   r   )r%   r5  r   r  ry  rD   s         r   test_nonexisting_with_pipesz+ProcessTestCase.test_nonexisting_with_pipesO  s    	:##  $ #% &		  & ~~tT*'1379  	+%%'*F	+$!,; , 	:MM89	:4	+ 	+s   B5 *C5 CCC$c                 z   g fd}t        j                  |      }|j                          	 | j                  t              5  t        j                  t        t
        j                  t
        j                  t
        j                         d d d        |j                          d }D ]  }	 t        j                  |        ||y # 1 sw Y   =xY w# t        $ r}|}Y d }~<d }~ww xY w# |j                          d }D ]0  }	 t        j                  |       # t        $ r}|}Y d }~*d }~ww xY w ||w xY w)Nc                      t        d      D ]:  } j                  t        j                                t	        j
                  d       < y )N   gMbP?)r  extendr   rk  timesleep)r  fdss    r   open_fdsz<ProcessTestCase.test_double_close_on_error.<locals>.open_fds{  s4    2Y "

2779%

5!"r   )targetrA   )	threadingThreadstartrc   EnvironmentErrorr   rE   r   rF   r   r   rJ   r  )r%   rA  texcfdr  r@  s         @r   test_double_close_on_errorz*ProcessTestCase.test_double_close_on_errorx  s"   	" H-			""#34 9  '1(2(299 FFHC HHRL 	 !9 9  C FFHC HHRL C 	 sf   C- AC	C- -C	CC- 	C*C%%C*-D:DD:	D1	%D,	'D:,D1	1	D:c                 (   t        j                  t        j                  ddg      | j	                  j
                  d       g fd}t        j                  d|      }|j                          t        rd}nd}j                  t        j                         | j	                  j
                  |d	
       j                          | j	                  j
                  |d
       |j                          | j	                  dd|fd|fg       y)z?Issue21291: Popen.wait() needs to be threadsafe for returncode.r   zimport time; time.sleep(12)Nc                     j                  d j                         f        j                           j                          j                  d j                  f        j                          j                  d j                  f       y )Nthread-start-poll-resultthread-after-kill-and-waitthread-after-second-wait)r  r  rp  r*   r   )ry  resultss   r   kill_proc_timer_threadzDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_thread  sb    NN6		DEIIKIIKNN8$//JKIIKNN6HIr   皙?r   ira   z*unexpected result in wait from main threadmsgz&unexpected result in second main wait.)rM  NrN  rO  )r   rE   rX   rY   rZ   r   rC  TimerrE  r(   r*   r   r  r   )r%   rQ  rG  expected_errorcodery  rP  s       @@r   test_threadsafe_waitz$ProcessTestCase.test_threadsafe_wait  s   !>!@ A$/	J OOC!78		!" "$
 			'//	0*<I 	 	K 			*<E 	 	G 	

 	<79KL57IJL !	"r   c                     dj                  d      }t        j                  t        j                  d|g      }| j                  |j                  d      t        |             y )N;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0r   s   Hello World!)r   r   rw   rX   rY   r  r  r  )r%   r   r|   s      r   test_issue8780zProcessTestCase.test_issue8780  sQ     xx # $
 ((#..$)EF))/:E&MJr   c                    t        j                         \  }}t        j                         \  }}t        j                         \  }}	 t        j                  dg|||       | j                  t
        j                  j                  |             | j                  t
        j                  j                  |             | j                  t
        j                  j                  |             y # t        $ r t        j                  |       t        j                  |       t        j                  |       t        j                  |       t        j                  |       t        j                  |       Y w xY w)N*rA   )r   mkstempr   rE   r  r   rJ   remover,   r   exists)r%   ifhandleifnameofhandleofnameefhandleefnames          r    test_handles_closed_on_exceptionz0ProcessTestCase.test_handles_closed_on_exception  s    $++-&#++-&#++-&		se8H 	/0/0/0  	HHXIIfHHXIIfHHXIIf	s   C, ,BE76E7c                    t        j                  t        t         j                  t         j                  t         j                        }| j	                  |j
                  j                         | j	                  |j                  j                         | j	                  |j                  j                         |j                  ddz         y )NrA      x   )
r   rE   r   rF   r   rC   rJ   rD   rB   r   rK   s     r   test_communicate_epipez&ProcessTestCase.test_communicate_epipe  sw    _#-??$.OO$.OO5 	''&	dUl#r   c                 |   dddgdd dfg ddd dft        j                  d      dd	d
fg}t        j                  j                  j                  t        j                  d      5  |D ]@  \  }}}}t        j                  ||      }||_        | j                  t        |      |       B 	 d d d        y # 1 sw Y   y xY w)N)lsT{   z#<Popen: returncode: 123 args: 'ls'>)daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTr   zP<Popen: returncode: 0 args: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...>rl  Fz&<Popen: returncode: None args: ['ls']>)rl  z	--my-optsrn  zP<Popen: returncode: None args: ['ls', '--my-opts', 'aaaaaaaaaaaaaaaaaaaaaaaa...>z
my-tool.py   z4<Popen: returncode: 7 args: <FakePath 'my-tool.py'>>r<   r   )r   r
   rn  r   patchobjectr   rE   r   rZ   repr)r%   casesr  r   r   sxrL   s          r   	test_reprzProcessTestCase.test_repr  s    DaVUD"JK+UD_a-uaCE	
 ]]  ''
(8(8:JK 	.(- .$UD"$$S6#  a"-.	. 	. 	.s   "AB22B;c                     t        j                  t        t         j                        }| j	                  |j
                  j                         |j                          |j                  ddz         y )Nr   rh  ri  )	r   rE   r   rF   r   rB   rJ   r*   r   rK   s     r   !test_communicate_epipe_only_stdinz1ProcessTestCase.test_communicate_epipe_only_stdin  sH    _#-??4&		dUl#r   SIGUSR1zRequires signal.SIGUSR1rp  zRequires os.killgetppidzRequires os.getppidc                 ~   d }t        j                   t         j                  |      }| j                  t         j                   t         j                  |       t        j                  ddg}dD ]C  }|t
        j                  i}t        j                  |fi |5 }|j                          d d d        E y # 1 sw Y   PxY w)Nc                      y r"   r4   )signumframes     r   handlerz7ProcessTestCase.test_communicate_eintr.<locals>.handler      r   r   z7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r   )	signalry  r   rX   rY   r   rF   rE   r   )r%   r  old_handlerr:   streamkwprocesss          r   test_communicate_eintrz&ProcessTestCase.test_communicate_eintr  s    	mmFNNG<v~~{C89 + 	&F*//*B!!$-"- &##%& &	&& &s   B33B<	/proc/%d/fdzLinux specificc                 x   dt        j                         z  }t        j                  |      }| j                  t              5  t        t        t        j                  t        j                  t        j                         ddd       t        j                  |      }| j                  ||       y# 1 sw Y   1xY w)z;Test for the fork() failure fd leak reported in issue16327.r  rA   N)
r   getpidlistdirrc   r6   r8   r   r   rF   rZ   )r%   fd_directoryfds_before_popenfds_after_exceptions       r   !test_failed_child_execute_fd_leakz1ProcessTestCase.test_failed_child_execute_fd_leak%  s     %ryy{2::l312 	D##:??%??:??D	D !jj6)+>?	D 	Ds   >B00B9z+behavior currently not supported on Windowsc                     | j                  t              5 }t        j                  g d       d d d        | j	                  j
                  j                  d       y # 1 sw Y   0xY w)N)/opt/nonexistent_binarywithsomer:   r  )rc   r  r   rW   rZ   rl   filenamerm   s     r   %test_file_not_found_includes_filenamez5ProcessTestCase.test_file_not_found_includes_filename7  sT    01 	QQOOOP	Q--/HI	Q 	Qs   AA&c                     | j                  t              5 }t        j                  ddgd       d d d        | j	                  j
                  j                  d       y # 1 sw Y   0xY w)Nexit0z/some/nonexistent/directoryr  )rc   r  r   rE   rZ   rl   r  rm   s     r    test_file_not_found_with_bad_cwdz0ProcessTestCase.test_file_not_found_with_bad_cwd=  s\    01 	OQfc]0MN	O--/LM	O 	Os   AA(c                     | j                  t        j                  t           t        j
                         | j                  t        j                  t           t        j
                         y r"   )rG   r   rE   bytestypesGenericAliasCompletedProcessr  r$   s    r   test_class_getitemsz#ProcessTestCase.test_class_getitemsC  sD    j..u5u7I7IJj99#>@R@RSr   
HAVE_VFORKz!vfork() not enabled by configure.subprocess._fork_execc                    | j                  t        j                         t        d      |_        | j                  t              5  t        j                  t        j                  ddg       d d d        |j                          | j                  |j                  j                  d          t        j                  j                  t        dd      5  | j                  t              5  t        j                  t        j                  ddg       d d d        | j                  |j                   d   j                  d          d d d        y # 1 sw Y   xY w# 1 sw Y   IxY w# 1 sw Y   y xY w)Nzjust testing argsr   r   rx  
_USE_VFORKF)r  r   r  RuntimeErrorside_effectrc   r   rX   rY   assert_called_once	call_argsr:   r   rq  rr  r,   call_args_list)r%   mock_fork_execs     r   test__use_vforkzProcessTestCase.test__use_vforkG  s    	
--.%12E%F"|, 	;NNCNND&9:	;))+0055b9:ZZz<? 	I""<0 ?f=>?^::2>CCBGH	I 	I		; 	;
? ?	I 	Is0   'E
E"''E3E"
EE	E""E+_winapizneed subprocess._winapic                    t        j                  t              }|5  t        j                  j                  t         j                  dt         j                  j                        }|5 }|j                  d       |j                  |j                  d       d |_        d d d        | j                  |j                         d       d d d        y # 1 sw Y   2xY w# 1 sw Y   y xY w)NWaitForSingleObjectreturn_valuerx  r   )r   rE   r   r   rq  rr  r  WAIT_OBJECT_0r*   assert_called_once_with_handler   rZ   )r%   ry  rq  	mock_waits       r   test_wait_negative_timeoutz*ProcessTestCase.test_wait_negative_timeoutV  s     0 
	-JJ%%""%'//== & ?E  ')		"11$,,B"&'
 TYY[!,
	- 
	-
' '
	- 
	-s$   AC'5C(CC	CC"N)r1   r2   r3   rM   rQ   r]   re   ri   ro   r}   r   r   r   r   r   r   r   r   r   r   r   requires_resourcer   r   r   r   r   r   r   r   r   r   r   rn  skipIfr(   r   r   r   r  r  r  r  r  r  r#  r(  r+  rX   base_prefixprefixr-  	sysconfigis_python_buildr/  r2  r9  r<  rA  rF  rI  rM  rO  rQ  rU  rY  r[  r]  r`  rb  rd  
skipUnlessrl  hasattrrv  r~  r  r  r  get_config_varr   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r'  r+  r0  r3  r9  rJ  rW  rZ  rf  rj  rv  rx  r  r   r  r   isdirr  r  r  r  r  r   rq  r  r   r  r4   r   r   r?   r?   s   sa   !' 
554'
''(''%54 Wz*6 +6 +(<.)+	MDA9 X__Y DEG FG
 X__Y DE( F( X__Y DE( F(
*=&AN
K
 X__Y DEE FE X__Y DE- F-$C X__S__

224D4D X__S__

224X__.Y..0:<4<44**
*9
6	/=
:	3**
>4>&))( XA75.#A@B!B!F XA75.#A@BB@	0 X02FG
> H
> X__S\\W,:<X__-Y--.@AQF23 X___T2@B2B3<2, X__-Y--.@AQF9: X___T2@B>B:
>@6< X02FG
: H
:*'//@&5"9,'2.& %FNE2*
*G83,>*%"N"$	&&C8&.,JN Wu%
9 &
9'-R:2"h	K1(	$."$ X324XV,+-XY/.0&0-4&& X}yryy{'BC)+@+@  X__Y MNJ OJ
 X__Y MNN ON
T X__111,??8:TZZ'(
I ):
I XY724-4-r   r?   c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z ej                  d      d        Zd Zd Zd Zd Z ej*                  ed      d        Zd Zd Zd Z ej6                  ed      d        Zd Zy)RunFuncTestCasec                 T    t         j                  d|g}t        j                  |fi |S )z4Run Python code in a subprocess using subprocess.runr   rX   rY   r   r   )r%   r   r;   argvs       r   
run_pythonzRunFuncTestCase.run_pythonh  s&    d+~~d-f--r   c                     | j                  d      }| j                  |j                  d       | j                  t        j
                        5  |j                          d d d        y # 1 sw Y   y xY wr   )r  rZ   r   rc   r   rk   check_returncoder%   cps     r   test_returncodezRunFuncTestCase.test_returncodem  sZ    __78+z<<= 	"!	" 	" 	"s   A''A0c                     | j                  t        j                        5 }| j                  dd       d d d        | j	                  j
                  j                  d       y # 1 sw Y   0xY w)NrT   Tru   rU   )rc   r   rk   r  rZ   rl   r   rm   s     r   
test_checkzRunFuncTestCase.test_checkt  s\    z<<= 	DOO6dOC	D//4	D 	Ds   A##A,c                 r    t        j                  t        d      }| j                  |j                  d       y )NTru   r   )r   r   r   rZ   r   r  s     r   test_check_zerozRunFuncTestCase.test_check_zeroy  s&    ^^O48*r   c                     | j                  t        j                        5  | j                  dd       d d d        y # 1 sw Y   y xY w)Nr_   r  ra   )rc   r   rd   r  r$   s    r   test_timeoutzRunFuncTestCase.test_timeout~  sB    
 z889 	@OO.O?	@ 	@ 	@s	   =Ac                 ~    | j                  dt        j                        }| j                  d|j                         y )Nrr   rt   rs   r  r   rF   rx   rC   r  s     r   test_capture_stdoutz#RunFuncTestCase.test_capture_stdout  s*    ___Z___Egryy)r   c                 ~    | j                  dt        j                        }| j                  d|j                         y )Nr   r   rs   )r  r   rF   rx   rD   r  s     r   test_capture_stderrz#RunFuncTestCase.test_capture_stderr  s1    __C$.OO  5gryy)r   c                 "   t        j                         }| j                  |j                         |j	                  d       |j                  d       | j                  d|t        j                        }| j                  d|j                         y )Nr   r   r   r   r   )r   r   r   rJ   r   r   r  r   rF   rx   rC   )r%   r   r  s      r   r   z+RunFuncTestCase.test_check_output_stdin_arg  sj    ##%!


__I  2 	gryy)r   c                     | j                  ddt        j                        }| j                  d|j                         y )Nr   r   )r   rC   r   r  r  s     r   r   z+RunFuncTestCase.test_check_output_input_arg  s5    __Hjoo  7 	gryy)r   c                    t        j                         }| j                  |j                         |j	                  d       |j                  d       | j                  t        d      5 }| j                  d|d      }d d d        | j                  dj                  j                  d          | j                  d	|j                  j                  d          y # 1 sw Y   \xY w)
Nr   r   r   rS  r   r   r   rB   r   )r   r   r   rJ   r   r   rc   rz   r  rx   rl   r:   r   s       r   r   z6RunFuncTestCase.test_check_output_stdin_with_input_arg  s    ##%!


zK  M 	>PQ__%?+-W % >F	> 	gq{{//23gq{{//23	> 	>s   )CC"r   c                 H   | j                  t        j                        5 }| j                  ddt        j                        }d d d        | j                  j                  j                  d       | j                  |j                  j                  d       y # 1 sw Y   VxY w)Nr   r   )rb   rC   rs   )	rc   r   rd   r  rF   rZ   rl   r|   rC   )r%   rn   r  s      r   r   z)RunFuncTestCase.test_check_output_timeout  s    z889 	7Q( joo ! 7B	7 	++W5++W5	7 	7s   #BB!c                     t         j                  j                         }d|d<   | j                  d|      }| j	                  |j
                  d       y )Nr   r   zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)r   !   )r   r   r   r  rZ   r   )r%   r   r  s      r   test_run_kwargszRunFuncTestCase.test_run_kwargs  sM    ""w__ M!'  ) 	+r   c                    t         rdnd}t        j                  |      }|| j                  | d       t	        |      }t        j                  |t
        j                        }| j                  |j                  d       | j                  t              5  t        j                  |t
        j                  d       d d d        y # 1 sw Y   y xY w)Nztree.comrl  z required for this testrt   r   T)rC   r   )r(   r   r   r   r
   r   r   r_  rZ   r   rc   r   )r%   progr   ress       r   test_run_with_pathlike_pathz+RunFuncTestCase.test_run_with_pathlike_path  s     'zD||D!<MMTF"9:;~nnT**<*<=+y) 	HNN4
(:(:$G	H 	H 	Hs   'CCc                     t        j                  t        j                        }|ddg}t	        j
                  |      }| j                  |j                  d       y )Nr   s   import sys; sys.exit(57)9   )r   r   rX   rY   r   r   rZ   r   r%   r   r:   r  s       r   &test_run_with_bytes_path_and_argumentsz6RunFuncTestCase.test_run_with_bytes_path_and_arguments  sC    {{3>>*d78nnT",r   c                     t        t        j                        }|ddg}t        j                  |      }| j                  |j                  d       y )Nr   zimport sys; sys.exit(57)r  )r
   rX   rY   r   r   rZ   r   r  s       r   )test_run_with_pathlike_path_and_argumentsz9RunFuncTestCase.test_run_with_pathlike_path_and_arguments  s?    'd67nnT",r   z#Maybe test trigger a leak on Ubuntuc                 X    t         j                  ddg}t        j                  |i        y )Nr   r   r   r  )r%   r:   s     r   test_run_with_an_empty_envz*RunFuncTestCase.test_run_with_an_empty_env  s$     f- 	t$r   c                     | j                  dd      }| j                  d|j                         | j                  d|j                         y )Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')Tcapture_outputrs   s   FLUFL)r  rx   rC   rD   r  s     r   test_capture_outputz#RunFuncTestCase.test_capture_output  sE    __ : -1  2 	gryy)h		*r   c                    t        j                         }| j                  |j                         | j	                  t
        d      5 }| j                  dd|      }d d d        | j                  dj                  j                  d          | j                  d|j                  j                  d          y # 1 sw Y   \xY w)	NzAExpected ValueError when stdout and capture_output args supplied.rS  r   T)r  rC   rC   r   r  
r   r   r   rJ   rc   rz   r  rx   rl   r:   r   s       r   #test_stdout_with_capture_output_argz3RunFuncTestCase.test_stdout_with_capture_output_arg      ##%!z"  $ 	F'(__%?59" % FF	F
 	h 0 0 34&(8(8(;<	F 	F   B77C c                    t        j                         }| j                  |j                         | j	                  t
        d      5 }| j                  dd|      }d d d        | j                  dj                  j                  d          | j                  d|j                  j                  d          y # 1 sw Y   \xY w)	NzAExpected ValueError when stderr and capture_output args supplied.rS  r   T)r  rD   rD   r   r  r  r   s       r   #test_stderr_with_capture_output_argz3RunFuncTestCase.test_stderr_with_capture_output_arg  r  r  z)requires posix like 'sleep' shell commandc                 H   t        j                         }	 t        j                  dddd       | j	                  d       | j                  |z
  dd d	
       y# t        j
                  $ r2}t        j                         }t        j                         }Y d}~\d}~ww xY w)zJOutput capturing after a timeout mustn't hang forever on open filehandles.zsleep 3Tr`   )r   rb   r  zTimeoutExpired not raised.Ng      ?z/TimeoutExpired was delayed! Bad traceback:
```
z```rS  )	r>  	monotonicr   r   r   rd   	traceback
format_exc
assertLess)r%   before_secsrH  
after_secsstackss        r   .test_run_with_shell_timeout_and_capture_outputz>RunFuncTestCase.test_run_with_shell_timeout_and_capture_output  s     nn&	4NN9D#*.0 II23
[0#O!(#' 	 	( (( 	,)J))+F	,s   A B!/(BB!c                 x   t        j                  d      }t        j                  t        j
                  dd|gd      }|j                  j                         }| j                  t        |      d|       | j                  |d   j                  d             | j                  |d	   j                  d
             y )Nz            from subprocess import *
            run("echo hello", shell=True, text=True)
            check_output("echo hello", shell=True, text=True)
            z-Xwarn_default_encodingr   Tr  rg  r   s   <string>:2: EncodingWarning: r   s   <string>:3: EncodingWarning: )r  r  r   r   rX   rY   rD   
splitlinesrZ   r  r  r  )r%   r   r  liness       r   test_encoding_warningz%RunFuncTestCase.test_encoding_warning  s       
 ^^S^^-FdS+/1		$$&UQ.a++,LMNa++,LMNr   N)r1   r2   r3   r  r  r  r  r  r  r  r   r   r   r   r  r   r  r  r  r  rn  r  r(   r  r  r  r  r  r  r  r4   r   r   r  r  g  s    .
"5
+
@*
*
	**4 Wz*6 +6,H-- X$IJ% K%+
=
=  X__Y KL( M(Or   r  c                      dD ]"  } t         s
	 t        j                  |        | c S  t        j                  d      # t        $ r Y Ew xY w)N)staffnogroupgrpnobody	nfsnobodyz?No identified group name to use for this test on this platform.)r  getgrnamKeyErrorrn  ro  )
name_groups    r   _get_test_grp_namer  ,  sW    H c
Z( c  abb	  s   =	A	A	zPOSIX specific testsc                       e Zd Z fdZd Zd Zd Zd Z G d dej                        Z
 ej                  d      d	        Z ej                  d      d
        Z ej                   ej$                  j'                  d       d      d        Zd Z ej,                   eed      xr	  eed      d      d        Z ej,                   eed      d      d        Z ej                    eed      d      d        Z ej,                   eed      d      d        Z ej                    eed      d      d        Z ej,                   eed      d      d        Z ej,                   eed      d      d         Zd! Zd" Z  ej                   e!xs
  eed#       d$      d%        Z"d& Z#d' Z$d( Z%d) Z&d* Z'd+ Z( G d, d-ej                        Z) ej                   ej$                  j'                  d.       d/      d0        Z*d1 Z+ ej                   e,jZ                  d2k(  d3      d4        Z.d5 Z/d6 Z0d7 Z1d8 Z2d9 Z3d: Z4d; Z5 ej                   e,jZ                  jm                  d<      d=      d>        Z7d? Z8d@ Z9dA Z:dB Z;dC Z<dD Z=dE Z>dF Z?dG Z@dH ZAdI ZBdJ ZCdK ZDdL ZEdM ZFdN ZGdO ZHdP ZIdQ ZJdR ZKdS ZLdT ZMdU ZNdV ZOdW ZPdX ZQdY ZRdZ ZS ej                   e,jZ                  jm                  d[      xr9  ej                  d\      j                   ej                  d]      j                  k(  d^      d_        ZV eWj                  d`da      db        ZYdc ZZdd Z[de Z\df Z]dg Z^dh Z_di Z`dj Zadk Zbdl ZceWj                  dm        ZeeWj                  dn        Zfdo Zgdp Zhdq Zidr Zj ej,                  ekdsuxr	  eekdt      du      dv        Zldw Zmdx Zndy Zodz Zp xZqS ){POSIXProcessTestCasec                 0    t         |           d| _        y )Nz/_this/pa.th/does/not/exist)superr&   _nonexistent_dirr%   	__class__s    r   r&   zPOSIXProcessTestCase.setUp;  s     =r   c                     	 t        j                  | j                         | j                  d| j                  z         S # t        $ r}|}Y d }~|S d }~ww xY w)Nz,chdir to nonexistent directory %s succeeded.)r   chdirr  r   r  )r%   r  desired_exceptions      r   _get_chdir_exceptionz)POSIXProcessTestCase._get_chdir_exception?  s`    		-HHT**+ IID++, -    	" !" ! 	"s   A 	A
AAc                    | j                         }	 t        j                  t        j                  ddg| j
                        }| j                  d|z         y# t        $ r|}| j                  |j                  |j                         | j                  |j                  |j                         | j                  |j                  |j                         Y d}~yd}~ww xY w)z;Test error in the child raised in the parent for a bad cwd.r   r   r  Expected OSError: %sNr  r   rE   rX   rY   r  r   r  rZ   r  strerrorr  r%   r  rL   r  s       r   test_exception_cwdz'POSIXProcessTestCase.test_exception_cwdL  s     557
	B  #..$!;%)%:%:<A II,/@@A  	E .44agg>.77D.77DD	E   2A 	C"A2CCc                    | j                         }	 t        j                  t        j                  ddg| j
                        }| j                  d|z         y# t        $ r|}| j                  |j                  |j                         | j                  |j                  |j                         | j                  |j                  |j                         Y d}~yd}~ww xY w)zBTest error in the child raised in the parent for a bad executable.r   r   r   r  Nr  r  s       r   test_exception_bad_executablez2POSIXProcessTestCase.test_exception_bad_executable[  s     557
	B  #..$!;,0,A,ACA II,/@@A  	E .44agg>.77D.77DD	Er  c                    | j                         }	 t        j                  | j                  ddg      }| j	                  d|z         y# t
        $ r|}| j                  |j                  |j                         | j                  |j                  |j                         | j                  |j                  |j                         Y d}~yd}~ww xY w)z?Test error in the child raised in the parent for a bad args[0].r   r   r  N)
r  r   rE   r  r   r  rZ   r  r  r  r  s       r   test_exception_bad_args_0z.POSIXProcessTestCase.test_exception_bad_args_0j  s     557		B  $"7"7r!BCA II,/@@A  	E .44agg>.77D.77DD	Es   "A	 		CA2C		Cc                       e Zd Zd Zy)&POSIXProcessTestCase.PopenNoDestructorc                      y r"   r4   r$   s    r   __del__z.POSIXProcessTestCase.PopenNoDestructor.__del__  r  r   N)r1   r2   r3   r"  r4   r   r   PopenNoDestructorr     s    	r   r#  r  c                     d }||_         t        j                  dt              5  | j	                  t
              5  | j                  dg       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z>Test error passing done through errpipe_write in the good casec                      | d   }dj                  t        j                        j                         }t	        j
                  |d|z   dz          y)N   z{:x}s   OSError:   :r   )r  r  EISDIRr  r   r   )r:   errpipe_writeerr_codes      r   proper_errorzHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_error  sA     HM}}U\\299;HHH]K($:T$ABr   subprocess.os.waitpidr  non_existent_commandN)r  r   rq  ChildProcessErrorrc   IsADirectoryErrorr#  )r%   	fork_execr+  s      r   test_exception_errpipe_normalz2POSIXProcessTestCase.test_exception_errpipe_normal  s|    	 !-	ZZ/$57 	A""#45 A&&(>'?@A	A 	AA A	A 	As"   A,A A, A)	%A,,A5c                 j   dfd}||_         t        j                  dt              5  | j	                  t
        j                        5 }| j                  dg       ddd       ddd       | j                  t              t        j                               y# 1 sw Y   @xY w# 1 sw Y   DxY w)zZTest error passing done through errpipe_write where its not
        in the expected formats    ޭc                  <    | d   }t        j                  |       y)Nr&  r   )r   r   )r:   r)  
error_datas     r   	bad_errorzGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_error  s     HM HH]J/r   r,  r-  r.  N)r  r   rq  r/  rc   r   SubprocessErrorr#  rx   rs  r  rl   )r%   r1  r6  r  r5  s       @r   test_exception_errpipe_bad_dataz4POSIXProcessTestCase.test_exception_errpipe_bad_data  s     )
	 !*	ZZ/$57 	A"":#=#=> A!&&(>'?@A	A
 	d:&AKK(89A A	A 	As#    B)BB)B&	"B))B2/proc/self/statuszneed /proc/self/statusc                 Z   t        j                  ddgd      }|j                         D ]  }|j                  d      s|} n | j	                  d       t        j                  ddgd      }|j                         D ]  }|j                  d      s|} n | j                  d	       y )
Ncatr9  F)restore_signalss   SigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.rS  )r   rw   r  r  r   assertNotEqual)r%   default_proc_statusr%  default_sig_ign_maskrestored_proc_statusrestored_sig_ign_masks         r   test_restore_signalsz)POSIXProcessTestCase.test_restore_signals  s     )55+, %' (224 	DDy)'+$	D
 MMBC)66+, $ & )335 	Dy)(,%	 	02G!3 	 	4r   c                 "   	 t        j                  t        j                  ddgd      }t	        j
                  d      }t        |      }| j                  ||       y # t        $ r(}|j                  t        j                  k7  r Y d }~y d }~ww xY w)Nr   zimport os; print(os.getsid(0))T)start_new_sessionr   )r   rw   rX   rY   r   getsidintr=  PermissionErrorr  EPERM)r%   r|   
parent_sid	child_sidr  s        r   test_start_new_sessionz+POSIXProcessTestCase.test_start_new_session  s{    
	7,,^^T+KL&*,F 1JFI
I6  	ww%++% &	   (A 	B&B		Bsetpgidgetpgidz!no setpgid or getpgid on platformc                 "   	 t        j                  t        j                  ddgd      }t	        j
                  d      }t        |      }| j                  ||       y # t        $ r(}|j                  t        j                  k7  r Y d }~y d }~ww xY w)Nr   zimport os; print(os.getpgid(0))r   )process_group)r   rw   rX   rY   r   rN  rF  r=  rG  r  rH  )r%   r|   parent_pgid
child_pgidr  s        r   test_process_group_0z)POSIXProcessTestCase.test_process_group_0  s{    
	9,,^^T+LM"#%F **Q-KVJZ8  	ww%++% &	rL  setreuidzno setreuid on platformc                 2   t        j                         }|dk7  rdnd|g}t        j                  dk7  rdnd}t        '	 t	        j
                  |       |j                  |       |D ]  }dD ]  }| j                  ||      5  	 t        j                  t        j                  dd	g||      }t        |t              r t	        j
                  |      j                  }n|}t        |      }| j!                  ||       d d d          | j-                  t.              5  t        j0                  t2        d
       d d d        | j-                  t4              5  t        j0                  t2        t         j6                  t         j8                  d       d d d        t        =|:| j-                  t.              5  t        j0                  t2        |       d d d        y y y # t        $ r d }Y w xY w# t"        $ rn}	|	j$                  t$        j&                  k(  r+| j!                  |	j(                  t        j                         n| j+                  |	j(                         Y d }	~	dd }	~	ww xY w# 1 sw Y   xY w# 1 sw Y   >xY w# 1 sw Y   xY w# 1 sw Y   y xY w)N    darwinr  unknownr  )user	close_fdsr   zimport os; print(os.getuid())rx  rZ              )r  r   rZ  )r   geteuidrX   r  pwdgetpwnamr  r  subTestr   rw   rY   
isinstancer  pw_uidrF  rZ   rG  r  EACCESr  r  rc   rz   rh   r   OverflowErrorr  r   )
r%   uid
test_usersname_uidrZ  r[  r|   user_uid
child_userr  s
             r   	test_userzPOSIXProcessTestCase.test_user  s=    jjl"e|e<
"||x78Y? X&!!(+
  	?D* ?	\\ty\A ??!+!8!8!$!@!B%)*3	"5 &dC0'*||D'9'@'@H'+H%([
((X>%? ??	?. z* 	<!!/;	< }- 	M!!/&(iiRZZeM	M ;8/"":. F%%oHEF F 0;E     + :77ell2 ,,QZZH --ajj9	:? ?(	< 	<	M 	M
F Fsm   &G I')G-,AI'I4:J4JG*)G*-	I$	6A#I	I'I$	$I''I14I>J
Jz setreuid() available on platformc                     | j                  t              5  t        j                  t        d       d d d        y # 1 sw Y   y xY w)N  r\  rc   rz   r   rh   r   r$   s    r   test_user_errorz$POSIXProcessTestCase.test_user_error  s5    z* 	?!!/>	? 	? 	?	   ;Asetregidzno setregid() on platformc                 6   t        j                         }|dk7  rdndg}t               }t        |j	                  |       ||gz   D ]  }dD ]  }| j                  ||      5  	 t        j                  t        j                  ddg||      }t        |t              r t        j                  |      j                  }n|}t        |      }| j                  ||       d d d          | j'                  t(              5  t        j*                  t,        d       d d d        | j'                  t.              5  t        j*                  t,        t         j0                  t         j2                  d	
       d d d        t        :| j'                  t(              5  t        j*                  t,        |       d d d        y y # t         $ r&}	| j#                  |	j$                         Y d }	~	d }	~	ww xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)NrV  rW  r  )groupr[  r   zimport os; print(os.getgid())rx  rs  r]  )r  r   rs  )r   getegidr  r  r  ra  r   rw   rX   rY   rb  r  r  gr_gidrF  rZ   rG  r  r  rc   rz   rh   r   re  r  r   )
r%   gid
group_listr  rs  r[  r|   	group_gidchild_groupr  s
             r   
test_groupzPOSIXProcessTestCase.test_group  s   jjl"e|e7
')
?j)3%' 	AE* A	\\\C AA!+!8!8!$!@!B&+*3	"5 &eS1(+U(;(B(BI(-I&)&k((i@!A AA	A, z* 	=!!/<	= }- 	N!!/&(iiRZZuN	N ;"":. I%%oZHI I ' + 6))!**556A A&	= 	=	N 	N
I Is[   !G*#)F8AG*<G75:HH8	G'	G"	G*"G'	'G**G47H HHz setregid() available on platformc                     | j                  t              5  t        j                  t        d       d d d        y # 1 sw Y   y xY w)Nrm  rt  rn  r$   s    r   test_group_errorz%POSIXProcessTestCase.test_group_errorG  s9    z* 	@!!/?	@ 	@ 	@rp  	setgroupszno setgroups() on platformc                 f    t        j                         }|dk7  rdndg}| j                  ||       y )NrV  rW  rw  rx  )r   ru  _test_extra_groups_impl)r%   rw  rx  s      r   test_extra_groupsz&POSIXProcessTestCase.test_extra_groupsL  s0    jjl"e|e7
$$$Dr   c                 N    | j                  t        j                         g        y )Nr  )r  r   ru  r$   s    r   test_extra_groups_empty_listz1POSIXProcessTestCase.test_extra_groups_empty_listR  s    $$"$Er   c                   t               }t        |j                  |       	 t        j                  t
        j                  ddg|      }t        j                         }t        j                  |      }t        ?|D cg c]3  }t        |t              rt        j                  |      j                  n|5 }}n|}| j                  t!        |      t!        |             t        ;| j+                  t,              5  t        j.                  t0        |g       d d d        y y c c}w # t"        $ r6}	| j%                  |	j&                         | j)                  d       Y d }	~	d }	~	ww xY w# 1 sw Y   y xY w)Nr   z;import os, sys, json; json.dump(os.getgroups(), sys.stdout)extra_groupsz-setgroup() EPERM; this test may require root.)r  r  r  r   rw   rX   rY   r   	getgroupsjsonloadsrb  r  r  rv  rZ   setrG  r  r  r   rc   rz   rh   r   )
r%   rw  rx  r  r|   parent_groupschild_groupsgdesired_gidsr  s
             r   r  z,POSIXProcessTestCase._test_extra_groups_implV  sL   ')
?j)	C,,^^TRT!+-F LLNM::f-L)3 5$% ;EQ:LQ 6 6RS S  5  5  *S.L0AB;"":. A%%o4><AA A  5  	Kajj)MMIJJ	K A As)   (D& >8D!:E(&	E%/,E  E%(E1c                 X   | j                  t              5  t        j                  t        dg       d d d        | j                  t              5  t        j                  t        t
        j                  t
        j                  dg       d d d        y # 1 sw Y   bxY w# 1 sw Y   y xY w)Nrx  r  r]  )r  r   r  )rc   rz   r   rh   r   r   r  r   r$   s    r   &test_extra_groups_invalid_gid_t_valuesz;POSIXProcessTestCase.test_extra_groups_invalid_gid_t_valuesv  s    z* 	F!!/E	F z* 	8!!/&(iiRZZ05w8	8 	8	F 	F	8 	8s   B;B B B)umaskzPOSIX umask() is not available.c           	         d }	 t        j                         }t        j                  j	                  |d      }t        j                  t        j                  dd|dgd       t        j                  |      j                  dz  }d}| j                  ||t        |       d	t        |       
       |t        j                  |       y y # |t        j                  |       w w xY w)Nbeansr   zopen(z, 'w').close()+   )r  i  i  z != rS  )r   r  r   r   r   r   rh   rX   rY   statst_moderZ   octr   r  )r%   r  namer  expected_modes        r   
test_umaskzPOSIXProcessTestCase.test_umask  s     	&%%'F77<<0D !!^^TU4(.+IJ!
 ggdm++e3G!M]G$'$6#7tCL>!J  L !f% "v!f% "s   B/C C&c                    t        j                         5  t        j                  t        j
                  ddg      }|j                          d d d        | j                  j                   t        j                         y # 1 sw Y   5xY w)Nr   zimport os; os.abort())r   r$  r   rE   rX   rY   r*   rZ   r   r  SIGABRTrK   s     r   test_run_abortz#POSIXProcessTestCase.test_run_abort  sh    ((* 	  #..$"9"; <AFFH	 	!,,7		 	s   7B  B	c                 ,   t        j                  t        t        j                         d      }t        |      }| j                  d|j                                | j                  d|       | j                  t        t        j                        |       y )Nfake cmdr  SIG)r   rk   rF  r  r  r  rx   lowerr%   r   error_strings      r   "test_CalledProcessError_str_signalz7POSIXProcessTestCase.test_CalledProcessError_str_signal  si    ++S-@,@*M3x 	h 2 2 45 	e\*c&..)<8r   c                 j    t        j                  dd      }t        |      }| j                  d|       y )NiKir  zunknown signal 9876543.r   rk   r  rx   r  s      r   *test_CalledProcessError_str_unknown_signalz?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signal  s,    ++HjA3x/>r   c                 j    t        j                  dd      }t        |      }| j                  d|       y )Nrg  r  znon-zero exit status 2.r  r  s      r   $test_CalledProcessError_str_non_zeroz9POSIXProcessTestCase.test_CalledProcessError_str_non_zero  s,    ++Az:3x/>r   c                     t        j                  t        j                  ddgt         j                  d       }|5  | j                  |j                  j                         d       d d d        y # 1 sw Y   y xY w)Nr   r  c                  .    t        j                  dd      S )Nr   apple)r   putenvr4   r   r   <lambda>z3POSIXProcessTestCase.test_preexec.<locals>.<lambda>  s    		'70K r   )rC   
preexec_fn   appler@  rK   s     r   test_preexecz!POSIXProcessTestCase.test_preexec  si     cnndEF %/OO(K	M
  	8QXX]]_h7	8 	8 	8s   +A//A8c                 ^   d }	 t        j                  t        j                  ddg|      }| j	                  d       y # t         j
                  $ r*}| j                  t         j                  d       Y d }~y d }~wt        $ r)}| j                  d|j                  d          Y d }~y d }~ww xY w)	Nc                      t        d      )Nz'What if two swallows carried a coconut?rz   r4   r   r   raise_itz=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_it  s    FGGr   r   r   r  zEException raised by preexec_fn did not make it to the parent process.z)Expected a ValueError from the preexec_fncoconutr   )r   rE   rX   rY   r   r7  r  
_fork_execrz   rx   r:   )r%   r  rL   r  s       r   test_preexec_exceptionz+POSIXProcessTestCase.test_preexec_exception  s    	H	0  #..$!;,46A II / 0 )) 	AOO))?A A  	0MM)QVVAY//	0s!   (? B, A77B,B''B,c                       e Zd ZdZd Zd Zy)+POSIXProcessTestCase._TestExecuteChildPopenz3Used to test behavior at the end of _execute_child.c                 X    || _         t        j                  j                  | g|i | y r"   )	_testcaser   rE   r   )r%   testcaser:   r;   s       r   r   z4POSIXProcessTestCase._TestExecuteChildPopen.__init__  s'    %DN%%d<T<V<r   c           
         	 t        j                  j                  | g|i | t        d      D cg c]&  }t	        j
                  dt        j                        ( }}	 |D ]k  }| j                  j                  || j                  j                         | j                  j                         | j                  j                         fd       m 	 |D ]  }t	        j                  |        y c c}w # |D ]  }t	        j                  |        w xY w# t        d      D cg c]&  }t	        j
                  dt        j                        ( nc c}w }}	 |D ]k  }| j                  j                  || j                  j                         | j                  j                         | j                  j                         fd       m 	 |D ]  }t	        j                  |        w # |D ]  }t	        j                  |        w xY wxY w)N   	/dev/zeroz!At least one fd was closed early.rS  )r   rE   r<   r  r   r  O_RDONLYr  r   rB   r5  rC   rD   rJ   )r%   r:   r;   r  devzero_fdsrI  s         r   r<   z:POSIXProcessTestCase._TestExecuteChildPopen._execute_child  s   %  //FtFvF ).a2#$  "ww{BKK@ 2 2%) I22 "TZZ%6%6%8$++:L:L:N%)[[%7%7%9%;$G 3 II * %%2 * %% ).a2#$  "ww{BKK@ 2 2 2%) I22 "TZZ%6%6%8$++:L:L:N%)[[%7%7%9%;$G 3 II * %%k %%sB   #D +C. A0C3 3DH"+EHA0G$H$HHN)r1   r2   r3   r=   r   r<   r4   r   r   _TestExecuteChildPopenr    s    A	=	%r   r  r  z/dev/zero required.c           	          d }| j                  t        j                        5  | j                  | t        t        j
                  t        j
                  t        j
                  |       ddd       y# 1 sw Y   yxY w)z6Issue16140: Don't double close pipes on preexec error.c                  ,    t        j                  d      )Nz-force the _execute_child() errpipe_data path.)r   r7  r4   r   r   r  zWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_it  s    ,,CE Er   )rB   rC   rD   r  N)rc   r   r7  r  r   rF   )r%   r  s     r   0test_preexec_errpipe_does_not_double_close_pipeszEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes  sf    	E z99: 	E''o(oojoo)8 ( E	E 	E 	Es   AA22A;c                    t        j                         }	 t        j                          | j                  t        j                                t	        j
                  t        j                  ddgd        | j                  t        j                         d       t        j                          | j                  t        j                                t	        j
                  t        j                  ddgd        | j                  t        j                         d       |st        j                          y y # |st        j                          w w xY w)Nr   r   c                       y r"   r4   r4   r   r   r  zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>      r   r  z#Popen enabled gc when it shouldn't.c                       y r"   r4   r4   r   r   r  zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>	  r  r   zPopen left gc disabled.)
gc	isenableddisabler,   r   rW   rX   rY   enabler  )r%   enableds     r   test_preexec_gc_module_failurez3POSIXProcessTestCase.test_preexec_gc_module_failure  s     ,,.	JJLR\\^,OOS^^T26'35R\\^BD IIKOOBLLN+OOS^^T26'35OOBLLN,EF

 7

 s   DD6 6ErX  z!setrlimit() seems to fail on OS Xc                 R   	 ddl m}m}m}        }|\  }} |d|f       | j                  |||       	 t        j                  t        j                  ddgd        | j                  d       y # t        $ r}| j                  |       Y d }~d }~ww xY w# t        $ r Y y w xY w)Nr   )	getrlimit	setrlimitRLIMIT_NPROCr   r   c                       y r"   r4   r4   r   r   r  z@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>	  r  r   r  z.RLIMIT_NPROC had no effect; probably superuser)resourcer  r  r  r8  r   r   r   rW   rX   rY   BlockingIOError)r%   r  r  r  r   limitsr  hards           r   test_preexec_fork_failurez.POSIXProcessTestCase.test_preexec_fork_failure		  s    
	CC <(	D,D	*	<8	LOOS^^T26'35 MMJK  	MM#	  		s(   
A3 )B 3	B<BB	B&%B&c                    t        j                         \  }}t        |dd      5 }|j                  dt        j
                  z         |j                  dt        j                  z         d d d        t        j                  |d       t        j                  |      }|j                          t        j                  |       | j                  |j                  d       y # 1 sw Y   vxY wNwr  )r   z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
i  rU   )r   r]  r  r   r   
unix_shellrX   rY   r   chmodr   rE   r*   r^  rZ   r   )r%   rI  fnamefobjrL   s        r   test_args_stringz%POSIXProcessTestCase.test_args_string	  s    $$&	E"c"34 	'JJx'"4"445JJB~~& '	' 	U#	
		%r*	' 	's   AC  C)c                     | j                  t        t        j                  t        j
                  ddgd       | j                  t        t        j                  t        j
                  ddgd       y )Nr   rT   rU   startupinfocreationflagsrc   rz   r   rW   rX   rY   r$   s    r   r   z&POSIXProcessTestCase.test_invalid_args-	  sb    *joo>>457&( 	 	* 	*joo>>457(* 	 	,r   c                 :   t         j                  j                         }d|d<   t        j                  dgdt        j
                  |      }|5  | j                  |j                  j                         j                  d      d       d d d        y # 1 sw Y   y xY wNr  r   zecho $FRUITr   r   rC   r   s    	
r  
r   r   r   r   rE   rF   rZ   rC   r
  r  r%   r   rL   s      r   test_shell_sequencez(POSIXProcessTestCase.test_shell_sequence8	  s~    "!wm_A$.OO!')  	LQXX]]_22<@(K	L 	L 	Ls   :BBc                 8   t         j                  j                         }d|d<   t        j                  ddt        j
                  |      }|5  | j                  |j                  j                         j                  d      d       d d d        y # 1 sw Y   y xY wr  r  r  s      r   test_shell_stringz&POSIXProcessTestCase.test_shell_stringB	  s|    "!w]!$.OO!')  	LQXX]]_22<@(K	L 	L 	Ls   :BBc                    t        j                         \  }}t        |dd      5 }|j                  dt        j
                  z         |j                  dt        j                  z         d d d        t        j                  |d       t        j                  |      }t        j                  |       | j                  |d       y # 1 sw Y   \xY wr  )r   r]  r  r   r   r  rX   rY   r   r  r   rW   r^  rZ   )r%   rI  r  r  r\   s        r   test_call_stringz%POSIXProcessTestCase.test_call_stringL	  s    $$&	E"c"34 	'JJx'"4"445JJB~~& '	' 	__U#
		%R 	' 	's   ACCc           	         g }dD ]Z  }dD ]S  }t         j                  j                  ||      }t         j                  j                  |      sC|j	                  |       U \ |s| j                  d       d}t         j                  j                  |      r0t         j                  j                  |      s|j	                  |       |D ]v  }t        j                  d|dt        j                        }|5  | j                  |j                  j                         j                         t        |d             d d d        x y # 1 sw Y   xY w)	N)z/binz	/usr/bin/z/usr/local/bin)bashkshz"bash or ksh required for this testz/bin/shzecho $0T)rY   r   rC   r  )r   r   r   isfiler  r   islinkr   rE   rF   rZ   rC   r
  r  r  )r%   shellsr  r  shrL   s         r   test_specific_shellz(POSIXProcessTestCase.test_specific_shellY	  s   = 	&F' &WW\\&$/77>>"%MM"%&	&
 MM>?77>>"bggnnR&8MM" 	NB  r(29A N  !6!6!8%G:LMN N	NN Ns   4AEE	c                    t        j                   t         j                  t         j                        }	 t        j                  t
        j                  ddgdt        j                  t        j                  t        j                        }t        j                   t         j                  |       |j                  j                  d        t        ||      |  |S # t        j                   t         j                  |       w xY w)Nr   zif 1:
                                 import sys, time
                                 sys.stdout.write('x\n')
                                 sys.stdout.flush()
                                 time.sleep(30)
                                 Tr[  rB   rC   rD   r   )r  SIGINTdefault_int_handlerr   rE   rX   rY   rF   rC   r
  getattr)r%   methodr:   r  rL   s        r   _kill_processz"POSIXProcessTestCase._kill_processm	  s    
 mmFMM63M3MN	6  #..$ 9% "& ,0'1(2(2	9A MM&--5 	
a6D! MM&--5s   AC &C?)netbsdopenbsdz"Due to known OS bug (issue #16762)c                 L   t        j                  t        j                  ddgdt         j                  t         j                  t         j                        }|j
                  j                  d       t        j                  d        t        ||      |  |j                          y )Nr   zif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             Tr  r   )r   rE   rX   rY   rF   rC   r
  r>  r?  r  r   )r%   r  r:   rL   s       r   _kill_dead_processz'POSIXProcessTestCase._kill_dead_process	  sw    
 cnnd 5! "
 (,#-??$.OO$.OO5 	
a

16D!	r   c                     | j                  dt        j                        }|j                         \  }}| j	                  d|       | j                  |j                         d       y )Nsend_signals   KeyboardInterruptr   )r  r  r  r   rx   r=  r*   r%   rL   r  rD   s       r   test_send_signalz%POSIXProcessTestCase.test_send_signal	  sL    }fmm<MMO	6*F3AFFHa(r   c                     | j                  d      }|j                         \  }}| j                  |d       | j                  |j                         t        j
                          y )Nrp  r   )r  r   rZ   r*   r  SIGKILLr
  s       r   	test_killzPOSIXProcessTestCase.test_kill	  sM    v&MMO	6%FNN?3r   c                     | j                  d      }|j                         \  }}| j                  |d       | j                  |j                         t        j
                          y )N	terminater   )r  r   rZ   r*   r  SIGTERMr
  s       r   test_terminatez#POSIXProcessTestCase.test_terminate	  sM    {+MMO	6%FNN?3r   c                 D    | j                  dt        j                         y Nr	  )r  r  r  r$   s    r   test_send_signal_deadz*POSIXProcessTestCase.test_send_signal_dead	  s    v}}=r   c                 &    | j                  d       y Nrp  r  r$   s    r   test_kill_deadz#POSIXProcessTestCase.test_kill_dead	  s    'r   c                 &    | j                  d       y Nr  r  r$   s    r   test_terminate_deadz(POSIXProcessTestCase.test_terminate_dead	  s    ,r   c                     g }|D ]@  }t        j                  |      }t        j                  |      }|j                  |||f       B |S r"   )r   get_inheritabledupr  )r%   save_fdsr@  rI  inheritablesaveds         r   	_save_fdszPOSIXProcessTestCase._save_fds	  sM     	1B,,R0KFF2JEJJE;/0	1 
r   c                 t    |D ]3  \  }}}t        j                  |||       t        j                  |       5 y )N)r!  )r   dup2rJ   )r%   r@  rI  r"  r!  s        r   _restore_fdsz!POSIXProcessTestCase._restore_fds	  s3    &) 	"B{GGE2;7HHUO	r   c                    d}| j                  |      }|D ]  \  }}}|dk(  s|} n 	 |D ]  }t        j                  |        t        j                  t
        j                  ddg|t        j                  t        j                        j                         \  }}| j                  |d       | j                  |d       | j                  |       y # | j                  |       w xY w)Nr   r   rW  rA   r  r?  )r#  r   rJ   r   rE   rX   rY   rF   r   rZ   r&  )	r%   r@  rB   	saved_fdsrI  r"  r!  r   r   s	            r   check_close_std_fdsz(POSIXProcessTestCase.check_close_std_fds	  s     NN3'	&/ 	"B{Qw		) !'';)<
 #(oo(oo/ 0;{} C S(+S),i(Di(s   BC C%c                 (    | j                  dg       y rg   r)  r$   s    r   test_close_fd_0z$POSIXProcessTestCase.test_close_fd_0	        !%r   c                 (    | j                  dg       y Nr   r+  r$   s    r   test_close_fd_1z$POSIXProcessTestCase.test_close_fd_1	  r-  r   c                 (    | j                  dg       y )Nrg  r+  r$   s    r   test_close_fd_2z$POSIXProcessTestCase.test_close_fd_2	  r-  r   c                 *    | j                  ddg       y )Nr   r   r+  r$   s    r   test_close_fds_0_1z'POSIXProcessTestCase.test_close_fds_0_1	        !Q(r   c                 *    | j                  ddg       y )Nr   rg  r+  r$   s    r   test_close_fds_0_2z'POSIXProcessTestCase.test_close_fds_0_2	  r5  r   c                 *    | j                  ddg       y )Nr   rg  r+  r$   s    r   test_close_fds_1_2z'POSIXProcessTestCase.test_close_fds_1_2	  r5  r   c                 *    | j                  g d       y )N)r   r   rg  r+  r$   s    r   test_close_fds_0_1_2z)POSIXProcessTestCase.test_close_fds_0_1_2	  s     	  +r   c                 x   t        j                  d      }t        j                  d      }	 t        j                  d       t        j                  d       t        j                  t
        j                  ddg      j                          t        j                  |d       t        j                  |d       t        j                  |       t        j                  |       y# t        j                  |d       t        j                  |d       t        j                  |       t        j                  |       w xY w)z=Issue #15798: Popen should work when stdio fds are available.r   r   r   z*print('AssertionError:0:CLOEXEC failure.')N)	r   r  rJ   r   rE   rX   rY   r*   r%  )r%   	new_stdin
new_stdouts      r   test_small_errpipe_write_fdz0POSIXProcessTestCase.test_small_errpipe_write_fd	  s    FF1I	VVAY
	!HHQKHHQK
 NND@B CCG46 GGIq!GGJ"HHYHHZ  GGIq!GGJ"HHYHHZ s   AC! !AD9c                    t        d      D cg c]  }t        j                          }}	 |D cg c]  \  }}|	 }}}|D ]  \  }}t        j                  |        t        j
                  |d   d       t        j                  |d   dd       | j                  t        d            }	 t        |      D ]  \  }}t        j                  ||        t        j                  t        j                  ddg|d   |d   |d         }|j                          | j                  |       |D ]  }t        j                  |dd        t        j                   |d   d	      }	t        j                   |d   d	      j#                         }
| j%                  |	d
       | j%                  |
d       |D ]  }t        j&                  |        y c c}w c c}}w # | j                  |       w xY w# D ]  }t        j&                  |        w xY w)Nr   r      STDINr   r   Zimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")rg  rA   rD  	   got STDIN   err)r  r   r]  r   unlinkr   r6  r#  	enumerater%  r   rE   rX   rY   r*   r&  r
  r  rZ   rJ   )r%   r  tempsrI  r  temp_fdsr(  temp_fdrL   r   r   s              r   test_remapping_std_fdsz+POSIXProcessTestCase.test_remapping_std_fds
  s   -21X6!!#66(	,12yr52H2 # !	E		% ! HHXa[(+HHXa[!Q' uQx0I-#,X#6 )KBGGGR()
 $$cnndN&O #1+#A;#A;( !!), #Q"# ''(1+t,C''(1+t,224CS,/S&)  Q 726 !!),  s;   G	G* GA/G* -A,G BG* G* G''G* *Hc                    t        d      D cg c]  }t        j                          }}|D cg c]  \  }}|	 }}}	 |D ]  \  }}t        j                  |        | j                  t        d            }		 t        |      D ]  \  }}
t        j                  |
|        t        j                  |d       t        j                  |dd       t        j                  t        j                  ddg|||      }|j                          |D ]  }t        j                  |dd        t        j                  |d      }t        j                  |d      j!                         }| j#                  |	       | j%                  |d       | j%                  |d	       |D ]  }t        j&                  |        y c c}w c c}}w # | j#                  |	       w xY w# |D ]  }t        j&                  |        w xY w)
Nr   rA  r   r   rB  rA   rD  rC  rD  )r  r   r]  r   rE  r#  rF  r%  r   r6  r   rE   rX   rY   r*   r
  r  r&  rZ   rJ   )r%   stdin_no	stdout_no	stderr_nor  rG  rI  r  rH  r(  rI  rL   r   r   s                 r   check_swap_fdsz#POSIXProcessTestCase.check_swap_fds:
  s   -21X6!!#66(-.92uB..'	" !	E		% ! uQx0I-#,X#6 )KBGGGR() 8,1a( $$cnndN&O #$$& " 'BHHRA&' ggi.ggi.446!!),S,/S&)  Q 7.B !!),  s/   F4F9 9G :C(F? "5G ?GG G3c                     | j                  ddd       | j                  ddd       | j                  ddd       | j                  ddd       | j                  ddd       | j                  ddd       y )Nr   r   rg  )rO  r$   s    r   test_swap_fdsz"POSIXProcessTestCase.test_swap_fdsj
  sn    Aq!$Aq!$Aq!$Aq!$Aq!$Aq!$r   c                 j   | j                  t        d            }	 |D ]C  }t        j                         5 }t	        j
                  |j                         |       d d d        E t        t        d            t        |      z
  j                         }t	        j                  |       g d}i }t        ||      D ]  \  }}	||||	   <    t        j                  d      }
t        t        d            t        |      z
  j                         }t        j                  t        j                   d|
t#        |      gfi |}| j%                  |d       t        ||      D ]  \  }}	t	        j&                  |dt        j(                         t	        j*                  |d      }t-        t/        t0        |j3                  d                  }t        j                  d| d	| d
| d| d|	 d      }| j%                  |	g||        	 | j5                  |       y # 1 sw Y   xY w# | j5                  |       w xY w)Nr   rA   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   rD  r  z"
                    When testing z to z4 redirection,
                    parent descriptor z5 got redirected
                    to descriptor(s) z instead of descriptor z.
                )r#  r  r   r   r   r%  r5  r  r  rJ   zipr  r  r   rW   rX   rY   r  rZ   r6  SEEK_SETr
  r  maprF  r  r&  )r%   from_fdsto_fdsr(  from_fdffd_to_close	arg_namesr;   to_fdr   
skipped_fdr\   
read_bytesread_fdsrT  s                   r   #_check_swap_std_fds_with_one_closedz8POSIXProcessTestCase._check_swap_std_fds_with_one_closedr
  s
   NN58,	&	)# 1++- 1GGAHHJ01 11 uQx=3x=8==?KHH[!5IF"%h"7 3+2y'(3 ?? $ D eAh-#f+5::<J#..$c*o!N +#)+BR#"%h"7 	9!R[[1WWWd3
C):):7)C DEoo +""*4x 8''.i 0&&.Z/Fug N' 
   %(C8	9 i(I1 1H i(s#   H %HF%H H	H H2c                     t        j                  t        d      d      D ]8  }t        j                  t        d      d      D ]  }| j	                  ||        : y )Nr   rg  )	itertoolscombinationsr  permutationsr`  )r%   rV  rW  s      r   !test_swap_std_fds_with_one_closedz6POSIXProcessTestCase.test_swap_std_fds_with_one_closed
  sV    !..uQx; 	KH#00q1= K886JK	Kr   c                    d }	 t        j                  t        |       | j                  d       y # t        $ rD}| j                  t         j                         | j                  t        |      d       Y d }~y d }~wt         j                  $ rD}| j                  t         j                         | j                  t        |      d       Y d }~y d }~ww xY w)Nc                      t        d      )N   surrogate:r  r4   r   r   preparezCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.prepare
  s    /00r   r  z1Expected ValueError or subprocess.SubprocessErrorrh  z!Exception occurred in preexec_fn.)r   rW   r   r   rz   r  r  rZ   r  r7  assertIsNotNone)r%   ri  r   s      r   test_surrogates_error_messagez2POSIXProcessTestCase.test_surrogates_error_message
  s    	1	KOO"$ IIIJ  	;j334SX'9::)) 	L  !6!67SX'JKK	Ls    2 	C:A::C:CCc                    dD ]Y  \  }}|j                  dd      }dt        |      z  }t        j                  j	                         }|||<   d|d<   |}t        j                  t        j                  d|g|      }|j                  d	      }| j                  |j                  d      t        |             |j                  dd      }d
t        |      z  }t        j                  j	                         }|||<   t        j                  t        j                  d|g|      }|j                  d	      }| j                  |j                  d      t        |             \ y )N))testu   abc)u   test42r  r  z&import os; print(ascii(os.getenv(%s)))CLC_ALLr   r   s   
z'import os; print(ascii(os.getenvb(%s))))r  rs  r   r   r   r   rw   rX   rY   r   rZ   r  r  )r%   keyvalueencoded_valuescriptr   decoded_valuerC   s           r   test_undecodable_envz)POSIXProcessTestCase.test_undecodable_env
  s9   G 	KJC!LL2CDM >S	IF**//#CCH  CM!M,,v.F ]]7+FV]]73U=5IJ **W&78C>cJF**//#C$CH,,v.F ]]7+FV]]73U=5IJ5	Kr   c                 4   t        j                  t        d         }t        t        dd        }t         j                  j                  t        d         \  }}t        j                  |      }t        j                  |g|z         }| j                  |d       d|dj                  |      j                  d      fz  }t        j                  |d      }| j                  |d       t         j                  j                         }||d<   t        j                  |g|z   |	      }| j                  |d       t         j                  j                         }t        j                  |      |d
<   t        j                  |g|z   |	      }| j                  |d       y )Nr   r   s   '%s' %s r   Trp  PATHr   s   PATH)r   r   r   r  r   r  r   rW   rZ   r   r  r   r   environb)	r%   abs_programr:   r   programexitcoder  r   envbs	            r   test_bytes_programz'POSIXProcessTestCase.test_bytes_program
  sG   kk/!"45OAB'(oa&89g++g& ??K=#561% K$)>)>w)GHH??3d31% jjooF??G9T>s;1% {{!D)W??G9T>t<1%r   c                 
   t        j                  dd      }t        j                  dd      }t        j                  t        j
                  |gt        j                  t        j                  t        j                  d      }| j                  |j                  d       t        j                  t        j
                  |gt        j                  d      }|j                         \  }}t        t        t        |j                  d	                  }t        |j                  j                         |j                  j                         |j                   j                         g      }| j#                  ||z  d
|d||z         y )Nzinput_reader.pysubprocessdatasubdirfd_status.pyF)rB   rC   rD   r[  r   rC   r[     ,zExpected no fds from z to be open in child, found )r   findfiler   rE   rX   rY   rF   r   r   r  rU  rF  r  rB   r5  rC   rD   r,   )	r%   sleeper	fd_statusp1p2r|   error
result_fdsunwanted_fdss	            r   test_pipe_cloexecz&POSIXProcessTestCase.test_pipe_cloexec
  s%   ""#4=MN$$^<LM	s~~w7$.OOJOO%/__G 	,s~~y9%/__G (S&,,t"456
BHHOO-ryy/?/?/AII,,.0 1 	l2  ,Z,-FH	Ir   c                   
 t        j                  dd      }t        j                  dd      }d}|dz  dz   }t        j                  t        j
                  |gt        j                  t        j                  d	      
t        j                  t        j
                  ||g
j                  t        j                  d	      | j                  
j                         | j                  j                         
fd
}fd}| j                  |       | j                  |       
j                  j                  |       
j                  j                          t        j                  j                  gg g d      \  }}}	| j                  |d       | j                  j                  j!                         |       
j                  j                          j                  j                          y )Nzqcat.pyr  r  zqgrep.pys   zxcvbn      
F)rB   rC   r[  c                  F    	  j                          y # t        $ r Y y w xY wr"   r  ProcessLookupError)r  s   r   kill_p1zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1  #    %     	  c                  F    	  j                          y # t        $ r Y y w xY wr"   r  )r  s   r   kill_p2zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2  r  r  r  zThe child hung)r   r  r   rE   rX   rY   rF   rC   r   r*   rB   r   rJ   selectr  rZ   r
  )r%   qcatqgrepsubdatar	  r  r  	readfilesignored1ignored2r  r  s             @@r   test_pipe_cloexec_real_toolsz1POSIXProcessTestCase.test_pipe_cloexec_real_tools  sa   	2BC  4DE{U"s~~t4$.OOJOO(-/ s~~ug>$&IIjoo(-/ 	  	
	
 	  
t
(.ryyk2r2(N%	8X	#34)40
		
		r   c                   
 t        j                  dd      }t        j                         }| j	                  t        j
                  |d          | j	                  t        j
                  |d          t        |      
t        d      D ]e  }t        j                  t        j                  t        j                        }| j	                  t        j
                  |       
j                  |       g 
D ]  }t        j                  |d        t        j                  t        j                   |gt        j"                  d	      }|j%                         \  }}t        t'        t(        |j+                  d
                  }| j-                  |
z  
d       t        j                  t        j                   |gt        j"                  d	      }|j%                         \  }}t        t'        t(        |j+                  d
                  }| j/                  |
z  d       | j1                  d|d       t        
fdt        d      D              }	t        j                  t        j                   |gt        j"                  d|	      }|j%                         \  }}t        t'        t(        |j+                  d
                  }| j/                  ||	z
  
z  d       | j1                  d|d       y )Nr  r  r  r   r   	   TFr  r  zSome fds were closedzSome fds were left openzSubprocess failedc              3   >   K   | ]  }j                           y wr"   )r  ).0r  rA  s     r   	<genexpr>z6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>R  s     ;Q(,,.;s   r  rC   r[  pass_fdsz'Some fds not in pass_fds were left open)r   r  r   rk  r   rJ   r  r  r  devnullr  addset_inheritabler   rE   rX   rY   rF   r   rU  rF  r  rZ   r,   rx   )r%   r  r@  r  rI  rL   r|   ignoredremaining_fdsfds_to_keeprA  s             @r   test_close_fdsz#POSIXProcessTestCase.test_close_fds.  s:   $$^<LM	ggi#a&)#a&)s8q 	AR[[1BOOBHHb)LL	
  	)Br4(	) cnni8$.OOuF--/CV\\$%78918/	1 cnni8$.OOtE--/CV\\$%78912	4a(;< ;%(;;cnni8$.OOt&13 --/CV\\$%789-+5AB	Da(;<r   freebsdz/devz/dev/fdz.Requires fdescfs mounted on /dev/fd on FreeBSDc                 `   t        j                  dd      }t        j                  t        j
                  dt        j                  d|z        gt        j                        }|j                         \  }}|j                         }| j                  t        |      dd|z  	       t        t        t        |d
   j!                         j#                  d                  }t        t        t        |d   j!                         j#                  d                  }| j%                  ||z  d	       y)z;Confirm that issue21618 is fixed (may fail under valgrind).r  r  r  r   aK  
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

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

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

        max_fd_open = max(open_fds)

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

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        rt   rg  z(expected exactly two lines of output:
%rrS  r   r  r   zSome fds were left open.N)r   r  r   rE   rX   rY   r  r  rF   r   r  rZ   r  r  rU  rF  r  r  r,   )r%   r  rL   r|   unused_stderroutput_lines
opened_fdsr  s           r   %test_close_fds_when_max_fd_is_loweredz:POSIXProcessTestCase.test_close_fds_when_max_fd_is_lowered^  s   
 $$^<LM	 cnndHOO/	^ _/	05 0` #-//a03d !"((*\*AH6Q 	 	SS,q/"7"7"9"?"?"EFG
C\!_%:%:%<%B%B4%HIJ37 	 	9r   r  r   c           	         t        j                  dd      }t               }t        d      D ]  }t	        j
                         }| j                  t        j                  |d          | j                  t        j                  |d          t	        j                  |d   d       t	        j                  |d   d       |j                  |        |D ]  }t        j                  t        j                  |gt        j                  d|f      }|j                         \  }}t        t!        t"        |j%                  d	                  }	||hz
  }
| j'                  ||	d
       | j)                  |	|
z  d       | j+                  t,              5 }| j)                  t        j.                  t0        d|f             d d d        | j'                  dt3        j4                                y # 1 sw Y   2xY w)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  r  r  r   rk  r   rJ   r  updater   rE   rX   rY   rF   r   rU  rF  r  rx   r,   assertWarnsr/  rW   r   r  warning)r%   r  rA  r  r@  rI  rL   r|   r  r  to_be_closedcontexts               r   test_pass_fdsz"POSIXProcessTestCase.test_pass_fds  s   $$^<LM	5q 	!A'')COOBHHc!f-OOBHHc!f-s1vt,s1vt,OOC 	!  	HB  #..)!<(24+-&2A  mmoOFGCd); <=M#rd?LMM"m-IJ]\957 !!.1 ;W  '"'2&": ;; MM0#goo2FG%	H; ;s   -G))G2	c                 2   t        j                  dd      }t        j                         \  }}| j	                  t        j
                  |       | j	                  t        j
                  |       t        j                  |d       t        j                  |d       ||f}t        j                  |g}|t        t        t        |            z  }t        j                  |t        j                  d|      }|j                         \  }}t!        t        t"        |j%                  d                  }	| j'                  |	t!        |      d|z         | j'                  t        j(                  |      d       | j'                  t        j(                  |      d       y )	Nr  r  r  TFr  r  z	output=%a)r   r  r   rk  r   rJ   r  rX   rY   r  rU  r  r   rE   rF   r   r  rF  r  rZ   r  )
r%   rt  r!  non_inheritabler  r:   rL   r|   r  r@  s
             r   test_pass_fds_inheritablez.POSIXProcessTestCase.test_pass_fds_inheritable  s5   !!.9IJ')wwy$_+./2
;-
?E21'Sh'((T$.OOt&.0 --/#c6<<-./ 	c(m[6-AB 	++K8$?++O<eDr   c                 L   t        j                  dd      }g }t        d      D ]e  }t        j                  t        j
                  t        j                        }| j                  t        j                  |       |j                  |       g t        j                         \  }}| j                  t        j                  |       | j                  t        j                  |       |j                  d|       t        j                  t        j                  |g|d   |d   |d   d|      5  t        j                   |d	      }d
d
d
       j#                  d      D ch c]  }t%        |       }	}| j'                  |	h dt)        |      z  d|       y
# 1 sw Y   UxY wc c}w )z7Regression test for https://bugs.python.org/issue32270.r  r  r  rg  r   r   T)rB   rC   rD   r[  r  rD  Nr  >   r   r   rg  zoutput=)r   r  r  r   r  r  O_RDWRr   rJ   r  rk  insertr   rE   rX   rY   r
  r  rF  rZ   	frozenset)
r%   r  r  r  rI  stdout_rstdout_wr|   numr@  s
             r   test_pass_fds_redirectedz-POSIXProcessTestCase.test_pass_fds_redirected  sK   $$^<LM	q 	 ARYY/BOOBHHb)OOB	 
  WWY((+(+8$s~~y9$,QK%-a[%-a[(,'/1 	- WWXt,F	- $*<<#56Cs3x66i)H*==
?ST	- 	- 7s   *FF!Fc                     t        j                  t        j                  d      5 }t	        j
                  t        ||      }|j                          d d d        y # 1 sw Y   y xY w)Nr+)rC   rB   rH   r  r   r  r   rE   r   r*   r%   inoutrL   s      r   %test_stdout_stdin_are_single_inout_fdz:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fd  K    WWRZZ& 	%  (-U<AFFH	 	 	   -AA$c                     t        j                  t        j                  d      5 }t	        j
                  t        ||      }|j                          d d d        y # 1 sw Y   y xY w)Nr  r   r  r  s      r   &test_stdout_stderr_are_single_inout_fdz;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fd  sK    WWRZZ& 	%  (-e=AFFH	 	 	r  c                     t        j                  t        j                  d      5 }t	        j
                  t        ||      }|j                          d d d        y # 1 sw Y   y xY w)Nr  )rD   rB   r  r  s      r   %test_stderr_stdin_are_single_inout_fdz:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fd  r  r  c                 >   t        j                  dd      }t        j                  t        j
                  |gt        j                  t        j                        }|j                         \  }}| j                  d|j                  d|j                  d      z         y )Nzsigchild_ignore.pyr  r  r   r   z6sigchild_ignore.py exited non-zero with this error:
%sr   )r   r  r   rE   rX   rY   rF   r   rZ   r   r  )r%   sigchild_ignorerL   rC   rD   s        r   test_wait_when_sigchild_ignoredz4POSIXProcessTestCase.test_wait_when_sigchild_ignored  s}    !**+?2BDcnno>$.OOJOOMALL +:w/+0 	1r   c           	         t        j                  d      }t        j                  t        j
                  ddgt        j                  d      }|j                  }| j                  |j                         	 | j                  |j                  d      d       | j                  | |j                  |gg g d      d          |j                          y # |j                          w xY w)	Nr  r   z$import sys;sys.stdout.write("apple")r   )rC   rO   r  s   applg        )r   import_moduler   rE   rX   rY   rF   rC   r   rJ   rZ   r
  rx   r  r*   )r%   r  rL   rY  s       r   test_select_unbufferedz+POSIXProcessTestCase.test_select_unbuffered(  s     ,,X6cnnd:; %/OO%&	(
 HH 	QVVAY0MM!]V]]A3B<Q?@FFHAFFHs   5A
C C"c           	      x   t        j                  t        j                  ddgt         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         t        |      }|j                  }t        j                  dt        f      5  d }d d d        t        r | j                  t         j                          y | j#                  |t         j                   D cg c]  }t        |       c}       y # 1 sw Y   gxY wc c}w )Nr   z import sys, time;time.sleep(0.2)r   r   )r   rE   rX   rY   rF   r   rC   rJ   rD   idpidr   check_warningsResourceWarningr(   r  r)   rx   )r%   rL   identr  os        r   test_zombie_fast_process_delz1POSIXProcessTestCase.test_zombie_fast_process_del9  s    
 cnnd01 %/OO$.OO	5
 	''1ee++R,AB 	A	 j001 MM%1C1C!DA"Q%!DE	 	 "Es   D+D7
+D4c           	         t        j                  t        j                  ddgt         j                  t         j                        }| j                  |j                  j                         | j                  |j                  j                         t        |      }|j                  }t        j                  dt        f      5  d }t        j                          d d d        t!        j"                  |t$        j&                         t(        r | j+                  t         j,                         n7| j/                  |t         j,                  D cg c]  }t        |       c}       t1        j2                  d       | j5                  t6              5  t        j                  t8        t         j                  t         j                        5 }	 d d d        d d d        | j5                  t6        t         j:                  |d       t(        r | j+                  t         j,                         y | j=                  |t         j,                  D cg c]  }t        |       c}       y # 1 sw Y   xY wc c}w # 1 sw Y   xY w# 1 sw Y   xY wc c}w )Nr   zimport time;time.sleep(3)r   r   rR  r   )r   rE   rX   rY   rF   r   rC   rJ   rD   r  r  r   r  r  r   
gc_collectr   rp  r  r  r(   r  r)   rx   r>  r?  rc   r  r   waitpidr   )r%   rL   r  r  r  ry  s         r   !test_leak_fast_process_del_killedz6POSIXProcessTestCase.test_leak_fast_process_del_killedQ  s    cnnd./ %/OO$.OO	5
 	''1ee++R,AB 	!A 	! 	V^^$j001 MM%1C1C!DA"Q%!DE 	

3w' 	!!/)3)3: =A	 	'2::sA6j001UJ4F4F$GqRU$GH5	! 	! "E 	 	 %Hs<   I	I(
9I9I-I9J
I%-I6	2I99Jc                    t        j                  dd      }t        j                  d      | j	                  t        j
                         t        j                  t        j                  |gt        j                  dfd      }|j                         \  }}t        t        t        |j                  d                  }| j!                  |       y )	Nr  r  r  r   Tc                  0    t        j                  d       S r/  )r   r%  )rI  s   r   r  zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>  s    2 r   )rC   r[  r  r  )r   r  r   r  r   rJ   r   rE   rX   rY   rF   r   r  rU  rF  r  r   )r%   r  rL   r|   r  r  rI  s         @r   test_close_fds_after_preexecz1POSIXProcessTestCase.test_close_fds_after_preexec|  s    $$^<LM	 VVAY"%cnni8$.OOt(>@ --/CV\\$%789]+r   c                 
   dd l }t        j                         }	 d }t        j                          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 ]q  \  }}}}| j	                  t
              5 }|j                  ||dd||d	d	d	d	d
dddddddg dd	|d       d d d        | j                  dt        j                               s 	 |st        j                          y y # 1 sw Y   IxY w# |st        j                          w w xY w)Nr   c                       y r"   r4   r4   r   r   r  z5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>  r  r   rm  s   exe   envs   argTr4   rx  r   rg  r   r  Fztakes exactly)_posixsubprocessr  r  r  rc   r   r1  r   r  rl   r  )	r%   r  
gc_enabledfuncr:   exe_listr  env_listr   s	            r   test_fork_execz#POSIXProcessTestCase.test_fork_exec  s3    	 \\^
 	  DIIK F8TF843TF84F8SF84F8T3/	2 F-hX &&y1 %S$..hb#xBB1adAr1be%%    #cmm2DE-F0 

 %% %$ 

 s$   AC) -(C/C) C&	"C) )Dc                 $   dd l } G d d      }t        j                         }	 t        j                          ddddd |d	       |d
      ffD ]  }| j	                  t
        dj                  |            5 }|j                  dgdgd|d dgddddd	d
dddddd d d dd d       d d d        | j                  dt        j                                	 |st        j                          y y # 1 sw Y   IxY w# |st        j                          w w xY w)Nr   c                       e Zd ZdZd Zd Zy)JPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadIntTc                     || _         y r"   )rr  )r%   rr  s     r   r   zSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__  s	    "
r   c                 L    | j                   rd| _         | j                  S t        )NF)firstrr  rz   r$   s    r   __int__zRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__  s     ::!&DJ::%  r   N)r1   r2   r3   r  r   r  r4   r   r   BadIntr    s    E#!r   r  )rx  rg  r   r  r   )r  r  )      *   l            )r   r  )r  ro  ro  r  r   rg  zfds_to_keep={}rS  s   falseTr  rx  r   r  r  )r  r  r  r  rc   rz   r  r1  rx   r  rl   r  )r%   r  r  r  r  rn   s         r   %test_fork_exec_sorted_fd_sanity_checkz:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check  s&    	 	! 	! \\^
	IIK !#F1I&  ? &&",33K@ ' B 
$EF$..!
XJk4&BB1adAdD"d$
$ mS-=>'?* 

 
$ 
$ 

 s$   AC6 7+C*"/C6 *C3	/C6 6Dc                 L   t        j                  t              }|5  t        j                  j                  |d      5 }t        |j                  _        |j                          |j                  j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrB   )r   rE   r   r   rq  rr  BrokenPipeErrorrJ   r  r   assert_called_withr%   ry  mock_proc_stdins      r   ,test_communicate_BrokenPipeError_stdin_closezAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close  s     0 	74::$$T73 	70?O!!-!!446	7 	7 	7 	7 	7 	7s#   !BA B=BB	BB#c                    t        j                  t              }|5  t        j                  j                  |d      5 }t        |j                  _        |j                  d       |j                  j                  d       |j                  j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrB      stuff)r   rE   r   r   rq  rr  r   r   r  r   r  rJ   r  s      r   ,test_communicate_BrokenPipeError_stdin_writezAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_write  s     0 	<4::$$T73 	<0?O!!-X&!!99(C!!99;		< 	< 	< 	< 	< 	<s#   !B6AB*B6*B3	/B66B?c                 @   t        j                  t        j                  dgt         j                  t         j                        }|5  t
        j                  j                  |d      5 }t        t        j                  d      5 }t        |j                  _        |j                         |j                  _        |j!                  d       |j                  j#                          d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)N-hr   rB   wbr  )r   rE   rX   rY   rF   r   rq  rr  r  r   r  r   r  r  r5  r  r   r  )r%   ry  r  dev_nulls       r   ,test_communicate_BrokenPipeError_stdin_flushzAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flush  s      6&0oo'18  	<4::$$T73 	<RZZ&	<*20?O!!-2://2CO""/X&!!99;	< 	< 	< 	< 	< 	< 	< 	< 	<s=   !D(DA C<#D+D<DDD	DDc                    t        j                  t        j                  dgt         j                  t         j                        }|5  t
        j                  j                  |d      5 }t        |j                  _
        |j                  d       |j                  j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr	  r   rB   i  ra   )r   rE   rX   rY   rF   r   rq  rr  r   rJ   r  r   r  r  s      r   9test_communicate_BrokenPipeError_stdin_close_with_timeoutzNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeout  s      6&0oo'18  	<4::$$T73 	<0?O!!-S)!!99;		< 	< 	< 	< 	< 	<s%   !C(AB;*C;C	 CCN
W_STOPCODEzneed _testcapi.W_STOPCODEc                 Z   t         }t        j                  |      }t        j                  |j
                  d       t        j                  d      }t        j                  d|j
                  |f      5  |j                         }ddd       | j                  d       y# 1 sw Y   xY w)zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.r   r}  r   r,  r  N)r   r   rE   r   wait_processr  	_testcapir  r   rq  r*   rZ   )r%   r:   ry  statusr   s        r   test_stoppedz!POSIXProcessTestCase.test_stopped  s    
 % 	TXX2%%a(ZZ/txx>PQ 	%J	% 	R(	% 	%s   5B!!B*c                    t        j                  t              }t        j                  |j
                  d       | j                  |j                         t        j                  d      5 }|j                  t        j                         d d d        j                          | j                  |j                         y # 1 sw Y   5xY w)Nr   r  zos.kill)r   rE   r   r   r  r  r  r   r   rq  r	  r  r  assert_not_calledrj  )r%   ry  	mock_kills      r   test_send_signal_racez*POSIXProcessTestCase.test_send_signal_race  s     0 	TXX2 	$//*ZZ	" 	-iV^^,	-
 	##% 	T__-	- 	-s   + B??Cc                 ~   t        j                  t        j                  ddg      }|j                  s|j                          |j                  st        j                  j                  |dd       5  d |_        |j                  t        j                         d d d        |j                          y # 1 sw Y   xY w)Nr   zexit(1)r  c                       y r"   r4   r4   r   r   r  z=POSIXProcessTestCase.test_send_signal_race2.<locals>.<lambda>=  r  r   )new)r   rE   rX   rY   r   r  r   rq  rr  r	  r  r  rp  rK   s     r   test_send_signal_race2z+POSIXProcessTestCase.test_send_signal_race24  s     cnndI>? ,,FFH ,, ZZq&l; 	*ALMM&..)	* 	
	* 	*s   3'B33B<c                     t        j                  t        j                  ddgt         j                        }	 	 |j                  d       y # t         j                  $ r Y nw xY w.)Nr   z+import os, time; os.close(1), time.sleep(2)rt   r`   ra   )r   rE   rX   rY   rF   r   rd   r%   ry  s     r   1test_communicate_repeated_call_after_stdout_closezFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_closeB  se    !N!P'18    -,, 	 s   A A"!A"c                     dt          d}t        d|      \  }}}| j                  |j                         d       | j	                  d|       y )Nzif 1:
        import atexit
        import subprocess

        def dummy():
            pass

        class AtFinalization:
            def __del__(self):
                print("OK")
                subprocess.Popen(zu, preexec_fn=dummy)
                print("shouldn't be printed")
        at_finalization = AtFinalization()
        r   s   OKs0   preexec_fn not supported at interpreter shutdown)r   r	   rZ   r  rx   )r%   r   r  r   r   s        r   test_preexec_at_exitz)POSIXProcessTestCase.test_preexec_at_exitM  sT    
" #2!2 3	 'tT23e,I3Or   )rr1   r2   r3   r&   r  r  r  r  r   rE   r#  r   rq  r2  r8  rn  r  r   r   r_  rB  rK  r  r  rS  rk  ro  r{  r}  r  r  r  r  r(   r  r  r  r  r  r  r  r  r  r  rX   r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r&  r)  r,  r0  r2  r4  r7  r9  r;  r?  rJ  rO  rQ  r`  re  rk  rv  r  r  r  r  r  st_devr  r   requires_mac_verr  r  r  r  r  r  r  r  r  r  r  cpython_onlyr  r  r  r  r  r  r  r  r  r  r!  r#  __classcell__r  s   @r   r
  r
  8  s   >!BBB*J,,  TZZ'(A )A  TZZ'(: ):* X__(;<<-/4/4,7  XY/JGB	4J<>9>9  XZ02KL1F M1Ff X__WR,.PQ? R? XZ02MN'I O'IR X__WR,.PQ@ R@ X[13OPE QE
 X[13OPF QFA@8 X__Y:gb'&:":68&8&(8	9?
?
	80 %!1!1 %2 X__446KLE ME* X__ "EGLGL(+	,LL!N(2 X__S\\,,-BC9;;*)44>(-
)2&&&))),
!*+Z+`%()XK
K&K:&6I.'R-=` X__S\\,,Y7 IRWWV_++wrwwy/A/H/HHEGI9GI9` Wb!$H %HBE<U4	1"F0)IV," % %N ' 'R7<<
< X$. >$Y=46)6).,	Pr   r
  zWindows specific testsc                       e Zd Zd Zd Zd Zd Zd Zej                  d        Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Win32ProcessTestCasec                     d}d}t        j                         }||_        ||_        t        j                  t
        |       y )Nr   r   r  )r   STARTUPINFOdwFlagswShowWindowrW   r   )r%   STARTF_USESHOWWINDOWSW_MAXIMIZEr  s       r   test_startupinfoz%Win32ProcessTestCase.test_startupinfod  s@      ! ,,.2"- 	$/	1r   c                 p    d}d}t        j                  ||      }t        j                  t        |       y )Nr   r   )r-  r.  r  )r   r,  rW   r   )r%   STARTF_USERSHOWWINDOWr0  r  s       r   test_startupinfo_keywordsz.Win32ProcessTestCase.test_startupinfo_keywordss  s8     !" ,,)#
 	$/	1r   c                 h   t        j                         }t         j                  |_        t         j                  |_        t        d      D ]M  }t        }t        t        j                  d      5 }t        j                  ||t         j                  |      }|5  |j                          d d d        | j                  |j                  d       d d d        | j                  |j                  t         j                         | j!                  |j"                         | j!                  |j$                         | j!                  |j&                         | j                  |j
                  t         j                         | j                  |j(                  dg i       P y # 1 sw Y   xY w# 1 sw Y   xY w)Nrg  r  )rC   rD   r  r   handle_list)r   r,  r/  r-  SW_HIDEr.  r  r   r  r   r  rE   r   r   rZ   r   r  	hStdInput
hStdOutput	hStdErrorlpAttributeList)r%   r  r  r  nullry  s         r   test_startupinfo_copyz*Win32ProcessTestCase.test_startupinfo_copy  s]    ,,.(==","4"4 q 	OA!Cbjj#& 5$!''/3/9/@/@4?A  '$$&'  !45 [00'<<>k334k445k334[44j6H6HI[88=":MN#	O' '5 5s$   .*F(F)$F(F%!F((F1	c                     d}t         j                  j                  d       t        j                  t         j
                  dz   |       y )N   z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)"r  )rX   rD   r   r   rW   rY   )r%   CREATE_NEW_CONSOLEs     r   test_creationflagsz'Win32ProcessTestCase.test_creationflags  s8    

CD=>&8	:r   c                 v    | j                  t        t        j                  t        j
                  ddgd        y )Nr   rT   c                       yr/  r4   r4   r   r   r  z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>  r  r   r  r  r$   s    r   r   z&Win32ProcessTestCase.test_invalid_args  s1    *joo>>457%. 	 	0r   c                      G d dt               }| j                  t              5  t        j                  t
         |              d d d        y # 1 sw Y   y xY w)Nc                       e Zd ZdZy)4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)r1   r2   r3   keysr4   r   r   BadEnvrF    s    Dr   rH  r   )dictrc   r   r   rE   r   )r%   rH  s     r   test_issue31471z$Win32ProcessTestCase.test_issue31471  sC    	T 	y) 	<_&(;	< 	< 	<s   !AAc                 x    t        j                  t        j                  ddgd      }| j	                  |d       y )Nr   rT   T)r[  rU   rV   r[   s     r   r  z#Win32ProcessTestCase.test_close_fds  s5    __cnnd8:(,. 	R r   c           	         dd l }t        j                         }| j                  t        j                  |d          | j                  t        j                  |d          g }|D ]8  }t        j
                  |d       |j                  |j                  |             : t        j                  t        j                  ddj                  |d         gt        j                  d      }|j                         \  }}| j                  |j                   d       t#        |j%                                t        j                  t        j                  ddj                  |d         gt        j                  t        j                  d      }|j                         \  }}| j                  |j                   d       | j'                  d	|       g }t        j(                         }	d
|i|	_        t        j                  t        j                  ddj                  |d         gt        j                  t        j                  |	d      }|j                         \  }}| j                  |j                   d       | j'                  d	|       t-        j.                  dt0        f      5  t        j(                         }	d
|d d  i|	_        t        j                  t        j                  ddj                  |d         gt        j                  t        j                  |	d      }|j                         \  }}| j                  |j                   d       d d d        y # 1 sw Y   y xY w)Nr   r   Tr   z2import msvcrt; print(msvcrt.open_osfhandle({}, 0))Fr  )rC   rD   r[  s   OSErrorr6  )rC   rD   r  r[  z.*overriding close_fds)r5  r   rk  r   rJ   r  r  get_osfhandler   rE   rX   rY   r  rF   r   rZ   r   rF  r  rx   r,  r;  r   r  r/  )
r%   r5  r@  r  rI  rL   rC   rD   r6  r  s
             r   test_close_fds_with_stdioz.Win32ProcessTestCase.test_close_fds_with_stdio  s   ggi#a&)#a&) 	5Br4(NN6//34	5 cnndRYYZabcZdeg$.OOuF q)FLLNcnndRYYZabcZdeg$.OOJOOW[] q)j&)  ,,.'4k&B#cnndRYYZabcZdeg$.OOJOO)4F q)j&) ++-E-;-= > 		.$002K+8'!**EK'  #..$"V"]"]^efg^h"i"k(2
-8EKA ]]_NFFQ\\1-		. 		. 		.s   B)MMc                 p    t        j                         }i |_        t        j                  t        |       y )Nr  r   r,  r;  rW   r   r%   r  s     r   test_empty_attribute_listz.Win32ProcessTestCase.test_empty_attribute_list  s)     ,,.&(#$/	1r   c                 t    t        j                         }dg i|_        t        j                  t        |       y )Nr6  r  rP  rQ  s     r   test_empty_handle_listz+Win32ProcessTestCase.test_empty_handle_list  s.     ,,.'4b&9#$/	1r   c                    t         j                  j                         }d|d<   t        j                  dgdt        j
                  |      }|5  | j                  d|j                  j                                d d d        y # 1 sw Y   y xY wNphysalisr   r  r   r  s   physalis	r   r   r   r   rE   rF   rx   rC   r
  r  s      r   r  z(Win32ProcessTestCase.test_shell_sequence  sm    "$weWA$.OO!')  	8MM+qxx}}7	8 	8 	8s   +BBc                    t         j                  j                         }d|d<   t        j                  ddt        j
                  |      }|5  | j                  d|j                  j                                d d d        y # 1 sw Y   y xY wrV  rX  r  s      r   r  z&Win32ProcessTestCase.test_shell_string  sk    "$wU!$.OO!')  	8MM+qxx}}7	8 	8 	8s   +BB
c                 ,   dD ]  }t         j                  j                         }d|d<   t        j                  ddt        j
                  ||      }|5  | j                  d|j                  j                         |       d d d         y # 1 sw Y   xY w)N)ansioemrW  r   r  r   )r   rC   r   r   rX  )r%   encr   rL   s       r   test_shell_encodingsz)Win32ProcessTestCase.test_shell_encodings  s    " 	@CZZ__&F(F7O  a(2%+*-/A  @j!((--/3?@ @	@@ @s   ,B

B	c                 t    t        j                  t        j                  dz         }| j	                  |d       y )Nz -c "import sys; sys.exit(47)"rU   rV   r[   s     r   r  z%Win32ProcessTestCase.test_call_string  s.    __S^^=> ?R r   c                    t        j                  t        j                  ddgt         j                  t         j                  t         j                        }|5  |j
                  j                  d        t        ||      |  |j                         \  }}| j                  |d       |j                         }d d d        | j                  d       y # 1 sw Y   xY w)Nr   zif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             time.sleep(30)
                             rA   r   r   r   )r   rE   rX   rY   rF   rC   r
  r  r   rZ   r*   r=  )r%   r  r:   rL   r  rD   r   s          r   r  z"Win32ProcessTestCase._kill_process!  s    cnnd 5! " $.??$.OO$.OO5  	" HHMM!GAv%IAvVS)J	" 	J*	" 	"s   A CCc                    t        j                  t        j                  ddgt         j                  t         j                  t         j                        }|5  |j
                  j                  d       t        j                  d        t        ||      |  |j                         \  }}| j                  |d       |j                         }d d d        | j                  d       y # 1 sw Y   xY w)Nr   zif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             rA   r   r   r  )r   rE   rX   rY   rF   rC   r
  r>  r?  r  r   rZ   r*   )r%   r  r:   rL   r  rD   r\   s          r   r  z'Win32ProcessTestCase._kill_dead_process6  s    cnnd 5! " $.??$.OO$.OO5  
	 HHMM!JJqMGAv%IAvVS)B
	 	R 
	 
	s   A5C''C0c                 D    | j                  dt        j                         y r  )r  r  r  r$   s    r   r  z%Win32ProcessTestCase.test_send_signalM  s    =&..9r   c                 &    | j                  d       y r  r  r$   s    r   r  zWin32ProcessTestCase.test_killP  s    6"r   c                 &    | j                  d       y r  rd  r$   s    r   r  z#Win32ProcessTestCase.test_terminateS  s    ;'r   c                 D    | j                  dt        j                         y r  )r  r  r  r$   s    r   r  z*Win32ProcessTestCase.test_send_signal_deadV  s    v~~>r   c                 &    | j                  d       y r  r  r$   s    r   r  z#Win32ProcessTestCase.test_kill_deadY  s    'r   c                 &    | j                  d       y r  r  r$   s    r   r  z(Win32ProcessTestCase.test_terminate_dead\  s    ,r   N)r1   r2   r3   r1  r4  r=  rA  r   r   r&  rJ  r  rN  rR  rT  r  r  r^  r  r  r  r  r  r  r  r  r  r4   r   r   r*  r*  a  s    11 O6:0 < <!0.d1188
@!+*!.:#(?(-r   r*  c                       e Zd Z G d dej                        Zej                  j                  ej                  d      d        Z	d Z
d Zd Zd Zd	 Zy
)	MiscTestsc                   &     e Zd ZdZg Z fdZ xZS )MiscTests.RecordingPopenz<A Popen that saves a reference to each instance for testing.c                 Z    t        |   |i | | j                  j                  |        y r"   )r  r   instances_createdr  )r%   r:   r;   r  s      r   r   z!MiscTests.RecordingPopen.__init__e  s)    Gd-f-""))$/r   )r1   r2   r3   r=   rn  r   r'  r(  s   @r   RecordingPopenrl  a  s    J	0 	0r   ro  _communicatec                 H   t         |_        	 t        j                  j	                  t
        j                  d      5 }t         |_        t        j                  j	                  t
        d| j                        5  | j                  t               5   |t        j                  ddgfdt
        j                  i| ddd       ddd       |j                  dd D ]6  }| j                  |t        j                  d      d	|j                          8 g }|j                  D ]-  }|t        j                  d
      k(  s|j                  |       / | j!                  |j"                  d|j                         | j%                  t'        |      d|j                         ddd       | j                  j(                  j+                         }|j-                          |j/                          | j%                  g | j                  j(                         y# 1 sw Y   ZxY w# 1 sw Y   _xY w# 1 sw Y   xY w# | j                  j(                  j+                         }|j-                          |j/                          | j%                  g | j                  j(                         w xY w)a  Fake a SIGINT happening during Popen._communicate() and ._wait().

        This avoids the need to actually try and get test environments to send
        and receive signals reliably across platforms.  The net effect of a ^C
        happening during a blocking subprocess execution which we want to clean
        up from is a KeyboardInterrupt coming out of communicate() or wait().
        _waitrE   r   zLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')rC   Nr   ra   z.no open-ended wait() after the first allowed: g      ?rg  rS  )KeyboardInterruptr  r   rq  rr  r   rE   ro  rc   rX   rY   r_  r  r=  rW   r  assertLessEqual
call_countrZ   r  rn  r  rp  r*   )r%   popenermock__communicater;   
mock__waitrW   sigint_callsr  s           r   _test_keyboardinterrupt_no_killz)MiscTests._test_keyboardinterrupt_no_killi  sY    ):%	H"":#3#3W= @ *;
&ZZ&&z7'+':':< E**+<= E"M!N E (2'9'9E >DEEE '55ab9 <D'' $))D"9L)889;<<
  "&55 2Dtyy66$++D12 $$Z%:%:A)3)B)B % D  \!2A%/%>%> ! @-@4 ));;??AGLLNLLNR!4!4!F!FG/E EE E	@ @4 ));;??AGLLNLLNR!4!4!F!FGs[   .H5 ;H)6H+H7H?A:H):A"H)H5 HHH&	!H))H2.H5 5A,J!c                 F    | j                  t        j                  d       y NgT㥛 @ra   )rz  r   rW   r$   s    r   #test_call_keyboardinterrupt_no_killz-MiscTests.test_call_keyboardinterrupt_no_kill  s    ,,Z__e,Lr   c                 F    | j                  t        j                  d       y r|  )rz  r   r   r$   s    r   "test_run_keyboardinterrupt_no_killz,MiscTests.test_run_keyboardinterrupt_no_kill  s    ,,Z^^U,Kr   c                 ,    d }| j                  |       y )Nc                  R    t        j                  | i |5 }t        # 1 sw Y   y xY wr"   )r   rE   rs  )r:   r;   unused_processs      r   popen_via_context_managerz[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager  s-    !!4262 (n''( (s   &)rz  )r%   r  s     r   .test_context_manager_keyboardinterrupt_no_killz8MiscTests.test_context_manager_keyboardinterrupt_no_kill  s    	( 	,,-FGr   c                    | j                  t        j                  d      d       | j                  t        j                  d      d       d }	 t	        j
                         }t        j                  j                  |d      }t        j                  t        rdnd|z         \  }}| j                  |d       |t        j                  |       y y # |t        j                  |       w w xY w)Nz
echo xyzzyxyzzy)r   r  r   ztype zcat r   )rZ   r   	getoutputgetstatusoutputr   r  r   r   r   r(   r=  rmdir)r%   dirr  r  r|   s        r   test_getoutputzMiscTests.test_getoutput  s    --l;WE33LA%	' 	""$C77<<U+D'77%6T9;NFF* s s   A)C C*c                 F   h d}t        t        j                        }t               }ddl}t        j                  j                         D ]@  \  }}|j                  d      rt        ||j                  f      r0|j                  |       B | j                  |||z
         y)z*Ensure that __all__ is populated properly.>   r  r_  rl  Handler  r   Nr  )r  r   __all__r  __dict__itemsr  rb  
ModuleTyper  rZ   )r%   intentionally_excludedexportedpossible_exportsr  r  rr  s          r   test__all__zMiscTests.test__all__  s    !Rz))*5%..446 	'KD%s#%%"2"2!45  &	' 	#36L#LMr   N)r1   r2   r3   r   rE   ro  r   rq  rr  rz  r}  r  r  r  r  r4   r   r   rj  rj  _  s_    0)) 0 
ZZz''8)H 9)HVMLH&Nr   rj  PollSelectorz!Test needs selectors.PollSelectorc                       e Zd Zd Zd Zy)ProcessTestCaseNoPollc                     t         j                  | _        t        j                  t         _        t
        j                  |        y r"   )r   _PopenSelectororig_selector	selectorsSelectSelectorr?   r&   r$   s    r   r&   zProcessTestCaseNoPoll.setUp  s,    '66$-$<$<
!d#r   c                 X    | j                   t        _        t        j	                  |        y r"   )r  r   r  r?   r/   r$   s    r   r/   zProcessTestCaseNoPoll.tearDown  s    $($6$6
!  &r   Nr0   r4   r   r   r  r    s    $
'r   r  zWindows-specific testsc                   F     e Zd Z fdZ fdZd Zd Zd Zd Zd Z	 xZ
S )CommandsWithSpacesc                     t         |           t        j                  dd      \  }}|j	                         | _        t        j                  |d       t        j                  |       y )Nz.pyzte stsV   import sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	r  r&   r   r]  r  r  r   r   rJ   )r%   rY  r  r  s      r   r&   zCommandsWithSpaces.setUp  sP    ##E735[[^

 c 	
 	r   c                 `    t        j                  | j                         t        |           y r"   )r   r^  r  r  r/   r  s    r   r/   zCommandsWithSpaces.tearDown  s    
		$**r   c                    t         j                  |d<   t        j                  |i |}|5  | j                  |j                  j                         j                  d      d| j                  z         d d d        y # 1 sw Y   y xY w)NrC   mbcsz2 [%r, 'ab cd'])r   rF   rE   rZ   rC   r
  r  r  )r%   r:   r;   rL   s       r   with_spaceszCommandsWithSpaces.with_spaces  sp    %??xd-f- 	hhmm%%f-$**,	 	 	s   AA;;Bc           	      n    | j                  dt        j                  d| j                  dddd       y )N"" "ab cdr   rp  r  rX   rY   r  r$   s    r   test_shell_string_with_spacesz0CommandsWithSpaces.test_shell_string_with_spaces  s-    S^^TZZ-46=> 	 	@r   c                 `    | j                  t        j                  | j                  dgd       y )Nr  r   rp  r  r$   s    r   test_shell_sequence_with_spacesz2CommandsWithSpaces.test_shell_sequence_with_spaces  s$    #..$**g>aHr   c           	      j    | j                  dt        j                  d| j                  ddd       y )Nr  r  r  r  r$   s    r   test_noshell_string_with_spacesz2CommandsWithSpaces.test_noshell_string_with_spaces  s$    S^^TZZ$& 	'r   c                 \    | j                  t        j                  | j                  dg       y )Nr  r  r$   s    r   !test_noshell_sequence_with_spacesz4CommandsWithSpaces.test_noshell_sequence_with_spaces  s    #..$**g>?r   )r1   r2   r3   r&   r/   r  r  r  r  r  r'  r(  s   @r   r  r    s)    @
I'
@r   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)ContextManagerTestsc                    t        j                  t        j                  ddgt         j                  t         j                        5 }| j                  |j                  j                         d       | j                  |j                  j                         d       d d d        | j                  j                  j                         | j                  |j                  j                         y # 1 sw Y   TxY w)Nr   zAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');r   s   stdouts   stderr)r   rE   rX   rY   rF   rZ   rC   r
  rD   r  r  r   s     r   	test_pipezContextManagerTests.test_pipe  s    s~~t => &0__%/__6 	<
 :>T[[--/;T[[--/;	< 	**+**+	< 	<s   AC..C7c                     t        j                  t        j                  ddg      5 }	 d d d        | j	                  j
                  d       y # 1 sw Y   &xY w)Nr   zimport sys; sys.exit(100)d   )r   rE   rX   rY   rZ   r   r   s     r   r  z#ContextManagerTests.test_returncode  sQ    s~~t:< = 	@D	 	#.		 	s   AAc                     t        j                  t        j                  ddgt         j                        5 }|j                  d       | j                  |j                  d       d d d        y # 1 sw Y   y xY w)Nr   z2import sys;sys.exit(sys.stdin.read() == 'context')r   s   contextr   rS  r   s     r   r  z*ContextManagerTests.test_communicate_stdin  si    s~~tHI $.??4 	1 8<Z(T__a0	1 	1 	1s   .A..A7c                     | j                  t              5  t        j                  t        t        j
                  t        j
                        5 }	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   )rc   r   r   rE   r   rF   r   s     r   r   z%ContextManagerTests.test_invalid_args  sd    12 	!!/)3)3: =A	 	 	 	s#   9A.A"A."A+	'A..A7c                    t        j                  t        t         j                  t        j
                  dz        }|j                         }|j                  j                  dt        j
                  z         | j                  |j                         | j                  t        |j                  ddd       | j                  |j                  d       | j                  |j                  j                          y)z9Broken pipe error should not prevent wait() (Issue 21619)rg  )rB   rO   rh  Nr   )r   rE   r   rF   r   r  	__enter__rB   r   r  r   rc   r  __exit__rZ   r  r  r   s     r   test_broken_pipe_cleanupz,ContextManagerTests.test_broken_pipe_cleanup!  s    &0oo(/(=(=a(?A ~~ 	

 5 556$//*'4==$dC!,

))*r   N)r1   r2   r3   r  r  r  r   r  r4   r   r   r  r    s    ,/1+r   r  __main__)Grn  r   rm  r   test.supportr   r   r   r   test.support.script_helperr	   r   rX   r  rH   rb  r   r  r   r>  r  r  r  r  r  r   rC  r  r  r  test.support.os_helperr
   r  r8  r_  r  rl  PGOro  has_subprocess_supportr  r(   r  r   r  NotADirectoryErrorrG  r   rY   r   r   TestCaser    	Exceptionr6   rE   r8   r?   r  r  r  r
  r  r*  rj  r  r  r  r  r1   mainr4   r   r   <module>r     s      ( & " ( 7  
  	  	           	   + ;;
(

9
::%%
(

=
>>\\W$	 @I I)');_M >>40( 8$$  &	 	>j.. >q-l q-h/BOl BOJ	c 23eP< eP 4ePP1 Y 89{-< {- :{-zaN!! aNH WY78:'O ':' Y 89(@, (@ :(@V3+, 3+l zHMMO ex  I
  
C  
C
EsB   H H H- H; HHH*)H*-H87H8;I