o
    h,,                     @   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    M/var/www/vscode/kcb/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      )max_restartsr   )r   r)   c                     s0   t   } | g t  I d H  d S N)r   r(   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)clientr4   r    r!   rA   a   s   z-ProcessTest.test_multi_process.<locals>.fetchz/?exit=2T)rD   z/?exit=3r'   z/?exit=0z/?exit=4zexception in child process %d)exc_info)F)r   r   r   r   r-   r   
assertTrue
SystemExitassertEqualrB   r   closer:   runr   r
   r   bodyassertNotEqualr   r   	Exceptionr*   r+   )r   idrE   r?   rA   pidpid2r    )rF   r4   r3   r   r>   r!   test_multi_process4   sZ   



"zProcessTest.test_multi_process)r#   r$   r%   r(   r/   rS   __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 r8   )proc	terminater<   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 r8   rZ   r    rX   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
addCleanupr`   rK   r_   
read_untilr   rJ   read_until_closer   datar    rX   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                      rb   r8   rc   r    rX   r    r!   rd      re   z1SubprocessTest.test_close_stdin.<locals>.<lambda>rf   rg   )r	   rn   ro   rp   rq   rr   rs   r`   rt   r_   rK   ru   rJ   rv   r    rX   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'))ra   c                      rb   r8   rc   r    rX   r    r!   rd      re   z,SubprocessTest.test_stderr.<locals>.<lambda>rg   rh   )	r	   rn   ro   rp   rs   ra   rt   rJ   rK   rv   r    rX   r!   test_stderr   s   zSubprocessTest.test_stderrc                 C   sV   t   | t j t tjddg}|| j |  }| 	|d | 	|j
| d S Nrz   passr   )r	   
initializers   uninitializern   ro   set_exit_callbackstopr<   rJ   
returncoder   rY   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~   rs   r   rn   ro   wait_for_exitrJ   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 )	Nrz   zimport time; time.sleep(30))r`   g?c                    s      S r8   )r   )r?   r   r    r!   rd      s    z5SubprocessTest.test_sigchild_signal.<locals>.<lambda>zsubprocess failed to terminatez=subprocess closed stdout but failed to get termination signal)r	   r~   rs   r   rn   ro   rp   r`   rK   r   r   timesleepr   r   rQ   r   SIGTERMr<   AssertionErrorru   add_done_callbackrJ   r   )r   rY   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 )Nrz   import sys; sys.exit(1)r)   )r	   r~   rs   r   rn   ro   assertRaisesrq   CalledProcessErrorr   rJ   	exceptionr   )r   rY   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 )Nrz   r   F)raise_errorr)   )r	   r~   rs   r   rn   ro   r   rJ   r   r    r    r!   !test_wait_for_exit_raise_disabled  s   z0SubprocessTest.test_wait_for_exit_raise_disabledN)r#   r$   r%   rZ   r   rx   ry   r{   r   r   r   r   r   r    r    r    r!   rU      s     


	
(
rU   )$r:   r*   r   r   rq   rn   r   rl   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   rU   r    r    r    r!   <module>   s*    q