Ë
    eQêjs  ã                   ó¢  — d dl Z d dlmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlmZ d dlmZ d dlZ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mZ d dlZ	 d dlZ ej:                  «         ej>                  d	¬
«      d„ «       Z dd„Z! G d„ dejD                  «      Z# G d„ de jH                  «      Z% G d„ de jH                  «      Z& G d„ de jH                  «      Z' G d„ de jH                  «      Z( ej>                  d¬«      d„ «       Z) ej>                  d	¬
«      d„ «       Z*d„ Z+d„ Z,d„ Z-e.dk(  r e j^                  «        yy# e$ r Y Œàw xY w) é    N)Ú	MagicMockÚpatché   )Ú	ws_client)Úget_websocket_urlÚWSClientÚV5_CHANNEL_PROTOCOLÚV4_CHANNEL_PROTOCOLÚCLOSE_CHANNELÚSTDIN_CHANNELÚSTDOUT_CHANNEL)Úwebsocket_proxycare)ÚConfiguration)ÚstreamÚclientÚconfigT)Úautousec                 ój   — d}| dz  }|j                  |«       |j                  dt        |«      «       y )Nak  
        apiVersion: v1
        kind: Config
        clusters:
        - name: default
          cluster:
            server: http://127.0.0.1:8888
        contexts:
        - name: default
          context:
            cluster: default
            user: default
        users:
        - name: default
          user: {}
        current-context: default
        Ú
kubeconfigÚ
KUBECONFIG)Ú
write_textÚsetenvÚstr)Útmp_pathÚmonkeypatchÚcontentÚcfg_files       úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/kubernetes/stream/ws_client_test.pyÚdummy_kubeconfigr   $   s7   € ð€Gð" ˜,Ñ&€HØ×Ñ˜Ô Ø×Ñ�|¤S¨£]Õ3ó    c                 ó&   — | j                  ||«      S ©N)Úget)Údict_objÚkeyÚdefaults      r   Údictvalr'   =   s   € à�<‰<˜˜WÓ%Ð%r    c                   ó*   ‡ — e Zd ZdZdˆ fd„	Zd„ Zˆ xZS )Ú
DummyProxyz{
    A minimal HTTP proxy that flags any CONNECT request and returns 200 OK.
    Listens on 127.0.0.1:8888 by default.
    c                 ó´  •— t         ‰| �  d¬«       || _        || _        d| _        t        j
                  t
        j                  t
        j                  «      | _        | j                  j                  t
        j                  t
        j                  d«       | j                  j                  | j                  df«       | j                  j                  d«       y )NT)ÚdaemonFr   r   )ÚsuperÚ__init__ÚhostÚportÚreceived_connectÚsocketÚAF_INETÚSOCK_STREAMÚ_server_sockÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindÚlisten)Úselfr.   r/   Ú	__class__s      €r   r-   zDummyProxy.__init__F   sš   ø€ Ü‰Ñ ÐÔ%ØˆŒ	ØˆŒ	Ø %ˆÔÜ"ŸM™M¬&¯.©.¼&×:LÑ:LÓMˆÔØ×Ñ×$Ñ$¤V×%6Ñ%6¼×8KÑ8KÈQÔOØ×Ñ×Ñ §	¡	¨1˜~Ô.Ø×Ñ× Ñ  Õ#r    c                 ó   — | j                   j                  «       \  }}	 |j                  d«      j                  dd¬«      }|j	                  d«      rd| _        |j                  d«       |j                  «        y # |j                  «        w xY w)Ni   zutf-8Úignore)ÚerrorszCONNECT Ts'   HTTP/1.1 200 Connection established

)r4   ÚacceptÚrecvÚdecodeÚ
startswithr0   ÚsendallÚclose)r:   ÚconnÚ_Údatas       r   ÚrunzDummyProxy.runP   sp   € Ø×#Ñ#×*Ñ*Ó,‰ˆˆað	Ø—9‘9˜T“?×)Ñ)¨'¸(Ð)ÓCˆDØ�‰˜zÔ*Ø(,�Ô%Ø—‘ÐKÔLà�J‰J�LøˆD�J‰J�Lús   ŸAA; Á;B)ú	127.0.0.1é¸"  )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   rH   Ú__classcell__)r;   s   @r   r)   r)   A   s   ø„ ñõ$ör    r)   c                   ó   — e Zd Zd„ Zd„ Zy)ÚWSClientTestc                 óN   — dD ]   \  }}| j                  t        |«      |«       Œ" y )N))zhttp://localhost/apizws://localhost/api)zhttps://localhost/apizwss://localhost/api)zhttps://domain.com/apizwss://domain.com/api)zhttps://api.domain.com/apizwss://api.domain.com/api)zhttp://api.domain.comzws://api.domain.com)zhttps://api.domain.comzwss://api.domain.com)zhttp://api.domain.com/zws://api.domain.com/)zhttps://api.domain.com/zwss://api.domain.com/)ÚassertEqualr   )r:   ÚurlÚws_urls      r   Útest_websocket_clientz"WSClientTest.test_websocket_client\   s/   € ð	ò 
	=‰KˆC�ð ×ÑÔ.¨sÓ3°VÕ<ñ
	=r    c                 ó’  — ddddddddd	d
