
    ida                         S SK r S SKrS SKrS SKJrJrJr  S SKJrJ	r	J
r
JrJr  S SKJrJr  S SKJr  S SKJrJr    " S S\ R*                  5      r\S	:X  a  \ R0                  " 5         gg)
    N)Mockpatch	MagicMock)SSLErrorSSLEOFErrorSSLWantReadErrorSSLWantWriteErrorHAVE_SSL)_ssl_socket_wrap_sni_socket)WebSocketException)recvsendc                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r Sr!g )!SSLEdgeCasesTest%   c                 >    [         (       d  U R                  S5        g g )NzSSL not available)r
   skipTest)selfs    PC:\des-py\RoboSAPF\venv\Lib\site-packages\websocket/tests/test_ssl_edge_cases.pysetUpSSLEdgeCasesTest.setUp'   s    xMM-.     c                 z   [        5       n[        S5       n[        5       nX2l        [        R                  " S5      UR
                  l        S[        R                  0nU R                  [        R                  5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)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_failure+SSLEdgeCasesTest.test_ssl_handshake_failure+   s    F	 #$(86L,8)39>>'4L$$0 "3#4#45F""6>>2I}= 3 %$ 32 %$$   A'B,=B
B,
B)	%B,,
B:c                 |   [        5       n[        S5       n[        5       nX2l        [        R                  " S5      UR
                  l        [        R                  SS.nU R                  [        R                  5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)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_failures;SSLEdgeCasesTest.test_ssl_certificate_verification_failures<   s    F	 #$(86L,8)363O3O14L$$0 $'#4#4MF""3#?#?@I/?@ A %$ A@ %$$   A(B->BB-
B*	&B--
B;c                    [        5       n[        S5       n[        5       n[        5       UR                  l        X2l        SU0n[	        XS5        UR                  R                  5         SSS5        g! , (       d  f       g= f)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_cases:SSLEdgeCasesTest.test_ssl_context_configuration_edge_casesM   sm    F	 #$(8#v8<((5,<)!12F 	=9 ((;;= %$$s   AA33
Bc           	         [        5       n[        R                  " SSS05         [        SSS9   [        SSS9   [        S5       n[        5       nX2l        [        5       UR                  l        0 n[        XS	5        UR                  R                  5         S
S
S
5        S
S
S
5        S
S
S
5        S
S
S
5        [        R                  " SSS05         [        SSS9   [        SSS9   [        S5       n[        5       nX2l        [        5       UR                  l        0 n[        XS	5        UR                  R                  S
SS9  S
S
S
5        S
S
S
5        S
S
S
5        S
S
S
5        g
! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Nk= f! , (       d  f       Nt= f! , (       d  f       N}= f! , (       d  f       g
= f)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_cases:SSLEdgeCasesTest.test_ssl_ca_bundle_environment_edge_cases_   s   F	 ZZ79UV
 'e<??/04D'+v8D5@D00=!##I}E %::LLN 1 @ =
" ZZ'CEU&VW'e<?>/04D'+v8D5@D00=!##I}E %::MM#'0@ N  1 ? = XW 10 @? =<
 
( 10 ?> =< XWs   FFE7AE&	E7 F(FGG'F;3AF*	F;GG&
E40E77
FF
F	F
F'*
F84F;;
G	G
G	G
G+c                 |   [        5       n[        S5       n[        5       nX2l        [        R                  " S5      UR
                  l        [        5       UR                  l        SS0nU R                  [        5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)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_cases9SSLEdgeCasesTest.test_ssl_cipher_configuration_edge_cases   s    F	 #$(86L,8)36<<+4L$$0 59FL$$1!12F""#56I}= 7 %$ 76 %$r5   c                 f   [        5       n[        S5       n[        5       nX2l        [        S5      UR                  l        [        5       UR                  l        SS0nU R                  [        5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)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_cases/SSLEdgeCasesTest.test_ssl_ecdh_curve_edge_cases   s    F	 #$(86L,8)6@AU6VL''348FL$$1"O4F""#56I}= 7 %$ 76 %$$   AB"3B B"
B	B""
B0c                 f   [        5       n[        S5       n[        5       nX2l        [        S5      UR                  l        [        5       UR                  l        SS0nU R                  [        5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)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_cases7SSLEdgeCasesTest.test_ssl_client_certificate_edge_cases   s    F	 #$(86L,8)7H7XL((448FL$$1 ";<F""#56I}= 7 %$ 76 %$rT   c                   ^ [        5       nS/mU4S jnX!R                  l        SUR                  l        [        S5       n[        5       nXCl        S/UR                  l        [        US5      nU R                  US5        U R                  TS   S5        UR                  R                  5         UR                  R                  5         S	S	S	5        g	! , (       d  f       g	= f)
z)Test SSL want read/write retry edge casesr   c                 \   > TS==   S-  ss'   TS   S:X  a  [        S5      eTS   S:X  a  gg)Nr      The operation did not complete      data after retriesr   r   )bufsizeread_attemptss    r   	mock_recvMSSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases.<locals>.mock_recv   s?    !!Q1$&'GHHq!Q&,r         >@selectors.DefaultSelectorTd   r`   r_   N)
r   r   r"   
gettimeoutr   r   selectassertEqualregisterassert_called)r   r'   rd   mock_selector_classmock_selectorresultrc   s         @r   )test_ssl_want_read_write_retry_edge_cases:SSLEdgeCasesTest.test_ssl_want_read_write_retry_edge_cases   s    F	 	 &/",0	)./3F FM/<,15M  -)S)FV%:;]1-q1""002  ..0 0//s   B
C
C"c                 b  ^ [        5       nS/mU4S jnX!R                  l        SUR                  l        [        S5       n[        5       nXCl        S/UR                  l        [        US5      nU R                  US5        U R                  TS   S5        S	S	S	5        g	! , (       d  f       g	= f)
z$Test SSL want write retry edge casesr   c                 p   > TS==   S-  ss'   TS   S:X  a  [        S5      eTS   S:X  a  [        U 5      $ g)Nr   r]   r^   r_   )r	   len)datawrite_attemptss    r   	mock_sendHSSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases.<locals>.mock_send   sF    1"a A%'(HII"a'4y r   rf   rg   T	   test data	   r_   N)r   r   r"   ri   r   r   rj   rk   )r   r'   rx   rn   ro   rp   rw   s         @r   $test_ssl_want_write_retry_edge_cases5SSLEdgeCasesTest.test_ssl_want_write_retry_edge_cases   s    F	 	 &/",0	)./3F FM/<,15M  -)\2FVQ'^A.2 0//s   AB  
B.c                     [        5       n[        S5      UR                  l        SUR                  l        SSKJn  U R                  U5         [        US5        SSS5        g! , (       d  f       g= f)zTest SSL EOF error edge caseszSSL connection has been closedrf   r   "WebSocketConnectionClosedExceptionrz   N)	r   r   r   r"   ri   r   websocket._exceptionsr   r%   r   r'   r   s      r   test_ssl_eof_error_edge_cases.SSLEdgeCasesTest.test_ssl_eof_error_edge_cases   sT    F	 &11Q%R	",0	)LABL) CBBs   A##
A1c                 @   SSK Jn  SSKJn  [	        5       nSUR
                  l        [	        US9n[	        5       Ul        X4R                  l        U" US5      nUR                  U[	        5       5      nU R                  Xc/5        UR
                  R                  5         g)zTest SSL pending data scenariosr   )SSLDispatcher)WebSocketApp   )specg      @N)websocket._dispatcherr   websocket._appr   r   pendingr   sockrj   rk   r8   )r   r   r   mock_ssl_sockmock_app
dispatcherrp   s          r    test_ssl_pending_data_edge_cases1SSLEdgeCasesTest.test_ssl_pending_data_edge_cases  s    7/ -1* \**"8S1
 ""=$&9 	1002r   c                 Z  ^ [        5       nSmU4S jnX!R                  l        SUR                  l        [        S5       n[        5       nXCl        S/UR                  l        [        US5      nU R                  US5        U R                  TS5        S	S	S	5        g	! , (       d  f       g	= f)
z Test SSL renegotiation scenariosr   c                 2   > TS-  mTS:X  a  [        S5      eg)Nr]   zSSL renegotiation required   data after renegotiationra   )rb   
call_counts    r   rd   ESSLEdgeCasesTest.test_ssl_renegotiation_edge_cases.<locals>.mock_recv  s"    !OJQ&'CDD.r   rf   rg   Trh   r   r_   N)r   r   r"   ri   r   r   rj   rk   )r   r'   rd   rn   ro   rp   r   s         @r   !test_ssl_renegotiation_edge_cases2SSLEdgeCasesTest.test_ssl_renegotiation_edge_cases  s    F	 
	/ &/",0	)./3F FM/<,15M  -)S)FV%@AZ+ 0//s    AB
B*c                    [        5       n[        S5       n[        5       nX2l        [        5       UR                  l        SS0n[	        XS5        UR                  R                  USSSS9  SSS5        g! , (       d  f       g= f)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   rD   r&   s        r   !test_ssl_server_hostname_override2SSLEdgeCasesTest.test_ssl_server_hostname_override3  s}    F	#$(86L,8)48FL$$1 ()?@F	+AB $$77(,%) 6	 8  %$$s   AA55
Bc                 X   [        5       n[        S5       n[        5       nX2l        [        5       UR                  l        [	        [
        S5      (       a=  S[
        R                  0n[        XS5        UR                  [
        R                  5        SSS5        g! , (       d  f       g= f)z$Test SSL protocol version edge casesr   PROTOCOL_TLSssl_versionr   N)	r   r   r   r!   hasattrr#   r   r   rD   r&   s        r   $test_ssl_protocol_version_edge_cases5SSLEdgeCasesTest.test_ssl_protocol_version_edge_casesH  s}    F	 #$(86L,8)48FL$$1 sN++')9)9:I}= 33C4D4DE %$$s   A<B
B)c                 n   [        5       n[        R                  " SSS05         [        S5       n[        5       nX2l        [        5       UR                  l        0 n[        XS5        U R                  UR                  S5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z-Test SSL keylog file configuration edge casesr=   SSLKEYLOGFILEz/tmp/ssl_keys.logr   r   N)r   r   rA   r   r!   r   rk   keylog_filenamer&   s        r   test_ssl_keylog_file_edge_cases0SSLEdgeCasesTest.test_ssl_keylog_file_edge_casesY  s    F	 ZZ8K&LM'(,<#v0<-8<((5I}=   !=!=?RS ) NM(( NMs#   B&ABB&
B#	B&&
B4c                 z   [        5       n[        R                  S[        R                  S4[        R                  S[        R                  S4[        R                  S[        R                  S4/nU H  u  p4pVU R	                  X4S9   [        S5       n[        5       nXl        [        5       UR                  l        X4S.n	[        XS5        U R                  UR                  U5        U R                  UR                  U5        SSS5        SSS5        M     g! , (       d  f       N= f! , (       d  f       M  = f)z1Test different SSL verification mode combinationsFTr/   r   r   N)r   r#   	CERT_NONEr$   subTestr   r   r!   r   rk   verify_moder0   )
r   r'   
test_casesr   r0   expected_verifyexpected_checkr(   r)   r*   s
             r   #test_ssl_context_verification_modes4SSLEdgeCasesTest.test_ssl_context_verification_modesj  s    F	 ]]E3==%8s'8'8%@c&7&7>	

 KUFI	Q+,0@#'6L4@1<@FL,,9+4WF	=A$$\%=%=O$$\%@%@.Q - RQ KU,, RQs%   D+A2DD+
D($D++
D:	c                     SSK Jn  [        5       n[        S5      UR                  l        U" 5       nX#l        SUl         UR                  5         g! [         a    U R                  S5         gf = f)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_cases4SSLEdgeCasesTest.test_ssl_socket_shutdown_edge_cases  s`    --56K-L*[	IHHJ 	IIIGH	Is    A A/.A/c                     [        5       n[        S5      UR                  l        SUR                  l        SSKJn  U R                  [        U45         [        US5        SSS5        g! , (       d  f       g= f)z6Test SSL socket being closed during ongoing operationsz+SSL connection has been closed unexpectedlyrf   r   r   rh   N)	r   r   r   r"   ri   r   r   r   r%   r   s      r   &test_ssl_socket_close_during_operation7SSLEdgeCasesTest.test_ssl_socket_close_during_operation  s_    F	 &.9&
	" -1	)L *LMNC  ONNs   A))
A7c                     [        5       n[        S5       n[        5       nX2l        [        5       UR                  l        SS0n [	        XS5        SSS5        g! [
         a     Nf = f! , (       d  f       g= f)z-Test SSL compression configuration edge casesr   compressionFr   N)r   r   r   r!   r   AttributeErrorr&   s        r   test_ssl_compression_edge_cases0SSLEdgeCasesTest.test_ssl_compression_edge_cases  sr    F	#$(86L,8)48FL$$1 $U+FI}= %$ "  %$s)   .A*A
A'$A*&A''A**
A8c                    [        5       n[        S5       n[        5       nX2l        [        5       nXCR                  l        SUl        SUl        [        U0 S5      nU R                  U5        SSS5        g! , (       d  f       g= f)z Test SSL session reuse scenariosr   mock_sessionTr   N)r   r   r   r!   sessionsession_reusedr   assertIsNotNone)r   r'   r(   r)   r   rp   s         r   !test_ssl_session_reuse_edge_cases2SSLEdgeCasesTest.test_ssl_session_reuse_edge_cases  sq    F	#$(86L,8) FM4A$$1 %3M!+/M( B>F   ( %$$s   AA66
Bc                     [        5       n[        S5       n[        5       nX2l        [        5       UR                  l        SSS/0n[	        XS5      nU R                  U5        SSS5        g! , (       d  f       g= f)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*   rp   s         r   !test_ssl_alpn_protocol_edge_cases2SSLEdgeCasesTest.test_ssl_alpn_protocol_edge_cases  sk    F	#$(86L,8)48FL$$1 'T(:;F !MBF  ( %$$s   AA,,
A:c                 
   [        5       n[        S5       n[        5       nX2l        [        5       UR                  l        Sn[	        U0 U5        UR                  R                  USSUS9  SSS5        g! , (       d  f       g= f)z0Test SSL SNI (Server Name Indication) edge casesr   z2001:db8::1Tr   Nr   )r   r'   r(   r)   ipv6_hostnames        r   test_ssl_sni_edge_cases(SSLEdgeCasesTest.test_ssl_sni_edge_cases  sz    F	 #$(86L,8)48FL$$1 *M	2}5 $$77(,%) -	 8  %$$s   AA44
Bc                    ^ [        5       mS nUTR                  l        STR                  l        SSKJn  U" U4S jSS9nUR                  S5      nU R                  [        U5      S5        g	)
z'Test SSL buffer size related edge casesc                 B    U S:  a  [        S5      eS[        U S5      -  $ )N @  z"[SSL: BAD_LENGTH] buffer too large   Ar   )r   min)rb   s    r   rd   CSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.mock_recv  s'    CDD#gt,,,r   rf   r   )frame_bufferc                    > [        TU 5      $ )N)r   )sizer'   s    r   <lambda>BSSLEdgeCasesTest.test_ssl_buffer_size_edge_cases.<locals>.<lambda>  s    tIt'<r   T)skip_utf8_validationr   N)
r   r   r"   ri   r   websocket._abnfr   recv_strictassertGreaterru   )r   rd   r   fbrp   r'   s        @r   test_ssl_buffer_size_edge_cases0SSLEdgeCasesTest.test_ssl_buffer_size_edge_cases  sb    F		- &/	",0	)0 <SWX &3v;*r   c                 z   [        5       n[        S5       n[        5       nX2l        [        R                  " S5      UR
                  l        S[        R                  0nU R                  [        R                  5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)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_protection7SSLEdgeCasesTest.test_ssl_protocol_downgrade_protection  s    F	#$(86L,8)36<</4L$$0 $S%<%<=F ""3<<0I}= 1 %$ 10 %$r-   c                 |   [        5       n[        S5       n[        5       nX2l        [        R                  " S5      UR
                  l        [        R                  SS.nU R                  [        R                  5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z0Test SSL certificate chain validation edge casesr   z2certificate verify failed: certificate has expiredTr/   zexpired.badssl.comNr1   r&   s        r   %test_ssl_certificate_chain_validation6SSLEdgeCasesTest.test_ssl_certificate_chain_validation  s    F	#$(86L,8) 473O3OD4L$$0 $'#4#4MF""3#?#?@I/CD A %$ A@ %$r5   c                 ^   [        5       n[        S5       n[        5       nX2l        [        R                  " S5      UR
                  l        SS0nU R                  [        R                  5         [        XS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z(Test SSL weak cipher rejection scenariosr   zno shared cipherrH   zRC4-MD5r   N)	r   r   r   r#   r   r!   r"   r%   r   r&   s        r   test_ssl_weak_cipher_rejection/SSLEdgeCasesTest.test_ssl_weak_cipher_rejection+  s    F	#$(86L,8)36<<@R3SL$$0+F ""3<<0I}= 1 %$ 10 %$s$   AB/B<B
B	B
B,c           
         [        5       n/ SQnU GH
  u  p4U R                  X4S9   [        S5       n[        5       nXel        X4:w  az  SU;   at  [        R
                  " SU SU S35      UR                  l        [        R                  SS	.nU R                  [        R
                  5         [        XU5        S
S
S
5        OI[        5       UR                  l        [        R                  SS	.n[        XU5      nU R                  U5        S
S
S
5        S
S
S
5        GM     g
! , (       d  f       N$= f! , (       d  f       N-= f! , (       d  f       GMB  = f)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#   r2   r!   r"   r$   r%   r   r   )	r   r'   r   cert_hostnameconnect_hostnamer(   r)   r*   rp   s	            r   )test_ssl_hostname_verification_edge_cases:SSLEdgeCasesTest.test_ssl_hostname_verification_edge_cases:  s9   F	

 0:+M=L+,0@#'6L4@1 &9+/?? @C?[?[()9(::KM?Z[\@00<
 *-):):.2"
 "..s/K/KL'	;KL ML AE00=),):):.2" "-Y@P!Q,,V4; - ML 0:( ML% -, MLs<   EA:D2,D!	9AD2E!
D/+D22
E <E
E	c                 ~   [        5       n SSKn[        US5      (       ae  [        S5       n[        5       nXCl        [        5       UR
                  l        [        U0 S5        UR
                  R                  5         SSS5        gg! , (       d  f       g= f! [        [        4 a    U R                  S5         gf = f)zTest SSL memory BIO edge casesr   N	MemoryBIOr   r   zSSL MemoryBIO not available)r   r#   r   r   r   r!   r   r8   ImportErrorr   r   )r   r'   r#   r(   r)   s        r   test_ssl_memory_bio_edge_cases/SSLEdgeCasesTest.test_ssl_memory_bio_edge_casesf  s    F		9sK((+,0@#'6L4@1<@FL,,9  	2}= !,,??A -, ),, ^, 	9MM78	9s/    B AB=B 
BB B !B<;B< N)"__name__
__module____qualname____firstlineno__r   r+   r3   r:   rE   rK   rR   rY   rq   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  __static_attributes__r  r   r   r   r   %   s    />"A">$$L>$> > 1@3:*3.,6*F"T"R0I"! &)&)$,+.>"E$>*5X9r   r   __main__)unittestr   r#   unittest.mockr   r   r   websocket._ssl_compatr   r   r   r	   r
   websocket._httpr   r   r   r   websocket._socketr   r   TestCaser   r  mainr  r   r   <module>r     s[      
 0 0  : 4 (&U	9x(( U	9p zMMO r   