o
    JXhi                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z d dlmZ d dlmZ ejdkrGd d	lmZ ejd
dgZejd
ddgZdd ZG dd dejZG dd dejZG dd dZejdkrG dd deZG dd deejZedG dd deejZG dd deejZ G dd  d eejZ!d!d" Z"e#e" d#G d$d% d%eejZ$n
G d&d' d'eejZ%G d(d) d)Z&e'd*kre(  dS dS )+    N)mock)base_subprocess)
subprocess)utils)support)	os_helperwin32)unix_events-czimport time; time.sleep(3600);)
import syszdata = sys.stdin.buffer.read()zsys.stdout.buffer.write(data)c                   C   s   t d  d S N)asyncioZset_event_loop_policy r   r   K/opt/python-3.10.19/usr/lib/python3.10/test/test_asyncio/test_subprocess.pytearDownModule   s   r   c                   @      e Zd Zdd ZdS )TestSubprocessTransportc                 O   s.   t  | _d | j_d | j_d | j_d| j_d S )N)r   Mock_procstdinstdoutstderrpid)selfargskwargsr   r   r   _start"   s
   
zTestSubprocessTransport._startN)__name__
__module____qualname__r   r   r   r   r   r   !   s    r   c                       s6   e Zd Z fddZd
ddZdd Zdd	 Z  ZS )SubprocessTransportTestsc                    s$   t    |  | _| | j d S r   )supersetUpZnew_test_looploopset_event_loopr   	__class__r   r   r$   +      

zSubprocessTransportTests.setUpNc                 C   s>   t  }d|j_d|j_t| j|dgdd d d d|d	}||fS )NFtestr   )waiter)r   r   connection_madeZ_is_coroutineprocess_exitedr   r%   )r   r,   protocol	transportr   r   r   create_transport0   s   
z)SubprocessTransportTests.create_transportc                 C   s   | j  }| |\}}|d | j | | | d | |jj	 | |j
j	 | |jj	 | |jjd d | |  | |j | |j | |j | t|jtj | t|j | t|j |  d S )N   r   r   )r%   create_futurer1   _process_exitedrun_until_completeassertEqualget_returncode
assertTruer-   calledr.   Zconnection_lostZ	call_argsassertFalseZ
is_closingassertIsNoneZ_loopr   Z	_protocolassertRaisesProcessLookupErrorsend_signalsignalSIGTERM	terminatekillcloser   r,   r0   r/   r   r   r   test_proc_exited9   s&   

z)SubprocessTransportTests.test_proc_exitedc                 C   s|   | j  }| |\}}|d | j | | t|d d |_| t|d d |_d |_| t|d |	  d S )Nr2   z-<TestSubprocessTransport pid=-1 returncode=6>z(<TestSubprocessTransport pid=-1 running>z%<TestSubprocessTransport not started>)
r%   r3   r1   r4   r5   r6   reprZ_returncode_pidrC   rD   r   r   r   test_subprocess_reprS   s(   

z-SubprocessTransportTests.test_subprocess_reprr   )r   r    r!   r$   r1   rE   rH   __classcell__r   r   r(   r   r"   *   s
    
	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e	
ejdkd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jd#kd$d%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d=d> Z#d?S )@SubprocessMixinc                    sP   t   fdd}|d}t|d}| j|\}}| |d | |d d S )Nc                    sj   t j tjtjdI d H }|j|  |j I d H  |j  |j	 I d H } |
 I d H }|| fS N)r   r   )r   create_subprocess_execr   PIPEr   writedrainrC   r   readwait)dataprocexitcoder   r   r   runp   s   
z.SubprocessMixin.test_stdin_stdout.<locals>.run	   some datag      N@r   )PROGRAM_CATr   wait_forr%   r5   r6   r   rV   taskrT   r   r   rU   r   test_stdin_stdoutm   s   z!SubprocessMixin.test_stdin_stdoutc                    sR   t   fdd}|d}t|tj}| j|\}}| |d | |d d S )Nc                    s<   t j tjtjdI d H }|| I d H \}}|j|fS rK   )r   rL   r   rM   communicate
returncode)rR   rS   r   r   rU   r   r   rV      s   
z-SubprocessMixin.test_communicate.<locals>.runrW   r   )rX   r   rY   r   ZLONG_TIMEOUTr%   r5   r6   rZ   r   rU   r   test_communicate   s   	z SubprocessMixin.test_communicatec                 C   s2   | j td}| j | }| |d d S )Nzexit 7   r%   r5   r   create_subprocess_shellrQ   r6   r   rS   rT   r   r   r   
test_shell   s
   zSubprocessMixin.test_shellc                 C   s6   | j tjddd}| j | }| |d d S )Nzexit 8T)start_new_session   ra   rc   r   r   r   test_start_new_session   s   z&SubprocessMixin.test_start_new_sessionc                 C   \   t }| jtj| }|  | j| }tjdkr$| 	|t
 d S | tj | d S Nr   )PROGRAM_BLOCKEDr%   r5   r   rL   rB   rQ   sysplatformassertIsInstanceintr6   r?   SIGKILLr   r   rS   r^   r   r   r   	test_kill      
