
    Rjda                         d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZmZ 	  G d de j                  Zed	k    r e j                     dS dS )
    N)Mockpatch	MagicMock)SSLErrorSSLEOFErrorSSLWantReadErrorSSLWantWriteErrorHAVE_SSL)_ssl_socket_wrap_sni_socket)WebSocketException)recvsendc                       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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dS )SSLEdgeCasesTestc                 B    t           s|                     d           d S d S )NzSSL not available)r
   skipTest)selfs    d/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/websocket/tests/test_ssl_edge_cases.pysetUpzSSLEdgeCasesTest.setUp'   s-     	/MM-.....	/ 	/    c                    t                      }t          d          5 }t                      }||_        t          j        d          |j        _        dt          j        i}| 	                    t          j                  5  t          ||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 )z$Test SSL handshake failure scenariosssl.SSLContextzSSL handshake timeout	cert_reqsexample.comN)r   r   return_valuesockettimeoutwrap_socketside_effectsslCERT_REQUIREDassertRaisesr   r   	mock_sockmock_ssl_contextmock_contextsslopts        r   test_ssl_handshake_failurez+SSLEdgeCasesTest.test_ssl_handshake_failure+   s6   FF	 #$$ 
	>(866L,8)39>'4 4L$0 "3#45F""6>22 > >Iv}===> > > > > > > > > > > > > > >
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	> 
	>6   A!B5?BB5B!	!B5$B!	%B55B9<B9c                    t                      }t          d          5 }t                      }||_        t          j        d          |j        _        t          j        dd}|                     t          j                  5  t          ||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 )z;Test various SSL certificate verification failure scenariosr   zCertificate verification failedTr   check_hostnamezbadssl.exampleN
r   r   r   r!   SSLCertVerificationErrorr   r    r"   r#   r   r$   s        r   *test_ssl_certificate_verification_failuresz;SSLEdgeCasesTest.test_ssl_certificate_verification_failures<   s`   FF	 #$$ 
	A(866L,8)363O14 4L$0 $'#4MMF""3#?@@ A AIv/?@@@A A A A A A A A A A A A A A A
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A 
	A6   A"B6 BB6B"	"B6%B"	&B66B:=B:c                 (   t                      }t          d          5 }t                      }t                      |j        _        ||_        d|i}t	          ||d           |j                                         ddd           dS # 1 swxY w Y   dS )z6Test SSL context configuration with various edge casesr   contextr   N)r   r   r   r   r   assert_called_once)r   r%   r&   existing_contextr(   s        r   )test_ssl_context_configuration_edge_casesz:SSLEdgeCasesTest.test_ssl_context_configuration_edge_casesM   s    FF	 #$$ 	>(8#vv8<(5,<)!12F 	6=999 (;;===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s   ABBBc           	      .   t                      }t          j        dddi          5  t          dd          5  t          dd          5  t          d          5 }t                      }||_        t                      |j        _        i }t          ||d	           |j                                         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
           n# 1 swxY w Y   d
d
d
           n# 1 swxY w Y   t          j        dddi          5  t          dd          5  t          dd          5  t          d          5 }t                      }||_        t                      |j        _        i }t          ||d	           |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
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )z.Test CA bundle environment variable edge cases
os.environWEBSOCKET_CLIENT_CA_BUNDLEz/nonexistent/ca-bundle.crtzos.path.isfileF)r   zos.path.isdirr   r   Nz/etc/ssl/certsT)cafilecapath)	r   r   dictr   r   r   load_verify_locationsassert_not_calledassert_called_withr$   s        r   )test_ssl_ca_bundle_environment_edge_casesz:SSLEdgeCasesTest.test_ssl_ca_bundle_environment_edge_cases_   sZ   FF	 Z79UV
 
 	O 	O 'e<<< O O???? 
