
    [jgB                     4   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 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mZmZmZ d dlZ	 d dlZ ej                     n# e$ r Y nw xY w ej        d	
          d             ZddZ G d dej                  Z  G d de j!                  Z" G d de j!                  Z# ej        d          d             Z$ ej        d	
          d             Z%d Z&d Z'd Z(e)dk    r e j*                     dS dS )    N)	MagicMockpatch   )	ws_client)get_websocket_urlWSClientV5_CHANNEL_PROTOCOLV4_CHANNEL_PROTOCOLCLOSE_CHANNELSTDIN_CHANNEL)websocket_proxycare)Configuration)streamclientconfigT)autousec                     d}| dz  }|                     |           |                    dt          |                     d S )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       ]/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/kubernetes/stream/ws_client_test.pydummy_kubeconfigr   "   sK    G" ,&H   |S]]33333    c                 .    |                      ||          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.
    	127.0.0.1"  c                    t                                          d           || _        || _        d| _        t          j        t
          j        t
          j                  | _        | j        	                    t
          j
        t
          j        d           | j                            | j        df           | j                            d           d S )NT)daemonFr   r   )super__init__hostportreceived_connectsocketAF_INETSOCK_STREAM_server_sock
setsockopt
SOL_SOCKETSO_REUSEADDRbindlisten)selfr/   r0   	__class__s      r   r.   zDummyProxy.__init__D   s    %%%		 %"M&.&:LMM$$V%68KQOOO	1~...  #####r   c                 P   | j                                         \  }}	 |                    d                              dd          }|                    d          rd| _        |                    d           |                                 d S # |                                 w xY w)Ni   zutf-8ignore)errorszCONNECT Ts'   HTTP/1.1 200 Connection established

)r5   acceptrecvdecode
startswithr1   sendallclose)r;   conn_datas       r   runzDummyProxy.runN   s    #**,,a	99T??))'()CCDz** M(,%KLLLJJLLLLLDJJLLLLs   AB B%)r)   r*   )__name__
__module____qualname____doc__r.   rI   __classcell__)r<   s   @r   r(   r(   ?   sV         $ $ $ $ $ $      r   r(   c                       e Zd Zd Zd ZdS )WSClientTestc                 \    dD ](\  }}|                      t          |          |           )d S )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_clientZ   sE    	 
	= 
	=KC .s33V<<<<
	= 
	=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                      }|r||_        |r%t          j                            |          |_        |||_        t          i |d d           }	t          |	d          |k    sJ t          |	d          |k    sJ t          |	d          |k    sJ t          |	d          |k    sJ d S )N)NNNNNNN)http://proxy.example.com:8080/NNproxy.example.com  NN)rW   	user:passNrX   rY   userpassN)rW   rZ    rX   rY   r[   NrW   rZ   *rX   rY   r[   .example.comzlocalhost,.local,.example.com)	localhostz.localr`   )proxy_basic_authhttp_proxy_hosthttp_proxy_porthttp_proxy_authhttp_no_proxy)	r   proxyurllib3utilmake_headersproxy_headersno_proxyr   r&   )
