
    7bh                       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    >/opt/python-3.12.12/usr/lib/python3.12/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   s\    "**		 +!""$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y)PopenExecuteChildRaisesc                     t        d      )NzForced Exception for Test)r6   )r%   argskwargss      r   _execute_childz&PopenExecuteChildRaises._execute_childo   s     !<==r   N)r1   r2   r3   r<   r4   r   r   r8   r8   k   s    >r   r8   c                   N	   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d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej@                  e!d      d        Z" ej@                  e!d      d        Z# ej@                  e!d      d         Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z* ej@                  e!d'      d(        Z+ ej@                  e!d'      d)        Z,d* Z- ej@                  e.j^                  e.j`                  k7  d+      d,        Z1 ej@                  e.j^                  e.j`                  k7  d+       ej@                   e2jf                         d-      d.               Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d: Z@d; ZAd< ZBd= ZCd> ZD ej                  eFxr	  eGeFd?      d@      dA        ZH ej                  eFxr	  eGeFd?      d@      dB        ZIdC ZJ ej                  e.j                  dDk(  dE      dF        ZL ej@                  e.j                  dDk(  dG       ej@                   e2j                  dH      dIk(  dJ       ej@                   eNdKL      dM      dN                      ZO ej@                   e2j                  dH      dIk(  dO       ej@                   eNdKL      dM      dP               ZPdQ ZQdR ZR ej                  e.j                  dDk(  dE      dS        ZSdT ZTdU ZUdV ZVdW ZWdX ZXdY ZYdZ ZZd[ Z[d\ Z\d] Z]d^ Z^d_ Z_d` Z`da Zadb Zbdc Zcdd Zdde Zedf Zfdg Zgdh Zhdi Zidj Zjdk Zkdl Zldm Zmdn Zn eoj                  do      dp        Zqdq Zrdr Zsds Ztdt Zudu Zvdv Zwdw Zxdx Zy ej                   eGezdy      dz       ej                   eGe{d{      d|       ej                   eGe{d}      d~      d                      Z| ej                  e{j                  j                  d e{j                         z        d      d        Z ej@                  e!d      d        Z ej@                  e!d      d        Zd Z ej@                   e2j                  d       d       ej
                  d      d               Z ej                   eGed      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assertIsInstancerA   ioBufferedIOBaserB   rC   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   )rA   rB   rC   bufsize)r   rD   r   rE   rF   rA   rG   	RawIOBaserB   rC   rI   r*   rJ   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   TimeoutExpiredrV   rW   rX   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   rY   rZ   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rR   )	rb   r   CalledProcessErrorrg   rW   rX   rY   	exceptionr   r%   cs     r   test_check_call_nonzeroz'ProcessTestCase.test_check_call_nonzero   sa    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rB   z1check argument not allowed, it will be overriddenFcheck)r   check_outputrW   rX   assertInassertRaisesRegex
ValueErrorr%   outputs     r   test_check_outputz!ProcessTestCase.test_check_output   s    ((79gv&##JDF##Bt4F ##JCE##Be4E E	F FE Es   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)   )	rb   r   rj   rv   rW   rX   rY   rk   r   rl   s     r   test_check_output_nonzeroz)ProcessTestCase.test_check_output_nonzero   s`    z<<=##^^T+DEG > 	//3 >=ro   c                     t        j                  t        j                  ddgt         j                        }| j                  d|       y )Nr   $import sys; sys.stderr.write('BDFL')rC   rr   )r   rv   rW   rX   STDOUTrw   rz   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())rA      PEAR)tempfileTemporaryFile
addCleanuprI   writeseekr   rv   rW   rX   rw   )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   rv   rW   rX   rw   rz   s     r   test_check_output_input_argz+ProcessTestCase.test_check_output_input_arg   s7    ((IK 	gv&r   c                 z    	 t        j                  t        j                  ddgd       }| j	                  d|       y )Nr   3import sys; print('XX' if sys.stdin.read() else '')r   s   XXr   rv   rW   rX   assertNotInrz   s     r   test_check_output_input_nonez,ProcessTestCase.test_check_output_input_none   s<    J((FH 	'r   c                 z    t        j                  t        j                  ddgd d      }| j	                  d|       y )Nr   r   T)r   textXXr   rz   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   rz   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   rz   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')rs   z-Expected ValueError when stdout arg supplied.rB   r   )rb   ry   r   rv   rW   rX   rB   failrw   rk   r:   r%   rm   r{   s      r   test_check_output_stdout_argz,ProcessTestCase.test_check_output_stdout_arg   st    z*a,,^^T+EF::'F IIEF	 +
 	h 0 0 34 +*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rA   r   7Expected ValueError when stdin and input args supplied.rA   r   )r   r   r   rI   r   r   rb   ry   r   rv   rW   rX   r   rw   rk   r:   r%   r   rm   r{   s       r   &test_check_output_stdin_with_input_argz6ProcessTestCase.test_check_output_stdin_with_input_arg  s    ##%!


z*a,,^^T+EFG-F IIOP	 +
 	gq{{//23gq{{//23 +*s   ';C==Dc                     | j                  t        j                        5 }t        j                  t        j
                  ddgd      }d d d        y # 1 sw Y   y xY w)Nr   import time; time.sleep(3600)r_   r`   )rb   r   rc   rv   rW   rX   r   s      r   test_check_output_timeoutz)ProcessTestCase.test_check_output_timeout  sH    z889Q,,^^T46!F :99s   )AA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   rV   rW   rX   rY   )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_stderrrb   	TypeErrorr   rD   __init____code__co_argcountrY   getvalue)r%   sargcounttoo_many_argss       r   test_invalid_argsz!ProcessTestCase.test_invalid_args!  s     $$&!i)9)9AN!''0099EEHC8a<0MDi)9)9JMJ	 '
 	r* '&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")rB   rC   )r   rD   rW   rX   rE   r   rB   rI   rC   r*   rY   rA   rJ   s     r   test_stdin_nonezProcessTestCase.test_stdin_none+  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   rD   rW   rX   rE   r   rB   rI   rC   communicaterY   r   rstripr%   coderK   outerrs        r   test_stdout_nonez ProcessTestCase.test_stdout_none4  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   rA   rB   )r   rD   rW   rX   rE   r   rB   rI   rA   r*   rY   rC   rJ   s     r   test_stderr_nonez ProcessTestCase.test_stderr_noneK  ss    cnnd4EF)zH'&	4(r   c                     |dgz   }t        j                  |fi |}|j                          | j                  d|j                         y NrS   rT   )r   rD   r*   rY   r   )r%   pre_argsr;   r:   rK   s        r   _assert_pythonzProcessTestCase._assert_pythonT  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   rX   )r   pathjoindirnamerW   rX   r   r%   r   s     r   test_executablezProcessTestCase.test_executable\  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   rW   rX   r   fsencoder   s     r   test_bytes_executablez%ProcessTestCase.test_bytes_executableg  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   rW   rX   r   r
   r   s     r   test_pathlike_executablez(ProcessTestCase.test_pathlike_executablem  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   )rW   rX   r   rb   NONEXISTING_ERRORSNONEXISTING_CMD)r%   r   s     r    test_executable_takes_precedencez0ProcessTestCase.test_executable_takes_precedences  sI     NND)H%,--x%4Q%7 	 	9r   z"executable argument replaces shellc                 H    | j                  g t        j                  d       y NT)rX   shell)r   rW   rX   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   rW   rX   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
   rW   rX   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  s'     !!#&99; '&&s   4=c                     t         j                  j                  t        j                        }t         j                  j                  |      S r"   )r   r   realpathrW   rX   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)rB   rT   )r   rD   rE   r   rB   rI   r*   rY   r   r   r   normcasereaddecode)r%   expected_cwd
