o
    Qœ_¿,  ã                   @   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 ¡r#t t ¡ t|   d¡ƒ¡ |  tt ¡ ƒ¡ d S )NÚexitÚsignal)Úget_argumentÚosÚ_exitÚintÚkillÚgetpidÚwriteÚstr©Úself© r    ú;/usr/lib/python3/dist-packages/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 u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 u¡ t d¡ W n, tyV } z |  |j	d¡ |  t
ƒ d u ¡ | ¡  W Y d }~W d   ƒ d S d }~ww z„td urct t ¡ ¡ |dv r�|  |t
ƒ ¡ t|  ¡ ƒ}| |g¡ t ¡  ¡  nY|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yë   tjd|dd� ‚ w W d   ƒ d S 1 s÷w   Y  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é   é   )Úmax_restartsr   )r   r)   é   Fc              
      sH   zˆ   ˆ| ƒ¡W S  ty# } z|r|jdks‚ W Y d }~d S d }~ww )NiW  )Úfetchr   Úcode)ÚurlÚfail_okÚe)Úclientr4   r    r!   r9   a   s   ÿ€ÿz-ProcessTest.test_multi_process.<locals>.fetchz/?exit=2T)r<   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   ÚcloseÚasyncioÚset_event_loopÚnew_event_loopr   r(   Úadd_socketsr   ÚcurrentÚstartr   r
   r   ÚbodyÚassertNotEqualr   r   Ú	Exceptionr*   r+   )r   ÚsockÚidr=   Úserverr9   ÚpidÚpid2r    )r>   r4   r3   r!   Útest_multi_process4   s`   ÿ


ì€
€þ€"¶zProcessTest.test_multi_process)r#   r$   r%   r(   r/   rR   Ú__classcell__r    r    r0   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 ©N)ÚprocÚ	terminateÚwait©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 )NÚLayeredTwistedIOLoopz9Subprocess tests not compatible with LayeredTwistedIOLoopú-uú-i©ÚstdinÚstdoutÚstderrc                      ó
   ˆ   ˆ¡S rU   ©r[   r    rY   r    r!   Ú<lambda>Ÿ   ó   
 z0SubprocessTest.test_subprocess.<locals>.<lambda>ó   >>> s   print('hello')
ó   
ó   hello
s   raise SystemExit
ó    )r   Úconfigured_classr#   ÚendswithÚunittestÚSkipTestr	   ÚsysÚ
executableÚSTREAMÚ
subprocessÚSTDOUTÚ
addCleanupra   rC   r`   Ú
read_untilr   rB   Úread_until_close©r   Údatar    rY   r!   Útest_subprocessŽ   s,   €ÿ
üzSubprocessTest.test_subprocessc                 #   sh   � 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 )Nr]   r^   r_   c                      rc   rU   rd   r    rY   r    r!   re   µ   rf   z1SubprocessTest.test_close_stdin.<locals>.<lambda>rg   rh   )r	   ro   rp   rq   rr   rs   rt   ra   ru   r`   rC   rv   rB   rw   r    rY   r!   Útest_close_stdin¬   s   €
ü
zSubprocessTest.test_close_stdinc                 #   sV   � t tjdddgt jd�‰ˆ  ‡ ‡fdd„¡ ˆj d¡V }ˆ  |d¡ ˆj ¡  d S )	Nr]   ú-cz'import sys; sys.stderr.write('hello\n'))rb   c                      rc   rU   rd   r    rY   r    r!   re   Ã   rf   z,SubprocessTest.test_stderr.<locals>.<lambda>rh   ri   )	r	   ro   rp   rq   rt   rb   ru   rB   rC   rw   r    rY   r!   Útest_stderr»   s   €þzSubprocessTest.test_stderrc                 C   sV   t  ¡  |  t j¡ t tjddgƒ}| | j¡ |  ¡ }|  	|d¡ |  	|j
|¡ d S ©Nr{   Úpassr   )r	   Ú
initializert   Úuninitializero   rp   Úset_exit_callbackÚstoprX   rB   Ú
returncode©r   rZ   Úretr    r    r!   Útest_sigchildÉ   s   zSubprocessTest.test_sigchildc                 c   sN   � t  ¡  |  t j¡ t tjddgƒ}| ¡ V }|  |d¡ |  |j|¡ d S r}   )	r	   r   rt   r€   ro   rp   Úwait_for_exitrB   rƒ   r„   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 n* ty_   |j ¡ }| ‡ fdd„¡ z	ˆ  ¡  W tdƒ‚ ty^   tdƒ‚w w ˆ  |j|¡ ˆ  |tj ¡ d S )	Nr{   zimport time; time.sleep(30))ra   gš™™™™™¹?c                    s   ˆ   ¡ S rU   )r‚   )Úfr   r    r!   re   ÷   s    z5SubprocessTest.test_sigchild_signal.<locals>.<lambda>zsubprocess failed to terminatez=subprocess closed stdout but failed to get termination signal)r	   r   rt   r€   ro   rp   rq   ra   rC   r�   r‚   ÚtimeÚsleepr   r   rP   r   ÚSIGTERMrX   ÚAssertionErrorrv   Úadd_done_callbackrB   rƒ   )r   rZ   r…   Úfutr    r   r!   Útest_sigchild_signalÛ   s4   
þ


ÿýÿõz#SubprocessTest.test_sigchild_signalc                 c   sp   � t  ¡  |  t j¡ t tjddgƒ}|  tj¡�}| 	¡ V  W d   ƒ n1 s)w   Y  |  
|jjd¡ d S )Nr{   úimport sys; sys.exit(1)r)   )r	   r   rt   r€   ro   rp   ÚassertRaisesrr   ÚCalledProcessErrorr‡   rB   Ú	exceptionrƒ   )r   rZ   Úcmr    r    r!   Útest_wait_for_exit_raise  s   €ÿz'SubprocessTest.test_wait_for_exit_raisec                 c   sD   � t  ¡  |  t j¡ t tjddgƒ}|jdd�V }|  |d¡ d S )Nr{   r‘   F)Úraise_errorr)   )r	   r   rt   r€   ro   rp   r‡   rB   r„   r    r    r!   Ú!test_wait_for_exit_raise_disabled  s   €z0SubprocessTest.test_wait_for_exit_raise_disabledN)r#   r$   r%   r[   r   ry   rz   r|   r†   rˆ   r�   r–   r˜   r    r    r    r!   rT   ˆ   s     


	
(
rT   )$rD   r*   r   r   rr   ro   rŠ   rm   Útornado.httpclientr   r   Útornado.httpserverr   Útornado.ioloopr   Útornado.logr   Útornado.processr   r   r	   Útornado.simple_httpclientr
   Útornado.testingr   r   r   r   Útornado.test.utilr   Útornado.webr   r   ÚTestCaser   rT   r    r    r    r!   Ú<module>   s*    q