
    <fh2                         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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     N/var/www/zara/venv/lib/python3.12/site-packages/websocket/tests/test_socket.py	<genexpr>z8SocketTest.test_default_socket_option.<locals>.<genexpr>.   s$       
-0CFf((( 
s    "N)assertIsInstancer	   listassertGreaterlenany
assertTrue)selftcp_nodelay_founds     r   test_default_socket_optionz%SocketTest.test_default_socket_option(   sR    3T:345q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_normal3   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	%12H%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_timeoutG   s    F	nn%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_errori   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_responset   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.DefaultSelectorTd   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	"./ 		03F FM/<,15M  -)S)FV%89""002--/		0 		0 		0s   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 outg      ?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 FM/<,02M  -""#<= %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VZ0Y1115		6 	6 	6s   :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	)%01D%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&91%=	"./ 		03F FM/<,15M  -)\2FVQ'""002--/		0 		0 		0s   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 '3A%6	"./ 	(3F FM/<,15M  -)\2FVQ'	( 	( 	(   ;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   rs   rt   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	) #LL)@A"'"3"3"'"3"35L!M '8%;	"./ 	(3F FM/<,15M  -)\2FVQ'	( 	( 	(ry   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   rs   rt   
ECONNRESETr?   r   r2   r3   )r!   r,   other_errors      r   test_send_socket_other_errorz'SocketTest.test_send_socket_other_error  s    F	,0	) ll#=>!,,!,,.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   rs   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;   rq   rO   r&   r   Nrr   rv   s         r   test_send_write_timeoutz"SocketTest.test_send_write_timeout(  s    F	,0	) ||$FG"\\"\\+MN%1	"./ 	(3F FM/<,02M  -)\2F VQ'	( 	( 	(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&   Nrg   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;   rq   r'   rO   Tr&   N)r   r@   r(   r   rs   rt   ru   r?   r   r2   r   rQ   r)   rR   rS   rT   rv   s         r   test_send_partial_send_retryz'SocketTest.test_send_partial_send_retryI  s    F	,0	) ||$FG"\\"\\+MN '3A%6	"./ 	03F FM/<,15M  -)\2FVQ'""002  ..0--/	0 	0 	0s   ;BDDN)__name__
__module____qualname__r#   r.   r8   rD   rH   rK   rM   rX   rZ   re   ri   rk   rm   ro   rx   r}   r   r   r   r   r    r$   r   r   r   '   sp    	+2DD,
G	S0$%6	8	=	I0&(,(,**(,	80r$   r   __main__)rt   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 
&z0"" z0z	 zHMMO r$   