python_argr;   rK   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  rW   rX   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  rW   rX   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  rW   rX   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_cwdrb   FileNotFoundErrorr   rD   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
!Y /1A1A)l,/1A1A)l	  ;,,Z8JZD "!!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   rX   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  rb   r  r   rD   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
!Y /1A1A)l	  ;++I6IY
	B "!!s   6ACCzTest is not venv-compatiblec                     | j                         \  }}| j                  |      }| j                  |dt        j                  |       y )Nr"  r#  )r  r   r  rW   rX   )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   rW   rX   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   rD   rW   rX   rE   rA   r   rI   r*   rY   r   rJ   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   r.  r   r   )r   r   r   rI   filenor   r   lseekr   rD   rW   rX   r*   rY   r   r%   r   drK   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 r1  )r   r   r   rI   r   r   r   rD   rW   rX   r*   rY   r   r%   r   rK   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")rs      oranger   rD   rW   rX   rE   rY   rB   r  rJ   s     r   test_stdout_pipez ProcessTestCase.test_stdout_pipe%  sS    cnndBD *1 QXX]]_i8 QQ   +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;  rs   r      r<  r   r   r   rI   r2  r   rD   rW   rX   r*   r   r3  rY   r  r4  s       r   test_stdout_filedesz#ProcessTestCase.test_stdout_filedes-  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;  rs   r   r<  r   r   r   rI   r   rD   rW   rX   r*   r   rY   r  r8  s      r   test_stdout_fileobjz#ProcessTestCase.test_stdout_fileobj9  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   rD   rW   rX   rE   rY   rC   r  rJ   s     r   test_stderr_pipez ProcessTestCase.test_stderr_pipeD  sS    cnndFH *1 QXX]]_m< QQr?  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   rH  r   r   rA  rI  rB  r4  s       r   test_stderr_filedesz#ProcessTestCase.test_stderr_filedesL  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   rH  r   r   rI  rE  r8  s      r   test_stderr_fileobjz#ProcessTestCase.test_stderr_fileobjX  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   rD   rW   rX   rE   r   rY   r   r%   rK   rB   rC   s       r   ,test_stderr_redirect_with_no_stdout_redirectz<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectc  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   rD   rW   rX   rE   r   rY   rB   r  rJ   s     r   test_stdout_stderr_pipez'ProcessTestCase.test_stdout_stderr_pipex  s_    cnnd;<
 %/OO$.$5$57 QXX]]_n= QQs   +A<<Bc                 6   t        j                         }| j                  |j                         t	        j
                  t        j                  ddg||      }|j                          |j                  d       | j                  |j                         d       y )Nr   rT  r   r   rU  rE  r8  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)rs   )r   rD   rW   rX   DEVNULLr*   rY   rB   rJ   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   rD   rW   rX   r\  r*   rY   rC   rJ   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   rD   rW   rX   r\  r*   rY   rA   rJ   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!")rA   rB   rC   pipesizer   )r   pipefcntlrb  rI   r   get_pagesizeunittestSkipTestr   rD   rW   rX   rE   rA   rB   rC   rY   r2  r   killr*   )r%   test_pipe_rtest_pipe_wpipesize_defaultrg  pagesize_defaultrK   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 6 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   re  rf  )r   rD   rW   rX   rE   r   rh  ri  rb  rI   rY   rA   r2  rB   rC   rm  )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*, 		- T HHTNHHTN 		- Ts>   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"))rB   r   r<  )
