
     keH                     6   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
 d dl	mZ d dlmZ d dlmZ 	 	 d dlZd dlmZ e j*                  j-                  d
d      dk(  Ze j*                  j-                  dd      Zedk7  ZdZd Z G d d      Z G d de      Z G d dej<                        Z G d dej<                        Z  G d dej<                        Z! G d dej<                        Z"e#dk(  r ejH                          yy# e$ r  G d d	e      ZY w xY w)    N)decodebytes)_create_sec_websocket_key)	_validate)read_headers)validate_utf8)SSLErrorc                       e Zd Zy)r   N)__name__
__module____qualname__     @/usr/lib/python3/dist-packages/websocket/tests/test_websocket.pyr   r   '   s    r   r   TEST_WITH_INTERNET01LOCAL_WS_SERVER_PORTz-1Tc                      y)Nabcdr   )_s    r   create_mask_keyr   3   s    r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)SockMockc                      g | _         g | _        y N)datasentselfs    r   __init__zSockMock.__init__8   s    		r   c                 :    | j                   j                  |       y r   )r   appendr   r   s     r   
add_packetzSockMock.add_packet<   s    		r   c                      y r   r   r   s    r   
gettimeoutzSockMock.gettimeout?   s    r   c                     | j                   r_| j                   j                  d      }t        |t              r|t	        |      |kD  r| j                   j                  d||d         |d | S y )Nr   )r   pop
isinstance	Exceptionleninsert)r   bufsizees      r   recvzSockMock.recvB   sa    99		a A!Y'1v		  AghK0Xg; r   c                 N    | j                   j                  |       t        |      S r   )r   r"   r+   r#   s     r   sendzSockMock.sendK   s    		4yr   c                      y r   r   r   s    r   closezSockMock.closeO       r   N)	r
   r   r   r    r$   r&   r/   r1   r3   r   r   r   r   r   7   s     r   r   c                       e Zd Zd Zy)HeaderSockMockc                 0   t         j                  |        t        j                  j	                  t        j                  j                  t              |      }t        |d      5 }| j                  |j                                d d d        y # 1 sw Y   y xY w)Nrb)
r   r    ospathjoindirname__file__openr$   read)r   fnamer:   fs       r   r    zHeaderSockMock.__init__T   sd    $ww||BGGOOH5u=$ 	&OOAFFH%	& 	& 	&s   # BBN)r
   r   r   r    r   r   r   r6   r6   S   s    &r   r6   c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z ej                  ed
      d        Z ej                  ed
      d        Zd Zd Zd Zd Zd Zd Zd Zd Z ej                  ed      d        Z ej                  ed      d        Z ej                  ed
      d        Z ej                  ed
      d        Z ej                  ed      d        Z ej                  ed      d        Zy)WebSocketTestc                 6    t        j                  t               y r   )wsenableTrace	TRACEABLEr   s    r   setUpzWebSocketTest.setUp\   s    
y!r   c                      y r   r   r   s    r   tearDownzWebSocketTest.tearDown_   r4   r   c                     | j                  t        j                         d        t        j                  d       | j                  t        j                         d       t        j                  d        y )N
   )assertEqualrE   getdefaulttimeoutsetdefaulttimeoutr   s    r   testDefaultTimeoutz WebSocketTest.testDefaultTimeoutb   sP    --/6