zSubprocessMixin.test_killc                 C   rh   ri   )rj   r%   r5   r   rL   rA   rQ   rk   rl   rm   rn   r6   r?   r@   rp   r   r   r   test_terminate   rr   zSubprocessMixin.test_terminater   zDon't have SIGHUPc              
      s   t  t jt j}z5d}tjd|g} jtj|dt	j
i} fdd} j||} t j | W t  t j| d S t  t j| w )Nz<import time; print("sleeping", flush=True); time.sleep(3600)r
   r   c                    s<   | j  I d H } |d | tj |  I d H }|S )Ns	   sleeping
)r   readliner6   r>   r?   SIGHUPrQ   )rS   liner^   r'   r   r   r>      s   z5SubprocessMixin.test_send_signal.<locals>.send_signal)r?   ru   SIG_DFLrk   
executabler%   r5   r   rL   r   rM   r6   )r   Zold_handlercoder   rS   r>   r^   r   r'   r   test_send_signal   s   	"z SubprocessMixin.test_send_signalc                 C   s0   dt j }| jtjtjddtj	d}||fS )N   xr
   passr   )
r   ZPIPE_MAX_SIZEr%   r5   r   rL   rk   rx   r   rM   )r   
large_datarS   r   r   r   prepare_broken_pipe_test   s   
z(SubprocessMixin.prepare_broken_pipe_testc                 C   sp   |   \}}dd }|||}t  | ttf| jj| W d    n1 s)w   Y  | j|  d S )Nc                    s2   t dI d H  | j| | j I d H  d S )Ng      ?)r   sleepr   rN   rO   )rS   rR   r   r   r   write_stdin   s   z;SubprocessMixin.test_stdin_broken_pipe.<locals>.write_stdin)	r   
test_utilsdisable_loggerr<   BrokenPipeErrorConnectionResetErrorr%   r5   rQ   )r   rS   r~   r   coror   r   r   test_stdin_broken_pipe   s   


z&SubprocessMixin.test_stdin_broken_pipec                 C   sB   |   \}}| jdd  | j|| | j|  d S )Nc                 S   s   d S r   r   )r%   msgr   r   r   <lambda>  s    zESubprocessMixin.test_communicate_ignore_broken_pipe.<locals>.<lambda>)r   r%   Zset_exception_handlerr5   r]   rQ   )r   rS   r~   r   r   r   #test_communicate_ignore_broken_pipe   s   z3SubprocessMixin.test_communicate_ignore_broken_pipec                    sb   d  d d  fdd}j | \}}|d  |jj |jj d S )N
         c                     s~   d dd df} jj  fdd}|j_tjtjd| tjjtjjdI d H }|j	
d	}| I d H \}}||fS )
N
r   zsys.stdout.write("x" * %s)sys.stdout.flush()c                     s6    | i |I d H \}}t  |_t  |_||fS r   )r   r   pause_readingresume_reading)r   kwr0   r/   connect_read_piper   r   connect_read_pipe_mock  s
   

z^SubprocessMixin.test_pause_reading.<locals>.test_pause_reading.<locals>.connect_read_pipe_mockr
   )r   r   limitr   )joinr%   r   r   rL   rk   rx   r   rM   Z
