
    Xh                         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	 d dl
mZ d dlmZmZ d dlm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 d dlmZmZm Z m!Z! d dl"m#Z#m$Z$ 	 d dl%Z
d dl&m'Z' d dl%m*Z*m+Z+m,Z,m-Z- 	 d dl
m.Z.  G d de*      Z/ G d de/      Z0 G d de/      Z1 G d de/      Z2 G d de/      Z3 G d de$      Z4 G d de$      Z5 G d de/      Z6 G d  d!e/      Z7 G d" d#e/      Z8 G d$ d%e/      Z9 G d& d'e/      Z: G d( d)e/      Z; G d* d+e/      Z< G d, d-e/      Z= G d. d/e/      Z> G d0 d1e/      Z? G d2 d3e      Z@ G d4 d5e@      ZA G d6 d7e/      ZB G d8 d9e@      ZCe G d: d;e@             ZDe G d< d=eD             ZE G d> d?eE      ZF G d@ dAeE      ZG G dB dCeE      ZH G dD dEeD      ZIe G dF dGej                               ZK G dH dIeK      ZL ej                  e.du dJ       G dK dLeK             ZN G dM dNe@      ZO G dO dPe@      ZP G dQ dRe@      ZQ G dS dTej                        ZR G dU dVe@      ZS G dW dXe@      ZTy# e($ r  ejR                           w xY w# e($ r dZ.Y w xY w)Y    N)Future)gen)	HTTPErrorHTTPRequest)Event)gen_logapp_log)ResolverSimpleAsyncHTTPClient)
DictLoader)abstract_base_testignore_deprecation)AsyncHTTPTestCasegen_testbind_unused_port	ExpectLog)ApplicationRequestHandler_websocket_mask_python)WebSocketHandlerwebsocket_connectWebSocketErrorWebSocketClosedError)speedupsc                   $    e Zd ZdZddZd Zd Zy)TestWebSocketHandlerzBase class for testing handlers that exposes the on_close event.

    This allows for tests to see the close code and reason on the
    server side.

    Nc                      || _         || _        y Nclose_futurecompression_options)selfr"   r#   s      O/var/www/html/myenv/lib/python3.12/site-packages/tornado/test/websocket_test.py
initializezTestWebSocketHandler.initialize6   s    (#6     c                     | j                   S r    r#   r$   s    r%   get_compression_optionsz,TestWebSocketHandler.get_compression_options:   s    '''r'   c                     | j                   2| j                   j                  | j                  | j                  f       y y r    )r"   
set_result
close_codeclose_reasonr*   s    r%   on_closezTestWebSocketHandler.on_close=   s6    ((($//4;L;L)MN )r'   NN)__name__
__module____qualname____doc__r&   r+   r0    r'   r%   r   r   .   s    7(Or'   r   c                   0    e Zd Zej                  d        Zy)EchoHandlerc              #      K   	 | j                  |t        |t                     y # t        j                  $ r Y y t
        $ r Y y w xY wwr    )write_message
isinstancebytesasyncioCancelledErrorr   r$   messages     r%   
on_messagezEchoHandler.on_messageC   sG     	$$Wj%.HII%% 	# 		s/   A
"' A
AA
AA
AA
N)r2   r3   r4   r   	coroutinerA   r6   r'   r%   r8   r8   B   s    ]] r'   r8   c                       e Zd Zd Zy)ErrorInOnMessageHandlerc                     ddz   y )N   r   r6   r?   s     r%   rA   z"ErrorInOnMessageHandler.on_messageN   s	    	Ar'   Nr2   r3   r4   rA   r6   r'   r%   rD   rD   M   s    r'   rD   c                       e Zd Zd Zy)HeaderHandlerc                 (   t        j                  | j                  d      t        j                  | j                  d      t        j                  | j                  dd      t        j                  | j
                  dd      t        j                  | j                  d      | j                  | j                  g}|D ]  }	  |        t        d       | j                  | j                  j                  j                  dd             y # t        $ r Y Xw xY w)	NzThis should not workzhttp://localhost/elsewhereX-Test 	ChocolateChipi  zdid not get expected exception)	functoolspartialwriteredirect
set_header
set_cookie
set_statusflushfinish	ExceptionRuntimeErrorr:   requestheadersget)r$   methods_to_testmethods      r%   openzHeaderHandler.openS   s    djj*@Admm-IJdoox<doo{FCdoos3JJKK
 & 	F  @AA	 	4<<//33HbAB   s   <D	DDNr2   r3   r4   r_   r6   r'   r%   rI   rI   R   s    Cr'   rI   c                       e Zd Zd Zd Zy)HeaderEchoHandlerc                 (    | j                  dd       y )NX-Extra-Response-HeaderExtra-Response-Value)rS   r*   s    r%   set_default_headersz%HeaderEchoHandler.set_default_headersi   s    13IJr'   c                     | j                   j                  j                         D ]7  \  }}|j                         j	                  d      s&| j                  ||       9 y )Nzx-test)rZ   r[   get_alllower
startswithrS   )r$   kvs      r%   preparezHeaderEchoHandler.preparel   sJ    LL((002 	&DAqwwy##H-1%	&r'   N)r2   r3   r4   rf   rm   r6   r'   r%   rb   rb   h   s    K&r'   rb   c                       e Zd Zd Zy)NonWebSocketHandlerc                 &    | j                  d       y )Nok)rQ   r*   s    r%   r\   zNonWebSocketHandler.gets   s    

4r'   Nr2   r3   r4   r\   r6   r'   r%   ro   ro   r   s    r'   ro   c                       e Zd Zd Zy)RedirectHandlerc                 &    | j                  d       y )N/echo)rR   r*   s    r%   r\   zRedirectHandler.getx   s    gr'   Nrr   r6   r'   r%   rt   rt   w   s    r'   rt   c                       e Zd Zd Zy)CloseReasonHandlerc                 6    d| _         | j                  dd       y )NF  goodbye)on_close_calledcloser*   s    r%   r_   zCloseReasonHandler.open}   s    $

