B
    v9a9R  ã               @   s:  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 ejdkrzd dlmZ ejd	d
gZejd	d d¡gZG dd„ dejƒZG dd„ de
jƒZG dd„ dƒZejdkrG dd„ deƒZG dd„ dee
jƒZG dd„ dee
jƒZnG dd„ dee
jƒZedkr6e ¡  dS )é    N)Úmock)Úbase_subprocess)Ú
subprocess)Úutils)ÚsupportÚwin32)Úunix_eventsz-czimport time; time.sleep(3600)ú;)z
import syszdata = sys.stdin.buffer.read()zsys.stdout.buffer.write(data)c               @   s   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Úkwargs© r   ú%/usr/lib/python3.7/test_subprocess.pyÚ_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 )N)ÚsuperÚsetUpZnew_test_loopÚloopÚset_event_loop)r   )Ú	__class__r   r   r   $   s    

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_transport*   s    z)SubprocessTransportTests.create_transportc             C   sì   t j| jd}|  |¡\}}| 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   )N)ÚasyncioÚFuturer   r'   Ú_process_exitedÚrun_until_completeÚassertEqualÚget_returncodeÚ
assertTruer#   Úcalledr$   Zconnection_lostÚ	call_argsÚassertFalseZ
is_closingÚassertIsNoneZ_loopr   Z	_protocolÚassertRaisesÚProcessLookupErrorÚsend_signalÚsignalÚSIGTERMÚ	terminateÚkillÚclose)r   r"   r&   r%   r   r   r   Útest_proc_exited3   s$    
z)SubprocessTransportTests.test_proc_exitedc             C   s€   t j| jd}|  |¡\}}| d¡ | j |¡ |  t|ƒd¡ d |_|  t|ƒd¡ d |_	d |_|  t|ƒd¡ | 
¡  d S )N)r   r(   z-<TestSubprocessTransport pid=-1 returncode=6>z(<TestSubprocessTransport pid=-1 running>z%<TestSubprocessTransport not started>)r)   r*   r   r'   r+   r,   r-   ÚreprZ_returncodeZ_pidr;   )r   r"   r&   r%   r   r   r   Útest_subprocess_reprM   s"    
z-SubprocessTransportTests.test_subprocess_repr)N)r   r   r   r   r'   r<   r>   Ú__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d#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/S )0ÚSubprocessMixinc                sX   t ‰ ‡ ‡fdd„}|dƒ}tj|dˆjd}ˆj |¡\}}ˆ |d¡ ˆ |d¡ d S )Nc             “   sl   t jˆ tjtjˆjdœŽI d H }|j | ¡ |j ¡ I d H  |j ¡  |j	 
¡ I d H } | ¡ I d H }|| fS )N)r   r   r   )r)   Úcreate_subprocess_execr   ÚPIPEr   r   ÚwriteÚdrainr;   r   ÚreadÚwait)ÚdataÚprocÚexitcode)r   r   r   r   Úrunj   s    
z.SubprocessMixin.test_stdin_stdout.<locals>.runs	   some datag      N@)r   r   )ÚPROGRAM_CATr)   Úwait_forr   r,   r-   )r   rJ   ÚtaskrI   r   r   )r   r   r   Útest_stdin_stdoutg   s    z!SubprocessMixin.test_stdin_stdoutc                sX   t ‰ ‡ ‡fdd„}|dƒ}tj|dˆjd}ˆj |¡\}}ˆ |d¡ ˆ |d¡ d S )Nc             “   s>   t jˆ tjtjˆjdœŽI d H }| | ¡I d H \}}|j|fS )N)r   r   r   )r)   rA   r   rB   r   ÚcommunicateÚ
returncode)rG   rH   r   r   )r   r   r   r   rJ   „   s    z-SubprocessMixin.test_communicate.<locals>.runs	   some datag      N@)r   r   )rK   r)   rL   r   r,   r-   )r   rJ   rM   rI   r   r   )r   r   r   Útest_communicate   s    	z SubprocessMixin.test_communicatec             C   s<   t jd| jd}| j |¡}| j | ¡ ¡}|  |d¡ d S )Nzexit 7)r   é   )r)   Úcreate_subprocess_shellr   r,   rF   r-   )r   ÚcreaterH   rI   r   r   r   Ú
test_shell“   s
    
