B
    18™\ÛP  ã               @   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   úe/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_asyncio/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ÚsetUpÚ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_madeÚ_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&   Úconnection_lostÚ	call_argsÚassertFalseÚ
is_closingÚassertIsNoneÚ_loopr   Ú	_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/   ÚreprÚ_returncodeÚ_pidrA   )r   r#   r(   r'   r   r   r   Útest_subprocess_reprM   s"    
z-SubprocessTransportTests.test_subprocess_repr)N)r   r   r   r   r)   rB   rF   Ú__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+S ),Ú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ÚdrainrA   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   rR   ÚtaskrQ   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+   rI   r   rJ   r   ÚcommunicateÚ
returncode)rO   rP   r   r   )r   r   r   r   rR   „   s    z-SubprocessMixin.test_communicate.<locals>.runs	   some datag      N@)r   r   )rS   r+   rT   r   r.   r/   )r   rR   rU   rQ   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.   rN   r/   )r   ÚcreaterP   rQ   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)Ústart_new_sessionr   é   )r+   r[   r   r.   rN   r/   )r   r\   rP   rQ   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+   rI   r   r.   r@   rN   ÚsysÚplatformÚassertIsInstanceÚintr/   r=   ÚSIGKILL)r   r   r\   rP   rX   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   )ra   r+   rI   r   r.   r?   rN   rb   rc   rd   re   r/   r=   r>   )r   r   r\   rP   rX   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/   r<   r=   ÚSIGHUPrN   )rP   ÚlinerX   )r   r   r   r<   É   s
    z5SubprocessMixin.test_send_signal.<locals>.send_signal)r=   rj   ÚSIG_DFLrb   Ú
executabler+   rI   r   rJ   r   r.   r/   )r   Úold_handlerÚcoder   r\   rP   r<   rX   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   ÚPIPE_MAX_SIZEr+   rI   rb   rm   r   rJ   r   r.   )r   Ú
large_datar\   rP   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   rK   rL   )rP   rO   )r   r   r   Úwrite_stdinæ   s    z;SubprocessMixin.test_stdin_broken_pipe.<locals>.write_stdin)	ru   Ú
test_utilsÚdisable_loggerr:   ÚBrokenPipeErrorÚConnectionResetErrorr   r.   rN   )r   rP   rt   rw   Ú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)ru   rx   ry   r   r.   rW   rN   )r   rP   rt   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   r   )Újoinr   r†   r+   rI   rb   rm   r   rJ   Ú
_transportÚget_pipe_transportrW   )ro   r‡   rP   Ústdout_transportr   r   )rˆ   r   Úsize)r†   r   Útest_pause_readingþ   s     z>SubprocessMixin.test_pause_reading.<locals>.test_pause_readingrq   )r   r.   r/   r1   rƒ   r2   r„   )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+   rI   rb   rm   r   rJ   r   rW   rN   )Úmessagero   rP   r   r   rQ   )r   r   r   Úlen_message)  s    z?SubprocessMixin.test_stdin_not_inheritable.<locals>.len_messages   abcó   3r   )r   r.   r/   Úrstrip)r   r‘   ÚoutputrQ   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+   rI   rb   rm   r   rJ   r   rW   rN   )ro   rP   r   r   rQ   )r   r   r   Úempty_input<  s    z5SubprocessMixin.test_empty_input.<locals>.empty_inputó   0r   )r   r.   r/   r“   )r   r—   r”   rQ   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+   rI   ra   r   Úcreate_taskrN   Ú	call_soonÚcancelÚCancelledErrorr@   )rP   rU   )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+   rI   ra   r   rš   r›   rœ   r   )r|   rU   )r   r   r   Úcancel_make_transporth  s    
zYSubprocessMixin.test_cancel_make_subprocess_transport_exec.<locals>.cancel_make_transport)rx   ry   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+   ÚSubprocessProtocolra   rš   r›   rœ   r   )r|   rU   )r   r   r   r    z  s    zDSubprocessMixin.test_cancel_post_init.<locals>.cancel_make_transport)rx   ry   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£   ra   Úget_extra_infor@   r0   rA   Ú_wait)r\   r(   r'   r@   rP   rX   )r   )r¦   r§   r   Úkill_running  s    
z=SubprocessMixin.test_close_kill_running.<locals>.kill_running)rx   ry   r   r.   r7   r1   r¤   )r   rª   rX   Ú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£   ra   r¨   r@   rN   r   r   Úpollr0   rA   r2   )r\   r(   r'   rP   Úproc_returncodeZtransport_returncode)r   r   r   rª   «  s    

zCSubprocessMixin.test_close_dont_kill_finished.<locals>.kill_runningr   )rx   ry   r   r.   r¤   ÚassertIsNotNoner7   r5   rb   rc   Ú
isinstanceÚSubprocessFastWatcherTestsr+   Úget_child_watcherÚ
_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 |¡l}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-crr   )r   T)Úrecord)rb   rc   r   ÚpatchÚZeroDivisionErrorÚside_effectr+   rI   rm   r   ÚwarningsÚcatch_warningsr:   r.   r/   )r   ÚtargetÚpopenÚexcr\   Úwarnsr   r   r   Útest_popen_errorÒ  s    

z SubprocessMixin.test_popen_errorc                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 )Nr‚   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+   rI   rb   rm   r   rJ   r   r   rM   rv   )ro   ÚfutÚprocessrO   )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   rV   rY   r]   r`   rg   rh   ÚunittestÚskipIfrb   rc   rp   ru   r}   r~   rŽ   r•   r™   rŸ   r¡   r¥   r¬   r¶   rÁ   rÅ   r   r   r   r   rH   e   s(   	,)rH   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+   Úget_event_loop_policyÚnew_event_loopr   r    ÚWatcherÚattach_loopÚset_child_watcherÚ
addCleanup)r   ÚpolicyÚwatcher)r!   r   r   r     s    


zSubprocessWatcherMixin.setUp)r   r   r   rË   r   rG   r   r   )r!   r   rÈ   ÿ  s   rÈ   c               @   s   e Zd ZejZdS )ÚSubprocessSafeWatcherTestsN)r   r   r   r   Ú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   Ú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+   ÚProactorEventLoopr   r    )r   )r!   r   r   r     s    

zSubprocessProactorTests.setUp)r   r   r   r   rG   r   r   )r!   r   rÔ     s   rÔ   Ú__main__)r=   rb   rÆ   r»   r   r+   r   r   Ztest.test_asyncior   rx   r"   r   rc   r   rm   ra   r‰   rS   ÚBaseSubprocessTransportr
   ÚTestCaser   rH   rÈ   rÑ   r±   rÔ   r   Úmainr   r   r   r   Ú<module>   s:   
	B   