dgfddddd	d
dgfddddd	d
g d¢ffD ]¢  \  }}}}}}}t        dd¬«      }|r||_        |r%t        j                  j	                  |¬«      |_        |�||_        t        i |d d «      }	t        |	d«      |k(  sJ ‚t        |	d«      |k(  sJ ‚t        |	d«      |k(  sJ ‚t        |	d«      |k(  rŒ¢J ‚ y )N)NNNNNNN)úhttp://proxy.example.com:8080/NNúproxy.example.comé�  NN)rX   ú	user:passNrY   rZ   ©ÚuserÚpassN)rX   r[   Ú rY   rZ   r\   NrX   r[   Ú*rY   rZ   r\   ú.example.comzlocalhost,.local,.example.com)Ú	localhostz.localra   r_   )ÚproxyÚno_proxy)Úproxy_basic_authÚhttp_proxy_hostÚhttp_proxy_portÚhttp_proxy_authÚhttp_no_proxy)	r   rc   Úurllib3ÚutilÚmake_headersÚproxy_headersrd   r   r'   )
r:   rc   Úidpassrd   Úexpect_hostÚexpect_portÚexpect_authÚexpect_noproxyÚcfgÚconnect_optss
             r   Útest_websocket_proxycarez%WSClientTest.test_websocket_proxycarei   sZ  € ð Jð Jð Tð TØ2°KÀÐbuÐw{ð  ~Mð  PSð  OTð  UØ2°KÀÐbuÐw{ð  ~Mð  P^ð  O_ð  `Ø2°KÐA`ÐcvÐx|ð  Nò  Puð  vð_ò 	LÑZˆE�6˜8 [°+¸{ÈNô   b°2Ô6ˆCÙØ!�”	ÙÜ$+§L¡L×$=Ñ$=ÈvÐ$=Ó$V�Ô!ØÐ#Ø'�”ô /¨r°3¸¸dÓCˆLÜ˜<Ð):Ó;¸{ÒJÐJÐJÜ˜<Ð):Ó;¸{ÒJÐJÐJÜ˜<Ð):Ó;¸{ÒJÐJÐJÜ˜<¨Ó9¸^ÓKÐKÐKñ/	Lr    N)rK   rL   rM   rV   ru   © r    r   rQ   rQ   Z   s   „ ò=óLr    rQ   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚWSClientMultiFrameReadTestzkTests that reads spanning multiple websocket frames are not
    truncated at a frame boundary (issue #2226)c                 ó  — t        «       | _        d| j                  _        i | j                  _        d | j                  _        d | j                  _        d | j                  _        d | j                  _        d| j                  _        y ©NFT©	r   Úconfig_mockÚassert_hostnameÚapi_keyrc   Ússl_ca_certÚ	cert_fileÚkey_fileÚ
verify_ssl©r:   s    r   ÚsetUpz WSClientMultiFrameReadTest.setUpˆ   ón   € ä$›;ˆÔØ+0ˆ×ÑÔ(Ø#%ˆ×ÑÔ Ø!%ˆ×ÑÔØ'+ˆ×ÑÔ$Ø%)ˆ×ÑÔ"Ø$(ˆ×ÑÔ!Ø&*ˆ×ÑÕ#r    c                 ó¢   — t        j                  t        d«      5 }||_        t	        | j
                  dd d¬«      cd d d «       S # 1 sw Y   y xY w)NÚcreate_websocketú
wss://testT©ÚheadersÚcapture_all©r   ÚobjectÚws_client_moduleÚreturn_valuer   r|   ©r:   Úmock_wsÚmock_creates      r   Ú_make_clientz'WSClientMultiFrameReadTest._make_client“   sH   € Ü�\‰\Ô*Ð,>Ó?ð 	.À;Ø'.ˆKÔ$Ü˜D×,Ñ,¨lÀDØ(,ô.÷	.÷ 	.ò 	.ús   › AÁAc                 ó’  — d}d}d|z  }t        «       }t        |_        d|_        | j	                  |«      }t        j                  «       \  }}	 |j                  t
        j                  t
        j                  d|z  «       |j                  t
        j                  t
        j                  d|z  «       t        j                  «       }||_        d|_        ||_        d}	t        d||«      D ]_  }
t        t         g«      ||
|
|z    z   }|	t        j"                  ddddt        j"                  j$                  d|«      j'                  «       z  }	Œa |	t        j"                  ddddt        j"                  j(                  dd	«      j'                  «       z  }	|j+                  |	«       d
} |j,                  d¬«      r |j.                  «       }| j1                  t3        |«      |«       | j5                   |j6                  «       «       |j9                  «        |j9                  «        y# |j9                  «        |j9                  «        w xY w)aD  Verify a single peek/read returns output spanning several frames.

        The server sends long exec stdout as a sequence of websocket
        messages (32768 bytes each). Reading only one frame per update()
        truncated the output at a frame boundary for callers using the
        peek_stdout()/read_stdout() pattern.i €  ip ó   xTé   r    r   r   ó   èr_   é   ©ÚtimeoutN)r   r	   ÚsubprotocolÚ	connectedr“   r1   Ú