O 
O/00 	O4D'+vv8D(5@D0=!##Iv}EEE %:LLNNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O
O 
O 
O 
O 
O 
O 
O 
O 
O 
O 
O 
O 
O 
O 
OO O O O O O O O O O O O O O O	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O" Z'CEU&VWW 	 	'e<<<  ?>>>  /00 4D'+vv8D(5@D0=!##Iv}EEE %:MM#'0@ N                                             	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   DC.
CAC 	4C CCCCC.CC.CC."D.C2	2D5C2	6DD	D	'H
9G2GAG	8GGGGGG2GG2"G#G2&H
2G6	6H
9G6	:H

HHc                    t                      }t          d          5 }t                      }||_        t          j        d          |j        _        t                      |j        _        ddi}|                     t                    5  t          ||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 )z(Test SSL cipher configuration edge casesr   zNo cipher can be selectedciphersINVALID_CIPHERr   N)r   r   r   r!   r   set_ciphersr    r   r#   r   r   r$   s        r   (test_ssl_cipher_configuration_edge_casesz9SSLEdgeCasesTest.test_ssl_cipher_configuration_edge_cases   sB   FF	 #$$ 	>(866L,8)36<+4 4L$0 59FFL$1!12F""#566 > >Iv}===> > > > > > > > > > > > > > >	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s6   A*B>B&B>&B*	*B>-B*	.B>>CCc                    t                      }t          d          5 }t                      }||_        t          d          |j        _        t                      |j        _        ddi}|                     t                    5  t          ||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 )z(Test ECDH curve configuration edge casesr   zunknown curve name
ecdh_curveinvalid_curver   N)
r   r   r   
ValueErrorset_ecdh_curver    r   r#   r   r   r$   s        r   test_ssl_ecdh_curve_edge_casesz/SSLEdgeCasesTest.test_ssl_ecdh_curve_edge_cases   s9   FF	 #$$ 		>(866L,8)6@AU6V6VL'348FFL$1"O4F""#566 > >Iv}===> > > > > > > > > > > > > > >		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		>6   A%B9B!B9!B%	%B9(B%	)B99B= B=c                    t                      }t          d          5 }t                      }||_        t          d          |j        _        t                      |j        _        ddi}|                     t                    5  t          ||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 )z0Test client certificate configuration edge casesr   zNo such filecertfilez/nonexistent/client.crtr   N)
r   r   r   FileNotFoundErrorload_cert_chainr    r   r#   r   r   r$   s        r   &test_ssl_client_certificate_edge_casesz7SSLEdgeCasesTest.test_ssl_client_certificate_edge_cases   s9   FF	 #$$ 		>(866L,8)7H7X7XL(448FFL$1 ";<F""#566 > >Iv}===> > > > > > > > > > > > > > >		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		>rL   c                    t                      }dgfd}||j        _        d|j        _        t          d          5 }t                      }||_        dg|j        _        t          |d          }|                     |d           |                     d         d           |j        	                                 |j        	                                 d	d	d	           d	S # 1 swxY w Y   d	S )
z)Test SSL want read/write retry edge casesr   c                 z    dxx         dz  cc<   d         dk    rt          d          d         dk    rdS dS )Nr      The operation did not complete      data after retriesr   r   )bufsizeread_attemptss    r   	mock_recvzMSSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases.<locals>.mock_recv   sY    !!Q1$$&'GHHHq!Q&&,,sr         >@selectors.DefaultSelectorTd   rW   rV   N)
r   r   r    
gettimeoutr   r   selectassertEqualregisterassert_called)r   r%   r[   mock_selector_classmock_selectorresultrZ   s         @r   )test_ssl_want_read_write_retry_edge_casesz:SSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases   s@   FF	 	 	 	 	 	 &/	",0	).// 	13F FFM/<,15M -)S))FV%:;;;]1-q111"00222 ..000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   BC##C'*C'c                 |   t                      }dgfd}||j        _        d|j        _        t          d          5 }t                      }||_        dg|j        _        t          |d          }|                     |d           |                     d         d           d	d	d	           d	S # 1 swxY w Y   d	S )
z$Test SSL want write retry edge casesr   c                     dxx         dz  cc<   d         dk    rt          d          d         dk    rt          |           S dS )Nr   rT   rU   rV   )r	   len)datawrite_attemptss    r   	mock_sendzHSSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases.<locals>.mock_send   s_    1"a A%%'(HIII"a''4yy qr   r\   r]   T	   test data	   rV   N)r   r   r    r_   r   r   r`   ra   )r   r%   rm   rd   re   rf   rl   s         @r   $test_ssl_want_write_retry_edge_casesz5SSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases   s   FF	 	 	 	 	 	 &/	",0	).// 	33F FFM/<,15M -)\22FVQ'''^A.222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s   A%B11B58B5c                     t                      }t          d          |j        _        d|j        _        ddlm} |                     |          5  t          |d           ddd           dS # 1 swxY w Y   dS )zTest SSL EOF error edge caseszSSL connection has been closedr\   r   "WebSocketConnectionClosedExceptionrn   N)	r   r   r   r    r_   r   websocket._exceptionsrs   r#   r   r%   rs   s      r   test_ssl_eof_error_edge_casesz.SSLEdgeCasesTest.test_ssl_eof_error_edge_cases   s    FF	 &11Q%R%R	",0	)LLLLLLABB 	* 	*L)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   A--A14A1c                 l   ddl m} ddlm} t	                      }d|j        _        t	          |          }t	                      |_        ||j        _         ||d          }|                    |t	                                }| 	                    ||g           |j        
                                 dS )zTest SSL pending data scenariosr   )SSLDispatcher)WebSocketApp   )specg      @N)websocket._dispatcherrx   websocket._appry   r   pendingr   sockr`   ra   r4   )r   rx   ry   mock_ssl_sockmock_app