4#r'   Nr`   r6   r'   r%   rx   rx   |       $r'   rx   c                   6    e Zd Zej                  d        Zd Zy)AsyncPrepareHandlerc              #   0   K   t         j                   y wr    )r   momentr*   s    r%   rm   zAsyncPrepareHandler.prepare   s     jjs   c                 &    | j                  |       y r    r:   r?   s     r%   rA   zAsyncPrepareHandler.on_message   s    7#r'   N)r2   r3   r4   r   rB   rm   rA   r6   r'   r%   r   r      s    ]] $r'   r   c                       e Zd Zd Zy)PathArgsHandlerc                 &    | j                  |       y r    r   )r$   args     r%   r_   zPathArgsHandler.open   s    3r'   Nr`   r6   r'   r%   r   r           r'   r   c                   B     e Zd Z fdZej
                  d        Z xZS )CoroutineOnMessageHandlerc                 2    t        |   di | d| _        y Nr   r6   superr&   sleepingr$   kwargs	__class__s     r%   r&   z$CoroutineOnMessageHandler.initialize       $V$r'   c              #      K   | j                   dkD  r| j                  d       | xj                   dz  c_         t        j                  d       | xj                   dz  c_         | j                  |       y wNr   z%another coroutine is already sleepingrF   {Gz?r   r:   r   sleepr?   s     r%   rA   z$CoroutineOnMessageHandler.on_message   sY     ==1FGiio7#s   A4A6)r2   r3   r4   r&   r   rB   rA   __classcell__r   s   @r%   r   r      s      	]]$ $r'   r   c                       e Zd Zd Zy)RenderMessageHandlerc                 H    | j                  | j                  d|             y )Nmessage.html)r@   )r:   render_stringr?   s     r%   rA   zRenderMessageHandler.on_message   s     4--ng-NOr'   NrG   r6   r'   r%   r   r      s    Pr'   r   c                   *     e Zd Z fdZd Zd Z xZS )SubprotocolHandlerc                 2    t        |   di | d| _        y NFr6   )r   r&   select_subprotocol_calledr   s     r%   r&   zSubprotocolHandler.initialize   s    $V$).&r'   c                 J    | j                   rt        d      d| _         d|v ryy )Nzselect_subprotocol called twiceT	goodproto)r   rX   )r$   subprotocolss     r%   select_subprotocolz%SubprotocolHandler.select_subprotocol   s-    ))=>>)-&,&r'   c                 n    | j                   st        d      | j                  d| j                  z         y )Nzselect_subprotocol not calledzsubprotocol=%s)r   rX   r:   selected_subprotocolr*   s    r%   r_   zSubprotocolHandler.open   s1    --;<<+d.G.GGHr'   )r2   r3   r4   r&   r   r_   r   r   s   @r%   r   r      s    /Ir'   r   c                   H     e Zd Z fdZej
                  d        Zd Z xZS )OpenCoroutineHandlerc                 @    t        |   di | || _        d| _        y r   )r   r&   testopen_finished)r$   r   r   r   s      r%   r&   zOpenCoroutineHandler.initialize   s"    $V$	"r'   c              #      K   | j                   j                  j                          t        j                  d       d| _        y w)Nr   T)r   message_sentwaitr   r   r   r*   s    r%   r_   zOpenCoroutineHandler.open   s6     ii$$))++ii!s   AAc                 T    | j                   st        d      | j                  d       y )Nz&on_message called before open finishedrq   )r   rX   r:   r?   s     r%   rA   zOpenCoroutineHandler.on_message   s%    !!DEE4 r'   )	r2   r3   r4   r&   r   rB   r_   rA   r   r   s   @r%   r   r      s%    #
 	]]" "
!r'   r   c                       e Zd Zd Zy)ErrorInOpenHandlerc                     t        d      )Nboom)rX   r*   s    r%   r_   zErrorInOpenHandler.open   s    r'   Nr`   r6   r'   r%   r   r      r   r'   r   c                       e Zd Zd Zy)ErrorInAsyncOpenHandlerc                 ^   K   t        j                  d       d {    t        d      7 w)Nr   r   )r=   r   rX   r*   s    r%   r_   zErrorInAsyncOpenHandler.open   s(     mmA 	s   -+-Nr`   r6   r'   r%   r   r      s     r'   r   c                       e Zd Zd Zy)NoDelayHandlerc                 H    | j                  d       | j                  d       y )NThello)set_nodelayr:   r*   s    r%   r_   zNoDelayHandler.open   s    7#r'   Nr`   r6   r'   r%   r   r      r~   r'   r   c                   L     e Zd Z fdZ fdZej                  d        Z xZS )WebSocketBaseTestCasec                 0    t         |           g | _        y r    )r   setUpconns_to_closer$   r   s    r%   r   zWebSocketBaseTestCase.setUp   s     r'   c                 d    | j                   D ]  }|j                           t        |           y r    )r   r}   r   tearDown)r$   connr   s     r%   r   zWebSocketBaseTestCase.tearDown   s,    '' 	DJJL	r'   c              +      K   t        d| j                         |fz  fi |}| j                  j                  |       t	        j
                  |      w)Nzws://127.0.0.1:%d%s)r   get_http_portr   appendr   Return)r$   pathr   wss       r%   