r   r   r   r   rD   rW   rX   rE   r   rY   r%   r   rK   rB   rC   s        r   test_envzProcessTestCase.test_env  s}    ""ws~~t FG &0__"(	* ./]]_NFFVY/* * *s   &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   rD   rE   r   rY   strip)r%   r   rK   rB   _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)Nc                 Z    	 d| v xs% d| v xs | dk(  xs | j                  d      xs | dk(  S )N	VERSIONER__CF
LD_PRELOADSANDBOXLC_CTYPE)
startswith)ns    r   is_env_var_to_ignorez<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignore*  sI    L  1$ $! $%$)*i)@$O%r   r   z)import os; print(list(os.environ.keys()))r  )r   rD   rW   rX   rE   r   evalr  rF   listrY   )r%   r  rK   rB   rC   child_env_namesks          r   test_empty_envzProcessTestCase.test_empty_env   s     	:	% s~~tJL%/__">AB]]_NFF"6<<>2O!!/48*9 ?/Q&:1&=  !/O ?_b1> >?> >s   AB6B1B61B66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  )rB   rC   r   zSTDOUT:asciireplacezSTDERR:r   s   fruit=orange)rW   rX   platformr   rD   rE   r   r   r   verboseprintr  rY   r  )r%   r   cmdrK   rB   rC   s         r   test_one_environment_variablez-ProcessTestCase.test_one_environment_variable=  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# )rW   rX   rb   ry   r   rD   )r%   r  s     r   test_invalid_cmdz ProcessTestCase.test_invalid_cmdQ  s{    nnt#z*c401 + z*cnndI>? +*	 +* +*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   rb   ry   r   rD   r   rW   rX   rE   r   rY   r  s        r   test_invalid_envz ProcessTestCase.test_invalid_env[  sZ   "%.!"z*_&9 + "5wz*_&9 + "!(~z*_&9 + "(ws~~t FG &0__"(	* ./]]_NFFV_5* *% +* +* +** *s/   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   rb   ry   r   rD   r   )r%   r   s     r   test_win32_invalid_envz&ProcessTestCase.test_win32_invalid_envy  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   rP  rJ   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")rs   	   pineappler   rD   rW   rX   rE   r   rY   rQ  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  rQ  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())r@      bananar  )r   rD   rW   rX   rE   r   rB   rI   rC   rA   r   rY   rQ  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   rA   rB   rC   r   g333333?r`   s   pineapple
pear
)
r   rD   rW   rX   rE   rb   rc   r   rY   encoderQ  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));rs   g?r`   i   )
r   rD   rW   rX   rE   rb   rc   r   rY   len)r%   rK   rB   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FTrA   rB   rC   )
r   rE   rD   r   r   rA   
assertTrueclosedrB   rC   )r%   
stdin_pipestdout_pipestderr_pipeoptionsrK   s         r   test_communicate_pipe_fd_leakz-ProcessTestCase.test_communicate_pipe_fd_leak  s    'J,#0K G!+5??(",6OO)",6OO)" "((DGDAMMOww*7xx+8xx+8# $1  - (r   c                     t        j                  t        j                  ddg      }|j	                         \  }}| j                  |d        | j                  |d        y )Nr   rS   )r   rD   rW   rX   r   rY   rQ  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())r@      a)r   rh  rI   r   rD   rW   rX   r   PIPE_MAX_SIZErE   r   rB   rC   rA   r   rY   )r%   xyrK   string_to_writerB   rC   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())r@   r  s   splits   bananasplitr   )r   rD   rW   rX   rE   r   rB   rI   rC   rA   r   r   rY   rQ  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   rA   rB   Tzline1
zline3
zline2
   zline4
line5
line6
line7
line8)rW   rX   	SETBINARYr   rD   rE   rA   r   flushrY   rB   readlinerI   r   r  )r%   r:   extra_kwargrK   s       r    test_universal_newlines_and_textz0ProcessTestCase.test_universal_newlines_and_text  s?   NNDy(&&'( :K   >':??*2JOO*5t*= >A i(  !2!2!4i@i(/  !2!2!4!*,  q!1!*,  !D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   )rC   rB   r   z#line2
line4
line5
line6
line7
line8)r   rD   rW   rX   r  rE   r   rB   rI   rC   r   rY   rQ  s       r   #test_universal_newlines_communicatez3ProcessTestCase.test_universal_newlines_communicate=  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   )rA   r   line1
line3
r   )r   rD   rW   rX   r  textwrapdedentrE   r   rY   r   rQ  s       r   )test_universal_newlines_communicate_stdinz9ProcessTestCase.test_universal_newlines_communicate_stdinV  ss    cnnd.:X__ N" ># #$ $.??013 ==)9:q)r   c                     t        j                  t        t         j                  t         j                  d      }|j	                          | j                  |j                  d       y )NT)rA   rB   r   r   )r   rD   r   rE   r   rY   r   rJ   s     r   .test_universal_newlines_communicate_input_nonez>ProcessTestCase.test_universal_newlines_communicate_input_noned  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)rA   rC   rB   r   r  r   zline1
line2
line3
line4
line5
zeline2
eline6
eline7
)r   rD   rW   rX   r  r  r  rE   r   rB   rI   rC   r   rY   r   r  r  rQ  s       r   7test_universal_newlines_communicate_stdin_stdout_stderrzGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrp  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   )rA   rB   r   r   r   z1
2
3
4)rW   rX   r   rD   rE   r   rY   )r%   r   r   r:   popenrB   rC   s          r   -test_universal_newlines_communicate_encodingsz=ProcessTestCase.test_universal_newlines_communicate_encodings  s~     0HLD NND$/D $$T+5??,6OO.68E #..R.8NFFV\2 0r   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   )rA   rB   r   r   r   r   z[{}])rW   rX   r   rD   rE   r   rY   format)r%   r   expectedr   r:   r  rB   rC   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())r@   s   limer   )r(   r   mkdtempranger   r   r   r   TESTFNappendopenO_WRONLYO_CREATOSErrorerrnoEMFILEskipTestrI   popr   rD   rW   rX   rE   r   rY   r   rmtree)
r%   max_handleshandlestmpdiritmpfileerK   datahs
             r   test_no_leakingzProcessTestCase.test_no_leaking  s   KK!!#	";' ggll693C3CDGNN2777BKK

4J#KL (  !#./ 0 2Y'  2Y$$cnnd'K&L ,6??,6OO,6OO= }}W-a0  w/   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 cr5  r  z"a b c" d e)ab"c\r5  z	ab\"c \ d)r
  z \r5  zab\"c " \\" d)za\\\bzde fgr  za\\\b "de fg" h)za\"brm   r5  z
a\\\"b c d)za\\b cr5  r  z"a\\b c" d e)za\\b\ cr5  r  z"a\\b\ c" d eabr   zab "")rY   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   rD   rW   rX   rE   r   rA   rI   assertIsNonepollr   r   r2  r*   rY   rJ   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 rf   r   rD   r   rY   r*   rJ   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?r`   z0.0001r   )r   rD   rW   rX   rb   rc   r*   rw   strrk   rY   r   SHORT_TIMEOUT)r%   rK   rm   s      r   test_wait_timeoutz!ProcessTestCase.test_wait_timeout  s    cnn"$BD Ez889QFF6F" :hAKK 01(=(=>B :9s   B77C c                     | j                  t              5  t        j                  t        d       d d d        y # 1 sw Y   y xY w)Nr}  )rb   r   r   rD   r   r$   s    r   test_invalid_bufsizez$ProcessTestCase.test_invalid_bufsize	  s.     y)_h7 *))s	   :Ac                     t        j                  t        d       }| j                  |j	                         d       t        j                  t        d       }| j                  |j	                         d       y )Nr   )rN   r  rJ   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   )rA   rB   rC   rN   r   r   )r   rD   rW   rX   rE   r\  rA   r   r   rI   r2  rB   r  r   SuppressCrashReportr  rY   r   )r%   liner  r   rK   	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!E" 	q)H-	   /.E E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_mode-  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_mode3  sN     **,,"">3CD((su(M EDDs   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)NrA  r   )r  rb   r   r   rD   r   rE   )r%   r  s     r   test_leaking_fds_on_errorz)ProcessTestCase.test_leaking_fds_on_error:  sN     tA""#56  (2(29 76 66s   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)rC   r   r   r   )msvcrtCrtSetReportModeAttributeErrorImportErrorr  r  r  r   rW   rX   r   rD   rE   r   rY   r   )r%   r2  r   r  rv  rC   s         r   test_nonexisting_with_pipesz+ProcessTestCase.test_nonexisting_with_pipesG  s    	:##  $ #% &		  & ~~tT*'1379 %%'*F $!,; , 	:MM89	:4 Ts   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   rh  timesleep)r  fdss    r   open_fdsz<ProcessTestCase.test_double_close_on_error.<locals>.open_fdss  s/    2Y

2779%

5! r   )targetr@   )	threadingThreadstartrb   r  r   rD   r   rE   r   r   rI   )r%   r>  texcfdr  r=  s         @r   test_double_close_on_errorz*ProcessTestCase.test_double_close_on_errorp  s   	" H-			""7+  '1(2(29 , FFHCHHRL  	 ! ,+  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 )Nr   zimport time; time.sleep(12)c                     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  rm  r*   r   )rv  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   ir`   z*unexpected result in wait from main threadmsgz&unexpected result in second main wait.)rI  NrJ  rK  )r   rD   rW   rX   rY   r   r@  TimerrB  r(   r*   r   r  r   )r%   rM  rC  expected_errorcoderv  rL  s       @@r   test_threadsafe_waitz$ProcessTestCase.test_threadsafe_wait  s   M!>!@ 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   rv   rW   rX   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*r@   )r   mkstempr   rD   r  r   rI   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 )Nr@      x   )
r   rD   r   rE   r   rB   rI   rC   rA   r   rJ   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...>rh  Fz&<Popen: returncode: None args: ['ls']>)rh  z	--my-optsrj  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
   rk  r   patchobjectr   rD   r   rY   repr)r%   casesr  r   r   sxrK   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"- ). LKKs   "AB22B;c                     t        j                  t        t         j                        }| j	                  |j
                  j                         |j                          |j                  ddz         y )Nr   rd  re  )	r   rD   r   rE   r   rA   rI   r*   r   rJ   s     r   !test_communicate_epipe_only_stdinz1ProcessTestCase.test_communicate_epipe_only_stdin  sH    _#-??4&		dUl#r   SIGUSR1zRequires signal.SIGUSR1rm  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   )	signalru  r   rW   rX   r   rE   rD   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                 z   	 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)Nr  r@   )
