a
    äzeÒb ã                   @   s”  d dl Z d dl mZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ zd dlZW n eyî   dZY n0 zd dlZW n ey   dZY n0 zd dlZW n ey:   dZY n0 ejrNe  d¡‚ej dkZ!e!rddZ"ndZ"d	Z#e$e%e&fZ'ej(d
dfa)dd„ Z*G dd„ de j+ƒZ,G dd„ de-ƒZ.G dd„ dej/ƒZ0G dd„ de,ƒZ1G dd„ de,ƒZ2dd„ Z3e  4e!d¡G dd„ de,ƒƒZ5e  6e!d¡G dd„ de,ƒƒZ7G d d!„ d!e j+ƒZ8e  6e9ed"ƒd#¡G d$d%„ d%e1ƒƒZ:e  6e!d&¡G d'd(„ d(e,ƒƒZ;G d)d*„ d*e,ƒZ<e=d+kre  >¡  dS ),é    N)Úmock)Úsupport)ÚFakePathztest is not helpful for PGOÚwin32z@import msvcrt; msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY);Ú )Znonexisting_i_hopeú-cÚpassc                  C   s@   t  d¡} | d u rd S t | tj¡r<t | g¡jdkr<| fad S )NÚtruer   )	ÚshutilÚwhichÚosÚaccessÚX_OKÚ
subprocessÚrunÚ
returncodeÚZERO_RETURN_CMD)Z
shell_true© r   ú*/usr/lib/python3.9/test/test_subprocess.pyÚsetUpModule>   s    
ÿr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚBaseTestCasec                 C   s   t  ¡  d S ©N)r   Úreap_children©Úselfr   r   r   ÚsetUpI   s    zBaseTestCase.setUpc                 C   sB   t s.tjD ]}| ¡  q
t ¡  |  tjd¡ |  ¡  t ¡  d S )Nzsubprocess._active not empty)	Ú	mswindowsr   Ú_activeÚwaitÚ_cleanupÚassertFalseZ
doCleanupsr   r   )r   Úinstr   r   r   ÚtearDownN   s    

ÿzBaseTestCase.tearDownN©Ú__name__Ú
__module__Ú__qualname__r   r"   r   r   r   r   r   H   s   r   c                   @   s   e Zd ZdS )ÚPopenTestExceptionN)r$   r%   r&   r   r   r   r   r'   [   s   r'   c                   @   s   e Zd ZdZdd„ ZdS )ÚPopenExecuteChildRaiseszePopen subclass for testing cleanup of subprocess.PIPE filehandles when
    _execute_child fails.
    c                 O   s   t dƒ‚d S )NzForced Exception for Test)r'   ©r   ÚargsÚkwargsr   r   r   Ú_execute_childc   s    z&PopenExecuteChildRaises._execute_childN)r$   r%   r&   Ú__doc__r,   r   r   r   r   r(   _   s   r(   c                   @   sB  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Ze e d7¡d8d9„ ƒZ!e e d7¡d:d;„ ƒZ"e e d7¡d<d=„ ƒZ#d>d?„ Z$d@dA„ Z%dBdC„ Z&dDdE„ Z'dFdG„ Z(dHdI„ Z)e e dJ¡dKdL„ ƒZ*e e dJ¡dMdN„ ƒZ+dOdP„ Z,e e-j.e-j/kdQ¡dRdS„ ƒZ0e e-j.e-j/kdQ¡e e1 2¡ dT¡dUdV„ ƒƒZ3dWdX„ Z4dYdZ„ Z5d[d\„ Z6d]d^„ Z7d_d`„ Z8dadb„ Z9dcdd„ Z:dedf„ Z;dgdh„ Z<didj„ Z=dkdl„ Z>dmdn„ Z?dodp„ Z@dqdr„ ZAdsdt„ ZBdudv„ ZCdwdx„ ZDe e-jEdykdz¡e e1 Fd{¡d|kd}¡d~d„ ƒƒZGd€d„ ZHd‚dƒ„ ZId„d…„ ZJd†d‡„ ZKdˆd‰„ ZLdŠd‹„ ZMdŒd„ ZNdŽd„ ZOdd‘„ ZPd’d“„ ZQd”d•„ ZRd–d—„ ZSd˜d™„ ZTdšd›„ ZUdœd„ ZVdždŸ„ ZWd d¡„ ZXd¢d£„ ZYd¤d¥„ ZZd¦d§„ Z[d¨d©„ Z\dªd«„ Z]d¬d­„ Z^d®d¯„ Z_d°d±„ Z`d²d³„ Zad´dµ„ Zbd¶d·„ Zcd¸d¹„ Zddºd»„ Zed¼d½„ Zfd¾d¿„ ZgdÀdÁ„ ZhdÂdÃ„ ZidÄdÅ„ ZjdÆdÇ„ ZkdÈdÉ„ ZldÊdË„ Zme neoepdÌƒdÍ¡e neoeqdÎƒdÏ¡e neoeqdÐƒdÑ¡dÒdÓ„ ƒƒƒZre neqjs tdÔeq u¡  ¡dÕ¡dÖd×„ ƒZve e dØ¡dÙdÚ„ ƒZwe e dØ¡dÛdÜ„ ƒZxdÝdÞ„ ZydßS )àÚProcessTestCasec                 C   s    t jtt jt jt jd}zZ|  |jtj¡ |  |jtj¡ |  |j	tj¡ W |j 
¡  |j 
¡  |j	 
¡  | ¡  n(|j 
¡  |j 
¡  |j	 
¡  | ¡  0 d S )N©ÚstdinÚstdoutÚstderr)r   ÚPopenr   ÚPIPEÚassertIsInstancer0   ÚioÚBufferedIOBaser1   r2   Úcloser   ©r   Úpr   r   r   Útest_io_buffered_by_defaulti   s     þ



ý


z+ProcessTestCase.test_io_buffered_by_defaultc                 C   s¢   t jtt jt jt jdd}zZ|  |jtj¡ |  |jtj¡ |  |j	tj¡ W |j 
¡  |j 
¡  |j	 
¡  | ¡  n(|j 
¡  |j 
¡  |j	 
¡  | ¡  0 d S )Nr   )r0   r1   r2   Úbufsize)r   r3   r   r4   r5   r0   r6   Ú	RawIOBaser1   r2   r8   r   r9   r   r   r   Útest_io_unbuffered_worksw   s     þ



ý


z(ProcessTestCase.test_io_unbuffered_worksc                 C   s"   t  tjddg¡}|  |d¡ d S ©Nr   úimport sys; sys.exit(47)é/   ©r   ÚcallÚsysÚ
executableÚassertEqual©r   Úrcr   r   r   Útest_call_seq…   s    
ÿzProcessTestCase.test_call_seqc                 C   s"   | j tjtjtjddgdd d S )Nr   úwhile True: passçš™™™™™¹?©Útimeout)ÚassertRaisesr   ÚTimeoutExpiredrC   rD   rE   r   r   r   r   Útest_call_timeout‹   s    
þz!ProcessTestCase.test_call_timeoutc                 C   s   t  t¡}|  |d¡ d S ©Nr   )r   Ú
check_callr   rF   rG   r   r   r   Útest_check_call_zero”   s    
z$ProcessTestCase.test_check_call_zeroc                 C   sR   |   tj¡"}t tjddg¡ W d   ƒ n1 s40    Y  |  |jjd¡ d S r?   )	rN   r   ÚCalledProcessErrorrR   rD   rE   rF   Ú	exceptionr   ©r   Úcr   r   r   Útest_check_call_nonzero™   s
    
ÿ$z'ProcessTestCase.test_check_call_nonzeroc                 C   s"   t  tjddg¡}|  d|¡ d S )Nr   úprint('BDFL')ó   BDFL©r   Úcheck_outputrD   rE   ÚassertIn©r   Úoutputr   r   r   Útest_check_output    s    
ÿz!ProcessTestCase.test_check_outputc                 C   sR   |   tj¡"}t tjddg¡ W d   ƒ n1 s40    Y  |  |jjd¡ d S )Nr   zimport sys; sys.exit(5)é   )	rN   r   rT   r\   rD   rE   rF   rU   r   rV   r   r   r   Útest_check_output_nonzero¦   s
    
ÿ"z)ProcessTestCase.test_check_output_nonzeroc                 C   s(   t jtjddgt jd}|  d|¡ d S )Nr   ú$import sys; sys.stderr.write('BDFL')©r2   rZ   )r   r\   rD   rE   ÚSTDOUTr]   r^   r   r   r   Útest_check_output_stderr­   s
    
þz(ProcessTestCase.test_check_output_stderrc                 C   sN   t  ¡ }|  |j¡ | d¡ | d¡ tjtj	ddg|d}|  
d|¡ d S )Nó   pearr   r   ú6import sys; sys.stdout.write(sys.stdin.read().upper())©r0   ó   PEAR)ÚtempfileÚTemporaryFileÚ
addCleanupr8   ÚwriteÚseekr   r\   rD   rE   r]   )r   Útfr_   r   r   r   Útest_check_output_stdin_arg´   s    

ÿýz+ProcessTestCase.test_check_output_stdin_argc                 C   s&   t jtjddgdd}|  d|¡ d S )Nr   rh   rg   ©Úinputrj   r[   r^   r   r   r   Útest_check_output_input_argÀ   s    ÿýz+ProcessTestCase.test_check_output_input_argc                 C   s&   t jtjddgdd}|  d|¡ dS )z<input=None has a legacy meaning of input='' on check_output.r   ú3import sys; print('XX' if sys.stdin.read() else '')Nrr   s   XX©r   r\   rD   rE   ÚassertNotInr^   r   r   r   Útest_check_output_input_noneÈ   s    ÿýz,ProcessTestCase.test_check_output_input_nonec                 C   s(   t jtjddgd dd}|  d|¡ d S )Nr   ru   T)rs   ÚtextÚXXrv   r^   r   r   r   Ú!test_check_output_input_none_textÐ   s    ÿýz1ProcessTestCase.test_check_output_input_none_textc                 C   s(   t jtjddgd dd}|  d|¡ d S )Nr   ru   T)rs   Úuniversal_newlinesrz   rv   r^   r   r   r   Ú/test_check_output_input_none_universal_newlines×   s    ÿýz?ProcessTestCase.test_check_output_input_none_universal_newlinesc                 C   sd   |   t¡2}tjtjddgtjd}|  d¡ W d   ƒ n1 sB0    Y  |  d|j	j
d ¡ d S )Nr   úprint('will not be run')©r1   z-Expected ValueError when stdout arg supplied.r1   r   )rN   Ú
ValueErrorr   r\   rD   rE   r1   Úfailr]   rU   r*   ©r   rW   r_   r   r   r   Útest_check_output_stdout_argÞ   s    
þ(z,ProcessTestCase.test_check_output_stdout_argc                 C   s    t  ¡ }|  |j¡ | d¡ | d¡ |  t¡2}tj	t
jddg|dd}|  d¡ W d   ƒ n1 sj0    Y  |  d|jjd ¡ |  d	|jjd ¡ d S )
Nrg   r   r   r~   ó   hare©r0   rs   ú7Expected ValueError when stdin and input args supplied.r0   rs   )rk   rl   rm   r8   rn   ro   rN   r€   r   r\   rD   rE   r   r]   rU   r*   ©r   rp   rW   r_   r   r   r   Ú&test_check_output_stdin_with_input_argç   s    


þ(z6ProcessTestCase.test_check_output_stdin_with_input_argc                 C   s`   |   tj¡0}tjtjddgdd}|  d¡ W d   ƒ n1 sB0    Y  |  |jj	d¡ d S )Nr   úMimport sys, time
sys.stdout.write('BDFL')
sys.stdout.flush()
time.sleep(3600)é   rL   zExpected TimeoutExpired.rZ   )
rN   r   rO   r\   rD   rE   r   rF   rU   r_   r‚   r   r   r   Útest_check_output_timeoutõ   s    ÿø	(z)ProcessTestCase.test_check_output_timeoutc                 C   s8   t j ¡ }d|d< tjtjddg|d}|  |d¡ d S )NÚbananaÚFRUITr   z5import sys, os;sys.exit(os.getenv("FRUIT")=="banana")©Úenvé   )r   ÚenvironÚcopyr   rC   rD   rE   rF   )r   ÚnewenvrH   r   r   r   Útest_call_kwargs  s    

ÿýz ProcessTestCase.test_call_kwargsc                 C   s~   t  ¡ R}| jttjdd tjjjj}dg|d  }| jttjg|¢R Ž  W d   ƒ n1 s`0    Y  |  	| 
¡ d¡ d S )Nr   )Zinvalid_arg_namer   r   )r   Zcaptured_stderrrN   Ú	TypeErrorr   r3   Ú__init__Ú__code__Úco_argcountrF   Úgetvalue)r   ÚsZargcountZtoo_many_argsr   r   r   Útest_invalid_args  s    
4z!ProcessTestCase.test_invalid_argsc                 C   sR   t jtjddgt jt jd}|  |jj¡ |  |jj¡ | 	¡  |  
|jd ¡ d S )Nr   úprint("banana")©r1   r2   )r   r3   rD   rE   r4   rm   r1   r8   r2   r   rF   r0   r9   r   r   r   Útest_stdin_none  s    ÿzProcessTestCase.test_stdin_nonec                 C   sl   d}t jtjd|gt jt jd}|  |jj¡ |  |jj¡ | 	¡ \}}|  
|jd|¡ |  
| ¡ d¡ d S )Nz²import sys; from subprocess import Popen, PIPE;p = Popen([sys.executable, "-c", "print('test_stdout_none')"],          stdin=PIPE, stderr=PIPE);p.wait(); assert p.stdout is None;r   r   r   s   test_stdout_none©r   r3   rD   rE   r4   rm   r1   r8   r2   ÚcommunicaterF   r   Úrstrip©r   Úcoder:   ÚoutÚerrr   r   r   Útest_stdout_none!  s    ÿz ProcessTestCase.test_stdout_nonec                 C   sR   t jtjddgt jt jd}|  |jj¡ |  |jj¡ | 	¡  |  
|jd ¡ d S )Nr   rœ   ©r0   r1   )r   r3   rD   rE   r4   rm   r1   r8   r0   r   rF   r2   r9   r   r   r   Útest_stderr_none8  s    ÿz ProcessTestCase.test_stderr_nonec                 K   s6   |dg }t j|fi |¤Ž}| ¡  |  d|j¡ d S ©Nr@   rA   )r   r3   r   rF   r   )r   Úpre_argsr+   r*   r:   r   r   r   Ú_assert_pythonA  s    
zProcessTestCase._assert_pythonc                 C   s0   t j t j tj¡d¡}| j|dgtjd d S ©NÚdoesnotexistr   ©rE   )r   ÚpathÚjoinÚdirnamerD   rE   r«   ©r   r­   r   r   r   Útest_executableI  s    ÿzProcessTestCase.test_executablec                 C   s6   t j t j tj¡d¡}| j|dgt  tj¡d d S r¬   )r   r¯   r°   r±   rD   rE   r«   Úfsencoder²   r   r   r   Útest_bytes_executableT  s    ÿ

