
=\•j·>  ã               @   s  d  Z  d d l Z d g e j d d … <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 e j r¶ d d l m Z n d d l m Z e j d d	 k oé e j d
 d k  rû d d l Z n d d l Z y d d l m Z Wn( e k
 rEGd d „  d e ƒ Z Yn Xe j j d d ƒ d k Z d Z  d d „  Z! Gd d „  d e" ƒ Z# Gd d „  d e# ƒ Z$ Gd d „  d e j% ƒ Z& Gd d „  d e j% ƒ Z' Gd d „  d e j% ƒ Z( e) d k r e j* ƒ  d S) z

é    NÚ )Ú_create_sec_websocket_keyÚ	_validate)Úread_headers)Úvalidate_utf8)Údecodebytes)Údecodestringé   é   é   )ÚSSLErrorc               @   s   e  Z d  Z d S)r   N)Ú__name__Ú
__module__Ú__qualname__© r   r   úJ/tmp/pip-build-jxowagp5/websocket-client/websocket/tests/test_websocket.pyr   :   s   r   ÚTEST_WITH_INTERNETÚ0Ú1Tc             C   s   d S)NZabcdr   )Ú_r   r   r   Úcreate_mask_keyB   s    r   c               @   sX   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__G   s    	zSockMock.__init__c             C   s   |  j  j | ƒ d  S)N)r   Úappend)r   r   r   r   r   Ú
add_packetK   s    zSockMock.add_packetc             C   s   d  S)Nr   )r   r   r   r   Ú
gettimeoutN   s    zSockMock.gettimeoutc             C   sq   |  j  rm |  j  j d ƒ } t | t ƒ r0 | ‚ t | ƒ | k r_ |  j  j d | | d  … ƒ | d  | … Sd  S)Nr   )r   ÚpopÚ
isinstanceÚ	ExceptionÚlenÚinsert)r   ÚbufsizeÚer   r   r   ÚrecvQ   s    	zSockMock.recvc             C   s   |  j  j | ƒ t | ƒ S)N)r   r   r"   )r   r   r   r   r   ÚsendZ   s    zSockMock.sendc             C   s   d  S)Nr   )r   r   r   r   Úclose^   s    zSockMock.closeN)	r   r   r   r   r   r   r&   r'   r(   r   r   r   r   r   F   s   	r   c               @   s   e  Z d  Z d d „  Z d S)ÚHeaderSockMockc          	   C   s^   t  j |  ƒ t j j t j j t ƒ | ƒ } t | d ƒ � } |  j | j	 ƒ  ƒ Wd  QRXd  S)NÚrb)
r   r   ÚosÚpathÚjoinÚdirnameÚ__file__Úopenr   Úread)r   Úfnamer,   Úfr   r   r   r   d   s    !zHeaderSockMock.__init__N)r   r   r   r   r   r   r   r   r)   b   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 d „  Z	 d d „  Z
 d d „  Z e j e d ƒ d d „  ƒ Z e j 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 j e d ƒ d( d) „  ƒ Z e j e d ƒ d* d+ „  ƒ Z e j e d ƒ d, d- „  ƒ Z e j e d ƒ d. d/ „  ƒ Z e j e d ƒ d0 d1 „  ƒ Z d2 S)3ÚWebSocketTestc             C   s   t  j t ƒ d  S)N)ÚwsZenableTraceÚ	TRACEABLE)r   r   r   r   ÚsetUpl   s    zWebSocketTest.setUpc             C   s   d  S)Nr   )r   r   r   r   ÚtearDowno   s    zWebSocketTest.tearDownc             C   sJ   |  j  t j ƒ  d  ƒ t j d ƒ |  j  t j ƒ  d ƒ t j d  ƒ d  S)Né
   )ÚassertEqualr5   ÚgetdefaulttimeoutÚsetdefaulttimeout)r   r   r   r   ÚtestDefaultTimeoutr   s    z WebSocketTest.testDefaultTimeoutc             C   s<   t  ƒ  } |  j | d k ƒ |  j t j d ƒ | k ƒ d  S)Né   u   Â¥n)r   Ú
assertTrueÚsixÚu)r   Úkeyr   r   r   Ú	testWSKeyx   s    	zWebSocketTest.testWSKeyc             C   s8   t  ƒ  } t | j d ƒ ƒ } |  j d t | ƒ ƒ d S)z9 WebSocket key should be a random 16-byte nonce.
        zutf-8é   N)r   Úbase64decodeÚencoder:   r"   )r   rB   Únoncer   r   r   Ú	testNonce}   s    	zWebSocketTest.testNoncec             C   sý  d } d d d d d d i } |  j  t | | d  ƒ d ƒ | j ƒ  } d | d <|  j  t | | d  ƒ d ƒ | d =|  j  t | | d  ƒ d ƒ | j ƒ  } d
 | d <|  j  t | | d  ƒ d ƒ | d =|  j  t | | d  ƒ d ƒ | j ƒ  } d
 | d <|  j  t | | d  ƒ d ƒ | d =|  j  t | | d  ƒ d ƒ | j ƒ  } d | d <|  j  t | | d d g ƒ d ƒ |  j  t | | d d g ƒ d ƒ | j ƒ  } d | d <|  j  t | | d d g ƒ d ƒ | j ƒ  } |  j  t | | d d g ƒ d ƒ d  S)Nzc6b8hTg4EeGb2gQMztV1/g==ÚupgradeÚ	websocketÚ
