o
    M,h2                     @   s   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 dejZedkrNe  dS dS )	    N)Mockpatch	MagicMock)recv	recv_linesendDEFAULT_SOCKET_OPTION)SSLErrorSSLEOFErrorSSLWantWriteErrorSSLWantReadError)WebSocketTimeoutException"WebSocketConnectionClosedExceptionc                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+S ),
SocketTestc                 C   s<   |  tt | ttd tdd tD }| | dS )z4Test DEFAULT_SOCKET_OPTION contains expected optionsr   c                 s   s    | ]
}|d  t jkV  qdS )   N)socketTCP_NODELAY).0opt r   g/var/www/www-root/data/www/bot.pdev.uz/venv/lib/python3.10/site-packages/websocket/tests/test_socket.py	<genexpr>.   s    
z8SocketTest.test_default_socket_option.<locals>.<genexpr>N)assertIsInstancer   listassertGreaterlenany
assertTrue)selftcp_nodelay_foundr   r   r   test_default_socket_option(   s   z%SocketTest.test_default_socket_optionc                 C   s4   t  }d|j_t|d}| |d |jd dS )zTest normal recv operation	   test data	   N)r   r   return_valueassertEqualassert_called_once_withr   	mock_sockresultr   r   r   test_recv_normal3   s
   
zSocketTest.test_recv_normalc                 C   s\   t  }td|j_| t}t|d W d   n1 sw   Y  | t|jd dS )zTest recv with TimeoutErrorConnection timed outr"   N)	r   TimeoutErrorr   side_effectassertRaisesr   r$   str	exceptionr   r'   cmr   r   r   test_recv_timeout_error=   s   z"SocketTest.test_recv_timeout_errorc                 C   s   t  }td}d|_||j_d|j_| t	}t|d W d   n1 s(w   Y  ddl
}|jdkrA| t|jd dS | t|jd dS )	zTest recv with socket.timeoutSocket timed out)r3         >@r"   Nr   )   
   r*   )r   r   timeoutargsr   r,   
gettimeoutr#   r-   r   sysversion_infor$   r.   r/   )r   r'   timeout_excr1   r:   r   r   r   test_recv_socket_timeoutG   s   

z#SocketTest.test_recv_socket_timeoutc                 C   sf   t  }td}d|_||j_| t}t|d W d   n1 s#w   Y  | t|j	d dS )z Test recv with SSL timeout errorThe operation timed out)r>   r"   N)
r   r	   r8   r   r,   r-   r   r$   r.   r/   )r   r'   ssl_excr1   r   r   r   test_recv_ssl_timeout]   s   z SocketTest.test_recv_ssl_timeoutc                 C   sV   t  }td}d|_||j_| t t|d W d   dS 1 s$w   Y  dS )z$Test recv with SSL non-timeout errorSSL certificate error)rA   r"   N)r   r	   r8   r   r,   r-   )r   r'   r?   r   r   r   test_recv_ssl_non_timeout_errori   s   "z*SocketTest.test_recv_ssl_non_timeout_errorc                 C   sX   t  }d|j_| t}t|d W d   n1 sw   Y  | t|jd dS )z1Test recv with empty response (connection closed)    r"   Nz#Connection to remote host was lost.)r   r   r#   r-   r   r$   r.   r/   r0   r   r   r   test_recv_empty_responset   s   z#SocketTest.test_recv_empty_responsec                 C   s   t  }t dg|j_td)}t  }||_dg|j_t|d}| |d |j	  |j
	  W d   dS 1 s:w   Y  dS )z.Test recv with SSLWantReadError (should retry)s   data after retryselectors.DefaultSelectorTd   N)r   r   r   r,   r   r#   selectr$   registerassert_calledcloser   r'   mock_selector_classmock_selectorr(   r   r   r   test_recv_ssl_want_read_error~   s   



"z(SocketTest.test_recv_ssl_want_read_errorc              	   C   s   t  }t |j_d|j_td5}t  }||_g |j_| t	 t|d W d   n1 s0w   Y  W d   dS W d   dS 1 sHw   Y  dS )z.Test recv with SSLWantReadError that times outg      ?rE   rF   N)
r   r   r   r,   r9   r#   r   rG   r-   r   )r   r'   rL   rM   r   r   r   test_recv_ssl_want_read_timeout   s   

"z*SocketTest.test_recv_ssl_want_read_timeoutc                 C   sb   t  }g d}td|d}t|}| |d | |jd W d   dS 1 s*w   Y  dS )zTest recv_line functionality)   H   e   lrR      o   
zwebsocket._socket.recv)r,   s   Hello
   N)r   r   r   r$   