ws_connectz WebSocketBaseTestCase.ws_connect   sW     $!T%7%7%94$@@
DJ
 
 	""2&jjns   AA)	r2   r3   r4   r   r   r   rB   r   r   r   s   @r%   r   r      s%    !
 	]] r'   r   c                   "    e Zd Zd Zd Z fdZd Zd Zd Ze	d        Z
d Ze	d	        Ze	d
        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Ze	d        Z e	d        Z!e	d        Z"e	d         Z#e	d!        Z$e	d"        Z%e	d#        Z&e	d$        Z'e	d%        Z( xZ)S )&WebSocketTestc                     t               | _        t        dt        t	        | j                        fdt
        fdt        fdt        t	        | j                        fdt        t	        | j                        fdt        t	        | j                        fdt        t	        | j                        fd	t        t	        | j                        fd
t        t	        | j                        fdt        t	        | j                        fdt        t	        | j                        fdt        t	        | j                        fdt         t	        | j                  |       fdt"        fdt$        fdt&        fgt)        ddi            S )Nrv   )r"   /non_ws	/redirectz/headerz/header_echo/close_reason/error_in_on_message/async_preparez/path_args/(.*)
/coroutine/render/subprotocol/open_coroutine)r"   r   /error_in_open/error_in_async_open/nodelayr   z<b>{{ message }}</b>)template_loader)r   r"   r   r8   dictro   rt   rI   rb   rx   rD   r   r   r   r   r   r   r   r   r   r   r*   s    r%   get_appzWebSocketTest.get_app   sv   "H+t9J9J'KL/0o.M4T=N=N+OP"%d&7&78 $&d&7&78 ++d&7&78 %'d&7&78 &#d&7&78 !-d&7&78
 0$DDUDU2VW"&d&7&78 &(d&7&7dC
 "#56')@A^,a1d '8N'OPg4
 4	
r'   c                     t               S r    r   r*   s    r%   get_http_clientzWebSocketTest.get_http_client&  s    $&&r'   c                 ^    t         |           t        j                  j	                          y r    )r   r   r   _template_loadersclearr   s    r%   r   zWebSocketTest.tearDown*  s     ((..0r'   c                 ^    | j                  d      }| j                  |j                  d       y )Nrv     fetchassertEqualcoder$   responses     r%   test_http_requestzWebSocketTest.test_http_request.  s$    ::g&,r'   c                 j    | j                  ddddd      }| j                  |j                  d       y )Nrv   Upgrade	WebSocket13
Connectionr   zSec-WebSocket-Versionr[   r   r   r   s     r%   test_missing_websocket_keyz(WebSocketTest.test_missing_websocket_key3  <    ::'&)-  
 	,r'   c                 j    | j                  ddddd      }| j                  |j                  d       y )Nrv   r   r   12r   r   i  r   r   s     r%   test_bad_websocket_versionz(WebSocketTest.test_bad_websocket_version>  r   r'   c              #      K   | j                  d      }|j                  d       |j                         }| j                  |d       y w)Nrv   r   r   r:   read_messager   r$   r   r   s      r%   test_websocket_genz WebSocketTest.test_websocket_genI  sG     ??7++w''**7+   AAc                     t               5  t        d j                         z   j                         d d d         j	                         j                         }|j                  d       |j                   j                          j	                         j                         } j                  |d        j                  j                   fd       |j                           j	                          y # 1 sw Y   xY w)Nws://127.0.0.1:%d/echo)callbackr   c                 $    j                         S r    )stop)fr$   s    r%   <lambda>z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>Z  s    diik r'   )r   r   r   r  r   resultr:   r   r   r"   add_done_callbackr}   r   s   `  r%   test_websocket_callbacksz&WebSocketTest.test_websocket_callbacksP  s    ! 	(4+=+=+??$))	 YY[!
!
		"99;%%'7+++,AB

			 	s   )C66C?c              #      K   | j                  d      }|j                  dd       |j                         }| j                  |d       y w)Nrv   s   hello Tbinaryr   r   s      r%   test_binary_messagez!WebSocketTest.test_binary_message^  sI     ??7++
t4**=1r  c              #      K   | j                  d      }|j                  d       |j                         }| j                  |d       y wNrv   u   hello ér   r   s      r%   test_unicode_messagez"WebSocketTest.test_unicode_messagee  sD     ??7++
(**>2   A
Ac              #      K   | j                  d      }|j                          | j                  t              5  |j	                  d       d d d        y # 1 sw Y   y xY wwr  )r   r}   assertRaisesr   r:   r$   r   s     r%   )test_error_in_closed_client_write_messagez7WebSocketTest.test_error_in_closed_client_write_messagel  sQ     ??7++

34 	-^,	- 	- 	-s   9A"A	A"AA"c              #      K   | j                  d      }|j                  d       |j                         }| j                  |d       y w)Nr   r   z<b>hello</b>r   r   s      r%   test_render_messagez!WebSocketTest.test_render_messages  sD     ??9--
!**>2r  c              #      K   | j                  d      }|j                  d       t        t        d      5  |j	                         }d d d        | j                         y # 1 sw Y   xY ww)Nr   r   Uncaught exception)r   r:   r   r	   r   assertIsNoner   s      r%   test_error_in_on_messagez&WebSocketTest.test_error_in_on_messagez  sb     ??#9::
!w 45 	/__..H	/(#	/ 	/s   5A0A$
A0$A-)A0c              #      K   | j                  t              5 }| j                  d       d d d        | j                  j                  j
                  d       y # 1 sw Y   0xY ww)Nz	/notfoundi  )r  r   r   r   	exceptionr   )r$   cms     r%   test_websocket_http_failz&WebSocketTest.test_websocket_http_fail  sS     y) 	/R//+..	/**C0	/ 	/s   A'A/A'A$ A'c              #      K   | j                  t              5  | j                  d       d d d        y # 1 sw Y   y xY ww)Nr   )r  r   r   r*   s    r%   test_websocket_http_successz)WebSocketTest.test_websocket_http_success  s7     ~. 	-//),,	- 	- 	-   A5	A>Ac              #      K   | j                  t              5  | j                  d       d d d        y # 1 sw Y   y xY ww)Nr   )r  r   r   r*   s    r%   test_websocket_http_redirectz*WebSocketTest.test_websocket_http_redirect  s7     y) 	///+..	/ 	/ 	/r%  c              #     K   t               \  }}|j                          | j                  t              5  t	        t
        dd      5  t        d|z  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY ww)Nz.*F)requiredzws://127.0.0.1:%d/i  )connect_timeout)r   r}   r  IOErrorr   r   r   )r$   sockports      r%   test_websocket_network_failz)WebSocketTest.test_websocket_network_fail  sz     %'
