o
    hr                     @   s~  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dl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  zd dl!Z	d dl"m#Z# W n e$y|   e%   w d dl!m&Z&m'Z'm(Z(m)Z) zd dl	m*Z* W n e$y   dZ*Y nw G dd de&Z+G dd de+Z,G dd de+Z-G dd de+Z.G dd de+Z/G dd de Z0G dd de Z1G dd de+Z2G dd  d e+Z3G d!d" d"e+Z4G d#d$ d$e+Z5G d%d& d&e+Z6G d'd( d(e+Z7G d)d* d*e+Z8G d+d, d,e+Z9G d-d. d.e+Z:G d/d0 d0e+Z;G d1d2 d2eZ<G d3d4 d4e<Z=G d5d6 d6e+Z>G d7d8 d8e<Z?G d9d: d:e@ZAG d;d< d<eAZBG d=d> d>eBe<ZCG d?d@ d@eBe<ZDG dAdB dBeBe<ZEG dCdD dDeAe<ZFG dEdF dFe@ZGG dGdH dHeGejHZIeJe*du dIG dJdK dKeGejHZKG dLdM dMe<ZLG dNdO dOe<ZMG dPdQ dQe<ZNG dRdS dSe<ZOdS )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                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
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                 C   s   || _ || _d S N)close_futurecompression_options)selfr   r    r   O/var/www/vscode/kcb/lib/python3.10/site-packages/tornado/test/websocket_test.py
initialize4   s   
zTestWebSocketHandler.initializec                 C   s   | j S r   r   r   r   r   r    get_compression_options8      z,TestWebSocketHandler.get_compression_optionsc                 C   s&   | j d ur| j | j| jf d S d S r   )r   
set_result
close_codeclose_reasonr#   r   r   r    on_close;   s   
zTestWebSocketHandler.on_close)NN)__name__
__module____qualname____doc__r!   r$   r)   r   r   r   r    r   ,   s
    
r   c                   @   s   e Zd Zejdd ZdS )EchoHandlerc                 c   sF    z|  |t|tV  W d S  tjy   Y d S  ty"   Y d S w r   )write_message
isinstancebytesasyncioCancelledErrorr   r   messager   r   r    
on_messageA   s   zEchoHandler.on_messageN)r*   r+   r,   r   	coroutiner6   r   r   r   r    r.   @   s    r.   c                   @      e Zd Zdd ZdS )ErrorInOnMessageHandlerc                 C   s   dd  d S )N   r   r   r4   r   r   r    r6   L      z"ErrorInOnMessageHandler.on_messageNr*   r+   r,   r6   r   r   r   r    r9   K       r9   c                   @   r8   )HeaderHandlerc              	   C   s   t | jdt | jdt | jddt | jddt | jd| j| jg}|D ]}z|  t	d t
y:   Y q(w | | jjdd d S )	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methodr   r   r    openQ   s    	zHeaderHandler.openNr*   r+   r,   rS   r   r   r   r    r>   P   r=   r>   c                   @   s   e Zd Zdd Zdd ZdS )HeaderEchoHandlerc                 C   s   |  dd d S )NX-Extra-Response-HeaderExtra-Response-Value)rG   r#   r   r   r    set_default_headersg   s   z%HeaderEchoHandler.set_default_headersc                 C   s4   | j j D ]\}}| dr| || qd S )Nzx-test)rN   rO   get_alllower
startswithrG   )r   kvr   r   r    preparej   s
   zHeaderEchoHandler.prepareN)r*   r+   r,   rX   r^   r   r   r   r    rU   f   s    rU   c                   @   r8   )NonWebSocketHandlerc                 C      |  d d S )Nok)rE   r#   r   r   r    rP   q      zNonWebSocketHandler.getNr*   r+   r,   rP   r   r   r   r    r_   p   r=   r_   c                   @   r8   )RedirectHandlerc                 C   r`   )N/echo)rF   r#   r   r   r    rP   v   rb   zRedirectHandler.getNrc   r   r   r   r    rd   u   r=   rd   c                   @   r8   )CloseReasonHandlerc                 C   s   d| _ | dd d S )NF  goodbye)on_close_calledcloser#   r   r   r    rS   {   s   zCloseReasonHandler.openNrT   r   r   r   r    rf   z   r=   rf   c                   @   s"   e Zd Zejdd Zdd ZdS )AsyncPrepareHandlerc                 c   s    t jV  d S r   )r   momentr#   r   r   r    r^      s   zAsyncPrepareHandler.preparec                 C      |  | d S r   r/   r4   r   r   r    r6      rb   zAsyncPrepareHandler.on_messageN)r*   r+   r,   r   r7   r^   r6   r   r   r   r    rk      s    