call_count)r   r'   
recv_calls	mock_recvr(   r   r   r   test_recv_line   s   "zSocketTest.test_recv_linec                 C   <   t  }d|j_d|j_t|d}| |d |jd dS )zTest normal send operationr"   r4   r!   Nr   r   r#   r9   r$   assert_called_withr&   r   r   r   test_send_normal      
zSocketTest.test_send_normalc                 C   rZ   )z*Test send with zero timeout (non-blocking)r"   r   r!   N)r   r   r#   r9   r$   r%   r&   r   r   r   test_send_zero_timeout   r^   z!SocketTest.test_send_zero_timeoutc                 C   sd   t  }d|j_td|j_| t}t|d W d   n1 s"w   Y  | t	|j
d dS )zTest send with SSLEOFErrorr4   zConnection closedr!   Nzsocket is already closed.)r   r9   r#   r
   r   r,   r-   r   r$   r.   r/   r0   r   r   r   test_send_ssl_eof_error   s   z"SocketTest.test_send_ssl_eof_errorc                 C   s   t  }d|j_t dg|j_td)}t  }||_dg|j_t|d}| |d |j	
  |j
  W d   dS 1 s>w   Y  dS )z/Test send with SSLWantWriteError (should retry)r4   r"   rE   Tr!   N)r   r9   r#   r   r   r,   r   rG   r$   rH   rI   rJ   rK   r   r   r   test_send_ssl_want_write_error   s   



"z)SocketTest.test_send_ssl_want_write_errorc                 C      t  }d|j_td}tj|_tjdf|_|dg|j_	t
d}t  }||_dg|j_t|d}| |d W d   dS 1 sBw   Y  dS )z*Test send with EAGAIN error (should retry)r4    Resource temporarily unavailabler"   rE   Tr!   Nr   r9   r#   r   errorerrnoEAGAINr8   r   r,   r   rG   r$   r   r'   eagain_errorrL   rM   r(   r   r   r   test_send_socket_eagain_error      



"z(SocketTest.test_send_socket_eagain_errorc                 C   rb   )z/Test send with EWOULDBLOCK error (should retry)r4   zOperation would blockr"   rE   Tr!   N)r   r9   r#   r   re   rf   EWOULDBLOCKr8   r   r,   r   rG   r$   )r   r'   ewouldblock_errorrL   rM   r(   r   r   r   "test_send_socket_ewouldblock_error   rk   z-SocketTest.test_send_socket_ewouldblock_errorc                 C   sp   t  }d|j_td}tj|_tjdf|_||j_	| 
tj t|d W d   dS 1 s1w   Y  dS )z0Test send with other socket error (should raise)r4   zConnection reset by peerr!   N)r   r9   r#   r   re   rf   
ECONNRESETr8   r   r,   r-   )r   r'   other_errorr   r   r   test_send_socket_other_error  s   
"z'SocketTest.test_send_socket_other_errorc                 C   sb   t  }d|j_td}d|_||j_| tj t|d W d   dS 1 s*w   Y  dS )z-Test send with socket error that has no errnor4   Generic socket error)rr   r!   N)	r   r9   r#   r   re   r8   r   r,   r-   )r   r'   no_errno_errorr   r   r   test_send_socket_error_no_errno  s   
"z*SocketTest.test_send_socket_error_no_errnoc                 C   s   t  }d|j_td}tj|_tjdf|_||j_	t
d}t  }||_g |j_t|d}| |d W d   dS 1 s?w   Y  dS )z!Test send write operation timeoutr4   rc   rE   r!   r   Nrd   rh   r   r   r   test_send_write_timeout(  s   


"z"SocketTest.test_send_write_timeoutc                 C   s<   t  }d|j_d|j_t|d}| |d |jd dS )z.Test send with string data (should be encoded)r"   r4   z	test datar!   Nr[   r&   r   r   r   test_send_string_data>  r^   z SocketTest.test_send_string_datac                 C   s   t  }d|j_td}tj|_tjdf|_|dg|j_	t
d.}t  }||_dg|j_t|d}| |d |j  |j  |j  W d   dS 1 sQw   Y  dS )zTest send retry mechanismr4   rc   r"   rE   Tr!   N)r   r9   r#   r   re   rf   rg   r8   r   r,   r   rG   r$   rH   rI   rJ   rh   r   r   r   test_send_partial_send_retryI  s    





"z'SocketTest.test_send_partial_send_retryN)__name__
__module____qualname__r    r)   r2   r=   r@   rB   rD   rN   rO   rY   r]   r_   r`   ra   rj   rn   rq   rt   ru   rv   rw   r   r   r   r   r   '   s,    


r   __main__)rf   r   unittestunittest.mockr   r   r   timewebsocket._socketr   r   r   r   websocket._ssl_compatr	   r
   r   r   websocket._exceptionsr   r   TestCaser   rx   mainr   r   r   r   <module>   s     ?