o
    ¹i˜F  ã                   @   sL  d dl Z d dlZ d dlZd dlZd dlZd dlmZmZ	 d dl
mZ d dlmZ d dlmZ 	 zd dlZd dlmZ W n eyL   G dd„ deƒZY nw 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r¤e $¡  dS dS )é    N)Ú_create_sec_websocket_keyÚ	_validate)Úread_headers)Úvalidate_utf8)Údecodebytes)ÚSSLErrorc                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úY/var/www/edux/Edux_v2/venv/lib/python3.10/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_key1   ó   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__6   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   ó   d S r   r   r   r   r   r   Ú
gettimeout=   r   zSockMock.gettimeoutc                 C   sR   | j r'| j  d¡}t|tƒr|‚t|ƒ|kr!| j  d||d … ¡ |d |… S d S )Nr   )r   ÚpopÚ
isinstanceÚ	ExceptionÚlenÚinsert)r   ÚbufsizeÚer   r   r   Úrecv@   s   
úzSockMock.recvc                 C   s   | j  |¡ t|ƒS r   )r   r   r$   r   r   r   r   ÚsendI   s   zSockMock.sendc                 C   r   r   r   r   r   r   r   ÚcloseM   r   zSockMock.closeN)	r   r	   r
   r   r   r    r(   r)   r*   r   r   r   r   r   5   s    	r   c                   @   ó   e Zd Zdd„ ZdS )ÚHeaderSockMockc                 C   s^   t  | ¡ tj tj t¡|¡}t|dƒ}|  | 	¡ ¡ W d   ƒ d S 1 s(w   Y  d S )NÚrb)
r   r   ÚosÚpathÚjoinÚdirnameÚ__file__Úopenr   Úread)r   Úfnamer/   Úfr   r   r   r   S   s
   
"ÿzHeaderSockMock.__init__N)r   r	   r
   r   r   r   r   r   r,   Q   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   )ÚwsÚenableTraceÚ	TRACEABLEr   r   r   r   ÚsetUp[   s   zWebSocketTest.setUpc                 C   r   r   r   r   r   r   r   ÚtearDown^   r   zWebSocketTest.tearDownc                 C   s8   |   t ¡ d ¡ t d¡ |   t ¡ d¡ t d ¡ d S )Né
   )ÚassertEqualr8   ÚgetdefaulttimeoutÚsetdefaulttimeoutr   r   r   r   ÚtestDefaultTimeouta   s   
z WebSocketTest.testDefaultTimeoutc                 C   s*   t ƒ }|  |dk¡ |  tdƒ|v¡ d S )Né   u   Â¥n)r   Ú
assertTrueÚstr)r   Úkeyr   r   r   Ú	testWSKeyg   s   zWebSocketTest.testWSKeyc                 C   s(   t ƒ }t| d¡ƒ}|  dt|ƒ¡ dS )z9 WebSocket key should be a random 16-byte nonce.
        zutf-8é   N)r   Úbase64decodeÚencoder>   r$   )r   rE   Únoncer   r   r   Ú	testNoncel   s   zWebSocketTest.testNoncec                 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=)rM   Ú
connectionúsec-websocket-accept)TNÚhttp)FNÚ	somethingrN   rO   Úsub1zsec-websocket-protocolÚsub2)TrR   Úsub3ÚsUb1ÚSub1ÚsuB2)r>   Ú_validate_headerÚcopy)r   rE   Úrequired_headerÚheaderr   r   r   ÚtestWsUtilss   s<   ýzWebSocketTest.testWsUtilsc                 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   rN   ÚUpgradezdata/header03.txtzUpgrade, Keep-Alivezdata/header02.txt)r   r,   r>   ÚassertRaisesr8   ÚWebSocketException)r   Ústatusr[   Ústatus_messager   r   r   ÚtestReadHeader›   s   zWebSocketTest.testReadHeaderc                 C   sn   t  ¡ }| t¡ tdƒ }|_| d¡ |  |jd d¡ | d¡ |  |jd d¡ |  | 	d¡d	¡ d S )
Nr]   ÚHellor   ó   …abcd)õ   ã“ã‚“ã«ã¡ã¯é   ó   abcd‚ãð‡ãñ€åÊâÅ‚ãÌs   1111111111101é   )
r8   Ú	WebSocketÚset_mask_keyr   r,   Úsockr)   r>   r   Úsend_binary©r   rm   Úsr   r   r   ÚtestSend§   s   


