o
    )Zh,,                     @   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)Zget_argumentos_exitintkillgetpidwritestrself r   P/var/www/html/lang_env/lib/python3.10/site-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 zt|dv rq|t
  fd	d
}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 sw   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      )Zmax_restartsr   )r   r(   c                     s0   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y# } z|r|jdks W Y d }~d S d }~ww )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   Z
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   sZ   



"zProcessTest.test_multi_process)r"   r#   r$   r'   r.   rM   __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 r6   rT   r   rR   r   r    <lambda>      
 z0SubprocessTest.test_subprocess.<locals>.<lambda>   >>> s   print('hello')
   
   hello
s   raise SystemExit
    )r   Zconfigured_classr"   endswithunittestZSkipTestr	   sys
executableSTREAM
subprocessSTDOUT
addCleanuprY   rG   rX   
read_untilr   rF   read_until_closer   datar   rR   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 )NrU   rV   rW   c                      r[   r6   r\   r   rR   r   r    r]      r^   z1SubprocessTest.test_close_stdin.<locals>.<lambda>r_   r`   )r	   re   rf   rg   rh   ri   rj   rY   rk   rX   rG   rl   rF   rm   r   rR   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 )	NrU   -cz'import sys; sys.stderr.write('hello\n'))rZ   c                      r[   r6   r\   r   rR   r   r    r]      r^   z,SubprocessTest.test_stderr.<locals>.<lambda>r`   ra   )	r	   re   rf   rg   rj   rZ   rk   rF   rG   rm   r   rR   r    test_stderr   s   zSubprocessTest.test_stderrc                 C   sV   t   | t j t tjddg}|| j |  }| 	|d | 	|j
| d S Nrq   passr   )r	   
initializerj   uninitializere   rf   set_exit_callbackstopr9   rF   
returncoder   rS   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 rs   )	r	   ru   rj   rv   re   rf   wait_for_exitrF   ry   rz   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 )	Nrq   zimport time; time.sleep(30))rY   g?c                    s      S r6   )rx   )r<   r   r   r    r]      s    z5SubprocessTest.test_sigchild_signal.<locals>.<lambda>zsubprocess failed to terminatez=subprocess closed stdout but failed to get termination signal)r	   ru   rj   rv   re   rf   rg   rY   rG   rw   rx   timesleepr   r   rL   r   SIGTERMr9   AssertionErrorrl   Zadd_done_callbackrF   ry   )r   rS   r{   Z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 )Nrq   import sys; sys.exit(1)r(   )r	   ru   rj   rv   re   rf   ZassertRaisesrh   CalledProcessErrorr}   rF   	exceptionry   )r   rS   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 )Nrq   r   F)Zraise_errorr(   )r	   ru   rj   rv   re   rf   r}   rF   rz   r   r   r    !test_wait_for_exit_raise_disabled  s   z0SubprocessTest.test_wait_for_exit_raise_disabledN)r"   r#   r$   rT   r   ro   rp   rr   r|   r~   r   r   r   r   r   r   r    rO      s     


	
(
rO   )$r7   r)   r   r   rh   re   r   rd   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   rO   r   r   r   r    <module>   s*    q