
    gr                        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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+      Z, G d de+      Z- G d de+      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/ d0e+      Z; G d1 d2e      Z< G d3 d4e<      Z= G d5 d6e+      Z> G d7 d8e<      Z? G d9 d:e@      ZA G d; d<eA      ZB G d= d>eBe<      ZC G d? d@eBe<      ZD G dA dBeBe<      ZE G dC dDeAe<      ZF G dE dFe@      ZG G dG dHeGej                        ZI ej                  e*du dI       G dJ dKeGej                               ZK G dL dMe<      ZL G dN dOe<      ZM G dP dQe<      ZN G dR dSe<      ZOy# e$$ r  ejJ                           w xY w# e$$ r dZ*Y w xY w)T    N)Future)gen)	HTTPErrorHTTPRequest)Event)gen_logapp_log)ResolverSimpleAsyncHTTPClient)
DictLoader)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      P/var/www/openai/venv/lib/python3.12/site-packages/tornado/test/websocket_test.py
initializezTestWebSocketHandler.initialize4   s    (#6     c                     | j                   S r   r    r!   s    r"   get_compression_optionsz,TestWebSocketHandler.get_compression_options8   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(   r-    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_messageA   sG     	$$Wj%.HII%% 	# 		s/   A
"' A
AA
AA
AA
N)r.   r/   r0   r   	coroutiner=   r2   r$   r"   r4   r4   @   s    ]] r$   r4   c                       e Zd Zd Zy)ErrorInOnMessageHandlerc                     ddz   y )N   r   r2   r;   s     r"   r=   z"ErrorInOnMessageHandler.on_messageL   s	    	Ar$   Nr.   r/   r0   r=   r2   r$   r"   r@   r@   K   s    r$   r@   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RuntimeErrorr6   requestheadersget)r!   methods_to_testmethods      r"   openzHeaderHandler.openQ   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r.   r/   r0   r[   r2   r$   r"   rE   rE   P   s    Cr$   rE   c                       e Zd Zd Zd Zy)HeaderEchoHandlerc                 (    | j                  dd       y )NX-Extra-Response-HeaderExtra-Response-Value)rO   r'   s    r"   set_default_headersz%HeaderEchoHandler.set_default_headersg   s    13IJr$   c                     | j                   j                  j                         D ]7  \  }}|j                         j	                  d      s&| j                  ||       9 y )Nzx-test)rV   rW   get_alllower
startswithrO   )r!   kvs      r"   preparezHeaderEchoHandler.preparej   sE    LL((002DAqwwy##H-1% 3r$   N)r.   r/   r0   rb   ri   r2   r$   r"   r^   r^   f   s    K&r$   r^   c                       e Zd Zd Zy)NonWebSocketHandlerc                 &    | j                  d       y )Nok)rM   r'   s    r"   rX   zNonWebSocketHandler.getq   s    

4r$   Nr.   r/   r0   rX   r2   r$   r"   rk   rk   p   s    r$   rk   c                       e Zd Zd Zy)RedirectHandlerc                 &    | j                  d       y )N/echo)rN   r'   s    r"   rX   zRedirectHandler.getv   s    gr$   Nrn   r2   r$   r"   rp   rp   u   s    r$   rp   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\   r2   r$   r"   rt   rt   z       $r$   rt   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"   ri   zAsyncPrepareHandler.prepare   s     jjs   c                 &    | j                  |       y r   r6   r;   s     r"   r=   zAsyncPrepareHandler.on_message   s    7#r$   N)r.   r/   r0   r   r>   ri   r=   r2   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\   r2   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   r2   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 sleepingrB   {Gz?r   r6   r   sleepr;   s     r"   r=   z$CoroutineOnMessageHandler.on_message   sY     ==1FGiio7#s   A4A6)r.   r/   r0   r#   r   r>   r=   __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<   )r6   render_stringr;   s     r"   r=   zRenderMessageHandler.on_message   s     4--ng-NOr$   NrC   r2   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 NFr2   )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   rT   )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   rT   r6   selected_subprotocolr'   s    r"   r[   zSubprotocolHandler.open   s1    --;<<+d.G.GGHr$   )r.   r/   r0   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 finishedrm   )r   rT   r6   r;   s     r"   r=   zOpenCoroutineHandler.on_message   s%    !!DEE4 r$   )	r.   r/   r0   r#   r   r>   r[   r=   r   r   s   @r"   r   r      s%    #
 	]]" "