ÿz%ProcessTestCase.test_bytes_executablec                 C   s4   t j t j tj¡d¡}| j|dgttjƒd d S r¬   )r   r¯   r°   r±   rD   rE   r«   r   r²   r   r   r   Útest_pathlike_executableZ  s    ÿ
ÿz(ProcessTestCase.test_pathlike_executablec                 C   s0   t jdg}|  |¡ | jt| j|td d d S )Nr   r   r®   )rD   rE   r«   rN   ÚNONEXISTING_ERRORSÚNONEXISTING_CMD)r   rª   r   r   r   Ú test_executable_takes_precedence`  s    

þz0ProcessTestCase.test_executable_takes_precedencez"executable argument replaces shellc                 C   s   | j g tjdd d S ©NT)rE   Úshell)r«   rD   rE   r   r   r   r   Útest_executable_replaces_shellj  s    z.ProcessTestCase.test_executable_replaces_shellc                 C   s   | j g t tj¡dd d S rº   )r«   r   r´   rD   rE   r   r   r   r   Ú$test_bytes_executable_replaces_shellp  s    ÿz4ProcessTestCase.test_bytes_executable_replaces_shellc                 C   s   | j g ttjƒdd d S rº   )r«   r   rD   rE   r   r   r   r   Ú'test_pathlike_executable_replaces_shellu  s    ÿz7ProcessTestCase.test_pathlike_executable_replaces_shellc                 C   s6   t  |¡ t ¡ W  d   ƒ S 1 s(0    Y  d S r   )r   Z
change_cwdr   Úgetcwd)r   Úcwdr   r   r   Ú_normalize_cwd{  s    zProcessTestCase._normalize_cwdc                 C   s   t j tj¡}t j |¡S r   )r   r¯   ÚrealpathrD   rE   Úsplit)r   Zpython_pathr   r   r   Ú_split_python_pathƒ  s    z"ProcessTestCase._split_python_pathc                 K   sl   t j|ddgfdt ji|¤Ž}|  |jj¡ | ¡  |  d|j¡ t	j
j}|  ||ƒ||j ¡  ¡ ƒ¡ d S )Nr   zcimport os, sys; buf = sys.stdout.buffer; buf.write(os.getcwd().encode()); buf.flush(); sys.exit(47)r1   rA   )r   r3   r4   rm   r1   r8   r   rF   r   r   r¯   ÚnormcaseÚreadÚdecode)r   Zexpected_cwdZ
python_argr+   r:   rÅ   r   r   r   Ú_assert_cwd‰  s    ÿúù
ÿzProcessTestCase._assert_cwdc                 C   s(   t  ¡ }|  |¡}| j|tj|d d S ©N©rÀ   )rk   Ú
gettempdirrÁ   rÈ   rD   rE   ©r   Útemp_dirr   r   r   Útest_cwdœ  s    
zProcessTestCase.test_cwdc                 C   s.   t  ¡ }|  |¡}| j|tjt |¡d d S rÉ   )rk   rË   rÁ   rÈ   rD   rE   r   r´   rÌ   r   r   r   Útest_cwd_with_bytes¢  s    
z#ProcessTestCase.test_cwd_with_bytesc                 C   s,   t  ¡ }|  |¡}| j|tjt|ƒd d S rÉ   )rk   rË   rÁ   rÈ   rD   rE   r   rÌ   r   r   r   Útest_cwd_with_pathlike§  s    
z&ProcessTestCase.test_cwd_with_pathlikez"pending resolution of issue #15533c                 C   sŠ   |   ¡ \}}tj tj|¡}t ¡ R}|  tt	j
|g¡ | jtt	j
|g|d |  |¡}| j|||d W d   ƒ n1 s|0    Y  d S rÉ   ©rÄ   r   r¯   r°   Úcurdirr   Ztemp_cwdrN   ÚFileNotFoundErrorr   r3   rÁ   rÈ   )r   Ú
python_dirÚpython_baseÚ
rel_pythonÚ	wrong_dirr   r   r   Útest_cwd_with_relative_arg¬  s    

ÿ
ÿ
z*ProcessTestCase.test_cwd_with_relative_argc                 C   s–   |   ¡ \}}tj tj|¡}d}t ¡ Z}| jtt	j
|g|d | jtt	j
|g||d |  |¡}| j||||d W d   ƒ n1 sˆ0    Y  d S )NÚsomethingyoudonthaver®   ©rE   rÀ   rÑ   )r   rÔ   rÕ   rÖ   Zdoesntexistr×   r   r   r   Ú!test_cwd_with_relative_executable¼  s    

ÿ
þ

ÿz1ProcessTestCase.test_cwd_with_relative_executablec                 C   s†   |   ¡ \}}tj ||¡}tj tj|¡}t ¡ @}| jtt	j
|g|d |  |¡}| j|||d W d   ƒ n1 sx0    Y  d S rÉ   )rÄ   r   r¯   r°   rÒ   r   rÍ   rN   rÓ   r   r3   rÁ   rÈ   )r   rÔ   rÕ   Z
abs_pythonrÖ   r×   r   r   r   Útest_cwd_with_absolute_argÏ  s    

ÿ
z*ProcessTestCase.test_cwd_with_absolute_argzTest is not venv-compatiblec                 C   s.   |   ¡ \}}|  |¡}| j|dtj|d d S )NrÙ   rÚ   )rÄ   rÁ   rÈ   rD   rE   )r   rÔ   rÕ   r   r   r   Útest_executable_with_cwdÝ  s
    
ÿz(ProcessTestCase.test_executable_with_cwdz#need an installed Python. See #7774c                 C   s   | j t ¡ dtjd d S )NrÙ   r®   )rÈ   r   r¿   rD   rE   r   r   r   r   Útest_executable_without_cwdå  s    ÿz+ProcessTestCase.test_executable_without_cwdc                 C   sH   t jtjddgt jd}|j d¡ |j ¡  | ¡  |  	|j
d¡ d S )Nr   ú0import sys; sys.exit(sys.stdin.read() == "pear")ri   rg   r   )r   r3   rD   rE   r4   r0   rn   r8   r   rF   r   r9   r   r   r   Útest_stdin_pipeï  s    
ÿþ
zProcessTestCase.test_stdin_pipec                 C   sf   t  ¡ }|  |j¡ | ¡ }t |d¡ t |dd¡ tj	t
jddg|d}| ¡  |  |jd¡ d S ©Nrg   r   r   rß   ri   r   )rk   rl   rm   r8   Úfilenor   rn   Úlseekr   r3   rD   rE   r   rF   r   ©r   rp   Údr:   r   r   r   Útest_stdin_filedesù  s    
ÿþz"ProcessTestCase.test_stdin_filedesc                 C   sX   t  ¡ }|  |j¡ | d¡ | d¡ tjtj	ddg|d}| 
¡  |  |jd¡ d S rá   )rk   rl   rm   r8   rn   ro   r   r3   rD   rE   r   rF   r   ©r   rp   r:   r   r   r   Útest_stdin_fileobj  s    


ÿþz"ProcessTestCase.test_stdin_fileobjc                 C   sR   t jtjddgt jd}|" |  |j ¡ d¡ W d   ƒ n1 sD0    Y  d S )Nr   ú&import sys; sys.stdout.write("orange")r   ó   orange©r   r3   rD   rE   r4   rF   r1   rÆ   r9   r   r   r   Útest_stdout_pipe  s    
ÿþz ProcessTestCase.test_stdout_pipec                 C   s`   t  ¡ }|  |j¡ | ¡ }tjtjddg|d}| 	¡  t
 |dd¡ |  t
 |d¡d¡ d S )Nr   ré   r   r   é   rê   ©rk   rl   rm   r8   râ   r   r3   rD   rE   r   r   rã   rF   rÆ   rä   r   r   r   Útest_stdout_filedes  s    
ÿþz#ProcessTestCase.test_stdout_filedesc                 C   sP   t  ¡ }|  |j¡ tjtjddg|d}| ¡  | 	d¡ |  
| ¡ d¡ d S )Nr   ré   r   r   rê   ©rk   rl   rm   r8   r   r3   rD   rE   r   ro   rF   rÆ   rç   r   r   r   Útest_stdout_fileobj&  s    
ÿþ
z#ProcessTestCase.test_stdout_fileobjc                 C   sR   t jtjddgt jd}|" |  |j ¡ d¡ W d   ƒ n1 sD0    Y  d S )Nr   ú*import sys; sys.stderr.write("strawberry")rd   ó
   strawberry)r   r3   rD   rE   r4   rF   r2   rÆ   r9   r   r   r   Útest_stderr_pipe1  s    
