Ë
    Bü´j²6  ã                   óÒ   — 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m	Z	m
Z
mZmZ d dlmZmZmZmZ d dlmZmZ 	  G d„ dej*                  «      Zedk(  r ej0                  «        yy)	é    N)ÚMockÚpatchÚ	MagicMock)ÚrecvÚ	recv_lineÚsendÚDEFAULT_SOCKET_OPTION)ÚSSLErrorÚSSLEOFErrorÚSSLWantWriteErrorÚSSLWantReadError)ÚWebSocketTimeoutExceptionÚ"WebSocketConnectionClosedExceptionc                   ó–   — 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y)Ú
SocketTestc                 óÄ   — | j                  t        t        «       | j                  t	        t        «      d«       t        d„ t        D «       «      }| j                  |«       y)z4Test DEFAULT_SOCKET_OPTION contains expected optionsr   c              3   óH   K  — | ]  }|d    t         j                  k(  –— Œ y­w)é   N)ÚsocketÚTCP_NODELAY)Ú.0Úopts     úY/root/workspace/ytshorts/venv/lib/python3.12/site-packages/websocket/tests/test_socket.pyú	<genexpr>z8SocketTest.test_default_socket_option.<locals>.<genexpr>/   s$   è ø€ ò  
Ø-0ˆC�‰F”f×(Ñ(Õ(ñ 
ùs   ‚ "N)ÚassertIsInstancer	   ÚlistÚassertGreaterÚlenÚanyÚ
assertTrue)ÚselfÚtcp_nodelay_founds     r   Útest_default_socket_optionz%SocketTest.test_default_socket_option)   sR   € à×ÑÔ3´TÔ:Ø×Ñœ3Ô4Ó5°qÔ9ô  ñ  
Ü4Iô 
ó 
Ðð 	�‰Ð)Õ*ó    c                 ó¬   — t        «       }d|j                  _        t        |d«      }| j                  |d«       |j                  j	                  d«       y)zTest normal recv operationó	   test dataé	   N)r   r   Úreturn_valueÚassertEqualÚassert_called_once_with©r!   Ú	mock_sockÚresults      r   Útest_recv_normalzSocketTest.test_recv_normal4   sC   € ä“Fˆ	Ø&2ˆ	�‰Ô#ä�i Ó#ˆà×Ñ˜ Ô.Ø�‰×.Ñ.¨qÕ1r$   c                 ó  — t        «       }t        d«      |j                  _        | j	                  t
        «      5 }t        |d«       ddd«       | j                  t        j                  «      d«       y# 1 sw Y   Œ/xY w)zTest recv with TimeoutErrorúConnection timed outr'   N)	r   ÚTimeoutErrorr   Úside_effectÚassertRaisesr   r)   ÚstrÚ	exception©r!   r,   Úcms      r   Útest_recv_timeout_errorz"SocketTest.test_recv_timeout_error>   sg   € ä“Fˆ	Ü%1Ð2HÓ%Iˆ	�‰Ô"à×ÑÔ8Ó9ð 	¸RÜ�˜AÔ÷	ð 	×Ñœ˜RŸ\™\Ó*Ð,BÕC÷	ð 	ús   ºA5Á5A>c                 ó¼  — t        «       }t        j                  d«      }d|_        ||j                  _        d|j                  _        | j                  t        «      5 }t	        |d«       ddd«       ddl
}|j                  dk\  r&| j                  t        j                  «      d«       y| j                  t        j                  «      d«       y# 1 sw Y   ŒhxY w)	zTest recv with socket.timeoutúSocket timed out)r:   ç      >@r'   Nr   )é   é
   r0   )r   r   ÚtimeoutÚargsr   r2   Ú