socketpairr5   r6   Ú	SO_RCVBUFÚ	SO_SNDBUFÚ	websocketÚ	WebSocketÚsockÚrangeÚbytesr   ÚABNFÚOPCODE_BINARYÚformatÚOPCODE_CLOSErC   Úpeek_stdoutÚread_stdoutrS   ÚlenÚassertFalseÚis_openrD   )r:   Úframe_payloadÚtotalÚpayloadr‘   r   Úserver_sockÚclient_sockÚwsÚframesÚoffsetÚchunkÚouts                r   Ú-test_read_stdout_returns_all_available_frameszHWSClientMultiFrameReadTest.test_read_stdout_returns_all_available_frames™   s  € ð ˆØˆØ˜‘,ˆä“+ˆÜ1ˆÔØ ˆÔØ×"Ñ" 7Ó+ˆä#)×#4Ñ#4Ó#6Ñ ˆ�[ð$	 ð ×"Ñ"¤6×#4Ñ#4´f×6FÑ6FØ#$ }Ñ#4ô6à×"Ñ"¤6×#4Ñ#4´f×6FÑ6FØ#$ }Ñ#4ô6ô ×$Ñ$Ó&ˆBØ!ˆBŒGØˆBŒLØˆFŒKð ˆFÜ  5¨-Ó8ò $�Ü¤Ð/Ó0Ø" 6¨&°=Ñ*@ÐAñB�àœ)Ÿ.™.Ø�q˜!˜Q¤	§¡× <Ñ <¸aØóç!™6›8ñ$‘ð$ð ”i—n‘nØ�1�a˜œIŸN™N×7Ñ7¸Øóç#™V›Xñ&ˆFð ×Ñ Ô'àˆCØ!ˆv×!Ñ!¨!Õ,Ø(�f×(Ñ(Ó*�à×ÑœS ›X uÔ-à×Ñ˜^˜VŸ^™^Ó-Ô.à×ÑÔØ×ÑÕøð ×ÑÔØ×ÑÕús   ÁF4H$ È$"Ic                 ón  — t        d«      5 }t        d«      5 }dt        j                  fgdt        j                  fgg g|j                  j                  _        dgg g fdgg g fg g g fg|_        t        «       }t        t        g«      dz   |_	        t        «       }t        t        g«      dz   |_	        t        «       }t        |_        d|_        t        j                  j                  |ft        j                  j                  |fg|j                   _        | j#                  |«      } |j$                  d¬«       | j'                  |j                   j(                  d	«       | j'                  |j*                  j-                  t        «      d
«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)z;Verify update() drains every frame that is already readableúselect.pollúselect.selecté
   s   firsts   secondTr   r™   é   ÚfirstsecondN)r   ÚselectÚPOLLINr�   ÚpollÚside_effectr   r¤   r   rG   r	   r›   rœ   r    r¥   r¦   Úrecv_data_framer“   ÚupdaterS   Ú
call_countÚ	_channelsr#   )r:   Ú	mock_pollÚmock_selectÚframe1Úframe2r‘   r   s          r   Ú5test_update_consumes_all_immediately_available_frameszPWSClientMultiFrameReadTest.test_update_consumes_all_immediately_available_framesÐ   s…  € ä�=Ó!ð 	, YÜ�?Ó#ð	,Ø'2ð ”f—m‘mÐ$Ð%¨¬V¯]©]Ð(;Ð'<¸bð7BˆI×"Ñ"×'Ñ'Ô3ð ��r˜2� "  r¨2 °°R¸°ð'>ˆKÔ#ô “[ˆFÜ¤Ð 0Ó1°HÑ<ˆFŒKÜ“[ˆFÜ¤Ð 0Ó1°IÑ=ˆFŒKä“kˆGÜ"5ˆGÔØ $ˆGÔä—‘×-Ñ-¨vÐ6Ü—‘×-Ñ-¨vÐ6ð38ˆG×#Ñ#Ô/ð ×&Ñ& wÓ/ˆFØˆF�M‰M !Õ$à×Ñ˜W×4Ñ4×?Ñ?ÀÔCØ×Ñ˜V×-Ñ-×1Ñ1´.ÓAØ*ô,÷1	,÷ 	,÷ 	,ñ 	,ú÷ 	,ð 	,ús#   ŒF+˜E6FÆF+ÆF(	Æ$F+Æ+F4c                 óP  — t        d«      5 }t        d«      5 }dt        j                  fg|j                  j                  _        dgg g f|_        t        «       }t        t        g«      dz   |_        t        «       }d|_        t        «       }t        |_
        d|_        t        j                  j                  |ft        j                  j                  |fg|j                   _        | j%                  |«      } |j&                  d¬«       | j)                  |j                   j*                  d	«       | j)                  |j,                  j/                  t        «      d
«       | j1                   |j2                  «       «       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)z;Verify the drain loop terminates when a close frame arrivesrº   r»   r¼   s   outputr—   Tr   r™   r½   ÚoutputN)r   r¿   rÀ   r�   rÁ   r   r¤   r   rG   r	   r›   rœ   r    r¥   r¦   r¨   rÃ   rÂ   r“   rÄ   rS   rÅ   rÆ   r#   r¬   r­   )r:   rÇ   rÈ   rÉ   Úclose_framer‘   r   s          r   Ú)test_update_stops_draining_on_close_framezDWSClientMultiFrameReadTest.test_update_stops_draining_on_close_frameí   sZ  € ä�=Ó!ð 	/ YÜ�?Ó#ð	/Ø'2à9;¼V¿]¹]Ð8KÐ7LˆI×"Ñ"×'Ñ'Ô4Ø)+¨¨b°" ~ˆKÔ$ä“[ˆFÜ¤Ð 0Ó1°IÑ=ˆFŒKÜ#›+ˆKØ*ˆKÔä“kˆGÜ"5ˆGÔØ $ˆGÔä—‘×-Ñ-¨vÐ6Ü—‘×,Ñ,¨kÐ:ð3<ˆG×#Ñ#Ô/ð ×&Ñ& wÓ/ˆFØˆF�M‰M !Õ$à×Ñ˜W×4Ñ4×?Ñ?ÀÔCØ×Ñ˜V×-Ñ-×1Ñ1´.ÓAÀ8ÔLØ×Ñ˜^˜VŸ^™^Ó-Ô.÷/	/÷ 	/÷ 	/ñ 	/ú÷ 	/ð 	/ús#   ŒF˜E'FÅ?FÆF	ÆFÆF%N)	rK   rL   rM   rN   r„   r“   r¸   rË   rÏ   rv   r    r   rx   rx   „   s!   „ ñ3ò	+ò.ò5 òn,ó:/r    rx   c                   ó^   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zy)ÚWSClientProtocolTestz'Tests for WSClient V5 protocol handlingc                 ó  — t        «       | _        d| j                  _        i | j                  _        d | j                  _        d | j                  _        d | j                  _        d | j                  _        d| j                  _        y rz   r{   rƒ   s    r   r„   zWSClientProtocolTest.setUp  r…   r    c                 óˆ  — t        j                  t        dd¬«      5 }|j                  }t	        | j
                  ddd¬«       |j                  j                  «        |j                  j                  }|d   }| j                  d|«       d	t        › d
