U
    /e2p                     @   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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#k
r   e$   Y nX d dl m%Z%m&Z&m'Z'm(Z( zd dlm)Z) W n e#k
r:   dZ)Y nX 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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/d0 d0e*Z:G d1d2 d2eZ;G d3d4 d4e;Z<G d5d6 d6e*Z=G d7d8 d8e;Z>G d9d: d:e?Z@G d;d< d<e@ZAG d=d> d>eAe;ZBG d?d@ d@eAe;ZCG dAdB dBeAe;ZDG dCdD dDe@e;ZEG dEdF dFe?ZFG dGdH dHeFejGZHeIe)dkdIG dJdK dKeFejGZJG dLdM dMe;ZKG dNdO dOe;ZLG dPdQ dQe;ZMG dRdS dSe;ZNd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   ?/tmp/pip-unpacked-wheel-u_oqpzhd/tornado/test/websocket_test.py
initialize3   s    zTestWebSocketHandler.initializec                 C   s   | j S r   r   r   r   r   r    get_compression_options7   s    z,TestWebSocketHandler.get_compression_optionsc                 C   s"   | j d k	r| j | j| jf 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 n( tjk
r.   Y n tk
r@   Y nX d S r   )write_message
isinstancebytesasyncioZCancelledErrorr   r   messager   r   r    
on_message@   s    zEchoHandler.on_messageN)r(   r)   r*   r   	coroutiner3   r   r   r   r    r,   ?   s   r,   c                   @   s   e Zd Zdd ZdS )ErrorInOnMessageHandlerc                 C   s   dd  d S )N   r   r   r1   r   r   r    r3   K   s    z"ErrorInOnMessageHandler.on_messageNr(   r)   r*   r3   r   r   r   r    r5   J   s   r5   c                   @   s   e Zd Zdd ZdS )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W qP t
k
rz   Y qPX qP| | 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    openP   s    	zHeaderHandler.openNr(   r)   r*   rI   r   r   r   r    r8   O   s   r8   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)r?   r#   r   r   r    set_default_headersf   s    z%HeaderEchoHandler.set_default_headersc                 C   s4   | j j D ]"\}}| dr| || qd S )Nzx-test)rE   rF   get_alllower
startswithr?   )r   kvr   r   r    preparei   s    zHeaderEchoHandler.prepareN)r(   r)   r*   rN   rT   r   r   r   r    rK   e   s   rK   c                   @   s   e Zd Zdd ZdS )NonWebSocketHandlerc                 C   s   |  d d S )Nok)r=   r#   r   r   r    rG   p   s    zNonWebSocketHandler.getNr(   r)   r*   rG   r   r   r   r    rU   o   s   rU   c                   @   s   e Zd Zdd ZdS )RedirectHandlerc                 C   s   |  d d S )N/echo)r>   r#   r   r   r    rG   u   s    zRedirectHandler.getNrW   r   r   r   r    rX   t   s   rX   c                   @   s   e Zd Zdd ZdS )CloseReasonHandlerc                 C   s   d| _ | dd d S )NF  goodbye)Zon_close_calledcloser#   r   r   r    rI   z   s    zCloseReasonHandler.openNrJ   r   r   r   r    rZ   y   s   rZ   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    rT      s    zAsyncPrepareHandler.preparec                 C   s   |  | d S r   r-   r1   r   r   r    r3      s    zAsyncPrepareHandler.on_messageN)r(   r)   r*   r   r4   rT   r3   r   r   r   r    r^      s   
r^   c                   @   s   e Zd Zdd ZdS )PathArgsHandlerc                 C   s   |  | d S r   r_   )r   argr   r   r    rI      s    zPathArgsHandler.openNrJ   r   r   r   r    r`      s   r`   c                       s*   e Zd Z fddZejdd Z  ZS )CoroutineOnMessageHandlerc                    s   t  jf | d| _d S Nr   superr!   sleepingr   kwargs	__class__r   r    r!      s    z$CoroutineOnMessageHandler.initializec                 c   sJ   | j dkr| d |  j d7  _ tdV  |  j d8  _ | | d S Nr   z%another coroutine is already sleepingr6   {Gz?rf   r-   r   sleepr1   r   r   r    r3      s    

z$CoroutineOnMessageHandler.on_message)r(   r)   r*   r!   r   r4   r3   __classcell__r   r   ri   r    rb      s   rb   c                   @   s   e Zd Zdd ZdS )RenderMessageHandlerc                 C   s   |  | jd|d d S )Nmessage.html)r2   )r-   Zrender_stringr1   r   r   r    r3      s    zRenderMessageHandler.on_messageNr7   r   r   r   r    rp      s   rp   c                       s,   e Zd Z fddZdd Zdd Z  ZS )SubprotocolHandlerc                    s   t  jf | d| _d S NF)re   r!   select_subprotocol_calledrg   ri   r   r    r!      s    zSubprotocolHandler.initializec                 C   s$   | j rtdd| _ d|kr dS d S )Nzselect_subprotocol called twiceT	goodproto)rt   rC   )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)rt   rC   r-   selected_subprotocolr#   r   r   r    rI      s    zSubprotocolHandler.open)r(   r)   r*   r!   rw   rI   ro   r   r   ri   r    rr      s   rr   c                       s2   e Zd Z fddZejdd Zdd Z  ZS )OpenCoroutineHandlerc                    s   t  jf | || _d| _d S rs   )re   r!   testopen_finished)r   rz   rh   ri   r   r    r!      s    zOpenCoroutineHandler.initializec                 c   s$   | j j V  tdV  d| _d S )Nrl   T)rz   message_sentwaitr   rn   r{   r#   r   r   r    rI      s    zOpenCoroutineHandler.openc                 C   s   | j std| d d S )Nz&on_message called before open finishedrV   )r{   rC   r-   r1   r   r   r    r3      s    zOpenCoroutineHandler.on_message)	r(   r)   r*   r!   r   r4   rI   r3   ro   r   r   ri   r    ry      s   
ry   c                   @   s   e Zd Zdd ZdS )ErrorInOpenHandlerc                 C   s   t dd S )Nboom)rC   r#   r   r   r    rI      s    zErrorInOpenHandler.openNrJ   r   r   r   r    r~      s   r~   c                   @   s   e Zd Zdd ZdS )ErrorInAsyncOpenHandlerc                    s   t dI d H  tdd S )Nr   r   )r0   rn   rC   r#   r   r   r    rI      s    zErrorInAsyncOpenHandler.openNrJ   r   r   r   r    r      s   r   c                   @   s   e Zd Zdd ZdS )NoDelayHandlerc                 C   s   |  d | d d S )NThello)Zset_nodelayr-   r#   r   r   r    rI      s    
zNoDelayHandler.openNrJ   r   r   r   r    r      s   r   c                   @   s   e Zd Zejdd ZdS )WebSocketBaseTestCasec                 k   s(   t d|  |f f|V }t|d S )Nzws://127.0.0.1:%d%s)r   get_http_portr   ZReturn)r   pathrh   wsr   r   r    
ws_connect   s    z WebSocketBaseTestCase.ws_connectN)r(   r)   r*   r   r4   r   r   r   r   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 )NrY   )r   /non_ws	/redirectz/headerz/header_echo/close_reason/error_in_on_message/async_preparez/path_args/(.*)
/coroutine/render/subprotocol/open_coroutine)r   rz   /error_in_open/error_in_async_open/nodelayrq   z<b>{{ message }}</b>)Ztemplate_loader)r   r   r   r,   dictrU   rX   r8   rK   rZ   r5   r^   r`   rb   rp   rr   ry   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   )re   tearDownr   Z_template_loadersclearr#   ri   r   r    r     s    
zWebSocketTest.tearDownc                 C   s   |  d}| |jd d S )NrY     fetchassertEqualcoder   responser   r   r    test_http_request!  s    
zWebSocketTest.test_http_requestc                 C   s(   | j dddddd}| |jd d S )NrY   Upgrade	WebSocketZ13
Connectionr   zSec-WebSocket-VersionrF   r   r   r   r   r   r    test_missing_websocket_key&  s    z(WebSocketTest.test_missing_websocket_keyc                 C   s(   | j dddddd}| |jd d S )NrY   r   r   Z12r   r   i  r   r   r   r   r    test_bad_websocket_version1  s    z(WebSocketTest.test_bad_websocket_versionc                 c   s2   |  dV }|dV  | V }| |d d S )NrY   r   r   r-   read_messager   r   r   r   r   r   r    test_websocket_gen<  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>L      z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>)r   r   r   r}   resultr-   r   r   r   Zadd_done_callbackr]   r   r   r#   r    test_websocket_callbacksC  s    
 
z&WebSocketTest.test_websocket_callbacksc                 c   s4   |  dV }|jddd | V }| |d d S )NrY   s   hello Tbinaryr   r   r   r   r    test_binary_messageP  s    
z!WebSocketTest.test_binary_messagec                 c   s0   |  dV }|d | V }| |d d S NrY   u   hello ér   r   r   r   r    test_unicode_messageW  s    

z"WebSocketTest.test_unicode_messagec              	   c   s8   |  dV }|  | t |d W 5 Q R X d S r   )r   r]   assertRaisesr   r-   r   r   r   r   r    )test_error_in_closed_client_write_message^  s    z7WebSocketTest.test_error_in_closed_client_write_messagec                 c   s0   |  dV }|d | V }| |d d S )Nr   r   z<b>hello</b>r   r   r   r   r    test_render_messagee  s    

z!WebSocketTest.test_render_messagec              	   c   sF   |  dV }|d ttd | V }W 5 Q R X | |d  d S )Nr   r   Uncaught exception)r   r-   r   r   r   assertIsr   r   r   r    test_error_in_on_messagel  s
    
z&WebSocketTest.test_error_in_on_messagec              	   c   s6   |  t}| dV  W 5 Q R X | |jjd d S )Nz	/notfoundi  )r   r   r   r   	exceptionr   )r   cmr   r   r    test_websocket_http_failt  s    z&WebSocketTest.test_websocket_http_failc              	   c   s&   |  t | dV  W 5 Q R X d S )Nr   )r   r   r   r#   r   r   r    test_websocket_http_successz  s    z)WebSocketTest.test_websocket_http_successc              	   c   s&   |  t | dV  W 5 Q R X d S )Nr   )r   r   r   r#   r   r   r    test_websocket_http_redirect  s    z*WebSocketTest.test_websocket_http_redirectc              
   c   sX   t  \}}|  | t2 ttddd td| ddV  W 5 Q R X W 5 Q R X d S )Nz.*F)requiredzws://127.0.0.1:%d/i  )connect_timeout)r   r]   r   IOErrorr   r   r   )r   sockportr   r   r    test_websocket_network_fail  s    
 z)WebSocketTest.test_websocket_network_failc                 c   s4   t d|   V }|d |d |j  d S )Nr   r   Zworld)r   r   r-   streamr]   r   r   r   r    "test_websocket_close_buffered_data  s    

z0WebSocketTest.test_websocket_close_buffered_datac                 c   s8   t td|   ddidV }| V }| |d d S )Nzws://127.0.0.1:%d/headerr9   r   r   )r   r   r   r   r   r   r   r   r    test_websocket_headers  s    

z$WebSocketTest.test_websocket_headersc                 c   sJ   t td|   ddidV }| |jdd | |jdd d S )Nzws://127.0.0.1:%d/header_echozX-Test-Hellor   r   rL   rM   )r   r   r   r   rF   rG   r   r   r   r    test_websocket_header_echo  s    

 z(WebSocketTest.test_websocket_header_echoc                 c   sZ   |  dV }| V }| |d  | |jd | |jd | jV \}}| |d d S )Nr   r[   r\   )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   s@   |  dV }|dd | jV \}}| |d | |d d S )NrY   r[   r\   )r   r]   r   r   )r   r   r   r   r   r   r    test_client_close_reason  s
    z&WebSocketTest.test_client_close_reasonc              	   c   sF   |  dV }| V }| |d  | t |d W 5 Q R X 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   s0   |  dV }|d | V }| |d d S )Nr   r   r   r   r   resr   r   r    test_async_prepare  s    

z WebSocketTest.test_async_preparec                 c   s&   |  dV }| V }| |d d S )Nz/path_args/hellor   r   r   r   r   r   r   r    test_path_args  s    
zWebSocketTest.test_path_argsc                 c   sT   |  dV }|dV  |dV  | V }| |d | V }| |d d S )Nr   hello1hello2r   r   r   r   r    test_coroutine  s    

zWebSocketTest.test_coroutinec                 c   sR   |   }d| }dd| i}tt||dV }|d | V }| |d d S )Nr   Originzhttp://127.0.0.1:%dr   r   r   r   r   r-   r   r   r   r   urlrF   r   r   r   r   r    test_check_origin_valid_no_path  s    

z-WebSocketTest.test_check_origin_valid_no_pathc                 c   sR   |   }d| }dd| i}tt||dV }|d | V }| |d d S )Nr   r   zhttp://127.0.0.1:%d/somethingr   r   r   r   r   r   r    !test_check_origin_valid_with_path  s    

z/WebSocketTest.test_check_origin_valid_with_pathc              	   c   sX   |   }d| }dd| i}| t}tt||dV  W 5 Q R X | |jjd d S )Nr   r   z127.0.0.1:%dr     r   r   r   r   r   r   r   r   r   r   r   rF   r   r   r   r    %test_check_origin_invalid_partial_url  s    z3WebSocketTest.test_check_origin_invalid_partial_urlc              	   c   sT   |   }d| }ddi}| t}tt||dV  W 5 Q R X | |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|krB| d d S d| }ddi}| t}t	t
||dV  W 5 Q R X | |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   rF   r   r   r   r    $test_check_origin_invalid_subdomains  s    

z2WebSocketTest.test_check_origin_invalid_subdomainsc                 c   s<   | j dddgdV }| |jd | V }| |d d S )Nr   Zbadprotoru   )rv   zsubprotocol=goodproto)r   r   rx   r   r   r   r   r    test_subprotocols3  s     
zWebSocketTest.test_subprotocolsc                 c   s4   |  dV }| |jd  | V }| |d d S )Nr   zsubprotocol=None)r   r   rx   r   r   r   r   r   r    test_subprotocols_not_offered<  s    
z+WebSocketTest.test_subprotocols_not_offeredc                 c   sD   t  | _| dV }|dV  | j  | V }| |d d S )Nr   r   rV   )r   r|   r   r-   r   r   r   r   r   r   r    test_open_coroutineC  s    

z!WebSocketTest.test_open_coroutinec              	   c   s:   t td | dV }| V }W 5 Q R X | | d S )Nr   r   r   r   r   r   assertIsNoner   r   r   r    test_error_in_openL  s    z WebSocketTest.test_error_in_openc              	   c   s:   t td | dV }| V }W 5 Q R X | | d S )Nr   r   r   r   r   r   r    test_error_in_async_openS  s    z&WebSocketTest.test_error_in_async_openc                 c   s&   |  dV }| V }| |d d S )Nr   r   r   r   r   r   r    test_nodelayZ  s    
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   ro   r   r   ri   r    r      s   8









	




















r   c                       s$   e Zd Z fddZdd Z  ZS )NativeCoroutineOnMessageHandlerc                    s   t  jf | d| _d S rc   rd   rg   ri   r   r    r!   b  s    z*NativeCoroutineOnMessageHandler.initializec                    sN   | j dkr| d |  j d7  _ tdI d H  |  j d8  _ | | d S rk   rm   r1   r   r   r    r3   f  s    

z*NativeCoroutineOnMessageHandler.on_message)r(   r)   r*   r!   r3   ro   r   r   ri   r    r   a  s   r   c                   @   s    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   p  s    z$WebSocketNativeCoroutineTest.get_appc                 c   sT   |  dV }|dV  |dV  | V }| |d | V }| |d d S )Nr   r   r   r   r   r   r   r    test_native_coroutines  s    

z2WebSocketNativeCoroutineTest.test_native_coroutineN)r(   r)   r*   r   r   r   r   r   r   r    r   o  s   r   c                   @   sb   e Zd ZdZdd Zdd Zdd Zeedd	d
dZe	e
jdddZe	e
jd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lenr1   r   r   r    r3     s    z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r(   r)   r*   propertyr   r3   r   r   r   r    LimitedHandler  s   
r  rY   r"   /limited)r   r   r,   r   get_server_compression_options)r   r  r   r   r    r     s    zCompressionTestMixin.get_appc                 C   s   d S r   r   r#   r   r   r    r    s    z3CompressionTestMixin.get_server_compression_optionsc                 C   s   d S r   r   r#   r   r   r    get_client_compression_options  s    z3CompressionTestMixin.get_client_compression_optionsN)bytes_in	bytes_outreturnc                 C   s
   t  d S r   NotImplementedErrorr   r  r  r   r   r    verify_wire_bytes  s    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 )NrY   r"      )r   r  ranger-   MESSAGEr   r   protocolZ_message_bytes_outr  Z_message_bytes_inr  Z_wire_bytes_inZ_wire_bytes_outr   r   ir   r   r   r    test_message_sizes  s     
z'CompressionTestMixin.test_message_sizesc                 c   sV   | 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*   r  r   r  r  intr  r   typingAnyr  r  r   r   r   r    r     s   r   c                   @   s    e Zd ZdZejd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 )Nr        )r   r  r  r  r   r   r    r    s    z'UncompressedTestMixin.verify_wire_bytesN)r(   r)   r*   r+   r  r  r  r   r   r   r    r    s   r  c                   @   s   e Zd ZdS )NoCompressionTestN)r(   r)   r*   r   r   r   r    r    s   r  c                   @   s   e Zd Zdd ZdS )ServerOnlyCompressionTestc                 C   s   i S r   r   r#   r   r   r    r    s    z8ServerOnlyCompressionTest.get_server_compression_optionsN)r(   r)   r*   r  r   r   r   r    r    s   r  c                   @   s   e Zd Zdd ZdS )ClientOnlyCompressionTestc                 C   s   i S r   r   r#   r   r   r    r    s    z8ClientOnlyCompressionTest.get_client_compression_optionsN)r(   r)   r*   r  r   r   r   r    r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DefaultCompressionTestc                 C   s   i S r   r   r#   r   r   r    r    s    z5DefaultCompressionTest.get_server_compression_optionsc                 C   s   i S r   r   r#   r   r   r    r    s    z5DefaultCompressionTest.get_client_compression_optionsc                 C   sH   |  |dt| jd   |  |dt| jd   | ||d  d S )Nr  r  r     )Z
assertLessr  r  r   r  r   r   r    r    s    z(DefaultCompressionTest.verify_wire_bytesN)r(   r)   r*   r  r  r  r   r   r   r    r    s   r  c                   @   s.   e Zd ZeeedddZejdddZdS )MaskFunctionMixin)maskdatar	  c                 C   s
   t  d S r   r
  r   r"  r#  r   r   r    r"    s    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   abcdr      b   s   54321s   TVPVPs   ZXCVs   98765432s   c`t`olpds    s   s   s   s    s   )r   r"  r#   r   r   r    	test_mask  s    

zMaskFunctionMixin.test_maskN)r(   r)   r*   r/   r"  r  r  r'  r   r   r   r    r!    s   r!  c                   @   s   e Zd Zdd ZdS )PythonMaskFunctionTestc                 C   s
   t ||S r   r   r$  r   r   r    r"     s    zPythonMaskFunctionTest.maskNr(   r)   r*   r"  r   r   r   r    r(    s   r(  z#tornado.speedups module not presentc                   @   s   e Zd Zdd ZdS )CythonMaskFunctionTestc                 C   s   t ||S r   )r   Zwebsocket_maskr$  r   r   r    r"    s    zCythonMaskFunctionTest.maskNr)  r   r   r   r    r*    s   r*  c                   @   s    e Zd Zdd Zedd ZdS )ServerPeriodicPingTestc                 C   s"   G dd dt }td|fgddS )Nc                   @   s   e Zd Zdd ZdS )z3ServerPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   s   |  d d S )Ngot pongr_   r   r#  r   r   r    on_pong  s    z;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pongN)r(   r)   r*   r.  r   r   r   r    PingHandler  s   r/  /rl   )Zwebsocket_ping_intervalr   r   r   r/  r   r   r    r     s    zServerPeriodicPingTest.get_appc                 c   s4   |  dV }tdD ]}| V }| |d qd S )Nr0  r  r,  )r   r  r   r   r  r   r   r    test_server_ping  s    
z'ServerPeriodicPingTest.test_server_pingN)r(   r)   r*   r   r   r3  r   r   r   r    r+  
  s   r+  c                   @   s    e Zd Zdd Zedd ZdS )ClientPeriodicPingTestc                 C   s   G dd dt }td|fgS )Nc                   @   s   e Zd Zdd ZdS )z3ClientPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   s   |  d d S )Ngot pingr_   r-  r   r   r    on_ping  s    z;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingNr(   r)   r*   r6  r   r   r   r    r/    s   r/  r0  r1  r2  r   r   r    r     s    zClientPeriodicPingTest.get_appc                 c   s@   | j dddV }tdD ]}| V }| |d q|  d S )Nr0  rl   )Zping_intervalr  r5  )r   r  r   r   r]   r  r   r   r    test_client_ping#  s
    
z'ClientPeriodicPingTest.test_client_pingN)r(   r)   r*   r   r   r8  r   r   r   r    r4    s   r4  c                   @   s    e Zd Zdd Zedd ZdS )ManualPingTestc                 C   s   G dd dt }td|fgS )Nc                   @   s   e Zd Zdd ZdS )z+ManualPingTest.get_app.<locals>.PingHandlerc                 S   s   | j |t|td d S )Nr   )r-   r.   r/   r-  r   r   r    r6  0  s    z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNr7  r   r   r   r    r/  /  s   r/  r0  r1  r2  r   r   r    r   .  s    zManualPingTest.get_appc                 c   s`   |  dV }| t|jd |d | V }| |d |d | V }| |d d S )Nr0  Z~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   r   
ValueErrorZpingr   r   )r   r   respr   r   r    test_manual_ping5  s    



zManualPingTest.test_manual_pingN)r(   r)   r*   r   r   r<  r   r   r   r    r9  -  s   r9  c                   @   s    e Zd Zdd Zedd ZdS )MaxMessageSizeTestc                 C   s   t dtfgddS )Nr0  r   )Zwebsocket_max_message_size)r   r,   r#   r   r   r    r   F  s    zMaxMessageSizeTest.get_appc                 c   st   |  dV }d}|| | V }| || ||d  | V }| |d  | |jd | |jd d S )Nr0  A   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r-   r   r   r   r%   r&   )r   r   r   r;  r   r   r    test_large_messageI  s    


z%MaxMessageSizeTest.test_large_messageN)r(   r)   r*   r   r   r?  r   r   r   r    r=  E  s   r=  )Or0   r;   r   	tracebackr  ZunittestZtornado.concurrentr   Z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,   r5   r8   rK   rU   rX   rZ   r^   r`   rb   rp   rr   ry   r~   r   r   r   r   r   r   objectr   r  r  r  r  r  r!  ZTestCaser(  ZskipIfr*  r+  r4  r9  r=  r   r   r   r    <module>   s   

		   C	