ÿþz ProcessTestCase.test_stderr_pipec                 C   s`   t  ¡ }|  |j¡ | ¡ }tjtjddg|d}| 	¡  t
 |dd¡ |  t
 |d¡d¡ d S )Nr   rò   rd   r   rí   ró   rî   rä   r   r   r   Útest_stderr_filedes9  s    
ÿþz#ProcessTestCase.test_stderr_filedesc                 C   sP   t  ¡ }|  |j¡ tjtjddg|d}| ¡  | 	d¡ |  
| ¡ d¡ d S )Nr   rò   rd   r   ró   rð   rç   r   r   r   Útest_stderr_fileobjE  s    
ÿþ
z#ProcessTestCase.test_stderr_fileobjc                 C   sR   t jtjddgt jt jd}| ¡ \}}|  |d¡ |  |d¡ |  |jd¡ d S )Nr   z›import sys, subprocess;rc = subprocess.call([sys.executable, "-c",    "import sys;"    "sys.stderr.write('42')"],    stderr=subprocess.STDOUT);sys.exit(rc)r   s   42ó    r   ©r   r3   rD   rE   r4   r    rF   r   ©r   r:   r1   r2   r   r   r   Ú,test_stderr_redirect_with_no_stdout_redirectP  s    
ÿø	z<ProcessTestCase.test_stderr_redirect_with_no_stdout_redirectc                 C   sV   t jtjddgt jt jd}|" |  |j ¡ d¡ W d   ƒ n1 sH0    Y  d S )Nr   úRimport sys;sys.stdout.write("apple");sys.stdout.flush();sys.stderr.write("orange")r   ó   appleorange)	r   r3   rD   rE   r4   re   rF   r1   rÆ   r9   r   r   r   Útest_stdout_stderr_pipee  s    
ÿúz'ProcessTestCase.test_stdout_stderr_pipec                 C   sR   t  ¡ }|  |j¡ tjtjddg||d}| ¡  | 	d¡ |  
| ¡ d¡ d S )Nr   rû   r   r   rü   rð   rç   r   r   r   Útest_stdout_stderr_fileq  s    
ÿú
z'ProcessTestCase.test_stdout_stderr_filec                 C   sl   d}t jtjd|gt jt jd}|  |jj¡ |  |jj¡ | 	¡ \}}|  
|jd|¡ |  
| ¡ d¡ d S )Nzµimport sys, subprocess; rc = subprocess.call([sys.executable, "-c",     "import os, sys; sys.exit(os.write(sys.stdout.fileno(), b'test with stdout=1'))"], stdout=1); assert rc == 18r   r   r   s   test with stdout=1rŸ   r¢   r   r   r   Útest_stdout_filedes_of_stdout€  s    ÿz-ProcessTestCase.test_stdout_filedes_of_stdoutc                 C   s2   t jtjddgt jd}| ¡  |  |jd ¡ d S )Nr   z'for i in range(10240):print("x" * 1024)r   )r   r3   rD   rE   ÚDEVNULLr   rF   r1   r9   r   r   r   Útest_stdout_devnull“  s    
ÿýz#ProcessTestCase.test_stdout_devnullc                 C   s2   t jtjddgt jd}| ¡  |  |jd ¡ d S )Nr   z=import sys
for i in range(10240):sys.stderr.write("x" * 1024)rd   )r   r3   rD   rE   r   r   rF   r2   r9   r   r   r   Útest_stderr_devnull›  s    
ÿüz#ProcessTestCase.test_stderr_devnullc                 C   s2   t jtjddgt jd}| ¡  |  |jd ¡ d S )Nr   zimport sys;sys.stdin.read(1)ri   )r   r3   rD   rE   r   r   rF   r0   r9   r   r   r   Útest_stdin_devnull¤  s    
ÿýz"ProcessTestCase.test_stdin_devnullc                 C   sh   t j ¡ }d|d< tjtjddgtj|d(}| ¡ \}}|  	|d¡ W d   ƒ n1 sZ0    Y  d S )NÚoranger   r   ú2import sys,os;sys.stdout.write(os.getenv("FRUIT"))©r1   r   rê   )
r   r‘   r’   r   r3   rD   rE   r4   r    rF   ©r   r“   r:   r1   r2   r   r   r   Útest_env¬  s    

ÿüzProcessTestCase.test_envr   z#cannot test an empty env on WindowsZPy_ENABLE_SHAREDr   zEThe Python shared library cannot be loaded with an empty environment.c                    sˆ   dd„ ‰ t jtjddgt ji dR}| ¡ \}}t| ¡ ƒ}|  |t	¡ ‡ fdd„|D ƒ}|  
|g ¡ W d  ƒ n1 sz0    Y  dS )	z+Verify that env={} is as empty as possible.c                 S   s*   d| v p(d| v p(| dkp(|   d¡p(| dkS )z:Determine if an environment variable is under our control.Z	VERSIONERZ__CFZ
LD_PRELOADZSANDBOXÚLC_CTYPE)Ú
startswith)Únr   r   r   Úis_env_var_to_ignoreÁ  s    ÿÿþz<ProcessTestCase.test_empty_env.<locals>.is_env_var_to_ignorer   z)import os; print(list(os.environ.keys()))r  c                    s   g | ]}ˆ |ƒs|‘qS r   r   )Ú.0Úk©r  r   r   Ú
<listcomp>Ð  s   ÿz2ProcessTestCase.test_empty_env.<locals>.<listcomp>N)r   r3   rD   rE   r4   r    ÚevalÚstripr5   ÚlistrF   )r   r:   r1   r2   Zchild_env_namesr   r  r   Útest_empty_env¹  s    	
ÿþzProcessTestCase.test_empty_envc                 C   s„   t jd }|  t¡  t |ddg¡ W d   ƒ n1 s:0    Y  |  t¡" t t jddg¡ W d   ƒ n1 sv0    Y  d S )Nú r   r   zpass# )rD   rE   rN   r€   r   r3   )r   Úcmdr   r   r   Útest_invalid_cmdÔ  s
    
.z ProcessTestCase.test_invalid_cmdc                 C   sH  t j ¡ }d|d< |  t¡ tjt|d W d   ƒ n1 s@0    Y  t j ¡ }d|d< |  t¡ tjt|d W d   ƒ n1 sŠ0    Y  t j ¡ }d|d< |  t¡ tjt|d W d   ƒ n1 sÔ0    Y  t j ¡ }d|d< tjtj	d	d
gtj
|d(}| ¡ \}}|  |d¡ W d   ƒ n1 s:0    Y  d S )NZcabbagezFRUIT VEGETABLErŽ   zorange VEGETABLE=cabbager   ZlemonzFRUIT=ORANGEzorange=lemonr   z3import sys, os;sys.stdout.write(os.getenv("FRUIT"))r  s   orange=lemon)r   r‘   r’   rN   r€   r   r3   r   rD   rE   r4   r    rF   r  r   r   r   Útest_invalid_envÞ  s.    
,
,
,

ÿüz ProcessTestCase.test_invalid_envc                 C   s4   t jtjddgt jd}| d¡ |  |jd¡ d S )Nr   z/import sys;sys.exit(sys.stdin.read() == "pear")ri   rg   r   rø   r9   r   r   r   Útest_communicate_stdinü  s    
ÿý
z&ProcessTestCase.test_communicate_stdinc                 C   s@   t jtjddgt jd}| ¡ \}}|  |d¡ |  |d ¡ d S )Nr   z)import sys; sys.stdout.write("pineapple")r   ó	   pineapple©r   r3   rD   rE   r4   r    rF   rù   r   r   r   Útest_communicate_stdout  s    
ÿþz'ProcessTestCase.test_communicate_stdoutc                 C   s@   t jtjddgt jd}| ¡ \}}|  |d ¡ |  |d¡ d S )Nr   z)import sys; sys.stderr.write("pineapple")rd   r  r  rù   r   r   r   Útest_communicate_stderr  s    
ÿþz'ProcessTestCase.test_communicate_stderrc                 C   st   t jtjddgt jt jt jd}|  |jj¡ |  |jj¡ |  |j	j¡ | 
d¡\}}|  |d¡ |  |d¡ d S )Nr   zNimport sys,os;sys.stderr.write("pineapple");sys.stdout.write(sys.stdin.read())r/   ó   bananar  )r   r3   rD   rE   r4   rm   r1   r8   r2   r0   r    rF   rù   r   r   r   Útest_communicate  s    
ÿúz ProcessTestCase.test_communicatec                 C   sd   t jtjddgdt jt jt jd}| jt j|jddd | ¡ \}}|  |d¡ |  | 	¡ d¡ d S )	Nr   z~import sys,os,time;sys.stderr.write("pineapple\n");time.sleep(1);sys.stderr.write("pear\n");sys.stdout.write(sys.stdin.read())T)r|   r0   r1   r2   rŒ   g333333Ó?rL   s   pineapple
pear
)
r   r3   rD   rE   r4   rN   rO   r    rF   Úencoderù   r   r   r   Útest_communicate_timeout#  s    
ÿ÷
ÿz(ProcessTestCase.test_communicate_timeoutc                 C   sL   t jtjddgt jd}| jt j|jdd | ¡ \}}|  t	|ƒd¡ d S )Nr   zÓimport sys,os,time;sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));time.sleep(0.2);sys.stdout.write("a" * (64 * 1024));r   gš™™™™™Ù?rL   i   )
r   r3   rD   rE   r4   rN   rO   r    rF   Úlen)r   r:   r1   Ú_r   r   r   Ú%test_communicate_timeout_large_output6  s    
ÿ	÷
z5ProcessTestCase.test_communicate_timeout_large_outputc                 C   s¸   dD ]®}dD ]¤}dD ]š}i }|r*t j|d< |r8t j|d< |rFt j|d< |sLqt jtfi |¤Ž}| ¡  |jd ur~|  |jj¡ |jd ur–|  |jj¡ |j	d ur|  |j	j¡ qqqd S )N©FTr0   r1   r2   )
r   r4   r3   r   r    r0   Ú
assertTrueÚclosedr1   r2   )r   Z
stdin_pipeZstdout_pipeZstderr_pipeÚoptionsr:   r   r   r   Útest_communicate_pipe_fd_leakG  s(    





z-ProcessTestCase.test_communicate_pipe_fd_leakc                 C   s:   t  tjddg¡}| ¡ \}}|  |d ¡ |  |d ¡ d S )Nr   r@   )r   r3   rD   rE   r    rF   rù   r   r   r   Útest_communicate_returns]  s    
ÿz(ProcessTestCase.test_communicate_returnsc                 C   s˜   t  ¡ \}}t  |¡ t  |¡ tjtjddtj gtj	tj	tj	d}|  
|jj¡ |  
|jj¡ |  
|jj¡ dtj }| |¡\}}|  ||¡ d S )Nr   zpimport sys,os;sys.stdout.write(sys.stdin.read(47));sys.stderr.write("x" * %d);sys.stdout.write(sys.stdin.read())r/   ó   a)r   Úpiper8   r   r3   rD   rE   r   ÚPIPE_MAX_SIZEr4   rm   r1   r2   r0   r    rF   )r   ÚxÚyr:   Zstring_to_writer1   r2   r   r   r   Útest_communicate_pipe_bufe  s$    


üÿø	
z)ProcessTestCase.test_communicate_pipe_bufc                 C   s€   t jtjddgt jt jt jd}|  |jj¡ |  |jj¡ |  |j	j¡ |j	 
d¡ | d¡\}}|  |d¡ |  |d¡ d S )Nr   z0import sys,os;sys.stdout.write(sys.stdin.read())r/   r  s   splits   bananasplitr÷   )r   r3   rD   rE   r4   rm   r1   r8   r2   r0   rn   r    rF   rù   r   r   r   Útest_writes_before_communicate|  s    
ÿûz.ProcessTestCase.test_writes_before_communicatec              
   C   sì   t jddt d g}dD ]Î}tj|fi dtjdtj|di¤Ž}|” |j d¡ |j ¡  |  	|j
 ¡ d¡ |j d	¡ |j ¡  |  |j
j¡ |  	|j
 ¡ d
¡ |  	|j
 d¡d	¡ |  	|j
 ¡ d¡ W d   ƒ q1 sÜ0    Y  qd S )Nr   úimport sys,os;a@  buf = sys.stdout.buffer;buf.write(sys.stdin.readline().encode());buf.flush();buf.write(b"line2\n");buf.flush();buf.write(sys.stdin.read().encode());buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");)r|   ry   r0   r1   Tzline1
zline3
zline2
é   zline4
line5
line6
line7
line8)rD   rE   Ú	SETBINARYr   r3   r4   r0   rn   ÚflushrF   r1   Úreadliner8   rm   rÆ   )r   r*   Zextra_kwargr:   r   r   r   Ú test_universal_newlines_and_textŒ  s4    ÿþþ

ÿÿÿz0ProcessTestCase.test_universal_newlines_and_textc                 C   s^   t jtjddt d gt jt jdd}|  |jj¡ |  |j	j¡ | 
¡ \}}|  |d¡ d S )Nr   r2  zÚbuf = sys.stdout.buffer;buf.write(b"line2\n");buf.flush();buf.write(b"line4\n");buf.flush();buf.write(b"line5\r\n");buf.flush();buf.write(b"line6\r");buf.flush();buf.write(b"\nline7");buf.flush();buf.write(b"\nline8");r   )r2   r1   r|   z#line2
line4
line5
line6
line7
line8)r   r3   rD   rE   r4  r4   rm   r1   r8   r2   r    rF   rù   r   r   r   Ú#test_universal_newlines_communicate³  s    
ÿÿðÿz3ProcessTestCase.test_universal_newlines_communicatec                 C   sH   t jtjddt t d¡ gt jdd}| d¡\}}|  	|j
d¡ d S )Nr   r2  a  
                               s = sys.stdin.readline()
                               assert s == "line1\n", repr(s)
                               s = sys.stdin.read()
                               assert s == "line3\n", repr(s)
                              r   )r0   r|   úline1
line3
r   )r   r3   rD   rE   r4  ÚtextwrapÚdedentr4   r    rF   r   rù   r   r   r   Ú)test_universal_newlines_communicate_stdinÌ  s    
ÿø	z9ProcessTestCase.test_universal_newlines_communicate_stdinc                 C   s0   t jtt jt jdd}| ¡  |  |jd¡ d S )NT)r0   r1   r|   r   )r   r3   r   r4   r    rF   r   r9   r   r   r   Ú.test_universal_newlines_communicate_input_noneÚ  s    ýz>ProcessTestCase.test_universal_newlines_communicate_input_nonec                 C   sˆ   t jtjddt t d¡ gt jt jt jdd}|  |j	j
¡ |  |jj
¡ | d¡\}}|  |jd¡ |  d|¡ |  | d	¡¡ d S )
Nr   r2  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)r0   r2   r1   r|   r9  r   zline1
line2
line3
line4
line5
zeline2
eline6
eline7
)r   r3   rD   rE   r4  r:  r;  r4   rm   r1   r8   r2   r    rF   r   r&  r
  rù   r   r   r   Ú7test_universal_newlines_communicate_stdin_stdout_stderræ  s    
ÿðzGProcessTestCase.test_universal_newlines_communicate_stdin_stdout_stderrc                 C   sT   dD ]J}d| }t jd|g}tj|tjtj|d}|jdd\}}|  |d¡ qd S )N)zutf-16z	utf-32-bez@import sys; sys.stdout.buffer.write('1\r\n2\r3\n4'.encode('%s'))r   )r0   r1   Úencodingr   rr   z1
2
3
4)rD   rE   r   r3   r4   r    rF   )r   r?  r£   r*   Úpopenr1   r2   r   r   r   Ú-test_universal_newlines_communicate_encodings  s    þýz=ProcessTestCase.test_universal_newlines_communicate_encodingsc                 C   s\   dD ]R\}}d}t jd|g}tj|tjtjd|d}|jdd\}}|  |d |¡¡ qd S )	N))Úignorer   )Úreplaceu   ï¿½ï¿½)Úsurrogateescapeu   í²€í²€)Úbackslashreplacez\x80\x80z2import sys; sys.stdout.buffer.write(b'[\x80\x80]')r   úutf-8)r0   r1   r?  Úerrorsr   rr   z[{}])rD   rE   r   r3   r4   r    rF   Úformat)r   rG  Úexpectedr£   r*   r@  r1   r2   r   r   r   Útest_communicate_errors  s    üz'ProcessTestCase.test_communicate_errorsc           
      C   sX  t s
d}nd}g }t ¡ }zt|ƒD ]t}z.tj |tj¡}| 	t 
|tjtjB ¡¡ W q& ty˜ } z(|jtjkrv‚ W Y d }~ qªW Y d }~q&d }~0 0 q&|  d| ¡ tdƒD ]}t | ¡ ¡ q²tdƒD ]>}tjtjddgtjtjtjd}| d	¡d
 }|  |d	¡ qÎW |D ]}	t |	¡ qt |¡ n"|D ]}	t |	¡ q6t |¡ 0 d S )Ni  i  z4failed to reach the file descriptor limit (tried %d)é
   é   r   z-import sys;sys.stdout.write(sys.stdin.read())r/   s   limer   )r   rk   ÚmkdtempÚranger   r¯   r°   r   ZTESTFNÚappendÚopenÚO_WRONLYÚO_CREATÚOSErrorÚerrnoZEMFILEÚskipTestr8   Úpopr   r3   rD   rE   r4   r    rF   r
   Úrmtree)
r   Zmax_handlesÚhandlesÚtmpdirÚiZtmpfileÚer:   ÚdataÚhr   r   r   Útest_no_leaking-  sF    &ÿ
ÿûþzProcessTestCase.test_no_leakingc                 C   s´   |   t g d¢¡d¡ |   t g d¢¡d¡ |   t g d¢¡d¡ |   t g d¢¡d¡ |   t g d	¢¡d
¡ |   t g d¢¡d¡ |   t g d¢¡d¡ |   t ddg¡d¡ d S )N)za b crå   r[  z"a b c" d e)úab"cú\rå   z	ab\"c \ d)r_  z \rå   zab\"c " \\" d)za\\\bzde fgr]  za\\\b "de fg" h)za\"brW   rå   z
a\\\"b c d)za\\b crå   r[  z"a\\b c" d e)za\\b\ crå   r[  z"a\\b\ c" d eÚabr   zab "")rF   r   Úlist2cmdliner   r   r   r   Útest_list2cmdlineT  s0    ÿÿÿÿÿÿÿÿz!ProcessTestCase.test_list2cmdlinec                 C   sb   t jtjddgt jd}|  |jj¡ |  | 	¡ ¡ t
 |j ¡ d¡ | ¡  |  | 	¡ d¡ d S )Nr   zimport os; os.read(0, 1)ri   ó   Ar   )r   r3   rD   rE   r4   rm   r0   r8   ÚassertIsNoneÚpollr   rn   râ   r   rF   r9   r   r   r   Ú	test_pollf  s    
ÿþzProcessTestCase.test_pollc                 C   s.   t  t¡}|  | ¡ d¡ |  | ¡ d¡ d S rQ   ©r   r3   r   rF   r   r9   r   r   r   Ú	test_waitq  s    
zProcessTestCase.test_waitc                 C   sv   t  tjddg¡}|  t j¡}|jdd W d   ƒ n1 s@0    Y  |  dt|j	ƒ¡ |  
|jtjdd¡ d S )Nr   zimport time; time.sleep(0.3)ç-Cëâ6?rL   z0.0001r   )r   r3   rD   rE   rN   rO   r   r]   ÚstrrU   rF   r   ÚSHORT_TIMEOUT)r   r:   rW   r   r   r   Útest_wait_timeoutw  s    ÿ*z!ProcessTestCase.test_wait_timeoutc                 C   s:   |   t¡ t td¡ W d   ƒ n1 s,0    Y  d S )Nr  )rN   r•   r   r3   r   r   r   r   r   Útest_invalid_bufsize  s    z$ProcessTestCase.test_invalid_bufsizec                 C   s>   t  td ¡}|  | ¡ d¡ t jtd d}|  | ¡ d¡ d S )Nr   )r<   rh  r9   r   r   r   Útest_bufsize_is_none…  s    z$ProcessTestCase.test_bufsize_is_nonec              
   C   sØ   t jtjddgt jt jt jd|d†}|j |¡ t 	|j 
¡ ¡ |j ¡ }t ¡ 2 z|j 	¡  W n tyv   Y n0 W d   ƒ n1 sŒ0    Y  d |_W d   ƒ n1 s°0    Y  |  |jd¡ |  ||¡ d S )Nr   zDimport sys;sys.stdout.write(sys.stdin.readline());sys.stdout.flush()r   )r0   r1   r2   r<   r|   r   )r   r3   rD   rE   r4   r   r0   rn   r   r8   râ   r1   r6  r   ÚSuppressCrashReportrS  rF   r   )r   ÚlinerI  r|   r:   Z	read_liner   r   r   Ú_test_bufsize_equal_one  s&    ù

$$z'ProcessTestCase._test_bufsize_equal_onec                 C   s   d}| j ||dd d S )Nzline
T©r|   )rr  ©r   rq  r   r   r   Ú test_bufsize_equal_one_text_mode£  s    z0ProcessTestCase.test_bufsize_equal_one_text_modec                 C   sN   dt j ¡  }|  td¡  | j|ddd W d   ƒ n1 s@0    Y  d S )Ns   linezline bufferingr÷   Frs  )r   Úlinesepr   ZassertWarnsRegexÚRuntimeWarningrr  rt  r   r   r   Ú"test_bufsize_equal_one_binary_mode©  s    z2ProcessTestCase.test_bufsize_equal_one_binary_modec              	   C   sP   t dƒD ]B}|  t¡$ tjttjtjd W d   ƒ q1 s@0    Y  qd S )Nrí   r   )rN  rN   r·   r   r3   r¸   r4   )r   rZ  r   r   r   Útest_leaking_fds_on_error°  s    þz)ProcessTestCase.test_leaking_fds_on_errorc              	   C   s²   zdd l }|j W n  ttfy2   |  d¡ Y n0 t dt›d¡}tj	d|g}t
j|t
jdd}| | ¡ d }W d   ƒ n1 sŠ0    Y  |  |d	¡ |  |jd¡ d S )
Nr   zneed msvcrt.CrtSetReportModezL
            import msvcrt
            import subprocess

            cmd = a  

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

            try:
                subprocess.Popen(cmd,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            except OSError:
                pass
        r   T)r2   r|   r   r   )ÚmsvcrtZCrtSetReportModeÚAttributeErrorÚImportErrorrU  r:  r;  r¸   rD   rE   r   r3   r4   r    rF   r   )r   rz  r£   r  Úprocr2   r   r   r   Útest_nonexisting_with_pipes¼  s"    
ü
þ*z+ProcessTestCase.test_nonexisting_with_pipesc                    s*  g ‰ ‡ fdd„}t j|d}| ¡  z |  t¡( tjttjtjtjd W d   ƒ n1 s^0    Y  W | 	¡  d }ˆ D ]<}zt
 |¡ W qz ty´ } z|}W Y d }~qzd }~0 0 qz|d urÄ|‚n`| 	¡  d }ˆ D ]>}zt
 |¡ W qÖ ty } z|}W Y d }~qÖd }~0 0 qÖ|d ur$|‚0 d S )Nc                     s*   t dƒD ]} ˆ  t ¡ ¡ t d¡ qd S )Né   gü©ñÒMbP?)rN  Úextendr   r,  ÚtimeÚsleep)rZ  ©Úfdsr   r   Úopen_fdsè  s    z<ProcessTestCase.test_double_close_on_error.<locals>.open_fds)Útargetr/   )Ú	threadingÚThreadÚstartrN   ÚEnvironmentErrorr   r3   r¸   r4   r°   r   r8   rS  )r   r…  ÚtÚexcÚfdr[  r   rƒ  r   Útest_double_close_on_errorå  s:    ý&õ
z*ProcessTestCase.test_double_close_on_errorc                    s´   t  tjddg¡‰ |  ˆ jd¡ g ‰‡ ‡fdd„}t d|¡}| ¡  t	rPd}nd}ˆ j
tjd	 | jˆ j|d
d ˆ  
¡  | jˆ j|dd | ¡  |  dd|fd|fgˆ¡ dS )z?Issue21291: Popen.wait() needs to be threadsafe for returncode.r   zimport time; time.sleep(12)Nc                      sN   ˆ  dˆ  ¡ f¡ ˆ  ¡  ˆ  ¡  ˆ  dˆ jf¡ ˆ  ¡  ˆ  dˆ jf¡ d S )Núthread-start-poll-resultúthread-after-kill-and-waitúthread-after-second-wait)rO  rf  Úkillr   r   r   ©r}  Úresultsr   r   Úkill_proc_timer_thread	  s    zDProcessTestCase.test_threadsafe_wait.<locals>.kill_proc_timer_threadçš™™™™™É?r   i÷ÿÿÿrL   z*unexpected result in wait from main thread©Úmsgz&unexpected result in second main wait.)r  Nr  r‘  )r   r3   rD   rE   rF   r   r‡  ÚTimerr‰  r   r   r   rl  r°   )r   r•  r‹  Zexpected_errorcoder   r“  r   Útest_threadsafe_wait  s4    
ÿ
ÿ
ÿþýz$ProcessTestCase.test_threadsafe_waitc                 C   s6   d  d¡}t tjd|g¡}|  | d¡t|ƒ¡ d S )Nú;)zimport subprocess, syszJretcode = subprocess.call([sys.executable, '-c', 'print("Hello World!")'])zassert retcode == 0r   s   Hello World!)r°   r   r\   rD   rE   r&  r
  Úascii)r   r£   r_   r   r   r   Útest_issue87806  s    
zProcessTestCase.test_issue8780c                 C   sÆ   t  ¡ \}}t  ¡ \}}t  ¡ \}}ztjdg|||d W nN tyŠ   t |¡ t |¡ t |¡ t |¡ t |¡ t |¡ Y n0 |  tj	 
|¡¡ |  tj	 
|¡¡ |  tj	 
|¡¡ d S )NÚ*r/   )rk   Úmkstempr   r3   rS  r   r8   Úremover    r¯   Úexists)r   ZifhandleZifnameZofhandleZofnameZefhandleZefnamer   r   r   Ú test_handles_closed_on_exceptionA  s"    ÿ





z0ProcessTestCase.test_handles_closed_on_exceptionc                 C   sT   t jtt jt jt jd}|  |jj¡ |  |jj¡ |  |jj¡ | 	dd ¡ d S )Nr/   ó   xé   )
r   r3   r   r4   rm   r1   r8   r2   r0   r    r9   r   r   r   Útest_communicate_epipeU  s    ýz&ProcessTestCase.test_communicate_epipec           	   
   C   s²   t  d¡}|jj}dddgdd dfg d¢dd df|dd	d
|› dfg}tjj tj	d¡F |D ]0\}}}}tj	||d}||_
|  t|ƒ|¡ q^W d   ƒ n1 s¤0    Y  d S )Nz
my-tool.py)ÚlsTé{   z#<Popen: returncode: 123 args: 'ls'>)ÚdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTr   zP<Popen: returncode: 0 args: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...>r¦  Fz&<Popen: returncode: None args: ['ls']>)r¦  z	--my-optsr¨  zP<Popen: returncode: None args: ['ls', '--my-opts', 'aaaaaaaaaaaaaaaaaaaaaaaa...>é   z<Popen: returncode: 7 args: z('my-tool.py')>r,   ©r»   )ÚpathlibÚPathÚ	__class__r$   Úunittestr   ÚpatchÚobjectr   r3   r   rF   Úrepr)	r   Zpath_cmdZpathlib_clsZcasesr  r»   r£   Zsxr:   r   r   r   Ú	test_repr`  s    

ÿù	zProcessTestCase.test_reprc                 C   s8   t jtt jd}|  |jj¡ | ¡  | dd ¡ d S )Nri   r£  r¤  )	r   r3   r   r4   rm   r0   r8   r   r    r9   r   r   r   Ú!test_communicate_epipe_only_stdins  s    ÿz1ProcessTestCase.test_communicate_epipe_only_stdinÚSIGUSR1zRequires signal.SIGUSR1r’  zRequires os.killÚgetppidzRequires os.getppidc              	   C   s†   dd„ }t   t j|¡}|  t j t j|¡ tjddg}dD ]H}|tji}tj|fi |¤Ž}| ¡  W d   ƒ q81 sv0    Y  q8d S )Nc                 S   s   d S r   r   )ÚsignumÚframer   r   r   Úhandlerƒ  s    z7ProcessTestCase.test_communicate_eintr.<locals>.handlerr   z7import os, signal;os.kill(os.getppid(), signal.SIGUSR1)r   )	Úsignalr´  rm   rD   rE   r   r4   r3   r    )r   r¸  Úold_handlerr*   ÚstreamÚkwÚprocessr   r   r   Útest_communicate_eintr{  s    ÿ
z&ProcessTestCase.test_communicate_eintrú/proc/%d/fdzLinux specificc                 C   sp   dt  ¡  }t  |¡}|  t¡& tttjtjtjd W d  ƒ n1 sL0    Y  t  |¡}|  	||¡ dS )z;Test for the fork() failure fd leak reported in issue16327.r¿  r/   N)
r   ÚgetpidÚlistdirrN   r'   r(   r   r   r4   rF   )r   Zfd_directoryZfds_before_popenZfds_after_exceptionr   r   r   Ú!test_failed_child_execute_fd_leak”  s    
þ$
z1ProcessTestCase.test_failed_child_execute_fd_leakz+behavior currently not supported on Windowsc                 C   sL   |   t¡}t g d¢¡ W d   ƒ n1 s.0    Y  |  |jjd¡ d S )N)ú/opt/nonexistent_binaryÚwithZsomer*   rÃ  )rN   rÓ   r   rC   rF   rU   ÚfilenamerV   r   r   r   Ú%test_file_not_found_includes_filename¦  s    ,z5ProcessTestCase.test_file_not_found_includes_filenamec                 C   sP   |   t¡"}tjddgdd W d   ƒ n1 s20    Y  |  |jjd¡ d S )NÚexitÚ0z/some/nonexistent/directoryrÊ   )rN   rÓ   r   r3   rF   rU   rÅ  rV   r   r   r   Ú test_file_not_found_with_bad_cwd¬  s    0z0ProcessTestCase.test_file_not_found_with_bad_cwdc                 C   s,   |   tjt tj¡ |   tjt tj¡ d S r   )r5   r   r3   ÚbytesÚtypesÚGenericAliasÚCompletedProcessrk  r   r   r   r   Útest_class_getitems²  s    z#ProcessTestCase.test_class_getitemsN)zr$   r%   r&   r;   r>   rI   rP   rS   rX   r`   rb   rf   rq   rt   rx   r{   r}   rƒ   rˆ   r‹   r”   r›   rž   r¦   r¨   r«   r³   rµ   r¶   r¹   r®  ÚskipIfr   r¼   r½   r¾   rÁ   rÄ   rÈ   rÎ   rÏ   rÐ   rØ   rÛ   rÜ   rD   Úbase_prefixÚprefixrÝ   Ú	sysconfigZis_python_buildrÞ   rà   ræ   rè   rì   rï   rñ   rô   rõ   rö   rú   rý   rþ   rÿ   r  r  r  r  ÚplatformZget_config_varr  r  r  r  r  r  r  r!  r$  r)  r*  r0  r1  r7  r8  r<  r=  r>  rA  rJ  r^  rc  rg  ri  rm  rn  ro  rr  ru  rx  ry  r~  rŽ  rš  r  r¢  r¥  r²  r³  Ú
skipUnlessÚhasattrr¹  r   r¾  r¯   ÚisdirrÀ  rÂ  rÆ  rÉ  rÎ  r   r   r   r   r.   g   s  		

		