r;   rg   idpassrl   expect_hostexpect_portexpect_authexpect_noproxycfgconnect_optss
             r   test_websocket_proxycarez%WSClientTest.test_websocket_proxycareg   s    J J T T2Kbuw{  ~M  PS  OT  U2Kbuw{  ~M  P^  O_  `2KA`cvx|  N  Pu  Pu  Pu  v_ 	L 	LZE68[+{N  //C "!	 W$+L$=$=v$=$V$V!#' /r3dCCL<):;;{JJJJ<):;;{JJJJ<):;;{JJJJ<99^KKKKK/	L 	Lr   N)rJ   rK   rL   rU   rt    r   r   rP   rP   X   s7        = = =L L L L Lr   rP   c                   N    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S )WSClientProtocolTestz'Tests for WSClient V5 protocol handlingc                     t                      | _        d| j        _        i | j        _        d | j        _        d | j        _        d | j        _        d | j        _        d| j        _        d S )NFT)	r   config_mockassert_hostnameapi_keyrg   ssl_ca_cert	cert_filekey_file
verify_ssl)r;   s    r   setUpzWSClientProtocolTest.setUp   sa    $;;+0(#% !%'+$%)"$(!&*###r   c                    t          j        t          dd          5 }|j        }t	          | j        ddd           |j                                         |j        j        }|d         }| 	                    d|           d	t           d
t           }| 	                    ||d                    ddd           dS # 1 swxY w Y   dS )z6Verify sec-websocket-protocol header requests v5 first	WebSocketT)autospec	ws://testNheaderscapture_allr   headerzsec-websocket-protocol: ,)r   objectws_client_modulereturn_valuer   ry   connectassert_called_once	call_argsassertInr	   r
   )r;   mock_ws_clsmock_wsr   kwargsexpected_headers         r   test_create_websocket_headerz1WSClientProtocolTest.test_create_websocket_header   s    \*K$GGG 	=;!.GT%{DdSSSSO..0001I q\FMM(F+++d9LddObddOMM/6(+;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   BB;;B?B?c                    t          j        t          d          5 }t                      }t          |_        d|_        ||_        t          | j	        ddd          } |j
        d           |j                            t          t          t          g          t           j        j                   ddd           dS # 1 swxY w Y   dS )z>Verify close_channel sends correct frame when v5 is negotiatedcreate_websocketTr   Nr   r   )opcode)r   r   r   r   r	   subprotocol	connectedr   r   ry   close_channelsendassert_called_withbytesr   r   	websocketABNFOPCODE_BINARYr;   mock_creater   r   s       r   test_close_channel_v5z*WSClientProtocolTest.test_close_channel_v5   s   \*,>?? 		x;kkG"5G $G'.K$d.TW[\\\F F ###L++E=-2P,Q,QZcZhZv+www		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		x 		xs   BB==CCc                 >   t          j        t          d          5 }t                      }t          |_        d|_        ||_        t          | j	        ddd          } |j
        d           |j                                         ddd           dS # 1 swxY w Y   dS )z7Verify close_channel does nothing when v4 is negotiatedr   Tr   Nr   r   )r   r   r   r   r
   r   r   r   r   ry   r   r   assert_not_calledr   s       r   test_close_channel_v4z*WSClientProtocolTest.test_close_channel_v4   s    \*,>?? 		-;kkG"5G $G'.K$d.TW[\\\F F ###L**,,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-s   A*BBBc                 j   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	           |                     d|j                   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )
z:Verify update processes close signal when v5 is negotiatedr   select.selectT
   r   Nr   r   timeout)r   r   r   r   r	   r   r   sockfilenor   r   r   r   rH   r   r   r   recv_data_framer   ry   updater   _closed_channelsr;   r   mock_selectr   framer   s         r   test_update_receives_close_v5z2WSClientProtocolTest.test_update_receives_close_v5   s   \*,>?? 	6;/""	6&1kkG"5G $G/1GL, KKE}=>>EJ4=N4PRW3XG#0'.K$)0B'?K$d.TW[\\\FFM!$$$$MM!V4555)	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s5   D(CDD(D	D(D	D((D,/D,c           	         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d          } |j        d	           |                     d|j                   |                     d
|j                   |                     |j        d
         d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zTVerify update treats 0xFF as regular data (or ignores signal interpretation) when v4r   r   Tr   r   Nr   r   binaryr   r          )r   r   r   r   r
   r   r   r   r   r   r   r   r   rH   r   r   r   r   r   ry   r   assertNotInr   r   	_channelsrR   r   s         r   #test_update_ignores_close_signal_v4z8WSClientProtocolTest.test_update_ignores_close_signal_v4   s   \*,>?? 	=;/""	=&1kkG"5G $G/1GL, KKE}=>>EJ4=N4PRW3XG#0'.K$)0B'?K$d.TW[dhiiiFFM!$$$$ Q 7888 MM#v/000V-c2G<<<3	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s5   E%DEE%E	E%E	E%%E),E)c                    t          j        t          d          5 }t                      }t          |_        d|_        ||_        t          | j	        dddd          }d|j
        d<   |j                            d            |j        d          }|                     |d            |j        d          }|                     |d	           ddd           dS # 1 swxY w Y   dS )
