o
    Qœ_Hm  ã                   @   sb  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 yn   e !¡  ‚ w d dlm"Z"m#Z#m$Z$m%Z% zd dlm&Z& W n e yŽ   dZ&Y nw G dd„ de"ƒZ'G dd„ de'ƒZ(G dd„ de'ƒZ)G dd„ de'ƒZ*G dd„ de'ƒZ+G dd„ deƒ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u 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 )
ÚTestWebSocketHandlerzšBase 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   ú=/usr/lib/python3/dist-packages/tornado/test/websocket_test.pyÚ
initialize1   s   
zTestWebSocketHandler.initializec                 C   s   | j S r   ©r   ©r   r   r   r   Úget_compression_options5   ó   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_close8   s   
ÿzTestWebSocketHandler.on_close)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r#   r(   r   r   r   r   r   )   s
    
r   c                   @   ó   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_message>   s   €ÿzEchoHandler.on_messageN)r)   r*   r+   r   Ú	coroutiner6   r   r   r   r   r.   =   ó    r.   c                   @   ó   e Zd Zdd„ ZdS )ÚErrorInOnMessageHandlerc                 C   s   dd  d S )Né   r   r   r4   r   r   r   r6   I   ó   z"ErrorInOnMessageHandler.on_messageN©r)   r*   r+   r6   r   r   r   r   r:   H   ó    r:   c                   @   r9   )ÚHeaderHandlerc              	   C   s�   t  | jd¡t  | jd¡t  | jdd¡t  | jdd¡t  | jd¡| j| jg}|D ]}z|ƒ  t	dƒ‚ t
y:   Y q(w |  | jj dd¡¡ d S )	NzThis should not workzhttp://localhost/elsewhereúX-TestÚ Ú	ChocolateÚChipi÷  zdid not get expected exception)Ú	functoolsÚpartialÚwriteÚredirectÚ
set_headerÚ
set_cookieÚ
set_statusÚflushÚfinishÚ	ExceptionÚRuntimeErrorr/   ÚrequestÚheadersÚget)r   Úmethods_to_testÚmethodr   r   r   ÚopenN   s    ù	ÿzHeaderHandler.openN©r)   r*   r+   rT   r   r   r   r   r?   M   r>   r?   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚHeaderEchoHandlerc                 C   s   |   dd¡ d S )NúX-Extra-Response-HeaderúExtra-Response-Value)rH   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)rO   rP   Úget_allÚlowerÚ
startswithrH   )r   ÚkÚvr   r   r   Úprepareg   s
   €þzHeaderEchoHandler.prepareN)r)   r*   r+   rY   r_   r   r   r   r   rV   c   s    rV   c                   @   r9   )ÚNonWebSocketHandlerc                 C   ó   |   d¡ d S )NÚok)rF   r"   r   r   r   rQ   n   ó   zNonWebSocketHandler.getN©r)   r*   r+   rQ   r   r   r   r   r`   m   r>   r`   c                   @   r9   )ÚRedirectHandlerc                 C   ra   )Nú/echo)rG   r"   r   r   r   rQ   s   rc   zRedirectHandler.getNrd   r   r   r   r   re   r   r>   re   c                   @   r9   )ÚCloseReasonHandlerc                 C   s   d| _ |  dd¡ d S )NFéé  Úgoodbye)Úon_close_calledÚcloser"   r   r   r   rT   x   s   zCloseReasonHandler.openNrU   r   r   r   r   rg   w   r>   rg   c                   @   s"   e Zd Zejdd„ ƒZdd„ ZdS )ÚAsyncPrepareHandlerc                 c   s   � t jV  d S r   )r   Úmomentr"   r   r   r   r_   ~   s   €zAsyncPrepareHandler.preparec                 C   ó   |   |¡ d S r   ©r/   r4   r   r   r   r6   ‚   rc   zAsyncPrepareHandler.on_messageN)r)   r*   r+   r   r7   r_   r6   r   r   r   r   rl   }   s    
