a
    ñ»jþG  ã                   @   sX  d dl Z d dlZ d dlZd dlZd dlmZ d dlZd dl	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ zd dlZW n" ey¦   G dd	„ d	eƒZY n0 e j d
d¡dkZe j dd¡ZedkZdZdd„ ZG dd„ dƒZ G dd„ de ƒZ!G dd„ dej"ƒZ#G dd„ dej"ƒZ$G dd„ dej"ƒZ%G dd„ dej"ƒZ&e'dk�rTe (¡  dS )é    N)Údecodebytes)ÚWebSocketBadStatusExceptionÚWebSocketAddressExceptionÚWebSocketException)Ú_create_sec_websocket_key)Ú	_validate)Úread_headers)Úvalidate_utf8c                   @   s   e Zd ZdS )ÚSSLErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   úDE:\soccer\ml_env\Lib\site-packages\websocket/tests/test_websocket.pyr
   +   s   r
   ÚTEST_WITH_INTERNETÚ0Ú1ÚLOCAL_WS_SERVER_PORTz-1Tc                 C   s   dS )NÚabcdr   )Ú_r   r   r   Úcreate_mask_key7   s    r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚSockMockc                 C   s   g | _ g | _d S ©N)ÚdataÚsent©Úselfr   r   r   Ú__init__<   s    zSockMock.__init__c                 C   s   | j  |¡ d S r   )r   Úappend©r   r   r   r   r   Ú