d

w' 	7D59 '(4/ 	 	 	 	s4   3BA8A,A8#	B,A5	1A88B=Bc              #     K   t        j                  t        d| j                         z              5 }|j	                  d       |j	                  d       |j
                  j                          d d d        y # 1 sw Y   y xY ww)Nr  r   world)
contextlibclosingr   r   r:   streamr}   r  s     r%   "test_websocket_close_buffered_dataz0WebSocketTest.test_websocket_close_buffered_data  so     $%=@R@R@T%TUU
 	W%W%IIOO	 	 	s   2B=A:1	B:B?Bc           	   #      K   t        j                  t        t        d| j	                         z  ddi                  5 }|j                         }| j                  |d       d d d        y # 1 sw Y   y xY ww)Nzws://127.0.0.1:%d/headerrK   r   r   )r1  r2  r   r   r   r   r   r   s      r%   test_websocket_headersz$WebSocketTest.test_websocket_headers  s|      '2T5G5G5II!)7 3 	
 	0 __..HXw/	0 	0 	0s   ?A;%A/&	A;/A84A;c           	   #   ^  K   t        j                  t        t        d| j	                         z  ddi                  5 }| j                  |j                  j                  d      d       | j                  |j                  j                  d      d       d d d        y # 1 sw Y   y xY ww)Nzws://127.0.0.1:%d/header_echozX-Test-Hellor   r   rd   re   )r1  r2  r   r   r   r   r[   r\   r  s     r%   test_websocket_header_echoz(WebSocketTest.test_websocket_header_echo  s     
 '7$:L:L:NN!/ 9 	
 	 RZZ^^N;WE

89;Q	 	 	s   ?B-AB!	B-!B*&B-c              #   0  K   | j                  d      }|j                         }| j                  |d        | j                  |j                  d       | j                  |j
                  d       | j                  \  }}| j                  |d       y w)Nr   rz   r{   )r   r   assertIsr   r.   r/   r"   )r$   r   msgr   reasons        r%   test_server_close_reasonz&WebSocketTest.test_server_close_reason  s     ???33OO%%c4 -)4!...f 	t$s   BBc              #      K   | j                  d      }|j                  dd       | j                  \  }}| j                  |d       | j                  |d       y w)Nrv   rz   r{   )r   r}   r"   r   )r$   r   r   r<  s       r%   test_client_close_reasonz&WebSocketTest.test_client_close_reason  sW     ??7++
y!!...ft$+   AAc              #      K   | j                  d      }|j                         }| j                  |d        | j                  t              5  |j                  d       d d d        y # 1 sw Y   y xY ww)Nr   r   )r   r   r:  r  r   r:   )r$   r   r;  s      r%   test_write_after_closez$WebSocketTest.test_write_after_close  se     ???33OO%%c4 34 	&W%	& 	& 	&s   AA6A*!	A6*A3/A6c              #      K   | j                  d      }|j                  d       |j                         }| j                  |d       y w)Nr   r   r   r$   r   ress      r%   test_async_preparez WebSocketTest.test_async_prepare  sG      ??#344
!OO%%g&r  c              #   z   K   | j                  d      }|j                         }| j                  |d       y w)Nz/path_args/hellor   r   r   r   rD  s      r%   test_path_argszWebSocketTest.test_path_args  s7     ??#566OO%%g&   9;c              #     K   | j                  d      }|j                  d       |j                  d       |j                         }| j                  |d       |j                         }| j                  |d       y w)Nr   hello1hello2r   rD  s      r%   test_coroutinezWebSocketTest.test_coroutine  sw     ??<00x((x((OO%%h'OO%%h'   BBc              #   .  K   | j                         }d|z  }dd|z  i}t        j                  t        t	        ||                  5 }|j                  d       |j                         }| j                  |d       d d d        y # 1 sw Y   y xY ww)Nr  Originzhttp://127.0.0.1:%dr   r   r   r1  r2  r   r   r:   r   r   r$   r-  urlr[   r   r   s         r%   test_check_origin_valid_no_pathz-WebSocketTest.test_check_origin_valid_no_path  s     !!#&-2T9:$[g%FGG
 	0W%__..HXw/	0 	0 	0   AB