rk   c                   @   r8   )PathArgsHandlerc                 C   rm   r   rn   )r   argr   r   r    rS      rb   zPathArgsHandler.openNrT   r   r   r   r    ro      r=   ro   c                       s*   e Zd Z fddZejdd Z  ZS )CoroutineOnMessageHandlerc                       t  jdi | d| _d S Nr   r   superr!   sleepingr   kwargs	__class__r   r    r!         
z$CoroutineOnMessageHandler.initializec                 c   sL    | j dkr| d |  j d7  _ tdV  |  j d8  _ | | d S Nr   z%another coroutine is already sleepingr:   {Gz?rv   r/   r   sleepr4   r   r   r    r6      s   

z$CoroutineOnMessageHandler.on_message)r*   r+   r,   r!   r   r7   r6   __classcell__r   r   ry   r    rq      s    rq   c                   @   r8   )RenderMessageHandlerc                 C   s   |  | jd|d d S )Nmessage.html)r5   )r/   render_stringr4   r   r   r    r6         zRenderMessageHandler.on_messageNr<   r   r   r   r    r      r=   r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )SubprotocolHandlerc                    rr   NFr   )ru   r!   select_subprotocol_calledrw   ry   r   r    r!      r{   zSubprotocolHandler.initializec                 C   s$   | j rtdd| _ d|v rdS d S )Nzselect_subprotocol called twiceT	goodproto)r   rL   )r   subprotocolsr   r   r    select_subprotocol   s   z%SubprotocolHandler.select_subprotocolc                 C   s"   | j std| d| j  d S )Nzselect_subprotocol not calledzsubprotocol=%s)r   rL   r/   selected_subprotocolr#   r   r   r    rS      s   zSubprotocolHandler.open)r*   r+   r,   r!   r   rS   r   r   r   ry   r    r      s    r   c                       s2   e Zd Z fddZejdd Zdd Z  ZS )OpenCoroutineHandlerc                    s"   t  jdi | || _d| _d S r   )ru   r!   testopen_finished)r   r   rx   ry   r   r    r!      s   
zOpenCoroutineHandler.initializec                 c   s&    | j j V  tdV  d| _d S )Nr}   T)r   message_sentwaitr   r   r   r#   r   r   r    rS      s   
zOpenCoroutineHandler.openc                 C   s   | j std| d d S )Nz&on_message called before open finishedra   )r   rL   r/   r4   r   r   r    r6      s   zOpenCoroutineHandler.on_message)	r*   r+   r,   r!   r   r7   rS   r6   r   r   r   ry   r    r      s
    
r   c                   @   r8   )ErrorInOpenHandlerc                 C   s   t d)Nboom)rL   r#   r   r   r    rS      s   zErrorInOpenHandler.openNrT   r   r   r   r    r      r=   r   c                   @   r8   )ErrorInAsyncOpenHandlerc                    s   t dI d H  td)Nr   r   )r2   r   rL   r#   r   r   r    rS      s   zErrorInAsyncOpenHandler.openNrT   r   r   r   r    r      r=   r   c                   @   r8   )NoDelayHandlerc                 C   s   |  d | d d S )NThello)set_nodelayr/   r#   r   r   r    rS         
zNoDelayHandler.openNrT   r   r   r   r    r      r=   r   c                       s6   e Zd Z fddZ fddZejdd Z  ZS )WebSocketBaseTestCasec                    s   t    g | _d S r   )ru   setUpconns_to_closer#   ry   r   r    r      s   