r   getpidlistdirrb   r6   r8   r   r   rE   rY   )r%   fd_directoryfds_before_popenfds_after_exceptions       r   !test_failed_child_execute_fd_leakz1ProcessTestCase.test_failed_child_execute_fd_leak  s     	J$ryy{2::l312##:??%??:??D 3 !jj6)+>? 32s   >B11B: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  )rb   r  r   rV   rY   rk   filenamerl   s     r   %test_file_not_found_includes_filenamez5ProcessTestCase.test_file_not_found_includes_filename/  sI    01QOOOP 2--/HI 21s   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  )rb   r  r   rD   rY   rk   r  rl   s     r    test_file_not_found_with_bad_cwdz0ProcessTestCase.test_file_not_found_with_bad_cwd5  sQ    01Qfc]0MN 2--/LM 21s   AA(c                     | j                  t        j                  t           t        j
                         | j                  t        j                  t           t        j
                         y r"   )rF   r   rD   bytestypesGenericAliasCompletedProcessr  r$   s    r   test_class_getitemsz#ProcessTestCase.test_class_getitems;  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   ru  
_USE_VFORKF)r  r   r  RuntimeErrorside_effectrb   r   rW   rX   assert_called_once	call_argsr:   r   rm  rn  r,   call_args_list)r%   mock_fork_execs     r   test__use_vforkzProcessTestCase.test__use_vfork?  s     	
--.%12E%F"|,NNCNND&9: -))+0055b9:ZZz<?""<0f=> 1^::2>CCBGH @?	 -,
 10 @?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_valueru  r   )r   rD   r   r   rm  rn  r  WAIT_OBJECT_0r*   assert_called_once_with_handler   rY   )r%   rv  rm  	mock_waits       r   test_wait_negative_timeoutz*ProcessTestCase.test_wait_negative_timeoutN  s     0JJ%%""%'//== & ?E )		"11$,,B"& 
 TYY[!, T
  Ts$   AC'5C(CC	CC"N)r1   r2   r3   rL   rP   r\   rd   rh   rn   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rk  skipIfr(   r   r   r   r   r  r  r  r  r  r   r%  r(  rW   base_prefixprefixr*  	sysconfigis_python_buildr,  r/  r6  r9  r>  rC  rF  rJ  rL  rN  rR  rV  rX  rZ  r]  r_  ra  
skipUnlessri  hasattrrs  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(  r-  r   requires_resourcer0  r6  rF  rS  rV  rb  rf  rr  rt  r}  r   r  r   isdirr  r  r  r  r  r   rm  r  r   r  r4   r   r   r>   r>   s   sE   !' 
554'
''(''%54! +(<.)+	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d Zd Zd Zd Zd Z ej&                  ed      d        Zd Zd Zd Z ej2                  ed      d        Zd Zy)RunFuncTestCasec                 V    	 t         j                  d|g}t        j                  |fi |S )Nr   rW   rX   r   r   )r%   r   r;   argvs       r   
run_pythonzRunFuncTestCase.run_python`  s)    B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  rY   r   rb   r   rj   check_returncoder%   cps     r   test_returncodezRunFuncTestCase.test_returncodee  sQ    __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)NrS   Trt   rT   )rb   r   rj   r  rY   rk   r   rl   s     r   
test_checkzRunFuncTestCase.test_checkl  sQ    z<<=OO6dOC >//4 >=s   A##A,c                 r    t        j                  t        d      }| j                  |j                  d       y )NTrt   r   )r   r   r   rY   r   r  s     r   test_check_zerozRunFuncTestCase.test_check_zeroq  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  r`   )rb   r   rc   r  r$   s    r   test_timeoutzRunFuncTestCase.test_timeoutv  s5    
 z889OO.O? :99s	   =Ac                 ~    | j                  dt        j                        }| j                  d|j                         y )Nrq   rs   rr   r  r   rE   rw   rB   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   rr   )r  r   rE   rw   rC   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   rI   r   r   r  r   rE   rw   rB   )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   rB   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   rO  r   r   r   rA   r   )r   r   r   rI   r   r   rb   ry   r  rw   rk   r:   r   s       r   r   z6RunFuncTestCase.test_check_output_stdin_with_input_arg  s    ##%!


zK  MPQ__%?+-W % >FM 	gq{{//23gq{{//23M Ms   )CC"c                     | j                  t        j                        5 }| j                  ddt        j                        }d d d        y # 1 sw Y   y xY w)Nr   r_   )ra   rB   )rb   r   rc   r  rE   )r%   rm   r  s      r   r   z)RunFuncTestCase.test_check_output_timeout  sC    z889Q3
 ! 9B :99s   #AA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  rY   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.comrh  z required for this testrs   r   T)rB   r   )r(   r   r   r  r
   r   r   r\  rY   r   rb   r   )r%   progr   ress       r   test_run_with_pathlike_pathz+RunFuncTestCase.test_run_with_pathlike_path  s     'zD||D!<MMTF"9:;~nnT**<*<=+y)NN4
(:(:$G *))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   rW   rX   r   r   rY   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
   rW   rX   r   r   rY   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_outputrr   s   FLUFL)r  rw   rB   rC   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.rO  r   T)r  rB   rB   r   r  
r   r   r   rI   rb   ry   r  rw   rk   r:   r   s       r   #test_stdout_with_capture_output_argz3RunFuncTestCase.test_stdout_with_capture_output_arg      ##%!z"  $'(__%?59" % FF$
 	h 0 0 34&(8(8(;<$ $   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.rO  r   T)r  rC   rC   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                 J   	 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)
Nzsleep 3Tr_   )r   ra   r  zTimeoutExpired not raised.g      ?z/TimeoutExpired was delayed! Bad traceback:
```
z```rO  )	r;  	monotonicr   r   r   rc   	traceback
format_exc
assertLess)r%   before_secsrD  
after_secsstackss        r   .test_run_with_shell_timeout_and_capture_outputz>RunFuncTestCase.test_run_with_shell_timeout_and_capture_output  s    Xnn&	4NN9D#*.0 II23
[0#O!(#' 	 	( (( 	,)J))+F	,s   A B"0(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  rd  r   s   <string>:2: EncodingWarning: r   s   <string>:3: EncodingWarning: )r  r  r   r   rW   rX   rC   
splitlinesrY   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  rk  r  r(   r  r  r  r  r  r  r  r4   r   r   r  r  _  s    .
"5
+
@*
*
	**49,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KeyErrorrk  rl  )
name_groups    r   _get_test_grp_namer    sQ    H
Z(  I  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)Nr   r   r  Expected OSError: %sr  r   rD   rW   rX   r	  r   r  rY   r  strerrorr  r%   r  rK   r  s       r   test_exception_cwdz'POSIXProcessTestCase.test_exception_cwd;  s    I 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)Nr   r   r   r  r  r  s       r   test_exception_bad_executablez2POSIXProcessTestCase.test_exception_bad_executableJ  s    P 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)Nr   r   r  )
r  r   rD   r	  r   r  rY   r  r  r  r  s       r   test_exception_bad_args_0z.POSIXProcessTestCase.test_exception_bad_args_0Y  s    M 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__o  r|  r   N)r1   r2   r3   r  r4   r   r   PopenNoDestructorr  n  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)Nc                      | 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_erroru  sA     HM}}U\\299;HHH]K($:T$ABr   subprocess.os.waitpidr  non_existent_command)r  r   rm  ChildProcessErrorrb   IsADirectoryErrorr  )r%   	fork_execr'  s      r   test_exception_errpipe_normalz2POSIXProcessTestCase.test_exception_errpipe_normalr  sh    L	 !-	ZZ/$57""#45&&(>'?@ 67 7557 7s"   A-A!A-!A*	&A--A6c                 l   	 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)Ns    ޭ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*  )r  r   rm  r+  rb   r   SubprocessErrorr  rw   ro  r  rk   )r%   r-  r2  r  r1  s       @r   test_exception_errpipe_bad_dataz4POSIXProcessTestCase.test_exception_errpipe_bad_data  s    	"(
	 !*	ZZ/$57"":#=#=>!&&(>'?@ ?7
 	d:&AKK(89 ?>7 7s#    B*BB*B'	#B**B3/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catr5  F)restore_signalss   SigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.rO  )r   rv   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4Dy)'+$ 5
 MMBC)66+, $ & )335Dy)(,% 6 	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   rv   rW   rX   r   getsidintr9  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   rv   rW   rX   r   rJ  rB  r9  rC  r  rD  )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%++% &	rH  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())ru  rV              )r   r   rV  )r   geteuidrW   r  pwdgetpwnamr  r  subTestr   rv   rX   
