o
    Eh                     @   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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 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/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(d) d)e/Z;G d*d+ d+e/Z<G d,d- d-e/Z=G d.d/ d/e/Z>G d0d1 d1e/Z?G d2d3 d3eZ@G d4d5 d5e@ZAG d6d7 d7e/ZBG d8d9 d9e@ZCeG d:d; d;e@ZDeG d<d= d=eDZEG d>d? d?eEZFG d@dA dAeEZGG dBdC dCeEZHG dDdE dEeDZIeG dFdG dGejJZKG dHdI dIeKZLeMe.du dJG dKdL dLeKZNG dMdN dNe@ZOG dOdP dPe@ZPG dQdR dRe@ZQG dSdT dTejJZRG dUdV dVe@ZSG dWdX dXe@ZTdS )Y    N)Future)gen)	HTTPErrorHTTPRequest)Event)gen_logapp_log)ResolverSimpleAsyncHTTPClient)
DictLoader)abstract_base_testignore_deprecation)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#   \/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/tornado/test/websocket_test.py
initialize6   s   
zTestWebSocketHandler.initializec                 C   s   | j S r   r    r"   r#   r#   r$   get_compression_options:      z,TestWebSocketHandler.get_compression_optionsc                 C   s&   | j d ur| j | j| jf d S d S r   )r   
set_result
close_codeclose_reasonr'   r#   r#   r$   on_close=   s   
zTestWebSocketHandler.on_closeNN)__name__
__module____qualname____doc__r%   r(   r-   r#   r#   r#   r$   r   .   s
    
r   c                   @   s   e Zd Zejdd ZdS )EchoHandlerc                 c   sF    z|  |t|tV  W d S  tjy   Y d S  ty"   Y d S w r   )write_message
isinstancebytesasyncioCancelledErrorr   r"   messager#   r#   r$   
on_messageC   s   zEchoHandler.on_messageN)r/   r0   r1   r   	coroutiner;   r#   r#   r#   r$   r3   B   s    r3   c                   @      e Zd Zdd ZdS )ErrorInOnMessageHandlerc                 C   s   dd  d S )N   r   r#   r9   r#   r#   r$   r;   N      z"ErrorInOnMessageHandler.on_messageNr/   r0   r1   r;   r#   r#   r#   r$   r>   M       r>   c                   @   r=   )HeaderHandlerc              	   C   s   t | jdt | jdt | jddt | jddt | jd| j| jg}|D ]}z|  t	d t
y:   Y q(w | | jjdd d S )	NzThis should not workzhttp://localhost/elsewhereX-Test 	ChocolateChipi  zdid not get expected exception)	functoolspartialwriteredirect
set_header
set_cookie
set_statusflushfinish	ExceptionRuntimeErrorr4   requestheadersget)r"   methods_to_testmethodr#   r#   r$   openS   s    	zHeaderHandler.openNr/   r0   r1   rX   r#   r#   r#   r$   rC   R   rB   rC   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)rL   r'   r#   r#   r$   set_default_headersi   s   z%HeaderEchoHandler.set_default_headersc                 C   s4   | j j D ]\}}| dr| || qd S )Nzx-test)rS   rT   get_alllower
startswithrL   )r"   kvr#   r#   r$   preparel   s
   zHeaderEchoHandler.prepareN)r/   r0   r1   r]   rc   r#   r#   r#   r$   rZ   h   s    rZ   c                   @   r=   )NonWebSocketHandlerc                 C      |  d d S )Nok)rJ   r'   r#   r#   r$   rU   s      zNonWebSocketHandler.getNr/   r0   r1   rU   r#   r#   r#   r$   rd   r   rB   rd   c                   @   r=   )RedirectHandlerc                 C   re   )N/echo)rK   r'   r#   r#   r$   rU   x   rg   zRedirectHandler.getNrh   r#   r#   r#   r$   ri   w   rB   ri   c                   @   r=   )CloseReasonHandlerc                 C   s   d| _ | dd d S )NF  goodbye)on_close_calledcloser'   r#   r#   r$   rX   }   s   zCloseReasonHandler.openNrY   r#   r#   r#   r$   rk   |   rB   rk   c                   @   s"   e Zd Zejdd Zdd ZdS )AsyncPrepareHandlerc                 c   s    t jV  d S r   )r   momentr'   r#   r#   r$   rc      s   zAsyncPrepareHandler.preparec                 C      |  | d S r   r4   r9   r#   r#   r$   r;      rg   zAsyncPrepareHandler.on_messageN)r/   r0   r1   r   r<   rc   r;   r#   r#   r#   r$   rp      s    