dispatcherrf   s          r    test_ssl_pending_data_edge_casesz1SSLEdgeCasesTest.test_ssl_pending_data_edge_cases  s    777777////// -1* \****"]8S11
 ""=$&&99 	-1110022222r   c                 n   t                      }dfd}||j        _        d|j        _        t          d          5 }t                      }||_        dg|j        _        t          |d          }|                     |d           |                     d           d	d	d	           d	S # 1 swxY w Y   d	S )
z Test SSL renegotiation scenariosr   c                 <    dz  dk    rt          d          dS )NrT   zSSL renegotiation required   data after renegotiationrX   )rY   
call_counts    r   r[   zESSLEdgeCasesTest.test_ssl_renegotiation_edge_cases.<locals>.mock_recv  s*    !OJQ&'CDDD..r   r\   r]   Tr^   r   rV   N)r   r   r    r_   r   r   r`   ra   )r   r%   r[   rd   re   rf   r   s         @r   !test_ssl_renegotiation_edge_casesz2SSLEdgeCasesTest.test_ssl_renegotiation_edge_cases  s   FF	 
	/ 	/ 	/ 	/ 	/ &/	",0	).// 	,3F FFM/<,15M -)S))FV%@AAAZ+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   AB**B.1B.c                 2   t                      }t          d          5 }t                      }||_        t                      |j        _        ddi}t	          ||d           |j                            |ddd           ddd           dS # 1 swxY w Y   dS )z+Test SSL server hostname override scenariosr   server_hostnamezoverride.example.comzoriginal.example.comTdo_handshake_on_connectsuppress_ragged_eofsr   Nr   r   r   r   r   r?   r$   s        r   !test_ssl_server_hostname_overridez2SSLEdgeCasesTest.test_ssl_server_hostname_override3  s    FF	#$$ 	(866L,8)48FFL$1 ()?@F	6+ABBB $77(,%) 6	 8   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A!BBBc                 r   t                      }t          d          5 }t                      }||_        t                      |j        _        t	          t
          d          r>dt
          j        i}t          ||d           |                    t
          j                   ddd           dS # 1 swxY w Y   dS )z$Test SSL protocol version edge casesr   PROTOCOL_TLSssl_versionr   N)	r   r   r   r   hasattrr!   r   r   r?   r$   s        r   $test_ssl_protocol_version_edge_casesz5SSLEdgeCasesTest.test_ssl_protocol_version_edge_casesH  s    FF	 #$$ 
	F(866L,8)48FFL$1 sN++ F')9:Iv}=== 33C4DEEE
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	F 
	Fs   BB,,B03B0c                    t                      }t          j        dddi          5  t          d          5 }t                      }||_        t                      |j        _        i }t          ||d           |                     |j        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 )z-Test SSL keylog file configuration edge casesr8   SSLKEYLOGFILEz/tmp/ssl_keys.logr   r   N)r   r   r<   r   r   r   ra   keylog_filenamer$   s        r   test_ssl_keylog_file_edge_casesz0SSLEdgeCasesTest.test_ssl_keylog_file_edge_casesY  sc   FF	 Z8K&LMM 
	T 
	T'(( 	T,<#vv0< -8<(5Iv}===   !=?RSSS	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	T 
	Ts5   B6ABB6B"	"B6%B"	&B66B:=B:c                 n   t                      }t          j        dt          j        dft          j        dt          j        dft          j        dt          j        dfg}|D ]\  }}}}|                     ||          5  t          d          5 }t                      }||_        t                      |j        _        ||d}	t          ||	d           | 	                    |j
        |           | 	                    |j        |           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   dS )z1Test different SSL verification mode combinationsFTr,   r   r   N)r   r!   	CERT_NONEr"   subTestr   r   r   r   ra   verify_moder-   )
