a
    ñ»j«2  ã                   @   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r–e ¡  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   úAE:\soccer\ml_env\Lib\site-packages\websocket/tests/test_socket.pyÚ	<genexpr>.   s   z8SocketTest.test_default_socket_option.<locals>.<genexpr>N)ZassertIsInstancer   ÚlistZassertGreaterÚlenÚanyZ
assertTrue)ÚselfZ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<0    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 sP0    Y  ddl
}|jdkr€|  t|jƒd¡ n|  t|jƒd¡ dS )	zTest recv with socket.timeoutúSocket timed out)r/   ç      >@r   Nr   )é   é
   r&   )r   r   ÚtimeoutÚargsr   r(   Ú
gettimeoutr   r)   r   ÚsysÚversion_infor    r*   r+   )r   r#   Ztimeout_excr-   r6   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 sF0    Y  |  t|j	ƒd¡ dS )z Test recv with SSL timeout errorúThe operation timed out)r9   r   N)
r   r	   r4   r   r(   r)   r   r    r*   r+   )r   r#   Ússl_excr-   r   r   r   Útest_recv_ssl_timeout]   s    (z SocketTest.test_recv_ssl_timeoutc                 C   sT   t ƒ }tdƒ}d|_||j_|  t¡� t|dƒ W d  ƒ n1 sF0    Y  dS )z$Test recv with SSL non-timeout errorúSSL certificate error)r<   r   N)r   r	   r4   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 s80    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+   r,   r   r   r   Útest_recv_empty_responset   s
    (z#SocketTest.test_recv_empty_responsec                 C   s€   t ƒ }tƒ dg|j_tdƒ�P}t ƒ }||_dg|j_t|dƒ}|  |d¡ |j 	¡  |j
 	¡  W d  ƒ n1 sr0    Y  dS )z.Test recv with SSLWantReadError (should retry)s   data after retryúselectors.DefaultSelectorTéd   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ƒ�X}t ƒ }||_g |j_|  t	¡� t|dƒ W d  ƒ n1 s`0    Y  W d  ƒ n1 s~0    Y  dS )z.Test recv with SSLWantReadError that times outg      ð?r@   rA   N)
r   r   r   r(   r5   r   r   rB   r)   r   )r   r#   rG   rH   r   r   r   Útest_recv_ssl_want_read_timeout�   s    

z*SocketTest.test_recv_ssl_want_read_timeoutc                 C   s`   t ƒ }g d¢}td|d��2}t|ƒ}|  |d¡ |  |jd¡ W d  ƒ n1 sR0    Y  dS )zTest recv_line functionality)ó   Hó   eó   lrM   ó   oó   
zwebsocket._socket.recv)r(   s   Hello
é   N)r   r   r   r    Z
call_count)r   r#   Z
recv_callsZ	mock_recvr$   r   r   r   Útest_recv_linež   s    zSocketTest.test_recv_linec                 C   s<   t ƒ }d|j_d|j_t|dƒ}|  |d¡ |j d¡ dS )zTest normal send operationr   r0   r   N©r   r   r   r5   r    Zassert_called_withr"   r   r   r   Útest_send_normal«   s    
zSocketTest.test_send_normalc                 C   s<   t ƒ }d|j_d|j_t|dƒ}|  |d¡ |j d¡ dS )z*Test send with zero timeout (non-blocking)r   r   r   N)r   r   r   r5   r    r!   r"   r   r   r   Útest_send_zero_timeout¶   s    
z!SocketTest.test_send_zero_timeoutc                 C   sd   t ƒ }d|j_tdƒ|j_|  t¡�}t|dƒ W d  ƒ n1 sD0    Y  |  t	|j
ƒd¡ dS )zTest send with SSLEOFErrorr0   zConnection closedr   Nzsocket is already closed.)r   r5   r   r
   r   r(   r)   r   r    r*   r+   r,   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ƒ�P}t ƒ }||_dg|j_t|dƒ}|  |d¡ |j	 
¡  |j 
¡  W d  ƒ n1 sz0    Y  dS )z/Test send with SSLWantWriteError (should retry)r0   r   r@   Tr   N)r   r5   r   r   r   r(   r   rB   r    rC   rD   rE   rF   r   r   r   Útest_send_ssl_want_write_errorÌ   s    



z)SocketTest.test_send_ssl_want_write_errorc                 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¡ W d  ƒ n1 s‚0    Y  dS )z*Test send with EAGAIN error (should retry)r0   ú Resource temporarily unavailabler   r@   Tr   N©r   r5   r   r   ÚerrorÚerrnoÚEAGAINr4   r   r(   r   rB   r    ©r   r#   Zeagain_errorrG   rH   r$   r   r   r   Útest_send_socket_eagain_errorß   s    



z(SocketTest.test_send_socket_eagain_errorc                 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¡ W d  ƒ n1 s‚0    Y  dS )z/Test send with EWOULDBLOCK error (should retry)r0   zOperation would blockr   r@   Tr   N)r   r5   r   r   rY   rZ   ÚEWOULDBLOCKr4   r   r(   r   rB   r    )r   r#   Zewouldblock_errorrG   rH   r$   r   r   r   Ú"test_send_socket_ewouldblock_errorõ   s    



z-SocketTest.test_send_socket_ewouldblock_errorc                 C   sn   t ƒ }d|j_t d¡}tj|_tjdf|_||j_	|  
tj¡� t|dƒ W d  ƒ n1 s`0    Y  dS )z0Test send with other socket error (should raise)r0   zConnection reset by peerr   N)r   r5   r   r   rY   rZ   Ú
ECONNRESETr4   r   r(   r)   )r   r#   Zother_errorr   r   r   Útest_send_socket_other_error  s    
z'SocketTest.test_send_socket_other_errorc                 C   s`   t ƒ }d|j_t d¡}d|_||j_|  tj¡� t|dƒ W d  ƒ n1 sR0    Y  dS )z-Test send with socket error that has no errnor0   úGeneric socket error)rb   r   N)	r   r5   r   r   rY   r4   r   r(   r)   )r   r#   Z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  ƒ n1 s|0    Y  dS )z!Test send write operation timeoutr0   rW   r@   r   r   NrX   r\   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   r0   z	test datar   NrR   r"   r   r   r   Útest_send_string_data>  s    
z SocketTest.test_send_string_datac                 C   s®   t ƒ }d|j_t d¡}tj|_tjdf|_|dg|j_	t
dƒ�Z}t ƒ }||_dg|j_t|dƒ}|  |d¡ |j ¡  |j ¡  |j ¡  W d  ƒ n1 s 0    Y  dS )zTest send retry mechanismr0   rW   r   r@   Tr   N)r   r5   r   r   rY   rZ   r[   r4   r   r(   r   rB   r    rC   rD   rE   r\   r   r   r   Útest_send_partial_send_retryI  s    





z'SocketTest.test_send_partial_send_retryN)Ú__name__Ú
__module__Ú__qualname__r   r%   r.   r8   r;   r=   r?   rI   rJ   rQ   rS   rT   rU   rV   r]   r_   ra   rc   rd   re   rf   r   r   r   r   r   '   s*   


r   Ú__main__)rZ   r   ZunittestZunittest.mockr   r   r   ÚtimeZwebsocket._socketr   r   r   r   Zwebsocket._ssl_compatr	   r
   r   r   Zwebsocket._exceptionsr   r   ZTestCaser   rg   Úmainr   r   r   r   Ú<module>   s     ?