_transportZget_pipe_transportr]   )ry   r   rS   Zstdout_transportr   r   r   r   sizer   r   test_pause_reading  s$   z>SubprocessMixin.test_pause_reading.<locals>.test_pause_readingr{   )r%   r5   r6   r8   r   r9   r   )r   r   r   r0   r   r   r   r     s   "z"SubprocessMixin.test_pause_readingc                 C   <   dd }| j |d\}}| | d | |d d S )Nc              	      \   d}t jtjd|t jjt jjt jjddI d H }|| I d H \}}| I d H }||fS N5import sys; data = sys.stdin.read(); print(len(data))r
   Fr   r   r   	close_fdsr   rL   rk   rx   r   rM   r]   rQ   messagery   rS   r   r   rT   r   r   r   len_message7     z?SubprocessMixin.test_stdin_not_inheritable.<locals>.len_message   abc   3r   r%   r5   r6   rstrip)r   r   outputrT   r   r   r   test_stdin_not_inheritable4     z*SubprocessMixin.test_stdin_not_inheritablec                 C   :   dd }| j | \}}| | d | |d d S )Nc               	      s\   d} t jtjd| t jjt jjt jjddI d H }|dI d H \}}| I d H }||fS )Nr   r
   Fr       r   ry   rS   r   r   rT   r   r   r   empty_inputJ  r   z5SubprocessMixin.test_empty_input.<locals>.empty_input   0r   r   r   r   r   rT   r   r   r   test_empty_inputH     z SubprocessMixin.test_empty_inputc                 C   r   )Nc               	      sZ   d} t jtjd| t jjt jjt jjddI d H }| I d H \}}| I d H }||fS r   )	r   rL   rk   rx   r   DEVNULLrM   r]   rQ   r   r   r   r   r   ]  s   z7SubprocessMixin.test_devnull_input.<locals>.empty_inputr   r   r   r   r   r   r   test_devnull_input[  r   z"SubprocessMixin.test_devnull_inputc                 C   6   dd }| j | \}}| |d  | |d d S )Nc               	      s\   d} t jtjd| t jjt jjt jjddI d H }|dI d H \}}| I d H }||fS Nr   r
   Fr   r   	r   rL   rk   rx   r   rM   r   r]   rQ   r   r   r   r   empty_outputp  r   z9SubprocessMixin.test_devnull_output.<locals>.empty_outputr   r%   r5   r6   )r   r   r   rT   r   r   r   test_devnull_outputn     z#SubprocessMixin.test_devnull_outputc                 C   r   )Nc               	      s\   d} t jtjd| t jjt jjt jjddI d H }|dI d H \}}| I d H }||fS r   r   r   r   r   r   empty_error  r   z7SubprocessMixin.test_devnull_error.<locals>.empty_errorr   r   )r   r   r   rT   r   r   r   test_devnull_error  r   z"SubprocessMixin.test_devnull_errorlinuxzDon't have /dev/stdinc                 C   r   )Nc              	      r   )Nz?file = open("/dev/stdin"); data = file.read(); print(len(data))r
   Fr   r   r   r   r   r   devstdin_input  r   z;SubprocessMixin.test_devstdin_input.<locals>.devstdin_inputr   r   r   r   )r   r   r   rT   r   r   r   test_devstdin_input  r   z#SubprocessMixin.test_devstdin_inputc                        fdd} j |  d S )Nc                     sv   t jt I d H }  j|  } j|j z|I d H  W n
 t jy)   Y nw |  | 	  |  I d H  d S r   )
r   rL   rj   r%   create_taskrQ   	call_sooncancelCancelledErrorrB   )rS   r[   r'   r   r   cancel_wait  s   z=SubprocessMixin.test_cancel_process_wait.<locals>.cancel_waitr%   r5   )r   r   r   r'   r   test_cancel_process_wait  s   z(SubprocessMixin.test_cancel_process_waitc                    sH    fdd}t    j|  W d    d S 1 sw   Y  d S )Nc                     sN   t jt }  j| } j|j z|I d H  W d S  t jy&   Y d S w r   )r   rL   rj   r%   r   r   r   r   r   r[   r'   r   r   cancel_make_transport  s   
zYSubprocessMixin.test_cancel_make_subprocess_transport_exec.<locals>.cancel_make_transport)r   r   r%   r5   r   r   r   r'   r   *test_cancel_make_subprocess_transport_exec  s   
"z:SubprocessMixin.test_cancel_make_subprocess_transport_execc                    sT    fdd}t    j|  t  j W d    d S 1 s#w   Y  d S )Nc                     sZ    j jtjgtR  }  j | } j |j z|I d H  W d S  tjy,   Y d S w r   )	r%   subprocess_execr   SubprocessProtocolrj   r   r   r   r   r   r'   r   r   r     s   zDSubprocessMixin.test_cancel_post_init.<locals>.cancel_make_transport)r   r   r%   r5   run_brieflyr   r   r'   r   test_cancel_post_init  s
   
