
    8'h7                        d dl mZmZ d dlZd dlZej
                  j                  dd      rd dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ  ed      d        ZdZ dZ! G d dejD                        Z# G d dejD                        Z$ G d dejD                        Z%yy)    )absolute_importprint_functionNUSE_TWISTEDF)unittest)IPv4Address)Clock)PY3)WebSocketServerProtocol)WebSocketServerFactory)WebSocketClientProtocol)WebSocketClientFactory)PerMessageDeflate)FakeTransport)	MagicMockpatch)replace_loop)	b64decodezbase64.b64encodec                 p   d| _         t        dg      }t        |_        |j	                          |j                  t        ddd            }t               |_        |j                          t        |_        |j                          g fd}||_         |j                  d	i | dj                        S )
a[  
        Kind-of hack-y; maybe better to re-factor the Protocol to have a
        frame-encoder method-call? Anyway, makes a throwaway protocol
        encode a frame for us, collects the .sendData call and returns
        the data that would have gone out. Accepts all the kwargs that
        WebSocketClientProtocol.sendFrame() accepts.
        s   QIatSt9QkZPyS4QQfdufO8TgkL0=wamp.2.json	protocolsTCPz	127.0.0.9  c                 (    j                  |        y N)append)dargsdatas     b/var/www/html/trade_iq/venv/lib/python3.12/site-packages/autobahn/websocket/test/test_websocket.pycollectz$create_client_frame.<locals>.collectK   s    KKN    r"    )return_valuer   r   protocoldoStartbuildProtocolr   r   	transportconnectionMademock_handshake_serverr   processHandshakesendData	sendFramejoin)b64patchkwargsfactoryprotor!   r   s        @r    create_client_framer3   2   s     !@(M?C2%%k%e&LM'/*
 	 !&!xx~r"   s
  GET / HTTP/1.1
User-Agent: AutobahnPython/0.10.2
Host: localhost:80
Upgrade: WebSocket
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: 6Jid6RgXpH0RVegaNSs/4g==
Sec-WebSocket-Protocol: wamp.2.json
Sec-WebSocket-Version: 13

s  HTTP/1.1 101 Switching Protocols
Server: AutobahnPython/0.10.2
X-Powered-By: AutobahnPython/0.10.2
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Protocol: wamp.2.json
Sec-WebSocket-Accept: QIatSt9QkZPyS4QQfdufO8TgkL0=

~[1,"crossbar",{"roles":{"subscriber":{"features":{"publisher_identification":true,"pattern_based_subscription":true,"subscription_revocation":true}},"publisher":{"features":{"publisher_identification":true,"publisher_exclusion":true,"subscriber_blackwhite_listing":true}},"caller":{"features":{"caller_identification":true,"progressive_call_results":true}},"callee":{"features":{"progressive_call_results":true,"pattern_based_registration":true,"registration_revocation":true,"shared_registration":true,"caller_identification":true}}}}]c                       e Zd Zd Zd Zy)TestDeflatec           	          t        ddddddd      }d}|j                          |j                  |      }| j                  |d       y )NF      
   )	is_serverserver_no_context_takeoverclient_no_context_takeoverserver_max_window_bitsclient_max_window_bits	mem_levelmax_message_size   `Q0
FP @s
   xxxxxxxxxxr   start_decompress_messagedecompress_message_dataassertEqualselfdecodercompressed_datar   s       r    test_max_sizezTestDeflate.test_max_sizeY   sW    '+0+0')')!#G bO,,.22?CD T9-r"   c                     t        dddddd       }d}|j                          |j                  |      }| j                  |d       y )NFr7   )r:   r;   r<   r=   r>   r?   rA   s  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxrB   rF   s       r    test_no_max_sizezTestDeflate.test_no_max_sizen   sR    '+0+0')')G bO,,.22?CDT;/r"   N)__name__
__module____qualname__rJ   rL   r#   r"   r    r5   r5   W   s    	.*	0r"   r5   c                   $    e Zd Zd Zd Zd Zd Zy)
TestClientc                 d   t        dg      | _        t        | j                  _        | j                  j	                          | j                  j                  t        ddd            | _        t               | _	        | j                  | j                  _	        | j                  j                          y Nr   r   r   z	127.0.0.1r   )r   r1   r   r%   r&   r'   r   r2   r   r(   r)   rG   s    r    setUpzTestClient.setUp   su    1]OLDL$;DLL!LL  "33K{TY4Z[DJ*_DN#'>>DJJ JJ%%'r"   c                     | j                   j                  r$| j                   j                  j                          | j                  j	                          | `| ` y r   r2   openHandshakeTimeoutCallcancelr1   doStoprT   s    r    tearDownzTestClient.tearDown   ?    zz22

33::<LL!
r"   c                     d| j                   _        | j                   j                  | j                   _        d| j                   _        t               | j                   _        | j                   j                  dd        y )NT     )r2   echoCloseCodeReason
STATE_OPENstatewebsocket_versionr   sendCloseFrameonCloseFramerT   s    r    test_missing_reason_rawz"TestClient.test_missing_reason_raw   sR    -1DJJ*#zz44DJJ+,DJJ((1DJJ%JJ##D$/r"   c                 p   	 t	        d      | j                  _        t        | j                  _        | j                  j                          | j                  | j                  j                  t        j                         | j                  | j                  j                  dkD         t        t!                     5 }| j                  j#                          | j                  j%                  dd       | j                  t'        |j(                        d       | j                  |j(                  d   j*                  | j                  j,                         | j                  |j(                  d   j/                         | j                  j                         |j1                  | j                  j2                  dz          | j                  | j                  j4                  j7                                | j                  | j                  j                  t        j8                         ddd       y# 1 sw Y   yxY w)zR
            make a delayed call to drop the connection (client-side)
            z6Jid6RgXpH0RVegaNSs/4g==r   r_   s
   raw reasonr^   N)printr2   r1   _logr   websocket_keyr*   r   r+   rE   rb   r
   ra   
assertTrueserverConnectionDropTimeoutr   r   rd   re   lencallsfunconServerConnectionDropTimeoutgetTimeadvancecloseHandshakeTimeoutr(   abort_calledSTATE_CLOSEDrG   reactors     r    test_unclean_timeout_clientz&TestClient.test_unclean_timeout_client   s   
  (11K'LDJJ$3DJJOJJ'')TZZ--/F/Q/QROODJJBBQFGeg& Y'

))+

''m<   W]]!3Q7  q!1!6!6

8`8`a  q!1!9!9!;TZZ=c=cd 

 @ @1 DE 

 4 4 A A CD  !1!13J3W3WX#Y Y Ys   :E)H,,H5N)rM   rN   rO   rU   r[   rf   rx   r#   r"   r    rQ   rQ      s    	(		0 	Yr"   rQ   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestPingc                 d   t        dg      | _        t        | j                  _        | j                  j	                          | j                  j                  t        ddd            | _        t               | _	        | j                  | j                  _	        | j                  j                          y rS   )r   r1   r
   r%   r&   r'   r   r2   r   r(   r)   rT   s    r    rU   zTestPing.setUp   su    1]OLDL$;DLL!LL  "33K{TY4Z[DJ&[DN#'>>DJJ JJ%%'r"   c                     | j                   j                  r$| j                   j                  j                          | j                  j	                          | `| ` y r   rW   rT   s    r    r[   zTestPing.tearDown   r\   r"   c                 >   t         | j                  _        | j                  j                          | j	                  | j                  j
                  t        j                  k(         t        t                     5 }| j                  j                          | j                  t        |j                        d       |j                  | j                  j                  dz          | j                  dt!        | j                  j"                  j$                  d                | j	                  | j                  j"                  j&                  j(                         | j                  | j                  j
                  t        j*                         ddd       y# 1 sw Y   yxY w)zD
            make a delayed call to drop the connection
            r^   zcall.abortConnection()N)mock_handshake_clientr2   r   r+   rk   rb   r
   ra   r   r   rd   rE   rm   rn   rr   rs   strr(   method_callsabortConnectioncalledru   rv   s     r    test_unclean_timeoutzTestPing.test_unclean_timeout   s    4DJJOJJ'')OODJJ,,0G0R0RRSeg& Y'

))+   W]]!3Q7 

 @ @1 DE   !93tzz?S?S?`?`ac?d;ef

 4 4 D D K KL  !1!13J3W3WXY Y Ys   9DFFc                 `   d| j                   _        d| j                   _        t        t	                     5 }t
        | j                   _        | j                   j                          | j                  | j                   j                  t        j                  k(         | j                  dt        |j                               |j                  d       | j                  | j                   j"                  j$                         | j                   j"                  j&                  d   d   }t(        rt+        |d   g      }n|d   }t-        j.                  d|      \  }|dz  }| j                  d|       | j                  dt        |j                               | j1                  | j                   j                  | j                   j2                         |j                  d       | j                  | j                   j                  | j                   j2                         d	d	d	       y	# 1 sw Y   y	xY w)