zWebSocketTest.testSendc                 C   sX   t  ¡ }tƒ  }|_d}| |¡ | ¡ }|  |d¡ | d¡ | ¡ }|  |d¡ d S )Nri   rg   rf   re   )r8   rk   r   rm   r   r(   r>   )r   rm   rp   rQ   r   r   r   r   ÚtestRecv·   s   

zWebSocketTest.testRecvú%Internet-requiring tests are disabledc                 C   s<   d}t  d¡}| d¡ |D ]}|d8 }|dkr d S qd S )Né   úwss://api.bitfinex.com/ws/2z+{"event": "subscribe", "channel": "ticker"}rh   r   )r8   Úcreate_connectionr)   )r   Úcountrp   r   r   r   r   ÚtestIterÄ   s   

ÿþzWebSocketTest.testIterc                 C   s"   t  d¡}|  ttt|ƒƒ¡ d S )Nru   )r8   rv   r>   rD   ÚtypeÚnext)r   rm   r   r   r   ÚtestNextÎ   s   
zWebSocketTest.testNextc                 C   sÎ   t  ¡ }tƒ  }|_| d¡ | t ¡ ¡ | d¡ | d¡ |  t j¡ |j	 
d¡ W d   ƒ n1 s7w   Y  |j	 
d¡}|  |d¡ |  t j¡ |j	 
d¡ W d   ƒ d S 1 s`w   Y  d S )Ns   foos   bars   bazé	   s	   foobarbazrh   )r8   rk   r   rm   r   ÚsocketÚtimeoutr`   ÚWebSocketTimeoutExceptionÚframe_bufferÚrecv_strictr>   Ú"WebSocketConnectionClosedException©r   rm   rp   r   r   r   r   ÚtestInternalRecvStrictÓ   s   


ÿ"ÿz$WebSocketTest.testInternalRecvStrictc                 C   s  t  ¡ }tƒ  }|_| d¡ | t ¡ ¡ | d¡ | t ¡ ¡ | d¡ |  t j¡ | 	¡  W d   ƒ n1 s<w   Y  |  t j¡ | 	¡  W d   ƒ n1 sVw   Y  | 	¡ }|  
|d¡ |  t j¡ | 	¡  W d   ƒ d S 1 s{w   Y  d S )Nó   s
   abcd)s   NC3 @zHello, World!)r8   rk   r   rm   r   r}   r~   r`   r   r(   r>   r‚   rƒ   r   r   r   ÚtestRecvTimeoutä   s$   



ÿ
ÿ
"ÿzWebSocketTest.testRecvTimeoutc                 C   sv   t  ¡ }tƒ  }|_| d¡ | d¡ | ¡ }|  |d¡ |  t j¡ | ¡  W d   ƒ d S 1 s4w   Y  d S )Nó   ‹abcd#DCó   €abcd
DADzBrevity is the soul of wit©	r8   rk   r   rm   r   r(   r>   r`   r‚   rƒ   r   r   r   ÚtestRecvWithSimpleFragmentationõ   s   


"ÿz-WebSocketTest.testRecvWithSimpleFragmentationc                 C   sö   t jdd}tƒ  }|_| d¡ | d¡ | d¡ | ¡ \}}|  |d¡ | ¡ \}}|  |d¡ | ¡ \}}|  |d¡ | d¡ |  t j¡ | ¡  W d   ƒ n1 sYw   Y  |  t j	¡ | 
¡  W d   ƒ d S 1 stw   Y  d S )	NT)Úfire_cont_framer‡   s    ‹abcd#DCrˆ   s   Brevity is s   the soul of wits   €‹abcd#DC)r8   rk   r   rm   r   Ú	recv_datar>   r`   ra   r‚   r(   )r   rm   rp   r   r   r   r   r   Ú$testRecvWithFireEventOfFragmentation  s$   