connectionzsec-websocket-acceptzKxep+hNu9n51529fGidYu7a3wO0=TÚhttpFÚ	somethingÚsub1zsec-websocket-protocolZsub2Zsub3ZsUb1ZSub1ZsuB2)TN)FN)FN)FN)FN)FN)FN)TrN   )FN)TrN   )FN)r:   Ú_validate_headerÚcopy)r   rB   Zrequired_headerÚheaderr   r   r   ÚtestWsUtils„   s:    



""
"zWebSocketTest.testWsUtilsc             C   s¨   t  t d ƒ ƒ \ } } } |  j | d ƒ |  j | d d ƒ t  t d ƒ ƒ \ } } } |  j | d ƒ |  j | d d ƒ t d ƒ |  j t j t  t d ƒ ƒ d  S)Nzdata/header01.txtée   rK   ZUpgradezdata/header03.txtzUpgrade, Keep-Alivezdata/header02.txt)r   r)   r:   ÚassertRaisesr5   ÚWebSocketException)r   ÚstatusrQ   Zstatus_messager   r   r   ÚtestReadHeaderª   s    
zWebSocketTest.testReadHeaderc             C   sÐ   t  j ƒ  } | j t ƒ t d ƒ } | _ | j d ƒ |  j | j d t	 j
 d ƒ ƒ | j d ƒ |  j | j d t	 j
 d ƒ ƒ | j d ƒ |  j | j d t	 j
 d ƒ ƒ |  j | j d ƒ d	 ƒ d  S)
Nzdata/header01.txtÚHellor   u   Â�Â…abcd)u   ã�“ã‚“ã�«ã�¡ã�¯r
   u&   Â�Â�abcdÂ‚Ã£Ã°Â‡Ã£Ã±Â€Ã¥ÃŠÂ�Ã¢Ã…Â‚Ã£ÃŒs   1111111111101é   )r5   Ú	WebSocketÚset_mask_keyr   r)   Úsockr'   r:   r   r@   ÚbZsend_binary)r   r\   Úsr   r   r   ÚtestSend¶   s       zWebSocketTest.testSendc             C   sŠ   t  j ƒ  } t ƒ  } | _ t j d ƒ } | j | ƒ | j ƒ  } |  j | d ƒ | j t j d ƒ ƒ | j ƒ  } |  j | d ƒ d  S)Nu&   Â�Â�abcdÂ‚Ã£Ã°Â‡Ã£Ã±Â€Ã¥ÃŠÂ�Ã¢Ã…Â‚Ã£ÃŒu   ã�“ã‚“ã�«ã�¡ã�¯u   Â�Â…abcd)rX   )	r5   rZ   r   r\   r@   r]   r   r&   r:   )r   r\   r^   rM   r   r   r   r   ÚtestRecvÉ   s    zWebSocketTest.testRecvz%Internet-requiring tests are disabledc             C   s;   d } x. t  j d ƒ D] } | d 8} | d k r Pq Wd  S)Nr	   zwss://stream.meetup.com/2/rsvpsr
   r   )r5   Úcreate_connection)r   Úcountr   r   r   r   ÚtestIterÖ   s
    