rp   c                   @   r=   )PathArgsHandlerc                 C   rr   r   rs   )r"   argr#   r#   r$   rX      rg   zPathArgsHandler.openNrY   r#   r#   r#   r$   rt      rB   rt   c                       s*   e Zd Z fddZejdd Z  ZS )CoroutineOnMessageHandlerc                       t  jdi | d| _d S Nr   r#   superr%   sleepingr"   kwargs	__class__r#   r$   r%         
z$CoroutineOnMessageHandler.initializec                 c   sL    | j dkr| d |  j d7  _ tdV  |  j d8  _ | | d S Nr   z%another coroutine is already sleepingr?   {Gz?r{   r4   r   sleepr9   r#   r#   r$   r;      s   

z$CoroutineOnMessageHandler.on_message)r/   r0   r1   r%   r   r<   r;   __classcell__r#   r#   r~   r$   rv      s    rv   c                   @   r=   )RenderMessageHandlerc                 C   s   |  | jd|d d S )Nmessage.html)r:   )r4   render_stringr9   r#   r#   r$   r;         zRenderMessageHandler.on_messageNrA   r#   r#   r#   r$   r      rB   r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )SubprotocolHandlerc                    rw   NFr#   )rz   r%   select_subprotocol_calledr|   r~   r#   r$   r%      r   zSubprotocolHandler.initializec                 C   s$   | j rtdd| _ d|v rdS d S )Nzselect_subprotocol called twiceT	goodproto)r   rQ   )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   rQ   r4   selected_subprotocolr'   r#   r#   r$   rX      s   zSubprotocolHandler.open)r/   r0   r1   r%   r   rX   r   r#   r#   r~   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   )rz   r%   testopen_finished)r"   r   r}   r~   r#   r$   r%      s   
zOpenCoroutineHandler.initializec                 c   s&    | j j V  tdV  d| _d S )Nr   T)r   message_sentwaitr   r   r   r'   r#   r#   r$   rX      s   
zOpenCoroutineHandler.openc                 C   s   | j std| d d S )Nz&on_message called before open finishedrf   )r   rQ   r4   r9   r#   r#   r$   r;      s   zOpenCoroutineHandler.on_message)	r/   r0   r1   r%   r   r<   rX   r;   r   r#   r#   r~   r$   r      s
    
r   c                   @   r=   )ErrorInOpenHandlerc                 C   s   t d)Nboom)rQ   r'   r#   r#   r$   rX      s   zErrorInOpenHandler.openNrY   r#   r#   r#   r$   r      rB   r   c                   @   r=   )ErrorInAsyncOpenHandlerc                    s   t dI d H  td)Nr   r   )r7   r   rQ   r'   r#   r#   r$   rX      s   zErrorInAsyncOpenHandler.openNrY   r#   r#   r#   r$   r      rB   r   c                   @   r=   )NoDelayHandlerc                 C   s   |  d | d d S )NThello)set_nodelayr4   r'   r#   r#   r$   rX         
zNoDelayHandler.openNrY   r#   r#   r#   r$   r      rB   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   )rz   setUpconns_to_closer'   r~   r#   r$   r      s   

