o
    )Zhr                     @   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   R/var/www/html/lang_env/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   Z
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asyncioZCancelledErrorr   r   messager   r   r    
on_messageA   s   zEchoHandler.on_messageN)r)   r*   r+   r   	coroutiner4   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   r2   r   r   r    r4   L      z"ErrorInOnMessageHandler.on_messageNr)   r*   r+   r4   r   r   r   r    r7   K       r7   c                   @   r6   )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 Z	ChocolateZChipi  zdid not get expected exception)	functoolspartialwriteredirect
set_header
set_cookieZ
set_statusflushfinish	ExceptionRuntimeErrorr.   requestheadersget)r   Zmethods_to_testmethodr   r   r    openQ   s    	zHeaderHandler.openNr)   r*   r+   rM   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)rC   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)rI   rJ   get_alllower
startswithrC   )r   kvr   r   r    preparej   s
   zHeaderEchoHandler.prepareN)r)   r*   r+   rR   rX   r   r   r   r    rO   f   s    rO   c                   @   r6   )NonWebSocketHandlerc                 C      |  d d S )Nok)rA   r#   r   r   r    rK   q      zNonWebSocketHandler.getNr)   r*   r+   rK   r   r   r   r    rY   p   r;   rY   c                   @   r6   )RedirectHandlerc                 C   rZ   )N/echo)rB   r#   r   r   r    rK   v   r\   zRedirectHandler.getNr]   r   r   r   r    r^   u   r;   r^   c                   @   r6   )CloseReasonHandlerc                 C   s   d| _ | dd d S )NF  goodbye)Zon_close_calledcloser#   r   r   r    rM   {   s   zCloseReasonHandler.openNrN   r   r   r   r    r`   z   r;   r`   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   Zmomentr#   r   r   r    rX      s   zAsyncPrepareHandler.preparec                 C      |  | d S r   r.   r2   r   r   r    r4      r\   zAsyncPrepareHandler.on_messageN)r)   r*   r+   r   r5   rX   r4   r   r   r   r    rd      s    
rd   c                   @   r6   )PathArgsHandlerc                 C   re   r   rf   )r   argr   r   r    rM      r\   zPathArgsHandler.openNrN   r   r   r   r    rg      r;   rg   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 sleepingr8   {Gz?rn   r.   r   sleepr2   r   r   r    r4      s   

z$CoroutineOnMessageHandler.on_message)r)   r*   r+   r!   r   r5   r4   __classcell__r   r   rq   r    ri      s    ri   c                   @   r6   )RenderMessageHandlerc                 C   s   |  | jd|d d S )Nmessage.html)r3   )r.   Zrender_stringr2   r   r   r    r4         zRenderMessageHandler.on_messageNr:   r   r   r   r    ry      r;   ry   c                       s,   e Zd Z fddZdd Zdd Z  ZS )SubprotocolHandlerc                    rj   NFr   )rm   r!   select_subprotocol_calledro   rq   r   r    r!      rs   zSubprotocolHandler.initializec                 C   s$   | j rtdd| _ d|v rdS d S )Nzselect_subprotocol called twiceT	goodproto)r~   rG   )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~   rG   r.   selected_subprotocolr#   r   r   r    rM      s   zSubprotocolHandler.open)r)   r*   r+   r!   r   rM   rx   r   r   rq   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}   )rm   r!   testopen_finished)r   r   rp   rq   r   r    r!      s   
zOpenCoroutineHandler.initializec                 c   s&    | j j V  tdV  d| _d S )Nru   T)r   message_sentwaitr   rw   r   r#   r   r   r    rM      s   
zOpenCoroutineHandler.openc                 C   s   | j std| d d S )Nz&on_message called before open finishedr[   )r   rG   r.   r2   r   r   r    r4      s   zOpenCoroutineHandler.on_message)	r)   r*   r+   r!   r   r5   rM   r4   rx   r   r   rq   r    r      s
    
r   c                   @   r6   )ErrorInOpenHandlerc                 C   s   t d)Nboom)rG   r#   r   r   r    rM      s   zErrorInOpenHandler.openNrN   r   r   r   r    r      r;   r   c                   @   r6   )ErrorInAsyncOpenHandlerc                    s   t dI d H  td)Nr   r   )r1   rw   rG   r#   r   r   r    rM      s   zErrorInAsyncOpenHandler.openNrN   r   r   r   r    r      r;   r   c                   @   r6   )NoDelayHandlerc                 C   s   |  d | d d S )NThello)Zset_nodelayr.   r#   r   r   r    rM         
zNoDelayHandler.openNrN   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   )rm   setUpconns_to_closer#   rq   r   r    r      s   