ÿ
ÿ
ÿ
	ÿÿ
'')4ÿÿÿÿ




r.   c                   @   s°   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Ze ed%¡d&d'„ ƒZd(S ))ÚRunFuncTestCasec                 K   s   t jd|g}tj|fi |¤ŽS )z4Run Python code in a subprocess using subprocess.runr   )rD   rE   r   r   )r   r£   r+   Úargvr   r   r   Ú
run_python·  s    zRunFuncTestCase.run_pythonc                 C   sP   |   d¡}|  |jd¡ |  tj¡ | ¡  W d   ƒ n1 sB0    Y  d S r©   )rÙ  rF   r   rN   r   rT   Úcheck_returncode©r   Úcpr   r   r   Útest_returncode¼  s    
zRunFuncTestCase.test_returncodec                 C   sN   |   tj¡}| jddd W d   ƒ n1 s00    Y  |  |jjd¡ d S )Nr@   T©ÚcheckrA   )rN   r   rT   rÙ  rF   rU   r   rV   r   r   r   Ú
test_checkÃ  s    ,zRunFuncTestCase.test_checkc                 C   s    t jtdd}|  |jd¡ d S )NTrÞ  r   )r   r   r   rF   r   rÛ  r   r   r   Útest_check_zeroÈ  s    zRunFuncTestCase.test_check_zeroc                 C   s>   |   tj¡ | jddd W d   ƒ n1 s00    Y  d S )NrJ   rj  rL   )rN   r   rO   rÙ  r   r   r   r   Útest_timeoutÍ  s    zRunFuncTestCase.test_timeoutc                 C   s"   | j dtjd}|  d|j¡ d S )NrY   r   rZ   ©rÙ  r   r4   r]   r1   rÛ  r   r   r   Útest_capture_stdoutÕ  s    z#RunFuncTestCase.test_capture_stdoutc                 C   s"   | j dtjd}|  d|j¡ d S )Nrc   rd   rZ   )rÙ  r   r4   r]   r2   rÛ  r   r   r   Útest_capture_stderrÚ  s    ÿz#RunFuncTestCase.test_capture_stderrc                 C   sL   t  ¡ }|  |j¡ | d¡ | d¡ | jd|tjd}|  	d|j
¡ d S )Nrg   r   rh   r§   rj   )rk   rl   rm   r8   rn   ro   rÙ  r   r4   r]   r1   )r   rp   rÜ  r   r   r   rq   ß  s    

þz+RunFuncTestCase.test_check_output_stdin_argc                 C   s$   | j ddtjd}|  d|j¡ d S )Nrh   rg   )rs   r1   rj   rã  rÛ  r   r   r   rt   ê  s
    þz+RunFuncTestCase.test_check_output_input_argc                 C   s’   t  ¡ }|  |j¡ | d¡ | d¡ | jtdd }| jd|dd}W d   ƒ n1 s\0    Y  |  	d|j
jd ¡ |  	d	|j
jd ¡ d S )
Nrg   r   r†   r—  r~   r„   r…   r0   rs   )rk   rl   rm   r8   rn   ro   rN   r€   rÙ  r]   rU   r*   r‡   r   r   r   rˆ   ñ  s    

ÿÿ$z6RunFuncTestCase.test_check_output_stdin_with_input_argc                 C   sb   |   tj¡"}| jddtjd}W d   ƒ n1 s40    Y  |  |jjd¡ |  |jjd¡ d S )Nr‰   rŠ   )rM   r1   rZ   )	rN   r   rO   rÙ  r4   rF   rU   r_   r1   )r   rW   rÜ  r   r   r   r‹   þ  s    ù$z)RunFuncTestCase.test_check_output_timeoutc                 C   s2   t j ¡ }d|d< | jd|d}|  |jd¡ d S )NrŒ   r   zCimport sys, os;sys.exit(33 if os.getenv("FRUIT")=="banana" else 31)rŽ   é!   )r   r‘   r’   rÙ  rF   r   )r   r“   rÜ  r   r   r   Útest_run_kwargs  s    
þzRunFuncTestCase.test_run_kwargsc                 C   s”   t rdnd}t |¡}|d u r.|  |› d¡ t|ƒ}tj|tjd}|  |j	d¡ |  
t¡" tj|tjdd W d   ƒ n1 s†0    Y  d S )Nztree.comr¦  z required for this testr   r   T)r1   r»   )r   r
   r   rU  r   r   r   r   rF   r   rN   r•   )r   Úprogr¯   Úresr   r   r   Útest_run_with_pathlike_path  s    
z+RunFuncTestCase.test_run_with_pathlike_pathc                 C   s2   t  tj¡}|ddg}t |¡}|  |jd¡ d S )Nr   s   import sys; sys.exit(57)é9   )r   r´   rD   rE   r   r   rF   r   ©r   r¯   r*   ré  r   r   r   Ú&test_run_with_bytes_path_and_arguments"  s    

z6RunFuncTestCase.test_run_with_bytes_path_and_argumentsc                 C   s0   t tjƒ}|ddg}t |¡}|  |jd¡ d S )Nr   zimport sys; sys.exit(57)rë  )r   rD   rE   r   r   rF   r   rì  r   r   r   Ú)test_run_with_pathlike_path_and_arguments)  s    


z9RunFuncTestCase.test_run_with_pathlike_path_and_argumentsc                 C   s.   | j ddd}|  d|j¡ |  d|j¡ d S )Nz>import sys;sys.stdout.write('BDFL'); sys.stderr.write('FLUFL')T)Úcapture_outputrZ   s   FLUFL)rÙ  r]   r1   r2   rÛ  r   r   r   Útest_capture_output0  s
    ýz#RunFuncTestCase.test_capture_outputc                 C   s~   t  ¡ }|  |j¡ | jtdd }| jdd|d}W d   ƒ n1 sH0    Y  |  d|jj	d ¡ |  d|jj	d ¡ d S )	NzAExpected ValueError when stdout and capture_output args supplied.r—  r~   T)rï  r1   r1   r   rï  ©
rk   rl   rm   r8   rN   r€   rÙ  r]   rU   r*   r‡   r   r   r   Ú#test_stdout_with_capture_output_arg8  s    ÿÿ$z3RunFuncTestCase.test_stdout_with_capture_output_argc                 C   s~   t  ¡ }|  |j¡ | jtdd }| jdd|d}W d   ƒ n1 sH0    Y  |  d|jj	d ¡ |  d|jj	d ¡ d S )	NzAExpected ValueError when stderr and capture_output args supplied.r—  r~   T)rï  r2   r2   r   rï  rñ  r‡   r   r   r   Ú#test_stderr_with_capture_output_argD  s    ÿÿ$z3RunFuncTestCase.test_stderr_with_capture_output_argz)requires posix like 'sleep' shell commandc              
   C   s€   t  ¡ }ztjddddd W n6 tjyT } zt  ¡ }t ¡ }W Y d}~nd}~0 0 |  d¡ | j|| dd|› d	d
 dS )zJOutput capturing after a timeout mustn't hang forever on open filehandles.zsleep 3TrK   )r»   rM   rï  NzTimeoutExpired not raised.g      ø?z/TimeoutExpired was delayed! Bad traceback:
```
z```r—  )	r  Ú	monotonicr   r   rO   Ú	tracebackÚ
format_excr   Z
assertLess)r   Zbefore_secsrŒ  Z
after_secsZstacksr   r   r   Ú.test_run_with_shell_timeout_and_capture_outputT  s    
ÿ

ÿÿz>RunFuncTestCase.test_run_with_shell_timeout_and_capture_outputN)r$   r%   r&   rÙ  rÝ  rà  rá  râ  rä  rå  rq   rt   rˆ   r‹   rç  rê  rí  rî  rð  rò  ró  r®  rÏ  r   r÷  r   r   r   r   r×  ¶  s(   
r×  c               	   C   sJ   dD ]6} t rzt  | ¡ W n ty0   Y qY n0 |   S qt d¡‚d S )N)ZstaffZnogroupÚgrpÚnobodyZ	nfsnobodyz?No identified group name to use for this test on this platform.)rø  ÚgetgrnamÚKeyErrorr®  ÚSkipTest)Ú
name_groupr   r   r   Ú_get_test_grp_namee  s    

rþ  zPOSIX specific testsc                       s  e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ ZG dd„ dej	ƒZ
e d¡dd„ ƒZe d¡dd„ ƒZe ej d¡ d¡dd„ ƒZdd„ Ze eedƒd¡dd„ ƒZe eedƒd¡dd„ ƒZe eedƒd ¡d!d"„ ƒZe eedƒd#¡d$d%„ ƒZe eed&ƒd'¡d(d)„ ƒZe eed&ƒd*¡d+d,„ ƒZe ep@eed-ƒ d.¡d/d0„ ƒZd1d2„ Z d3d4„ Z!d5d6„ Z"d7d8„ Z#d9d:„ Z$d;d<„ Z%G d=d>„ d>ej	ƒZ&e ej d?¡ d@¡dAdB„ ƒZ'dCdD„ Z(e e)j*dEkdF¡dGdH„ ƒZ+dIdJ„ Z,dKdL„ Z-dMdN„ Z.dOdP„ Z/dQdR„ Z0dSdT„ Z1dUdV„ Z2e e)j* 3dW¡dX¡dYdZ„ ƒZ4d[d\„ Z5d]d^„ Z6d_d`„ Z7dadb„ Z8dcdd„ Z9dedf„ Z:dgdh„ Z;didj„ Z<dkdl„ Z=dmdn„ Z>dodp„ Z?dqdr„ Z@dsdt„ ZAdudv„ ZBdwdx„ ZCdydz„ ZDd{d|„ ZEd}d~„ ZFdd€„ ZGdd‚„ ZHdƒd„„ ZId…d†„ ZJd‡dˆ„ ZKd‰dŠ„ ZLd‹dŒ„ ZMddŽ„ ZNdd„ ZOd‘d’„ ZPe e)j* 3d“¡o,e Qd”¡jRe Qd•¡jRkd–¡d—d˜„ ƒZSeT Ud™dš¡d›dœ„ ƒZVddž„ ZWdŸd „ ZXd¡d¢„ ZYd£d¤„ ZZd¥d¦„ Z[d§d¨„ Z\d©dª„ Z]d«d¬„ Z^d­d®„ Z_d¯d°„ Z`eTjad±d²„ ƒZbeTjad³d´„ ƒZcdµd¶„ Zdd·d¸„ Zed¹dº„ Zfd»d¼„ Zge ehd½uoðeehd¾ƒd¿¡dÀdÁ„ ƒZidÂdÃ„ ZjdÄdÅ„ ZkdÆdÇ„ Zl‡  ZmS )ÈÚPOSIXProcessTestCasec                    s   t ƒ  ¡  d| _d S )Nz/_this/pa.th/does/not/exist)Úsuperr   Ú_nonexistent_dirr   ©r­  r   r   r   t  s    
zPOSIXProcessTestCase.setUpc              
   C   sN   zt  | j¡ W n( ty8 } z|}W Y d }~nd }~0 0 |  d| j ¡ |S )Nz,chdir to nonexistent directory %s succeeded.)r   Úchdirr  rS  r   )r   r[  Údesired_exceptionr   r   r   Ú_get_chdir_exceptionx  s    ÿz)POSIXProcessTestCase._get_chdir_exceptionc              
   C   sŒ   |   ¡ }ztjtjddg| jd}W nT tyx } z<|  |j|j¡ |  |j	|j	¡ |  |j
|j
¡ W Y d}~nd}~0 0 |  d| ¡ dS )z;Test error in the child raised in the parent for a bad cwd.r   r   rÊ   NúExpected OSError: %s©r  r   r3   rD   rE   r  rS  rF   rT  ÚstrerrorrÅ  r   ©r   r  r:   r[  r   r   r   Útest_exception_cwd…  s    ÿ
&z'POSIXProcessTestCase.test_exception_cwdc              
   C   sŒ   |   ¡ }ztjtjddg| jd}W nT tyx } z<|  |j|j¡ |  |j	|j	¡ |  |j
|j
¡ W Y d}~nd}~0 0 |  d| ¡ dS )zBTest error in the child raised in the parent for a bad executable.r   r   r®   Nr  r  r	  r   r   r   Útest_exception_bad_executable”  s    ÿ
&z2POSIXProcessTestCase.test_exception_bad_executablec              
   C   s†   |   ¡ }zt | jddg¡}W nT tyr } z<|  |j|j¡ |  |j|j¡ |  |j|j¡ W Y d}~nd}~0 0 |  	d| ¡ dS )z?Test error in the child raised in the parent for a bad args[0].r   r   Nr  )
r  r   r3   r  rS  rF   rT  r  rÅ  r   r	  r   r   r   Útest_exception_bad_args_0£  s    &z.POSIXProcessTestCase.test_exception_bad_args_0c                   @   s   e Zd Zdd„ ZdS )z&POSIXProcessTestCase.PopenNoDestructorc                 C   s   d S r   r   r   r   r   r   Ú__del__¹  s    z.POSIXProcessTestCase.PopenNoDestructor.__del__N)r$   r%   r&   r  r   r   r   r   ÚPopenNoDestructor¸  s   r  z%subprocess._posixsubprocess.fork_execc              	   C   sv   dd„ }||_ tjdtdF |  t¡ |  dg¡ W d  ƒ n1 sJ0    Y  W d  ƒ n1 sh0    Y  dS )z>Test error passing done through errpipe_write in the good casec                  W   s0   | d }d  tj¡ ¡ }t |d| d ¡ dS )Né   z{:x}s   OSError:ó   :r   )rH  rT  ZEISDIRr   r   rn   )r*   Úerrpipe_writeZerr_coder   r   r   Úproper_error¿  s    zHPOSIXProcessTestCase.test_exception_errpipe_normal.<locals>.proper_errorúsubprocess.os.waitpid©Úside_effectÚnon_existent_commandN)r  r   r¯  ÚChildProcessErrorrN   ÚIsADirectoryErrorr  )r   Ú	fork_execr  r   r   r   Útest_exception_errpipe_normal¼  s    ÿz2POSIXProcessTestCase.test_exception_errpipe_normalc              	      s–   d‰ ‡ fdd„}||_ tjdtdH |  tj¡}|  dg¡ W d  ƒ n1 sT0    Y  W d  ƒ n1 sr0    Y  |  t	ˆ ƒt
|jƒ¡ dS )zZTest error passing done through errpipe_write where its not
        in the expected formats   ÿ Þ­c                     s   | d }t  |ˆ ¡ dS )Nr  r   )r   rn   )r*   r  ©Z
error_datar   r   Ú	bad_errorÒ  s    zGPOSIXProcessTestCase.test_exception_errpipe_bad_data.<locals>.bad_errorr  r  r  N)r  r   r¯  r  rN   r   ÚSubprocessErrorr  r]   r±  rk  rU   )r   r  r  r[  r   r  r   Útest_exception_errpipe_bad_dataÍ  s    ÿHz4POSIXProcessTestCase.test_exception_errpipe_bad_dataú/proc/self/statuszneed /proc/self/statusc                 C   s‚   t jddgdd}| ¡ D ]}| d¡r|} q<q|  d¡ t jddgdd}| ¡ D ]}| d¡rV|} qnqV| j||dd	 d S )
NÚcatr  F)Úrestore_signalss   SigIgnz&SigIgn not found in /proc/self/status.Tz=restore_signals=True should've unblocked SIGPIPE and friends.r—  )r   r\   Ú
splitlinesr
  rU  ÚassertNotEqual)r   Zdefault_proc_statusrq  Zdefault_sig_ign_maskZrestored_proc_statusZrestored_sig_ign_maskr   r   r   Útest_restore_signalsã  s(    þ

þ
ÿz)POSIXProcessTestCase.test_restore_signalsc              
   C   sp   zt jtjddgdd}W n2 tyL } z|jtjkr8‚ W Y d }~n(d }~0 0 t d¡}t	|ƒ}|  
