U
    d3n                     @   sl  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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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 d0d1 d1eZ8G d2d3 d3e8Z9G d4d5 d5e'Z:G d6d7 d7e8Z;G d8d9 d9e<Z=G d:d; d;e=Z>G d<d= d=e>e8Z?G d>d? d?e>e8Z@G d@dA dAe>e8ZAG dBdC dCe=e8ZBG dDdE dEe<ZCG dFdG dGeCejDZEeFe&dkdHG dIdJ dJeCejDZGG dKdL dLe8ZHG dMdN dNe8ZIG dOdP dPe8ZJG dQdR dRe8ZKdS )S    N)Future)gen)	HTTPErrorHTTPRequest)Event)gen_logapp_log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-fekwu36z/tornado/test/websocket_test.py
initialize1   s    zTestWebSocketHandler.initializec                 C   s   | j S r   r   r   r   r   r   get_compression_options5   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_close8   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   	coroutiner2   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   r0   r   r   r   r2   I   s    z"ErrorInOnMessageHandler.on_messageNr'   r(   r)   r2   r   r   r   r   r4   H   s   r4   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   openN   s    	zHeaderHandler.openNr'   r(   r)   rH   r   r   r   r   r7   M   s   r7   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_headersd   s    z%HeaderEchoHandler.set_default_headersc                 C   s4   | j j D ]"\}}| dr| || qd S )Nzx-test)rD   rE   get_alllower
startswithr>   )r   kvr   r   r   prepareg   s    zHeaderEchoHandler.prepareN)r'   r(   r)   rM   rS   r   r   r   r   rJ   c   s   rJ   c                   @   s   e Zd Zdd ZdS )NonWebSocketHandlerc                 C   s   |  d d S )Nok)r<   r"   r   r   r   rF   n   s    zNonWebSocketHandler.getNr'   r(   r)   rF   r   r   r   r   rT   m   s   rT   c                   @   s   e Zd Zdd ZdS )RedirectHandlerc                 C   s   |  d d S )N/echo)r=   r"   r   r   r   rF   s   s    zRedirectHandler.getNrV   r   r   r   r   rW   r   s   rW   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   rH   x   s    zCloseReasonHandler.openNrI   r   r   r   r   rY   w   s   rY   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   rS   ~   s    zAsyncPrepareHandler.preparec                 C   s   |  | d S r   r,   r0   r   r   r   r2      s    zAsyncPrepareHandler.on_messageN)r'   r(   r)   r   r3   rS   r2   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   rH      s    zPathArgsHandler.openNrI   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 sleepingr5   {Gz?re   r,   r   sleepr0   r   r   r   r2      s    

z$CoroutineOnMessageHandler.on_message)r'   r(   r)   r    r   r3   r2   __classcell__r   r   rh   r   ra      s   ra   c                   @   s   e Zd Zdd ZdS )RenderMessageHandlerc                 C   s   |  | jd|d d S )Nmessage.html)r1   )r,   Zrender_stringr0   r   r   r   r2      s    zRenderMessageHandler.on_messageNr6   r   r   r   r   ro      s   ro   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)rd   r    select_subprotocol_calledrf   rh   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)rs   rB   )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)rs   rB   r,   selected_subprotocolr"   r   r   r   rH      s    zSubprotocolHandler.open)r'   r(   r)   r    rv   rH   rn   r   r   rh   r   rq      s   rq   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 rr   )rd   r    testopen_finished)r   ry   rg   rh   r   r   r       s    zOpenCoroutineHandler.initializec                 c   s$   | j j V  tdV  d| _d S )Nrk   T)ry   message_sentwaitr   rm   rz   r"   r   r   r   rH      s    zOpenCoroutineHandler.openc                 C   s   | j std| d d S )Nz&on_message called before open finishedrU   )rz   rB   r,   r0   r   r   r   r2      s    zOpenCoroutineHandler.on_message)	r'   r(   r)   r    r   r3   rH   r2   rn   r   r   rh   r   rx      s   
rx   c                   @   s   e Zd Zdd ZdS )ErrorInOpenHandlerc                 C   s   t dd S )Nboom)rB   r"   r   r   r   rH      s    zErrorInOpenHandler.openNrI   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~   )r/   rm   rB   r"   r   r   r   rH      s    zErrorInAsyncOpenHandler.openNrI   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   rH      s    
zNoDelayHandler.openNrI   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   pathrg   wsr   r   r   
ws_connect   s    z WebSocketBaseTestCase.ws_connectN)r'   r(   r)   r   r3   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 )NrX   )r   /non_ws	/redirectz/headerz/header_echo/close_reason/error_in_on_message/async_preparez/path_args/(.*)
/coroutine/render/subprotocol/open_coroutine)r   ry   /error_in_open/error_in_async_open/nodelayrp   z<b>{{ message }}</b>)Ztemplate_loader)r   r   r   r+   dictrT   rW   r7   rJ   rY   r4   r]   r_   ra   ro   rq   rx   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   )rd   tearDownr   Z_template_loadersclearr"   rh   r   r   r     s    
zWebSocketTest.tearDownc                 C   s   |  d}| |jd d S )NrX     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 )NrX   Upgrade	WebSocketZ13
Connectionr   zSec-WebSocket-VersionrE   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 )NrX   r   r   Z12r   r   i  r   r   r   r   r   test_bad_websocket_version/  s    z(WebSocketTest.test_bad_websocket_versionc                 c   s2   |  dV }|dV  | V }| |d d S )NrX   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>J      z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>)r   r   r   r|   resultr,   r   r   r   Zadd_done_callbackr\   r   r   r"   r   test_websocket_callbacksA  s    
 
