U
    lufûr  ã                   @   sˆ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZ d dlmZm Z  zd dl!Z	d dl"m#Z# W n e$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
rB   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 ƒZ0G dd„ de ƒZ1G dd„ de+ƒZ2G dd „ d e+ƒZ3G d!d"„ d"e+ƒZ4G d#d$„ d$e+ƒZ5G d%d&„ d&e+ƒZ6G d'd(„ d(e+ƒZ7G d)d*„ d*e+ƒZ8G d+d,„ d,e+ƒZ9G d-d.„ d.e+ƒZ:G d/d0„ d0e+ƒZ;G d1d2„ d2eƒZ<G d3d4„ d4e<ƒZ=G d5d6„ d6e+ƒZ>G d7d8„ d8e<ƒZ?G d9d:„ d:e@ƒZAG d;d<„ d<eAƒZBG d=d>„ d>eBe<ƒZCG d?d@„ d@eBe<ƒZDG dAdB„ dBeBe<ƒZEG dCdD„ dDeAe<ƒZFG dEdF„ dFe@ƒZGG dGdH„ dHeGejHƒZIe Je*dkdI¡G dJdK„ dKeGejHƒƒZKG dLdM„ dMe<ƒZLG dNdO„ dOe<ƒZMG dPdQ„ dQe<ƒZNG dRdS„ dSe<ƒZOdS )Té    N)ÚFuture)Úgen)Ú	HTTPErrorÚHTTPRequest)ÚEvent)Úgen_logÚapp_log)ÚResolver©ÚSimpleAsyncHTTPClient)Ú
DictLoader)ÚAsyncHTTPTestCaseÚgen_testÚbind_unused_portÚ	ExpectLog)ÚApplicationÚRequestHandler©Ú_websocket_mask_python)ÚWebSocketHandlerÚwebsocket_connectÚWebSocketErrorÚWebSocketClosedError)Úspeedupsc                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
Ú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   ú?/tmp/pip-unpacked-wheel-bmg6zs32/tornado/test/websocket_test.pyÚ
initialize4   s    zTestWebSocketHandler.initializec                 C   s   | j S r   ©r   ©r   r   r   r    Úget_compression_options8   s    z,TestWebSocketHandler.get_compression_optionsc                 C   s"   | j d k	r| j  | j| jf¡ d S r   )r   Z
set_resultÚ
close_codeÚclose_reasonr#   r   r   r    Úon_close;   s    
zTestWebSocketHandler.on_close)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r$   r'   r   r   r   r    r   ,   s   
r   c                   @   s   e Zd Zejdd„ ƒZdS )ÚEchoHandlerc                 c   sF   z|   |t|tƒ¡V  W n( tjk
r.   Y n tk
r@   Y nX d S r   )Úwrite_messageÚ
isinstanceÚbytesÚasyncioZCancelledErrorr   ©r   Úmessager   r   r    Ú
on_messageA   s    zEchoHandler.on_messageN)r(   r)   r*   r   Ú	coroutiner3   r   r   r   r    r,   @   s   r,   c                   @   s   e Zd Zdd„ ZdS )ÚErrorInOnMessageHandlerc                 C   s   dd  d S )Né   r   r   r1   r   r   r    r3   L   s    z"ErrorInOnMessageHandler.on_messageN©r(   r)   r*   r3   r   r   r   r    r5   K   s   r5   c                   @   s   e Zd Zdd„ ZdS )ÚHeaderHandlerc              	   C   s˜   t  | jd¡t  | jd¡t  | jdd¡t  | jdd¡t  | jd¡| j| jg}|D ],}z|ƒ  t	dƒ‚W qP t
k
rz   Y qPX qP|  | jj dd¡¡ d S )	NzThis should not workzhttp://localhost/elsewhereúX-TestÚ Z	ChocolateZChipi÷  zdid not get expected exception)Ú	functoolsÚpartialÚwriteÚredirectÚ
set_headerÚ
set_cookieZ
set_statusÚflushÚfinishÚ	ExceptionÚRuntimeErrorr-   ÚrequestÚheadersÚget)r   Zmethods_to_testÚmethodr   r   r    ÚopenQ   s    ù	zHeaderHandler.openN©r(   r)   r*   rI   r   r   r   r    r8   P   s   r8   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚHeaderEchoHandlerc                 C   s   |   dd¡ d S )NúX-Extra-Response-HeaderúExtra-Response-Value)r?   r#   r   r   r    Úset_default_headersg   s    z%HeaderEchoHandler.set_default_headersc                 C   s4   | j j ¡ D ]"\}}| ¡  d¡r|  ||¡ qd S )Nzx-test)rE   rF   Úget_allÚlowerÚ
startswithr?   )r   ÚkÚvr   r   r    Úpreparej   s    zHeaderEchoHandler.prepareN)r(   r)   r*   rN   rT   r   r   r   r    rK   f   s   rK   c                   @   s   e Zd Zdd„ ZdS )ÚNonWebSocketHandlerc                 C   s   |   d¡ d S )NÚok)r=   r#   r   r   r    rG   q   s    zNonWebSocketHandler.getN©r(   r)   r*   rG   r   r   r   r    rU   p   s   rU   c                   @   s   e Zd Zdd„ ZdS )ÚRedirectHandlerc                 C   s   |   d¡ d S )Nú/echo)r>   r#   r   r   r    rG   v   s    zRedirectHandler.getNrW   r   r   r   r    rX   u   s   rX   c                   @   s   e Zd Zdd„ ZdS )ÚCloseReasonHandlerc                 C   s   d| _ |  dd¡ d S )NFéé  Úgoodbye)Zon_close_calledÚcloser#   r   r   r    rI   {   s    zCloseReasonHandler.openNrJ   r   r   r   r    rZ   z   s   rZ   c                   @   s"   e Zd Zejdd„ ƒZdd„ ZdS )ÚAsyncPrepareHandlerc                 c   s   t jV  d S r   )r   Zmomentr#   r   r   r    rT      s    zAsyncPrepareHandler.preparec                 C   s   |   |¡ d S r   ©r-   r1   r   r   r    r3   …   s    zAsyncPrepareHandler.on_messageN)r(   r)   r*   r   r4   rT   r3   r   r   r   r    r^   €   s   
r^   c                   @   s   e Zd Zdd„ ZdS )ÚPathArgsHandlerc                 C   s   |   |¡ d S r   r_   )r   Úargr   r   r    rI   Š   s    zPathArgsHandler.openNrJ   r   r   r   r    r`   ‰   s   r`   c                       s*   e Zd Z‡ fdd„Zejdd„ ƒZ‡  ZS )ÚCoroutineOnMessageHandlerc                    s   t ƒ jf |Ž d| _d S ©Nr   ©Úsuperr!   Úsleeping©r   Úkwargs©Ú	__class__r   r    r!      s    z$CoroutineOnMessageHandler.initializec                 c   sJ   | j dkr|  d¡ |  j d7  _ t d¡V  |  j d8  _ |  |¡ d S ©Nr   z%another coroutine is already sleepingr6   ç{®Gáz„?©rf   r-   r   Úsleepr1   r   r   r    r3   “   s    

z$CoroutineOnMessageHandler.on_message)r(   r)   r*   r!   r   r4   r3   Ú__classcell__r   r   ri   r    rb   Ž   s   rb   c                   @   s   e Zd Zdd„ ZdS )ÚRenderMessageHandlerc                 C   s   |   | jd|d¡ d S )Númessage.html)r2   )r-   Zrender_stringr1   r   r   r    r3   ž   s    zRenderMessageHandler.on_messageNr7   r   r   r   r    rp      s   rp   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚSubprotocolHandlerc                    s   t ƒ jf |Ž d| _d S ©NF)re   r!   Úselect_subprotocol_calledrg   ri   r   r    r!   £   s    zSubprotocolHandler.initializec                 C   s$   | j rtdƒ‚d| _ d|kr dS d S )Nzselect_subprotocol called twiceTÚ	goodproto)rt   rC   )r   Úsubprotocolsr   r   r    Úselect_subprotocol§   s    z%SubprotocolHandler.select_subprotocolc                 C   s"   | j stdƒ‚|  d| j ¡ d S )Nzselect_subprotocol not calledzsubprotocol=%s)rt   rC   r-   Úselected_subprotocolr#   r   r   r    rI   ¯   s    zSubprotocolHandler.open)r(   r)   r*   r!   rw   rI   ro   r   r   ri   r    rr   ¢   s   rr   c                       s2   e Zd Z‡ fdd„Zejdd„ ƒZdd„ Z‡  ZS )ÚOpenCoroutineHandlerc                    s   t ƒ jf |Ž || _d| _d S rs   )re   r!   ÚtestÚopen_finished)r   rz   rh   ri   r   r    r!   ¶   s    zOpenCoroutineHandler.initializec                 c   s$   | j j ¡ V  t d¡V  d| _d S )Nrl   T)rz   Úmessage_sentÚwaitr   rn   r{   r#   r   r   r    rI   »   s    zOpenCoroutineHandler.openc                 C   s   | j stdƒ‚|  d¡ d S )Nz&on_message called before open finishedrV   )r{   rC   r-   r1   r   r   r    r3   Á   s    zOpenCoroutineHandler.on_message)	r(   r)   r*   r!   r   r4   rI   r3   ro   r   r   ri   r    ry   µ   s   
ry   c                   @   s   e Zd Zdd„ ZdS )ÚErrorInOpenHandlerc                 C   s   t dƒ‚d S )NÚboom)rC   r#   r   r   r    rI   È   s    zErrorInOpenHandler.openNrJ   r   r   r   r    r~   Ç   s   r~   c                   @   s   e Zd Zdd„ ZdS )ÚErrorInAsyncOpenHandlerc                 Ã   s   t  d¡I d H  tdƒ‚d S )Nr   r   )r0   rn   rC   r#   r   r   r    rI   Í   s    zErrorInAsyncOpenHandler.openNrJ   r   r   r   r    r€   Ì   s   r€   c                   @   s   e Zd Zdd„ ZdS )ÚNoDelayHandlerc                 C   s   |   d¡ |  d¡ d S )NTÚhello)Zset_nodelayr-   r#   r   r   r    rI   Ó   s    
zNoDelayHandler.openNrJ   r   r   r   r    r   Ò   s   r   c                       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   )re   ÚsetUpÚconns_to_closer#   ri   r   r    r„   Ù   s    
zWebSocketBaseTestCase.setUpc                    s"   | j D ]}| ¡  qtƒ  ¡  d S r   )r…   r]   re   ÚtearDown)r   Úconnri   r   r    r†   Ý   s    