add_packet@   s    zSockMock.add_packetc                 C   s   d S r   r   r   r   r   r   Ú
gettimeoutC   s    zSockMock.gettimeoutc                 C   sR   | j rN| j  d¡}t|tƒr |‚t|ƒ|krB| j  d||d … ¡ |d |… S d S )Nr   )r   ÚpopÚ
isinstanceÚ	ExceptionÚlenÚinsert)r   ÚbufsizeÚer   r   r   ÚrecvF   s    
zSockMock.recvc                 C   s   | j  |¡ t|ƒS r   )r   r   r%   r   r   r   r   ÚsendO   s    zSockMock.sendc                 C   s   d S r   r   r   r   r   r   ÚcloseS   s    zSockMock.closeN)	r   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 )ÚHeaderSockMockc                 C   s\   t  | ¡ tj tj t¡|¡}t|dƒ�}|  | 	¡ ¡ W d   ƒ n1 sN0    Y  d S )NÚrb)
r   r   ÚosÚpathÚjoinÚdirnameÚ__file__Úopenr    Úread)r   Úfnamer/   Úfr   r   r   r   X   s    
zHeaderSockMock.__init__N)r   r   r   r   r   r   r   r   r,   W   s   r,   c                   @   s4  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Ze ed¡dd„ ƒZe ed¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Ze ed(¡d)d*„ ƒZe ed(¡d+d,„ ƒZe ed¡d-d.„ ƒZe ed¡d/d0„ ƒZe ed(¡d1d2„ ƒZe ed(¡d3d4„ ƒZd5S )6ÚWebSocketTestc                 C   s   t  t¡ d S r   )ÚwsZenableTraceÚ	TRACEABLEr   r   r   r   ÚsetUp`   s    zWebSocketTest.setUpc                 C   s   d S r   r   r   r   r   r   ÚtearDownc   s    zWebSocketTest.tearDownc                 C   s8   |   t ¡ d ¡ t d¡ |   t ¡ d¡ t d ¡ d S )Né
   )ÚassertEqualr8   ÚgetdefaulttimeoutÚsetdefaulttimeoutr   r   r   r   Útest_default_timeoutf   s    
z"WebSocketTest.test_default_timeoutc                 C   s&   t ƒ }|  |dk¡ |  d|v¡ d S )Né   u   Â¥n)r   Ú
assertTrue)r   Úkeyr   r   r   Útest_ws_keyl   s    zWebSocketTest.test_ws_keyc                 C   s(   t ƒ }t| d¡ƒ}|  dt|ƒ¡ dS )z/WebSocket key should be a random 16-byte nonce.zutf-8é   N)r   Úbase64decodeÚencoder=   r%   )r   rC   Únoncer   r   r   Ú
test_nonceq   s    zWebSocketTest.test_noncec                 C   sj  d}ddddœ}|   t||d ƒd¡ | ¡ }d|d< |   t||d ƒd¡ |d= |   t||d ƒd¡ | ¡ }d	|d
< |   t||d ƒd¡ |d
= |   t||d ƒd¡ | ¡ }d	|d< |   t||d ƒd¡ |d= |   t||d ƒd¡ | ¡ }d|d< |   t||ddgƒd¡ |   t||ddgƒd¡ | ¡ }d|d< |   t||ddgƒd¡ | ¡ }|   t||ddgƒd¡ d S )Nzc6b8hTg4EeGb2gQMztV1/g==Ú	websocketÚupgradezKxep+hNu9n51529fGidYu7a3wO0=)rK   Ú
connectionúsec-websocket-accept)TNÚhttp)FNÚ	somethingrL   rM   Úsub1zsec-websocket-protocolZsub2)TrP   Zsub3ZsUb1ZSub1ZsuB2)r=   Ú_validate_headerÚcopy)r   rC   Zrequired_headerÚheaderr   r   r   Útest_ws_utilsw   sD    ýÿÿzWebSocketTest.test_ws_utilsc                 C   s|   t tdƒƒ\}}}|  |d¡ |  |d d¡ t tdƒƒ\}}}|  |d¡ |  |d d¡ tdƒ |  tjt tdƒ¡ d S )Núdata/header01.txtée   rL   ÚUpgradezdata/header03.txtzUpgrade, Keep-Alivezdata/header02.txt)r   r,   r=   ÚassertRaisesr8   r   )r   ÚstatusrS   r   r   r   r   Útest_read_header¤   s    ÿzWebSocketTest.test_read_headerc                 C   sn   t  ¡ }| t¡ tdƒ }|_| d¡ |  |jd d¡ | d¡ |  |jd d¡ |  | 	d¡d	¡ d S )
NrU   ÚHellor   ó   �…abcd)õ   ã�“ã‚“ã�«ã�¡ã�¯é   ó   ��abcd‚ãð‡ãñ€åÊ�âÅ‚ãÌs   1111111111101é   )
r8   Ú	WebSocketÚset_mask_keyr   r,   Úsockr*   r=   r   Zsend_binary©r   rc   Úsr   r   r   Ú	test_send²   s    


þzWebSocketTest.test_sendc                 C   sX   t  ¡ }tƒ  }|_d}| |¡ | ¡ }|  |d¡ | d¡ | ¡ }|  |d¡ d S )Nr_   r]   r\   r[   )r8   ra   r   rc   r    r)   r=   )r   rc   re   rO   r   r   r   r   Ú	test_recvÅ   s    ÿ

zWebSocketTest.test_recvú%Internet-requiring tests are disabledc                 C   s:   d}t  d¡}| d¡ |D ]}|d8 }|dkr q6qd S )Né   úwss://api.bitfinex.com/ws/2z+{"event": "subscribe", "channel": "ticker"}r^   r   )r8   Úcreate_connectionr*   )r   Úcountre   r   r   r   r   Ú	test_iterÔ   s    

zWebSocketTest.test_iterc                 C   s"   t  d¡}|  ttt|ƒƒ¡ d S )Nrj   )r8   rk   r=   ÚstrÚtypeÚnext)r   rc   r   r   r   Ú	test_nextÞ   s    
zWebSocketTest.test_nextc                 C   sÌ   t  ¡ }tƒ  }|_| d¡ | t ¡ ¡ | d¡ | d¡ |  t j¡� |j	 
d¡ W d   ƒ n1 sn0    Y  |j	 
d¡}|  |d¡ |  t j¡� |j	 
d¡ W d   ƒ n1 s¾0    Y  d S )Ns   foos   bars   bazé	   s	   foobarbazr^   )r8   ra   r   rc   r    ÚsocketÚtimeoutrX   ÚWebSocketTimeoutExceptionZframe_bufferZrecv_strictr=   Ú"WebSocketConnectionClosedException©r   rc   re   r   r   r   r   Útest_internal_recv_strictã   s    


*z'WebSocketTest.test_internal_recv_strictc                 C   s  t  ¡ }tƒ  }|_| d¡ | t ¡ ¡ | d¡ | t ¡ ¡ | d¡ |  t j¡� | 	¡  W d   ƒ n1 sx0    Y  |  t j¡� | 	¡  W d   ƒ n1 s¬0    Y  | 	¡ }|  
|d¡ |  t j¡� | 	¡  W d   ƒ n1 sô0    Y  d S )Nó   �s
   �abcd)s   NC3 @zHello, World!)r8   ra   r   rc   r    rs   rt   rX   ru   r)   r=   rv   rw   r   r   r   Útest_recv_timeoutô   s    


&&zWebSocketTest.test_recv_timeoutc                 C   st   t  ¡ }tƒ  }|_| d¡ | d¡ | ¡ }|  |d¡ |  t j¡� | ¡  W d   ƒ n1 sf0    Y  d S )Nó   ‹abcd#DCó   €�abcd
DADzBrevity is the soul of wit©	r8   ra   r   rc   r    r)   r=   rX   rv   rw   r   r   r   Ú#test_recv_with_simple_fragmentation  s    

z1WebSocketTest.test_recv_with_simple_fragmentationc                 C   sô   t jdd�}tƒ  }|_| d¡ | d¡ | d¡ | ¡ \}}|  |d¡ | ¡ \}}|  |d¡ | ¡ \}}|  |d¡ | d¡ |  t j¡� | ¡  W d   ƒ n1 s²0    Y  |  t j	¡� | 
¡  W d   ƒ n1 sæ0    Y  d S )	NT)Zfire_cont_framer{   s    ‹abcd#DCr|   s   Brevity is s   the soul of wits   €‹abcd#DC)r8   ra   r   rc   r    Z	recv_datar=   rX   r   rv   r)   )r   rc   re   r   r   r   r   r   Ú*test_recv_with_fire_event_of_fragmentation  s     



&z8WebSocketTest.test_recv_with_fire_event_of_fragmentationc                 C   sT   t  ¡ }d|_| ¡  t  ¡ }tƒ  }|_d|_| d¡ | ¡  |  |jd¡ d S )NTs   ˆ€˜p„F)	r8   ra   Ú	connectedr+   r   rc   r    r)   r=   rd   r   r   r   Ú
test_close+  s    
zWebSocketTest.test_closec                 C   s2   t  ¡ }tƒ  }|_| d¡ |  t j|j¡ d S )Nr|   )r8   ra   r   rc   r    rX   r   r)   rd   r   r   r   Útest_recv_cont_fragmentation7  s    
z*WebSocketTest.test_recv_cont_fragmentationc                 C   s~   t  ¡ }tƒ  }|_| d¡ | d¡ | d¡ | ¡ }|  |d¡ |  t j¡� | ¡  W d   ƒ n1 sp0    Y  d S )Ns!   ›abcd. AB
C	C	NCs    ŽabcdAMBs   €‰abcd Az2Once more unto the breach, dear friends, once morer}   rw   r   r   r   Ú&test_recv_with_prolonged_fragmentation>  s    ÿ

z4WebSocketTest.test_recv_with_prolonged_fragmentationc                 C   sš   t  ¡ }| t¡ tƒ  }|_| d¡ | d¡ | d¡ | ¡ }|  |d¡ |  	t j
¡� | ¡  W d   ƒ n1 sz0    Y  |  |jd d¡ d S )Ns   ‰abcd5D As   ‰�abcd1C4.,$D

s   €�abcdCABzToo much of a good thingr   s   Š�abcd1C4.,$D

)r8   ra   rb   r   r   rc   r    r)   r=   rX   rv   r   rw   r   r   r   Ú.test_recv_with_fragmentation_and_control_frameN  s    



&
ÿz<WebSocketTest.test_recv_with_fragmentation_and_control_frameú/Tests using local websocket server are disabledc                 C   s~   t  dt› �¡}|  |d ¡ | d¡ | ¡ }| ¡  |  |d¡ | d¡ | ¡ }|  |d¡ |  	t
|jdd¡ | ¡  d S )Núws://127.0.0.1:úHello, Worldu   ã�“ã�«ã‚ƒã�«ã‚ƒã�¡ã�¯ã€�ä¸–ç•ŒéÿÿÿÿÚ )r8   rk   r   ÚassertNotEqualr*   rp   Úfilenor=   r)   rX   Ú
ValueErrorZ
send_closer+   ©r   re   Úresultr   r   r   Útest_websocket`  s    

zWebSocketTest.test_websocketc                 C   s<   t  dt› �¡}|  |d ¡ | d¡ | d¡ | ¡  d S )Nr†   r[   ZHi)r8   rk   r   rŠ   ZpingÚpongr+   ©r   re   r   r   r   Útest_ping_pongq  s
    