zWebSocketBaseTestCase.setUpc                    s"   | j D ]}|  qt   d S r   )r   rj   ru   tearDown)r   connry   r   r    r      s   

zWebSocketBaseTestCase.tearDownc                 k   s6    t d|  |f fi |V }| j| t|)Nzws://127.0.0.1:%d%s)r   get_http_portr   appendr   Return)r   pathrx   wsr   r   r    
ws_connect   s   
z WebSocketBaseTestCase.ws_connect)	r*   r+   r,   r   r   r   r7   r   r   r   r   ry   r    r      s
    r   c                       s  e Zd Zdd Zdd Z fddZdd Zd	d
 Zdd Ze	dd Z
dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd  Ze	d!d" Ze	d#d$ Ze	d%d& Ze	d'd( Ze	d)d* Ze	d+d, Ze	d-d. Ze	d/d0 Ze	d1d2 Ze	d3d4 Ze	d5d6 Ze	d7d8 Ze	d9d: Z e	d;d< Z!e	d=d> Z"e	d?d@ Z#e	dAdB Z$e	dCdD Z%e	dEdF Z&e	dGdH Z'e	dIdJ Z(  Z)S )KWebSocketTestc                 C   s   t  | _tdtt| jdfdtfdtfdtt| jdfdtt| jdfdt	t| jdfdt
t| jdfd	tt| jdfd
tt| jdfdtt| jdfdtt| jdfdtt| jdfdtt| j| dfdtfdtfdtfgtddidS )Nre   )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   r.   dictr_   rd   r>   rU   rf   r9   rk   ro   rq   r   r   r   r   r   r   r   r#   r   r   r    get_app   sZ   







2zWebSocketTest.get_appc                 C   s   t  S r   r
   r#   r   r   r    get_http_client$  s   zWebSocketTest.get_http_clientc                    s   t    tj  d S r   )ru   r   r   _template_loadersclearr#   ry   r   r    r   (  r   zWebSocketTest.tearDownc                 C   s   |  d}| |jd d S )Nre     fetchassertEqualcoder   responser   r   r    test_http_request,  s   
zWebSocketTest.test_http_requestc                 C   (   | j dddddd}| |jd d S )Nre   Upgrade	WebSocket13
Connectionr   zSec-WebSocket-VersionrO   r   r   r   r   r   r    test_missing_websocket_key1     z(WebSocketTest.test_missing_websocket_keyc                 C   r   )Nre   r   r   12r   r   i  r   r   r   r   r    test_bad_websocket_version<  r   z(WebSocketTest.test_bad_websocket_versionc                 c   s4    |  dV }|dV  | V }| |d d S )Nre   r   r   r/   read_messager   r   r   r   r   r   r    test_websocket_genG  s
   
z WebSocketTest.test_websocket_genc                    sx   t d    jd    }|d | j    } |d  j	 fdd |
     d S )Nws://127.0.0.1:%d/echo)callbackr   c                    s      S r   )stop)fr#   r   r    <lambda>W  s    z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>)r   r   r   r   resultr/   r   r   r   add_done_callbackrj   r   r   r#   r    test_websocket_callbacksN  s   
z&WebSocketTest.test_websocket_callbacksc                 c   s6    |  dV }|jddd | V }| |d d S )Nre   s   hello Tbinaryr   r   r   r   r    test_binary_message[  
   
z!WebSocketTest.test_binary_messagec                 c   2    |  dV }|d | V }| |d d S Nre   u   hello ér   r   r   r   r    test_unicode_messageb  
   