zWebSocketBaseTestCase.tearDownc                 k   s4   t d|  ¡ |f f|ŽV }| j |¡ t |¡‚d S )Nzws://127.0.0.1:%d%s)r   Úget_http_portr…   Úappendr   ZReturn)r   Úpathrh   Úwsr   r   r    Ú
ws_connectâ   s    ÿÿz WebSocketBaseTestCase.ws_connect)	r(   r)   r*   r„   r†   r   r4   rŒ   ro   r   r   ri   r    rƒ   Ø   s   rƒ   c                       s´  e Zd Zdd„ Zdd„ Z‡ fdd„Zdd„ Zd	d
„ Zdd„ Ze	dd„ ƒZ
dd„ Ze	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd„ ƒZe	dd „ ƒZe	d!d"„ ƒZe	d#d$„ ƒZe	d%d&„ ƒZe	d'd(„ ƒZe	d)d*„ ƒZe	d+d,„ ƒZe	d-d.„ ƒZe	d/d0„ ƒZe	d1d2„ ƒZe	d3d4„ ƒZe	d5d6„ ƒZe	d7d8„ ƒZe	d9d:„ ƒZ e	d;d<„ ƒZ!e	d=d>„ ƒZ"e	d?d@„ ƒZ#e	dAdB„ ƒZ$e	dCdD„ ƒZ%e	dEdF„ ƒZ&e	dGdH„ ƒZ'e	dIdJ„ ƒZ(‡  Z)S )KÚWebSocketTestc                 C   sì   t ƒ | _tdtt| jdfdtfdtfdtt| jdfdtt| jdfdt	t| jdfdt
t| jdfd	tt| jdfd
tt| jdfdtt| jdfdtt| jdfdtt| jdfdtt| j| dfdtfdtfdtfgtddiƒdS )NrY   )r   ú/non_wsú	/redirectz/headerz/header_echoú/close_reasonú/error_in_on_messageú/async_preparez/path_args/(.*)ú
/coroutineú/renderú/subprotocolú/open_coroutine)r   rz   ú/error_in_openú/error_in_async_openú/nodelayrq   z<b>{{ message }}</b>)Ztemplate_loader)r   r   r   r,   ÚdictrU   rX   r8   rK   rZ   r5   r^   r`   rb   rp   rr   ry   r~   r€   r   r   r#   r   r   r    Úget_appì   sZ    
ý
ý
ý
ý
ý
ý
ýýÐ2
ÍzWebSocketTest.get_appc                 C   s   t ƒ S r   r
   r#   r   r   r    Úget_http_client$  s    zWebSocketTest.get_http_clientc                    s   t ƒ  ¡  tj ¡  d S r   )re   r†   r   Z_template_loadersÚclearr#   ri   r   r    r†   (  s    
zWebSocketTest.tearDownc                 C   s   |   d¡}|  |jd¡ d S )NrY   é  ©ÚfetchÚassertEqualÚcode©r   Úresponser   r   r    Útest_http_request,  s    
zWebSocketTest.test_http_requestc                 C   s(   | j dddddœd}|  |jd¡ d S )NrY   ÚUpgradeÚ	WebSocketZ13©Ú
Connectionr¦   zSec-WebSocket-Version©rF   rž   rŸ   r£   r   r   r    Útest_missing_websocket_key1  s    ýþz(WebSocketTest.test_missing_websocket_keyc                 C   s(   | j dddddœd}|  |jd¡ d S )NrY   r¦   r§   Z12r¨   rª   iª  rŸ   r£   r   r   r    Útest_bad_websocket_version<  s    ýþz(WebSocketTest.test_bad_websocket_versionc                 c   s2   |   d¡V }| d¡V  | ¡ V }|  |d¡ d S )NrY   r‚   ©rŒ   r-   Úread_messager¡   ©r   r‹   r¤   r   r   r    Útest_websocket_genG  s    
z WebSocketTest.test_websocket_genc                    sx   t dˆ  ¡  ˆ jd ˆ  ¡  ¡ }| d¡ | ˆ j¡ ˆ  ¡  ¡ }ˆ  |d¡ ˆ j 	‡ fdd„¡ | 
¡  ˆ  ¡  d S )Núws://127.0.0.1:%d/echo)Úcallbackr‚   c                    s   ˆ   ¡ S r   )Ústop)Úfr#   r   r    Ú<lambda>W  ó    z8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>)r   rˆ   r³   r}   Úresultr-   r®   r¡   r   Zadd_done_callbackr]   r¯   r   r#   r    Útest_websocket_callbacksN  s    
 ÿ
z&WebSocketTest.test_websocket_callbacksc                 c   s4   |   d¡V }|jddd | ¡ V }|  |d¡ d S )NrY   s   hello éT©Úbinaryr­   r¯   r   r   r    Útest_binary_message[  s    
z!WebSocketTest.test_binary_messagec                 c   s0   |   d¡V }| d¡ | ¡ V }|  |d¡ d S ©NrY   u   hello Ã©r­   r¯   r   r   r    Útest_unicode_messageb  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_messagei  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_messagep  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_messagew  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_fail  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_success…  s    z)WebSocketTest.test_websocket_http_successc              	   c   s&   |   t¡ |  d¡V  W 5 Q R X d S )Nr   )r¾   r   rŒ   r#   r   r   r    Útest_websocket_http_redirectŠ  s    z*WebSocketTest.test_websocket_http_redirectc              
   c   sX   t ƒ \}}| ¡  |  t¡2 ttddd td| ddV  W 5 Q R X W 5 Q R X d S )Nz.*F)Úrequiredzws://127.0.0.1:%d/i  )Úconnect_timeout)r   r]   r¾   ÚIOErrorr   r   r   )r   ÚsockÚportr   r   r    Útest_websocket_network_fail  s    
 ÿz)WebSocketTest.test_websocket_network_failc              	   c   sF   t  td|  ¡  ƒV ¡$}| d¡ | d¡ |j ¡  W 5 Q R X d S )Nr±   r‚   Zworld)Ú
contextlibÚclosingr   rˆ   r-   Ústreamr]   r¿   r   r   r    Ú"test_websocket_close_buffered_data™  s    ÿ

z0WebSocketTest.test_websocket_close_buffered_datac              	   c   sJ   t  ttd|  ¡  ddidƒV ¡}| ¡ V }|  |d¡ W 5 Q R X d S )Nzws://127.0.0.1:%d/headerr9   r‚   rª   )rÐ   rÑ   r   r   rˆ   r®   r¡   r¯   r   r   r    Útest_websocket_headers£  s    
þÿþ	
z$WebSocketTest.test_websocket_headersc              	   c   s\   t  ttd|  ¡  ddidƒV ¡.}|  |j d¡d¡ |  |j d¡d¡ W 5 Q R X d S )Nzws://127.0.0.1:%d/header_echozX-Test-Hellor‚   rª   rL   rM   )rÐ   rÑ   r   r   rˆ   r¡   rF   rG   r¿   r   r   r    Útest_websocket_header_echo³  s    
þÿþ	
 ÿz(WebSocketTest.test_websocket_header_echoc                 c   sZ   |   d¡V }| ¡ V }|  |d ¡ |  |jd¡ |  |jd¡ | jV \}}|  |d¡ d S )Nr   r[   r\   )rŒ   r®   rÃ   r¡   r%   r&   r   )r   r‹   Úmsgr¢   Úreasonr   r   r    Útest_server_close_reasonÇ  s    
z&WebSocketTest.test_server_close_reasonc                 c   s@   |   d¡V }| dd¡ | jV \}}|  |d¡ |  |d¡ d S )NrY   r[   r\   )rŒ   r]   r   r¡   )r   r‹   r¢   r×   r   r   r    Útest_client_close_reasonÖ  s
    z&WebSocketTest.test_client_close_reasonc              	   c   sF   |   d¡V }| ¡ V }|  |d ¡ |  t¡ | d¡ W 5 Q R X d S )Nr   r‚   )rŒ   r®   rÃ   r¾   r   r-   )r   r‹   rÖ   r   r   r    Útest_write_after_closeÞ  s
    
z$WebSocketTest.test_write_after_closec                 c   s0   |   d¡V }| d¡ | ¡ V }|  |d¡ d S )Nr’   r‚   r­   ©r   r‹   Úresr   r   r    Útest_async_prepareæ  s    

z WebSocketTest.test_async_preparec                 c   s&   |   d¡V }| ¡ V }|  |d¡ d S )Nz/path_args/hellor‚   ©rŒ   r®   r¡   rÛ   r   r   r    Útest_path_argsï  s    
zWebSocketTest.test_path_argsc                 c   sT   |   d¡V }| d¡V  | d¡V  | ¡ V }|  |d¡ | ¡ V }|  |d¡ d S )Nr“   Úhello1Úhello2r­   rÛ   r   r   r    Útest_coroutineõ  s    

zWebSocketTest.test_coroutinec              	   c   sd   |   ¡ }d| }dd| i}t tt||dƒV ¡&}| d¡ | ¡ V }|  |d¡ W 5 Q R X d S )Nr±   ÚOriginzhttp://127.0.0.1:%drª   r‚   ©rˆ   rÐ   rÑ   r   r   r-   r®   r¡   ©r   rÎ   ÚurlrF   r‹   r¤   r   r   r    Útest_check_origin_valid_no_path   s    ÿ

z-WebSocketTest.test_check_origin_valid_no_pathc              	   c   sd   |   ¡ }d| }dd| i}t tt||dƒV ¡&}| d¡ | ¡ V }|  |d¡ W 5 Q R X d S )Nr±   rã   zhttp://127.0.0.1:%d/somethingrª   r‚   rä   rå   r   r   r    Ú!test_check_origin_valid_with_path  s    ÿ

z/WebSocketTest.test_check_origin_valid_with_pathc              	   c   sX   |   ¡ }d| }dd| i}|  t¡}tt||dƒV  W 5 Q R X |  |jjd¡ d S )Nr±   rã   z127.0.0.1:%drª   é“  ©rˆ   r¾   r   r   r   r¡   rÅ   r¢   ©r   rÎ   ræ   rF   rÆ   r   r   r    Ú%test_check_origin_invalid_partial_url  s    z3WebSocketTest.test_check_origin_invalid_partial_urlc              	   c   sT   |   ¡ }d| }ddi}|  t¡}tt||dƒV  W 5 Q R X |  |jjd¡ d S )Nr±   rã   zhttp://somewhereelse.comrª   ré   rê   rë   r   r   r    Útest_check_origin_invalid'  s    z'WebSocketTest.test_check_origin_invalidc              	   c   sŽ   |   ¡ }tƒ  d|¡V }tdd„ |D ƒƒ}tj|krB|  d¡ d S d| }ddi}|  t¡}t	t
||dƒV  W 5 Q R X |  |jjd	¡ d S )
NÚ	localhostc                 s   s   | ]}|d  V  qdS )r   Nr   )Ú.0Úaddrr   r   r    Ú	<genexpr>=  s     zEWebSocketTest.test_check_origin_invalid_subdomains.<locals>.<genexpr>z"localhost does not resolve to ipv4zws://localhost:%d/echorã   zhttp://subtenant.localhostrª   ré   )rˆ   r	   ÚresolveÚsetÚsocketÚAF_INETZskipTestr¾   r   r   r   r¡   rÅ   r¢   )r   rÎ   ZaddrinfoZfamiliesræ   rF   rÆ   r   r   r    Ú$test_check_origin_invalid_subdomains5  s    

z2WebSocketTest.test_check_origin_invalid_subdomainsc                 c   s<   | j dddgdV }|  |jd¡ | ¡ V }|  |d¡ d S )Nr•   Zbadprotoru   )rv   zsubprotocol=goodproto)rŒ   r¡   rx   r®   rÛ   r   r   r    Útest_subprotocolsL  s     ÿ
zWebSocketTest.test_subprotocolsc                 c   s4   |   d¡V }|  |jd ¡ | ¡ V }|  |d¡ d S )Nr•   zsubprotocol=None)rŒ   rÃ   rx   r®   r¡   rÛ   r   r   r    Útest_subprotocols_not_offeredU  s    
z+WebSocketTest.test_subprotocols_not_offeredc                 c   sD   t ƒ | _|  d¡V }| d¡V  | j ¡  | ¡ V }|  |d¡ d S )Nr–   r‚   rV   )r   r|   rŒ   r-   ró   r®   r¡   rÛ   r   r   r    Útest_open_coroutine\  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_opene  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_openl  s    z&WebSocketTest.test_error_in_async_openc                 c   s&   |   d¡V }| ¡ V }|  |d¡ d S )Nr™   r‚   rÞ   rÛ   r   r   r    Útest_nodelays  s    
zWebSocketTest.test_nodelay)*r(   r)   r*   r›   rœ   r†   r¥   r«   r¬   r   r°   r¸   r»   r½   rÀ   rÁ   rÄ   rÇ   rÈ   rÉ   rÏ   rÓ   rÔ   rÕ   rØ   rÙ   rÚ   rÝ   rß   râ   rç   rè   rì   rí   rö   r÷   rø   rù   rü   rý   rþ   ro   r   r   ri   r    r   ë   s†   8









	
	



















r   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚNativeCoroutineOnMessageHandlerc                    s   t ƒ jf |Ž d| _d S rc   rd   rg   ri   r   r    r!   {  s    z*NativeCoroutineOnMessageHandler.initializec                 Ã   sN   | j dkr|  d¡ |  j d7  _ t d¡I d H  |  j d8  _ |  |¡ d S rk   rm   r1   r   r   r    r3     s    

z*NativeCoroutineOnMessageHandler.on_message)r(   r)   r*   r!   r3   ro   r   r   ri   r    rÿ   z  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›   ‰  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_coroutineŒ  s    

z2WebSocketNativeCoroutineTest.test_native_coroutineN)r(   r)   r*   r›   r   r  r   r   r   r    r   ˆ  s   r   c                   @   sb   e Zd ZdZdd„ Zdd„ Zdd„ Zeedd	œd
d„Ze	e
jdœdd„ƒZe	e
jdœdd„ƒZdS )ÚCompressionTestMixinzHello world. Testing 123 123c                 C   s<   G dd„ dt ƒ}tdtt|  ¡ dfd|t|  ¡ dfgƒS )Nc                   @   s    e Zd Zedd„ ƒZdd„ ZdS )z4CompressionTestMixin.get_app.<locals>.LimitedHandlerc                 S   s   dS )Né   r   r#   r   r   r    Úmax_message_size  s    zECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_sizec                 S   s   |   tt|ƒƒ¡ d S r   )r-   ÚstrÚlenr1   r   r   r    r3   ¡  s    z?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_messageN)r(   r)   r*   Úpropertyr  r3   r   r   r   r    ÚLimitedHandlerœ  s   
r	  rY   r"   ú/limited)r   r   r,   rš   Úget_server_compression_options)r   r	  r   r   r    r›   ›  s    ýýúÿzCompressionTestMixin.get_appc                 C   s   d S r   r   r#   r   r   r    r  ³  s    z3CompressionTestMixin.get_server_compression_optionsc                 C   s   d S r   r   r#   r   r   r    Úget_client_compression_options¶  s    z3CompressionTestMixin.get_client_compression_optionsN)Úbytes_inÚ	bytes_outÚreturnc                 C   s
   t ƒ ‚d S r   ©ÚNotImplementedError©r   r  r  r   r   r    Úverify_wire_bytes¹  s    z&CompressionTestMixin.verify_wire_bytesr#   c                 c   s’   | j d|  ¡ dV }tdƒD ](}| | j¡ | ¡ V }|  || j¡ q|  |jjt	| jƒd ¡ |  |jj
t	| jƒd ¡ |  |jj|jj¡ d S )NrY   r"   é   )rŒ   r  Úranger-   ÚMESSAGEr®   r¡   ÚprotocolZ_message_bytes_outr  Z_message_bytes_inr  Z_wire_bytes_inZ_wire_bytes_out©r   r‹   Úir¤   r   r   r    Útest_message_sizes¼  s     ÿ
z'CompressionTestMixin.test_message_sizesc                 c   sV   | j d|  ¡ dV }| d¡ | ¡ V }|  |d¡ | d¡ | ¡ V }|  |¡ d S )Nr
  r"   Z€aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ128A   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)rŒ   r  r-   r®   r¡   rû   r¯   r   r   r    Útest_size_limitË  s     ÿ



z$CompressionTestMixin.test_size_limit)r(   r)   r*   r  r›   r  r  Úintr  r   ÚtypingÚAnyr  r  r   r   r   r    r  ˜  s   r  c                   @   s    e Zd ZdZejdœdd„ZdS )ÚUncompressedTestMixinzESpecialization of CompressionTestMixin when we expect no compression.r#   c                 C   s8   |   |dt| jƒd  ¡ |   |dt| jƒd  ¡ d S )Nr  é   é   )r¡   r  r  r  r   r   r    r  Þ  s    z'UncompressedTestMixin.verify_wire_bytesN)r(   r)   r*   r+   r  r  r  r   r   r   r    r  Û  s   r  c                   @   s   e Zd ZdS )ÚNoCompressionTestN)r(   r)   r*   r   r   r   r    r"  ä  s   r"  c                   @   s   e Zd Zdd„ ZdS )ÚServerOnlyCompressionTestc                 C   s   i S r   r   r#   r   r   r    r  ê  s    z8ServerOnlyCompressionTest.get_server_compression_optionsN)r(   r)   r*   r  r   r   r   r    r#  é  s   r#  c                   @   s   e Zd Zdd„ ZdS )ÚClientOnlyCompressionTestc                 C   s   i S r   r   r#   r   r   r    r  ï  s    z8ClientOnlyCompressionTest.get_client_compression_optionsN)r(   r)   r*   r  r   r   r   r    r$  î  s   r$  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDefaultCompressionTestc                 C   s   i S r   r   r#   r   r   r    r  ô  s    z5DefaultCompressionTest.get_server_compression_optionsc                 C   s   i S r   r   r#   r   r   r    r  ÷  s    z5DefaultCompressionTest.get_client_compression_optionsc                 C   sH   |   |dt| jƒd  ¡ |   |dt| jƒd  ¡ |  ||d ¡ d S )Nr  r   r!  é   )Z
assertLessr  r  r¡   r  r   r   r    r  ú  s    z(DefaultCompressionTest.verify_wire_bytesN)r(   r)   r*   r  r  r  r   r   r   r    r%  ó  s   r%  c                   @   s.   e Zd Zeeedœdd„Zejdœdd„ZdS )ÚMaskFunctionMixin)ÚmaskÚdatar  c                 C   s
   t ƒ ‚d S r   r  ©r   r(  r)  r   r   r    r(    s    zMaskFunctionMixin.maskr#   c                 C   s|   |   |  dd¡d¡ |   |  dd¡d¡ |   |  dd¡d¡ |   |  dd¡d	¡ |   |  d
d¡d¡ |   |  dd¡d¡ d S )Ns   abcdr¶   ó   bó   s   54321s   TVPVPs   ZXCVs   98765432s   c`t`olpds    s   ÿûýüþús   ÿúÿÿþûs   ÿûýüs    s   ÿúÿÿûþ)r¡   r(  r#   r   r   r    Ú	test_mask  s    
þ
þzMaskFunctionMixin.test_maskN)r(   r)   r*   r/   r(  r  r  r-  r   r   r   r    r'    s   r'  c                   @   s   e Zd Zdd„ ZdS )ÚPythonMaskFunctionTestc                 C   s
   t ||ƒS r   r   r*  r   r   r    r(    s    zPythonMaskFunctionTest.maskN©r(   r)   r*   r(  r   r   r   r    r.    s   r.  z#tornado.speedups module not presentc                   @   s   e Zd Zdd„ ZdS )ÚCythonMaskFunctionTestc                 C   s   t  ||¡S r   )r   Zwebsocket_maskr*  r   r   r    r(    s    zCythonMaskFunctionTest.maskNr/  r   r   r   r    r0    s   r0  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*   r4  r   r   r   r    ÚPingHandler%  s   r5  ú/rl   )Zwebsocket_ping_interval©r   r   ©r   r5  r   r   r    r›   $  s    zServerPeriodicPingTest.get_appc                 c   s4   |   d¡V }tdƒD ]}| ¡ V }|  |d¡ qd S )Nr6  r  r2  )rŒ   r  r®   r¡   r  r   r   r    Útest_server_ping+  s    
z'ServerPeriodicPingTest.test_server_pingN)r(   r)   r*   r›   r   r9  r   r   r   r    r1  #  s   r1  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_   r3  r   r   r    Úon_ping7  s    z;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_pingN©r(   r)   r*   r<  r   r   r   r    r5  6  s   r5  r6  r7  r8  r   r   r    r›   5  s    zClientPeriodicPingTest.get_appc                 c   s@   | j dddV }tdƒD ]}| ¡ V }|  |d¡ q| ¡  d S )Nr6  rl   )Zping_intervalr  r;  )rŒ   r  r®   r¡   r]   r  r   r   r    Útest_client_ping<  s
    
z'ClientPeriodicPingTest.test_client_pingN)r(   r)   r*   r›   r   r>  r   r   r   r    r:  4  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/   r3  r   r   r    r<  I  s    z3ManualPingTest.get_app.<locals>.PingHandler.on_pingNr=  r   r   r   r    r5  H  s   r5  r6  r7  r8  r   r   r    r›   G  s    zManualPingTest.get_appc                 c   s`   |   d¡V }|  t|jd¡ | d¡ | ¡ V }|  |d¡ | d¡ | ¡ V }|  |d¡ d S )Nr6  Z~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar‚   s   hellos   binary hello)rŒ   r¾   Ú
ValueErrorZpingr®   r¡   )r   r‹   Úrespr   r   r    Útest_manual_pingN  s    