z>
            autoping and autoping-timeout timing
                  r^   r   Bi	      N)r2   autoPingIntervalautoPingTimeoutr   r   r   r   r+   rk   rb   r
   ra   rE   rm   rn   rr   r(   writer   	call_argsr	   bytesstructunpackassertNotEqualru   )rG   rw   r   _dataopcodes        r    test_auto_pingpong_timeoutz#TestPing.test_auto_pingpong_timeout   s   
 +,DJJ')*DJJ&eg& $L'"7



++-

 0 04K4V4V VW   C$67 "  4 4 ; ;<~~++55a8;!47),E GE #MM#u5	5)   F+   C$67##DJJ$4$4djj6M6MN "  !1!14::3J3JKI$L $L $Ls   G%H$$H-c                 8   d| j                   _        d| j                   _        t        t	                     5 }t
        | j                   _        | j                   j                          | j                  | j                   j                  t        j                  k(         | j                  dt        |j                               |j                  d       | j                  dt        |j                               |j                  d   }t!        d| j                   j"                        }|| j                   _        | j                   j%                          | j                   j%                          | j                  |j&                         ddd       y# 1 sw Y   yxY w)zF
            auto-ping with correct reply cancels timeout
            r   r   r^   r   r9   )r   payloadN)r2   r   r   r   r   r   r   r+   rk   rb   r
   ra   rE   rm   rn   rr   r3   autoPingPendingprocessData	cancelled)rG   rw   timeout_callframes       r    test_auto_ping_got_pongz TestPing.test_auto_ping_got_pong   s#   
 +,DJJ')*DJJ&eg& 8'"7



++-

 0 04K4V4V VW   C$67 "   C$67&}}Q/ ,2tzz?Y?YZ"'



&&(

&&(  6 6798 8 8s   EFFN)rM   rN   rO   rU   r[   r   r   r   r#   r"   r    rz   rz      s    	(		Y@,	L\$	8r"   rz   )&
__future__r   r   osr   environgettwisted.trialr   twisted.internet.addressr   twisted.internet.taskr   sixr	   autobahn.twisted.websocketr
   r   r   r   #autobahn.websocket.compress_deflater   autobahn.testr   mockr   r   txaio.testutilr   base64r   r3   r   r*   TestCaser5   rQ   rz   r#   r"   r    <module>r      s   6 7 	 ::>>-'&4+BABAE+%+ 
 @ @ C'0h'' '0R=YX&& =Y~E88$$ E8 (r"   