3 L(Ycg @sddlZdgejdd<ddlZddlZddlZddlZddlZddlm Z m Z ddl m Z ddlmZmZddlmZejrddlmZn ddlmZejdd krejd d krddlZnddlZydd lmZWn$ek rGd ddeZYnXejj dddkZ!dZ"dZ#ddZ$Gddde%Z&Gddde&Z'Gdddej(Z)Gdddej(Z*Gdddej(Z+Gd d!d!ej(Z,Gd"d#d#ej(Z-e.d$krej/dS)%N)_create_sec_websocket_key _validate) read_headers)get_proxy_info parse_url) validate_utf8) decodebytes) decodestring)SSLErrorc@s eZdZdS)rN)__name__ __module__ __qualname__rrR/private/tmp/pip-build-nl73fm5q/websocket-client/websocket/tests/test_websocket.pyr#srTEST_WITH_INTERNET01TFcCsdS)NZabcdr)_rrrcreate_mask_key.src@s4eZdZddZddZddZddZd d Zd S) SockMockcCsg|_g|_dS)N)datasent)selfrrr__init__3szSockMock.__init__cCs|jj|dS)N)rappend)rrrrr add_packet7szSockMock.add_packetcCsR|jrN|jjd}t|tr |t||krB|jjd||d|d|SdS)Nr)rpop isinstance Exceptionleninsert)rbufsizeerrrrecv:s   z SockMock.recvcCs|jj|t|S)N)rrr#)rrrrrsendCs z SockMock.sendcCsdS)Nr)rrrrcloseGszSockMock.closeN)rrrrrr'r(r)rrrrr2s  rc@seZdZddZdS)HeaderSockMockc CsHtj|tjjtjjt|}t|d}|j|j WdQRXdS)Nrb) rrospathjoindirname__file__openrread)rfnamer-frrrrMs  zHeaderSockMock.__init__N)rrrrrrrrr*Ksr*c@s4eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ e j edddZe j edddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Ze j edd(d)Ze j edd*d+Ze j ede j ed,d-d.Ze j edd/d0Ze j edd1d2Zd3d4Zd5S)6 WebSocketTestcCstjtdS)N)ws enableTrace TRACEABLE)rrrrsetUpUszWebSocketTest.setUpcCsdS)Nr)rrrrtearDownXszWebSocketTest.tearDowncCs8|jtjdtjd|jtjdtjddS)N ) assertEqualr6getdefaulttimeoutsetdefaulttimeout)rrrrtestDefaultTimeout[s z WebSocketTest.testDefaultTimeoutcCstd}|j|dd|j|dd|j|dd|j|dd td }|j|dd|j|dd|j|dd |j|dd td }|j|dd|j|dd|j|dd |j|dd td}|j|dd|j|dd|j|dd |j|dd td}|j|dd|j|dd|j|dd|j|dd td}|j|dd|j|dd|j|dd |j|dd td}|j|dd|j|dd|j|dd |j|dd td}|j|dd|j|dd|j|dd|j|ddtd}|j|dd|j|dd|j|dd|j|dd|jttdtjddkrtjddkrdStd}|j|dd|j|dd|j|dd|j|dd td}|j|dd|j|dd|j|dd|j|dd td}|j|dd|j|dd|j|dd|j|ddtd}|j|dd|j|dd|j|dd|j|dddS)Nzws://www.example.com/rrzwww.example.comr Pr z/rFzws://www.example.com/r/z/r/zws://www.example.com//zws://www.example.comzws://www.example.com:8080/rizws://www.example.com:8080/zws://www.example.com:8080zwss://www.example.com:8080/rTz&wss://www.example.com:8080/r?key=valuez /r?key=valuezhttp://www.example.com/rr zws://[2a03:4000:123:83::3]/rz2a03:4000:123:83::3z!ws://[2a03:4000:123:83::3]:8080/rzwss://[2a03:4000:123:83::3]/riz"wss://[2a03:4000:123:83::3]:8080/r)rr< assertRaises ValueErrorsys version_info)rprrr testParseUrlas zWebSocketTest.testParseUrlcCs,t}|j|dk|jtjd|kdS)Nu¥n)r assertTruesixu)rkeyrrr testWSKeyszWebSocketTest.testWSKeycCsJd}dddd}|jt||dd|j}d|d<|jt||dd|d=|jt||dd|j}d |d <|jt||dd|d =|jt||dd|j}d |d <|jt||dd|d =|jt||dd|j}d |d <|jt||d dgd|jt||ddgd|j}d|d <|jt||ddgddS)Nzc6b8hTg4EeGb2gQMztV1/g== websocketupgradezKxep+hNu9n51529fGidYu7a3wO0=)rP connectionzsec-websocket-acceptThttpF somethingrQzsec-websocket-acceptsub1zsec-websocket-protocolZsub2Zsub3ZsUb1ZSub1ZsuB2)TN)FN)FN)FN)FN)FN)FN)TrT)FN)TrT)r<_validate_headercopy)rrMZrequired_headerheaderrrr testWsUtilss6zWebSocketTest.testWsUtilscCsLttd\}}|j|d|j|ddtd|jtjttddS)Nzdata/header01.txterQZUpgradezdata/header02.txt)rr*r<rCr6WebSocketException)rstatusrWrrrtestReadHeaders  zWebSocketTest.testReadHeadercCstj}|jttd}|_|jd|j|jdt j d|jd|j|jdt j d|jd|j|jdt j d|jdd dS) Nzdata/header01.txtHelloru …abcd)uこんにちはr u&abcd‚ãð‡ãñ€åʁâłãÌx) r6 WebSocket set_mask_keyrr*sockr(r<rrKb)rrbsrrrtestSends    zWebSocketTest.testSendcCsdtj}t}|_tjd}|j||j}|j|d|jtjd|j}|j|ddS)Nu&abcd‚ãð‡ãñ€åʁâłãÌuこんにちはu …abcd)r]) r6r`rrbrKrcrr'r<)rrbrdrSrrrrtestRecvs    zWebSocketTest.testRecvz%Internet-requiring tests are disabledcCs.d}x$tjdD]}|d8}|dkrPqWdS)Nr zws://stream.meetup.com/2/rsvpsr r)r6create_connection)rcountrrrrtestIters zWebSocketTest.testItercCs"tjd}|jttt|dS)Nzws://stream.meetup.com/2/rsvps)r6rgr<strtypenext)rrbrrrtestNext s zWebSocketTest.testNextcCstj}t}|_|jtjd|jtj|jtjd|jtjd|j tj |j j dWdQRX|j j d}|j |tjd|j tj|j j dWdQRXdS)NZfoobarZbaz Z foobarbazr )r6r`rrbrrKrcsockettimeoutrCWebSocketTimeoutExceptionZ frame_bufferZ recv_strictr<"WebSocketConnectionClosedException)rrbrdrrrrtestInternalRecvStricts  z$WebSocketTest.testInternalRecvStrictcCstj}t}|_|jtjd|jtj|jtjd|jtj|jtjd|j tj |j WdQRX|j tj |j WdQRX|j }|j |d|j tj |j WdQRXdS)Nu abcd)zNC3@z Hello, World!)r6r`rrbrrKrcrprqrCrrr'r<rs)rrbrdrrrrtestRecvTimeout&s  zWebSocketTest.testRecvTimeoutc Csltj}t}|_|jtjd|jtjd|j}|j|d|j tj |jWdQRXdS)Nu‹abcd#DCu€abcd D A D zBrevity is the soul of wit) r6r`rrbrrKrcr'r<rCrs)rrbrdrrrrtestRecvWithSimpleFragmentation7s  z-WebSocketTest.testRecvWithSimpleFragmentationcCstjdd}t}|_|jtjd|jtjd|jtjd|j\}}|j|tjd|j\}}|j|tjd|j\}}|j|tjd|jtjd|j tj |jWdQRX|j tj |j WdQRXdS) NT)Zfire_cont_frameu‹abcd#DCu‹abcd#DCu€abcd D A D z Brevity is zthe soul of witu€‹abcd#DC) r6r`rrbrrKrcZ recv_datar<rCrZrsr')rrbrdrrrrr$testRecvWithFireEventOfFragmentationCs      z2WebSocketTest.testRecvWithFireEventOfFragmentationcCsptj}t|_d|_|j|j|jdtj}t}|_d|_|jtj d|j |j|jddS)NTFu ˆ€˜p„) r6r`rrb connectedr)r<rrKrcr')rrbrdrrr testClose]s zWebSocketTest.testClosecCs8tj}t}|_|jtjd|jtj|j dS)Nu€abcd D A D ) r6r`rrbrrKrcrCrZr')rrbrdrrrtestRecvContFragmentationks z'WebSocketTest.testRecvContFragmentationc Cs|tj}t}|_|jtjd|jtjd|jtjd|j}|j|d|j tj |jWdQRXdS)Nu"›abcd. A B  C C NCuŽabcdA  MBu€‰abcd A z2Once more unto the breach, dear friends, once more) r6r`rrbrrKrcr'r<rCrs)rrbrdrrrr"testRecvWithProlongedFragmentationrs z0WebSocketTest.testRecvWithProlongedFragmentationc Cstj}|jtt}|_|jtjd|jtjd|jtjd|j }|j |d|j tj |j WdQRX|j |j dtjddS)Nu‰abcd5 D  Au‰abcd1C4.,$D u€abcdCA B  zToo much of a good thingruŠabcd1C4.,$D )r6r`rarrrbrrKrcr'r<rCrsr)rrbrdrrrr(testRecvWithFragmentationAndControlFrames   z6WebSocketTest.testRecvWithFragmentationAndControlFramecCs^tjd}|j|d|jd|j}|j|d|jd|j}|j|d|jdS)Nzws://echo.websocket.org/z Hello, Worlduこにゃにゃちは、世界)r6rgassertNotEqualr(r'r<r))rrdresultrrr testWebSockets      zWebSocketTest.testWebSocketcCs6tjd}|j|d|jd|jd|jdS)Nzws://echo.websocket.org/r]ZHi)r6rgr~ZpingZpongr))rrdrrr testPingPongs     zWebSocketTest.testPingPongz+wss://echo.websocket.org doesn't work well.cCszddl}tjd}|j|d|jt|j|j|jd|j }|j |d|jd|j }|j |d|j dS)Nrzwss://echo.websocket.org/z Hello, Worlduこにゃにゃちは、世界) sslr6rgr~rJr!rb SSLSocketr(r'r<r))rrrdrrrrtestSecureWebSockets      z!WebSocketTest.testSecureWebSocketcCsHtjdddid}|j|d|jd|j}|j|d|jdS)Nzws://echo.websocket.org/z User-AgentZPythonWebsocketClient)headersz Hello, World)r6rgr~r(r'r<r))rrdrrrrtestWebSocketWihtCustomHeaders    z+WebSocketTest.testWebSocketWihtCustomHeadercCsDtjd}|j|d|j|jtj|jd|jtj|jdS)Nzws://echo.websocket.org/r])r6rgr~r)rCrsr(r')rrdrrrtestAfterCloses   zWebSocketTest.testAfterClosecCs(t}t|jd}|jdt|dS)z9 WebSocket key should be a random 16-byte nonce. zutf-8N)r base64decodeencoder<r#)rrMnoncerrr testNonceszWebSocketTest.testNonceN) rrrr9r:r?rHrNrXr\rerfunittest skipUnlessrrirmrtrvrwrxrzr{r|r}rrTEST_SECURE_WSrrrrrrrrr5Ts4T%     r5c@sTeZdZGdddeZddZddZeje ddd Z eje dd d Z d S) WebSocketAppTestc@seZdZdZdS)zWebSocketAppTest.NotSetYetzI A marker class for signalling that a value hasn't been set yet. N)rrr__doc__rrrr NotSetYetsrcCs,tjttjt_tjt_tjt_dS)N)r6r7r8rrkeep_running_openkeep_running_closeget_mask_key_id)rrrrr9s   zWebSocketAppTest.setUpcCs"tjt_tjt_tjt_dS)N)rrrrr)rrrrr:s  zWebSocketAppTest.tearDownz%Internet-requiring tests are disabledcCspdd}dd}tjd||d}|j|jttjtj|jttjtj|j dtj|j dtjd S) z| A WebSocketApp should keep running as long as its self.keep_running is not False (in the boolean context). c_s|jt_|jdS)zn Set the keep_running flag for later inspection and immediately close the connection. N) keep_runningrrr))rargskwargsrrron_opensz1WebSocketAppTest.testKeepRunning..on_openc_s |jt_dS)z< Set the keep_running flag for the test to use. N)rrr)rrrrrron_closesz2WebSocketAppTest.testKeepRunning..on_closezws://echo.websocket.org/)rrTFN) r6 WebSocketApp run_foreverZ assertFalser!rrrrr<)rrrapprrrtestKeepRunnings    z WebSocketAppTest.testKeepRunningcCs>dd}dd}tjd||d}|j|jtjt|dS)zi A WebSocketApp should forward the received mask_key function down to the actual socket. cSsdS)Nrrrrrmy_mask_key_funcsz:WebSocketAppTest.testSockMaskKey..my_mask_key_funcc_st|jt_|jdS)zm Set the value so the test can use it later on and immediately close the connection. N)id get_mask_keyrrr))rrrrrrrs z1WebSocketAppTest.testSockMaskKey..on_openzws://echo.websocket.org/)rrN)r6rrr<rrr)rrrrrrrtestSockMaskKey s z WebSocketAppTest.testSockMaskKeyN) rrrobjectrr9r:rrrrrrrrrrs rc@s eZdZejedddZdS) SockOptTestz%Internet-requiring tests are disabledcCsDtjtjdff}tjd|d}|j|jjtjtjd|jdS)Nr zws://echo.websocket.org)sockoptr) rp IPPROTO_TCP TCP_NODELAYr6rgr~rb getsockoptr))rrrdrrr testSockOpt!szSockOptTest.testSockOptN)rrrrrrrrrrrr src@seZdZddZdS) UtilsTestcCsRttjd}|j|dttjd}|j|dttjd}|j|ddS)Nu𐀀Tu"Îºá½¹ÏƒÎ¼Îµí €editedFr)rrKrcr<)rstaterrrtestUtf8Validator)s   zUtilsTest.testUtf8ValidatorN)rrrrrrrrr(src@s,eZdZddZddZddZddZd S) ProxyInfoTestcCsHtjjdd|_tjjdd|_dtjkr2tjd=dtjkrDtjd=dS)N http_proxy https_proxy)r,environgetrr)rrrrr92s   zProxyInfoTest.setUpcCsP|jr|jtjd<ndtjkr&tjd=|jr:|jtjd<ndtjkrLtjd=dS)Nrr)rr,rr)rrrrr::s  zProxyInfoTest.tearDownc Cs|jtddddd|jtdddddd|jtddddd|jtdddddd|jtddddd d|jtdddddd d|jtddddd d|jtdddddd d|jtddddd gddd!|jtdddddgd"dd#dS)$Nzecho.websocket.orgF localhost) proxy_hostr8 )r proxy_portTarc)r proxy_auth)rrrz example.com)rrno_proxyr)rrN)rrN)rrN)rrN)rrcrrc)rrr)rrcrrc)rrr)rrcrrc)rrr)rrcrrc)rrr)rrcrrc)rrr)rrc)NrN)r<r)rrrrtestProxyFromArgsFs zProxyInfoTest.testProxyFromArgscCsFdtjd<|jtddddtjd<|jtddddtjd<dtjd <|jtddddtjd<d tjd <|jtddddtjd<dtjd <|jtdd ddtjd<d tjd <|jtdd d d tjd<|jtddd"dtjd<|jtddd$d tjd<dtjd <|jtddd&dtjd<dtjd <|jtddd(d tjd<dtjd <|jtdd d*dtjd<dtjd <|jtdd d,d tjd<dtjd <dtjd<|jtdd d.dtjd<dtjd <dtjd<|jtdd d/dtjd<dtjd <dtjd<|jtddd0|jtddd1dS)2Nzhttp://localhost/rzecho.websocket.orgFrzhttp://localhost:3128/8 zhttp://localhost2/rzhttp://localhost2:3128/T localhost2zhttp://a:b@localhost/rrczhttp://a:b@localhost:3128/zhttp://a:b@localhost2/zhttp://a:b@localhost2:3128/zexample1.com,example2.comrz example.1.comz-example1.com,example2.com, echo.websocket.orgrz127.0.0.0/8, 192.168.0.0/16z 127.0.0.1z 192.168.1.1)rNN)rrN)rNN)rrN)rNN)rrNrrc)rNrrrc)rrrrrc)rNrrrc)rrrrrc)rNrrrc)rrrrrc)rNr)NrN)NrN)NrN)r,rr<r)rrrrtestProxyFromEnv[sZ                             zProxyInfoTest.testProxyFromEnvN)rrrr9r:rrrrrrr1s r__main__)0rEr-r,os.pathrprKrOr6Zwebsocket._handshakerrrUZwebsocket._httprZwebsocket._urlrrZwebsocket._utilsrPY3base64r rr rFZ unittest2rrr ImportErrorr"rrrrr8rrrr*ZTestCaser5rrrrrmainrrrrsH     H b