isinstancer  pw_uidrB  rY   rC  r  EACCESr  r  rb   ry   rg   r   OverflowErrorr  r   )
r%   uid
test_usersname_uidrV  rW  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>% BA + . z*!!/; + }-!!/&(iiRZZeM . ;8/"":.%%oHE /. 0;E     + :77ell2 ,,QZZH --ajj9	: BA( +* .-
 /.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  rX  rb   ry   r   rg   r   r$   s    r   test_user_errorz$POSIXProcessTestCase.test_user_error  s,    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)NrR  rS  r  )grouprW  r   zimport os; print(os.getgid())ru  ro  rY  )r   r   ro  )r   getegidr  r  r  r]  r   rv   rW   rX   r^  r  r  gr_gidrB  rY   rC  r  r  rb   ry   rg   r   ra  r  r   )
r%   gid
group_listr  ro  rW  r{   	group_gidchild_groupr  s
             r   
test_groupzPOSIXProcessTestCase.test_group  s   jjl"e|e7
')
?j)3%'E*	\\\CA!+!8!8!$!@!B&+*3	"5 &eS1(+U(;(B(BI(-I&)&k((i@! DC + (, z*!!/< + }-!!/&(iiRZZuN . ;"":.%%oZH /. ' + 6))!**556 DC& +* .-
 /.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)Nri  rp  rj  r$   s    r   test_group_errorz%POSIXProcessTestCase.test_group_error6  s,    z*!!/? +**rl  	setgroupszno setgroups() on platformc                 f    t        j                         }|dk7  rdndg}| j                  ||       y )NrR  rS  rs  rt  )r   rq  _test_extra_groups_impl)r%   rs  rt  s      r   test_extra_groupsz&POSIXProcessTestCase.test_extra_groups;  s0    jjl"e|e7
$$$Dr   c                 N    | j                  t        j                         g        y )Nr|  )r}  r   rq  r$   s    r   test_extra_groups_empty_listz1POSIXProcessTestCase.test_extra_groups_empty_listA  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   rv   rW   rX   r   	getgroupsjsonloadsr^  r  r  rr  rY   setrC  r  r  r  rb   ry   rg   r   )
r%   rs  rt  r  r{   parent_groupschild_groupsgdesired_gidsr  s
             r   r}  z,POSIXProcessTestCase._test_extra_groups_implE  sA   ')
?j)	C,,^^TRT!+-F LLNM::f-L)3 5)3A ;EQ:LQ 6 6RS S)3   5  *S.L0AB;"":.%%o4><A /.  5  	Kajj)MMIJJ	K  /.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)Nru  r  rY  )r   r   r  )rb   ry   r   rg   r   r   r  r   r$   s    r   &test_extra_groups_invalid_gid_t_valuesz;POSIXProcessTestCase.test_extra_groups_invalid_gid_t_valuese  ss    z*!!/E + z*!!/&(iiRZZ05w8 +* +* +*s   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 != rO  )r   r  r   r   r   r   rg   rW   rX   statst_moderY   octr   r  )r%   r  namer  expected_modes        r   
test_umaskzPOSIXProcessTestCase.test_umaskn  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   rD   rW   rX   r*   rY   r   r}  SIGABRTrJ   s     r   test_run_abortz#POSIXProcessTestCase.test_run_abort  sa    ((*  #..$"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   rj   rB  r}  r  r  rw   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   rj   r  rw   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 )Nrd  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    		'70Kr   )rB   
preexec_fn   appler=  rJ   s     r   test_preexecz!POSIXProcessTestCase.test_preexec  s^     cnndEF %/OO(K	M
 QXX]]_h7 QQs   +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?ry   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   rD   rW   rX   r   r3  r  
_fork_execry   rw   r:   )r%   r  rK   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y)+POSIXProcessTestCase._TestExecuteChildPopenc                 X    || _         t        j                  j                  | g|i | y r"   )	_testcaser   rD   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.rO  )r   rD   r<   r  r   r  O_RDONLYr  r   rA   r2  rB   rC   rI   )r%   r:   r;   r  devzero_fdsrE  s         r   r<   z:POSIXProcessTestCase._TestExecuteChildPopen._execute_child  s   %  //FtFvF ).a2(01  "ww{BKK@(0  2%)22 "TZZ%6%6%8$++:L:L:N%)[[%7%7%9%;$G 3 I * * *2 * * ).a2(01  "ww{BKK@(02 2%)22 "TZZ%6%6%8$++:L:L:N%)[[%7%7%9%;$G 3 I * * *k *sB   #D +C. A0C3 3DH"+EHA0G$H$HHN)r1   r2   r3   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)Nc                  ,    t        j                  d      )Nz-force the _execute_child() errpipe_data path.)r   r3  r4   r   r   r  zWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_it  s    ,,CE Er   )rA   rB   rC   r  )rb   r   r3  r  r   rE   )r%   r  s     r   0test_preexec_errpipe_does_not_double_close_pipeszEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes  s\    D	E z99:''o(oojoo)8 ( E ;::s   AA33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>      tr   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   rV   rW   rX   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rT  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  r5  r  r   r   rV   rW   rX   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  rT   )r   rY  r  r   r   
unix_shellrW   rX   r   chmodr   rD   r*   rZ  rY   r   )r%   rE  fnamefobjrK   s        r   test_args_stringz%POSIXProcessTestCase.test_args_string	  s    $$&	E"c"34JJx'"4"445JJB~~& ' 5 	U#	
		%r* 54s   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   rS   rT   startupinfocreationflagsrb   ry   r   rV   rW   rX   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   rB   r   s    	
r  
r   r   r   r   rD   rE   rY   rB   r  r  r%   r   rK   s      r   test_shell_sequencez(POSIXProcessTestCase.test_shell_sequence'	  so    "!wm_A$.OO!') QXX]]_22<@(K QQs   :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_string1	  sm    "!w]!$.OO!') QXX]]_22<@(K QQs   :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   rY  r  r   r   r  rW   rX   r   r  r   rV   rZ  rY   )r%   rE  r  r  r[   s        r   test_call_stringz%POSIXProcessTestCase.test_call_string;	  s    $$&	E"c"34JJx'"4"445JJB~~& ' 5 	__U#
		%R  54s   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)rX   r   rB   r  )r   r   r   isfiler  r  islinkr   rD   rE   rY   rB   r  r  r  )r%   shellsr  r  shrK   s         r   test_specific_shellz(POSIXProcessTestCase.test_specific_shellH	  s    =F'WW\\&$/77>>"%MM"% ( >
 MM>?77>>"bggnnR&8MM"B  r(29A  !6!6!8%G:LM   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rW  rA   rB   rC   r   )r}  SIGINTdefault_int_handlerr   rD   rW   rX   rE   rB   r  getattr)r%   methodr:   r~  rK   s        r   _kill_processz"POSIXProcessTestCase._kill_process\	  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   rD   rW   rX   rE   rB   r  r;  r<  r  r   )r%   r  r:   rK   s       r   _kill_dead_processz'POSIXProcessTestCase._kill_dead_processu	  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   rw   r9  r*   r%   rK   r  rC   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 )Nrm  r   )r  r   rY   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   rY   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 Nrm  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=  rE  inheritablesaveds         r   	_save_fdszPOSIXProcessTestCase._save_fds	  sH    B,,R0KFF2JEJJE;/0  