"z%SubprocessMixin.test_cancel_post_initc              	      s    fdd}t  # z j| \}}W n tjy%    d Y nw W d    n1 s0w   Y   |  | t 	 j d S )Nc                     s|   j jtjgtR  } | I d H \}}d  fdd}|d}|j||_| }|  t	|
 dI d H  | fS )NFc                      s   d   d S )NTr   r   Zkill_calledZ	orig_killr   r   rB     s   
zKSubprocessMixin.test_close_kill_running.<locals>.kill_running.<locals>.killr      )r%   r   r   r   rj   get_extra_inforB   r7   rC   rY   _wait)creater0   r/   rB   rS   r^   r'   r   r   kill_running  s   
z=SubprocessMixin.test_close_kill_running.<locals>.kill_runningz2Timeout failure on waiting for subprocess stopping)
r   r   r%   r5   r   TimeoutErrorZskipTestr;   r8   r   )r   r   r^   killedr   r'   r   test_close_kill_running  s    

	
z'SubprocessMixin.test_close_kill_runningc                    s    fdd}t    j| }t  j W d    n1 s"w   Y  |\}}} |  |  | tj	dkrNt
 trPt j  d S d S d S )Nc                     sp    j jtjgtR  } | I d H \}}|d}|  |  t	 |_|
 }| }|  |||jjfS )Nr   )r%   r   r   r   rj   r   rB   rQ   r   r   pollr7   rC   r9   )r   r0   r/   rS   proc_returncodeZtransport_returncoder'   r   r   r   
  s   

zCSubprocessMixin.test_close_dont_kill_finished.<locals>.kill_runningr   )r   r   r%   r5   r   ZassertIsNotNoner;   r:   rk   rl   
isinstanceSubprocessFastWatcherTestsr   get_child_watcherZ
_callbacksclear)r   r   resultr   Ztransport_return_coder   r   r'   r   test_close_dont_kill_finished  s   





z-SubprocessMixin.test_close_dont_kill_finishedc              
      s   t jdkr	d}nd}t|T}t}||_tjdd0}| | t	j
t jdd|dI d H  W d    n1 s:w   Y  | |g  W d    n1 sOw   Y  W d    d S W d    d S 1 sgw   Y  d S )	Nr   zasyncio.windows_utils.Popenzsubprocess.PopenT)recordr
   r|   r}   )rk   rl   r   ZpatchZeroDivisionErrorZside_effectwarningscatch_warningsr<   r   rL   rx   r6   )r   r   targetpopenexcZwarnsr   r   r   _test_popen_error1  s*   
"z!SubprocessMixin._test_popen_errorc                 C   s   | j | jd d d S Nr}   )r%   r5   r   r'   r   r   r   test_popen_errorD  s   z SubprocessMixin.test_popen_errorc                 C   s   | j | jtjd d S r   )r%   r5   r   r   rM   r'   r   r   r    test_popen_error_with_stdin_pipeI  s   z0SubprocessMixin.test_popen_error_with_stdin_pipec                 C   s   dd }| j |  d S )Nc                     s^   d g d} tjtjd| tjjdI d H }	 |jdI d H }|r,t	dI d H  nd S q)Nr   )r   zfor _ in range(64):z     sys.stdout.write("x" * 4096)r   zsys.exit(1)r
   )r   Ti   g333333?)
r   r   rL   rk   rx   r   rM   r   rP   r   )ry   processrR   r   r   r   executeQ  s   zDSubprocessMixin.test_read_stdout_after_process_exit.<locals>.executer   r   r   r   r   r   #test_read_stdout_after_process_exitO  s   z3SubprocessMixin.test_read_stdout_after_process_exitc                    r   )Nc                           t tjtjddI d H  W d    n1 sw   Y    t tjtjddI d H  W d    n1 s<w   Y    t tjtjddI d H  W d    d S 1 s]w   Y  d S NT)textzutf-8)encodingstrict)errors)r<   
ValueErrorr   rL   rk   rx   r   r'   r   r   r   g      "zLSubprocessMixin.test_create_subprocess_exec_text_mode_fails.<locals>.executer   r   r   r'   r   +test_create_subprocess_exec_text_mode_failsf  s   z;SubprocessMixin.test_create_subprocess_exec_text_mode_failsc                    r   )Nc                      r   r   )r<   r   r   rb   rk   rx   r   r'   r   r   r   x  r   zMSubprocessMixin.test_create_subprocess_shell_text_mode_fails.<locals>.executer   r   r   r'   r   ,test_create_subprocess_shell_text_mode_failsv  s   z<SubprocessMixin.test_create_subprocess_shell_text_mode_failsc                 C   s    dd }|  | j|  d S )Nc                     s\   t ttjddI d H } |  I d H  t tjddtdI d H } |  I d H  d S )Nr
   r|   .)r   rL   r   FakePathrk   rx   rQ   )pr   r   r   r     s   

