U
    luf,,  ã                   @   sö   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	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZ d d	lmZ d d
lmZm Z  eG dd„ dej!ƒƒZ"eG dd„ deƒƒZ#dS )é    N)Ú
HTTPClientÚ	HTTPError)Ú
HTTPServer)ÚIOLoop)Úgen_log)Úfork_processesÚtask_idÚ
Subprocess)ÚSimpleAsyncHTTPClient)Úbind_unused_portÚ	ExpectLogÚAsyncTestCaseÚgen_test)ÚskipIfNonUnix©ÚRequestHandlerÚApplicationc                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚProcessTestc                 C   s   G dd„ dt ƒ}td|fgƒS )Nc                   @   s   e Zd Zdd„ ZdS )z+ProcessTest.get_app.<locals>.ProcessHandlerc                 S   s\   |   dd ¡r t t|   d¡ƒ¡ |   dd ¡rFt t ¡ t|   d¡ƒ¡ |  tt ¡ ƒ¡ d S )NÚexitÚsignal)Zget_argumentÚosÚ_exitÚintÚkillÚgetpidÚwriteÚstr©Úself© r   ú=/tmp/pip-unpacked-wheel-bmg6zs32/tornado/test/process_test.pyÚget   s
    z/ProcessTest.get_app.<locals>.ProcessHandler.getN)Ú__name__Ú
__module__Ú__qualname__r!   r   r   r   r    ÚProcessHandler   s   r%   ú/r   )r   r%   r   r   r    Úget_app   s    
zProcessTest.get_appc                    s>   t ƒ d k	r&t d¡ t ¡  t d¡ t d¡ tƒ  	¡  d S )Nz$aborting child process from tearDowné   r   )
r   ÚloggingÚerrorÚshutdownr   r   r   ÚalarmÚsuperÚtearDownr   ©Ú	__class__r   r    r.   %   s    



zProcessTest.tearDownc                    sÒ  t tdƒ¼ tƒ \‰‰‡fdd„‰t d¡ z(tddd}ˆ |d k	¡ t d¡ W nX tk
r® } z:ˆ |j	d¡ ˆ t
ƒ d k¡ ˆ ¡  W Y ¢W 5 Q R £ d S d }~X Y nX zê|dkräˆ |t
ƒ ¡ ‡‡fd	d
„}t |ƒ ¡ n´|dkr˜ˆ |t
ƒ ¡ ˆ ¡  ttƒ‰ d‡ ‡fdd„	}|ddd |ddd t|dƒjƒ |ddd t|dƒjƒ}|ddd t|dƒjƒ}ˆ ||¡ |ddd t d¡ W n( tk
rÂ   tjd|dd ‚ Y nX W 5 Q R X d S )Nz:(Starting .* processes|child .* exited|uncaught exception)c                    s   dˆ | f S )Nzhttp://127.0.0.1:%d%sr   )Úpath)Úportr   r    Úget_url>   s    z/ProcessTest.test_multi_process.<locals>.get_urlé   é   )Zmax_restartsr   )r   r(   c                  “   s.   t ˆ  ¡ ƒ} |  ˆg¡ t ¡  ¡ I d H  d S ©N)r   r'   Zadd_socketsÚasyncioÚEventÚwait)Úserver)r   Úsockr   r    ÚfR   s    z)ProcessTest.test_multi_process.<locals>.fé   Fc              
      sH   zˆ   ˆ| ƒ¡W S  tk
rB } z|r0|jdks2‚ W 5 d }~X Y nX d S )NiW  )Úfetchr   Úcode)ÚurlÚfail_okÚe)Úclientr3   r   r    r>   a   s
    z-ProcessTest.test_multi_process.<locals>.fetchz/?exit=2T)rA   z/?exit=3r&   z/?exit=0z/?exit=4zexception in child process %d)Úexc_info)F)r   r   r   r   r,   r   Ú
assertTrueÚ
SystemExitÚassertEqualr?   r   Úcloser7   Úrunr   r
   r   ÚbodyZassertNotEqualr   r   Ú	Exceptionr)   r*   )r   ÚidrB   r<   r>   ÚpidZpid2r   )rC   r3   r2   r   r;   r    Útest_multi_process4   sN     ÿ

"
zProcessTest.test_multi_process)r"   r#   r$   r'   r.   rN   Ú__classcell__r   r   r/   r    r      s   r   c                   @   sl   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZd	d
„ Zedd„ ƒZ	dd„ Z
edd„ ƒZedd„ ƒZdS )ÚSubprocessTestc                 C   s   |j  ¡  |j  ¡  d S r6   )ÚprocÚ	terminater9   ©r   Úsubprocr   r   r    Úterm_and_waitŠ   s    
zSubprocessTest.term_and_waitc                 #   sÒ   t  ¡ j d¡rt d¡‚ttjddgtj	tj	t
jd‰ˆ  ‡ ‡fdd„¡ ˆ  ˆjj¡ ˆ  ˆjj¡ ˆj d¡V  ˆj d	¡ ˆj d
¡V }ˆ  |d¡ ˆj d¡V  ˆj d¡ ˆj ¡ V }ˆ  |d¡ d S )NZLayeredTwistedIOLoopz9Subprocess tests not compatible with LayeredTwistedIOLoopú-uú-i©ÚstdinÚstdoutÚstderrc                      s
   ˆ   ˆ¡S r6   ©rU   r   rS   r   r    Ú<lambda>Ÿ   ó    z0SubprocessTest.test_subprocess.<locals>.<lambda>ó   >>> s   print('hello')