zWebSocketTest.test_ping_pongc                 C   s   t  ¡ }|  t|jd¡ d S )Nzws://google.com/)r8   ra   rX   r   Úconnectr‘   r   r   r   Útest_support_redirect{  s    z#WebSocketTest.test_support_redirectc                 C   s€   t  d¡}|  |d ¡ |  t|jtjƒ¡ |  | 	¡ d¡ |  | 
¡ d ¡ | d¡ |  | ¡ d¡ |  | ¡ d ¡ | ¡  d S )Nrj   rV   r<   )r8   rk   rŠ   rB   r#   rc   ÚsslÚ	SSLSocketr=   Z	getstatusÚ
getheadersÚ
settimeoutr!   ÚgetsubprotocolÚabortr‘   r   r   r   Útest_secure_websocket�  s    

z#WebSocketTest.test_secure_websocketc                 C   sp   t jdt› �ddid�}|  |d ¡ |  | ¡ d ¡ | d¡ | ¡ }|  |d¡ |  t	|j
dd¡ | 
¡  d S )Nr†   z
User-AgentZPythonWebsocketClient)Úheadersr‡   rˆ   r‰   )r8   rk   r   rŠ   r=   r™   r*   r)   rX   rŒ   r+   r�   r   r   r   Ú!test_websocket_with_custom_header�  s    þ
z/WebSocketTest.test_websocket_with_custom_headerc                 C   sJ   t  dt› �¡}|  |d ¡ | ¡  |  t j|jd¡ |  t j|j¡ d S )Nr†   r[   )	r8   rk   r   rŠ   r+   rX   rv   r*   r)   r‘   r   r   r   Útest_after_close�  s
    zWebSocketTest.test_after_closeN) r   r   r   r:   r;   r@   rD   rI   rT   rZ   rf   rg   ÚunittestÚ