gettimeoutr(   r3   r   ÚsysÚversion_infor)   r4   r5   )r!   r,   Útimeout_excr7   rA   s        r   Útest_recv_socket_timeoutz#SocketTest.test_recv_socket_timeoutH   s±   € ä“Fˆ	Ü—n‘nÐ%7Ó8ˆØ0ˆÔØ%0ˆ	�‰Ô"Ø,0ˆ	×ÑÔ)à×ÑÔ8Ó9ð 	¸RÜ�˜AÔ÷	ó 	à×Ñ˜wÒ&Ø×ÑœS §¡Ó.Ð0FÕGà×ÑœS §¡Ó.Ð0BÕC÷	ð 	ús   ÁCÃCc                 ó  — t        «       }t        d«      }d|_        ||j                  _        | j                  t        «      5 }t        |d«       ddd«       | j                  t        j                  «      d«       y# 1 sw Y   Œ/xY w)z Test recv with SSL timeout errorúThe operation timed out)rF   r'   N)
r   r
   r?   r   r2   r3   r   r)   r4   r5   )r!   r,   Ússl_excr7   s       r   Útest_recv_ssl_timeoutz SocketTest.test_recv_ssl_timeout^   ss   € ä“Fˆ	ÜÐ4Ó5ˆØ3ˆŒØ%,ˆ	�‰Ô"à×ÑÔ8Ó9ð 	¸RÜ�˜AÔ÷	ð 	×Ñœ˜RŸ\™\Ó*Ð,EÕF÷	ð 	ús   ÁA>Á>Bc                 óÊ   — t        «       }t        d«      }d|_        ||j                  _        | j                  t        «      5  t        |d«       ddd«       y# 1 sw Y   yxY w)z$Test recv with SSL non-timeout errorúSSL certificate error)rJ   r'   N)r   r
   r?   r   r2   r3   )r!   r,   rG   s      r   Útest_recv_ssl_non_timeout_errorz*SocketTest.test_recv_ssl_non_timeout_errorj   sV   € ä“Fˆ	ÜÐ2Ó3ˆØ1ˆŒØ%,ˆ	�‰Ô"ð ×ÑœxÓ(ñ 	Ü�˜AÔ÷	÷ 	ñ 	ús   ÁAÁA"c                 óð   — t        «       }d|j                  _        | j                  t        «      5 }t        |d«       ddd«       | j                  t        j                  «      d«       y# 1 sw Y   Œ/xY w)z1Test recv with empty response (connection closed)r$   r'   Nz#Connection to remote host was lost.)r   r   r(   r3   r   r)   r4   r5   r6   s      r   Útest_recv_empty_responsez#SocketTest.test_recv_empty_responseu   sa   € ä“Fˆ	Ø&)ˆ	�‰Ô#à×ÑÔAÓBð 	ÀbÜ�˜AÔ÷	ð 	×Ñœ˜RŸ\™\Ó*Ð,QÕR÷	ð 	ús   ±A,Á,A5c                 óx  — t        «       }t        «       dg|j                  _        t	        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       |j                  j                  «        |j                  j                  «        ddd«       y# 1 sw Y   yxY w)z.Test recv with SSLWantReadError (should retry)s   data after retryúselectors.DefaultSelectorTéd   N)r   r   r   r2   r   r(   Úselectr)   ÚregisterÚassert_calledÚclose©r!   r,   Úmock_selector_classÚmock_selectorr-   s        r   Útest_recv_ssl_want_read_errorz(SocketTest.test_recv_ssl_want_read_error   s¢   € ä“Fˆ	ô '7Ó&8Ð:MÐ%Nˆ	�‰Ô"äÐ.Ó/ð 		0Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) SÓ)ˆFà×Ñ˜VÐ%8Ô9Ø×"Ñ"×0Ñ0Ô2Ø×Ñ×-Ñ-Ô/÷		0÷ 		0ñ 		0ús   ±A6B0Â0B9c                 ó\  — t        «       }t        «       |j                  _        d|j                  _        t        d«      5 }t        «       }||_        g |j                  _        | j                  t        «      5  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.Test recv with SSLWantReadError that times outç      ð?rO   rP   N)