zSubprocessMixin.test_shellc             C   s>   t jdd| jd}| j |¡}| j | ¡ ¡}|  |d¡ d S )Nzexit 8T)Zstart_new_sessionr   é   )r)   rS   r   r,   rF   r-   )r   rT   rH   rI   r   r   r   Útest_start_new_sessionš   s    
z&SubprocessMixin.test_start_new_sessionc             C   sf   t }tj|d| jiŽ}| j |¡}| ¡  | j | ¡ ¡}tjdkrR|  	|t
¡ n|  tj |¡ d S )Nr   r   )ÚPROGRAM_BLOCKEDr)   rA   r   r,   r:   rF   ÚsysÚplatformÚassertIsInstanceÚintr-   r7   ÚSIGKILL)r   r   rT   rH   rP   r   r   r   Ú	test_kill£   s    
zSubprocessMixin.test_killc             C   sf   t }tj|d| jiŽ}| j |¡}| ¡  | j | ¡ ¡}tjdkrR|  	|t
¡ n|  tj |¡ d S )Nr   r   )rX   r)   rA   r   r,   r9   rF   rY   rZ   r[   r\   r-   r7   r8   )r   r   rT   rH   rP   r   r   r   Útest_terminate¯   s    
zSubprocessMixin.test_terminater   zDon't have SIGHUPc          
      sˆ   t   t jt j¡}zbd}tjd|g}tj|tjˆ j	dœŽ}ˆ j	 
|¡}‡ fdd„}ˆ j	 
||ƒ¡}ˆ  t j |¡ W d t   t j|¡ X d S )Nz<import time; print("sleeping", flush=True); time.sleep(3600)z-c)r   r   c             “   s:   | j  ¡ I d H }ˆ  |d¡ |  tj¡ |  ¡ I d H }|S )Ns	   sleeping
)r   Úreadliner-   r6   r7   ÚSIGHUPrF   )rH   ÚlinerP   )r   r   r   r6   É   s
    z5SubprocessMixin.test_send_signal.<locals>.send_signal)r7   ra   ÚSIG_DFLrY   Ú
executabler)   rA   r   rB   r   r,   r-   )r   Zold_handlerÚcoder   rT   rH   r6   rP   r   )r   r   Útest_send_signal»   s    	z SubprocessMixin.test_send_signalc             C   s8   dt j }tjtjddtj| jd}| j 	|¡}||fS )Nó   xz-cÚpass)r   r   )
r   ZPIPE_MAX_SIZEr)   rA   rY   rd   r   rB   r   r,   )r   Ú
large_datarT   rH   r   r   r   Úprepare_broken_pipe_test×   s    