zWebSocketTest.testIterc             C   s/   t  j d ƒ } |  j t t t | ƒ ƒ ƒ d  S)Nzwss://stream.meetup.com/2/rsvps)r5   ra   r:   ÚstrÚtypeÚnext)r   r\   r   r   r   ÚtestNextÞ   s    zWebSocketTest.testNextc             C   sô   t  j ƒ  } t ƒ  } | _ | j t j d ƒ ƒ | j t j ƒ  ƒ | j t j d ƒ ƒ | j t j d ƒ ƒ |  j	 t  j
 ƒ � | j j d ƒ Wd  QRX| j j d ƒ } |  j | t j d ƒ ƒ |  j	 t  j ƒ � | j j d ƒ Wd  QRXd  S)NZfooÚbarZbazé	   Z	foobarbazr
   )r5   rZ   r   r\   r   r@   r]   ÚsocketÚtimeoutrT   ÚWebSocketTimeoutExceptionZframe_bufferZrecv_strictr:   Ú"WebSocketConnectionClosedException)r   r\   r^   r   r   r   r   ÚtestInternalRecvStrictã   s    z$WebSocketTest.testInternalRecvStrictc             C   s  t  j ƒ  } t ƒ  } | _ | j t j d ƒ ƒ | j t j ƒ  ƒ | j t j d ƒ ƒ | j t j ƒ  ƒ | j t j d ƒ ƒ |  j	 t  j
 ƒ � | j ƒ  Wd  QRX|  j	 t  j
 ƒ � | j ƒ  Wd  QRX| j ƒ  } |  j | d ƒ |  j	 t  j ƒ � | j ƒ  Wd  QRXd  S)Nõ   Â�u   Â�abcd)zNC3 @zHello, World!)r5   rZ   r   r\   r   r@   r]   rj   rk   rT   rl   r&   r:   rm   )r   r\   r^   r   r   r   r   ÚtestRecvTimeoutø   s    zWebSocketTest.testRecvTimeoutc          	   C   sŒ   t  j ƒ  } t ƒ  } | _ | j t j d ƒ ƒ | j t j d ƒ ƒ | j ƒ  } |  j | d ƒ |  j	 t  j
 ƒ � | j ƒ  Wd  QRXd  S)Nu   Â‹abcd#DCu   Â€Â�abcd
DADzBrevity is the soul of wit)r5   rZ   r   r\   r   r@   r]   r&   r:   rT   rm   )r   r\   r^   r   r   r   r   ÚtestRecvWithSimpleFragmentation	  s    z-WebSocketTest.testRecvWithSimpleFragmentationc             C   sG  t  j d d ƒ } t ƒ  } | _ | j t j d ƒ ƒ | j t j d ƒ ƒ | j t j d ƒ ƒ | j ƒ  \ } } |  j | t j d ƒ ƒ | j ƒ  \ } } |  j | t j d ƒ ƒ | j ƒ  \ } } |  j | t j d ƒ ƒ | j t j d ƒ ƒ |  j	 t  j
 ƒ � | j ƒ  Wd  QRX|  j	 t  j ƒ � | j ƒ  Wd  QRXd  S)	NZfire_cont_frameTu   Â‹abcd#DCu    Â‹abcd#DCu   Â€Â�abcd
DADzBrevity is zthe soul of witu   Â€Â‹abcd#DC)r5   rZ   r   r\   r   r@   r]   Z	recv_datar:   rT   rU   rm   r&   )r   r\   r^   r   r   r   r   r   Ú$testRecvWithFireEventOfFragmentation  s     z2WebSocketTest.testRecvWithFireEventOfFragmentationc             C   sš   t  j ƒ  } t ƒ  | _ d | _ | j ƒ  |  j | j d ƒ t  j ƒ  } t ƒ  } | _ d | _ | j t j	 d ƒ ƒ | j
 ƒ  |  j | j d ƒ d  S)NTFu
   ÂˆÂ€Â˜pÂ„)r5   rZ   r   r\   Ú	connectedr(   r:   r   r@   r]   r&   )r   r\   r^   r   r   r   Ú	testClose/  s    	
	
zWebSocketTest.testClosec             C   sL   t  j ƒ  } t ƒ  } | _ | j t j d ƒ ƒ |  j t  j | j	 ƒ d  S)Nu   Â€Â�abcd
DAD)
r5   rZ   r   r\   r   r@   r]   rT   rU   r&   )r   r\   r^   r   r   r   ÚtestRecvContFragmentation=  s    z'WebSocketTest.testRecvContFragmentationc          	   C   s¢   t  j ƒ  } t ƒ  } | _ | j t j d ƒ ƒ | j t j d ƒ ƒ | j t j d ƒ ƒ | j ƒ  } |  j | d ƒ |  j	 t  j
 ƒ � | j ƒ  Wd  QRXd  S)Nu"   Â›abcd. AB
C	C	NCu    ÂŽabcdAMBu   Â€Â‰abcd Az2Once more unto the breach, dear friends, once more)r5   rZ   r   r\   r   r@   r]   r&   r:   rT   rm   )r   r\   r^   r   r   r   r   Ú"testRecvWithProlongedFragmentationD  s    z0WebSocketTest.testRecvWithProlongedFragmentationc             C   sÏ   t  j ƒ  } | j t ƒ t ƒ  } | _ | j t j d ƒ ƒ | j t j d ƒ ƒ | j t j d ƒ ƒ | j	 ƒ  } |  j
 | d ƒ |  j t  j ƒ � | j	 ƒ  Wd  QRX|  j
 | j d t j d ƒ ƒ d  S)Nu   Â‰abcd5D Au   Â‰Â�abcd1C4.,$D

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

)r5   rZ   r[   r   r   r\   r   r@   r]   r&   r:   rT   rm   r   )r   r\   r^   r   r   r   r   Ú(testRecvWithFragmentationAndControlFrameV  s    
z6WebSocketTest.testRecvWithFragmentationAndControlFramec             C   s˜   t  j d ƒ } |  j | d  ƒ | j d ƒ | j ƒ  } |  j | d ƒ | j d ƒ | j ƒ  } |  j | d ƒ |  j t | j d d ƒ | j	 ƒ  d  S)Nzws://echo.websocket.org/zHello, Worldu   ã�“ã�«ã‚ƒã�«ã‚ƒã�¡ã�¯ã€�ä¸–ç•Œr
   r   éÿÿÿÿ)