r   c                 t    |D ]3  \  }}}t        j                  |||       t        j                  |       5 y )N)r  )r   dup2rI   )r%   r=  rE  r  r  s        r   _restore_fdsz!POSIXProcessTestCase._restore_fds	  s.    &)"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   rT  r@   r  r<  )r  r   rI   r   rD   rW   rX   rE   r   rY   r"  )	r%   r=  rA   	saved_fdsrE  r  r  r   r   s	            r   check_close_std_fdsz(POSIXProcessTestCase.check_close_std_fds	  s     NN3'	&/"B{Qw '0	) !'';)<
 #(oo(oo/ 0;{} C S(+S),i(Di(s   BC C%c                 (    | j                  dg       y rf   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 )Nrd  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   rd  r'  r$   s    r   test_close_fds_0_2z'POSIXProcessTestCase.test_close_fds_0_2	  r1  r   c                 *    | j                  ddg       y )Nr   rd  r'  r$   s    r   test_close_fds_1_2z'POSIXProcessTestCase.test_close_fds_1_2	  r1  r   c                 *    | j                  g d       y )N)r   r   rd  r'  r$   s    r   test_close_fds_0_1_2z)POSIXProcessTestCase.test_close_fds_0_1_2	  s     	  +r   c                 z   	 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)Nr   r   r   z*print('AssertionError:0:CLOEXEC failure.'))	r   r  rI   r   rD   rW   rX   r*   r!  )r%   	new_stdin
new_stdouts      r   test_small_errpipe_write_fdz0POSIXProcessTestCase.test_small_errpipe_write_fd	  s    KFF1I	VVAY
	!HHQKHHQK
 NND@B CCG46 GGIq!GGJ"HHYHHZ  GGIq!GGJ"HHYHHZ s   AC" "AD: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)N   r      STDINr   r   Zimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")rd  r@   rA  	   got STDIN   err)r  r   rY  r   unlinkr   r3  r  	enumerater!  r   rD   rW   rX   r*   r"  r  r  rY   rI   )r%   r  tempsrE  r  temp_fdsr$  temp_fdrK   r   r   s              r   test_remapping_std_fdsz+POSIXProcessTestCase.test_remapping_std_fds	  s   -21X6X!!#X6(	,12Eyr5EH2 #	E		%  # HHXa[(+HHXa[!Q' uQx0I-#,X#6KBGGGR( $7
 $$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=  r>  r   r   r?  r@   rA  r@  rA  )r  r   rY  r   rB  r  rC  r!  r   r3  r   rD   rW   rX   r*   r  r  r"  rY   rI   )r%   stdin_no	stdout_no	stderr_nor  rD  rE  r  rE  r$  rF  rK   r   r   s                 r   check_swap_fdsz#POSIXProcessTestCase.check_swap_fds)
  s   -21X6X!!#X6(-.92uB.'	"	E		%  # uQx0I-#,X#6KBGGGR( $7 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   rd  )rL  r$   s    r   test_swap_fdsz"POSIXProcessTestCase.test_swap_fdsY
  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=  r@   z
                import os, sys
                skipped_fd = int(sys.argv[1])
                for fd in range(3):
                    if fd != skipped_fd:
                        os.write(fd, str(fd).encode('ascii'))
            r   r   rA  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!  r2  r  r  rI   zipr  r  r   rV   rW   rX   r  rY   r3  SEEK_SETr  r  maprB  r  r"  )r%   from_fdsto_fdsr$  from_fdffd_to_close	arg_namesr;   to_fdr   
skipped_fdr[   
read_bytesread_fdsrP  s                   r   #_check_swap_std_fds_with_one_closedz8POSIXProcessTestCase._check_swap_std_fds_with_one_closeda
  s   NN58,	&	)#++-GGAHHJ0 .- $ uQx=3x=8==?KHH[!5IF"%h"7+2y'( #8 ?? $ D eAh-#f+5::<J#..$c*o!N +#)+BR#"%h"7!R[[1WWWd3
C):):7)C DEoo +""*4x 8''.i 0&&.Z/Fug N' 
   %(C8 #8 i(I .-H 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=  rd  )	itertoolscombinationsr  permutationsr]  )r%   rS  rT  s      r   !test_swap_std_fds_with_one_closedz6POSIXProcessTestCase.test_swap_std_fds_with_one_closed
  sH    !..uQx;H#00q1=886J > <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.SubprocessErrorre  z!Exception occurred in preexec_fn.)r   rV   r   r   ry   r  r  rY   r  r3  assertIsNotNone)r%   rf  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  ro  r   r   r   r   rv   rW   rX   r   rY   r  r  )r%   keyvalueencoded_valuescriptr   decoded_valuerB   s           r   test_undecodable_envz)POSIXProcessTestCase.test_undecodable_env
  s3   GJC!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 H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   Trl  PATHr   s   PATH)r   r   r   r  r   r  r   rV   rY   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)rA   rB   rC   rW  r   rB   rW     ,zExpected no fds from z to be open in child, found )r   findfiler   rD   rW   rX   rE   r   r   r  rR  rB  r  rA   r2  rB   rC   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)rA   rB   rW  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   rD   rW   rX   rE   rB   r   r*   rA   r   rI   selectr  rY   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  r>  s     r   	<genexpr>z6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>A  s     ;(Q(,,.(s   r  rB   rW  pass_fdsz'Some fds not in pass_fds were left open)r   r  r   rh  r   rI   r  r  r  devnullr  addset_inheritabler   rD   rW   rX   rE   r   rR  rB  r  rY   r,   rw   )r%   r  r=  r  rE  rK   r{   ignoredremaining_fdsfds_to_keepr>  s             @r   test_close_fdsz#POSIXProcessTestCase.test_close_fds  s0   $$^<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                 b   	 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 )Nr  r~  r  r   aK  
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

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

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

        max_fd_open = max(open_fds)

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

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        rs   rd  z(expected exactly two lines of output:
%rrO  r   r  r   zSome fds were left open.)r   r  r   rD   rW   rX   r  r  rE   r   r  rY   r  r  rR  rB  r  r  r,   )r%   r  rK   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_loweredM  s    	J$$^<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)rW  r  zoverriding close_fds)r   r  r  r  r   rh  r   rI   r  updater   rD   rW   rX   rE   r   rR  rB  r  rw   r,   assertWarnsr,  rV   r   r  warning)r%   r  r>  r  r=  rE  rK   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   B  #..)!<(24+-&2A  mmoOFGCd); <=M#rd?LMM"m-IJ]\957 !!.1W  '"'2&": ; 2 MM0#goo2FG%  21s   -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   rh  r   rI   r  rW   rX   r  rR  r  r   rD   rE   r   r  rB  r  rY   r  )
r%   rq  r  non_inheritabler  r:   rK   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                 N   	 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 )Nr  r~  r  rd  r   r   T)rA   rB   rC   rW  r  rA  r  >   r   r   rd  zoutput=)r   r  r  r   r  r  O_RDWRr   rI   r  rh  insertr   rD   rW   rX   r  r  rB  rY   	frozenset)
r%   r  r  r  rE  stdout_rstdout_wr{   numr=  s
             r   test_pass_fds_redirectedz-POSIXProcessTestCase.test_pass_fds_redirected  sG   E$$^<LM	qARYY/BOOBHHb)OOB 
  WWY((+(+8$s~~y9$,QK%-a[%-a[(,'/1 WWXt,F1 $*<<#56#5Cs3x#56i)H*==
?ST1 1 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+)rB   rA   rG   r  r   r  r   rD   r   r*   r%   inoutrK   s      r   %test_stdout_stdin_are_single_inout_fdz:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fd  B    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   sB    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  )rC   rA   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   rD   rW   rX   rE   r   rY   r   r  )r%   sigchild_ignorerK   rB   rC   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   )rB   rN   r  s   applg        )r   import_moduler   rD   rW   rX   rE   rB   r   rI   rY   r  rw   r  r*   )r%   r  rK   rV  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   rD   rW   rX   rE   r   rB   rI   rC   idpidr   check_warningsResourceWarningr(   r  r)   rw   )r%   rK   identr  os        r   test_zombie_fast_process_delz1POSIXProcessTestCase.test_zombie_fast_process_del(  s    
 cnnd01 %/OO$.OO	5
 	''1ee++R,ABA C j001 MM%1C1C!D1CA"Q%1C!DE CB "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   rN  r   )r   rD   rW   rX   rE   r   rB   rI   rC   r  r  r   r  r  r   