zWebSocketBaseTestCase.setUpc                    s"   | j D ]}|  qt   d S r   )r   ro   rz   tearDown)r"   connr~   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"   pathr}   wsr#   r#   r$   
ws_connect   s   
z WebSocketBaseTestCase.ws_connect)	r/   r0   r1   r   r   r   r<   r   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 )Nrj   )r   /non_ws	/redirectz/headerz/header_echo/close_reason/error_in_on_message/async_preparez/path_args/(.*)
/coroutine/render/subprotocol/open_coroutine)r   r   /error_in_open/error_in_async_open/nodelayr   z<b>{{ message }}</b>)template_loader)r   r   r   r3   dictrd   ri   rC   rZ   rk   r>   rp   rt   rv   r   r   r   r   r   r   r   r'   r#   r#   r$   get_app   sZ   







2zWebSocketTest.get_appc                 C   s   t  S r   r
   r'   r#   r#   r$   get_http_client&  s   zWebSocketTest.get_http_clientc                    s   t    tj  d S r   )rz   r   r   _template_loadersclearr'   r~   r#   r$   r   *  r   zWebSocketTest.tearDownc                 C   s   |  d}| |jd d S )Nrj     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 )Nrj   Upgrade	WebSocket13
Connectionr   zSec-WebSocket-VersionrT   r   r   r   r#   r#   r$   test_missing_websocket_key3     z(WebSocketTest.test_missing_websocket_keyc                 C   r   )Nrj   r   r   12r   r   i  r   r   r#   r#   r$   test_bad_websocket_version>  r   z(WebSocketTest.test_bad_websocket_versionc                 c   s4    |  dV }|dV  | V }| |d d S )Nrj   r   r   r4   read_messager   r"   r   r   r#   r#   r$   test_websocket_genI  s
   
z WebSocketTest.test_websocket_genc                    s   t   td    jd W d    n1 sw   Y     }|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>Z  s    z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>)r   r   r   r   r   resultr4   r   r   r   add_done_callbackro   r   r#   r'   r$   test_websocket_callbacksP  s   
z&WebSocketTest.test_websocket_callbacksc                 c   s6    |  dV }|jddd | V }| |d d S )Nrj   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 Nrj   u   hello ér   r   r#   r#   r$   test_unicode_messagee  
   

z"WebSocketTest.test_unicode_messagec                 c   sP    |  dV }|  | t |d W d    d S 1 s!w   Y  d S r   )r   ro   assertRaisesr   r4   r"   r   r#   r#   r$   )test_error_in_closed_client_write_messagel  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_messages  r   z!WebSocketTest.test_render_messagec                 c   sZ    |  dV }|d ttd | V }W d    n1 s!w   Y  | | d S )Nr   r   Uncaught exception)r   r4   r   r   r   assertIsNoner   r#   r#   r$   test_error_in_on_messagez  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   ro   r   IOErrorr   r   r   )r"   sockportr#   r#   r$   test_websocket_network_fail  s   

"z)WebSocketTest.test_websocket_network_failc                 c   s^    t td|   V }|d |d |j  W d    d S 1 s(w   Y  d S )Nr   r   world)
contextlibclosingr   r   r4   streamro   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/headerrD   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   r[   r\   )r   r   r   r   r   r   rT   rU   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   rl   rm   )r   r   assertIsr   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 )Nrj   rl   rm   )r   ro   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   r4   )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   r4   r   r   r"   r   urlrT   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  rT   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 }dd |D }tj|vr | d d S d| }ddi}| t}tt	||dV  W d    n1 sAw   Y  | 
|jjd	 d S )
N	localhostc                 S   s   h | ]}|d  qS )r   r#   ).0addrr#   r#   r$   	<setcomp>@  s    zEWebSocketTest.test_check_origin_invalid_subdomains.<locals>.<setcomp>z"localhost does not resolve to ipv4zws://localhost:%d/echor  zhttp://subtenant.localhostr   r  )r   r	   resolvesocketAF_INETskipTestr   r   r   r   r   r   r   )r"   r   addrinfofamiliesr  rT   r   r#   r#   r$   $test_check_origin_invalid_subdomains8  s   