ÿ
"ÿz2WebSocketTest.testRecvWithFireEventOfFragmentationc                 C   sR   t  ¡ }d|_|j t  ¡ }tƒ  }|_d|_| d¡ | ¡  |  |jd¡ d S )NTs   ˆ€˜p„F)	r8   rk   Ú	connectedr*   r   rm   r   r(   r>   ro   r   r   r   Ú	testClose  s   
zWebSocketTest.testClosec                 C   s2   t  ¡ }tƒ  }|_| d¡ |  t j|j¡ d S )Nrˆ   )r8   rk   r   rm   r   r`   ra   r(   ro   r   r   r   ÚtestRecvContFragmentation'  s   
z'WebSocketTest.testRecvContFragmentationc                 C   s€   t  ¡ }tƒ  }|_| d¡ | d¡ | d¡ | ¡ }|  |d¡ |  t j¡ | ¡  W d   ƒ d S 1 s9w   Y  d S )Ns!   ›abcd. AB
C	C	NCs    ŽabcdAMBs   €‰abcd Az2Once more unto the breach, dear friends, once morer‰   rƒ   r   r   r   Ú"testRecvWithProlongedFragmentation.  s   


þ
"ÿz0WebSocketTest.testRecvWithProlongedFragmentationc                 C   sš   t  ¡ }| t¡ tƒ  }|_| d¡ | d¡ | d¡ | ¡ }|  |d¡ |  	t j
¡ | ¡  W d   ƒ n1 s=w   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   rk   rl   r   r   rm   r   r(   r>   r`   r‚   r   rƒ   r   r   r   Ú(testRecvWithFragmentationAndControlFrame>  s   




ÿþz6WebSocketTest.testRecvWithFragmentationAndControlFrameú/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   rv   r   ÚassertNotEqualr)   rz   Úfilenor>   r(   r`   Ú
ValueErrorÚ
send_closer*   ©r   rp   Úresultr   r   r   ÚtestWebSocketP  s   

zWebSocketTest.testWebSocketc                 C   s:   t  dt ¡}|  |d ¡ | d¡ | d¡ | ¡  d S )Nr”   re   ÚHi)r8   rv   r   r˜   ÚpingÚpongr*   ©r   rp   r   r   r   ÚtestPingPong_  s
   

zWebSocketTest.testPingPongc                 C   s    t  ¡ }|  t jj|jd¡ d S )Nzws://google.com/)r8   rk   r`   Ú_exceptionsÚWebSocketBadStatusExceptionÚconnectr¢   r   r   r   ÚtestSupportRedirectg  s   z!WebSocketTest.testSupportRedirectc                 C   sˆ   dd l }t d¡}|  |d ¡ |  t|j|jƒ¡ |  | 	¡ d¡ |  | 
¡ d ¡ | d¡ |  | ¡ d¡ |  | ¡ d ¡ | ¡  d S )Nr   ru   r^   r=   )Ússlr8   rv   r˜   rC   r"   rm   Ú	SSLSocketr>   Ú	getstatusÚ
getheadersÚ
settimeoutr    ÚgetsubprotocolÚabort)r   r¨   rp   r   r   r   ÚtestSecureWebSocketm  s   

z!WebSocketTest.testSecureWebSocketc                 C   sn   t jdt ddid}|  |d ¡ |  | ¡ d ¡ | d¡ | ¡ }|  |d¡ |  t	|j
dd¡ | 
¡  d S )Nr”   z
User-AgentÚPythonWebsocketClient)Úheadersr•   r–   r—   )r8   rv   r   r˜   r>   r­   r)   r(   r`   rš   r*   rœ   r   r   r   ÚtestWebSocketWithCustomHeaderz  s   
ÿ
z+WebSocketTest.testWebSocketWithCustomHeaderc                 C   sH   t  dt ¡}|  |d ¡ | ¡  |  t j|jd¡ |  t j|j¡ d S )Nr”   re   )	r8   rv   r   r˜   r*   r`   r‚   r)   r(   r¢   r   r   r   ÚtestAfterClose†  s
   zWebSocketTest.testAfterCloseN) r   r	   r
   r;   r<   rA   rF   rK   r\   rd   rq   rr   ÚunittestÚ