rl   c                   @   r9   )ÚPathArgsHandlerc                 C   rn   r   ro   )r   Úargr   r   r   rT   ‡   rc   zPathArgsHandler.openNrU   r   r   r   r   rp   †   r>   rp   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;   ç{®Gáz„?©rw   r/   r   Úsleepr4   r   r   r   r6   �   s   €

z$CoroutineOnMessageHandler.on_message)r)   r*   r+   r    r   r7   r6   Ú__classcell__r   r   rz   r   rr   ‹   s    rr   c                   @   r9   )ÚRenderMessageHandlerc                 C   s   |   | jd|d�¡ d S )Númessage.html)r5   )r/   Úrender_stringr4   r   r   r   r6   ›   ó   zRenderMessageHandler.on_messageNr=   r   r   r   r   r‚   š   r>   r‚   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚSubprotocolHandlerc                    rs   ©NFr   )rv   r    Úselect_subprotocol_calledrx   rz   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ˆ   rM   )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ˆ   rM   r/   Úselected_subprotocolr"   r   r   r   rT   ¬   s   zSubprotocolHandler.open)r)   r*   r+   r    r‹   rT   r�   r   r   rz   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‡   )rv   r    ÚtestÚopen_finished)r   rŽ   ry   rz   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   rT   ¸   s   €
zOpenCoroutineHandler.openc                 C   s   | j stdƒ‚|  d¡ d S )Nz&on_message called before open finishedrb   )r�   rM   r/   r4   r   r   r   r6   ¾   s   zOpenCoroutineHandler.on_message)	r)   r*   r+   r    r   r7   rT   r6   r�   r   r   rz   r   r�   ²   s
    