r5   ra   ÚassertNotEqualr'   r&   r:   rT   Ú
ValueErrorZ
send_closer(   )r   r^   Úresultr   r   r   ÚtestWebSocketi  s    zWebSocketTest.testWebSocketc             C   sG   t  j d ƒ } |  j | d  ƒ | j d ƒ | j d ƒ | j ƒ  d  S)Nzws://echo.websocket.org/rX   ZHi)r5   ra   ry   ZpingZpongr(   )r   r^   r   r   r   ÚtestPingPongw  s
    zWebSocketTest.testPingPongc             C   s�   d d  l  } t j d ƒ } |  j | d  ƒ |  j t | j | j ƒ ƒ |  j | j	 ƒ  d ƒ |  j | j
 ƒ  d  ƒ | j ƒ  d  S)Nr   zwss://api.bitfinex.com/ws/2rS   )Ússlr5   ra   ry   r?   r    r\   Ú	SSLSocketr:   Z	getstatusÚ
getheadersr(   )r   r~   r^   r   r   r   ÚtestSecureWebSocket  s    z!WebSocketTest.testSecureWebSocketc             C   s{   t  j d d d d i ƒ} |  j | d  ƒ | j d ƒ | j ƒ  } |  j | d ƒ |  j t | j d d ƒ | j ƒ  d  S)	Nzws://echo.websocket.org/Úheadersz
User-AgentZPythonWebsocketClientzHello, Worldr
   r   rx   )	r5   ra   ry   r'   r&   r:   rT   rz   r(   )r   r^   r{   r   r   r   ÚtestWebSocketWithCustomHeader‰  s    z+WebSocketTest.testWebSocketWithCustomHeaderc             C   s\   t  j d ƒ } |  j | d  ƒ | j ƒ  |  j t  j | j d ƒ |  j t  j | j ƒ d  S)Nzws://echo.websocket.org/rX   )r5   ra   ry   r(   rT   rm   r'   r&   )r   r^   r   r   r   ÚtestAfterClose”  s
    
zWebSocketTest.testAfterCloseN)r   r   r   r7   r8   r=   rC   rH   rR   rW   r_   r`   ÚunittestÚ
skipUnlessr   rc   rg   rn   rp   rq   rr   rt   ru   rv   rw   r|   r}   r�   rƒ   r„   r   r   r   r   r4   k   s0   &
r4   c               @   s.   e  Z d  Z e j e d ƒ d d „  ƒ Z d S)ÚSockOptTestz%Internet-requiring tests are disabledc             C   s`   t  j t  j d f f } t j d d | ƒ} |  j | j j t  j t  j ƒ d ƒ | j ƒ  d  S)Nr
   zws://echo.websocket.orgÚsockoptr   )	rj   ÚIPPROTO_TCPÚTCP_NODELAYr5   ra   ry   r\   Ú
getsockoptr(   )r   rˆ   r^   r   r   r   ÚtestSockOptž  s    %zSockOptTest.testSockOptN)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   ss   t  t j d ƒ ƒ } |  j | d ƒ t  t j d ƒ ƒ } |  j | d ƒ t  t j d ƒ ƒ } |  j | d ƒ d  S)Nu   Ã°Â�Â€Â€Tu"   ÃŽÂºÃ¡Â½Â¹Ã�ÂƒÃŽÂ¼ÃŽÂµÃ­Â Â€editedFr   )r   r@   r]   r:   )r   Ústater   r   r   ÚtestUtf8Validator§  s    zUtilsTest.testUtf8ValidatorN)r   r   r   r�   r   r   r   r   r�   ¦  s   r�   Ú__main__)+Ú__doc__Úsysr,   r+   Úos.pathrj   r@   rJ   r5   Zwebsocket._handshaker   r   rO   Zwebsocket._httpr   Zwebsocket._utilsr   ÚPY3Úbase64r   rE   r   Úversion_infoZ	unittest2r…   r~   r   ÚImportErrorr!   ÚenvironÚgetr   r6   r   Úobjectr   r)   ZTestCaser4   r‡   r�   r   Úmainr   r   r   r   Ú<module>   s>   	&	ÿ 3	