||¡ d S )Nr   zimport os; print(os.getsid(0))T)Ústart_new_sessionr   )r   r\   rD   rE   rS  rT  ÚEPERMr   ÚgetsidÚintr#  )r   r_   r[  Z
parent_sidZ	child_sidr   r   r   Útest_start_new_sessionû  s    
þ

z+POSIXProcessTestCase.test_start_new_sessionÚsetreuidzno setreuid on platformc           
      C   s  t  ¡ }|dkrdnd|g}tjdkr*dnd}td urfzt |¡ | |¡ W n tyd   d }Y n0 |D ]Ö}dD ]Ì}| j||d¨ zt	j
tjdd	g||d}W nH ty´   Y nj tyê } z |jtjtjfvrÖ‚ W Y d }~n<d }~0 0 t|tƒrt |¡j}n|}t|ƒ}	|  |	|¡ W d   ƒ qr1 s40    Y  qrqj|  t¡ t	jtd
d W d   ƒ n1 sr0    Y  |  t¡& t	jtt jt jdd W d   ƒ n1 s´0    Y  td u r|d ur|  t¡ t	jt|d W d   ƒ n1 s0    Y  d S )Néþÿ  éýÿ  Údarwinrù  Úunknownr%  )ÚuserÚ	close_fdsr   zimport os; print(os.getuid())éÿÿÿÿ©r/  ì            )rÀ   r   r/  )r   ÚgeteuidrD   rÓ  ÚpwdÚgetpwnamrO  rû  ÚsubTestr   r\   rE   ÚPermissionErrorrS  rT  ZEACCESr&  Ú
isinstancerk  Úpw_uidr(  rF   rN   r€   rR   r   ÚOverflowErrorrÒ   r‘   )
r   ÚuidZ
test_usersZname_uidr/  r0  r_   r[  Zuser_uidZ
child_userr   r   r   Ú	test_user  sN    

ÿü
0.
ÿ&zPOSIXProcessTestCase.test_userz setreuid() available on platformc                 C   s<   |   t¡ tjtdd W d   ƒ n1 s.0    Y  d S )Néÿÿ  r2  ©rN   r€   r   rR   r   r   r   r   r   Útest_user_error?  s    z$POSIXProcessTestCase.test_user_errorÚsetregidzno setregid() on platformc           	      C   sž  t  ¡ }|dkrdndg}tƒ }td ur2| |¡ ||g D ]œ}dD ]’}| j||dp ztjtj	ddg||d}W n t
y†   Y n20 t|tƒr t |¡j}n|}t|ƒ}|  ||¡ W d   ƒ qD1 sÌ0    Y  qDq<|  t¡ tjtdd W d   ƒ n1 s
0    Y  |  t¡& tjtt jt jd	d
 W d   ƒ n1 sL0    Y  td u rš|  t¡ tjt|d W d   ƒ n1 s0    Y  d S )Nr+  r,  r%  )Úgroupr0  r   zimport os; print(os.getgid())r1  ©rB  r3  )rÀ   r   rB  )r   Úgetegidrþ  rø  rO  r7  r   r\   rD   rE   r8  r9  rk  rú  Úgr_gidr(  rF   rN   r€   rR   r   r;  rÒ   r‘   )	r   ÚgidÚ
group_listrý  rB  r0  r_   Z	group_gidZchild_groupr   r   r   Ú
test_groupD  s@    
ÿü

..
ÿ&
zPOSIXProcessTestCase.test_groupz setregid() available on platformc                 C   s<   |   t¡ tjtdd W d   ƒ n1 s.0    Y  d S )Nr>  rC  r?  r   r   r   r   Útest_group_errorn  s    z%POSIXProcessTestCase.test_group_errorÚ	setgroupszno setgroups() on platformc           
   
   C   s®  t  ¡ }|dkrdndg}tƒ }d}td ur6| |¡ ztjtjddg|d}W n6 t	y† } z|j
t
jkrn‚ d}W Y d }~nfd }~0 0 t  ¡ }t |¡}td ur²dd	„ |D ƒ}	n|}	|rÐ|  t|ƒt|ƒ¡ n|  t|	ƒt|ƒ¡ |  t¡  tjtd
gd W d   ƒ n1 s0    Y  |  t¡( tjtt jt jdgd W d   ƒ n1 sZ0    Y  td u rª|  t¡  tjt|gd W d   ƒ n1 s 0    Y  d S )Nr+  r,  Fr   z;import os, sys, json; json.dump(os.getgroups(), sys.stdout)©Úextra_groupsTc                 S   s&   g | ]}t |tƒrt |¡jn|‘qS r   )r9  rk  rø  rú  rE  )r  Úgr   r   r   r  Œ  s   ÿz:POSIXProcessTestCase.test_extra_groups.<locals>.<listcomp>r1  r3  )rÀ   r   rL  )r   rD  rþ  rø  rO  r   r\   rD   rE   rS  rT  r&  Ú	getgroupsÚjsonÚloadsrF   ÚsetrN   r€   rR   r   rÒ   r‘   )
r   rF  rG  rý  Z
perm_errorr_   ÚexZparent_groupsZchild_groupsZdesired_gidsr   r   r   Útest_extra_groupss  sN    
ÿý

ÿ0þ&
ÿz&POSIXProcessTestCase.test_extra_groupsz!setgroups() available on platformc                 C   s<   |   t¡ tjtg d W d   ƒ n1 s.0    Y  d S )NrK  r?  r   r   r   r   Útest_extra_groups_error¤  s    z,POSIXProcessTestCase.test_extra_groups_errorÚumaskzPOSIX umask() is not available.c              	   C   sž   d }z€t  ¡ }tj |d¡}tjtjdd|›dgdd t 	|¡j
d@ }d}| j||t|ƒ› d	t|ƒ› d
 W |d uršt |¡ n|d ur˜t |¡ 0 d S )NZbeansr   zopen(z, 'w').close()é+   )rU  i¶  i”  z != r—  )rk   rM  r   r¯   r°   r   rR   rD   rE   ÚstatÚst_moderF   Úoctr
   rW  )r   rY  ÚnamerX  Zexpected_moder   r   r   Ú
test_umask©  s"    þÿÿzPOSIXProcessTestCase.test_umaskc                 C   sX   t  ¡ * t tjddg¡}| ¡  W d   ƒ n1 s80    Y  |  |j t	j
¡ d S )Nr   zimport os; os.abort())r   rp  r   r3   rD   rE   r   rF   r   r¹  ÚSIGABRTr9   r   r   r   Útest_run_abort¿  s    

ÿ&z#POSIXProcessTestCase.test_run_abortc                 C   sN   t  ttjƒ d¡}t|ƒ}|  d| ¡ ¡ |  d|¡ |  ttjƒ|¡ d S )Núfake cmdr¹  ZSIG)r   rT   r(  r¹  r\  rk  r]   Úlower©r   r¥   Zerror_stringr   r   r   Ú"test_CalledProcessError_str_signalÇ  s
    z7POSIXProcessTestCase.test_CalledProcessError_str_signalc                 C   s$   t  dd¡}t|ƒ}|  d|¡ d S )NiÁKiÿr^  zunknown signal 9876543.©r   rT   rk  r]   r`  r   r   r   Ú*test_CalledProcessError_str_unknown_signalÒ  s    z?POSIXProcessTestCase.test_CalledProcessError_str_unknown_signalc                 C   s$   t  dd¡}t|ƒ}|  d|¡ d S )Né   r^  znon-zero exit status 2.rb  r`  r   r   r   Ú$test_CalledProcessError_str_non_zero×  s    z9POSIXProcessTestCase.test_CalledProcessError_str_non_zeroc                 C   sX   t jtjddgt jdd„ d}|" |  |j ¡ d¡ W d   ƒ n1 sJ0    Y  d S )Nr   r  c                   S   s   t  dd¡S )Nr   Úapple)r   Úputenvr   r   r   r   Ú<lambda>ã  r÷   z3POSIXProcessTestCase.test_preexec.<locals>.<lambda>)r1   Ú
preexec_fnó   applerë   r9   r   r   r   Útest_preexecÜ  s    
ÿüz!POSIXProcessTestCase.test_preexecc              
   C   sš   dd„ }zt jtjddg|d}W nh t jyV } z|  t jd¡ W Y d }~nHd }~0  tyŠ } z|  d|j	d ¡ W Y d }~nd }~0 0 |  
d	¡ d S )
Nc                   S   s   t dƒ‚d S )Nz'What if two swallows carried a coconut?©r€   r   r   r   r   Úraise_itè  s    z=POSIXProcessTestCase.test_preexec_exception.<locals>.raise_itr   r   ©ri  z)Expected a ValueError from the preexec_fnZcoconutr   zEException raised by preexec_fn did not make it to the parent process.)r   r3   rD   rE   r  r&  Ú_posixsubprocessr€   r]   r*   r   )r   rm  r:   r[  r   r   r   Útest_preexec_exceptionç  s    ÿ
þ(z+POSIXProcessTestCase.test_preexec_exceptionc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )z+POSIXProcessTestCase._TestExecuteChildPopenz3Used to test behavior at the end of _execute_child.c                 O   s$   || _ tjj| g|¢R i |¤Ž d S r   )Ú	_testcaser   r3   r–   )r   Ztestcaser*   r+   r   r   r   r–   ù  s    z4POSIXProcessTestCase._TestExecuteChildPopen.__init__c                 O   s  z”t jj| g|¢R i |¤Ž W dd„ tdƒD ƒ}zL|D ].}| jj|| j ¡ | j ¡ | j	 ¡ fdd q6W |D ]}t
 |¡ qln|D ]}t
 |¡ q‚0 nxdd„ tdƒD ƒ}zL|D ].}| jj|| j ¡ | j ¡ | j	 ¡ fdd q®W |D ]}t
 |¡ qän|D ]}t
 |¡ qú0 0 d S )Nc                 S   s   g | ]}t  d t j¡‘qS )ú	/dev/zero)r   rP  ÚO_RDONLY©r  r#  r   r   r   r    s   ÿzNPOSIXProcessTestCase._TestExecuteChildPopen._execute_child.<locals>.<listcomp>é   z!At least one fd was closed early.r—  )r   r3   r,   rN  rq  rw   r0   râ   r1   r2   r   r8   )r   r*   r+   Zdevzero_fdsr  r   r   r   r,   ý  s@    ÿÿý
ÿöÿÿý
ÿz:POSIXProcessTestCase._TestExecuteChildPopen._execute_childN)r$   r%   r&   r-   r–   r,   r   r   r   r   Ú_TestExecuteChildPopen÷  s   rv  rr  z/dev/zero required.c              	   C   sT   dd„ }|   tj¡, | j| ttjtjtj|d W d  ƒ n1 sF0    Y  dS )z6Issue16140: Don't double close pipes on preexec error.c                   S   s   t  d¡‚d S )Nz-force the _execute_child() errpipe_data path.)r   r  r   r   r   r   rm    s    ÿzWPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipes.<locals>.raise_it)r0   r1   r2   ri  N)rN   r   r  rv  r   r4   )r   rm  r   r   r   Ú0test_preexec_errpipe_does_not_double_close_pipes  s    ýzEPOSIXProcessTestCase.test_preexec_errpipe_does_not_double_close_pipesc                 C   s&  dd„ }t  ¡ }t j}t j}zèt  ¡  |  t  ¡ ¡ tjtjddgdd„ d |  t  ¡ d¡ t  ¡  |  	t  ¡ ¡ tjtjddgd	d„ d |  	t  ¡ d
¡ |t _| j
ttjtjddgdd„ d t `| j
ttjtjddgdd„ d W |t _|t _|s"t  ¡  n|t _|t _|s t  ¡  0 d S )Nc                   S   s   t dƒ‚d S )Nzthis shouldn't escape)ÚRuntimeErrorr   r   r   r   Úraise_runtime_error!  s    zPPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.raise_runtime_errorr   r   c                   S   s   d S r   r   r   r   r   r   rh  *  r÷   zEPOSIXProcessTestCase.test_preexec_gc_module_failure.<locals>.<lambda>rn  z#Popen enabled gc when it shouldn't.c                   S   s   d S r   r   r   r   r   r   rh  1  r÷   zPopen left gc disabled.c                   S   s   d S r   r   r   r   r   r   rh  7  r÷   c                   S   s   d S r   r   r   r   r   r   rh  <  r÷   )ÚgcÚ	isenabledÚdisabler    r   rC   rD   rE   Úenabler&  rN   rx  r3   r{  )r   ry  ZenabledZorig_gc_disableZorig_gc_isenabledr   r   r   Útest_preexec_gc_module_failure  sJ    ÿ
ÿÿ

þ

þ
ýz3POSIXProcessTestCase.test_preexec_gc_module_failurer-  z!setrlimit() seems to fail on OS Xc              
   C   s´   zddl m}m}m} W n. tyF } z|  |¡ W Y d }~n
d }~0 0 ||ƒ}|\}}||d|fƒ |  |||¡ ztjt	j
ddgdd„ d W n ty¤   Y n0 |  d¡ d S )	Nr   )Ú	getrlimitÚ	setrlimitÚRLIMIT_NPROCr   r   c                   S   s   d S r   r   r   r   r   r   rh  R  r÷   z@POSIXProcessTestCase.test_preexec_fork_failure.<locals>.<lambda>rn  z.RLIMIT_NPROC had no effect; probably superuser)Úresourcer  r€  r  r|  rU  rm   r   rC   rD   rE   ÚBlockingIOError)r   r  r€  r  r¥   Zlimitsr#  Zhardr   r   r   Útest_preexec_fork_failureC  s     ÿ
z.POSIXProcessTestCase.test_preexec_fork_failurec                 C   s”   t  ¡ \}}t|ddd0}| dtj ¡ | dtj ¡ W d   ƒ n1 sP0    Y  t 	|d¡ t
 |¡}| ¡  t |¡ |  |jd¡ d S ©NÚwrD  )rG  z#!%s
z(exec '%s' -c 'import sys; sys.exit(47)'
iÀ  rA   )rk   rŸ  rP  rn   r   Ú
unix_shellrD   rE   r   Úchmodr   r3   r   r   rF   r   )r   r  ÚfnameÚfobjr:   r   r   r   Útest_args_stringY  s    ÿ$

z%POSIXProcessTestCase.test_args_stringc                 C   s<   | j ttjtjddgdd | j ttjtjddgdd d S )Nr   r@   rA   ©Ústartupinfo©Úcreationflags©rN   r€   r   rC   rD   rE   r   r   r   r   r›   g  s    
ÿý
ÿýz&POSIXProcessTestCase.test_invalid_argsc                 C   sh   t j ¡ }d|d< tjdgdtj|d}|( |  |j ¡  	d¡d¡ W d   ƒ n1 sZ0    Y  d S ©Nrf  r   zecho $FRUITr   ©r»   r1   r   s    	
rj  ©
r   r‘   r’   r   r3   r4   rF   r1   rÆ   r  ©r   r“   r:   r   r   r   Útest_shell_sequencer  s    

þz(POSIXProcessTestCase.test_shell_sequencec                 C   sf   t j ¡ }d|d< tjddtj|d}|( |  |j ¡  	d¡d¡ W d   ƒ n1 sX0    Y  d S r‘  r“  r”  r   r   r   Útest_shell_string|  s    
þz&POSIXProcessTestCase.test_shell_stringc                 C   sŠ   t  ¡ \}}t|ddd0}| dtj ¡ | dtj ¡ W d   ƒ n1 sP0    Y  t 	|d¡ t
 |¡}t |¡ |  |d¡ d S r…  )rk   rŸ  rP  rn   r   r‡  rD   rE   r   rˆ  r   rC   r   rF   )r   r  r‰  rŠ  rH   r   r   r   Útest_call_string†  s    ÿ$

z%POSIXProcessTestCase.test_call_stringc              	   C   sÒ   g }dD ]2}dD ](}t j ||¡}t j |¡r| |¡ qq|sJ|  d¡ d}t j |¡rpt j |¡sp| |¡ |D ]X}tjd|dtj	d}|, |  
|j ¡  ¡ t|dƒ¡ W d   ƒ qt1 sÂ0    Y  qtd S )	N)z/binz	/usr/bin/z/usr/local/bin)ZbashZkshz"bash or ksh required for this testz/bin/shzecho $0T)rE   r»   r1   rœ  )r   r¯   r°   ÚisfilerO  rU  Úislinkr   r3   r4   rF   r1   rÆ   r  rÊ  )r   ZshellsrÑ  rZ  Úshr:   r   r   r   Útest_specific_shell“  s"    


ÿz(POSIXProcessTestCase.test_specific_shellc              
   G   st   t   t jt j¡}z4tjtjddgdtjtjtjd}W t   t j|¡ nt   t j|¡ 0 |j 	d¡ t
||ƒ|Ž  |S )Nr   zöif 1:
                                 import sys, time
                                 sys.stdout.write('x\n')
                                 sys.stdout.flush()
                                 time.sleep(30)
                                 T©r0  r0   r1   r2   r   )r¹  ÚSIGINTÚdefault_int_handlerr   r3   rD   rE   r4   r1   rÆ   Úgetattr)r   Úmethodr*   rº  r:   r   r   r   Ú_kill_process§  s    ÷ z"POSIXProcessTestCase._kill_process)ZnetbsdZopenbsdz"Due to known OS bug (issue #16762)c                 G   sR   t jtjddgdt jt jt jd}|j d¡ t d¡ t	||ƒ|Ž  | 
¡  d S )Nr   z¶if 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             Trœ  r   )r   r3   rD   rE   r4   r1   rÆ   r  r‚  rŸ  r    )r   r   r*   r:   r   r   r   Ú_kill_dead_processÀ  s    ø
z'POSIXProcessTestCase._kill_dead_processc                 C   s:   |   dtj¡}| ¡ \}}|  d|¡ |  | ¡ d¡ d S )NÚsend_signals   KeyboardInterruptr   )r¡  r¹  r  r    r]   r#  r   ©r   r:   r#  r2   r   r   r   Útest_send_signal×  s    z%POSIXProcessTestCase.test_send_signalc                 C   s:   |   d¡}| ¡ \}}|  |d¡ |  | ¡ tj ¡ d S )Nr’  r÷   )r¡  r    rF   r   r¹  ÚSIGKILLr¤  r   r   r   Ú	test_killÝ  s    
zPOSIXProcessTestCase.test_killc                 C   s:   |   d¡}| ¡ \}}|  |d¡ |  | ¡ tj ¡ d S )NÚ	terminater÷   )r¡  r    rF   r   r¹  ÚSIGTERMr¤  r   r   r   Útest_terminateã  s    
z#POSIXProcessTestCase.test_terminatec                 C   s   |   dtj¡ d S ©Nr£  )r¢  r¹  r  r   r   r   r   Útest_send_signal_deadé  s    z*POSIXProcessTestCase.test_send_signal_deadc                 C   s   |   d¡ d S ©Nr’  ©r¢  r   r   r   r   Útest_kill_deadí  s    z#POSIXProcessTestCase.test_kill_deadc                 C   s   |   d¡ d S ©Nr¨  r®  r   r   r   r   Útest_terminate_deadñ  s    z(POSIXProcessTestCase.test_terminate_deadc                 C   s6   g }|D ](}t  |¡}t  |¡}| |||f¡ q|S r   )r   Úget_inheritableÚduprO  )r   Zsave_fdsr„  r  ÚinheritableÚsavedr   r   r   Ú	_save_fdsõ  s    

zPOSIXProcessTestCase._save_fdsc                 C   s.   |D ]$\}}}t j|||d t  |¡ qd S )N)r´  )r   Údup2r8   )r   r„  r  rµ  r´  r   r   r   Ú_restore_fdsý  s    z!POSIXProcessTestCase._restore_fdsc           	   	   C   s    d}|   |¡}|D ]\}}}|dkr|} q.qz`|D ]}t |¡ q4tjtjddg|tjtjd ¡ \}}|  	|d¡ |  	|d¡ W |  
|¡ n|  
|¡ 0 d S )Nr   r   rû   r/   rj  rê   )r¶  r   r8   r   r3   rD   rE   r4   r    rF   r¸  )	r   r„  r0   Ú	saved_fdsr  rµ  r´  r¤   r¥   r   r   r   Úcheck_close_std_fds	  s&    