6B	 	B	BBc              #   .  K   | j                         }d|z  }dd|z  i}t        j                  t        t	        ||                  5 }|j                  d       |j                         }| j                  |d       d d d        y # 1 sw Y   y xY ww)Nr  rQ  zhttp://127.0.0.1:%d/somethingr   r   rR  rS  s         r%   !test_check_origin_valid_with_pathz/WebSocketTest.test_check_origin_valid_with_path  s     !!#&-<tCD$[g%FGG
 	0W%__..HXw/	0 	0 	0rV  c              #     K   | j                         }d|z  }dd|z  i}| j                  t              5 }t        t	        ||             d d d        | j                  j                  j                  d       y # 1 sw Y   0xY ww)Nr  rQ  z127.0.0.1:%dr     r   r  r   r   r   r   r   r   r$   r-  rT  r[   r!  s        r%   %test_check_origin_invalid_partial_urlz3WebSocketTest.test_check_origin_invalid_partial_url  s     !!#&-^d23y) 	GR#KW$EFF	G**C0	G 	Gs   2BA</B<BBc              #     K   | j                         }d|z  }ddi}| j                  t              5 }t        t	        ||             d d d        | j                  j                  j                  d       y # 1 sw Y   0xY ww)Nr  rQ  zhttp://somewhereelse.comr   rZ  r[  r\  s        r%   test_check_origin_invalidz'WebSocketTest.test_check_origin_invalid*  s     !!#&- 78y) 	GR#KW$EFF	G 	**C0	G 	Gs   /BA9