r   r%   
test_casesr   r-   expected_verifyexpected_checkr&   r'   r(   s
             r   #test_ssl_context_verification_modesz4SSLEdgeCasesTest.test_ssl_context_verification_modesj  s   FF	 ]E3=%8s'8%@c&7>	

 KU 	R 	RFI~	.QQ 
R 
R+,, 	R0@#'66L4@$1<@FFL,9+4WWF	6=AAA$$\%=OOO$$\%@.QQQ	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R 	R
R 
R 
R 
R 
R 
R 
R 
R 
R 
R 
R 
R 
R 
R 
R	R 	Rs7   <D)A:DD)DD)DD))D-	0D-	c                    ddl m} t                      }t          d          |j        _         |            }||_        d|_        	 |                                 dS # t          $ r | 	                    d           Y dS w xY w)z#Test SSL socket shutdown edge casesr   )	WebSocketzSSL shutdown failedTz/SSL shutdown error should be handled gracefullyN)
websocket._corer   r   r   shutdownr    r   	connectedclosefail)r   r   r   wss       r   #test_ssl_socket_shutdown_edge_casesz4SSLEdgeCasesTest.test_ssl_socket_shutdown_edge_cases  s    -------56K-L-L*Y[[	IHHJJJJJ 	I 	I 	IIIGHHHHHH	Is   A B ?B c                    t                      }t          d          |j        _        d|j        _        ddlm} |                     t          |f          5  t          |d           ddd           dS # 1 swxY w Y   dS )z6Test SSL socket being closed during ongoing operationsz+SSL connection has been closed unexpectedlyr\   r   rr   r^   N)	r   r   r   r    r_   r   rt   rs   r#   ru   s      r   &test_ssl_socket_close_during_operationz7SSLEdgeCasesTest.test_ssl_socket_close_during_operation  s    FF	 &.9&
 &
	" -1	)LLLLLL *LMNN 	! 	!C   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   A44A8;A8c                    t                      }t          d          5 }t                      }||_        t                      |j        _        ddi}	 t	          ||d           n# t
          $ r Y nw xY wddd           dS # 1 swxY w Y   dS )z-Test SSL compression configuration edge casesr   compressionFr   N)r   r   r   r   r   AttributeErrorr$   s        r   test_ssl_compression_edge_casesz0SSLEdgeCasesTest.test_ssl_compression_edge_cases  s    FF	#$$ 	(866L,8)48FFL$1 $U+FIv}====!   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s5   2B A#"B #