!r$   r   c                       e Zd Zd Zy)ErrorInOpenHandlerc                     t        d      )Nboom)rT   r'   s    r"   r[   zErrorInOpenHandler.open   s    r$   Nr\   r2   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   )r9   r   rT   r'   s    r"   r[   zErrorInAsyncOpenHandler.open   s(     mmA 	s   -+-Nr\   r2   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_nodelayr6   r'   s    r"   r[   zNoDelayHandler.open   s    7#r$   Nr\   r2   r$   r"   r   r      rz   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   ry   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)	r.   r/   r0   r   r   r   r>   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 )Nrr   )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   r4   dictrk   rp   rE   r^   rt   r@   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 )Nrr     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 )Nrr   Upgrade	WebSocket13
Connectionr   zSec-WebSocket-VersionrW   r   r   r   s     r"   test_missing_websocket_keyz(WebSocketTest.test_missing_websocket_key1  <    ::'&)-  
 	,r$   c                 j    | j                  ddddd      }| j                  |j                  d       y )Nrr   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)Nrr   r   r   r6   read_messager   r!   r   r   s      r"   test_websocket_genz WebSocketTest.test_websocket_genG  sG     ??7++w''**7+   AAc                     t        d j                         z   j                          j                         j	                         }|j                  d       |j                   j                          j                         j	                         } j                  |d        j                  j                   fd       |j                           j                          y )Nws://127.0.0.1:%d/echo)callbackr   c                 $    j                         S r   )stop)fr!   s    r"   <lambda>z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>W  s    diikr$   )r   r   r  r   resultr6   r   r   r   add_done_callbackry   r   s   `  r"   test_websocket_callbacksz&WebSocketTest.test_websocket_callbacksN  s    $t'9'9';;dii	
 YY[!
!
		"99;%%'7+++,AB

		r$   c              #      K   | j                  d      }|j                  dd       |j                         }| j                  |d       y w)Nrr   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Nrr   u   hello ér   r   s      r"   test_unicode_messagez"WebSocketTest.test_unicode_messageb  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   ry   assertRaisesr   r6   r!   r   s     r"   )test_error_in_closed_client_write_messagez7WebSocketTest.test_error_in_closed_client_write_messagei  sH     ??7++

34^, 544s   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_messagep  sD     ??9--
!**>2r  c              #      K   | j                  d      }|j                  d       t        t        d      5  |j	                         }d d d        | j                  d        y # 1 sw Y   xY ww)Nr   r   Uncaught exception)r   r6   r   r	   r   assertIsr   s      r"   test_error_in_on_messagez&WebSocketTest.test_error_in_on_messagew  s[     ??#9::
!w 45__..H 6h% 65s   5A1A%
A1%A.*A1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  sL     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  s.     ~.//),, /..   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  s.     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   ry   r  IOErrorr   r   r   )r!   sockports      r"   test_websocket_network_failz)WebSocketTest.test_websocket_network_fail  sh     %'
d

w'7D59'(4/  : ('99 ('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   r6   streamry   r  s     r"   "test_websocket_close_buffered_dataz0WebSocketTest.test_websocket_close_buffered_data  sj     $%=@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/headerrG   r   r   )r-  r.  r   r   r   r   r   r   s      r"   test_websocket_headersz$WebSocketTest.test_websocket_headers  sw      '2T5G5G5II!)7 3 	
 __..HXw/	
 	
 	
s   ?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   r`   ra   )r-  r.  r   r   r   r   rW   rX   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   rv   rw   )r   r   r  r   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)Nrr   rv   rw   )r   ry   r   r   )r!   r   r   r7  s       r"   test_client_close_reasonz&WebSocketTest.test_client_close_reason  sW     ??7++
y!!...ft$+s   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   r6   )r!   r   r6  s      r"   test_write_after_closez$WebSocketTest.test_write_after_close  s\     ???33OO%%c4 34W% 544s   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   r>  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   r>  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   r-  r.  r   r   r6   r   r   r!   r)  urlrW   r   r   s         r"   test_check_origin_valid_no_pathz-WebSocketTest.test_check_origin_valid_no_path   s     !!#&-2T9:$[g%FGG
W%__..HXw/
 
 
   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   rK  zhttp://127.0.0.1:%d/somethingr   r   rL  rM  s         r"   !test_check_origin_valid_with_pathz/WebSocketTest.test_check_origin_valid_with_path  s     !!#&-<tCD$[g%FGG