/B9B>Bc              #     K   | j                         }t               j                  d|      }|D ch c]  }|d   	 }}t        j                  |vr| j                  d       y d|z  }ddi}| j                  t              5 }t        t        ||             d d d        | j                  j                  j                  d       y c c}w # 1 sw Y   5xY ww)	N	localhostr   z"localhost does not resolve to ipv4zws://localhost:%d/echorQ  zhttp://subtenant.localhostr   rZ  )r   r
   resolvesocketAF_INETskipTestr  r   r   r   r   r   r   )r$   r-  addrinfoaddrfamiliesrT  r[   r!  s           r%   $test_check_origin_invalid_subdomainsz2WebSocketTest.test_check_origin_invalid_subdomains8  s     !!#
 "++K>>(01DG11>>)MM>?&- 9:y) 	GR#KW$EFF	G 	**C0 2	G 	Gs(   1CCACC4CCCc              #      K   | j                  dddg      }| j                  |j                  d       |j                         }| j                  |d       y w)Nr   badprotor   )r   zsubprotocol=goodproto)r   r   r   r   rD  s      r%   test_subprotocolszWebSocketTest.test_subprotocolsO  s`     ??*k)B # 
 
 	00+>OO%%56s   AAc              #      K   | j                  d      }| j                  |j                  d        |j                         }| j	                  |d       y w)Nr   zsubprotocol=None)r   r:  r   r   r   rD  s      r%   test_subprotocols_not_offeredz+WebSocketTest.test_subprotocols_not_offeredX  sK     ??>22b--t4OO%%01s   AAc              #      K   t               | _        | j                  d      }|j                  d       | j                  j	                          |j                         }| j                  |d       y w)Nr   r   rq   )r   r   r   r:   setr   r   rD  s      r%   test_open_coroutinez!WebSocketTest.test_open_coroutine_  sd     !G??#455w''OO%%d#s   A5A7c              #      K   t        t        d      5  | j                  d      }|j                         }d d d        | j	                         y # 1 sw Y   xY ww)Nr  r   r   r	   r   r   r  rD  s      r%   test_error_in_openz WebSocketTest.test_error_in_openh  sV     w 45 	*'788B))C	* 	#	* 	*   A&AAAAc              #      K   t        t        d      5  | j                  d      }|j                         }d d d        | j	                         y # 1 sw Y   xY ww)Nr  r   rs  rD  s      r%   test_error_in_async_openz&WebSocketTest.test_error_in_async_openo  sV     w 45 	*'=>>B))C	* 	#	* 	*ru  c              #   z   K   | j                  d      }|j                         }| j                  |d       y w)Nr   r   rH  rD  s      r%   test_nodelayzWebSocketTest.test_nodelayv  s6     ??:..OO%%g&rJ  )*r2   r3   r4   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r"  r$  r'  r.  r4  r6  r8  r=  r?  rB  rF  rI  rN  rU  rX  r]  r_  ri  rl  rn  rq  rt  rw  ry  r   r   s   @r%   r   r      s   6
p'1-
	-	- , , 2 2 3 3 - - 3 3 $ $ 1 1
 - - / /     0 0  & % % , , & & ' ' ' '
 ( ( 0 0 0 0 1 1 1 1 1 1, 7 7 2 2 $ $     ' 'r'   r   c                   $     e Zd Z fdZd Z xZS )NativeCoroutineOnMessageHandlerc                 2    t        |   di | d| _        y r   r   r   s     r%   r&   z*NativeCoroutineOnMessageHandler.initialize~  r   r'   c                    K   | j                   dkD  r| j                  d       | xj                   dz  c_         t        j                  d       d {    | xj                   dz  c_         | j                  |       y 7 +wr   r   r?   s     r%   rA   z*NativeCoroutineOnMessageHandler.on_message  sa     ==1FGiio7# 	s   AA>A<,A>)r2   r3   r4   r&   rA   r   r   s   @r%   r{  r{  }  s    $r'   r{  c                   "    e Zd Zd Zed        Zy)WebSocketNativeCoroutineTestc                 &    t        dt        fg      S )N/native)r   r{  r*   s    r%   r   z$WebSocketNativeCoroutineTest.get_app  s    Y(GHIJJr'   c              #     K   | j                  d      }|j                  d       |j                  d       |j                         }| j                  |d       |j                         }| j                  |d       y w)Nr  rL  rM  r   rD  s      r%   test_native_coroutinez2WebSocketNativeCoroutineTest.test_native_coroutine  sw     ??9--x((x((OO%%h'OO%%h'rO  N)r2   r3   r4   r   r   r  r6   r'   r%   r  r    s    K ( (r'   r  c                   V    e Zd ZdZd Zd Zd Zdededdfd	Ze	d
        Z
e	d        Zy)CompressionTestMixinzHello world. Testing 123 123c           	           G d dt               }t        dt        t        | j	                               fd|t        | j	                               fg      S )Nc                   "    e Zd Zed        Zd Zy)4CompressionTestMixin.get_app.<locals>.LimitedHandlerc                      y)N   r6   r*   s    r%   max_message_sizezECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_size  s    r'   c                 J    | j                  t        t        |                   y r    )r:   strlenr?   s     r%   rA   z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_message  s    ""3s7|#45r'   N)r2   r3   r4   propertyr  rA   r6   r'   r%   LimitedHandlerr    s     6r'   r  rv   r)   /limited)r   r   r8   r   get_server_compression_options)r$   r  s     r%   r   zCompressionTestMixin.get_app  s_    	61 	6  T-P-P-RS "T-P-P-RS
 	
r'   c                      y r    r6   r*   s    r%   r  z3CompressionTestMixin.get_server_compression_options      r'   c                      y r    r6   r*   s    r%   get_client_compression_optionsz3CompressionTestMixin.get_client_compression_options  r  r'   bytes_in	bytes_outreturnNc                     t               r    NotImplementedErrorr$   r  r  s      r%   verify_wire_bytesz&CompressionTestMixin.verify_wire_bytes      !##r'   c              #   h  K   | j                  d| j                               }t        d      D ]K  }|j                  | j                         |j                         }| j                  || j                         M | j                  |j                  j                  t        | j                        dz         | j                  |j                  j                  t        | j                        dz         | j                  |j                  j                  |j                  j                         y w)Nrv   r)      )r   r  ranger:   MESSAGEr   r   protocol_message_bytes_outr  _message_bytes_inr  _wire_bytes_in_wire_bytes_outr$   r   ir   s       r%   test_message_sizesz'CompressionTestMixin.test_message_sizes  s     ??)L)L)N # 
 

 q 	5AT\\*__..HXt||4	5 	77T\\9JQ9NO66DLL8IA8MNr{{992;;;V;VWs   D0D2c              #   $  K   | j                  d| j                               }|j                  d       |j                         }| j	                  |d       |j                  d       |j                         }| j                  |       y w)Nr  r)   ڀaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa128   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   r  r:   r   r   r  r   s      r%   test_size_limitz$CompressionTestMixin.test_size_limit  s     ??D,O,O,Q # 
 
 	#**5) 	$**(#s   BB)r2   r3   r4   r  r   r  r  intr  r   r  r  r6   r'   r%   r  r    sZ    ,G
0$# $# $$ $ X X $ $r'   r  c                       e Zd ZdZd Zy)UncompressedTestMixinzESpecialization of CompressionTestMixin when we expect no compression.c                     | j                  |dt        | j                        dz   z         | j                  |dt        | j                        dz   z         y )Nr        )r   r  r  r  s      r%   r  z'UncompressedTestMixin.verify_wire_bytes  sH    AT\\):Q)>$?@1DLL(9A(=#>?r'   N)r2   r3   r4   r5   r  r6   r'   r%   r  r    s    O@r'   r  c                       e Zd Zy)NoCompressionTestN)r2   r3   r4   r6   r'   r%   r  r    s    r'   r  c                       e Zd Zd Zy)ServerOnlyCompressionTestc                     i S r    r6   r*   s    r%   r  z8ServerOnlyCompressionTest.get_server_compression_options      	r'   N)r2   r3   r4   r  r6   r'   r%   r  r        r'   r  c                       e Zd Zd Zy)ClientOnlyCompressionTestc                     i S r    r6   r*   s    r%   r  z8ClientOnlyCompressionTest.get_client_compression_options  r  r'   N)r2   r3   r4   r  r6   r'   r%   r  r    r  r'   r  c                       e Zd Zd Zd Zd Zy)DefaultCompressionTestc                     i S r    r6   r*   s    r%   r  z5DefaultCompressionTest.get_server_compression_options  r  r'   c                     i S r    r6   r*   s    r%   r  z5DefaultCompressionTest.get_client_compression_options  r  r'   c                     | j                  |dt        | j                        dz   z         | j                  |dt        | j                        dz   z         | j                  ||dz          y )Nr  r  r     )
assertLessr  r  r   r  s      r%   r  z(DefaultCompressionTest.verify_wire_bytes  sX    	1DLL(9A(=#>?!s4<<'81'<"=>HrM2r'   N)r2   r3   r4   r  r  r  r6   r'   r%   r  r    s    3r'   r  c                   @    e Zd ZdededefdZdej                  fdZy)MaskFunctionMixinmaskdatar  c                     t               r    r  r$   r  r  s      r%   r  zMaskFunctionMixin.mask	  r  r'   r$   c                    | j                  | j                  dd      d       | j                  | j                  dd      d       | j                  | j                  dd      d       | j                  | j                  dd      d	       | j                  | j                  d
d      d       | j                  | j                  dd      d       y )Ns   abcdr'      b   s   54321s   TVPVPs   ZXCVs   98765432s   c`t`olpds    s   s   s   s    s   )r   r  r*   s    r%   	test_maskzMaskFunctionMixin.test_mask  s    7C0#67D17;7H5x@7K8+F 	II)+FG'	
 	II)+FG'	
r'   N)r2   r3   r4   r<   r  typingAnyr  r6   r'   r%   r  r    s,    $ $e $ $


 
r'   r  c                       e Zd Zd Zy)PythonMaskFunctionTestc                     t        ||      S r    r   r  s      r%   r  zPythonMaskFunctionTest.mask  s    %dD11r'   Nr2   r3   r4   r  r6   r'   r%   r  r    s    2r'   r  z#tornado.speedups module not presentc                       e Zd Zd Zy)CythonMaskFunctionTestc                 .    t        j                  ||      S r    )r   websocket_maskr  s      r%   r  zCythonMaskFunctionTest.mask%  s    &&tT22r'   Nr  r6   r'   r%   r  r  #  s    3r'   r  c                   "    e Zd Zd Zed        Zy)ServerPeriodicPingTestc                 B     G d dt               }t        d|fgdd      S )Nc                       e Zd Zd Zy)3ServerPeriodicPingTest.get_app.<locals>.PingHandlerc                 &    | j                  d       y )Ngot pongr   r$   r  s     r%   on_pongz;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pong,      "":.r'   N)r2   r3   r4   r  r6   r'   r%   PingHandlerr  +      /r'   r  /r   r   )websocket_ping_intervalwebsocket_ping_timeoutr   r   r$   r  s     r%   r   zServerPeriodicPingTest.get_app*  s/    	/. 	/ ; $(#$
 	
r'   c              #      K   | j                  d      }t        d      D ]&  }|j                         }| j                  |d       ( y w)Nr  r  r  )r   r  r   r   r  s       r%   test_server_pingz'ServerPeriodicPingTest.test_server_ping5  sI     ??3''q 	3A__..HXz2	3s   A	AN)r2   r3   r4   r   r   r  r6   r'   r%   r  r  )  s    	
 3 3r'   r  c                   "    e Zd Zd Zed        Zy)ClientPeriodicPingTestc                 <     G d dt               }t        d|fg      S )Nc                       e Zd Zd Zy)3ClientPeriodicPingTest.get_app.<locals>.PingHandlerc                 &    | j                  d       y )Ngot pingr   r  s     r%   on_pingz;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingA  r  r'   Nr2   r3   r4   r  r6   r'   r%   r  r  @  r  r'   r  r  r  r  s     r%   r   zClientPeriodicPingTest.get_app?  s$    	/. 	/ S+./00r'   c              #      K   | j                  ddd      }t        d      D ]&  }|j                         }| j                  |d       ( |j	                          y w)Nr  r   r   ping_intervalping_timeoutr  r  )r   r  r   r   r}   r  s       r%   test_client_pingz'ClientPeriodicPingTest.test_client_pingF  sZ     ??3d?KKq 	3A__..HXz2	3 	
r@  N)r2   r3   r4   r   r   r  r6   r'   r%   r  r  >  s    1  r'   r  c                   2    e Zd Zd Zed        Zed        Zy)ServerPingTimeoutTestc                 X    g | _         |  G fddt              }t        d|fg      }|S )Nc                   $     e Zd Zd fd	Z xZS )2ServerPingTimeoutTest.get_app.<locals>.PingHandlerc                 ~    j                   | _         | j                   j                  |        t        |   ||      S )Nr!   )handlersr   r   r&   )r$   r"   r#   r   r   s      r%   r&   z=ServerPingTimeoutTest.get_app.<locals>.PingHandler.initializeU  s=     $$$T*w)!-CV *  r'   r1   )r2   r3   r4   r&   r   )r   r   s   @r%   r  r  T  s     r'   r  r  )r  r   r   )r$   r  appr   s      @r%   r   zServerPingTimeoutTest.get_appP  s5    02	. 	 C-./
r'   c                      d _         d _         fd} | j                  j                         j                  _        y)z1Optionally suppress the client's "pong" response.Fr   c                 0     dt         dt        f fd}|S )Nopcoder  c                 d    | dk(  r"xj                   dz  c_         j                  ry  | |      S )N
   rF   )pongs_received