R --/4
T"r   c                 f    t               }| j                  |dk7         | j                  d|v       y )N   u   ¥n)r   
assertTrue)r   keys     r   	testWSKeyzWebSocketTest.testWSKeyh   s+    ')r	"S()r   c                     t               }t        |j                  d            }| j                  dt	        |             y)z/WebSocket key should be a random 16-byte nonce.zutf-8   N)r   base64decodeencoderM   r+   )r   rT   nonces      r   	testNoncezWebSocketTest.testNoncem   s1    ')SZZ01SZ(r   c                    d}d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       |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       y )Nzc6b8hTg4EeGb2gQMztV1/g==	websocketupgradezKxep+hNu9n51529fGidYu7a3wO0=)r^   
connectionsec-websocket-accept)TNhttp)FN	somethingr_   r`   sub1zsec-websocket-protocolsub2)Trc   sub3sUb1Sub1suB2)rM   _validate_headercopy)r   rT   required_headerheaders       r   testWsUtilszWebSocketTest.testWsUtilss   s   ("#$B

 	)/3E|T %%'"y)&#t<mL9)&#t<mL %%'*|)&#t<mL< )&#t<mL %%')4%&)&#t<mL)*)&#t<mL %%'+1'(VS66*:;^	
 	)&#7GH-X %%'+1'(VS66*:;^	
 !%%')&#7GH-Xr   c                 r   t        t        d            \  }}}| j                  |d       | j                  |d   d       t        t        d            \  }}}| j                  |d       | j                  |d   d       t        d       | j                  t        j
                  t         t        d             y )Ndata/header01.txte   r_   Upgradezdata/header03.txtzUpgrade, Keep-Alivezdata/header02.txt)r   r6   rM   assertRaisesrE   WebSocketException)r   statusrl   status_messages       r   testReadHeaderzWebSocketTest.testReadHeader   s    )5./*
& 	%-y9)5./*
& 	%-/DE*+!!<@S1T	
r   c                 |   t        j                         }|j                  t               t	        d      x}|_        |j                  d       | j                  |j                  d   d       |j                  d       | j                  |j                  d   d       | j                  |j                  d      d	       y )
Nro   Hellor      abcd)   こんにちは      abcdʁłs   1111111111101   )
rE   	WebSocketset_mask_keyr   r6   sockr1   rM   r   send_binaryr   r   ss      r   testSendzWebSocketTest.testSend   s    ||~/*&':;;DI		'$DE		#$FF1IW	
 	))*:;R@r   c                    t        j                         }t               x}|_        d}|j	                  |       |j                         }| j                  |d       |j	                  d       |j                         }| j                  |d       y )Nr|   rz   ry   rx   )rE   r~   r   r   r$   r/   rM   )r   r   r   rb   r   s        r   testRecvzWebSocketTest.testRecv   su    ||~ 
"DIW 	 	
Yyy{01	56yy{w'r   %Internet-requiring tests are disabledc                 z    d}t        j                  d      }|j                  d       |D ]  }|dz  }|dk(  s y  y )N   wss://api.bitfinex.com/ws/2z+{"event": "subscribe", "channel": "ticker"}r{   r   )rE   create_connectionr1   )r   countr   r   s       r   testIterzWebSocketTest.testIter   sG      !>?	<= 	AQJEz	r   c                 ~    t        j                  d      }| j                  t        t	        t        |                   y )Nr   )rE   r   rM   strtypenext)r   r   s     r   testNextzWebSocketTest.testNext   s,    ##$ABd4:./r   c                    t        j                         }t               x}|_        |j	                  d       |j	                  t        j                                |j	                  d       |j	                  d       | j                  t         j                        5  |j                  j                  d       d d d        |j                  j                  d      }| j                  |d       | j                  t         j                        5  |j                  j                  d       d d d        y # 1 sw Y   zxY w# 1 sw Y   y xY w)Ns   foos   bars   baz	   s	   foobarbazr{   )rE   r~   r   r   r$   sockettimeoutrr   WebSocketTimeoutExceptionframe_bufferrecv_strictrM   "WebSocketConnectionClosedExceptionr   r   r   r   s       r   testInternalRecvStrictz$WebSocketTest.testInternalRecvStrict   s    ||~ 
"DI	V	V^^%&	V	Vr;;< 	-))!,	-   ,,Q/|,rDDE 	-))!,	- 	-	- 	-	- 	-s   D0D<0D9<Ec                    t        j                         }t               x}|_        |j	                  d       |j	                  t        j                                |j	                  d       |j	                  t        j                                |j	                  d       | j                  t         j                        5  |j                          d d d        | j                  t         j                        5  |j                          d d d        |j                         }| j                  |d       | j                  t         j                        5  |j                          d d d        y # 1 sw Y   xY w# 1 sw Y   pxY w# 1 sw Y   y xY w)N   s
   abcd)s   NC3 @zHello, World!)rE   r~   r   r   r$   r   r   rr   r   r/   rM   r   r   s       r   testRecvTimeoutzWebSocketTest.testRecvTimeout   s   ||~ 
"DI	W	V^^%&	45	V^^%&	89r;;< 	IIK	r;;< 	IIK	yy{/rDDE 	IIK	 		 		 		 	s$   >E*6E6F*E36E?Fc                 ^   t        j                         }t               x}|_        |j	                  d       |j	                  d       |j                         }| j                  |d       | j                  t         j                        5  |j                          d d d        y # 1 sw Y   y xY w)N   abcd#DC   abcd
DADzBrevity is the soul of wit	rE   r~   r   r   r$   r/   rM   rr   r   r   s       r   testRecvWithSimpleFragmentationz-WebSocketTest.testRecvWithSimpleFragmentation  s    ||~ 
"DI	GH	QRyy{;<rDDE 	IIK	 	 	s   	B##B,c                    t        j                  d      }t               x}|_        |j	                  d       |j	                  d       |j	                  d       |j                         \  }}| j                  |d       |j                         \  }}| j                  |d       |j                         \  }}| j                  |d       |j	                  d       | j                  t         j                        5  |j                          d d d        | j                  t         j                        5  |j                          d d d        y # 1 sw Y   BxY w# 1 sw Y   y xY w)	NT)fire_cont_framer   s    abcd#DCr   s   Brevity is s   the soul of wits   abcd#DC)rE   r~   r   r   r$   	recv_datarM   rr   rs   r   r/   )r   r   r   r   r   s        r   $testRecvWithFireEventOfFragmentationz2WebSocketTest.testRecvWithFireEventOfFragmentation  s!   ||D1 
"DI	GH	GH	QR.."4~..."4~..."412 	
GHr445 	NN	 rDDE 	IIK	 		 		 	s   :E2EEE!c                 $   t        j                         }d|_        |j                   t        j                         }t	               x}|_        d|_        |j                  d       |j                          | j                  |j                  d       y )NTs   pF)	rE   r~   	connectedr3   r   r   r$   r/   rM   r   s      r   	testClosezWebSocketTest.testClose+  se    ||~

||~ 
"DI	-.		/r   c                     t        j                         }t               x}|_        |j	                  d       | j                  t         j                  |j                         y )Nr   )rE   r~   r   r   r$   rr   rs   r/   r   s      r   testRecvContFragmentationz'WebSocketTest.testRecvContFragmentation7  sB    ||~ 
"DI	QR"//;r   c                    t        j                         }t               x}|_        |j	                  d       |j	                  d       |j	                  d       |j                         }| j                  |d       | j                  t         j                        5  |j                          d d d        y # 1 sw Y   y xY w)Ns!   abcd. AB
C	C	NCs    abcdAMBs   abcd Az2Once more unto the breach, dear friends, once morer   r   s       r   "testRecvWithProlongedFragmentationz0WebSocketTest.testRecvWithProlongedFragmentation>  s    ||~ 
"DI	j	
 	
QR	EFyy{STrDDE 	IIK	 	 	s   B44B=c                    t        j                         }|j                  t               t	               x}|_        |j                  d       |j                  d       |j                  d       |j                         }| j                  |d       | j                  t         j                        5  |j                          d d d        | j                  |j                  d   d       y # 1 sw Y   )xY w)Ns   abcd5D As   abcd1C4.,$D

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

)rE   r~   r   r   r   r   r$   r/   rM   rr   r   r   r   s       r   (testRecvWithFragmentationAndControlFramez6WebSocketTest.testRecvWithFragmentationAndControlFrameN  s    ||~/* 
"DI	=>	KL	WXyy{9:rDDE 	IIK	FF1IM	
	 	s   /C((C1/Tests using local websocket server are disabledc                    t        j                  dt               }| j                  |d        |j	                  d       |j                         }|j                          | j                  |d       |j	                  d       |j                         }| j                  |d       | j                  t        |j                  dd       |j                          y )Nws://127.0.0.1:Hello, Worldu   こにゃにゃちは、世界 )rE   r   r   assertNotEqualr1   r   filenorM   r/   rr   
ValueError
send_closer3   r   r   results      r   testWebSocketzWebSocketTest.testWebSocket`  s       ?3G2H!IJAt$	~	
0	/0!AB*allB;		r   c                     t        j                  dt               }| j                  |d        |j	                  d       |j                  d       |j                          y )Nr   rx   Hi)rE   r   r   r   pingpongr3   r   r   s     r   testPingPongzWebSocketTest.testPingPongq  sL       ?3G2H!IJAt$	w	t		r   c                     t        j                         }| j                  t         j                  j                  |j
                  d       y )Nzws://google.com/)rE   r~   rr   _exceptionsWebSocketBadStatusExceptionconnectr   s     r   testSupportRedirectz!WebSocketTest.testSupportRedirect{  s1    LLNNN66		CU	