zGVerify readline_channel flushes remaining buffer when channel is closedr   Tr   NFr   hellor   r^   r   r   r   r   r	   r   r   r   r   ry   r   r   addreadline_channelrR   r;   r   r   r   line1line2s         r   /test_readline_channel_closed_with_leftover_datazDWSClientProtocolTest.test_readline_channel_closed_with_leftover_data   s/   \*,>?? 	(;kkG"5G $G'.K$d.TW[dijjjF #*FQ#''*** ,F+A..EUG,,, ,F+A..EUB'''%	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(   B2CC!Cc                    t          j        t          d          5 }t                      }t          |_        d|_        ||_        t          | j	        dddd          }d|j
        d<   |j                            d            |j        d          }|                     |d            |j        d          }|                     |d           ddd           dS # 1 swxY w Y   dS )	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/   \*,>?? 	);kkG"5G $G'.K$d.TW[dhiiiF #2FQ#''*** ,F+A..EUO444 ,F+A..EUC(((%	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)r   c                 r   t          j        t          d          5 }t                      }t          |_        d|_        d|j        j        _	        ||_	        t          | j        dddd          }d|j        d	<   |j                            d	            |j        d	          }|                     |d           t          j        |d
          5 } |j        d	          }|                     |d           |                                 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )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   ry   r   r   r   read_channelrR   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;kkG"5G $G/1GL,'.K$d.TW[dijjjF #*FQ#''*** (F'**EUG,,, fh// 0;++A..  +++--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s6   B2D,;DD,D	D,D	D,,D03D0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                            d
            |j        d
          }|                     |d	            |j        d
          }|                     |d	            |j        d
           t          j        |d          5 } |j        d
          }|                     |d           |                                 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zWVerify peek_channel allows peeking leftover data and then short-circuits after drainingr   zselect.pollTr   r   NFr   r   r   r   r^   )r   r   r   r   pollr   r	   r   r   r   r   r   ry   r   r   r   peek_channelrR   r   r   )	r;   r   	mock_pollr   r   r   r   r   data3s	            r   +test_peek_channel_closed_with_leftover_dataz@WSClientProtocolTest.test_peek_channel_closed_with_leftover_data6  s`   \*,>?? 	0;=!!	0%.79I"'4kkG"5G $G/1GL,'.K$d.TW[dijjjF #*FQ#''*** (F'**EUG,,, (F'**EUG,,,  F""" fh// 0;++A..  +++--///0 0 0 0 0 0 0 0 0 0 0 0 0 0 09	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0sY   FC9F$;E+F+E//F2E/3F6FF	F	F	
FF!FN)rJ   rK   rL   rM   r   r   r   r   r   r   r   r   r   r   ru   r   r   rw   rw      s        11	+ 	+ 	+= = ="x x x- - -6 6 60= = =:( ( (,) ) ),0 0 04!0 !0 !0 !0 !0r   rw   module)scopec               #   Z   K   t          d          } |                                  | V  d S )Nr*   )r0   )r(   start)rg   s    r   dummy_proxyr   [  s2       D!!!E	KKMMM
KKKKKr   c                 >    dD ]}|                      |d           d S )N)
HTTP_PROXY
http_proxyHTTPS_PROXYhttps_proxyNO_PROXYrl   F)raising)delenv)r   vars     r   clear_proxy_envr   b  s7    a / /3..../ /r   c                      t           j                                        } t          j        d          | _        t          j        dd          | _        t           j                            |            d S )Nr   r   r^   )r   r   get_default_copyosgetenvrg   rl   set_default)rr   s    r   apply_proxy_to_confr   g  sW    


/
/
1
1C	-((CI9Z,,CL
$$S)))))r   c                    |                     dd           |                    t          j        dd            t	          j        t          j        d                    t                       |                     dd           t	          j        t          j        d                    t                       t          j                    }|	                    d           | j
        r
J d	            d S )
Nr   http://127.0.0.1:8888list_namespacec                     d S r!   ru   )r;   _args_kwargss      r   <lambda>z,test_rest_call_ignores_env.<locals>.<lambda>r  s    \` r   r   config_fileF)_preload_contentz#REST path should ignore HTTPS_PROXY)r   setattrr   	CoreV1Apir   load_kube_configr   environr   r   r1   )r   r   v1s      r   test_rest_call_ignores_envr   n  s    }&=>>>(*:<`<`aaa

<(@AAAA}&=>>>

<(@AAAA				Bu---+RR-RRRRRRr   c                    |                     dd           t          j        t          j        d                    t                       t          i t          j        	                                d d           }|
                    d          dk    sJ |
                    d          dk    sJ |
                    d	          J d S )
Nr   r   r   r   rc   r)   rd   r*   rf   )r   r   r   r   r   r   r   r   r   r   r"   )r   r   optss      r   test_websocket_call_honors_envr   ~  s    }&=>>>

<(@AAAAr6#7#H#H#J#JDRVWWD88%&&+555588%&&$....88O$$,,,,,r   __main__r!   )+unittestunittest.mockr   r   r^   r   r   r   r   r	   r
   r   r   r   kubernetes.client.configurationr   r   r2   	threadingpytest
kubernetesr   r   r   r   rh   disable_warningsImportErrorfixturer   r&   Threadr(   TestCaserP   rw   r   r   r   r   r   rJ   mainru   r   r   <module>r     s    * * * * * * * * + + + + + + z z z z z z z z z z z z z z z z * * * * * * 9 9 9 9 9 9 				       - - - - - - - - - -    	NNNG 	 	 	D	4 4 40& & & &    !   2'L 'L 'L 'L 'L8$ 'L 'L 'LTU0 U0 U0 U0 U08, U0 U0 U0r h    / / /* * *S S S 
- 
- 
- zHMOOOOO s   A" "A*)A*