skipUnlessr   rx   r{   r„   r†   rŠ   r   r   r   r‘   r’   ÚTEST_WITH_LOCAL_SERVERrž   r£   r§   r¯   r²   r³   r   r   r   r   r7   Z   sD    (


	











r7   c                   @   s    e Zd Ze ed¡dd„ ƒZdS )ÚSockOptTestr“   c                 C   sH   t jt jdff}tjdt |d}|  |j t jt j¡d¡ | 	¡  d S )Nrh   r”   )Úsockoptr   )
r}   ÚIPPROTO_TCPÚTCP_NODELAYr8   rv   r   r˜   rm   Ú
getsockoptr*   )r   r¸   rp   r   r   r   ÚtestSockOpt  s   zSockOptTest.testSockOptN)r   r	   r
   r´   rµ   r¶   r¼   r   r   r   r   r·     s    
r·   c                   @   r+   )Ú	UtilsTestc                 C   s@   t dƒ}|  |d¡ t dƒ}|  |d¡ t dƒ}|  |d¡ d S )Ns   ð€€Ts   Îºá½¹ÏƒÎ¼Îµí €editedFó    )r   r>   )r   Ústater   r   r   ÚtestUtf8Validator™  s   zUtilsTest.testUtf8ValidatorN)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 )ÚHandshakeTestrs   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 )NÚ
cert_chainF)ÚssloptÚenable_multithreadru   ÚcertfileÚmyNonexistentCertFile©rÃ   )	r8   rk   r¨   Úget_default_verify_pathsÚcapathr`   rš   r¦   ÚFileNotFoundError)r   Úwebsock1Úwebsock2r   r   r   Útest_http_SSL£  s   ÿÿzHandshakeTest.test_http_SSLc                 C   sP   t jt ¡ jt ¡ jdœd}| jt jj|j	dddddgdd	d
dddœd	 d S )N)Úca_certsÚca_cert_pathrÇ   ru   Ú	chocolateztesting_websockets.comz+echo.websocket.events/websocket-client-testÚ	testprotor_   Ú123Ú	TestValuezk9kFAUWNAMmf5OEMfTlOEA==Únewprotocol)ÚCustomHeader1ÚCookiezSec-WebSocket-KeyzSec-WebSocket-Protocol)ÚcookieÚoriginÚhostÚsubprotocolsrN   r[   )
r8   rk   r¨   rÈ   ÚcafilerÉ   r`   r¤   r¥   r¦   ©r   Úwebsock3r   r   r   ÚtestManualHeaders¬  s   
ÿ
ý
úzHandshakeTest.testManualHeadersc                 C   s   t  ¡ }|  t|jd¡ d S )Nz2001:4860:4860::8888)r8   rk   r`   rš   r¦   )r   rÌ   r   r   r   ÚtestIPv6»  s   zHandshakeTest.testIPv6c                 C   s>   t  ¡ }|  t|jd¡ |  t j|jd¡ |  t|jd¡ d S )Nzws//example.comzws://examplezexample.com)r8   rk   r`   rš   r¦   ÚWebSocketAddressExceptionrÜ   r   r   r   ÚtestBadURLs¿  s   zHandshakeTest.testBadURLsN)
r   r	   r
   r´   rµ   r   rÍ   rÞ   rß   rá   r   r   r   r   rÁ   ¢  s    



rÁ   Ú__main__)%r.   Úos.pathr}   rL   r8   r´   Úwebsocket._handshaker   r   rX   Úwebsocket._httpr   Úwebsocket._utilsr   Úbase64r   rH   r¨   r   ÚImportErrorr#   ÚenvironÚgetr   r   r¶   r:   r   r   r,   ÚTestCaser7   r·   r½   rÁ   r   Úmainr   r   r   r   Ú<module>   s@   þ	  7	
$ÿ