zFSubprocessMixin.test_create_subprocess_exec_with_path.<locals>.executer;   r%   r5   r   r   r   r   %test_create_subprocess_exec_with_path  s   z5SubprocessMixin.test_create_subprocess_exec_with_pathN)$r   r    r!   r\   r_   rd   rg   rq   rs   unittestZskipIfrk   rl   rz   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   rJ   k   s@    
,
%)rJ   c                       s,   e Zd ZdZ fddZ fddZ  ZS )SubprocessWatcherMixinNc                    sJ   t    t }| | _| | j |  }|| j |	| d S r   )
r#   r$   r   get_event_loop_policyZnew_event_loopr%   r&   Watcherattach_loopset_child_watcherr   Zpolicywatcherr(   r   r   r$     s   

zSubprocessWatcherMixin.setUpc                    s:   t    t }| }|d  |d  |  d S r   )r#   tearDownr   r  r   r  r  rC   r  r(   r   r   r
    s   


zSubprocessWatcherMixin.tearDown)r   r    r!   r  r$   r
  rI   r   r   r(   r   r    s    
r  c                   @      e Zd ZejZdS )SubprocessThreadedWatcherTestsN)r   r    r!   r	   ZThreadedChildWatcherr  r   r   r   r   r        
r  zqbpo-38323: MultiLoopChildWatcher has a race condition                     and these tests can hang the test suitec                   @   r  )SubprocessMultiLoopWatcherTestsN)r   r    r!   r	   ZMultiLoopChildWatcherr  r   r   r   r   r    s    
r  c                   @   r  )SubprocessSafeWatcherTestsN)r   r    r!   r	   ZSafeChildWatcherr  r   r   r   r   r    r  r  c                   @   r  )r   N)r   r    r!   r	   ZFastChildWatcherr  r   r   r   r   r     r  r   c                   C   s>   t tdsdS zttt  W dS  ty   Y dS w )N
pidfd_openFT)hasattrosrC   r  getpidOSErrorr   r   r   r   has_pidfd_support  s   
r  z(operating system does not support pidfdsc                   @   r  )SubprocessPidfdWatcherTestsN)r   r    r!   r	   ZPidfdChildWatcherr  r   r   r   r   r    s    
r  c                       s   e Zd Z fddZ  ZS )SubprocessProactorTestsc                    s$   t    t | _| | j d S r   )r#   r$   r   ZProactorEventLoopr%   r&   r'   r(   r   r   r$     r*   zSubprocessProactorTests.setUp)r   r    r!   r$   rI   r   r   r(   r   r    s    r  c                   @   r   )GenericWatcherTestsc                    s$    fdd}   j|  d S )Nc                     st   t tj} d| j_t|   t t	
ttjddI d H  W d    n1 s.w   Y  | j  d S )NFr
   r|   )r   Zcreate_authspecr   ZAbstractChildWatcherZ	is_activeZreturn_valuer  r<   RuntimeErrorr   rL   r   r   rk   rx   Zadd_child_handlerZassert_not_called)r	  r'   r   r   r     s   
zWGenericWatcherTests.test_create_subprocess_fails_with_inactive_watcher.<locals>.executer   r   r   r'   r   2test_create_subprocess_fails_with_inactive_watcher  s   zFGenericWatcherTests.test_create_subprocess_fails_with_inactive_watcherN)r   r    r!   r  r   r   r   r   r    s    r  __main__))r  r?   rk   r  r   r   r   r   r   Ztest.test_asyncior   r   r+   r   Ztest.supportr   rl   r	   rx   rj   r   rX   r   ZBaseSubprocessTransportr   ZTestCaser"   rJ   r  r  skipr  r  r   r  Z
skipUnlessr  r  r  r   mainr   r   r   r   <module>   sl    
	A    
,	