z2WebSocketTest.test_check_origin_invalid_subdomainsc                 c   s>    | j dddgdV }| |jd | V }| |d d S )Nr   badprotor   )r   zsubprotocol=goodproto)r   r   r   r   r  r#   r#   r$   test_subprotocolsO  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_offeredX  r   z+WebSocketTest.test_subprotocols_not_offeredc                 c   sF    t  | _| dV }|dV  | j  | V }| |d d S )Nr   r   rf   )r   r   r   r4   setr   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   r   r  r#   r#   r$   test_error_in_openh     z WebSocketTest.test_error_in_openc                 c   r,  )Nr   r   r-  r  r#   r#   r$   test_error_in_async_openo  r/  z&WebSocketTest.test_error_in_async_openc                 c   r  )Nr   r   r  r  r#   r#   r$   test_nodelayv  r	  zWebSocketTest.test_nodelay)*r/   r0   r1   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.  r0  r1  r   r#   r#   r~   r$   r      s    8









	
	



















r   c                       s$   e Zd Z fddZdd Z  ZS )NativeCoroutineOnMessageHandlerc                    rw   rx   ry   r|   r~   r#   r$   r%   ~  r   z*NativeCoroutineOnMessageHandler.initializec                    sP   | j dkr| d |  j d7  _ tdI d H  |  j d8  _ | | d S r   r   r9   r#   r#   r$   r;     s   

z*NativeCoroutineOnMessageHandler.on_message)r/   r0   r1   r%   r;   r   r#   r#   r~   r$   r2  }  s    r2  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   r2  r'   r#   r#   r$   r     rg   z$WebSocketNativeCoroutineTest.get_appc                 c   r
  )Nr5  r  r  r   r  r#   r#   r$   test_native_coroutine  r  z2WebSocketNativeCoroutineTest.test_native_coroutineN)r/   r0   r1   r   r   r6  r#   r#   r#   r$   r4        r4  c                   @   sV   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d Z
e	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   )r4   strlenr9   r#   r#   r$   r;     s   z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r/   r0   r1   propertyr:  r;   r#   r#   r#   r$   LimitedHandler  s    
r>  rj   r&   /limited)r   r   r3   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   rA  r   r#   r'   r#   r#   r$   get_client_compression_options  rB  z3CompressionTestMixin.get_client_compression_optionsbytes_in	bytes_outreturnNc                 C      t  r   NotImplementedErrorr"   rD  rE  r#   r#   r$   verify_wire_bytes  r)   z&CompressionTestMixin.verify_wire_bytesc                 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 )Nrj   r&      )r   rC  ranger4   MESSAGEr   r   protocol_message_bytes_outr<  _message_bytes_inrK  _wire_bytes_in_wire_bytes_outr"   r   ir   r#   r#   r$   test_message_sizes  s   
z'CompressionTestMixin.test_message_sizesc                 c   sX    | j d|  dV }|d | V }| |d |d | V }| | d S )Nr?  r&   ڀaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa128   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   rC  r4   r   r   r   r   r#   r#   r$   test_size_limit  s   



z$CompressionTestMixin.test_size_limit)r/   r0   r1   rN  r   r@  rC  intrK  r   rV  rZ  r#   r#   r#   r$   r8    s    
r8  c                   @   s   e Zd ZdZdd ZdS )UncompressedTestMixinzESpecialization of CompressionTestMixin when we expect no compression.c                 C   s8   |  |dt| jd   |  |dt| jd   d S )NrL        )r   r<  rN  rJ  r#   r#   r$   rK    s   z'UncompressedTestMixin.verify_wire_bytesN)r/   r0   r1   r2   rK  r#   r#   r#   r$   r\    s    r\  c                   @   s   e Zd ZdS )NoCompressionTestN)r/   r0   r1   r#   r#   r#   r$   r_    s    r_  c                   @   r=   )ServerOnlyCompressionTestc                 C      i S r   r#   r'   r#   r#   r$   r@    rB  z8ServerOnlyCompressionTest.get_server_compression_optionsN)r/   r0   r1   r@  r#   r#   r#   r$   r`    rB   r`  c                   @   r=   )ClientOnlyCompressionTestc                 C   ra  r   r#   r'   r#   r#   r$   rC    rB  z8ClientOnlyCompressionTest.get_client_compression_optionsN)r/   r0   r1   rC  r#   r#   r#   r$   rb    rB   rb  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DefaultCompressionTestc                 C   ra  r   r#   r'   r#   r#   r$   r@    rB  z5DefaultCompressionTest.get_server_compression_optionsc                 C   ra  r   r#   r'   r#   r#   r$   rC    rB  z5DefaultCompressionTest.get_client_compression_optionsc                 C   sH   |  |dt| jd   |  |dt| jd   | ||d  d S )NrL  r]  r^     )
assertLessr<  rN  r   rJ  r#   r#   r$   rK    s   z(DefaultCompressionTest.verify_wire_bytesN)r/   r0   r1   r@  rC  rK  r#   r#   r#   r$   rc    s    rc  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datarF  c                 C   rG  r   rH  r"   rg  rh  r#   r#   r$   rg  	  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   rg  r'   r#   r#   r$   	test_mask  s   