A0-B /A00B  BBc                 8   t                      }t          d          5 }t                      }||_        t                      }||j        _        d|_        d|_        t          |i d          }|                     |           ddd           dS # 1 swxY w Y   dS )z Test SSL session reuse scenariosr   mock_sessionTr   N)r   r   r   r   sessionsession_reusedr   assertIsNotNone)r   r%   r&   r'   r   rf   s         r   !test_ssl_session_reuse_edge_casesz2SSLEdgeCasesTest.test_ssl_session_reuse_edge_cases  s    FF	#$$ 	)(866L,8) FFM4AL$1 %3M!+/M( B>>F   (((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   A$BBBc                 $   t                      }t          d          5 }t                      }||_        t                      |j        _        dddgi}t	          ||d          }|                     |           ddd           dS # 1 swxY w Y   dS )zATest SSL ALPN (Application Layer Protocol Negotiation) edge casesr   alpn_protocolszhttp/1.1h2r   N)r   r   r   r   r   r   )r   r%   r&   r'   r(   rf   s         r   !test_ssl_alpn_protocol_edge_casesz2SSLEdgeCasesTest.test_ssl_alpn_protocol_edge_cases  s    FF	#$$ 	)(866L,8)48FFL$1 'T(:;F !FMBBF  (((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   ABB	B	c                 .   t                      }t          d          5 }t                      }||_        t                      |j        _        d}t	          |i |           |j                            |dd|           ddd           dS # 1 swxY w Y   dS )z0Test SSL SNI (Server Name Indication) edge casesr   z2001:db8::1Tr   Nr   )r   r%   r&   r'   ipv6_hostnames        r   test_ssl_sni_edge_casesz(SSLEdgeCasesTest.test_ssl_sni_edge_cases  s    FF	 #$$ 	(866L,8)48FFL$1 *M	2}555 $77(,%) -	 8   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AB

BBc                     t                      d }|j        _        dj        _        ddlm}  |fdd          }|                    d          }|                     t          |          d           d	S )
z'Test SSL buffer size related edge casesc                 R    | dk    rt          d          dt          | d          z  S )N @  z"[SSL: BAD_LENGTH] buffer too large   Arz   )r   min)rY   s    r   r[   zCSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.mock_recv  s/    CDDD#gt,,,,r   r\   r   )frame_bufferc                 $    t          |           S )N)r   )sizer%   s    r   <lambda>zBSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.<lambda>  s    tIt'<'< r   T)skip_utf8_validationr   N)
r   r   r    r_   r   websocket._abnfr   recv_strictassertGreaterrj   )r   r[   r   fbrf   r%   s        @r   test_ssl_buffer_size_edge_casesz0SSLEdgeCasesTest.test_ssl_buffer_size_edge_cases  s    FF		- 	- 	- &/	",0	)000000 \<<<<SWXXX &&3v;;*****r   c                    t                      }t          d          5 }t                      }||_        t          j        d          |j        _        dt          j        i}|                     t          j                  5  t          ||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 )z&Test SSL protocol downgrade protectionr   SSLV3_ALERT_HANDSHAKE_FAILUREr   r   N)
r   r   r   r!   r   r   r    PROTOCOL_TLS_CLIENTr#   r   r$   s        r   &test_ssl_protocol_downgrade_protectionz7SSLEdgeCasesTest.test_ssl_protocol_downgrade_protection  s6   FF	#$$ 	>(866L,8)36</4 4L$0 $S%<=F ""3<00 > >Iv}===> > > > > > > > > > > > > > >	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>r*   c                    t                      }t          d          5 }t                      }||_        t          j        d          |j        _        t          j        dd}|                     t          j                  5  t          ||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 )z0Test SSL certificate chain validation edge casesr   z2certificate verify failed: certificate has expiredTr,   zexpired.badssl.comNr.   r$   s        r   %test_ssl_certificate_chain_validationz6SSLEdgeCasesTest.test_ssl_certificate_chain_validation  s`   FF	#$$ 	E(866L,8) 473OD4 4L$0 $'#4MMF""3#?@@ E EIv/CDDDE E E E E E E E E E E E E E E	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Er1   c                 p   t                      }t          d          5 }t                      }||_        t          j        d          |j        _        ddi}|                     t          j                  5  t          ||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 )z(Test SSL weak cipher rejection scenariosr   zno shared cipherrB   zRC4-MD5r   N)	r   r   r   r!   r   r   r    r#   r   r$   s        r   test_ssl_weak_cipher_rejectionz/SSLEdgeCasesTest.test_ssl_weak_cipher_rejection+  s-   FF	#$$ 		>(866L,8)36<@R3S3SL$0+F ""3<00 > >Iv}===> > > > > > > > > > > > > > >		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		> 		>s6   AB+5BB+B	B+B	B++B/2B/c           
         t                      }g d}|D ]E\  }}|                     ||          5  t          d          5 }t                      }||_        ||k    rd|v r}t	          j        d| d| d          |j        _        t          j        dd	}| 	                    t          j                  5  t          |||           d