gc_collectr   rm  r}  r	  r(   r  r)   rw   r;  r<  rb   r  r   waitpidr   )r%   rK   r  r  r  rv  s         r   !test_leak_fast_process_del_killedz6POSIXProcessTestCase.test_leak_fast_process_del_killed@  s    cnnd./ %/OO$.OO	5
 	''1ee++R,ABA  C 	V^^$j001 MM%1C1C!D1CA"Q%1C!DE 	

3w'!!/)3)3:=A: ( 	'2::sA6j001UJ4F4F$G4FqRU4F$GH5 CB "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!  )rE  s   r   r  zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>u  s    2r   )rB   rW  r  r  )r   r  r   r  r   rI   r   rD   rW   rX   rE   r   r  rR  rB  r  r   )r%   r  rK   r{   r  r  rE  s         @r   test_close_fds_after_preexecz1POSIXProcessTestCase.test_close_fds_after_preexeck  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>  s    4r   ri  s   exe   envs   argTr4   ru  r   rd  r=  r  Fztakes exactly)_posixsubprocessr  r  r  rb   r   r-  r   r  rk   r  )	r%   r  
gc_enabledfuncr:   exe_listr   env_listr   s	            r   test_fork_execz#POSIXProcessTestCase.test_fork_exec|  s%    	 \\^
 	  DIIK F8TF843TF84F8SF84F8T3/	2-hX &&y1S$..hb#xBB1adAr1be% 2    #cmm2DE-20 

 % 21$ 

 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"   )ro  )r%   ro  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)firstro  ry   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  )ru  rd  r=  r  r~   )r  r  )      *   l            )r~   r  )r  rk  rk  r  r   rd  zfds_to_keep={}rO  s   falseTr  ru  r=  r  r  )r  r  r  r  rb   ry   r  r-  rw   r  rk   r  )r%   r  r  r  r  rm   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$B mS-=>' * 

 B B 

 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)NrA   )r   rD   r   r   rm  rn  BrokenPipeErrorrI   r  r   assert_called_withr%   rv  mock_proc_stdins      r   ,test_communicate_BrokenPipeError_stdin_closezAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close  sm     04::$$T730?O!!-!!446 4TT33TTs#   !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)NrA      stuff)r   rD   r   r   rm  rn  r  r   r  r   r  rI   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;	 4TT33TTs#   !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   rA   wbr  )r   rD   rW   rX   rE   r   rm  rn  r  r   r  r  r  r  r2  r  r   r  )r%   rv  r   dev_nulls       r   ,test_communicate_BrokenPipeError_stdin_flushzAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flush  s      6&0oo'18 4::$$T73RZZ&(0?O!!-2://2CO""/X&!!99; ' 4TT&& 43TTs=   !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   rA   i  r`   )r   rD   rW   rX   rE   r   rm  rn  r  rI   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;	 4TT33TTs%   !C(AB;*C;C	 CCN
W_STOPCODEzneed _testcapi.W_STOPCODEc                 \   	 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)Nr   rz  r=  r(  r  )r   r   rD   r   wait_processr  	_testcapir  r   rm  r*   rY   )r%   r:   rv  statusr   s        r   test_stoppedz!POSIXProcessTestCase.test_stopped  s     	P% 	TXX2%%a(ZZ/txx>PQJ R 	R( RQs   6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   rD   r   r   r  r  r  r   r   rm  r  r}  r  assert_not_calledrg  )r%   rv  	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>,  s    dr   )new)r   rD   rW   rX   r   r  r   rm  rn  r  r}  r  rm  rJ   s     r   test_send_signal_race2z+POSIXProcessTestCase.test_send_signal_race2#  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)rs   r_   r`   )r   rD   rW   rX   rE   r   rc   r%   rv  s     r   1test_communicate_repeated_call_after_stdout_closezFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close1  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	   rY   r  rw   )r%   r   r  r   r   s        r   test_preexec_at_exitz)POSIXProcessTestCase.test_preexec_at_exit<  sT    
" #2!2 3	 'tT23e,I3Or   )rr1   r2   r3   r&   r  r  r  r  r   rD   r  r   rm  r.  r4  rk  r  r   r   r[  r>  rG  r  r  rO  rg  rk  rw  ry  r~  r  r}  r  r(   r  r  r  r  r  r  r  r  r  r  rW   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  r5  r7  r;  rG  rL  rN  r]  rb  rh  rs  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  '  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wShowWindowrV   r   )r%   STARTF_USESHOWWINDOWSW_MAXIMIZEr  s       r   test_startupinfoz%Win32ProcessTestCase.test_startupinfoS  s@      ! ,,.2"- 	$/	1r   c                 p    d}d}t        j                  ||      }t        j                  t        |       y )Nr   r=  )r*  r+  r  )r   r)  rV   r   )r%   STARTF_USERSHOWWINDOWr-  r  s       r   test_startupinfo_keywordsz.Win32ProcessTestCase.test_startupinfo_keywordsb  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)Nrd  r  )rB   rC   r  r   handle_list)r   r)  r,  r*  SW_HIDEr+  r  r   r  r   r  rD   r   r   rY   r   r  	hStdInput
hStdOutput	hStdErrorlpAttributeList)r%   r  r  r  nullrv  s         r   test_startupinfo_copyz*Win32ProcessTestCase.test_startupinfo_copyr  sG    ,,.(==","4"4 qA!Cbjj#&$!''/3/9/@/@4?A $$&   !4 ' [00'<<>k334k445k334[44j6H6HI[88=":MN#  T '&s$   .*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  )rW   rC   r   r   rV   rX   )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   rS   c                       yr+  r4   r4   r   r   r  z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>  s    Qr   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   BadEnvrC    s    Dr   rE  r   )dictrb   r   r   rD   r   )r%   rE  s     r   test_issue31471z$Win32ProcessTestCase.test_issue31471  s:    	T 	y)_&(; *))s   !AAc                 x    t        j                  t        j                  ddgd      }| j	                  |d       y )Nr   rS   T)rW  rT   rU   rZ   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  )rB   rC   rW  s   OSErrorr3  )rB   rC   r  rW  z.*overriding close_fds)r2  r   rh  r   rI   r  r  get_osfhandler   rD   rW   rX   r  rE   r   rY   r   rB  r  rw   r)  r8  r   r  r,  )
r%   r2  r=  r  rE  rK   rB   rC   r3  r  s
             r   test_close_fds_with_stdioz.Win32ProcessTestCase.test_close_fds_with_stdio  s   ggi#a&)#a&)Br4(NN6//34  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)  r8  rV   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 )Nr3  r  rM  rN  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   rD   rE   rw   rB   r  r  s      r   r  z(Win32ProcessTestCase.test_shell_sequence  sb    "$weWA$.OO!') MM+qxx}}7 QQs   +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rS  rU  r  s      r   r  z&Win32ProcessTestCase.test_shell_string  s`    "$wU!$.OO!') MM+qxx}}7 QQs   +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oemrT  r   r  r   )r   rB   r   r   rU  )r%   encr   rK   s       r   test_shell_encodingsz)Win32ProcessTestCase.test_shell_encodings  st    "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)"rT   rU   rZ   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)
                             r@   r   r   r   )r   rD   rW   rX   rE   rB   r  r  r   rY   r*   r9  )r%   r  r:   rK   r  rC   r   s          r   r  z"Win32ProcessTestCase._kill_process  s    cnnd 5! " $.??$.OO$.OO5  HHMM!GAv%IAvVS)J  	J* Qs   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)
                             r@   r   r   r  )r   rD   rW   rX   rE   rB   r  r;  r<  r  r   rY   r*   )r%   r  r:   rK   r  rC   r[   s          r   r  z'Win32ProcessTestCase._kill_dead_process%  s    cnnd 5! " $.??$.OO$.OO5  HHMM!JJqMGAv%IAvVS)B  	R  Qs   A5C''C0c                 D    | j                  dt        j                         y r  )r  r}  r  r$   s    r   r  z%Win32ProcessTestCase.test_send_signal<  s    =&..9r   c                 &    | j                  d       y r  r  r$   s    r   r
  zWin32ProcessTestCase.test_kill?  s    6"r   c                 &    | j                  d       y r  ra  r$   s    r   r  z#Win32ProcessTestCase.test_terminateB  s    ;'r   c                 D    | j                  dt        j                         y r  )r  r}  r  r$   s    r   r  z*Win32ProcessTestCase.test_send_signal_deadE  s    v~~>r   c                 &    | j                  d       y r  r  r$   s    r   r  z#Win32ProcessTestCase.test_kill_deadH  s    'r   c                 &    | j                  d       y r  r  r$   s    r   r  z(Win32ProcessTestCase.test_terminate_deadK  s    ,r   N)r1   r2   r3   r.  r1  r:  r>  r   r   r#  rG  r  rK  rO  rQ  r  r  r[  r  r  r  r  r
  r  r  r  r  r4   r   r   r'  r'  P  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	 g Z fdZ xZS )MiscTests.RecordingPopenc                 Z    t        |   |i | | j                  j                  |        y r"   )r  r   instances_createdr  )r%   r:   r;   r  s      r   r   z!MiscTests.RecordingPopen.__init__T  s)    Gd-f-""))$/r   )r1   r2   r3   rk  r   r$  r%  s   @r   RecordingPopenri  P  s    J	0 	0r   rl  _communicatec                 J   	 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)N_waitrD   r   zLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')rB   r   r`   z.no open-ended wait() after the first allowed: g      ?rd  rO  )KeyboardInterruptr  r   rm  rn  r   rD   rl  rb   rW   rX   r\  r  r9  rV   r  assertLessEqual