ÿùz(POSIXProcessTestCase.check_close_std_fdsc                 C   s   |   dg¡ d S rQ   ©rº  r   r   r   r   Útest_close_fd_0	  s    z$POSIXProcessTestCase.test_close_fd_0c                 C   s   |   dg¡ d S ©Nr   r»  r   r   r   r   Útest_close_fd_1	  s    z$POSIXProcessTestCase.test_close_fd_1c                 C   s   |   dg¡ d S )Nrd  r»  r   r   r   r   Útest_close_fd_2!	  s    z$POSIXProcessTestCase.test_close_fd_2c                 C   s   |   ddg¡ d S )Nr   r   r»  r   r   r   r   Útest_close_fds_0_1$	  s    z'POSIXProcessTestCase.test_close_fds_0_1c                 C   s   |   ddg¡ d S )Nr   rd  r»  r   r   r   r   Útest_close_fds_0_2'	  s    z'POSIXProcessTestCase.test_close_fds_0_2c                 C   s   |   ddg¡ d S )Nr   rd  r»  r   r   r   r   Útest_close_fds_1_2*	  s    z'POSIXProcessTestCase.test_close_fds_1_2c                 C   s   |   g d¢¡ d S )N)r   r   rd  r»  r   r   r   r   Útest_close_fds_0_1_2-	  s    z)POSIXProcessTestCase.test_close_fds_0_1_2c              
   C   s¢   t  d¡}t  d¡}zZt  d¡ t  d¡ t tjddg¡ ¡  W t  |d¡ t  |d¡ t  |¡ t  |¡ n.t  |d¡ t  |d¡ t  |¡ t  |¡ 0 dS )z=Issue #15798: Popen should work when stdio fds are available.r   r   r   z*print('AssertionError:0:CLOEXEC failure.')N)	r   r³  r8   r   r3   rD   rE   r   r·  )r   Z	new_stdinZ
new_stdoutr   r   r   Útest_small_errpipe_write_fd2	  s"    



þ
ý
z0POSIXProcessTestCase.test_small_errpipe_write_fdc           
   
   C   s^  dd„ t dƒD ƒ}z,dd„ |D ƒ}|D ]\}}t |¡ q(t |d d¡ t |d dd¡ |  t dƒ¡}zZt|ƒD ]\}}t ||¡ qvtj	t
jdd	g|d |d
 |d d}| ¡  W |  |¡ n|  |¡ 0 |D ]}t |dd¡ qØt |d
 d¡}t |d d¡ ¡ }	|  |d¡ |  |	d¡ W |D ]}t |¡ q.n|D ]}t |¡ qF0 d S )Nc                 S   s   g | ]}t  ¡ ‘qS r   ©rk   rŸ  ©r  rZ  r   r   r   r  I	  r÷   z?POSIXProcessTestCase.test_remapping_std_fds.<locals>.<listcomp>rŠ   c                 S   s   g | ]\}}|‘qS r   r   ©r  r  r‰  r   r   r   r  K	  r÷   r   ó   STDINr   r   úZimport sys; got = sys.stdin.read();sys.stdout.write("got %s"%got); sys.stderr.write("err")rd  r/   rí   ó	   got STDINó   err)rN  r   Úunlinkrn   rã   r¶  Ú	enumerater·  r   r3   rD   rE   r   r¸  rÆ   r  rF   r8   )
r   ÚtempsÚtemp_fdsr  r‰  r¹  Útemp_fdr:   r¤   r¥   r   r   r   Útest_remapping_std_fdsG	  s<    
ÿû
ÿz+POSIXProcessTestCase.test_remapping_std_fdsc              
   C   sB  dd„ t dƒD ƒ}dd„ |D ƒ}z|D ]\}}t |¡ q(|  t dƒ¡}zœt|ƒD ]\}}	t |	|¡ qTt |d¡ t |dd¡ tj	t
jddg|||d	}
|
 ¡  |D ]}t |dd¡ qªt |d
¡}t |d
¡ ¡ }W |  |¡ n|  |¡ 0 |  |d¡ |  |d¡ W |D ]}t |¡ qn|D ]}t |¡ q*0 d S )Nc                 S   s   g | ]}t  ¡ ‘qS r   rÅ  rÆ  r   r   r   r  v	  r÷   z7POSIXProcessTestCase.check_swap_fds.<locals>.<listcomp>rŠ   c                 S   s   g | ]\}}|‘qS r   r   rÇ  r   r   r   r  w	  r÷   rÈ  r   r   rÉ  r/   rí   rÊ  rË  )rN  r   rÌ  r¶  rÍ  r·  rn   rã   r   r3   rD   rE   r   rÆ   r  r¸  rF   r8   )r   Zstdin_noZ	stdout_noZ	stderr_norÎ  rÏ  r  r‰  r¹  rÐ  r:   r¤   r¥   r   r   r   Úcheck_swap_fdst	  s<    
ÿûÿz#POSIXProcessTestCase.check_swap_fdsc                 C   sX   |   ddd¡ |   ddd¡ |   ddd¡ |   ddd¡ |   ddd¡ |   ddd¡ d S )Nr   r   rd  )rÒ  r   r   r   r   Útest_swap_fds¤	  s    z"POSIXProcessTestCase.test_swap_fdsc                 C   sŒ  |   tdƒ¡}zj|D ]<}t ¡  }t | ¡ |¡ W d   ƒ q1 sH0    Y  qttdƒƒt|ƒ  ¡ }t 	|¡ g d¢}i }t
||ƒD ]\}}	||||	 < qŒt d¡}
ttdƒƒt|ƒ  ¡ }tjtjd|
t|ƒgfi |¤Ž}|  |d¡ t
||ƒD ]r\}}	t |dtj¡ t |d¡}ttt| d¡ƒƒ}t d|› d	|› d
|› d|› d|	› d¡}|  |	g||¡ qúW |  |¡ n|  |¡ 0 d S )NrŠ   r/   zå
                import os, sys
                skipped_fd = int(sys.argv[1])
                for fd in range(3):
                    if fd != skipped_fd:
                        os.write(fd, str(fd).encode('ascii'))
            r   r   rí   rœ  z"
                    When testing z to z4 redirection,
                    parent descriptor z5 got redirected
                    to descriptor(s) z instead of descriptor z.
                )r¶  rN  rk   rl   r   r·  râ   rQ  rV  r8   Úzipr:  r;  r   rC   rD   rE   rk  rF   rã   ÚSEEK_SETrÆ   r  Úmapr(  rÇ   r¸  )r   Úfrom_fdsÚto_fdsr¹  Zfrom_fdÚfZfd_to_closeÚ	arg_namesr+   Zto_fdr£   Z
skipped_fdrH   Ú
read_bytesZread_fdsr˜  r   r   r   Ú#_check_swap_std_fds_with_one_closed¬	  sD    
0

ÿÿÿþýý
z8POSIXProcessTestCase._check_swap_std_fds_with_one_closedc                 C   s<   t  tdƒd¡D ]&}t  tdƒd¡D ]}|  ||¡ q$qd S )NrŠ   rd  )Ú	itertoolsÚcombinationsrN  ÚpermutationsrÜ  )r   r×  rØ  r   r   r   Ú!test_swap_std_fds_with_one_closedØ	  s    z6POSIXProcessTestCase.test_swap_std_fds_with_one_closedc              
   C   sª   dd„ }zt jt|d W n€ tyZ } z(|  t j¡ |  t|ƒd¡ W Y d }~nTd }~0  t jyš } z(|  	t j¡ |  t|ƒd¡ W Y d }~nd }~0 0 |  
d¡ d S )Nc                   S   s   t dƒ‚d S )Nõ   surrogate:í³¿rl  r   r   r   r   ÚprepareÞ	  s    zCPOSIXProcessTestCase.test_surrogates_error_message.<locals>.preparern  rá  z!Exception occurred in preexec_fn.z1Expected ValueError or subprocess.SubprocessError)r   rC   r   r€   re  ro  rF   rk  r  ÚassertIsNotNoner   )r   râ  r¥   r   r   r   Útest_surrogates_error_messageÝ	  s    þ
$&z2POSIXProcessTestCase.test_surrogates_error_messagec                 C   sÞ   dD ]Ô\}}|  dd¡}dt|ƒ }tj ¡ }|||< d|d< |}tjtjd|g|d}| 	d	¡}|  
| d¡t|ƒ¡ |  dd¡}d
t|ƒ }tj ¡ }|||< tjtjd|g|d}| 	d	¡}|  
| d¡t|ƒ¡ qd S )N))Útestu   abcí³¿)u   testí³¿Z42rœ  rD  z&import os; print(ascii(os.getenv(%s)))ÚCÚLC_ALLr   rŽ   s   
z'import os; print(ascii(os.getenvb(%s))))r   r±  r   r‘   r’   r   r\   rD   rE   r¡   rF   rÇ   rœ  )r   ÚkeyÚvalueZencoded_valueÚscriptr   Zdecoded_valuer1   r   r   r   Útest_undecodable_envð	  s.    

þ


þ
z)POSIXProcessTestCase.test_undecodable_envc           	      C   sø   t  td ¡}ttdd … ƒ}t j td ¡\}}t  |¡}t |g| ¡}|  |d¡ d|d 	|¡ 
d¡f }tj|dd}|  |d¡ t j ¡ }||d< tj|g| |d	}|  |d¡ t j ¡ }t  |¡|d
< tj|g| |d	}|  |d¡ d S )Nr   r   s   '%s' %sú rF  Trª  ÚPATHrŽ   s   PATH)r   r´   r   r  r¯   rÃ   r   rC   rF   r°   r   r‘   r’   Úenvironb)	r   Zabs_programr*   r¯   ZprogramÚexitcoder  r   Zenvbr   r   r   Útest_bytes_program
  s"    


z'POSIXProcessTestCase.test_bytes_programc           	      C   sÂ   t jddd}t jddd}tjtj|gtjtjtjdd}|  |jd¡ tjtj|gtjdd}| ¡ \}}t	t
t| d	¡ƒƒ}t	|j ¡ |j ¡ |j ¡ gƒ}|  ||@ d
|||@ f ¡ d S )Nzinput_reader.pyÚsubprocessdata©Zsubdirúfd_status.pyF)r0   r1   r2   r0  r÷   ©r1   r0  ó   ,z5Expected no fds from %r to be open in child, found %r)r   Úfindfiler   r3   rD   rE   r4   rm   r    rQ  rÖ  r(  rÃ   r0   râ   r1   r2   r    )	r   ZsleeperÚ	fd_statusÚp1Úp2r_   ÚerrorZ
result_fdsZunwanted_fdsr   r   r   Útest_pipe_cloexec(
  s(    þÿÿ

þÿz&POSIXProcessTestCase.test_pipe_cloexecc           
         s  t jddd}t jddd}d}|d d }tjtj|gtjtjdd	‰ tjtj||gˆ jtjdd	‰|  ˆ j	¡ |  ˆj	¡ ‡ fd
d„}‡fdd„}|  |¡ |  |¡ ˆ j
 |¡ ˆ j
 ¡  t ˆjgg g d¡\}}}	|  |d¡ |  ˆj ¡ |¡ ˆ j ¡  ˆj ¡  d S )Nzqcat.pyrñ  rò  zqgrep.pys   zxcvbné   ó   
F)r0   r1   r0  c                      s$   zˆ   ¡  W n ty   Y n0 d S r   ©r¨  ÚProcessLookupErrorr   )rø  r   r   Úkill_p1P
  s    zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p1c                      s$   zˆ   ¡  W n ty   Y n0 d S r   rþ  r   )rù  r   r   Úkill_p2U
  s    zBPOSIXProcessTestCase.test_pipe_cloexec_real_tools.<locals>.kill_p2rK  zThe child hung)r   rö  r   r3   rD   rE   r4   r1   rm   r   r0   rn   r8   Úselectr&  rF   rÆ   )
r   ZqcatZqgrepZsubdatar\  r   r  Z	readfilesZignored1Zignored2r   )rø  rù  r   Útest_pipe_cloexec_real_tools?
  s2    þþ



z1POSIXProcessTestCase.test_pipe_cloexec_real_toolsc           
         s¨  t jddd}t ¡ }|  tj|d ¡ |  tj|d ¡ t|ƒ‰ tdƒD ],}t tj	tj
¡}|  tj|¡ ˆ  |¡ qJˆ D ]}t |d¡ q|tjtj|gtjdd	}| ¡ \}}ttt| d
¡ƒƒ}|  |ˆ @ ˆ d¡ tjtj|gtjdd	}| ¡ \}}ttt| d
¡ƒƒ}|  |ˆ @ d¡ |  d|d¡ t‡ fdd„tdƒD ƒƒ}	tjtj|gtjd|	d}| ¡ \}}ttt| d
¡ƒƒ}|  ||	 ˆ @ d¡ |  d|d¡ d S )Nró  rñ  rò  r   r   é	   TFrô  rõ  zSome fds were closedzSome fds were left openzSubprocess failedc                 3   s   | ]}ˆ   ¡ V  qd S r   )rV  rt  ©r…  r   r   Ú	<genexpr>Œ
  r÷   z6POSIXProcessTestCase.test_close_fds.<locals>.<genexpr>ru  ©r1   r0  Úpass_fdsz'Some fds not in pass_fds were left open)r   rö  r   r,  rm   r8   rQ  rN  rP  Údevnullrs  ÚaddÚset_inheritabler   r3   rD   rE   r4   r    rÖ  r(  rÃ   rF   r    r]   )
r   r÷  r„  r#  r  r:   r_   ÚignoredÚremaining_fdsÚfds_to_keepr   r  r   Útest_close_fdsh
  sN    ÿÿÿ
ÿþÿz#POSIXProcessTestCase.test_close_fdsZfreebsdz/devz/dev/fdz/Requires fdescfs mounted on /dev/fd on FreeBSD.c                 C   sª   t jddd}tjtjdt d| ¡gtjd}| 	¡ \}}| 
¡ }| jt|ƒdd| d	 ttt|d
  ¡  d¡ƒƒ}ttt|d  ¡  d¡ƒƒ}| j||@ dd	 dS )z;Confirm that issue21618 is fixed (may fail under valgrind).ró  rñ  rò  r   aK  
        import os, resource, subprocess, sys, textwrap
        open_fds = set()
        # Add a bunch more fds to pass down.
        for _ in range(40):
            fd = os.open(os.devnull, os.O_RDONLY)
            open_fds.add(fd)

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

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

        max_fd_open = max(open_fds)

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

        rlim_cur, rlim_max = resource.getrlimit(resource.RLIMIT_NOFILE)
        try:
            # 29 is lower than the highest fds we are leaving open.
            resource.setrlimit(resource.RLIMIT_NOFILE, (29, rlim_max))
            # Launch a new Python interpreter with our low fd rlim_cur that
            # inherits open fds above that limit.  It then uses subprocess
            # with close_fds=True to get a report of open fds in the child.
            # An explicit list of fds to check is passed to fd_status.py as
            # letting fd_status rely on its default logic would miss the
            # fds above rlim_cur as it normally only checks up to that limit.
            subprocess.Popen(
                [sys.executable, '-c',
                 textwrap.dedent("""
                     import subprocess, sys
                     subprocess.Popen([sys.executable, %r] +
                                      [str(x) for x in range({max_fd})],
                                      close_fds=True).wait()
                     """.format(max_fd=max_fd_open+1))],
                close_fds=False).wait()
        finally:
            resource.setrlimit(resource.RLIMIT_NOFILE, (rlim_cur, rlim_max))
        r   rd  z(expected exactly two lines of output:
%rr—  r   rõ  r   zSome fds were left open.N)r   rö  r   r3   rD   rE   r:  r;  r4   r    r"  rF   r"  rQ  rÖ  r(  r  rÃ   r    )r   r÷  r:   r_   Zunused_stderrZoutput_linesZ
opened_fdsr  r   r   r   Ú%test_close_fds_when_max_fd_is_lowered˜
  s$    /Ñÿ0Ð2ÿ