d
d
           n# 1 swxY w Y   nMt                      |j        _        t          j        dd	}t          |||          }|                     |           d
d
d
           n# 1 swxY w Y   d
d
d
           n# 1 swxY w Y   Gd
S )z)Test SSL hostname verification edge cases))*.example.comzsubdomain.example.com)r   zsub.subdomain.example.com)r   zwww.example.com)certhostnamer   zsub.subdomainz
hostname 'z' doesn't match ''Tr,   N)r   r   r   r   r!   r/   r   r    r"   r#   r   r   )	r   r%   r   cert_hostnameconnect_hostnamer&   r'   r(   rf   s	            r   )test_ssl_hostname_verification_edge_casesz:SSLEdgeCasesTest.test_ssl_hostname_verification_edge_cases:  sg   FF	
 
 

 0: 	5 	5+M+=;KLL 5 5+,, 50@#'66L4@$1 &)999+/??? @C?[\)9\\M\\\@ @0<
 *-):.2" "
 "..s/KLL M M'	6;KLLLM M M M M M M M M M M M M M M AE0=),):.2" " "-Y@P!Q!Q,,V444;5 5 5 5 5 5 5 5 5 5 5 5 5 5 55 5 5 5 5 5 5 5 5 5 5 5 5 5 5	5 	5s[   EA3D85C	D8CD8CAD8,E8D<<E?D< EE	E	c                    t                      }	 ddl}t          |d          rt          d          5 }t                      }||_        t                      |j        _        t          |i d           |j                                         ddd           dS # 1 swxY w Y   dS dS # t          t          f$ r | 
                    d           Y dS w xY w)zTest SSL memory BIO edge casesr   N	MemoryBIOr   r   zSSL MemoryBIO not available)r   r!   r   r   r   r   r   r4   ImportErrorr   r   )r   r%   r!   r&   r'   s        r   test_ssl_memory_bio_edge_casesz/SSLEdgeCasesTest.test_ssl_memory_bio_edge_casesf  sF   FF		9JJJsK(( 
B+,, 	B0@#'66L4@$1<@FFL,9  	2}=== !,??AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B
B 
B ^, 	9 	9 	9MM7888888	9s5   #B' ABB' BB' B B' '&CCN) __name__
__module____qualname__r   r)   r0   r6   r@   rE   rK   rQ   rg   rp   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   %   s       / / /> > >"A A A"> > >$$ $ $L> > >$> > > > > > 1 1 1@3 3 3:* * *3 3 3., , ,6  *F F F"T T T"R R R0I I I"! ! !   &) ) )&) ) )$  ,+ + +.> > >"E E E$> > >*5 *5 *5X9 9 9 9 9r   r   __main__)unittestr   r!   unittest.mockr   r   r   websocket._ssl_compatr   r   r   r	   r
   websocket._httpr   r   rt   r   websocket._socketr   r   TestCaser   r   mainr   r   r   <module>r      s)     



 0 0 0 0 0 0 0 0 0 0              : 9 9 9 9 9 9 9 4 4 4 4 4 4 ( ( ( ( ( ( ( (&U	9 U	9 U	9 U	9 U	9x( U	9 U	9 U	9p zHMOOOOO r   