z&WebSocketTest.test_websocket_callbacksc                 c   s4   |  dV }|jddd | V }| |d d S )NrX   s   hello Tbinaryr   r   r   r   r   test_binary_messageN  s    
z!WebSocketTest.test_binary_messagec                 c   s0   |  dV }|d | V }| |d d S NrX   u   hello ér   r   r   r   r   test_unicode_messageU  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_messagec  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_messagej  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_failr  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_successx  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   sT   t  \}}|  | t. ttd td| ddV  W 5 Q R X W 5 Q R X d S )Nz.*z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/headerr8   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   rK   rL   )r   r   r   r   rE   rF   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   rZ   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 )NrX   rZ   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   urlrE   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   rE   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   sT   |   }d| }ddi}| t}tt||dV  W 5 Q R X | |jjd d S )Nzws://localhost:%d/echor   zhttp://subtenant.localhostr   r   r   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badprotort   )ru   zsubprotocol=goodproto)r   r   rw   r   r   r   r   r   test_subprotocols(  s     
zWebSocketTest.test_subprotocolsc                 c   s4   |  dV }| |jd  | V }| |d d S )Nr   zsubprotocol=None)r   r   rw   r   r   r   r   r   r   test_subprotocols_not_offered1  s    
z+WebSocketTest.test_subprotocols_not_offeredc                 c   sD   t  | _| dV }|dV  | j  | V }| |d d S )Nr   r   rU   )r   r{   r   r,   setr   r   r   r   r   r   test_open_coroutine8  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_openA  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_openH  s    z&WebSocketTest.test_error_in_async_openc                 c   s&   |  dV }| V }| |d d S )Nr   r   r   r   r   r   r   test_nodelayO  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   rn   r   r   rh   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 rb   rc   rf   rh   r   r   r    W  s    z*NativeCoroutineOnMessageHandler.initializec                    sN   | j dkr| d |  j d7  _ tdI d H  |  j d8  _ | | d S rj   rl   r0   r   r   r   r2   [  s    

z*NativeCoroutineOnMessageHandler.on_message)r'   r(   r)   r    r2   rn   r   r   rh   r   r   V  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   e  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_coroutineh  s    

z2WebSocketNativeCoroutineTest.test_native_coroutineN)r'   r(   r)   r   r   r   r   r   r   r   r   d  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_sizey  s    zECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_sizec                 S   s   |  tt| d S r   )r,   strlenr0   r   r   r   r2   }  s    z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r'   r(   r)   propertyr   r2   r   r   r   r   LimitedHandlerx  s   
r   rX   r!   /limited)r   r   r+   r   get_server_compression_options)r   r   r   r   r   r   w  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 )NrX   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   t  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&  /rk   )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 )Nr'  r  r#  r   r  r   r   r	  r   r   r   test_server_ping  s    
z'ServerPeriodicPingTest.test_server_pingN)r'   r(   r)   r   r   r+  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)   r.  r   r   r   r   r&    s   r&  r'  r(  r)  r   r   r   r     s    zClientPeriodicPingTest.get_appc                 c   s8   | j dddV }tdD ]}| V }| |d qd S )Nr'  rk   )Zping_intervalr  r-  r*  r	  r   r   r   test_client_ping  s    
z'ClientPeriodicPingTest.test_client_pingN)r'   r(   r)   r   r   r0  r   r   r   r   r,    s   r,  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   r.  $  s    z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNr/  r   r   r   r   r&  #  s   r&  r'  r(  r)  r   r   r   r   "  s    zManualPingTest.get_appc                 c   s`   |  dV }| t|jd |d | V }| |d |d | V }| |d d S )Nr'  Z~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   r   
ValueErrorZpingr   r   )r   r   respr   r   r   test_manual_ping)  s    



zManualPingTest.test_manual_pingN)r'   r(   r)   r   r   r4  r   r   r   r   r1  !  s   r1  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 )Nr'  r   )Zwebsocket_max_message_size)r   r+   r"   r   r   r   r   :  s    zMaxMessageSizeTest.get_appc                 c   st   |  dV }d}|| | V }| || ||d  | V }| |d  | |jd | |jd d S )Nr'  A   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r,   r   r   r   r$   r%   )r   r   r   r3  r   r   r   test_large_message=  s    


z%MaxMessageSizeTest.test_large_messageN)r'   r(   r)   r   r   r7  r   r   r   r   r5  9  s   r5  )Lr/   r:   	tracebackr  ZunittestZtornado.concurrentr   Ztornador   Ztornado.httpclientr   r   Ztornado.locksr   Ztornado.logr   r   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+   r4   r7   rJ   rT   rW   rY   r]   r_   ra   ro   rq   rx   r}   r   r   r   r   r   r   objectr   r  r  r  r  r  r  ZTestCaser  ZskipIfr!  r"  r,  r1  r5  r   r   r   r   <module>   sz   

		  zC	