ÿz:POSIXProcessTestCase.test_close_fds_when_max_fd_is_loweredrK  ra   c              	   C   s@  t jddd}tƒ }tdƒD ]Z}t ¡ }|  tj|d ¡ |  tj|d ¡ t |d d¡ t |d d¡ | 	|¡ q|D ]¾}t
jtj|gt
jd|fd}| ¡ \}}ttt| d	¡ƒƒ}	||h }
|  ||	d
¡ |  |	|
@ d¡ |  t¡(}|  t
jtd|fd¡ W d   ƒ n1 s0    Y  |  dt|jƒ¡ q|d S )Nró  rñ  rò  ra   r   r   Tr  rõ  zfd to be passed not passedzfd to be closed passedF)r0  r  zoverriding close_fds)r   rö  rQ  rN  r   r,  rm   r8   r  Úupdater   r3   rD   rE   r4   r    rÖ  r(  rÃ   r]   r    ZassertWarnsrw  rC   r   rk  Úwarning)r   r÷  r…  r.  r„  r  r:   r_   r  r  Zto_be_closedÚcontextr   r   r   Útest_pass_fdsë
  s6    þ

ÿþ(z"POSIXProcessTestCase.test_pass_fdsc           
      C   sä   t jddd}t ¡ \}}|  tj|¡ |  tj|¡ t |d¡ t |d¡ ||f}tj|g}|t	t
t|ƒƒ7 }tj|tjd|d}| ¡ \}}tt
t| d¡ƒƒ}	|  |	t|ƒd| ¡ |  t |¡d¡ |  t |¡d¡ d S )	Nró  rñ  rò  TFr  rõ  z	output=%a)r   rö  r   r,  rm   r8   r  rD   rE   r  rÖ  rk  r   r3   r4   r    rQ  r(  rÃ   rF   r²  )
r   rê  r´  Znon_inheritabler  r*   r:   r_   r  r„  r   r   r   Útest_pass_fds_inheritable  s$    
þz.POSIXProcessTestCase.test_pass_fds_inheritablec           	      C   s  t jddd}g }tdƒD ],}t tjtj¡}|  tj|¡ | 	|¡ qt 
¡ \}}|  tj|¡ |  tj|¡ | d|¡ tjtj|g|d |d |d d|d t |d	¡}W d
  ƒ n1 sÆ0    Y  dd„ | d¡D ƒ}|  |h d£t|ƒB d|›¡ d
S )z7Regression test for https://bugs.python.org/issue32270.ró  rñ  rò  rd  r   r   T)r0   r1   r2   r0  r  rí   Nc                 S   s   h | ]}t |ƒ’qS r   )r(  )r  Únumr   r   r   Ú	<setcomp>@  r÷   z@POSIXProcessTestCase.test_pass_fds_redirected.<locals>.<setcomp>rõ  >   r   r   rd  zoutput=)r   rö  rN  r   rP  r	  ÚO_RDWRrm   r8   rO  r,  Úinsertr   r3   rD   rE   rÆ   rÃ   rF   Ú	frozenset)	r   r÷  r  r#  r  Zstdout_rZstdout_wr_   r„  r   r   r   Útest_pass_fds_redirected+  s(    û*z-POSIXProcessTestCase.test_pass_fds_redirectedc                 C   sJ   t  tjd¡(}tjt||d}| ¡  W d   ƒ n1 s<0    Y  d S )Núr+)r1   r0   ©r6   rP  r   r	  r   r3   r   r   ©r   Zinoutr:   r   r   r   Ú%test_stdout_stdin_are_single_inout_fdE  s
    ÿz:POSIXProcessTestCase.test_stdout_stdin_are_single_inout_fdc                 C   sJ   t  tjd¡(}tjt||d}| ¡  W d   ƒ n1 s<0    Y  d S )Nr  r   r  r  r   r   r   Ú&test_stdout_stderr_are_single_inout_fdK  s
    ÿz;POSIXProcessTestCase.test_stdout_stderr_are_single_inout_fdc                 C   sJ   t  tjd¡(}tjt||d}| ¡  W d   ƒ n1 s<0    Y  d S )Nr  )r2   r0   r  r  r   r   r   Ú%test_stderr_stdin_are_single_inout_fdQ  s
    ÿz:POSIXProcessTestCase.test_stderr_stdin_are_single_inout_fdc                 C   sR   t jddd}tjtj|gtjtjd}| ¡ \}}|  d|j	d| 
d¡ ¡ d S )Nzsigchild_ignore.pyrñ  rò  r   r   z6sigchild_ignore.py exited non-zero with this error:
%srF  )r   rö  r   r3   rD   rE   r4   r    rF   r   rÇ   )r   Zsigchild_ignorer:   r1   r2   r   r   r   Útest_wait_when_sigchild_ignoredW  s    ÿÿþz4POSIXProcessTestCase.test_wait_when_sigchild_ignoredc              	   C   s‚   t  d¡}tjtjddgtjdd}|j}|  |j	¡ z<|  
| d¡d¡ |  || |gg g d¡d ¡ W | ¡  n
| ¡  0 d S )	Nr  r   z$import sys;sys.stdout.write("apple")r   )r1   r<   rü  s   applg        )r   Úimport_moduler   r3   rD   rE   r4   r1   rm   r8   rF   rÆ   r]   r  r   )r   r  r:   rÙ  r   r   r   Útest_select_unbufferedb  s    

ÿü z+POSIXProcessTestCase.test_select_unbufferedc                 C   s¦   t jtjddgt jt jd}|  |jj¡ |  |jj¡ t	|ƒ}|j
}t dtf¡ d }W d   ƒ n1 sn0    Y  trŠ|  t j¡ n|  |dd„ t jD ƒ¡ d S )Nr   z import sys, time;time.sleep(0.2)r   r   c                 S   s   g | ]}t |ƒ‘qS r   ©Úid©r  Úor   r   r   r  ‰  r÷   zEPOSIXProcessTestCase.test_zombie_fast_process_del.<locals>.<listcomp>)r   r3   rD   rE   r4   rm   r1   r8   r2   r&  Úpidr   Úcheck_warningsÚResourceWarningr   re  r   r]   )r   r:   Úidentr)  r   r   r   Útest_zombie_fast_process_dels  s    
ÿü"z1POSIXProcessTestCase.test_zombie_fast_process_delc              	   C   sd  t jtjddgt jt jd}|  |jj¡ |  |jj¡ t	|ƒ}|j
}t dtf¡ d }t ¡  W d   ƒ n1 sv0    Y  t |tj¡ tr |  t j¡ n|  |dd„ t jD ƒ¡ t d¡ |  t¡D t jtt jt jd}W d   ƒ n1 sø0    Y  W d   ƒ n1 s0    Y  |  ttj|d¡ trH|  t j¡ n|  |d	d„ t jD ƒ¡ d S )
Nr   zimport time;time.sleep(3)r   r   c                 S   s   g | ]}t |ƒ‘qS r   r%  r'  r   r   r   r  ¤  r÷   zJPOSIXProcessTestCase.test_leak_fast_process_del_killed.<locals>.<listcomp>r–  r   c                 S   s   g | ]}t |ƒ‘qS r   r%  r'  r   r   r   r  ´  r÷   )r   r3   rD   rE   r4   rm   r1   r8   r2   r&  r)  r   r*  r+  Ú
gc_collectr   r’  r¹  r¦  r   re  r   r]   r  r‚  rN   rS  r¸   Úwaitpidrw   )r   r:   r,  r)  r}  r   r   r   Ú!test_leak_fast_process_del_killed‹  s:    
ÿü&
þ>z6POSIXProcessTestCase.test_leak_fast_process_del_killedc                    sx   t jddd}t d¡‰ |  tjˆ ¡ tjtj	|gtj
d‡ fdd„d}| ¡ \}}ttt| d	¡ƒƒ}|  ˆ |¡ d S )
Nró  rñ  rò  r   Tc                      s   t  dˆ ¡S r½  )r   r·  r   ©r  r   r   rh  À  r÷   zCPOSIXProcessTestCase.test_close_fds_after_preexec.<locals>.<lambda>)r1   r0  ri  rõ  )r   rö  r   r³  rm   r8   r   r3   rD   rE   r4   r    rQ  rÖ  r(  rÃ   rw   )r   r÷  r:   r_   r  r  r   r1  r   Útest_close_fds_after_preexec¶  s    

þz1POSIXProcessTestCase.test_close_fds_after_preexecc           	      C   sþ   dd l }t ¡ }zÚdd„ }t ¡  ddgd dgfdgdd dgfdgdgddgfdgdgd dffD ]z\}}}}|  t¡B}| ||dd	||d
d
d
d
dddddddg dd
|¡ W d   ƒ n1 s¾0    Y  |  dt|j	ƒ¡ q`W |sút 
¡  n|søt 
¡  0 d S )Nr   c                   S   s   d S r   r   r   r   r   r   rh  Ñ  r÷   z5POSIXProcessTestCase.test_fork_exec.<locals>.<lambda>r§  s   exeó   envs   argTr   r1  r   rd  rŠ   rü  Fztakes exactly)ro  rz  r{  r}  rN   r•   r  rw   rk  rU   r|  )	r   ro  Ú
gc_enabledÚfuncr*   Zexe_listrÀ   Úenv_listr¥   r   r   r   Útest_fork_execÇ  s2    üù"
ÿz#POSIXProcessTestCase.test_fork_execc                 C   sê   dd l }G dd„ dƒ}t ¡ }z¸t ¡  ddddd|d	ƒ|d
ƒffD ]‚}| jtd |¡dH}| dgdgd|d dgddddd	d
ddddd d d dd ¡ W d   ƒ n1 sª0    Y  |  dt	|j
ƒ¡ qDW |sæt ¡  n|sät ¡  0 d S )Nr   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zJPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadIntTc                 S   s
   || _ d S r   )ré  )r   ré  r   r   r   r–   õ  s    zSPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__init__c                 S   s   | j rd| _ | jS t‚d S )NF)Úfirstré  r€   r   r   r   r   Ú__int__÷  s    zRPOSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_check.<locals>.BadInt.__int__N)r$   r%   r&   r8  r–   r9  r   r   r   r   ÚBadIntó  s   r:  )r1  rd  rŠ   rü  ra   )rk  rü  )é   é   é*   l            )ra   rü  )r3  r©  r©  ru  r   rd  zfds_to_keep={}r—  s   falseTr3  r1  rŠ   rü  r  )ro  rz  r{  r}  rN   r€   rH  r  r]   rk  rU   r|  )r   ro  r:  r4  r  rW   r   r   r   Ú%test_fork_exec_sorted_fd_sanity_checkï  s>    
úþ
ù"
ÿz:POSIXProcessTestCase.test_fork_exec_sorted_fd_sanity_checkc              	   C   sz   t  t¡}|X tj |d¡*}t|j_| 	¡  |j 
¡  W d   ƒ n1 sN0    Y  W d   ƒ n1 sl0    Y  d S )Nr0   )r   r3   r   r   r¯  r°  ÚBrokenPipeErrorr8   r  r    Zassert_called_with©r   r}  Úmock_proc_stdinr   r   r   Ú,test_communicate_BrokenPipeError_stdin_close  s
    
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_closec              	   C   sˆ   t  t¡}|f tj |d¡8}t|j_| 	d¡ |j 
d¡ |j 
¡  W d   ƒ n1 s\0    Y  W d   ƒ n1 sz0    Y  d S )Nr0   ó   stuff)r   r3   r   r   r¯  r°  r?  rn   r  r    Úassert_called_once_withr8   r@  r   r   r   Ú,test_communicate_BrokenPipeError_stdin_write"  s    

zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_writec              
   C   sÄ   t jtjdgt jt jd}|’ tj |d¡d}tt	j
dƒ8}t|j_| ¡ |j_| d¡ |j ¡  W d   ƒ n1 sz0    Y  W d   ƒ n1 s˜0    Y  W d   ƒ n1 s¶0    Y  d S )Nú-hr§   r0   ÚwbrC  )r   r3   rD   rE   r4   r   r¯  r°  rP  r   r	  r?  r5  r  râ   Úreturn_valuer    rD  )r   r}  rA  Zdev_nullr   r   r   Ú,test_communicate_BrokenPipeError_stdin_flush,  s    þ
ÿ
zAPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_flushc              	   C   sŽ   t jtjdgt jt jd}|\ tj |d¡.}t|j	_
|jdd |j	 ¡  W d   ƒ n1 sb0    Y  W d   ƒ n1 s€0    Y  d S )NrF  r§   r0   iç  rL   )r   r3   rD   rE   r4   r   r¯  r°  r?  r8   r  r    rD  r@  r   r   r   Ú9test_communicate_BrokenPipeError_stdin_close_with_timeout;  s    þzNPOSIXProcessTestCase.test_communicate_BrokenPipeError_stdin_close_with_timeoutNÚ
W_STOPCODEzneed _testcapi.W_STOPCODEc                 C   st   t }t |¡}tj|jdd t d¡}tj	d|j|fd | 
¡ }W d  ƒ n1 sZ0    Y  |  |d¡ dS )zATest wait() behavior when waitpid returns WIFSTOPPED; issue29335.r   ©rï  rŠ   r  )rH  Néýÿÿÿ)r   r   r3   r   Úwait_processr)  Ú	_testcapirK  r   r¯  r   rF   )r   r*   r}  Ústatusr   r   r   r   Útest_stoppedG  s    

&z!POSIXProcessTestCase.test_stoppedc                 C   st   t  t¡}tj|jdd |  |j¡ t 	d¡}| 
tj¡ W d   ƒ n1 sR0    Y  | ¡  |  |j¡ d S )Nr   rL  zos.kill)r   r3   r   r   rN  r)  re  r   r   r¯  r£  r¹  r©  Zassert_not_calledrã  )r   r}  Z	mock_killr   r   r   Útest_send_signal_raceX  s    
*z*POSIXProcessTestCase.test_send_signal_racec                 C   sn   t  tjddg¡}|js"| ¡  qtjj|ddd„ d" d |_| 	t
j¡ W d   ƒ n1 s`0    Y  d S )Nr   zexit(1)rf  c                   S   s   d S r   r   r   r   r   r   rh  w  r÷   z=POSIXProcessTestCase.test_send_signal_race2.<locals>.<lambda>)Únew)r   r3   rD   rE   r   rf  r   r¯  r°  r£  r¹  r©  r9   r   r   r   Útest_send_signal_race2n  s    
z+POSIXProcessTestCase.test_send_signal_race2c                 C   sF   t jtjddgt jd}z|jdd W d S  t jy>   Y q0 qd S )Nr   z+import os, time; os.close(1), time.sleep(2)r   rK   rL   )r   r3   rD   rE   r4   r    rO   ©r   r}  r   r   r   Ú1test_communicate_repeated_call_after_stdout_close{  s    
ÿþzFPOSIXProcessTestCase.test_communicate_repeated_call_after_stdout_close)nr$   r%   r&   r   r  r
  r  r  r   r3   r  r   r¯  r  r  r®  rÏ  r   r¯   r¡  r$  r)  rÔ  rÕ  r=  r@  rH  rI  rS  rT  r   r[  r]  ra  rc  re  rk  rp  rv  rw  r~  rD   rÓ  r„  r‹  r›   r•  r–  r—  r›  r¡  r
  r¢  r¥  r§  rª  r¬  r¯  r±  r¶  r¸  rº  r¼  r¾  r¿  rÀ  rÁ  rÂ  rÃ  rÄ  rÑ  rÒ  rÓ  rÜ  rà  rä  rë  rð  rû  r  r  rW  Úst_devr  r   Zrequires_mac_verr  r  r  r  r   r!  r"  r$  r-  r0  r2  Úcpython_onlyr7  r>  rB  rE  rI  rJ  rO  rQ  rR  rT  rV  Ú__classcell__r   r   r  r   rÿ  q  sê   

ÿ

3

)

0
ÿ

%
ÿ


ÿ
-0,)0þ
P

!+
'
)	
þ
rÿ  zWindows specific testsc                   @   sÂ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zej	dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-S ).ÚWin32ProcessTestCasec                 C   s.   d}d}t  ¡ }||_||_t jt|d d S )Nr   rŠ   rŒ  )r   ÚSTARTUPINFOÚdwFlagsÚwShowWindowrC   r   )r   ÚSTARTF_USESHOWWINDOWÚSW_MAXIMIZEr  r   r   r   Útest_startupinfoŠ  s    ÿz%Win32ProcessTestCase.test_startupinfoc                 C   s(   d}d}t j||d}t jt|d d S )Nr   rŠ   )r\  r]  rŒ  )r   r[  rC   r   )r   ZSTARTF_USERSHOWWINDOWr_  r  r   r   r   Útest_startupinfo_keywords™  s    þÿz.Win32ProcessTestCase.test_startupinfo_keywordsc              
   C   sþ   t  ¡ }t j|_t j|_tdƒD ]Ø}t}tt	j