z"WebSocketTest.test_unicode_messagec                 c   sP    |  dV }|  | t |d W d    d S 1 s!w   Y  d S r   )r   rj   assertRaisesr   r/   r   r   r   r   r    )test_error_in_closed_client_write_messagei  s   "z7WebSocketTest.test_error_in_closed_client_write_messagec                 c   s2    |  dV }|d | V }| |d d S )Nr   r   z<b>hello</b>r   r   r   r   r    test_render_messagep  r   z!WebSocketTest.test_render_messagec                 c   s\    |  dV }|d ttd | V }W d    n1 s!w   Y  | |d  d S )Nr   r   Uncaught exception)r   r/   r   r   r   assertIsr   r   r   r    test_error_in_on_messagew  s   
z&WebSocketTest.test_error_in_on_messagec                 c   sL    |  t}| dV  W d    n1 sw   Y  | |jjd d S )Nz	/notfoundi  )r   r   r   r   	exceptionr   )r   cmr   r   r    test_websocket_http_fail  s
   z&WebSocketTest.test_websocket_http_failc                 c   >    |  t | dV  W d    d S 1 sw   Y  d S )Nr   )r   r   r   r#   r   r   r    test_websocket_http_success     "z)WebSocketTest.test_websocket_http_successc                 c   r   )Nr   )r   r   r   r#   r   r   r    test_websocket_http_redirect  r   z*WebSocketTest.test_websocket_http_redirectc              	   c   s    t  \}}|  | t1 ttddd td| ddV  W d    n1 s+w   Y  W d    d S W d    d S 1 sCw   Y  d S )Nz.*F)requiredzws://127.0.0.1:%d/i  )connect_timeout)r   rj   r   IOErrorr   r   r   )r   sockportr   r   r    test_websocket_network_fail  s   

"z)WebSocketTest.test_websocket_network_failc                 c   s^    t td|   V }|d |d |j  W d    d S 1 s(w   Y  d S )Nr   r   world)
contextlibclosingr   r   r/   streamrj   r   r   r   r    "test_websocket_close_buffered_data  s   

"z0WebSocketTest.test_websocket_close_buffered_datac                 c   sb    t ttd|   ddidV }| V }| |d W d    d S 1 s*w   Y  d S )Nzws://127.0.0.1:%d/headerr?   r   r   )r   r   r   r   r   r   r   r   r   r   r    test_websocket_headers  s   
	
"z$WebSocketTest.test_websocket_headersc                 c   st    t ttd|   ddidV }| |jdd | |jdd W d    d S 1 s3w   Y  d S )Nzws://127.0.0.1:%d/header_echozX-Test-Hellor   r   rV   rW   )r   r   r   r   r   r   rO   rP   r   r   r   r    test_websocket_header_echo  s   
	"z(WebSocketTest.test_websocket_header_echoc                 c   s\    |  dV }| V }| |d  | |jd | |jd | jV \}}| |d d S )Nr   rg   rh   )r   r   r   r   r'   r(   r   )r   r   msgr   reasonr   r   r    test_server_close_reason  s   
z&WebSocketTest.test_server_close_reasonc                 c   sB    |  dV }|dd | jV \}}| |d | |d d S )Nre   rg   rh   )r   rj   r   r   )r   r   r   r   r   r   r    test_client_close_reason  s   z&WebSocketTest.test_client_close_reasonc                 c   s^    |  dV }| V }| |d  | t |d W d    d S 1 s(w   Y  d S )Nr   r   )r   r   r   r   r   r/   )r   r   r   r   r   r    test_write_after_close  s   
"z$WebSocketTest.test_write_after_closec                 c   r   )Nr   r   r   r   r   resr   r   r    test_async_prepare  s
   

z WebSocketTest.test_async_preparec                 c   (    |  dV }| V }| |d d S )Nz/path_args/hellor   r   r   r   r   r   r   r    test_path_args     
zWebSocketTest.test_path_argsc                 c   V    |  dV }|dV  |dV  | V }| |d | V }| |d d S )Nr   hello1hello2r   r   r   r   r    test_coroutine     

zWebSocketTest.test_coroutinec                 c   |    |   }d| }dd| i}ttt||dV }|d | V }| |d W d    d S 1 s7w   Y  d S )Nr   Originzhttp://127.0.0.1:%dr   r   r   r   r   r   r   r/   r   r   r   r   urlrO   r   r   r   r   r    test_check_origin_valid_no_path      