r   r   r   r2   r@   r(   r   rQ   r3   r   )r!   r,   rV   rW   s       r   Útest_recv_ssl_want_read_timeoutz*SocketTest.test_recv_ssl_want_read_timeout‘   s˜   € ä“Fˆ	Ü%5Ó%7ˆ	�‰Ô"Ø,/ˆ	×ÑÔ)äÐ.Ó/ð 	%Ð3FÜ ›FˆMØ/<ÐÔ,Ø02ˆM× Ñ Ô-à×"Ñ"Ô#<Ó=ñ %Ü�Y Ô$÷%÷	%ð 	%÷
%ð %ú÷	%ð 	%ús$   Á 8B"Á8BÂB"ÂB	ÂB"Â"B+c                 óÖ   — t        «       }g d¢}t        d|¬«      5 }t        |«      }| j                  |d«       | j                  |j                  d«       ddd«       y# 1 sw Y   yxY w)zTest recv_line functionality)ó   Hó   eó   lr_   ó   oó   
zwebsocket._socket.recv)r2   s   Hello
é   N)r   r   r   r)   Ú
call_count)r!   r,   Ú
recv_callsÚ	mock_recvr-   s        r   Útest_recv_linezSocketTest.test_recv_lineŸ   sb   € ä“Fˆ	ò ;ˆ
äÐ+¸ÔDð 	6È	Ü˜yÓ)ˆFà×Ñ˜V ZÔ0Ø×Ñ˜Y×1Ñ1°1Ô5÷		6÷ 	6ñ 	6ús   œ:AÁA(c                 óÎ   — t        «       }d|j                  _        d|j                  _        t        |d«      }| j	                  |d«       |j                  j                  d«       y)zTest normal send operationr'   r;   r&   N©r   r   r(   r@   r)   Úassert_called_withr+   s      r   Útest_send_normalzSocketTest.test_send_normal¬   sQ   € ä“Fˆ	Ø&'ˆ	�‰Ô#Ø,0ˆ	×ÑÔ)ä�i Ó.ˆà×Ñ˜ Ô#Ø�‰×)Ñ)¨,Õ7r$   c                 óÎ   — t        «       }d|j                  _        d|j                  _        t        |d«      }| j	                  |d«       |j                  j                  d«       y)z*Test send with zero timeout (non-blocking)r'   r   r&   N)r   r   r(   r@   r)   r*   r+   s      r   Útest_send_zero_timeoutz!SocketTest.test_send_zero_timeout·   sQ   € ä“Fˆ	Ø&'ˆ	�‰Ô#Ø,-ˆ	×ÑÔ)ä�i Ó.ˆà×Ñ˜ Ô#Ø�‰×.Ñ.¨|Õ<r$   c                 ó$  — t        «       }d|j                  _        t        d«      |j                  _        | j                  t        «      5 }t	        |d«       ddd«       | j                  t        j                  «      d«       y# 1 sw Y   Œ/xY w)zTest send with SSLEOFErrorr;   zConnection closedr&   Nzsocket is already closed.)r   r@   r(   r   r   r2   r3   r   r)   r4   r5   r6   s      r   Útest_send_ssl_eof_errorz"SocketTest.test_send_ssl_eof_errorÂ   su   € ä“Fˆ	Ø,0ˆ	×ÑÔ)Ü%0Ð1DÓ%Eˆ	�‰Ô"à×ÑÔAÓBð 	*ÀbÜ�˜LÔ)÷	*ð 	×Ñœ˜RŸ\™\Ó*Ð,GÕH÷	*ð 	*ús   ÁBÂBc                 óš  — t        «       }d|j                  _        t        «       dg|j                  _        t        d«      5 }t        «       }||_        dg|j                  _        t	        |d«      }| j                  |d«       |j                  j                  «        |j                  j                  «        ddd«       y# 1 sw Y   yxY w)z/Test send with SSLWantWriteError (should retry)r;   r'   rO   Tr&   N)r   r@   r(   r   r   r2   r   rQ   r)   rR   rS   rT   rU   s        r   Útest_send_ssl_want_write_errorz)SocketTest.test_send_ssl_want_write_errorÍ   s®   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô '8Ó&9¸1Ð%=ˆ	�‰Ô"äÐ.Ó/ð 		0Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) \Ó2ˆFà×Ñ˜V QÔ'Ø×"Ñ"×0Ñ0Ô2Ø×Ñ×-Ñ-Ô/÷		0÷ 		0ñ 		0ús   ÁA6CÃC
c                 ó¤  — t        «       }d|j                  _        t        j                  d«      }t
        j                  |_        t
        j                  df|_        |dg|j                  _	        t        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       ddd«       y# 1 sw Y   yxY w)z*Test send with EAGAIN error (should retry)r;   ú Resource temporarily unavailabler'   rO   Tr&   N©r   r@   r(   r   ÚerrorÚerrnoÚEAGAINr?   r   r2   r   rQ   r)   ©r!   r,   Úeagain_errorrV   rW   r-   s         r   Útest_send_socket_eagain_errorz(SocketTest.test_send_socket_eagain_errorà   s¶   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô —|‘|Ð$FÓGˆÜ"Ÿ\™\ˆÔÜ"Ÿ\™\Ð+MÐNˆÔð '3°AÐ%6ˆ	�‰Ô"äÐ.Ó/ð 	(Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) \Ó2ˆFà×Ñ˜V QÔ'÷	(÷ 	(ñ 	(úó   Á;ACÃCc                 ó¤  — t        «       }d|j                  _        t        j                  d«      }t
        j                  |_        t
        j                  df|_        |dg|j                  _	        t        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       ddd«       y# 1 sw Y   yxY w)z/Test send with EWOULDBLOCK error (should retry)r;   zOperation would blockr'   rO   Tr&   N)r   r@   r(   r   rt   ru   ÚEWOULDBLOCKr?   r   r2   r   rQ   r)   )r!   r,   Úewouldblock_errorrV   rW   r-   s         r   Ú"test_send_socket_ewouldblock_errorz-SocketTest.test_send_socket_ewouldblock_errorö   s½   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô #ŸL™LÐ)@ÓAÐÜ"'×"3Ñ"3ÐÔÜ"'×"3Ñ"3Ð5LÐ!MÐÔð '8¸Ð%;ˆ	�‰Ô"äÐ.Ó/ð 	(Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) \Ó2ˆFà×Ñ˜V QÔ'÷	(÷ 	(ñ 	(úrz   c                 ó^  — t        «       }d|j                  _        t        j                  d«      }t
        j                  |_        t
        j                  df|_        ||j                  _	        | j                  t        j                  «      5  t        |d«       ddd«       y# 1 sw Y   yxY w)z0Test send with other socket error (should raise)r;   zConnection reset by peerr&   N)r   r@   r(   r   rt   ru   Ú