dƒ^}t j||t j|d}| | ¡  W d   ƒ n1 sl0    Y  |  |jd¡ W d   ƒ n1 s˜0    Y  |  |jt j¡ |  |j¡ |  |j¡ |  |j¡ |  |jt j¡ |  |jdg i¡ q d S )Nrd  r†  )r1   r2   r  r   Úhandle_list)r   r[  r^  r\  ZSW_HIDEr]  rN  r   rP  r   r	  r3   re   r    rF   r   re  Z	hStdInputZ
hStdOutputZ	hStdErrorÚlpAttributeList)r   r  r#  r  Znullr}  r   r   r   Útest_startupinfo_copy©  s,    ý&,ÿz*Win32ProcessTestCase.test_startupinfo_copyc                 C   s(   d}t j d¡ tjt jd |d d S )Né   z'    a DOS box should flash briefly ...
z# -c "import time; time.sleep(0.25)"rŽ  )rD   r2   rn   r   rC   rE   )r   ZCREATE_NEW_CONSOLEr   r   r   Útest_creationflagsÄ  s    ÿþz'Win32ProcessTestCase.test_creationflagsc                 C   s$   | j ttjtjddgdd„ d d S )Nr   r@   c                   S   s   dS r½  r   r   r   r   r   rh  Ñ  r÷   z8Win32ProcessTestCase.test_invalid_args.<locals>.<lambda>rn  r  r   r   r   r   r›   Ì  s    
ÿýz&Win32ProcessTestCase.test_invalid_argsc                 C   sN   G dd„ dt ƒ}|  t¡  tjt|ƒ d W d   ƒ n1 s@0    Y  d S )Nc                   @   s   e Zd ZdZdS )z4Win32ProcessTestCase.test_issue31471.<locals>.BadEnvN)r$   r%   r&   Úkeysr   r   r   r   ÚBadEnv×  s   rh  rŽ   )ÚdictrN   r•   r   r3   r   )r   rh  r   r   r   Útest_issue31471Ó  s    z$Win32ProcessTestCase.test_issue31471c                 C   s&   t jtjddgdd}|  |d¡ d S )Nr   r@   T)r0  rA   rB   rG   r   r   r   r  Ü  s    
ÿþz#Win32ProcessTestCase.test_close_fdsc           
      C   sî  dd l }t ¡ }|  tj|d ¡ |  tj|d ¡ g }|D ] }t |d¡ | | |¡¡ q<tj	t
jdd |d ¡gtjdd}| ¡ \}}|  |jd¡ t| ¡ ƒ tj	t
jdd |d ¡gtjtjdd}| ¡ \}}|  |jd¡ |  d	|¡ g }t ¡ }	d
|i|	_tj	t
jdd |d ¡gtjtj|	dd}| ¡ \}}|  |jd¡ |  d	|¡ t dtf¡n t ¡ }	d
|d d … i|	_tj	t
jdd |d ¡gtjtj|	dd}| ¡ \}}|  |jd¡ W d   ƒ n1 sà0    Y  d S )Nr   r   Tr   z2import msvcrt; print(msvcrt.open_osfhandle({}, 0))Frô  )r1   r2   r0  s   OSErrorrb  )r1   r2   r  r0  z.*overriding close_fds)rz  r   r,  rm   r8   r  rO  Zget_osfhandler   r3   rD   rE   rH  r4   r    rF   r   r(  r  r]   r[  rc  r   r*  rw  )
r   rz  r„  rX  r  r:   r1   r2   rb  r  r   r   r   Útest_close_fds_with_stdioã  s^    
ÿþ
ÿ
þ

ÿý
ÿýz.Win32ProcessTestCase.test_close_fds_with_stdioc                 C   s    t  ¡ }i |_t jt|d d S )NrŒ  ©r   r[  rc  rC   r   ©r   r  r   r   r   Útest_empty_attribute_list  s
    ÿz.Win32ProcessTestCase.test_empty_attribute_listc                 C   s$   t  ¡ }dg i|_t jt|d d S )Nrb  rŒ  rl  rm  r   r   r   Útest_empty_handle_list  s
    
ÿz+Win32ProcessTestCase.test_empty_handle_listc                 C   sb   t j ¡ }d|d< tjdgdtj|d}|" |  d|j ¡ ¡ W d   ƒ n1 sT0    Y  d S ©NÚphysalisr   rQ  r   r’  s   physalis©	r   r‘   r’   r   r3   r4   r]   r1   rÆ   r”  r   r   r   r•     s    

þz(Win32ProcessTestCase.test_shell_sequencec                 C   s`   t j ¡ }d|d< tjddtj|d}|" |  d|j ¡ ¡ W d   ƒ n1 sR0    Y  d S rp  rr  r”  r   r   r   r–  *  s    
þz&Win32ProcessTestCase.test_shell_stringc              	   C   sn   dD ]d}t j ¡ }d|d< tjddtj||d}|$ |  d|j ¡ |¡ W d   ƒ q1 s^0    Y  qd S )N)ÚansiZoemrq  r   rQ  r   )r»   r1   r   r?  rr  )r   Úencr“   r:   r   r   r   Útest_shell_encodings4  s    
ýz)Win32ProcessTestCase.test_shell_encodingsc                 C   s    t  tjd ¡}|  |d¡ d S )Nz -c "import sys; sys.exit(47)"rA   rB   rG   r   r   r   r—  @  s    ÿz%Win32ProcessTestCase.test_call_stringc                 G   sŽ   t jtjddgt jt jt jd}|J |j d¡ t||ƒ|Ž  | ¡ \}}|  	|d¡ | 
¡ }W d   ƒ n1 st0    Y  |  |d¡ d S )Nr   zâif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             time.sleep(30)
                             r/   r   r÷   r   )r   r3   rD   rE   r4   r1   rÆ   rŸ  r    rF   r   r#  )r   r   r*   r:   r#  r2   r   r   r   r   r¡  F  s    ø	&z"Win32ProcessTestCase._kill_processc                 G   s˜   t jtjddgt jt jt jd}|T |j d¡ t d¡ t	||ƒ|Ž  | 
¡ \}}|  |d¡ | ¡ }W d   ƒ n1 s~0    Y  |  |d¡ d S )Nr   zàif 1:
                             import sys, time
                             sys.stdout.write('x\n')
                             sys.stdout.flush()
                             sys.exit(42)
                             r/   r   r÷   r=  )r   r3   rD   rE   r4   r1   rÆ   r  r‚  rŸ  r    rF   r   )r   r   r*   r:   r#  r2   rH   r   r   r   r¢  [  s    ø	
&z'Win32ProcessTestCase._kill_dead_processc                 C   s   |   dtj¡ d S r«  )r¡  r¹  r©  r   r   r   r   r¥  r  s    z%Win32ProcessTestCase.test_send_signalc                 C   s   |   d¡ d S r­  ©r¡  r   r   r   r   r§  u  s    zWin32ProcessTestCase.test_killc                 C   s   |   d¡ d S r°  rv  r   r   r   r   rª  x  s    z#Win32ProcessTestCase.test_terminatec                 C   s   |   dtj¡ d S r«  )r¢  r¹  r©  r   r   r   r   r¬  {  s    z*Win32ProcessTestCase.test_send_signal_deadc                 C   s   |   d¡ d S r­  r®  r   r   r   r   r¯  ~  s    z#Win32ProcessTestCase.test_kill_deadc                 C   s   |   d¡ d S r°  r®  r   r   r   r   r±    s    z(Win32ProcessTestCase.test_terminate_deadN)r$   r%   r&   r`  ra  rd  rf  r›   r   rX  rj  r  rk  rn  ro  r•  r–  ru  r—  r¡  r¢  r¥  r§  rª  r¬  r¯  r±  r   r   r   r   rZ  ‡  s.   
1

rZ  c                   @   s^   e Zd ZG dd„ dejƒZej ejd¡dd„ ƒZ	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ ZdS )Ú	MiscTestsc                       s$   e Zd ZdZg Z‡ fdd„Z‡  ZS )zMiscTests.RecordingPopenz<A Popen that saves a reference to each instance for testing.c                    s"   t ƒ j|i |¤Ž | j | ¡ d S r   )r   r–   Úinstances_createdrO  r)   r  r   r   r–   Š  s    z!MiscTests.RecordingPopen.__init__)r$   r%   r&   r-   rx  r–   rY  r   r   r  r   ÚRecordingPopen†  s   ry  Ú_communicatec              
   K   s¦  t |_zjtj tjd¡}t |_tj td| j¡X |  t ¡. |t	j
ddgfdtji|¤Ž W d  ƒ n1 sv0    Y  W d  ƒ n1 s”0    Y  |jdd… D ]"}|  |tjddd	|j› ¡ q¬g }|jD ]}|tjd
dkrÚ| |¡ qÚ| j|jd|jd | jt|ƒd|jd W d  ƒ n1 s:0    Y  W | jj ¡ }| ¡  | ¡  |  g | jj¡ n.| jj ¡ }| ¡  | ¡  |  g | jj¡ 0 dS )a‡  Fake a SIGINT happening during Popen._communicate() and ._wait().

        This avoids the need to actually try and get test environments to send
        and receive signals reliably across platforms.  The net effect of a ^C
        happening during a blocking subprocess execution which we want to clean
        up from is a KeyboardInterrupt coming out of communicate() or wait().
        Ú_waitr3   r   zLimport time
time.sleep(9)
import sys
sys.stderr.write('\n!runaway child!\n')r1   Nr   rL   z.no open-ended wait() after the first allowed: g      Ð?rd  r—  )ÚKeyboardInterruptr  r   r¯  r°  r   r3   ry  rN   rD   rE   r   Zcall_args_listr#  rC   rO  ZassertLessEqualZ
call_countrF   r"  rx  rV  r’  r   )r   ZpopenerZmock__communicater+   Z
mock__waitrC   Zsigint_callsr½  r   r   r   Ú_test_keyboardinterrupt_no_killŽ  sP    
ÿÿýýBÿþ

ÿÿ(ýz)MiscTests._test_keyboardinterrupt_no_killc                 C   s   | j tjdd d S ©NgTã¥›Ä @rL   )r}  r   rC   r   r   r   r   Ú#test_call_keyboardinterrupt_no_killº  s    z-MiscTests.test_call_keyboardinterrupt_no_killc                 C   s   | j tjdd d S r~  )r}  r   r   r   r   r   r   Ú"test_run_keyboardinterrupt_no_kill½  s    z,MiscTests.test_run_keyboardinterrupt_no_killc                 C   s   dd„ }|   |¡ d S )Nc                  _   s8   t j| i |¤Ž}t‚W d   ƒ n1 s*0    Y  d S r   )r   r3   r|  )r*   r+   Zunused_processr   r   r   Úpopen_via_context_managerÁ  s    z[MiscTests.test_context_manager_keyboardinterrupt_no_kill.<locals>.popen_via_context_manager)r}  )r   r  r   r   r   Ú.test_context_manager_keyboardinterrupt_no_killÀ  s    z8MiscTests.test_context_manager_keyboardinterrupt_no_killc              	   C   s”   |   t d¡d¡ |   t d¡d¡ d }zRt ¡ }tj |d¡}t t	rLdnd| ¡\}}|  
|d¡ W |d urt |¡ n|d urŽt |¡ 0 d S )Nz
echo xyzzyÚxyzzy)r   rƒ  Zfooztype zcat r   )rF   r   Ú	getoutputÚgetstatusoutputrk   rM  r   r¯   r°   r   r#  Úrmdir)r   ÚdirrZ  rP  r_   r   r   r   Útest_getoutputÆ  s     ÿÿÿzMiscTests.test_getoutputc                 C   sn   h d£}t tjƒ}t ƒ }ddl}tj ¡ D ].\}}| d¡r>q*t||jfƒrNq*| 	|¡ q*|  
||| ¡ dS )z*Ensure that __all__ is populated properly.>   rb  rø  r5  ÚHandler   Nr#  )rQ  r   Ú__all__rË  Ú__dict__Úitemsr
  r9  Ú
ModuleTyper
  rF   )r   Zintentionally_excludedZexportedZpossible_exportsrË  rZ  ré  r   r   r   Útest__all__Ù  s    

zMiscTests.test__all__N)r$   r%   r&   r   r3   ry  r   r¯  r°  r}  r  r€  r‚  rˆ  rŽ  r   r   r   r   rw  „  s   
+rw  ÚPollSelectorz!Test needs selectors.PollSelectorc                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚProcessTestCaseNoPollc                 C   s   t j| _tjt _t | ¡ d S r   )r   Ú_PopenSelectorÚorig_selectorÚ	selectorsÚSelectSelectorr.   r   r   r   r   r   r   ë  s    zProcessTestCaseNoPoll.setUpc                 C   s   | j t_t | ¡ d S r   )r’  r   r‘  r.   r"   r   r   r   r   r"   ð  s    zProcessTestCaseNoPoll.tearDownNr#   r   r   r   r   r  è  s   r  zWindows-specific testsc                       sP   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚCommandsWithSpacesc                    s>   t ƒ  ¡  t dd¡\}}| ¡ | _t |d¡ t |¡ d S )Nz.pyzte stsV   import sys;sys.stdout.write('%d %s' % (len(sys.argv), [a.lower () for a in sys.argv])))	r   r   rk   rŸ  r_  r‰  r   rn   r8   )r   rÙ  r‰  r  r   r   r   ø  s
    

zCommandsWithSpaces.setUpc                    s   t  | j¡ tƒ  ¡  d S r   )r   r   r‰  r   r"   r   r  r   r   r"     s    zCommandsWithSpaces.tearDownc                 O   s`   t j|d< t j|i |¤Ž}|. |  |j ¡  d¡d| j ¡ W d   ƒ n1 sR0    Y  d S )Nr1   Úmbcsz2 [%r, 'ab cd'])r   r4   r3   rF   r1   rÆ   rÇ   r‰  )r   r*   r+   r:   r   r   r   Úwith_spaces  s    
þzCommandsWithSpaces.with_spacesc                 C   s    | j dtj| jdf dd d S )Nú"%s" "%s" "%s"úab cdr   rª  ©r—  rD   rE   r‰  r   r   r   r   Útest_shell_string_with_spaces  s
    ÿÿz0CommandsWithSpaces.test_shell_string_with_spacesc                 C   s   | j tj| jdgdd d S )Nr™  r   rª  rš  r   r   r   r   Útest_shell_sequence_with_spaces  s    z2CommandsWithSpaces.test_shell_sequence_with_spacesc                 C   s   |   dtj| jdf ¡ d S )Nr˜  r™  rš  r   r   r   r   Útest_noshell_string_with_spaces  s    ÿz2CommandsWithSpaces.test_noshell_string_with_spacesc                 C   s   |   tj| jdg¡ d S )Nr™  rš  r   r   r   r   Ú!test_noshell_sequence_with_spaces  s    z4CommandsWithSpaces.test_noshell_sequence_with_spaces)r$   r%   r&   r   r"   r—  r›  rœ  r  rž  rY  r   r   r  r   r•  õ  s   		r•  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚContextManagerTestsc                 C   s€   t jtjddgt jt jd4}|  |j ¡ d¡ |  |j ¡ d¡ W d   ƒ n1 sV0    Y  |  	|jj
¡ |  	|jj
¡ d S )Nr   zAimport sys;sys.stdout.write('stdout');sys.stderr.write('stderr');r   s   stdouts   stderr)r   r3   rD   rE   r4   rF   r1   rÆ   r2   r&  r'  rU  r   r   r   Ú	test_pipe#  s    
ÿû0zContextManagerTests.test_pipec                 C   sD   t  tjddg¡}W d   ƒ n1 s(0    Y  |  |jd¡ d S )Nr   zimport sys; sys.exit(100)éd   )r   r3   rD   rE   rF   r   rU  r   r   r   rÝ  0  s    
ÿz#ContextManagerTests.test_returncodec                 C   sT   t jtjddgt jd(}| d¡ |  |jd¡ W d   ƒ n1 sF0    Y  d S )Nr   z2import sys;sys.exit(sys.stdin.read() == 'context')ri   s   contextr   rø   rU  r   r   r   r  7  s    
ÿý
z*ContextManagerTests.test_communicate_stdinc              	   C   sb   |   t¡D tjttjtjd}W d   ƒ n1 s60    Y  W d   ƒ n1 sT0    Y  d S )Nr   )rN   r·   r   r3   r¸   r4   rU  r   r   r   r›   ?  s    þz%ContextManagerTests.test_invalid_argsc                 C   sr   t jtt jtjd d}| ¡ }|j dtj ¡ |  	|j
¡ |  t|jddd¡ |  |j
d¡ |  |jj¡ dS )z9Broken pipe error should not prevent wait() (Issue 21619)rd  )r0   r<   r£  Nr   )r   r3   r   r4   r   r-  Ú	__enter__r0   rn   re  r   rN   rS  Ú__exit__rF   r&  r'  rU  r   r   r   Útest_broken_pipe_cleanupF  s    þz,ContextManagerTests.test_broken_pipe_cleanupN)r$   r%   r&   r   rÝ  r  r›   r¤  r   r   r   r   rŸ  !  s
   rŸ  Ú__main__)?r®  r   rå  r   r   rD   r¹  r6   rÝ  r   rT  rk   r  rõ  rË  r“  rÒ  r  r
   r‡  rz  r:  rO  r«  Ztest.supportr   rO  r|  r5  rø  ZPGOrü  rÓ  r   r4  r¸   rÓ   ÚNotADirectoryErrorr8  r·   rE   r   r   ZTestCaser   Ú	Exceptionr'   r3   r(   r.   r×  rþ  rÏ  rÿ  rÔ  rZ  rw  rÕ  r  r•  rŸ  r$   Úmainr   r   r   r   Ú<module>   s²   






          Y 0
            !
 }dÿ
+6