t        › �}| j                  ||d   «       ddd«       y# 1 sw Y   yxY w)z6Verify sec-websocket-protocol header requests v5 firstr¡   T)Úautospecú	ws://testNr‰   r   Úheaderzsec-websocket-protocol: ú,)r   r�   rŽ   r�   r   r|   ÚconnectÚassert_called_onceÚ	call_argsÚassertInr	   r
   )r:   Úmock_ws_clsr‘   rÚ   ÚkwargsÚexpected_headers         r   Útest_create_websocket_headerz1WSClientProtocolTest.test_create_websocket_header  s¬   € ô �\‰\Ô*¨KÀ$ÔGð 	=È;Ø!×.Ñ.ˆGä�T×%Ñ% {¸DÈdÕSà�O‰O×.Ñ.Ô0ØŸ™×1Ñ1ˆIð ˜q‘\ˆFØ�M‰M˜( FÔ+Ø 8Ô9LÐ8MÈQÔObÐNcÐdˆOØ�M‰M˜/¨6°(Ñ+;Ô<÷	=÷ 	=ñ 	=ús   �BB8Â8Cc                 óŽ  — t        j                  t        d«      5 }t        «       }t        |_        d|_        ||_        t        | j                  ddd¬«      } |j                  d«       |j                  j                  t        t        t        g«      t         j"                  j$                  ¬«       ddd«       y# 1 sw Y   yxY w)z>Verify close_channel sends correct frame when v5 is negotiatedr‡   TrÕ   Nr‰   r   )Úopcode)r   r�   rŽ   r   r	   r›   rœ   r�   r   r|   Úclose_channelÚsendÚassert_called_withr¤   r   r   r    r¥   r¦   ©r:   r’   r‘   r   s       r   Útest_close_channel_v5z*WSClientProtocolTest.test_close_channel_v5(  s¡   € ä�\‰\Ô*Ð,>Ó?ð 		xÀ;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[Ô\ˆFØ ˆF× Ñ  Ô#à�L‰L×+Ñ+¬E´=Ä-Ð2PÓ,QÔZc×ZhÑZh×ZvÑZvÐ+Ôw÷		x÷ 		xñ 		xús   ›BB;Â;Cc                 ó2  — t        j                  t        d«      5 }t        «       }t        |_        d|_        ||_        t        | j                  ddd¬«      } |j                  d«       |j                  j                  «        ddd«       y# 1 sw Y   yxY w)z7Verify close_channel does nothing when v4 is negotiatedr‡   TrÕ   Nr‰   r   )r   r�   rŽ   r   r
   r›   rœ   r�   r   r|   râ   rã   Úassert_not_calledrå   s       r   Útest_close_channel_v4z*WSClientProtocolTest.test_close_channel_v45  s   € ä�\‰\Ô*Ð,>Ó?ð 		-À;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[Ô\ˆFØ ˆF× Ñ  Ô#à�L‰L×*Ñ*Ô,÷		-÷ 		-ñ 		-ús   ›A)BÂBc                 óv  — t        j                  t        d«      5 }t        d«      5 }t        «       }t        |_        d|_        d|j                  j                  _	        t        «       }t        t        t        g«      |_        t        j                  j                   |f|j"                  _	        ||_	        |j                  gg g f|_	        t%        | j&                  ddd¬«      } |j(                  d¬	«       | j+                  d|j,                  «       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)
z:Verify update processes close signal when v5 is negotiatedr‡   r»   Tr¼   rÕ   Nr‰   r   r™   )r   r�   rŽ   r   r	   r›   rœ   r¢   Úfilenor�   r¤   r   r   rG   r    r¥   r¦   rÃ   r   r|   rÄ   rÛ   Ú_closed_channels)r:   r’   rÈ   r‘   Úframer   s         r   Útest_update_receives_close_v5z2WSClientProtocolTest.test_update_receives_close_v5B  s   € ä�\‰\Ô*Ð,>Ó?ð 	6À;Ü�/Ó"ð	6Ø&1ä“kˆGÜ"5ˆGÔØ $ˆGÔØ/1ˆG�L‰L×ÑÔ,ô “KˆEÜ¤¬}Ð=Ó>ˆEŒJÜ4=·N±N×4PÑ4PÐRWÐ3XˆG×#Ñ#Ô0à'.ˆKÔ$à)0¯©¨¸¸BÐ'?ˆKÔ$ä˜d×.Ñ.°ÀTÐW[Ô\ˆFØˆF�M‰M !Õ$à�M‰M˜!˜V×4Ñ4Ô5÷)	6÷ 	6÷ 	6ñ 	6ú÷ 	6ð 	6ús#   ›D/§C+D#ÄD/Ä#D,	Ä(D/Ä/D8c           
      ó”  — t        j                  t        d«      5 }t        d«      5 }t        d«      5 }t        «       }t        |_        d|_        d|j                  j                  _	        t        «       }t        t        t        g«      |_        t        j                  j                   |f|j"                  _	        ||_	        dt$        j&                  fgg g|j                  j(                  _        |j                  gg g fg g g fg|_        t-        | j.                  dddd¬«      } |j0                  d	¬