ECONNRESETr?   r   r2   r3   )r!   r,   Úother_errors      r   Útest_send_socket_other_errorz'SocketTest.test_send_socket_other_error  s‡   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô —l‘lÐ#=Ó>ˆÜ!×,Ñ,ˆÔÜ!×,Ñ,Ð.HÐIˆÔà%0ˆ	�‰Ô"à×ÑœvŸ|™|Ó,ñ 	*Ü�˜LÔ)÷	*÷ 	*ñ 	*ús   ÂB#Â#B,c                 ó  — t        «       }d|j                  _        t        j                  d«      }d|_        ||j                  _        | j                  t        j                  «      5  t        |d«       ddd«       y# 1 sw Y   yxY w)z-Test send with socket error that has no errnor;   úGeneric socket error)r„   r&   N)	r   r@   r(   r   rt   r?   r   r2   r3   )r!   r,   Úno_errno_errors      r   Útest_send_socket_error_no_errnoz*SocketTest.test_send_socket_error_no_errno  sm   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô  Ÿ™Ð&<Ó=ˆØ7ˆÔà%3ˆ	�‰Ô"à×ÑœvŸ|™|Ó,ñ 	*Ü�˜LÔ)÷	*÷ 	*ñ 	*ús   Á(A>Á>Bc                 óž  — t        «       }d|j                  _        t        j                  d«      }t
        j                  |_        t
        j                  df|_        ||j                  _	        t        d«      5 }t        «       }||_        g |j                  _        t        |d«      }| j                  |d«       ddd«       y# 1 sw Y   yxY w)z!Test send write operation timeoutr;   rr   rO   r&   r   Nrs   rw   s         r   Útest_send_write_timeoutz"SocketTest.test_send_write_timeout)  s¯   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô —|‘|Ð$FÓGˆÜ"Ÿ\™\ˆÔÜ"Ÿ\™\Ð+MÐNˆÔà%1ˆ	�‰Ô"äÐ.Ó/ð 	(Ð3FÜ ›FˆMØ/<ÐÔ,Ø02ˆM× Ñ Ô-ä˜) \Ó2ˆFð ×Ñ˜V QÔ'÷	(÷ 	(ñ 	(ús   Á9ACÃCc                 óÎ   — t        «       }d|j                  _        d|j                  _        t        |d«      }| j	                  |d«       |j                  j                  d«       y)z.Test send with string data (should be encoded)r'   r;   z	test datar&   Nrh   r+   s      r   Útest_send_string_dataz SocketTest.test_send_string_data?  sQ   € ä“Fˆ	Ø&'ˆ	�‰Ô#Ø,0ˆ	×ÑÔ)ä�i Ó-ˆà×Ñ˜ Ô#Ø�‰×)Ñ)¨,Õ7r$   c                 ó@  — t        «       }d|j                  _        t        j                  d«      }t
        j                  |_        t
        j                  df|_        |dg|j                  _	        t        d«      5 }t        «       }||_        dg|j                  _        t        |d«      }| j                  |d«       |j                  j                  «        |j                  j                  «        |j                  j                  «        ddd«       y# 1 sw Y   yxY w)zTest send retry mechanismr;   rr   r'   rO   Tr&   N)r   r@   r(   r   rt   ru   rv   r?   r   r2   r   rQ   r)   rR   rS   rT   rw   s         r   Útest_send_partial_send_retryz'SocketTest.test_send_partial_send_retryJ  sì   € ä“Fˆ	Ø,0ˆ	×ÑÔ)ô —|‘|Ð$FÓGˆÜ"Ÿ\™\ˆÔÜ"Ÿ\™\Ð+MÐNˆÔð '3°AÐ%6ˆ	�‰Ô"äÐ.Ó/ð 	0Ð3FÜ ›FˆMØ/<ÐÔ,Ø15°ˆM× Ñ Ô-ä˜) \Ó2ˆFà×Ñ˜V QÔ'à×"Ñ"×0Ñ0Ô2Ø× Ñ ×.Ñ.Ô0Ø×Ñ×-Ñ-Ô/÷	0÷ 	0ñ 	0ús   Á;BDÄDc                 óZ  — t        «       }t        t        j                  d«      |j                  _        d|j                  _         G d„ d«      }t        d |«       ¬«      5  | j                  t        «      5  t	        |d«       d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY w)Nzwould blockrZ   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úJSocketTest.test_recv_selector_timeout_on_would_block.<locals>.FakeSelectorc                  ó   — y ©N© )r!   r?   Úkwargss      r   rR   zSSocketTest.test_recv_selector_timeout_on_would_block.<locals>.FakeSelector.registerj  ó   € Ør$   c                 ó   — g S r‘   r’   )r!   r>   s     r   rQ   zQSocketTest.test_recv_selector_timeout_on_would_block.<locals>.FakeSelector.selectm  s   € Ø�	r$   c                  ó   — y r‘   r’   )r!   s    r   rT   zPSocketTest.test_recv_selector_timeout_on_would_block.<locals>.FakeSelector.closep  r”   r$   N)Ú__name__Ú