skipUnlessr   rm   rq   rx   rz   r~   r   r�   r‚   rƒ   r„   ÚTEST_WITH_LOCAL_SERVERr�   r’   r”   r›   r�   rž   r   r   r   r   r7   _   sR   -

	

ÿ
ÿ




ÿ
ÿr7   c                   @   s    e Zd Ze ed¡dd„ ƒZdS )ÚSockOptTestr…   c                 C   sJ   t jt jdff}tjdt› �|d�}|  |j t jt j¡d¡ | 	¡  d S )Nr^   r†   )Úsockoptr   )
rs   ÚIPPROTO_TCPÚTCP_NODELAYr8   rk   r   rŠ   rc   Ú
getsockoptr+   )r   r£   re   r   r   r   Útest_sockopt©  s    
ÿÿzSockOptTest.test_sockoptN)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 )Ú	UtilsTestc                 C   s@   t dƒ}|  |d¡ t dƒ}|  |d¡ t dƒ}|  |d¡ d S )Ns   ð�€€Ts   Îºá½¹ÏƒÎ¼Îµí €editedFó    )r	   r=   )r   Ústater   r   r   Útest_utf8_validator¸  s    ÿzUtilsTest.test_utf8_validatorN)r   r   r   r«   r   r   r   r   r¨   ·  s   r¨   c                   @   sD   e Zd Ze ed¡dd„ ƒZe ed¡dd„ ƒZdd„ Zdd	„ Z	d
S )ÚHandshakeTestrh   c                 C   sL   t jdt ¡ jidd�}|  t|jd¡ t jddid�}|  t|jd¡ d S )NZ
cert_chainF)ÚssloptZenable_multithreadrj   ÚcertfileZmyNonexistentCertFile©r­   )	r8   ra   r•   Úget_default_verify_pathsÚcapathrX   rŒ   r“   r   )r   Zwebsock1Úwebsock2r   r   r   Útest_http_sslÄ  s    þÿzHandshakeTest.test_http_sslc                 C   sL   t jt ¡ jt ¡ jdœd�}| jt|jdddddgdd	d
dddœd�	 d S )N)Úca_certsZca_cert_pathr¯   rj   Z	chocolateztesting_websockets.comz+echo.websocket.events/websocket-client-testZ	testprotorW   Z123Z	TestValuezk9kFAUWNAMmf5OEMfTlOEA==Znewprotocol)ZCustomHeader1ÚCookiezSec-WebSocket-KeyzSec-WebSocket-Protocol)ÚcookieÚoriginÚhostZsubprotocolsrL   rS   )	r8   ra   r•   r°   Úcafiler±   rX   r   r“   ©r   Zwebsock3r   r   r   Útest_manual_headersÐ  s(    þÿü÷z!HandshakeTest.test_manual_headersc                 C   s   t  ¡ }|  t|jd¡ d S )Nz2001:4860:4860::8888)r8   ra   rX   rŒ   r“   )r   r²   r   r   r   Ú	test_ipv6é  s    zHandshakeTest.test_ipv6c                 C   s<   t  ¡ }|  t|jd¡ |  t|jd¡ |  t|jd¡ d S )Nzws//example.comzws://examplezexample.com)r8   ra   rX   rŒ   r“   r   rº   r   r   r   Útest_bad_urlsí  s    zHandshakeTest.test_bad_urlsN)
r   r   r   rŸ   r    r   r³   r»   r¼   r½   r   r   r   r   r¬   Ã  s   



r¬   Ú__main__))r.   Úos.pathrs   rŸ   Úbase64r   rF   rJ   r8   Zwebsocket._exceptionsr   r   r   Zwebsocket._handshaker   r   rQ   Zwebsocket._httpr   Zwebsocket._utilsr	   r•   ÚImportErrorr$   r
   ÚenvironÚgetr   r   r¡   r9   r   r   r,   ZTestCaser7   r¢   r¨   r¬   r   Úmainr   r   r   r   Ú<module>   s:     K1