«       | j3                  d	|j4                  «       | j7                  d|j8                  «       | j;                  |j8                  d   d«       ddd«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   ŒxY w# 1 sw Y   yxY w)zTVerify update treats 0xFF as regular data (or ignores signal interpretation) when v4r‡   rº   r»   Tr¼   rÕ   N©rŠ   r‹   Úbinaryr   r™   éÿ   ó    )r   r�   rŽ   r   r
   r›   rœ   r¢   rë   r�   r¤   r   r   rG   r    r¥   r¦   rÃ   r¿   rÀ   rÁ   rÂ   r   r|   rÄ   ÚassertNotInrì   rÛ   rÆ   rS   )r:   r’   rÇ   rÈ   r‘   rí   r   s          r   Ú#test_update_ignores_close_signal_v4z8WSClientProtocolTest.test_update_ignores_close_signal_v4Z  s’  € ä�\‰\Ô*Ð,>Ó?ð 	=À;Ü�-Ó ð	=Ø$-Ü�/Ó"ð	=à&1ä“kˆGÜ"5ˆGÔØ $ˆGÔØ/1ˆG�L‰L×ÑÔ,ô “KˆEÜ¤¬}Ð=Ó>ˆEŒJÜ4=·N±N×4PÑ4PÐRWÐ3XˆG×#Ñ#Ô0à'.ˆKÔ$ð ”f—m‘mÐ$Ð% rð7+ˆI×"Ñ"×'Ñ'Ô3ð —,‘,�  RÐ(¨2¨r°2¨,ð'8ˆKÔ#ô ˜d×.Ñ.°ÀTÐW[ÐdhÔiˆFØˆF�M‰M !Õ$ð ×Ñ˜Q × 7Ñ 7Ô8ð �M‰M˜#˜v×/Ñ/Ô0Ø×Ñ˜V×-Ñ-¨cÑ2°GÔ<÷=	=÷ 	=÷ 	=÷ 	=ñ 	=ú÷ 	=ð 	=ú÷ 	=ð 	=ús:   ›F>§F2³EF&ÆF2ÆF>Æ&F/Æ+F2Æ2F;	Æ7F>Æ>Gc                 óÀ  — t        j                  t        d«      5 }t        «       }t        |_        d|_        ||_        t        | j                  dddd¬«      }d|j                  d<   |j                  j                  d«        |j                  d«      }| j                  |d«        |j                  d«      }| j                  |d	«       ddd«       y# 1 sw Y   yxY w)