ó   
ó   hello
s   raise SystemExit
r^   )r   Zconfigured_classr"   ÚendswithÚunittestZSkipTestr	   ÚsysÚ
executableÚSTREAMÚ
subprocessÚSTDOUTÚ
addCleanuprZ   rH   rY   Ú
read_untilr   rG   Úread_until_close©r   Údatar   rS   r    Útest_subprocessŽ   s*    ÿ
üzSubprocessTest.test_subprocessc                 #   sf   t tjddgt jt jtjd‰ˆ  ‡ ‡fdd„¡ ˆj d¡V  ˆj	 
¡  ˆj ¡ V }ˆ  |d¡ d S )NrV   rW   rX   c                      s
   ˆ   ˆ¡S r6   r\   r   rS   r   r    r]   µ   r^   z1SubprocessTest.test_close_stdin.<locals>.<lambda>r_   r`   )r	   rd   re   rf   rg   rh   ri   rZ   rj   rY   rH   rk   rG   rl   r   rS   r    Útest_close_stdin¬   s    
ü
zSubprocessTest.test_close_stdinc                 #   sT   t tjdddgt jd‰ˆ  ‡ ‡fdd„¡ ˆj d¡V }ˆ  |d¡ ˆj ¡  d S )	NrV   ú-cz'import sys; sys.stderr.write('hello\n'))r[   c                      s
   ˆ   ˆ¡S r6   r\   r   rS   r   r    r]   Ã   r^   z,SubprocessTest.test_stderr.<locals>.<lambda>r`   ra   )	r	   rd   re   rf   ri   r[   rj   rG   rH   rl   r   rS   r    Útest_stderr»   s    þzSubprocessTest.test_stderrc                 C   sV   t  ¡  |  t j¡ t tjddgƒ}| | j¡ |  ¡ }|  	|d¡ |  	|j
|¡ d S ©Nrp   Úpassr   )r	   Ú
initializeri   Úuninitializerd   re   Úset_exit_callbackÚstopr9   rG   Ú
returncode©r   rT   Úretr   r   r    Útest_sigchildÉ   s    zSubprocessTest.test_sigchildc                 c   sL   t  ¡  |  t j¡ t tjddgƒ}| ¡ V }|  |d¡ |  |j|¡ d S rr   )	r	   rt   ri   ru   rd   re   Úwait_for_exitrG   rx   ry   r   r   r    Útest_sigchild_futureÒ   s    
z#SubprocessTest.test_sigchild_futurec                    sð   t  ¡  ˆ  t j¡ t tjddgt jd}ˆ  |jj¡ | 	ˆ j
¡ t d¡ t |jtj¡ zˆ  ¡ }W nb tk
rÌ   |j ¡ }| ‡ fdd„¡ zˆ  ¡  W n tk
r¾   tdƒ‚Y n
X tdƒ‚Y nX ˆ  |j|¡ ˆ  |tj ¡ d S )	Nrp   zimport time; time.sleep(30))rZ   gš™™™™™¹?c                    s   ˆ   ¡ S r6   )rw   )r<   r   r   r    r]   ÷   r^   z5SubprocessTest.test_sigchild_signal.<locals>.<lambda>zsubprocess failed to terminatez=subprocess closed stdout but failed to get termination signal)r	   rt   ri   ru   rd   re   rf   rZ   rH   rv   rw   ÚtimeÚsleepr   r   rM   r   ÚSIGTERMr9   ÚAssertionErrorrk   Zadd_done_callbackrG   rx   )r   rT   rz   Zfutr   r   r    Útest_sigchild_signalÛ   s0    
þ

ÿ
z#SubprocessTest.test_sigchild_signalc              	   c   sZ   t  ¡  |  t j¡ t tjddgƒ}|  tj¡}| 	¡ V  W 5 Q R X |  
|jjd¡ d S )Nrp   úimport sys; sys.exit(1)r(   )r	   rt   ri   ru   rd   re   ÚassertRaisesrg   ÚCalledProcessErrorr|   rG   Ú	exceptionrx   )r   rT   Úcmr   r   r    Útest_wait_for_exit_raise  s    z'SubprocessTest.test_wait_for_exit_raisec                 c   sB   t  ¡  |  t j¡ t tjddgƒ}|jddV }|  |d¡ d S )Nrp   rƒ   F)Zraise_errorr(   )r	   rt   ri   ru   rd   re   r|   rG   ry   r   r   r    Ú!test_wait_for_exit_raise_disabled  s
    z0SubprocessTest.test_wait_for_exit_raise_disabledN)r"   r#   r$   rU   r   rn   ro   rq   r{   r}   r‚   rˆ   r‰   r   r   r   r    rP   ˆ   s   


	
(
rP   )$r7   r)   r   r   rg   rd   r~   rc   Ztornado.httpclientr   r   Ztornado.httpserverr   Ztornado.ioloopr   Ztornado.logr   Ztornado.processr   r   r	   Ztornado.simple_httpclientr
   Ztornado.testingr   r   r   r   Ztornado.test.utilr   Ztornado.webr   r   ZTestCaser   rP   r   r   r   r    Ú<module>   s(   q