drop_pongs)r  r  fcnr   s     r%   _innerzCServerPingTimeoutTest.install_hook.<locals>.wrapper.<locals>._innerh  s2    S=%%*%}}64((r'   )r  r<   )r  r  r   s   ` r%   wrapperz3ServerPingTimeoutTest.install_hook.<locals>.wrapperg  s    )s )% ) Mr'   N)r  r
  r  _handle_message)r   r  s   ` r%   install_hookz"ServerPingTimeoutTest.install_hook`  s6     
	 '.bkk.I.I&J#r'   c              #     K   d}| j                  d||dz        }| j                  |       | j                  d   }t        d      D ]g  }t	        j
                  |       | j                  |j                         | j                  |j                         |j                  j                  gJ  | j                  |j                  d       d|_        t	        j
                  |dz         | j                  |j                  d	       | j                  |j                  d
       | j                  |j                  j                  d	       y w)Ng?r     r  r      Tg      ?i  zping timed out)r   r  r  r  r   r   r  r.   r/   r  assertGreaterEqualr
  r  r   )r$   intervalr   handler_s        r%   test_client_ping_timeoutz.ServerPingTimeoutTest.test_client_ping_timeoutu  s5     ??xhl # 
 
 	" --"q 		2A))H%% g001g223 ;;))111		2 	 1 115  ii3'' 	++T2--/?@ 	//6s   B-E0BEN)r2   r3   r4   r   staticmethodr  r   r  r6   r'   r%   r  r  O  s1      K K( %7 %7r'   r  c                       e Zd Zd Zy)PingCalculationTestc           	      h   ddl m} t        j                  ddddddt        j                  j                        }d}t        j                  ddddd	d