zGVerify readline_channel flushes remaining buffer when channel is closedr‡   TrÕ   NFrð   Úhellor   r_   ©r   r�   rŽ   r   r	   r›   rœ   r�   r   r|   rÆ   rì   ÚaddÚreadline_channelrS   ©r:   r’   r‘   r   Úline1Úline2s         r   Ú/test_readline_channel_closed_with_leftover_datazDWSClientProtocolTest.test_readline_channel_closed_with_leftover_data|  sÐ   € ä�\‰\Ô*Ð,>Ó?ð 	(À;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[ÐdiÔjˆFð #*ˆF×Ñ˜QÑØ×#Ñ#×'Ñ'¨Ô*ð ,�F×+Ñ+¨AÓ.ˆEØ×Ñ˜U GÔ,ð ,�F×+Ñ+¨AÓ.ˆEØ×Ñ˜U BÔ'÷%	(÷ 	(ñ 	(úó   ›B0CÃCc                 óÀ  — t        j                  t        d«      5 }t        «       }t        |_        d|_        ||_        t        | j                  dddd¬«      }d|j                  d<   |j                  j                  d«        |j                  d«      }| j                  |d«        |j                  d«      }| j                  |d«       ddd«       y# 1 sw Y   yxY w)	zVVerify readline_channel flushes remaining buffer when channel is closed in binary moder‡   TrÕ   Nrð   s   hello-binaryr   r    rø   rû   s         r   Ú6test_readline_channel_closed_with_leftover_data_binaryzKWSClientProtocolTest.test_readline_channel_closed_with_leftover_data_binary’  sÐ   € ä�\‰\Ô*Ð,>Ó?ð 	)À;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[ÐdhÔiˆFð #2ˆF×Ñ˜QÑØ×#Ñ#×'Ñ'¨Ô*ð ,�F×+Ñ+¨AÓ.ˆEØ×Ñ˜U OÔ4ð ,�F×+Ñ+¨AÓ.ˆEØ×Ñ˜U CÔ(÷%	)÷ 	)ñ 	)úrÿ   c                 ól  — t        j                  t        d«      5 }t        «       }t        |_        d|_        d|j                  j                  _	        ||_	        t        | j                  dddd¬«      }d|j                  d	<   |j                  j                  d	«        |j                  d	«      }| j!                  |d«       t        j                  |d
«      5 } |j                  d	«      }| j!                  |d«       |j#                  «        ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)zRVerify read_channel drains leftover data and then short-circuits on closed channelr‡   Tr¼   rÕ   NFrð   r÷   r   rÄ   r_   )r   r�   rŽ   r   r	   r›   rœ   r¢   rë   r�   r   r|   rÆ   rì   rù   Úread_channelrS   rè   )r:   r’   r‘   r   Údata1Úmock_updateÚdata2s          r   Ú+test_read_channel_closed_with_leftover_dataz@WSClientProtocolTest.test_read_channel_closed_with_leftover_data¨  s  € ä�\‰\Ô*Ð,>Ó?ð 	0À;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ/1ˆG�L‰L×ÑÔ,Ø'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[ÐdiÔjˆFð #*ˆF×Ñ˜QÑØ×#Ñ#×'Ñ'¨Ô*ð (�F×'Ñ'¨Ó*ˆEØ×Ñ˜U GÔ,ô —‘˜f hÓ/ð 0°;Ø+˜×+Ñ+¨AÓ.�Ø× Ñ  ¨Ô+Ø×-Ñ-Ô/÷0÷'	0ð 	0÷&0ð 0ú÷'	0ð 	0ús$   ›B=D*Ã5DÄD*ÄD'	Ä#D*Ä*D3c           	      óN  — t        j                  t        d«      5 }t        d«      5 }g |j                  j                  _        t        «       }t        |_        d|_        d|j                  j                  _        ||_        t        | j                  dddd¬«      }d	|j                  d
<   |j                  j                  d
«        |j                   d
«      }| j#                  |d	«        |j                   d
«      }| j#                  |d	«        |j$                  d
«       t        j                  |d«      5 } |j                   d
«      }| j#                  |d«       |j'                  «        ddd«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   ŒxY w# 1 sw Y   yxY w)zWVerify peek_channel allows peeking leftover data and then short-circuits after drainingr‡   rº   Tr¼   rÕ   NFrð   r÷   r   rÄ   r_   )r   r�   rŽ   r�   rÁ   r   r	   r›   rœ   r¢   rë   r   r|   rÆ   rì   rù   Úpeek_channelrS   r  rè   )	r:   r’   rÇ   r‘   r   r  r  r  Údata3s	            r   Ú+test_peek_channel_closed_with_leftover_dataz@WSClientProtocolTest.test_peek_channel_closed_with_leftover_dataÂ  s‚  € ä�\‰\Ô*Ð,>Ó?ð 	0À;Ü�=Ó!ð	0Ø%.Ø79ˆI×"Ñ"×'Ñ'Ô4Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ/1ˆG�L‰L×ÑÔ,Ø'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[ÐdiÔjˆFð #*ˆF×Ñ˜QÑØ×#Ñ#×'Ñ'¨Ô*ð (�F×'Ñ'¨Ó*ˆEØ×Ñ˜U GÔ,ð (�F×'Ñ'¨Ó*ˆEØ×Ñ˜U GÔ,ð  ˆF×Ñ Ô"ô —‘˜f hÓ/ð 0°;Ø+˜×+Ñ+¨AÓ.�Ø× Ñ  ¨Ô+Ø×-Ñ-Ô/÷0÷9	0÷ 	0ð 	0÷80ð 0ú÷9	0ð 	0ú÷ 	0ð 	0ús;   ›F§DFÄ55FÅ*FÅ2FÆFÆFÆF	ÆFÆF$c                 ó  — t        j                  t        d«      5 }t        d«      5 }g |j                  j                  _        t        «       }t        |_        d|_        d|j                  j                  _        ||_        t        | j                  ddd¬«      } |j                  t        d«      ¬	«       |j                  j                  j                  d«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)
zZVerify update maps an infinite (default) timeout to a blocking poll instead of overflowingr‡   rº   Tr¼   rÕ   Nr‰   Úinfr™   )r   r�   rŽ   r�   rÁ   r   r	   r›   rœ   r¢   rë   r   r|   rÄ   ÚfloatÚassert_called_once_with)r:   r’   rÇ   r‘   r   s        r   Ú3test_update_infinite_timeout_polls_without_overflowzHWSClientProtocolTest.test_update_infinite_timeout_polls_without_overflowå  sÙ   € ä�\‰\Ô*Ð,>Ó?ð 	FÀ;Ü�=Ó!ð	FØ%.Ø79ˆI×"Ñ"×'Ñ'Ô4Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ/1ˆG�L‰L×ÑÔ,Ø'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[Ô\ˆFØˆF�M‰M¤%¨£,Õ/à×"Ñ"×'Ñ'×?Ñ?ÀÔE÷	F÷ 	F÷ 	Fñ 	Fú÷ 	Fð 	Fús#   ›C8§B4C,ÃC8Ã,C5	Ã1C8Ã8Dc                 ó~  — t        j                  t        d«      5 }t        «       }t        |_        d|_        ||_        t        | j                  dddd¬«      }t        j                  |d«      5   |j                  dd	¬
«      }ddd«       | j                  d«       ddd«       y# 1 sw Y   Œ$xY w# 1 sw Y   yxY w)zKVerify readline_channel returns '' (not None) when a finite timeout expiresr‡   TrÕ   NFrð   rÄ   r   ç{®Gáz„?r™   r_   ©r   r�   rŽ   r   r	   r›   rœ   r�   r   r|   rú   rS   ©r:   r’   r‘   r   Úlines        r   Ú=test_readline_channel_returns_empty_string_on_expired_timeoutzRWSClientProtocolTest.test_readline_channel_returns_empty_string_on_expired_timeoutõ  s²   € ä�\‰\Ô*Ð,>Ó?ð 		'À;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[ÐdiÔjˆFÜ—‘˜f hÓ/ñ @Ø.�v×.Ñ.¨q¸$Ô?�÷@à×Ñ˜T 2Ô&÷		'ð 		'÷@ð @ú÷		'ð 		'úó$   ›AB3Á/B'ÂB3Â'B0	Â,B3Â3B<c                 ó~  — t        j                  t        d«      5 }t        «       }t        |_        d|_        ||_        t        | j                  dddd¬«      }t        j                  |d«      5   |j                  dd¬	«      }ddd«       | j                  d
«       ddd«       y# 1 sw Y   Œ$xY w# 1 sw Y   yxY w)z[Verify readline_channel returns b'' (not None) when a finite timeout expires in binary moder‡   TrÕ   Nrð   rÄ   r   r  r™   r    r  r  s        r   Ú<test_readline_channel_returns_empty_bytes_on_expired_timeoutzQWSClientProtocolTest.test_readline_channel_returns_empty_bytes_on_expired_timeout  s²   € ä�\‰\Ô*Ð,>Ó?ð 		(À;Ü“kˆGÜ"5ˆGÔØ $ˆGÔØ'.ˆKÔ$ä˜d×.Ñ.°ÀTÐW[ÐdhÔiˆFÜ—‘˜f hÓ/ñ @Ø.�v×.Ñ.¨q¸$Ô?�÷@à×Ñ˜T 3Ô'÷		(ð 		(÷@ð @ú÷		(ð 		(úr  N)rK   rL   rM   rN   r„   rß   ræ   ré   rî   rõ   rþ   r  r  r  r  r  r  rv   r    r   rÑ   rÑ   	  sJ   „ Ù1ò	+ò=ò"xò-ò6ò0 =òD(ò,)ò,0ò4!0òFFò 'ó(r    rÑ   c                   ó.   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚWSClientUpdateTestz;Tests for WSClient.update() frame consumption (issue #2375)c                 ó  — t        «       | _        d| j                  _        i | j                  _        d | j                  _        d | j                  _        d | j                  _        d | j                  _        d| j                  _        y rz   r{   rƒ   s    r   r„   zWSClientUpdateTest.setUp  r…   r    c                 ó¤   — t        j                  t        d«      5 }||_        t	        | j
                  dd dd¬«      cd d d «       S # 1 sw Y   y xY w)Nr‡   rˆ   Trð   rŒ   r�   s      r   r“   zWSClientUpdateTest._make_client  sJ   € Ü�\‰\Ô*Ð,>Ó?ð 	;À;Ø'.ˆKÔ$Ü˜D×,Ñ,¨lÀDØ(,°Tô;÷	;÷ 	;ò 	;ús   ›!AÁAc                 óº  — t        d«      5 }t        d«      5 }g |j                  j                  _        g g g f|_        t        «       }t        |_        d|_        t        t        j                  ¬«      |_	        d|j                  j                  _        t        «       }t        t        g«      dz   |_        t        j                  j                   |f|j"                  _        | j%                  |«      } |j&                  d¬«       | j)                  |j*                  j-                  t        «      d«       d	d	d	«       d	d	d	«       y	# 1 sw Y   ŒxY w# 1 sw Y   y	xY w)