zWebSocketBaseTestCase.setUpc                    s"   | j D ]}|  qt   d S r   )r   rc   rm   tearDown)r   connrq   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   pathrp   wsr   r   r    
ws_connect   s   
z WebSocketBaseTestCase.ws_connect)	r)   r*   r+   r   r   r   r5   r   rx   r   r   rq   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 )Nr_   )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/nodelayrz   z<b>{{ message }}</b>)Ztemplate_loader)r   r   r   r-   dictrY   r^   r<   rO   r`   r7   rd   rg   ri   ry   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   )rm   r   r   Z_template_loadersclearr#   rq   r   r    r   (  r   zWebSocketTest.tearDownc                 C   s   |  d}| |jd d S )Nr_     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 )Nr_   Upgrade	WebSocketZ13
Connectionr   zSec-WebSocket-VersionrJ   r   r   r   r   r   r    test_missing_websocket_key1     z(WebSocketTest.test_missing_websocket_keyc                 C   r   )Nr_   r   r   Z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 )Nr_   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   Zadd_done_callbackrc   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 )Nr_   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 Nr_   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   rc   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   rc   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   Zworld)
contextlibclosingr   r   r.   streamrc   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   rP   rQ   )r   r   r   r   r   r   rJ   rK   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   ra   rb   )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 )Nr_   ra   rb   )r   rc   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   urlrJ   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   rJ   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_INETZskipTestr   r   r   r   r   r   r   )r   r   ZaddrinfoZfamiliesr   rJ   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   Z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   r[   )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  rx   r   r   rq   r    r      s    8









	
	



















r   c                       s$   e Zd Z fddZdd Z  ZS )NativeCoroutineOnMessageHandlerc                    rj   rk   rl   ro   rq   r   r    r!   {  rs   z*NativeCoroutineOnMessageHandler.initializec                    sP   | j dkr| d |  j d7  _ tdI d H  |  j d8  _ | | d S rt   rv   r2   r   r   r    r4     s   

z*NativeCoroutineOnMessageHandler.on_message)r)   r*   r+   r!   r4   rx   r   r   rq   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     r\   z$WebSocketNativeCoroutineTest.get_appc                 c   r   )Nr  r   r   r   r   r   r   r    test_native_coroutine  r   z2WebSocketNativeCoroutineTest.test_native_coroutineN)r)   r*   r+   r   r   r  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lenr2   r   r   r    r4     s   z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r)   r*   r+   propertyr!  r4   r   r   r   r    LimitedHandler  s    
r%  r_   r"   /limited)r   r   r-   r   get_server_compression_options)r   r%  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 )Nr_   r"      )r   r*  ranger.   MESSAGEr   r   protocolZ_message_bytes_outr#  Z_message_bytes_inr2  Z_wire_bytes_inZ_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"   ZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ128A   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   r*  r.   r   r   r  r   r   r   r    test_size_limit  s   



z$CompressionTestMixin.test_size_limit)r)   r*   r+   r5  r   r'  r*  intr2  r   typingAnyr9  r:  r   r   r   r    r    s    r  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 )Nr3        )r   r#  r5  r1  r   r   r    r2    s   z'UncompressedTestMixin.verify_wire_bytesN)r)   r*   r+   r,   r<  r=  r2  r   r   r   r    r>    s    r>  c                   @   s   e Zd ZdS )NoCompressionTestN)r)   r*   r+   r   r   r   r    rA    s    rA  c                   @   r6   )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    rB    r;   rB  c                   @   r6   )ClientOnlyCompressionTestc                 C   rC  r   r   r#   r   r   r    r*    r)  z8ClientOnlyCompressionTest.get_client_compression_optionsN)r)   r*   r+   r*  r   r   r   r    rD    r;   rD  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DefaultCompressionTestc                 C   rC  r   r   r#   r   r   r    r'    r)  z5DefaultCompressionTest.get_server_compression_optionsc                 C   rC  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 )Nr3  r?  r@     )Z
assertLessr#  r5  r   r1  r   r   r    r2    s   z(DefaultCompressionTest.verify_wire_bytesN)r)   r*   r+   r'  r*  r2  r   r   r   r    rE    s    rE  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datar-  c                 C   r.  r   r/  r   rH  rI  r   r   r    rH    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   rH  r#   r   r   r    	test_mask  s   

zMaskFunctionMixin.test_maskN)r)   r*   r+   r0   rH  r<  r=  rN  r   r   r   r    rG    s    rG  c                   @   r6   )PythonMaskFunctionTestc                 C   s
   t ||S r   r   rJ  r   r   r    rH    s   
zPythonMaskFunctionTest.maskNr)   r*   r+   rH  r   r   r   r    rO    r;   rO  z#tornado.speedups module not presentc                   @   r6   )CythonMaskFunctionTestc                 C   s   t ||S r   )r   Zwebsocket_maskrJ  r   r   r    rH    r9   zCythonMaskFunctionTest.maskNrP  r   r   r   r    rQ    s    rQ  c                   @   r  )ServerPeriodicPingTestc                 C   s"   G dd dt }td|fgddS )Nc                   @   r6   )z3ServerPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   rZ   )Ngot pongrf   r   rI  r   r   r    on_pong&  r\   z;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pongN)r)   r*   r+   rU  r   r   r   r    PingHandler%  r;   rV  /ru   )Zwebsocket_ping_intervalr   r   r   rV  r   r   r    r   $  s   zServerPeriodicPingTest.get_appc                 c   s6    |  dV }tdD ]}| V }| |d qd S )NrW  r3  rS  )r   r4  r   r   r7  r   r   r    test_server_ping+  s   
z'ServerPeriodicPingTest.test_server_pingN)r)   r*   r+   r   r   rZ  r   r   r   r    rR  #      rR  c                   @   r  )ClientPeriodicPingTestc                 C      G dd dt }td|fgS )Nc                   @   r6   )z3ClientPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   rZ   )Ngot pingrf   rT  r   r   r    on_ping7  r\   z;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingNr)   r*   r+   r_  r   r   r   r    rV  6  r;   rV  rW  rX  rY  r   r   r    r   5     zClientPeriodicPingTest.get_appc                 c   sB    | j dddV }tdD ]}| V }| |d q|  d S )NrW  ru   )Zping_intervalr3  r^  )r   r4  r   r   rc   r7  r   r   r    test_client_ping<  s   
z'ClientPeriodicPingTest.test_client_pingN)r)   r*   r+   r   r   rb  r   r   r   r    r\  4  r[  r\  c                   @   r  )ManualPingTestc                 C   r]  )Nc                   @   r6   )z+ManualPingTest.get_app.<locals>.PingHandlerc                 S   s   | j |t|td d S )Nr   )r.   r/   r0   rT  r   r   r    r_  I  r{   z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNr`  r   r   r   r    rV  H  r;   rV  rW  rX  rY  r   r   r    r   G  ra  zManualPingTest.get_appc                 c   sb    |  dV }| t|jd |d | V }| |d |d | V }| |d d S )NrW  Z~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   r   
ValueErrorZpingr   r   )r   r   respr   r   r    test_manual_pingN  s   



zManualPingTest.test_manual_pingN)r)   r*   r+   r   r   rf  r   r   r   r    rc  F  r[  rc  c                   @   r  )MaxMessageSizeTestc                 C   s   t dtfgddS )NrW  r   )Z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 )NrW  A   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r.   r   r   r   r&   r'   )r   r   r   re  r   r   r    test_large_messageb  s   


z%MaxMessageSizeTest.test_large_messageN)r)   r*   r+   r   r   ri  r   r   r   r    rg  ^  r  rg  )Pr1   r   r?   r  	tracebackr<  ZunittestZtornado.concurrentr   tornador   Ztornado.httpclientr   r   Ztornado.locksr   Ztornado.logr   r   Ztornado.netutilr	   Ztornado.simple_httpclientr   Ztornado.templater   Ztornado.testingr   r   r   r   Ztornado.webr   r   Ztornado.websocketZtornado.utilr   ImportError	print_excr   r   r   r   r   r   r-   r7   r<   rO   rY   r^   r`   rd   rg   ri   ry   r|   r   r   r   r   r   r   r  r  objectr  r>  rA  rB  rD  rE  rG  ZTestCaserO  ZskipIfrQ  rR  r\  rc  rg  r   r   r   r    <module>   s    
	   C	