zMaskFunctionMixin.test_maskN)r/   r0   r1   r6   rg  typingAnyrm  r#   r#   r#   r$   rf    s    rf  c                   @   r=   )PythonMaskFunctionTestc                 C   s
   t ||S r   r   ri  r#   r#   r$   rg    s   
zPythonMaskFunctionTest.maskNr/   r0   r1   rg  r#   r#   r#   r$   rp    rB   rp  z#tornado.speedups module not presentc                   @   r=   )CythonMaskFunctionTestc                 C   s   t ||S r   )r   websocket_maskri  r#   r#   r$   rg  %  r@   zCythonMaskFunctionTest.maskNrq  r#   r#   r#   r$   rr  #  s    rr  c                   @   r3  )ServerPeriodicPingTestc                 C   s$   G dd dt }td|fgdddS )Nc                   @   r=   )z3ServerPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   re   )Ngot pongrs   r"   rh  r#   r#   r$   on_pong,  rg   z;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pongN)r/   r0   r1   rw  r#   r#   r#   r$   PingHandler+  rB   rx  /r   r   )websocket_ping_intervalwebsocket_ping_timeoutr   r   r"   rx  r#   r#   r$   r   *  s   zServerPeriodicPingTest.get_appc                 c   s6    |  dV }tdD ]}| V }| |d qd S )Nry  rL  ru  )r   rM  r   r   rT  r#   r#   r$   test_server_ping5  s   
z'ServerPeriodicPingTest.test_server_pingN)r/   r0   r1   r   r   r~  r#   r#   r#   r$   rt  )  s    rt  c                   @   r3  )ClientPeriodicPingTestc                 C      G dd dt }td|fgS )Nc                   @   r=   )z3ClientPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   re   )Ngot pingrs   rv  r#   r#   r$   on_pingA  rg   z;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingNr/   r0   r1   r  r#   r#   r#   r$   rx  @  rB   rx  ry  r|  r}  r#   r#   r$   r   ?     zClientPeriodicPingTest.get_appc                 c   sD    | j ddddV }tdD ]}| V }| |d q|  d S )Nry  r   r   ping_intervalping_timeoutrL  r  )r   rM  r   r   ro   rT  r#   r#   r$   test_client_pingF  s   
z'ClientPeriodicPingTest.test_client_pingN)r/   r0   r1   r   r   r  r#   r#   r#   r$   r  >      r  c                   @   s,   e Zd Zdd Zedd Zedd ZdS )ServerPingTimeoutTestc                    s0   g | _ |  G  fdddt}td|fg}|S )Nc                       s    e Zd Zd fdd	Z  ZS )z2ServerPingTimeoutTest.get_app.<locals>.PingHandlerNc                    s$   j | _ | j |  t j||dS )Nr   )handlersr   rz   r%   r!   )r   r   r#   r$   r%   U  s
   z=ServerPingTimeoutTest.get_app.<locals>.PingHandler.initializer.   )r/   r0   r1   r%   r   r#   r   r~   r$   rx  T  s    rx  ry  )r  r   r   )r"   rx  appr#   r  r$   r   P  s
   	zServerPingTimeoutTest.get_appc                    s,   d _ d _ fdd}| jj j_dS )z1Optionally suppress the client's "pong" response.Fr   c                    s   dt dtf fdd}|S )Nopcoderh  c                    s*   | dkr j d7  _ jrd S  | |S )N
   r?   )pongs_received