call_countrY   r  rk  r  rm  r*   )r%   popenermock__communicater;   
mock__waitrV   sigint_callsr  s           r   _test_keyboardinterrupt_no_killz)MiscTests._test_keyboardinterrupt_no_killX  s5   	 ):%	H"":#3#3W= *;
&ZZ&&z7'+':':<**+<="M!N E (2'9'9E >DE >< '55ab9D'' $))D"9L)889;< :
  "&55Dtyy66$++D1 6 $$Z%:%:A)3)B)B % D  \!2A%/%>%> ! @- >4 ));;??AGLLNLLNR!4!4!F!FG/ >=< <	 >=4 ));;??AGLLNLLNR!4!4!F!FGs[   .H6 ;H*7H+H8H A:H*;A"H*H6 HHH'	"H**H3/H6 6A,J"c                 F    | j                  t        j                  d       y NgT㥛 @r`   )rw  r   rV   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 ry  )rw  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   rD   rp  )r:   r;   unused_processs      r   popen_via_context_managerz[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager  s&    !!4262n'' 32s   &)rw  )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   )rY   r   	getoutputgetstatusoutputr   r  r   r   r   r(   r9  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                 H   	 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 )N>   r  r[  ri  Handler  r   r  )r  r   __all__r  __dict__itemsr  r^  
ModuleTyper  rY   )r%   intentionally_excludedexportedpossible_exportsr  r  ro  s          r   test__all__zMiscTests.test__all__  s    8!Rz))*5%..446KD%s#%%"2"2!45  & 7 	#36L#LMr   N)r1   r2   r3   r   rD   rl  r   rm  rn  rw  rz  r|  r  r  r  r4   r   r   rg  rg  N  s_    0)) 0 
ZZz''8)H 9)HVMLH&Nr   rg  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   rY  r  r  r   r   rI   )r%   rV  r  r  s      r   r&   zCommandsWithSpaces.setUp  sP    ##E735[[^

 c 	
 	r   c                 `    t        j                  | j                         t        |           y r"   )r   rZ  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)NrB   mbcsz2 [%r, 'ab cd'])r   rE   rD   rY   rB   r  r  r  )r%   r:   r;   rK   s       r   with_spaceszCommandsWithSpaces.with_spaces  se    %??xd-f-hhmm%%f-$**, QQs   AA;;Bc           	      n    | j                  dt        j                  d| j                  dddd       y )N"" "ab cdr   rl  r  rW   rX   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   rl  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   rD   rW   rX   rE   rY   rB   r  rC   r  r  r  s     r   	test_pipezContextManagerTests.test_pipe  s    s~~t => &0__%/__6
 :>T[[--/;T[[--/;6 	**+**+6 6s   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   rD   rW   rX   rY   r   r  s     r   r  z#ContextManagerTests.test_returncode  sL    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   rP  r  s     r   r  z*ContextManagerTests.test_communicate_stdin  sd    s~~tHI $.??4 8<Z(T__a04 4 4s   .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   )rb   r   r   rD   r   rE   r  s     r   r   z%ContextManagerTests.test_invalid_args	  sV    12!!/)3)3:=A: 32: : 32s#   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 )Nrd  )rA   rN   rd  r   )r   rD   r   rE   r   r  	__enter__rA   r   r  r   rb   r  __exit__rY   r  r  r  s     r   test_broken_pipe_cleanupz,ContextManagerTests.test_broken_pipe_cleanup  s    G&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__)Grk  r   rj  r   test.supportr   r   r   r   test.support.script_helperr	   r   rW   r}  rG   r_  r   r  r   r;  r  r  r  r  r  r   r@  r  r  r  test.support.os_helperr
   r  r5  r[  r  ri  PGOrl  has_subprocess_supportr  r(   r  r   r  NotADirectoryErrorrC  r   rX   r   r   TestCaser    	Exceptionr6   rD   r8   r>   r  r  r  r  r  r'  rg  r  r  r  r  r1   mainr4   r   r   <module>r     s      ( & " ( 7  
  	  	           	   + ;;
(

9
::%%
(

=
>>\\W$	 @I I)');_M >>40( 8$$  &	 	>j.. >i-l i-X/yOl yOx	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 Cx  I
  
C  
C
EsB   H H H- H; HHH*)H*-H87H8;I