σ
¨[c           @` s  d  d l  m Z m Z m 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 m Z d  d l  m! Z! m" Z" y d  d l# Z# Wn e$ k
 rAd Z# n Xd   Z& e d e j' f d     Y Z( e d e f d     Y Z) d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t
   HTTPClientt	   HTTPError(   t
   HTTPServer(   t   IOLoop(   t   gen_log(   t   fork_processest   task_idt
   Subprocess(   t   SimpleAsyncHTTPClient(   t   bind_unused_portt	   ExpectLogt   AsyncTestCaset   gen_test(   t   unittestt   skipIfNonUnix(   t   RequestHandlert   Applicationc           C` s.   t  j   j j d  r* t j d   n  d  S(   Nt   TwistedIOLoops/   Process tests not compatible with TwistedIOLoop(   R   t   configured_classt   __name__t   endswithR   t   SkipTest(    (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   skip_if_twisted   s    t   ProcessTestc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s)   d t  f d     Y} t d | f g  S(   Nt   ProcessHandlerc           B` s   e  Z d    Z RS(   c         S` s   |  j  d d   r1 t j t |  j  d    n  |  j  d d   rk t j t j   t |  j  d    n  |  j t t j     d  S(   Nt   exitt   signal(	   t   get_argumentt   Nonet   ost   _exitt   intt   killt   getpidt   writet   str(   t   self(    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   get$   s    (   R   t
   __module__R(   (    (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyR   #   s   t   /(   R   R   (   R'   R   (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   get_app"   s    
c         C` sZ   t    d  k	 r6 t j d  t j   t j d  n  t j d  t	 t
 |   j   d  S(   Ns$   aborting child process from tearDowni   i    (   R	   R   t   loggingt   errort   shutdownR    R!   R   t   alarmt   superR   t   tearDown(   R'   (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyR1   /   s    
c      	   ` sj  t    t t d  Nt   \ }   f d    t j d  y6 t d d d } |  j | d  k	  t j d  WnG t	 k
 rΑ } |  j
 | j d  |  j t   d  k  | j   d  SXyqt d  k	 rη t j t j    n  | d k r;|  j
 | t    t |  j    } | j | g  t j   j   nχ | d k r2|  j
 | t    | j   t t    t    f d	  } | d
 d t | d d t t | d  j  | d d t t | d  j  } | d d t t | d  j  } |  j | |  | d d t t j d  n  Wn* t  k
 r_t! j" d | d t   n XWd  QXd  S(   Ns:   (Starting .* processes|child .* exited|uncaught exception)c         ` s   d   |  f S(   Ns   http://127.0.0.1:%d%s(    (   t   path(   t   port(    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   get_urlG   s    i   i   t   max_restartsi    i   i   c         ` sL   y   j   |    SWn. t k
 rG } | o; | j d k sH   qH n Xd  S(   NiW  (   t   fetchR   t   code(   t   urlt   fail_okt   e(   t   clientR4   (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyR6   i   s
    s   /?exit=2R9   s   /?exit=3R*   s   /?exit=0s   /?exit=4s   exception in child process %dt   exc_info(   i    i   (#   R   R   R   R   R   R/   R   t
   assertTrueR   t
   SystemExitt   assertEqualR7   R	   t   closet   asynciot   set_event_loopt   new_event_loopR   R+   t   add_socketsR   t   currentt   startR   R   t   Falset   TrueR"   t   bodyt   assertNotEqualR    R!   t	   ExceptionR,   R-   (   R'   t   sockt   idR:   t   serverR6   t   pidt   pid2(    (   R;   R4   R3   s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_multi_process>   sP    

(   R   R)   R+   R1   RQ   (    (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyR       s   		t   SubprocessTestc           B` st   e  Z e d     Z e d    Z e d    Z d   Z e d    Z d   Z e d    Z	 e d    Z
 RS(   c         #` s"  t  j   j j d  r* t j d   n  t t j d d g d t j	 d t j	 d t
 j   |  j   f d    |  j   j j  |  j   j j    j j d	  V  j j d
    j j d  V} |  j | d    j j d	  V  j j d    j j   V} |  j | d  d  S(   Nt   LayeredTwistedIOLoops9   Subprocess tests not compatible with LayeredTwistedIOLoops   -us   -it   stdint   stdoutt   stderrc           ` s     j  j     j  j   f S(   N(   t   proct	   terminatet   wait(    (   t   subproc(    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   <lambda>   s    s   >>> s   print('hello')
s   
s   hello
s   raise SystemExit
t    (   R   R   R   R   R   R   R
   t   syst
   executablet   STREAMt
   subprocesst   STDOUTt
   addCleanupRU   R@   RT   t
   read_untilR%   R?   t   read_until_close(   R'   t   data(    (   RZ   s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_subprocess   s     	c         #` s   t  t j d d g d t  j d t  j d t j   |  j   f d      j j d  V  j	 j
     j j   V} |  j | d  d  S(	   Ns   -us   -iRT   RU   RV   c           ` s     j  j     j  j   f S(   N(   RW   RX   RY   (    (   RZ   (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyR[   ²   s    s   >>> s   
(   R
   R]   R^   R_   R`   Ra   Rb   RU   Rc   RT   R@   Rd   R?   (   R'   Re   (    (   RZ   s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_close_stdin¬   s    	c         #` su   t    t t j d d d g d t j   |  j   f d      j j d  V} |  j | d    j j	   d  S(   Ns   -us   -cs'   import sys; sys.stderr.write('hello\n')RV   c           ` s     j  j     j  j   f S(   N(   RW   RX   RY   (    (   RZ   (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyR[   ΐ   s    s   
s   hello
(
   R   R
   R]   R^   R_   Rb   RV   Rc   R?   R@   (   R'   Re   (    (   RZ   s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_stderrΈ   s    	c         C` s|   t    t j   |  j t j  t t j d d g  } | j |  j  |  j	   } |  j
 | d  |  j
 | j |  d  S(   Ns   -ct   passi    (   R   R
   t
   initializeRb   t   uninitializeR]   R^   t   set_exit_callbackt   stopRY   R?   t
   returncode(   R'   RZ   t   ret(    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_sigchildΖ   s    
c         c` sm   t    t j   |  j t j  t t j d d g  } | j   V} |  j | d  |  j | j	 |  d  S(   Ns   -cRi   i    (
   R   R
   Rj   Rb   Rk   R]   R^   t   wait_for_exitR?   Rn   (   R'   RZ   Ro   (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_sigchild_futureΡ   s    
c         C` s&  t    t j   |  j t j  t t j d d g d t j } |  j | j j	  | j
 |  j  t j | j t j  y |  j d d  } Wng t k
 rϊ | j j d |  j  y |  j d d  Wn t k
 rκ t d   qϋ Xt d   n X|  j | j |  |  j | t j  d  S(	   Ns   -cs   import time; time.sleep(30)RU   t   timeoutg      π?t   callbacks   subprocess failed to terminates=   subprocess closed stdout but failed to get termination signal(   R   R
   Rj   Rb   Rk   R]   R^   R_   RU   R@   Rl   Rm   R    R#   RO   R   t   SIGTERMRY   t   AssertionErrorRd   R?   Rn   (   R'   RZ   Ro   (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_sigchild_signalΫ   s(    
	c         c` sy   t    t j   |  j t j  t t j d d g  } |  j t j	   } | j
   VWd  QX|  j | j j d  d  S(   Ns   -cs   import sys; sys.exit(1)i   (   R   R
   Rj   Rb   Rk   R]   R^   t   assertRaisesR`   t   CalledProcessErrorRq   R?   t	   exceptionRn   (   R'   RZ   t   cm(    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   test_wait_for_exit_raiseω   s    
c         c` s`   t    t j   |  j t j  t t j d d g  } | j d t  V} |  j	 | d  d  S(   Ns   -cs   import sys; sys.exit(1)t   raise_errori   (
   R   R
   Rj   Rb   Rk   R]   R^   Rq   RG   R?   (   R'   RZ   Ro   (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt!   test_wait_for_exit_raise_disabled  s    
(   R   R)   R   Rf   Rg   Rh   Rp   Rr   Rw   R|   R~   (    (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyRR      s   	
	
(*   t
   __future__R    R   R   R,   R    R   R`   R]   t   tornado.httpclientR   R   t   tornado.httpserverR   t   tornado.ioloopR   t   tornado.logR   t   tornado.processR   R	   R
   t   tornado.simple_httpclientR   t   tornado.testingR   R   R   R   t   tornado.test.utilR   R   t   tornado.webR   R   RA   t   ImportErrorR   R   t   TestCaseR   RR   (    (    (    s8   lib/python2.7/site-packages/tornado/test/process_test.pyt   <module>   s.   "
	o