drop_pongs)r  rh  )fcnr   r#   r$   _innerh  s
   
zCServerPingTimeoutTest.install_hook.<locals>.wrapper.<locals>._inner)r[  r6   )r  r  r   )r  r$   wrapperg  s   	z3ServerPingTimeoutTest.install_hook.<locals>.wrapperN)r  r  rO  _handle_message)r   r  r#   r  r$   install_hook`  s   z"ServerPingTimeoutTest.install_hookc                 c   s    d}| j d||d dV }| | | jd }tdD ]}t|V  | |j | |j |j	jd u s8J q| 
|jd d|_t|d V  | |jd	 | |jd
 | |j	jd	 d S )Ng?ry     r  r      Tg      ?i  zping timed out)r   r  r  rM  r   r   r   r+   r,   rO  assertGreaterEqualr  r  r   )r"   intervalr   handler_r#   r#   r$   test_client_ping_timeoutu  s$   


z.ServerPingTimeoutTest.test_client_ping_timeoutN)r/   r0   r1   r   staticmethodr  r   r  r#   r#   r#   r$   r  O  s    
r  c                   @   r=   )PingCalculationTestc              	   C   sp   ddl m} tjddddddtjjd}d}tjddddd	d
tjjd}|j| || d}| |d d S )Nr   )WebSocketProtocol13i  r?   rd  )tzinfor     ;   6   )last_ping_timer  nowr  )tornado.websocketr  datetimetimezoneutcping_sleep_time	timestampr   )r"   r  r  r  r  
sleep_timer#   r#   r$   test_ping_sleep_time  s   z(PingCalculationTest.test_ping_sleep_timeN)r/   r0   r1   r  r#   r#   r#   r$   r    rB   r  c                   @   r3  )ManualPingTestc                 C   r  )Nc                   @   r=   )z+ManualPingTest.get_app.<locals>.PingHandlerc                 S   s   | j |t|td d S )Nr   )r4   r5   r6   rv  r#   r#   r$   r    r   z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNr  r#   r#   r#   r$   rx    rB   rx  ry  r|  r}  r#   r#   r$   r     r  zManualPingTest.get_appc                 c   sb    |  dV }| t|jd |d | V }| |d |d | V }| |d d S )Nry  ~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   r   
ValueErrorpingr   r   )r"   r   respr#   r#   r$   test_manual_ping  s   



zManualPingTest.test_manual_pingN)r/   r0   r1   r   r   r  r#   r#   r#   r$   r    r  r  c                   @   r3  )MaxMessageSizeTestc                 C   s   t dtfgddS )Nry  r9  )websocket_max_message_size)r   r3   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 )Nry     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r4   r   r   r   r+   r,   )r"   r   r   r  r#   r#   r$   test_large_message  s   


z%MaxMessageSizeTest.test_large_messageN)r/   r0   r1   r   r   r  r#   r#   r#   r$   r    r7  r  )Ur7   r   r  rH   r!  	tracebackrn  unittesttornado.concurrentr   tornador   tornado.httpclientr   r   tornado.locksr   tornado.logr   r   tornado.netutilr	   tornado.simple_httpclientr   tornado.templater   tornado.test.utilr   r   tornado.testingr   r   r   r   tornado.webr   r   r  tornado.utilr   ImportError	print_excr   r   r   r   r   r   r3   r>   rC   rZ   rd   ri   rk   rp   rt   rv   r   r   r   r   r   r   r   r   r2  r4  r8  r\  r_  r`  rb  rc  TestCaserf  rp  skipIfrr  rt  r  r  r  r  r  r#   r#   r#   r$   <module>   s    
	   C	O