aX  Verify update reads a frame buffered inside the SSL socket even
        when the underlying socket does not report as readable.

        SSL sockets decrypt a whole TLS record at a time, so frames that
        share a TLS record with a previously read frame sit decrypted in
        the SSLSocket's buffer where select()/poll() cannot see them.rº   r»   T©Úspecé   s   hellor   r™   N)r   r�   rÁ   r   r
   r›   rœ   ÚsslÚ	SSLSocketr¢   Úpendingr¤   r   rG   r    r¥   r¦   rÃ   r“   rÄ   rS   rÆ   r#   )r:   rÇ   rÈ   r‘   rí   r   s         r   Ú.test_update_reads_frames_pending_in_ssl_bufferzAWSClientUpdateTest.test_update_reads_frames_pending_in_ssl_buffer$  s  € ô �=Ó!ð 	M YÜ�?Ó#ð	MØ'2à79ˆI×"Ñ"×'Ñ'Ô4Ø(*¨B° |ˆKÔ$ä“kˆGÜ"5ˆGÔØ $ˆGÔä$¬#¯-©-Ô8ˆGŒLØ01ˆG�L‰L× Ñ Ô-Ü“KˆEÜ¤Ð/Ó0°8Ñ;ˆEŒJÜ4=·N±N×4PÑ4PÐRWÐ3XˆG×#Ñ#Ô0à×&Ñ& wÓ/ˆFØˆF�M‰M !Õ$à×Ñ˜V×-Ñ-×1Ñ1´.ÓAÀ8ÔL÷'	M÷ 	M÷ 	Mñ 	Mú÷ 	Mð 	Mús#   ŒE˜DEÄ4EÅE	Å
EÅEc                 óö  — t        d«      5 }t        d«      5 }g |j                  j                  _        g g g f|_        t        «       }t        |_        d|_        t        t        j                  ¬«      |_	        d|j                  j                  _        | j                  |«      } |j                  d¬«       |j                  j                  «        ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)zXVerify update falls back to poll/select when the SSL socket has no
        buffered datarº   r»   Tr  r   r™   N)r   r�   rÁ   r   r
   r›   rœ   r"  r#  r¢   r$  r“   rÄ   rÃ   rè   )r:   rÇ   rÈ   r‘   r   s        r   Ú*test_update_polls_when_no_ssl_data_pendingz=WSClientUpdateTest.test_update_polls_when_no_ssl_data_pending@  sÎ   € ô �=Ó!ð 	8 YÜ�?Ó#ð	8Ø'2Ø79ˆI×"Ñ"×'Ñ'Ô4Ø(*¨B° |ˆKÔ$ä“kˆGÜ"5ˆGÔØ $ˆGÔÜ$¬#¯-©-Ô8ˆGŒLØ01ˆG�L‰L× Ñ Ô-à×&Ñ& wÓ/ˆFØˆF�M‰M !Õ$à×#Ñ#×5Ñ5Ô7÷	8÷ 	8÷ 	8ñ 	8ú÷ 	8ð 	8ús#   ŒC/˜B:C#ÃC/Ã#C,	Ã(C/Ã/C8c                 ó<  — t        «       }t        |_        d|_        | j	                  |«      }t        j                  «       \  }}	 t        j                  «       }||_	        d|_        ||_	        t        j                  ddddt        j                  j                  dt        t        g«      dz   «      }t        j                  ddddt        j                  j                  dd«      }|j                  |j!                  «       |j!                  «       z   «        |j"                  d¬«       | j%                  |j&                  j)                  t        «      d«       |j+                  «        |j+                  «        y	# |j+                  «        |j+                  «        w xY w)