r   c                    dd l }t        j                  d      }| j                  |d        | j	                  t        |j                  |j                               | j                  |j                         d       | j                  |j                         d        |j                  d       | j                  |j                         d       | j                  |j                         d        |j                          y )Nr   r   rp   rL   )sslrE   r   r   rS   r)   r   	SSLSocketrM   	getstatus
getheaders
settimeoutr&   getsubprotocolabort)r   r   r   s      r   testSecureWebSocketz!WebSocketTest.testSecureWebSocket  s      !>?At$
1663==9:,ALLND1	R,))+T2		r   c                 r   t        j                  dt         ddi      }| j                  |d        | j	                  |j                         d        |j                  d       |j                         }| j	                  |d       | j                  t        |j                  dd       |j                          y )Nr   z
User-AgentPythonWebsocketClient)headersr   r   r   )rE   r   r   r   rM   r   r1   r/   rr   r   r3   r   s      r   testWebSocketWithCustomHeaderz+WebSocketTest.testWebSocketWithCustomHeader  s       234!#:;
 	At$))+T2	~0*aggr26		r   c                 *   t        j                  dt               }| j                  |d        |j	                          | j                  t         j                  |j                  d       | j                  t         j                  |j                         y )Nr   rx   )	rE   r   r   r   r3   rr   r   r1   r/   r   s     r   testAfterClosezWebSocketTest.testAfterClose  sl       ?3G2H!IJAt$		"??Q"??Hr   N) r
   r   r   rH   rJ   rP   rU   r[   rm   rv   r   r   unittest
skipUnlessr   r   r   r   r   r   r   r   r   r   r   TEST_WITH_LOCAL_SERVERr   r   r   r   r   r   r   r   r   rC   rC   [   s   "#*
)+YZ
$A&( X+-TU V X+-TU0 V0-""
4
0< 
$ X Q X Q X+-TU
 V
 X+-TU V X Q X QIIr   rC   c                   >    e Zd Z ej                  ed      d        Zy)SockOptTestr   c                 4   t         j                  t         j                  dff}t        j                  dt
         |      }| j                  |j                  j                  t         j                  t         j                        d       |j                          y )Nr{   r   )sockoptr   )