W%__..HXw/
 
 
rP  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   rK  z127.0.0.1:%dr     r   r  r   r   r   r   r  r   r!   r)  rN  rW   r  s        r"   %test_check_origin_invalid_partial_urlz3WebSocketTest.test_check_origin_invalid_partial_url  sv     !!#&-^d23y)R#KW$EFF ***C0 *)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   rK  zhttp://somewhereelse.comr   rT  rU  rV  s        r"   test_check_origin_invalidz'WebSocketTest.test_check_origin_invalid'  sv     !!#&- 78y)R#KW$EFF * 	**C0 *)s   /BA9
/B9B>Bc              #     K   | j                         }t               j                  d|      }t        d |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 # 1 sw Y   0xY ww)	N	localhostc              3   &   K   | ]	  }|d      yw)r   Nr2   ).0addrs     r"   	<genexpr>zEWebSocketTest.test_check_origin_invalid_subdomains.<locals>.<genexpr>=  s     484tAw8s   z"localhost does not resolve to ipv4zws://localhost:%d/echorK  zhttp://subtenant.localhostr   rT  )r   r
   resolvesetsocketAF_INETskipTestr  r   r   r   r   r  r   )r!   r)  addrinfofamiliesrN  rW   r  s          r"   $test_check_origin_invalid_subdomainsz2WebSocketTest.test_check_origin_invalid_subdomains5  s     !!#
 "++K>>4844>>)MM>?&- 9:y)R#KW$EFF * 	**C0 *)s   BCC/C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   r>  s      r"   test_subprotocolszWebSocketTest.test_subprotocolsL  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   r>  s      r"   test_subprotocols_not_offeredz+WebSocketTest.test_subprotocols_not_offeredU  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   rm   )r   r   r   r6   ra  r   r   r>  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   assertIsNoner>  s      r"   test_error_in_openz WebSocketTest.test_error_in_opene  sO     w 45'788B))C 6 	# 65   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   rp  r>  s      r"   test_error_in_async_openz&WebSocketTest.test_error_in_async_openl  sO     w 45'=>>B))C 6 	# 65rs  c              #   z   K   | j                  d      }|j                         }| j                  |d       y w)Nr   r   rB  r>  s      r"   test_nodelayzWebSocketTest.test_nodelays  s6     ??:..OO%%g&rD  )*r.   r/   r0   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r   r#  r*  r0  r2  r4  r8  r:  r<  r@  rC  rH  rO  rR  rW  rY  rg  rj  rl  rn  rr  ru  rw  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"   r=   z*NativeCoroutineOnMessageHandler.on_message  sa     ==1FGiio7# 	s   AA>A<,A>)r.   r/   r0   r#   r=   r   r   s   @r"   ry  ry  z  s    $r$   ry  c                   "    e Zd Zd Zed        Zy)WebSocketNativeCoroutineTestc                 &    t        dt        fg      S )N/native)r   ry  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  rF  rG  r   r>  s      r"   test_native_coroutinez2WebSocketNativeCoroutineTest.test_native_coroutine  sw     ??9--x((x((OO%%h'OO%%h'rI  N)r.   r/   r0   r   r   r  r2   r$   r"   r}  r}    s    K ( (r$   r}  c                       e Zd ZdZd Zd Zd Zdededdfd	Ze	d
e
j                  fd       Ze	d
e
j                  f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   r2   r'   s    r"   max_message_sizezECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_size  s    r$   c                 J    | j                  t        t        |                   y r   )r6   strlenr;   s     r"   r=   z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_message  s    ""3s7|#45r$   N)r.   r/   r0   propertyr  r=   r2   r$   r"   LimitedHandlerr    s     6r$   r  rr   r&   /limited)r   r   r4   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   r2   r'   s    r"   r  z3CompressionTestMixin.get_server_compression_options      r$   c                      y r   r2   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$   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)Nrr   r&      )r   r  ranger6   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AT\\*__..HXt||4  	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  r6   r   r   rq  r   s      r"   test_size_limitz$CompressionTestMixin.test_size_limit  s     ??D,O,O,Q # 
 
 	#**5) 	$**(#s   BB)r.   r/   r0   r  r   r  r  intr  r   typingAnyr  r  r2   r$   r"   r  r    sq    ,G