"z-WebSocketTest.test_check_origin_valid_no_pathc                 c   r	  )Nr   r
  zhttp://127.0.0.1:%d/somethingr   r   r  r  r   r   r    !test_check_origin_valid_with_path  r  z/WebSocketTest.test_check_origin_valid_with_pathc                 c   sn    |   }d| }dd| i}| t}tt||dV  W d    n1 s(w   Y  | |jjd d S )Nr   r
  z127.0.0.1:%dr     r   r   r   r   r   r   r   r   r   r   r  rO   r   r   r   r    %test_check_origin_invalid_partial_url  s   z3WebSocketTest.test_check_origin_invalid_partial_urlc                 c   sj    |   }d| }ddi}| t}tt||dV  W d    n1 s&w   Y  | |jjd d S )Nr   r
  zhttp://somewhereelse.comr   r  r  r  r   r   r    test_check_origin_invalid'  s   z'WebSocketTest.test_check_origin_invalidc                 c   s    |   }t d|V }tdd |D }tj|vr"| d d S d| }ddi}| t}t	t
||dV  W d    n1 sCw   Y  | |jjd	 d S )
N	localhostc                 s   s    | ]}|d  V  qdS )r   Nr   ).0addrr   r   r    	<genexpr>=  s    zEWebSocketTest.test_check_origin_invalid_subdomains.<locals>.<genexpr>z"localhost does not resolve to ipv4zws://localhost:%d/echor
  zhttp://subtenant.localhostr   r  )r   r	   resolvesetsocketAF_INETskipTestr   r   r   r   r   r   r   )r   r   addrinfofamiliesr  rO   r   r   r   r    $test_check_origin_invalid_subdomains5  s   

z2WebSocketTest.test_check_origin_invalid_subdomainsc                 c   s>    | j dddgdV }| |jd | V }| |d d S )Nr   badprotor   )r   zsubprotocol=goodproto)r   r   r   r   r   r   r   r    test_subprotocolsL  s   
zWebSocketTest.test_subprotocolsc                 c   s6    |  dV }| |jd  | V }| |d d S )Nr   zsubprotocol=None)r   r   r   r   r   r   r   r   r    test_subprotocols_not_offeredU  r   z+WebSocketTest.test_subprotocols_not_offeredc                 c   sF    t  | _| dV }|dV  | j  | V }| |d d S )Nr   r   ra   )r   r   r   r/   r  r   r   r   r   r   r    test_open_coroutine\  s   

z!WebSocketTest.test_open_coroutinec                 c   P    t td | dV }| V }W d    n1 sw   Y  | | d S )Nr   r   r   r   r   r   assertIsNoner   r   r   r    test_error_in_opene     z WebSocketTest.test_error_in_openc                 c   r&  )Nr   r   r'  r   r   r   r    test_error_in_async_openl  r*  z&WebSocketTest.test_error_in_async_openc                 c   r   )Nr   r   r  r   r   r   r    test_nodelays  r  zWebSocketTest.test_nodelay)*r*   r+   r,   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r!  r#  r$  r%  r)  r+  r,  r   r   r   ry   r    r      s    8









	
	



