r   IPPROTO_TCPTCP_NODELAYrE   r   r   r   r   
getsockoptr3   )r   r   r   s      r   testSockOptzSockOptTest.testSockOpt  sz     &&(:(:A>@  234g
 	FFf00&2D2DEq	
 	
	r   N)r
   r   r   r   r   r   r   r   r   r   r   r     s'    X Qr   r   c                       e Zd Zd Zy)	UtilsTestc                     t        d      }| j                  |d       t        d      }| j                  |d       t        d      }| j                  |d       y )Ns   𐀀Ts   κόσμεeditedFr   )r   rM   )r   states     r   testUtf8ValidatorzUtilsTest.testUtf8Validator  sV    12%M
 	&c"%r   N)r
   r   r   r   r   r   r   r   r     s    &r   r   c                   |    e Zd Z ej                  ed      d        Z ej                  ed      d        Zd Zd Z	y)HandshakeTestr   c                 "   t        j                  dt        j                         j                  id      }| j                  t        |j                  d       t        j                  ddi      }| j                  t        |j                  d       y )N
cert_chainF)ssloptenable_multithreadr   certfilemyNonexistentCertFiler   )	rE   r~   r   get_default_verify_pathscapathrr   r   r   FileNotFoundError)r   websock1websock2s      r   test_http_SSLzHandshakeTest.test_http_SSL  su    << #">">"@"G"GH$
 	*h&6&68UV<<
4K'LMx//1N	
r   c                 *   t        j                  t        j                         j                  t        j                         j
                  d      }| j                  t         j                  j                  |j                  dddddgdd	d
ddd	       y )N)ca_certsca_cert_pathr   r   	chocolateztesting_websockets.comz+echo.websocket.events/websocket-client-test	testprotorq   123	TestValuezk9kFAUWNAMmf5OEMfTlOEA==newprotocol)CustomHeader1CookiezSec-WebSocket-KeyzSec-WebSocket-Protocol)cookieoriginhostsubprotocolsr_   rl   )
rE   r~   r   r   cafiler   rr   r   r   r   r   websock3s     r   testManualHeaderszHandshakeTest.testManualHeaders  s    <<88:AA # < < > E E
 	NN66)+>% !&%%?*7	 	 	
r   c                 n    t        j                         }| j                  t        |j                  d       y )Nz2001:4860:4860::8888)rE   r~   rr   r   r   )r   r   s     r   testIPv6zHandshakeTest.testIPv6  s&    <<>*h&6&68NOr   c                    t        j                         }| j                  t        |j                  d       | j                  t         j
                  |j                  d       | j                  t        |j                  d       y )Nzws//example.comzws://examplezexample.com)rE   r~   rr   r   r   WebSocketAddressExceptionr  s     r   testBadURLszHandshakeTest.testBadURLs  sa    <<>*h&6&68IJ(((*:*:N	
 	*h&6&6Fr   N)
r
   r   r   r   r   r   r   r	  r  r  r   r   r   r   r     sX    X+-TU	
 V	
 X+-TU
 V
0PGr   r   __main__)%r9   os.pathr   r   base64r   rX   r]   rE   websocket._handshaker   r   ri   websocket._httpr   websocket._utilsr   r   r   ImportErrorr*   environgetr   r   r   rG   r   r   r6   TestCaserC   r   r   r   r
   mainr   r   r   <module>r     s   
    .  : > ( *& ZZ^^$8#>#E zz~~&<dC -5 	 8&X &NIH%% NIb
(## 	&!! 	&0GH%% 0Gf zHMMO k  9 s   
D DD