r�   c                   @   r9   )ÚErrorInOpenHandlerc                 C   s   t dƒ‚)NÚboom)rM   r"   r   r   r   rT   Å   s   zErrorInOpenHandler.openNrU   r   r   r   r   r’   Ä   r>   r’   c                   @   r9   )ÚErrorInAsyncOpenHandlerc                 Ã   s   �t  d¡I d H  tdƒ‚)Nr   r“   )r2   r€   rM   r"   r   r   r   rT   Ê   s   €zErrorInAsyncOpenHandler.openNrU   r   r   r   r   r”   É   r>   r”   c                   @   r9   )ÚNoDelayHandlerc                 C   s   |   d¡ |  d¡ d S )NTÚhello)Úset_nodelayr/   r"   r   r   r   rT   Ð   ó   
zNoDelayHandler.openNrU   r   r   r   r   r•   Ï   r>   r•   c                   @   r-   )ÚWebSocketBaseTestCasec                 k   s*   � t d|  ¡ |f fi |¤ŽV }t |¡‚)Nzws://127.0.0.1:%d%s)r   Úget_http_portr   ÚReturn)r   Úpathry   Úwsr   r   r   Ú
ws_connectÖ   s   €ÿÿ
z WebSocketBaseTestCase.ws_connectN)r)   r*   r+   r   r7   rž   r   r   r   r   r™   Õ   r8   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'‡  Z(S )IÚ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 )Nrf   )r   ú/non_wsú	/redirectz/headerz/header_echoú/close_reasonú/error_in_on_messageú/async_preparez/path_args/(.*)ú
/coroutineú/renderú/subprotocolú/open_coroutine)r   rŽ   ú/error_in_openú/error_in_async_openú/nodelayrƒ   z<b>{{ message }}</b>)Útemplate_loader)r   r   r   r.   Údictr`   re   r?   rV   rg   r:   rl   rp   rr   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   )rv   ÚtearDownr   Ú_template_loadersÚclearr"   rz   r   r   r°     r˜   zWebSocketTest.tearDownc                 C   s   |   d¡}|  |jd¡ d S )Nrf   é�  ©Ú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 )Nrf   ÚUpgradeÚ	WebSocketÚ13©Ú
Connectionr¼   zSec-WebSocket-Version©rP   r³   r´   r¸   r   r   r   Útest_missing_websocket_key$  ó   ýþz(WebSocketTest.test_missing_websocket_keyc                 C   r»   )Nrf   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 )Nrf   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  s    z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>)r   rš   rÌ   r‘   Úresultr/   rÇ   r¶   r   Úadd_done_callbackrk   rÈ   r   r"   r   Útest_websocket_callbacksA  s   ÿ
z&WebSocketTest.test_websocket_callbacksc                 c   s6   � |   d¡V }|jddd� | ¡ V }|  |d¡ d S )Nrf   s   hello éT©ÚbinaryrÆ   rÈ   r   r   r   Útest_binary_messageN  ó
   €
z!WebSocketTest.test_binary_messagec                 c   ó2   � |   d¡V }| d¡ | ¡ V }|  |d¡ d S )Nrf   u   hello Ã©rÆ   rÈ   r   r   r   Útest_unicode_messageU  ó
   €

z"WebSocketTest.test_unicode_messagec                 c   s2   � |   d¡V }| d¡ | ¡ V }|  |d¡ d S )Nr¦   r–   z<b>hello</b>rÆ   rÈ   r   r   r   Útest_render_message\  rØ   z!WebSocketTest.test_render_messagec                 c   s\   � |   d¡V }| d¡ ttdƒ� | ¡ V }W d   ƒ n1 s!w   Y  |  |d ¡ d S )Nr£   r–   úUncaught exception)rž   r/   r   r   rÇ   ÚassertIsrÈ   r   r   r   Útest_error_in_on_messagec  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”  )ÚassertRaisesr   rž   r¶   Ú	exceptionr·   )r   Úcmr   r   r   Útest_websocket_http_failk  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_successq  ó   €"ÿz)WebSocketTest.test_websocket_http_successc                 c   rá   )Nr¡   )rÝ   r   rž   r"   r   r   r   Útest_websocket_http_redirectv  rã   z*WebSocketTest.test_websocket_http_redirectc              	   c   s�   � t ƒ \}}| ¡  |  t¡�/ ttdƒ� td| dd�V  W d   ƒ n1 s)w   Y  W d   ƒ d S W d   ƒ d S 1 sAw   Y  d S )Nz.*zws://127.0.0.1:%d/i  )Úconnect_timeout)r   rk   rÝ   ÚIOErrorr   r   r   )r   ÚsockÚportr   r   r   Útest_websocket_network_fail{  s   €

ÿÿÿ"ÿz)WebSocketTest.test_websocket_network_failc                 c   s6   � t d|  ¡  ƒV }| d¡ | d¡ |j ¡  d S )NrÊ   r–   Úworld)r   rš   r/   Ústreamrk   ©r   r�   r   r   r   Ú"test_websocket_close_buffered_data…  s
   €

z0WebSocketTest.test_websocket_close_buffered_datac                 c   s:   � t td|  ¡  ddid�ƒV }| ¡ V }|  |d¡ d S )Nzws://127.0.0.1:%d/headerr@   r–   rÁ   )r   r   rš   rÇ   r¶   rÈ   r   r   r   Útest_websocket_headers�  s   €
þÿ
z$WebSocketTest.test_websocket_headersc                 c   sL   � 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Á   rW   rX   )r   r   rš   r¶   rP   rQ   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¢   rh   ri   )rž   rÇ   rÛ   r¶   r&   r'   r   )r   r�   Úmsgr·   Úreasonr   r   r   Útest_server_close_reason©  s   €
z&WebSocketTest.test_server_close_reasonc                 c   sB   � |   d¡V }| dd¡ | jV \}}|  |d¡ |  |d¡ d S )Nrf   rh   ri   )rž   rk   r   r¶   )r   r�   r·   rñ   r   r   r   Útest_client_close_reason¸  s   €z&WebSocketTest.test_client_close_reasonc                 c   s^   � |   d¡V }| ¡ V }|  |d ¡ |  t¡� | d¡ W d   ƒ d S 1 s(w   Y  d S )Nr¢   r–   )rž   rÇ   rÛ   rÝ   r   r/   )r   r�   rð   r   r   r   Útest_write_after_closeÀ  s   €
"ÿz$WebSocketTest.test_write_after_closec                 c   rÖ   )Nr¤   r–   rÆ   ©r   r�   Úresr   r   r   Útest_async_prepareÈ  s
   €

z WebSocketTest.test_async_preparec                 c   ó(   � |   d¡V }| ¡ V }|  |d¡ d S )Nz/path_args/hellor–   ©rž   rÇ   r¶   rõ   r   r   r   Útest_path_argsÑ  ó   €
zWebSocketTest.test_path_argsc                 c   óV   � |   d¡V }| d¡V  | d¡V  | ¡ V }|  |d¡ | ¡ V }|  |d¡ d S )Nr¥   Úhello1Úhello2rÆ   rõ   r   r   r   Útest_coroutine×  ó   €

zWebSocketTest.test_coroutinec                 c   óT   � |   ¡ }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è   ÚurlrP   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  rP   rß   r   r   r   Ú%test_check_origin_invalid_partial_urlú  s   €ÿz3WebSocketTest.test_check_origin_invalid_partial_urlc                 c   ój   � |   ¡ }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  ó   €ÿz'WebSocketTest.test_check_origin_invalidc                 c   r  )Nzws://localhost:%d/echor  zhttp://subtenant.localhostrÁ   r	  r
  r  r   r   r   Ú$test_check_origin_invalid_subdomains  r  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_subprotocols!  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_offered*  rÕ   z+WebSocketTest.test_subprotocols_not_offeredc                 c   sF   � t ƒ | _|  d¡V }| d¡V  | j ¡  | ¡ V }|  |d¡ d S )Nr¨   r–   rb   )r   r�   rž   r/   ÚsetrÇ   r¶   rõ   r   r   r   Útest_open_coroutine1  s   €

z!WebSocketTest.test_open_coroutinec                 c   óP   � t tdƒ� |  d¡V }| ¡ V }W d   ƒ n1 sw   Y  |  |¡ d S )NrÚ   r©   ©r   r   rž   rÇ   ÚassertIsNonerõ   r   r   r   Útest_error_in_open:  ó   €þz WebSocketTest.test_error_in_openc                 c   r  )NrÚ   rª   r  rõ   r   r   r   Útest_error_in_async_openA  r  z&WebSocketTest.test_error_in_async_openc                 c   rø   )Nr«   r–   rù   rõ   r   r   r   Útest_nodelayH  rû   zWebSocketTest.test_nodelay))r)   r*   r+   r®   r¯   r°   rº   rÂ   rÅ   r   rÉ   rÑ   rÔ   r×   rÙ   rÜ   rà   râ   rä   ré   rí   rî   rï   rò   ró   rô   r÷   rú   rÿ   r  r  r  r  r  r  r  r  r  r  r  r�   r   r   rz   r   rŸ   Þ   s„    8








	




















rŸ   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚNativeCoroutineOnMessageHandlerc                    rs   rt   ru   rx   rz   r   r   r    P  r|   z*NativeCoroutineOnMessageHandler.initializec                 Ã   sP   �| j dkr|  d¡ |  j d7  _ t d¡I d H  |  j d8  _ |  |¡ d S r}   r   r4   r   r   r   r6   T  s   €

z*NativeCoroutineOnMessageHandler.on_message)r)   r*   r+   r    r6   r�   r   r   rz   r   r  O  s    r  c                   @   ó    e Zd Zdd„ Zedd„ ƒZdS )ÚWebSocketNativeCoroutineTestc                 C   s   t dtfgƒS )Nú/native)r   r  r"   r   r   r   r®   ^  rc   z$WebSocketNativeCoroutineTest.get_appc                 c   rü   )Nr   rý   rþ   rÆ   rõ   r   r   r   Útest_native_coroutinea  r   z2WebSocketNativeCoroutineTest.test_native_coroutineN)r)   r*   r+   r®   r   r!  r   r   r   r   r  ]  ó    r  c                   @   sf   e Zd ZdZdd„ Zdd„ Zdd„ Zded	ed
dfdd„Ze	de
jfdd„ƒZe	de
jfdd„ƒZdS )ÚCompressionTestMixinzHello world. Testing 123 123c                 C   s<   G dd„ dt ƒ}tdtt|  ¡ d�fd|t|  ¡ d�fgƒS )Nc                   @   s    e Zd Zedd„ ƒZdd„ ZdS )z4CompressionTestMixin.get_app.<locals>.LimitedHandlerc                 S   s   dS )Né   r   r"   r   r   r   Úmax_message_sizer  s   zECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_sizec                 S   s   |   tt|ƒƒ¡ d S r   )r/   ÚstrÚlenr4   r   r   r   r6   v  s   z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r)   r*   r+   Úpropertyr%  r6   r   r   r   r   ÚLimitedHandlerq  s    
r)  rf   r!   ú/limited)r   r   r.   r­   Úget_server_compression_options)r   r)  r   r   r   r®   p  s   ýýúÿzCompressionTestMixin.get_appc                 C   ó   d S r   r   r"   r   r   r   r+  ˆ  ó   z3CompressionTestMixin.get_server_compression_optionsc                 C   r,  r   r   r"   r   r   r   Úget_client_compression_options‹  r-  z3CompressionTestMixin.get_client_compression_optionsÚbytes_inÚ	bytes_outÚreturnNc                 C   ó   t ƒ ‚r   ©ÚNotImplementedError©r   r/  r0  r   r   r   Úverify_wire_bytesŽ  r$   z&CompressionTestMixin.verify_wire_bytesr   c                 c   s”   � | j d|  ¡ d�V }tdƒD ]}| | j¡ | ¡ V }|  || j¡ q|  |jjt	| jƒd ¡ |  |jj
t	| jƒd ¡ |  |jj|jj¡ d S )Nrf   r!   é   )rž   r.  Úranger/   ÚMESSAGErÇ   r¶   ÚprotocolÚ_message_bytes_outr'  Ú_message_bytes_inr6  Ú_wire_bytes_inÚ_wire_bytes_out©r   r�   Úir¹   r   r   r   Útest_message_sizes‘  s   €ÿ
z'CompressionTestMixin.test_message_sizesc                 c   sX   � | j d|  ¡ d�V }| d¡ | ¡ V }|  |d¡ | d¡ | ¡ V }|  |¡ d S )Nr*  r!   Ú€aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÚ128Á   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)rž   r.  r/   rÇ   r¶   r  rÈ   r   r   r   Útest_size_limit   s   €ÿ



z$CompressionTestMixin.test_size_limit)r)   r*   r+   r9  r®   r+  r.  Úintr6  r   ÚtypingÚAnyrA  rE  r   r   r   r   r#  m  s    r#  c                   @   s    e Zd ZdZdejfdd„ZdS )ÚUncompressedTestMixinzESpecialization of CompressionTestMixin when we expect no compression.r   c                 C   s8   |   |dt| jƒd  ¡ |   |dt| jƒd  ¡ d S )Nr7  é   é   )r¶   r'  r9  r5  r   r   r   r6  ³  s   z'UncompressedTestMixin.verify_wire_bytesN)r)   r*   r+   r,   rG  rH  r6  r   r   r   r   rI  °  s    rI  c                   @   s   e Zd ZdS )ÚNoCompressionTestN)r)   r*   r+   r   r   r   r   rL  ¹  s    rL  c                   @   r9   )ÚServerOnlyCompressionTestc                 C   ó   i S r   r   r"   r   r   r   r+  ¿  r-  z8ServerOnlyCompressionTest.get_server_compression_optionsN)r)   r*   r+   r+  r   r   r   r   rM  ¾  r>   rM  c                   @   r9   )ÚClientOnlyCompressionTestc                 C   rN  r   r   r"   r   r   r   r.  Ä  r-  z8ClientOnlyCompressionTest.get_client_compression_optionsN)r)   r*   r+   r.  r   r   r   r   rO  Ã  r>   rO  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultCompressionTestc                 C   rN  r   r   r"   r   r   r   r+  É  r-  z5DefaultCompressionTest.get_server_compression_optionsc                 C   rN  r   r   r"   r   r   r   r.  Ì  r-  z5DefaultCompressionTest.get_client_compression_optionsc                 C   sH   |   |dt| jƒd  ¡ |   |dt| jƒd  ¡ |  ||d ¡ d S )Nr7  rJ  rK  é   )Ú
assertLessr'  r9  r¶   r5  r   r   r   r6  Ï  s   z(DefaultCompressionTest.verify_wire_bytesN)r)   r*   r+   r+  r.  r6  r   r   r   r   rP  È  s    rP  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Údatar1  c                 C   r2  r   r3  ©r   rT  rU  r   r   r   rT  Ø  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¶   rT  r"   r   r   r   Ú	test_maskÛ  s   
þ
þzMaskFunctionMixin.test_maskN)r)   r*   r+   r1   rT  rG  rH  rZ  r   r   r   r   rS  Ö  s    rS  c                   @   r9   )ÚPythonMaskFunctionTestc                 C   s
   t ||ƒS r   r   rV  r   r   r   rT  î  s   
zPythonMaskFunctionTest.maskN©r)   r*   r+   rT  r   r   r   r   r[  í  r>   r[  z#tornado.speedups module not presentc                   @   r9   )ÚCythonMaskFunctionTestc                 C   s   t  ||¡S r   )r   Úwebsocket_maskrV  r   r   r   rT  ô  r<   zCythonMaskFunctionTest.maskNr\  r   r   r   r   r]  ò  s    r]  c                   @   r  )ÚServerPeriodicPingTestc                 C   s"   G dd„ dt ƒ}td|fgdd�S )Nc                   @   r9   )z3ServerPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   ra   )Núgot pongro   ©r   rU  r   r   r   Úon_pongû  rc   z;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pongN)r)   r*   r+   rb  r   r   r   r   ÚPingHandlerú  r>   rc  ú/r~   )Úwebsocket_ping_interval©r   r   ©r   rc  r   r   r   r®   ù  s   zServerPeriodicPingTest.get_appc                 c   s6   � |   d¡V }tdƒD ]}| ¡ V }|  |d¡ qd S )Nrd  r7  r`  ©rž   r8  rÇ   r¶   r?  r   r   r   Útest_server_ping   s   €
þz'ServerPeriodicPingTest.test_server_pingN)r)   r*   r+   r®   r   ri  r   r   r   r   r_  ø  ó    r_  c                   @   r  )ÚClientPeriodicPingTestc                 C   ó   G dd„ dt ƒ}td|fgƒS )Nc                   @   r9   )z3ClientPeriodicPingTest.get_app.<locals>.PingHandlerc                 S   ra   )Núgot pingro   ra  r   r   r   Úon_ping  rc   z;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingN©r)   r*   r+   rn  r   r   r   r   rc    r>   rc  rd  rf  rg  r   r   r   r®   
  ó   zClientPeriodicPingTest.get_appc                 c   s:   � | j ddd�V }tdƒD ]}| ¡ V }|  |d¡ qd S )Nrd  r~   )Úping_intervalr7  rm  rh  r?  r   r   r   Útest_client_ping  s   €