zManualPingTest.test_manual_pingN)r(   r)   r*   r›   r   rB  r   r   r   r    r?  F  s   r?  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 )Nr6  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 )Nr6  A   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÚbiñ  zmessage too big)rŒ   r-   r®   r¡   rÃ   r%   r&   )r   r‹   rÖ   rA  r   r   r    Útest_large_messageb  s    


z%MaxMessageSizeTest.test_large_messageN)r(   r)   r*   r›   r   rE  r   r   r   r    rC  ^  s   rC  )Pr0   rÐ   r;   rô   Ú	tracebackr  ZunittestZtornado.concurrentr   Ztornador   Ztornado.httpclientr   r   Ztornado.locksr   Ztornado.logr   r   Ztornado.netutilr	   Ztornado.simple_httpclientr   Ztornado.templater   Ztornado.testingr   r   r   r   Ztornado.webr   r   Ztornado.websocketZtornado.utilr   ÚImportErrorÚ	print_excr   r   r   r   r   r   r,   r5   r8   rK   rU   rX   rZ   r^   r`   rb   rp   rr   ry   r~   r€   r   rƒ   r   rÿ   r   Úobjectr  r  r"  r#  r$  r%  r'  ZTestCaser.  ZskipIfr0  r1  r:  r?  rC  r   r   r   r    Ú<module>   s‚   

	   C	