a  Verify a message fragmented into continuation frames is delivered
        in full.

        websocket-client reassembles continuation (OPCODE_CONT) frames inside
        recv_data_frame() and returns the opcode of the initial frame, so
        update() must buffer the complete message.Tr   s
   AAAAAAAAAAr   s
   BBBBBBBBBBr˜   r™   s   AAAAAAAAAABBBBBBBBBBN)r   r
   r›   rœ   r“   r1   r�   r    r¡   r¢   r¥   r¦   r¤   r   ÚOPCODE_CONTrC   r§   rÄ   rS   rÆ   r#   rD   )r:   r‘   r   r±   r²   r³   ÚinitialÚconts           r   Ú'test_update_receives_fragmented_messagez:WSClientUpdateTest.test_update_receives_fragmented_messageS  sL  € ô “+ˆÜ1ˆÔØ ˆÔØ×"Ñ" 7Ó+ˆä#)×#4Ñ#4Ó#6Ñ ˆ�[ð	 Ü×$Ñ$Ó&ˆBØ!ˆBŒGØˆBŒLØˆFŒKô  —n‘n Q¨¨1¨a´·±×1MÑ1MØ%&¬¬~Ð.>Ó(?À)Ñ(KóMˆGä—>‘> ! Q¨¨1¬i¯n©n×.HÑ.HØ"# Yó0ˆDà×Ñ §¡Ó 0°4·;±;³=Ñ @ÔAàˆF�M‰M !Õ$à×Ñ˜V×-Ñ-×1Ñ1´.ÓAØ2ô4ð ×ÑÔØ×ÑÕøð ×ÑÔØ×ÑÕús   ÁDE9 Å9"FN)	rK   rL   rM   rN   r„   r“   r%  r'  r,  rv   r    r   r  r    s   „ ÙEò	+ò;òMò88ó&! r    r  Úmodule)Úscopec               #   óL   K  — t        d¬«      } | j                  «        | –— y ­w)NrJ   )r/   )r)   Ústart)rc   s    r   Údummy_proxyr1  w  s    è ø€ ô ˜DÔ!€EØ	‡K�K„MØ
ƒKùs   ‚"$c                 ó8   — dD ]  }| j                  |d¬«       Œ y )N)Ú
HTTP_PROXYÚ
http_proxyÚHTTPS_PROXYÚhttps_proxyÚNO_PROXYrd   F)Úraising)Údelenv)r   Úvars     r   Úclear_proxy_envr;  ~  s$   € àaò /ˆØ×Ñ˜3¨ÐÕ.ñ/r    c                  óè   — t         j                  j                  «       } t        j                  d«      | _        t        j                  dd«      | _        t         j                  j                  | «       y )Nr5  r7  r_   )r   r   Úget_default_copyÚosÚgetenvrc   rd   Úset_default)rs   s    r   Úapply_proxy_to_confrA  ƒ  sL   € ä
×
Ñ
×
/Ñ
/Ó
1€CÜ—	‘	˜-Ó(€C„IÜ—9‘9˜Z¨Ó,€C„LÜ
×Ñ×$Ñ$ SÕ)r    c                 óÆ  — |j                  dd«       |j                  t        j                  dd„ «       t	        j
                  t        j                  d   ¬«       t        «        |j                  dd«       t	        j
                  t        j                  d   ¬«       t        «        t        j                  «       }|j                  d¬«       | j                  rJ d	«       ‚y )
Nr5  úhttp://127.0.0.1:8888Úlist_namespacec                  ó   — y r"   rv   )r:   Ú_argsÚ_kwargss      r   ú<lambda>z,test_rest_call_ignores_env.<locals>.<lambda>Ž  s   � r    r   ©Úconfig_fileF)Ú_preload_contentz#REST path should ignore HTTPS_PROXY)r   Úsetattrr   Ú	CoreV1Apir   Úload_kube_configr>  ÚenvironrA  rD  r0   )r1  r   Úv1s      r   Útest_rest_call_ignores_envrQ  Š  s¯   € à×Ñ�}Ð&=Ô>à×Ñœ×(Ñ(Ð*:Ñ<`Ôaä
×Ñ¬¯
©
°<Ñ(@ÕAÜÔà×Ñ�}Ð&=Ô>Ü
×Ñ¬¯
©
°<Ñ(@ÕAÜÔÜ	×	Ñ	Ó	€BØ×Ñ uÐÔ-Ø×+Ò+ÐRÐ-RÓRÐ+Ð+r    c                 ó\  — |j                  dd«       t        j                  t        j                  d   ¬«       t        «        t        i t        j                  j                  «       d d «      }|j                  d«      dk(  sJ ‚|j                  d«      dk(  sJ ‚|j                  d	«      �J ‚y )
Nr5  rC  r   rI  rf   rI   rg   rJ   ri   )r   r   rN  r>  rO  rA  r   r   r   r=  r#   )r1  r   Úoptss      r   Útest_websocket_call_honors_envrT  š  s•   € à×Ñ�}Ð&=Ô>ä
×Ñ¬¯
©
°<Ñ(@ÕAÜÔÜ˜r¤6×#7Ñ#7×#HÑ#HÓ#JÈDÐRVÓW€DØ�8‰8Ð%Ó&¨+Ò5Ð5Ð5Ø�8‰8Ð%Ó&¨$Ò.Ð.Ð.à�8‰8�OÓ$Ð,Ð,Ñ,r    Ú__main__r"   )0ÚunittestÚunittest.mockr   r   r_   r   rŽ   r   r   r	   r
   r   r   r   r   Úkubernetes.client.configurationr   r>  r¿   r1   r"  Ú	threadingÚpytestÚ
kubernetesr   r   r   r    rj   Údisable_warningsÚImportErrorÚfixturer   r'   ÚThreadr)   ÚTestCaserQ   rx   rÑ   r  r1  r;  rA  rQ  rT  rK   Úmainrv   r    r   ú<module>rb     s`  ðó ß *å +÷ K÷  Kñ  KÝ *Ý 9Û 	Û Û Û 
Û Û ß -Ñ -Û ð	ÛØ€G×ÑÔð €‡�˜Ôñ4ó ð4ó0&ô�×!Ñ!ô ô2'L�8×$Ñ$ô 'LôTB/ ×!2Ñ!2ô B/ôJD(˜8×,Ñ,ô D(ôNd ˜×*Ñ*ô d ðN €‡��hÔñó  ðð €‡�˜Ôñ/ó ð/ò*òSò 
-ð ˆzÒØ€H‡M�M…Oð øðI ò 	Ùð	ús   ÁE ÅEÅE