þz'ClientPeriodicPingTest.test_client_pingN)r)   r*   r+   r®   r   rr  r   r   r   r   rk  	  rj  rk  c                   @   r  )ÚManualPingTestc                 C   rl  )Nc                   @   r9   )z+ManualPingTest.get_app.<locals>.PingHandlerc                 S   s   | j |t|tƒd� d S )NrÒ   )r/   r0   r1   ra  r   r   r   rn    r…   z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNro  r   r   r   r   rc    r>   rc  rd  rf  rg  r   r   r   r®     rp  zManualPingTest.get_appc                 c   sb   � |   d¡V }|  t|jd¡ | d¡ | ¡ V }|  |d¡ | d¡ | ¡ V }|  |d¡ d S )Nrd  Ú~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)   r*   r+   r®   r   rx  r   r   r   r   rs    rj  rs  c                   @   r  )ÚMaxMessageSizeTestc                 C   s   t dtfgdd�S )Nrd  r$  )Úwebsocket_max_message_size)r   r.   r"   r   r   r   r®   3  s   zMaxMessageSizeTest.get_appc                 c   sv   � |   d¡V }d}| |¡ | ¡ V }|  ||¡ | |d ¡ | ¡ V }|  |d ¡ |  |jd¡ |  |jd¡ d S )Nrd  Á   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÚbiñ  zmessage too big)rž   r/   rÇ   r¶   rÛ   r&   r'   )r   r�   rð   rw  r   r   r   Útest_large_message6  s   €


z%MaxMessageSizeTest.test_large_messageN)r)   r*   r+   r®   r   r}  r   r   r   r   ry  2  r"  ry  )Lr2   rD   Ú	tracebackrG  ÚunittestÚtornado.concurrentr   Útornador   Útornado.httpclientr   r   Útornado.locksr   Útornado.logr   r   Útornado.simple_httpclientr
   Útornado.templater   Útornado.testingr   r   r   r   Útornado.webr   r   Útornado.websocketÚtornado.utilr   ÚImportErrorÚ	print_excr   r   r   r   r   r   r.   r:   r?   rV   r`   re   rg   rl   rp   rr   r‚   r†   r�   r’   r”   r•   r™   rŸ   r  r  Úobjectr#  rI  rL  rM  rO  rP  rS  ÚTestCaser[  ÚskipIfr]  r_  rk  rs  ry  r   r   r   r   Ú<module>   s€    úÿ
		  sC	