z(SubprocessMixin.prepare_broken_pipe_testc          	      s`   ˆ   ¡ \}}‡ fdd„}|||ƒ}t ¡  ˆ  ttfˆ jj|¡ W d Q R X ˆ j | ¡ ¡ d S )Nc             “   s6   t jdˆ jdI d H  | j |¡ | j ¡ I d H  d S )Ng      à?)r   )r)   Úsleepr   r   rC   rD   )rH   rG   )r   r   r   Úwrite_stdinæ   s    z;SubprocessMixin.test_stdin_broken_pipe.<locals>.write_stdin)	rj   Ú
test_utilsÚdisable_loggerr4   ÚBrokenPipeErrorÚConnectionResetErrorr   r,   rF   )r   rH   ri   rl   Úcoror   )r   r   Útest_stdin_broken_pipeã   s    


z&SubprocessMixin.test_stdin_broken_pipec          	   C   sF   |   ¡ \}}t ¡  | j | |¡¡ W d Q R X | j | ¡ ¡ d S )N)rj   rm   rn   r   r,   rO   rF   )r   rH   ri   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ˆˆjdI d H }|j	 
d	¡}| ¡ I d H \}}||fS )
NÚ
z
import syszsys.stdout.write("x" * %s)zsys.stdout.flush()c              Ÿ   s0   ˆ | |ŽI d H \}}t  ¡ |_t  ¡ |_||fS )N)r   r   Úpause_readingÚresume_reading)r   Úkwr&   r%   )Úconnect_read_piper   r   Úconnect_read_pipe_mock  s    

z^SubprocessMixin.test_pause_reading.<locals>.test_pause_reading.<locals>.connect_read_pipe_mockz-c)r   r   Úlimitr   rv   )Újoinr   r{   r)   rA   rY   rd   r   rB   Z
_transportZget_pipe_transportrO   )re   r|   rH   Zstdout_transportr   r   )r}   r   Úsize)r{   r   Útest_pause_readingþ   s     z>SubprocessMixin.test_pause_reading.<locals>.test_pause_readingrg   )r   r,   r-   r/   rx   r0   ry   )r   r€   r   r&   r   )r}   r   r   r   r€   ú   s    "z"SubprocessMixin.test_pause_readingc                s@   ‡ fdd„}ˆ j  |dƒ¡\}}ˆ  | ¡ d¡ ˆ  |d¡ d S )Nc          
   “   s^   d}t jtjd|t jjt jjt jjdˆ jdI d H }| | ¡I d H \}}| ¡ I d H }||fS )Nz5import sys; data = sys.stdin.read(); print(len(data))z-cF)r   r   r   Ú	close_fdsr   )	r)   rA   rY   rd   r   rB   r   rO   rF   )Úmessagere   rH   r   r   rI   )r   r   r   Úlen_message)  s    z?SubprocessMixin.test_stdin_not_inheritable.<locals>.len_messages   abcó   3r   )r   r,   r-   Úrstrip)r   rƒ   ÚoutputrI   r   )r   r   Útest_stdin_not_inheritable&  s    z*SubprocessMixin.test_stdin_not_inheritablec                s>   ‡ f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ˆ jdI d H }| d¡I d H \}}| ¡ I d H }||fS )Nz5import sys; data = sys.stdin.read(); print(len(data))z-cF)r   r   r   r   r   ó    )	r)   rA   rY   rd   r   rB   r   rO   rF   )re   rH   r   r   rI   )r   r   r   Úempty_input<  s    z5SubprocessMixin.test_empty_input.<locals>.empty_inputó   0r   )r   r,   r-   r…   )r   r‰   r†   rI   r   )r   r   Útest_empty_input:  s    z SubprocessMixin.test_empty_inputc                s   ‡ fdd„}ˆ j  |ƒ ¡ d S )Nc              “   s~   t jtdˆ jiŽI d H } ˆ j |  ¡ ¡}ˆ j |j¡ y|I d H  W n t jk
rZ   Y nX | ¡  |  	¡  |  ¡ I d H  d S )Nr   )
r)   rA   rX   r   Úcreate_taskrF   Ú	call_soonÚcancelÚCancelledErrorr:   )rH   rM   )r   r   r   Úcancel_waitP  s    z=SubprocessMixin.test_cancel_process_wait.<locals>.cancel_wait)r   r,   )r   r   r   )r   r   Útest_cancel_process_waitM  s    z(SubprocessMixin.test_cancel_process_waitc          	      s2   ‡ fdd„}t  ¡  ˆ j |ƒ ¡ W d Q R X d S )Nc              “   sV   t jtdˆ jiŽ} ˆ j | ¡}ˆ j |j¡ y|I d H  W n t jk
rP   Y nX d S )Nr   )r)   rA   rX   r   rŒ   r   rŽ   r   )rq   rM   )r   r   r   Úcancel_make_transporth  s    
zYSubprocessMixin.test_cancel_make_subprocess_transport_exec.<locals>.cancel_make_transport)rm   rn   r   r,   )r   r’   r   )r   r   Ú*test_cancel_make_subprocess_transport_execf  s    
z:SubprocessMixin.test_cancel_make_subprocess_transport_execc          	      s>   ‡ fdd„}t  ¡   ˆ j |ƒ ¡ t  ˆ j¡ W d Q R X d S )Nc              “   sX   ˆ j jtjftžŽ } ˆ j  | ¡}ˆ j  |j¡ y|I d H  W n tjk
rR   Y nX d S )N)	r   Úsubprocess_execr)   ÚSubprocessProtocolrX   rŒ   r   rŽ   r   )rq   rM   )r   r   r   r’   z  s    zDSubprocessMixin.test_cancel_post_init.<locals>.cancel_make_transport)rm   rn   r   r,   Úrun_briefly)r   r’   r   )r   r   Útest_cancel_post_initx  s    
z%SubprocessMixin.test_cancel_post_initc          	      sV   ‡ fdd„}t  ¡  ˆ j |ƒ ¡\}}W d Q R X ˆ  |¡ ˆ  |¡ t  ˆ j¡ d S )Nc              “   sp   ˆj jtjftžŽ } | I d H \}}d‰ ‡ ‡fdd„}| d¡}|j‰||_| ¡ }| ¡  | 	¡ I d H  |ˆ fS )NFc                  s   d‰ ˆƒ  d S )NTr   r   )Úkill_calledÚ	orig_killr   r   r:   “  s    zKSubprocessMixin.test_close_kill_running.<locals>.kill_running.<locals>.killr   )
r   r”   r)   r•   rX   Úget_extra_infor:   r.   r;   Z_wait)rT   r&   r%   r:   rH   rP   )r   )r˜   r™   r   Úkill_running  s    
z=SubprocessMixin.test_close_kill_running.<locals>.kill_running)rm   rn   r   r,   r3   r/   r–   )r   r›   rP   Úkilledr   )r   r   Útest_close_kill_running‹  s    


z'SubprocessMixin.test_close_kill_runningc          	      sˆ   ‡ fdd„}t  ¡   ˆ j |ƒ ¡}t  ˆ j¡ W d Q R X |\}}}ˆ  |¡ ˆ  |¡ ˆ  |¡ tj	dkr„t
ˆ tƒr„t ¡ j ¡  d S )Nc              “   sl   ˆ j jtjftžŽ } | I d H \}}| d¡}| ¡  | ¡  t 	¡ |_| 
¡ }| ¡ }| ¡  |||jjfS )Nr   )r   r”   r)   r•   rX   rš   r:   rF   r   r   Zpollr.   r;   r0   )rT   r&   r%   rH   Úproc_returncodeZtransport_returncode)r   r   r   r›   «  s    

zCSubprocessMixin.test_close_dont_kill_finished.<locals>.kill_runningr   )rm   rn   r   r,   r–   ZassertIsNotNoner3   r2   rY   rZ   Ú
isinstanceÚSubprocessFastWatcherTestsr)   Z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             C   s–   t jdkrd}nd}t |¡n}t}||_tjt jdd|| j	d}t
jdd4}|  |¡ | j	 |¡ W d Q R X |  |g ¡ W d Q R X W d Q R X d S )	Nr   zasyncio.windows_utils.Popenzsubprocess.Popenz-crh   )r   r   T)Úrecord)rY   rZ   r   ZpatchÚZeroDivisionErrorZside_effectr)   rA   rd   r   ÚwarningsÚcatch_warningsr4   r,   r-   )r   r   ÚtargetÚpopenÚexcrT   Zwarnsr   r   r   Ú_test_popen_errorÒ  s    


z!SubprocessMixin._test_popen_errorc             C   s   | j d d d S )N)r   )r«   )r   r   r   r   Útest_popen_errorã  s    z SubprocessMixin.test_popen_errorc             C   s   | j tjd d S )N)r   )r«   r   rB   )r   r   r   r   Ú test_popen_error_with_stdin_pipeè  s    z0SubprocessMixin.test_popen_error_with_stdin_pipec                s   ‡ fdd„}ˆ j  |ƒ ¡ d S )Nc              “   st   d  dddddg¡} tjtjd| tjjˆ jd}|I d H }x4|j 	d	¡I d H }|rjtj
d
ˆ jdI d H  q<P q<W d S )Nrw   z
import syszfor _ in range(64):z     sys.stdout.write("x" * 4096)zsys.stdout.flush()zsys.exit(1)z-c)r   r   i   g333333Ó?)r   )r~   r)   rA   rY   rd   r   rB   r   r   rE   rk   )re   ZfutZprocessrG   )r   r   r   Úexecuteï  s    

zDSubprocessMixin.test_read_stdout_after_process_exit.<locals>.execute)r   r,   )r   r®   r   )r   r   Ú#test_read_stdout_after_process_exití  s    z3SubprocessMixin.test_read_stdout_after_process_exitN)r   r   r   rN   rQ   rU   rW   r^   r_   ÚunittestZskipIfrY   rZ   rf   rj   rr   rs   r€   r‡   r‹   r‘   r“   r—   r   r£   r«   r¬   r­   r¯   r   r   r   r   r@   e   s,   	,)r@   c                   s    e Zd ZdZ‡ fdd„Z‡  ZS )ÚSubprocessWatcherMixinNc                sX   t ƒ  ¡  t ¡ }| ¡ | _|  | j¡ |  ¡ }| | j¡ | 	|¡ |  
|j	d ¡ d S )N)r   r   r)   Zget_event_loop_policyZnew_event_loopr   r   ÚWatcherZattach_loopZset_child_watcherZ
addCleanup)r   ZpolicyZwatcher)r    r   r   r     s    


zSubprocessWatcherMixin.setUp)r   r   r   r²   r   r?   r   r   )r    r   r±     s   r±   c               @   s   e Zd ZejZdS )ÚSubprocessSafeWatcherTestsN)r   r   r   r   ZSafeChildWatcherr²   r   r   r   r   r³     s   r³   c               @   s   e Zd ZejZdS )r    N)r   r   r   r   ZFastChildWatcherr²   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 )N)r   r   r)   ZProactorEventLoopr   r   )r   )r    r   r   r   %  s    

zSubprocessProactorTests.setUp)r   r   r   r   r?   r   r   )r    r   r´   #  s   r´   Ú__main__)r7   rY   r°   r¦   r   r)   r   r   Ztest.test_asyncior   rm   r!   r   rZ   r   rd   rX   r~   rK   ZBaseSubprocessTransportr
   ZTestCaser   r@   r±   r³   r    r´   r   Úmainr   r   r   r   Ú<module>   s:   
	B   $