__module__Ú__qualname__rR   rQ   rT   r’   r$   r   ÚFakeSelectorr�   i  s   „ òòór$   rš   rO   )r(   r=   )r   ÚOSErrorru   r|   r   r2   r@   r(   r   r3   r   )r!   r,   rš   s      r   Ú)test_recv_selector_timeout_on_would_blockz4SocketTest.test_recv_selector_timeout_on_would_blockd  s‘   € Ü“Fˆ	Ü%,¬U×->Ñ->ÀÓ%Nˆ	�‰Ô"Ø,/ˆ	×ÑÔ)÷	ñ 	ô Ð.¹\»^ÔLñ 	$Ø×"Ñ"Ô#<Ó=ñ $Ü�Y Ô#÷$÷	$ð 	$÷$ð $ú÷	$ð 	$ús$   Á!B!Á7BÂB!ÂB	ÂB!Â!B*c                 óJ  — t        «       }t        j                  d«      }d|_        ||j                  _        d|j                  _        | j                  t        «      5 }t	        |d«       d d d «       | j                  dt        j                  «      «       y # 1 sw Y   Œ/xY w)Nú	timed out)rž   g      @s   payload)r   r   r>   r?   r   r2   r@   r(   r3   r   ÚassertInr4   r5   )r!   r,   rC   r7   s       r   Útest_send_socket_timeout_errorz)SocketTest.test_send_socket_timeout_errorw  s‚   € Ü“Fˆ	Ü—n‘n [Ó1ˆØ)ˆÔØ%0ˆ	�‰Ô"Ø,/ˆ	×ÑÔ)à×ÑÔ8Ó9ð 	(¸RÜ�˜JÔ'÷	(ð 	�‰�k¤3 r§|¡|Ó#4Õ5÷	(ð 	(ús   ÁBÂB"N)r—   r˜   r™   r#   r.   r8   rD   rH   rK   rM   rX   r[   rf   rj   rl   rn   rp   ry   r~   r‚   r†   rˆ   rŠ   rŒ   rœ   r    r’   r$   r   r   r   (   sz   „ ò	+ò2òDòDò,
Gò	òSò0ò$%ò6ò	8ò	=ò	Iò0ò&(ò,(ò,*ò*ò(ò,	8ò0ò4$ó&
6r$   r   Ú__main__)ru   r   ÚunittestÚunittest.mockr   r   r   ÚtimeÚwebsocket._socketr   r   r   r	   Úwebsocket._ssl_compatr
   r   r   r   Úwebsocket._exceptionsr   r   ÚTestCaser   r—   Úmainr’   r$   r   ú<module>rª      s`   ðã Û Û ß 0Ñ 0Û ç JÓ J÷ó ÷ð
ô(Y6�×"Ñ"ô Y6ðx
 ˆzÒØ€H‡M�M…Oð r$   