r   c                       s$   e Zd Z fddZdd Z  ZS )NativeCoroutineOnMessageHandlerc                    rr   rs   rt   rw   ry   r   r    r!   {  r{   z*NativeCoroutineOnMessageHandler.initializec                    sP   | j dkr| d |  j d7  _ tdI d H  |  j d8  _ | | d S r|   r~   r4   r   r   r    r6     s   

z*NativeCoroutineOnMessageHandler.on_message)r*   r+   r,   r!   r6   r   r   r   ry   r    r-  z  s    r-  c                   @       e Zd Zdd Zedd ZdS )WebSocketNativeCoroutineTestc                 C   s   t dtfgS )N/native)r   r-  r#   r   r   r    r     rb   z$WebSocketNativeCoroutineTest.get_appc                 c   r  )Nr0  r  r  r   r   r   r   r    test_native_coroutine  r  z2WebSocketNativeCoroutineTest.test_native_coroutineN)r*   r+   r,   r   r   r1  r   r   r   r    r/        r/  c                   @   sf   e Zd ZdZdd Zdd Zdd Zded	ed
dfddZe	de
jfddZe	de
jfddZdS )CompressionTestMixinzHello world. Testing 123 123c                 C   s<   G dd dt }tdtt|  dfd|t|  dfgS )Nc                   @   s    e Zd Zedd Zdd ZdS )z4CompressionTestMixin.get_app.<locals>.LimitedHandlerc                 S   s   dS )N   r   r#   r   r   r    max_message_size  s   zECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_sizec                 S   s   |  tt| d S r   )r/   strlenr4   r   r   r    r6     s   z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r*   r+   r,   propertyr5  r6   r   r   r   r    LimitedHandler  s    
r9  re   r"   /limited)r   r   r.   r   get_server_compression_options)r   r9  r   r   r    r     s   zCompressionTestMixin.get_appc                 C      d S r   r   r#   r   r   r    r;       z3CompressionTestMixin.get_server_compression_optionsc                 C   r<  r   r   r#   r   r   r    get_client_compression_options  r=  z3CompressionTestMixin.get_client_compression_optionsbytes_in	bytes_outreturnNc                 C      t  r   NotImplementedErrorr   r?  r@  r   r   r    verify_wire_bytes  r%   z&CompressionTestMixin.verify_wire_bytesr   c                 c   s    | j d|  dV }tdD ]}|| j | V }| || j q| |jjt	| jd  | |jj
t	| jd  | |jj|jj d S )Nre   r"      )r   r>  ranger/   MESSAGEr   r   protocol_message_bytes_outr7  _message_bytes_inrF  _wire_bytes_in_wire_bytes_outr   r   ir   r   r   r    test_message_sizes  s   
z'CompressionTestMixin.test_message_sizesc                 c   sX    | j d|  dV }|d | V }| |d |d | V }| | d S )Nr:  r"   ڀaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa128   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   r>  r/   r   r   r(  r   r   r   r    test_size_limit  s   



z$CompressionTestMixin.test_size_limit)r*   r+   r,   rI  r   r;  r>  intrF  r   typingAnyrQ  rU  r   r   r   r    r3    s    r3  c                   @   s    e Zd ZdZdejfddZdS )UncompressedTestMixinzESpecialization of CompressionTestMixin when we expect no compression.r   c                 C   s8   |  |dt| jd   |  |dt| jd   d S )NrG        )r   r7  rI  rE  r   r   r    rF    s   z'UncompressedTestMixin.verify_wire_bytesN)r*   r+   r,   r-   rW  rX  rF  r   r   r   r    rY    s    rY  c                   @   s   e Zd ZdS )NoCompressionTestN)r*   r+   r,   r   r   r   r    r\    s    r\  c                   @   r8   )ServerOnlyCompressionTestc                 C      i S r   r   r#   r   r   r    r;    r=  z8ServerOnlyCompressionTest.get_server_compression_optionsN)r*   r+   r,   r;  r   r   r   r    r]    r=   r]  c                   @   r8   )ClientOnlyCompressionTestc                 C   r^  r   r   r#   r   r   r    r>    r=  z8ClientOnlyCompressionTest.get_client_compression_optionsN)r*   r+   r,   r>  r   r   r   r    r_    r=   r_  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DefaultCompressionTestc                 C   r^  r   r   r#   r   r   r    r;    r=  z5DefaultCompressionTest.get_server_compression_optionsc                 C   r^  r   r   r#   r   r   r    r>    r=  z5DefaultCompressionTest.get_client_compression_optionsc                 C   sH   |  |dt| jd   |  |dt| jd   | ||d  d S )NrG  rZ  r[     )
assertLessr7  rI  r   rE  r   r   r    rF    s   z(DefaultCompressionTest.verify_wire_bytesN)r*   r+   r,   r;  r>  rF  r   r   r   r    r`    s    r`  c                   @   s2   e Zd ZdededefddZdejfddZd	S )
MaskFunctionMixinmaskdatarA  c                 C   rB  r   rC  r   rd  re  r   r   r    rd    r%   zMaskFunctionMixin.maskr   c                 C   s|   |  | ddd |  | ddd |  | ddd |  | ddd	 |  | d
dd |  | ddd d S )Ns   abcd       b   s   54321s   TVPVPs   ZXCVs   98765432s   c`t`olpds    s   s   s   s    s   )r   rd  r#   r   r   r    	test_mask  s   