t        j                  j                        }|j                  |j                         ||j                               }| j                  |d       y )Nr   )WebSocketProtocol13i  rF   r  )tzinfor	     ;   6   )last_ping_timer  nowr  )tornado.websocketr  datetimetimezoneutcping_sleep_time	timestampr   )r$   r  r#  r  r"  
sleep_times         r%   test_ping_sleep_timez(PingCalculationTest.test_ping_sleep_time  s    9aB1X=N=N=R=RS!**!QB8+<+<+@+@
 )88)335 9 


 	Q'r'   N)r2   r3   r4   r+  r6   r'   r%   r  r    s    (r'   r  c                   "    e Zd Zd Zed        Zy)ManualPingTestc                 <     G d dt               }t        d|fg      S )Nc                       e Zd Zd Zy)+ManualPingTest.get_app.<locals>.PingHandlerc                 F    | j                  |t        |t                     y )Nr  )r:   r;   r<   r  s     r%   r  z3ManualPingTest.get_app.<locals>.PingHandler.on_ping  s    ""4
40G"Hr'   Nr  r6   r'   r%   r  r0    s    Ir'   r  r  r  r  s     r%   r   zManualPingTest.get_app  s&    	I. 	I S+./00r'   c              #   H  K   | j                  d      }| j                  t        |j                  d       |j                  d       |j	                         }| j                  |d       |j                  d       |j	                         }| j                  |d       y w)Nr  ~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   r  
ValueErrorpingr   r   )r$   r   resps      r%   test_manual_pingzManualPingTest.test_manual_ping  s     ??3''*bggy9
__&&x(
 __&&/s   B B"N)r2   r3   r4   r   r   r7  r6   r'   r%   r-  r-    s    1 0 0r'   r-  c                   "    e Zd Zd Zed        Zy)MaxMessageSizeTestc                 *    t        dt        fgd      S )Nr  r  )websocket_max_message_size)r   r8   r*   s    r%   r   zMaxMessageSizeTest.get_app  s    S+./DQQr'   c              #     K   | j                  d      }d}|j                  |       |j                         }| j                  ||       |j                  |dz          |j                         }| j	                  |d        | j                  |j
                  d       | j                  |j                  d       y w)Nr     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r:   r   r   r:  r.   r/   )r$   r   r;  r6  s       r%   test_large_messagez%MaxMessageSizeTest.test_large_message  s     ??3'' 
__&&s# 	s#__&&dD!-*;<s   B<B>N)r2   r3   r4   r   r   r?  r6   r'   r%   r9  r9    s    R = =r'   r9  )Ur=   r1  r%  rO   rc  	tracebackr  unittesttornado.concurrentr   tornador   tornado.httpclientr   r   tornado.locksr   tornado.logr   r	   tornado.netutilr
   tornado.simple_httpclientr   tornado.templater   tornado.test.utilr   r   tornado.testingr   r   r   r   tornado.webr   r   r$  tornado.utilr   ImportError	print_excr   r   r   r   r   r   r8   rD   rI   rb   ro   rt   rx   r   r   r   r   r   r   r   r   r   r   r   r{  r  r  r  r  r  r  r  TestCaser  r  skipIfr  r  r  r  r  r-  r9  r6   r'   r%   <module>rR     s           %  5  ( $ ; ' D T T 3	
3  
O+ O(& 2 
C( C,&, &. 
n 
$- $$. $ *  
$ 4 $P/ P
I- I&!/ !$ -  
 2  $) $- &M') M'`$&: $(#8 (  @$0 @$ @$F @0 @ @	- 	
 5 
 5 
31 3 
)) 
 
.2. 2
 T!#HI3. 3 J3
32 3*2 "L71 L7^((++ ("0* 00=. =]  

 I	
"  Hs   2
I 	I2 I/2I=<I=