0$# $# $$ $ X X X $fjj $ $r$   r  c                   0    e Zd ZdZdej
                  fdZy)UncompressedTestMixinzESpecialization of CompressionTestMixin when we expect no compression.r!   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)r.   r/   r0   r1   r  r  r  r2   r$   r"   r  r    s    O@

 @r$   r  c                       e Zd Zy)NoCompressionTestN)r.   r/   r0   r2   r$   r"   r  r    s    r$   r  c                       e Zd Zd Zy)ServerOnlyCompressionTestc                     i S r   r2   r'   s    r"   r  z8ServerOnlyCompressionTest.get_server_compression_options      	r$   N)r.   r/   r0   r  r2   r$   r"   r  r        r$   r  c                       e Zd Zd Zy)ClientOnlyCompressionTestc                     i S r   r2   r'   s    r"   r  z8ClientOnlyCompressionTest.get_client_compression_options  r  r$   N)r.   r/   r0   r  r2   r$   r"   r  r    r  r$   r  c                       e Zd Zd Zd Zd Zy)DefaultCompressionTestc                     i S r   r2   r'   s    r"   r  z5DefaultCompressionTest.get_server_compression_options  r  r$   c                     i S r   r2   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)r.   r/   r0   r  r  r  r2   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)r.   r/   r0   r8   r  r  r  r  r2   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r.   r/   r0   r  r2   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  r2   r$   r"   r  r    s    3r$   r  c                   "    e Zd Zd Zed        Zy)ServerPeriodicPingTestc                 @     G d dt               }t        d|fg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)r.   r/   r0   r  r2   r$   r"   PingHandlerr  %      /r$   r  /r   )websocket_ping_intervalr   r   r!   r  s     r"   r   zServerPeriodicPingTest.get_app$  s&    	/. 	/ S+./NNr$   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_ping+  sD     ??3''qA__..HXz2 s   A	AN)r.   r/   r0   r   r   r  r2   r$   r"   r  r  #  s    O 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_ping7  r  r$   Nr.   r/   r0   r  r2   r$   r"   r  r  6  r  r$   r  r  r  r  s     r"   r   zClientPeriodicPingTest.get_app5  s$    	/. 	/ S+./00r$   c              #      K   | j                  dd      }t        d      D ]&  }|j                         }| j                  |d       ( |j	                          y w)Nr  r   )ping_intervalr  r  )r   r  r   r   ry   r  s       r"   test_client_pingz'ClientPeriodicPingTest.test_client_ping<  sS     ??3d?;;qA__..HXz2  	
s   AAN)r.   r/   r0   r   r   r  r2   r$   r"   r  r  4  s    1  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
  )r6   r7   r8   r  s     r"   r  z3ManualPingTest.get_app.<locals>.PingHandler.on_pingI  s    ""4
40G"Hr$   Nr  r2   r$   r"   r  r  H  s    Ir$   r  r  r  r  s     r"   r   zManualPingTest.get_appG  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_pingN  s     ??3''*bggy9
__&&x(
 __&&/s   B B"N)r.   r/   r0   r   r   r  r2   r$   r"   r  r  F  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   r4   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   r6   r   r   r  r+   r,   )r!   r   r6  r  s       r"   test_large_messagez%MaxMessageSizeTest.test_large_messageb  s     ??3'' 
__&&s# 	s#__&&dD!-*;<s   B<B>N)r.   r/   r0   r   r   r  r2   r$   r"   r  r  ^  s    R = =r$   r  )Pr9   r-  rK   rb  	tracebackr  unittesttornado.concurrentr   tornador   tornado.httpclientr   r   tornado.locksr   tornado.logr   r	   tornado.netutilr
   tornado.simple_httpclientr   tornado.templater   tornado.testingr   r   r   r   tornado.webr   r   tornado.websockettornado.utilr   ImportError	print_excr   r   r   r   r   r   r4   r@   rE   r^   rk   rp   rt   r|   r   r   r   r   r   r   r   r   r   r   ry  r}  objectr  r  r  r  r  r  r  TestCaser  skipIfr  r  r  r  r  r2   r$   r"   <module>r     s          %  5  ( $ ; ' T T 3	
3  
O+ O(& 2 
C( C,&, &. 
n 
$- $$. $ *  
$ 4 $P/ P
I- I&!/ !$ -  
 2  $) $- &L') L'^$&: $(#8 ( @$6 @$F@0 @	-/D 	
 57L 
 57L 
313H 3
 
.2.0A0A 2
 T!#HI3.0A0A 3 J3
32 3"2 $0* 00=. =O  

 I	
"  Hs   &
H, =I ,III