zMaskFunctionMixin.test_maskN)r*   r+   r,   r1   rd  rW  rX  rj  r   r   r   r    rc    s    rc  c                   @   r8   )PythonMaskFunctionTestc                 C   s
   t ||S r   r   rf  r   r   r    rd    s   
zPythonMaskFunctionTest.maskNr*   r+   r,   rd  r   r   r   r    rk    r=   rk  z#tornado.speedups module not presentc                   @   r8   )CythonMaskFunctionTestc                 C   s   t ||S r   )r   websocket_maskrf  r   r   r    rd    r;   zCythonMaskFunctionTest.maskNrl  r   r   r   r    rm    s    rm  c                   @   r.  )ServerPeriodicPingTestc                 C   s"   G dd dt }td|fgddS )Nc                   @   r8   )z3ServerPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   r`   )Ngot pongrn   r   re  r   r   r    on_pong&  rb   z;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pongN)r*   r+   r,   rr  r   r   r   r    PingHandler%  r=   rs  /r}   )websocket_ping_intervalr   r   r   rs  r   r   r    r   $  s   zServerPeriodicPingTest.get_appc                 c   s6    |  dV }tdD ]}| V }| |d qd S )Nrt  rG  rp  )r   rH  r   r   rO  r   r   r    test_server_ping+  s   
z'ServerPeriodicPingTest.test_server_pingN)r*   r+   r,   r   r   rx  r   r   r   r    ro  #      ro  c                   @   r.  )ClientPeriodicPingTestc                 C      G dd dt }td|fgS )Nc                   @   r8   )z3ClientPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   r`   )Ngot pingrn   rq  r   r   r    on_ping7  rb   z;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingNr*   r+   r,   r}  r   r   r   r    rs  6  r=   rs  rt  rv  rw  r   r   r    r   5     zClientPeriodicPingTest.get_appc                 c   sB    | j dddV }tdD ]}| V }| |d q|  d S )Nrt  r}   )ping_intervalrG  r|  )r   rH  r   r   rj   rO  r   r   r    test_client_ping<  s   
z'ClientPeriodicPingTest.test_client_pingN)r*   r+   r,   r   r   r  r   r   r   r    rz  4  ry  rz  c                   @   r.  )ManualPingTestc                 C   r{  )Nc                   @   r8   )z+ManualPingTest.get_app.<locals>.PingHandlerc                 S   s   | j |t|td d S )Nr   )r/   r0   r1   rq  r   r   r    r}  I  r   z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNr~  r   r   r   r    rs  H  r=   rs  rt  rv  rw  r   r   r    r   G  r  zManualPingTest.get_appc                 c   sb    |  dV }| t|jd |d | V }| |d |d | V }| |d d S )Nrt  ~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   r   
ValueErrorpingr   r   )r   r   respr   r   r    test_manual_pingN  s   



zManualPingTest.test_manual_pingN)r*   r+   r,   r   r   r  r   r   r   r    r  F  ry  r  c                   @   r.  )MaxMessageSizeTestc                 C   s   t dtfgddS )Nrt  r4  )websocket_max_message_size)r   r.   r#   r   r   r    r   _  s   zMaxMessageSizeTest.get_appc                 c   sv    |  dV }d}|| | V }| || ||d  | V }| |d  | |jd | |jd d S )Nrt     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r/   r   r   r   r'   r(   )r   r   r   r  r   r   r    test_large_messageb  s   


z%MaxMessageSizeTest.test_large_messageN)r*   r+   r,   r   r   r  r   r   r   r    r  ^  r2  r  )Pr2   r   rC   r  	tracebackrW  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   r.   r9   r>   rU   r_   rd   rf   rk   ro   rq   r   r   r   r   r   r   r   r   r-  r/  objectr3  rY  r\  r]  r_  r`  rc  TestCaserk  skipIfrm  ro  rz  r  r  r   r   r   r    <module>   s    
	   C	