Ë
    ^Qêj:  ã                   ó´   — d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZ  G d„ de j                  «      Zedk(  r e j"                  «        yy)	é    N)ÚMockÚpatch)Ú	WebSocketÚWebSocketApp)r   )Ú"WebSocketConnectionClosedExceptionc                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚReconnectBadFileDescriptorTestzOTest edge cases around reconnection when socket file descriptors become invalidc                 ó  — t        «       }t        «       }d|_        ||_        d|_        t        d«      |j                  _        |j                  «        | j                  |j                  «       | j                  |j                  «       y)zLTest that shutdown() handles already closed sockets gracefully (issue #1026)FTzBad file descriptorN)ÚCoreWebSocketr   Ú_closedÚsockÚ	connectedÚOSErrorÚcloseÚside_effectÚshutdownÚassertIsNoneÚassertFalse©ÚselfÚwsÚ	mock_socks      új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/websocket/tests/test_reconnect_bad_fd.pyÚ(test_shutdown_with_already_closed_socketzGReconnectBadFileDescriptorTest.test_shutdown_with_already_closed_socket   sm   € ä‹_ˆô “Fˆ	Ø!ˆ	ÔØˆŒØˆŒô '.Ð.CÓ&Dˆ	�‰Ô#ð 	�‰Œð 	×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Õ&ó    c                 ó  — t        «       }t        «       }d|_        ||_        d|_        |j                  «        |j                  j                  «        | j                  |j                  «       | j                  |j                  «       y)z7Test shutdown() when socket's _closed attribute is TrueTN)
r   r   r   r   r   r   r   Úassert_not_calledr   r   r   s      r   Ú*test_shutdown_with_closed_socket_attributezIReconnectBadFileDescriptorTest.test_shutdown_with_closed_socket_attribute$   si   € ä‹_ˆô “Fˆ	Ø ˆ	ÔØˆŒØˆŒð 	�‰Œð 	�‰×)Ñ)Ô+Ø×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Õ&r   c                 óØ   — t        «       }t        «       }|`||_        d|_        |j                  «        | j                  |j                  «       | j                  |j                  «       y)z:Test shutdown() when socket doesn't have _closed attributeTN)r   r   r   r   r   r   r   r   r   s      r   Ú+test_shutdown_with_missing_closed_attributezJReconnectBadFileDescriptorTest.test_shutdown_with_missing_closed_attribute6   sW   € ä‹_ˆô “Fˆ	ØÐØˆŒØˆŒð 	�‰Œð 	×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Õ&r   c                 óÀ   — t        «       }d|_        d|_        |j                  «        | j	                  |j                  «       | j                  |j                  «       y)z#Test shutdown() when socket is NoneNF)r   r   r   r   r   r   )r   r   s     r   Útest_shutdown_with_none_socketz=ReconnectBadFileDescriptorTest.test_shutdown_with_none_socketG   sF   € ä‹_ˆØˆŒØˆŒð 	�‰Œà×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Õ&r   c                 ó  ‡	‡
‡— g Šg Š
dŠ	ˆ
fd„}ˆfd„}ˆ	fd„}t        d|||¬«      }t        d«      5 }t        d«      5 }d	|_        t        d
«      |_        t        «       }t        «       }d|_        t        d«      |j                  _        ||_
        d|_        |j                  «        | j                  |j                  «       | j                  |j                  «       d	d	d	«       d	d	d	«       y	# 1 sw Y   ŒxY w# 1 sw Y   y	xY w)zKTest WebSocketApp reconnection when socket becomes invalid during reconnectr   c                 ó:   •— ‰j                  t        |«      «       y )N)ÚappendÚstr)r   ÚerrorÚerror_messagess     €r   Úon_errorzcReconnectBadFileDescriptorTest.test_websocketapp_reconnect_with_bad_fd_simulation.<locals>.on_errorZ   s   ø€ Ø×!Ñ!¤# e£*Õ-r   c                 ó(   •— ‰j                  d«       y )NT)r%   )r   Úreconnect_attemptss    €r   Úon_reconnectzgReconnectBadFileDescriptorTest.test_websocketapp_reconnect_with_bad_fd_simulation.<locals>.on_reconnect]   s   ø€ Ø×%Ñ% dÕ+r   c                 ó   •— ‰dz  Šy )Né   © )r   Úconnection_counts    €r   Úon_openzbReconnectBadFileDescriptorTest.test_websocketapp_reconnect_with_bad_fd_simulation.<locals>.on_open`   s   ø€ à Ñ!Ñr   zws://echo.websocket.events/)r)   r,   r1   z!websocket._core.WebSocket.connectz)websocket._core.WebSocket.recv_data_frameNzConnection lostFz[Errno 9] Bad file descriptorT)r   r   Úreturn_valuer   r   r   r   r   r   r   r   r   r   r   r   )r   r)   r,   r1   ÚappÚmock_connectÚ	mock_recvÚreal_wsÚmock_socketr0   r(   r+   s            @@@r   Ú2test_websocketapp_reconnect_with_bad_fd_simulationzQReconnectBadFileDescriptorTest.test_websocketapp_reconnect_with_bad_fd_simulationS   s  ú€ ð  ÐØˆØÐô	.ô	,ô	"ô Ø)ØØ%Øô	
ˆô Ð6Ó7ð 	4¸<ÜÐBÓCð 4Àyà,0�Ô)ô )KØ%ó)�	Ô%ô
 (›/�Ü"›f�Ø&+�Ô#Ü07Ð8WÓ0X�×!Ñ!Ô-Ø*�”Ø$(�Ô!ð × Ñ Ô"ð ×!Ñ! '§,¡,Ô/Ø× Ñ  ×!2Ñ!2Ô3÷/4÷	4ð 	4÷4ð 4ú÷	4ð 	4ús#   ³C=¿B!C1Ã C=Ã1C:	Ã6C=Ã=Dc                 óD  — t        «       }t        j                  t        j                  t        j                  «      }||_        d|_        |j                  «        |j                  «        | j                  |j                  «       | j                  |j
                  «       y)zYTest the specific scenario from issue #1026: socket killed externally during reconnectionTN)
r   ÚsocketÚAF_INETÚSOCK_STREAMr   r   r   r   r   r   )r   r   Úreal_sockets      r   Ú/test_reconnection_with_externally_closed_socketzNReconnectBadFileDescriptorTest.test_reconnection_with_externally_closed_socketˆ   st   € ô ‹_ˆô —m‘m¤F§N¡N´F×4FÑ4FÓGˆØˆŒØˆŒð 	×ÑÔð 	�‰Œð 	×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Õ&r   c                 óª   — 	 |j                   s|j                  «        d|_        d|_        y# t        t        f$ r Y Œ w xY w# d|_        d|_        w xY w)z8Helper method that simulates the fixed shutdown behaviorNF)r   r   r   ÚAttributeErrorr   r   )r   Úws_instancer7   s      r   Ú_safe_shutdownz-ReconnectBadFileDescriptorTest._safe_shutdownž   sZ   € ð	*Ø×&Ò&Ø×!Ñ!Ô#ð  $ˆKÔØ$)ˆKÕ!øô	 œÐ(ò 	Ùð	ûð  $ˆKÔØ$)ˆKÕ!ús   ‚- ­?¼A ¾?¿A ÁAc                 ó°  — t        «       }t        j                  t        j                  t        j                  «      }||_        d|_        |j                  «        | j                  |j                  «       | j                  |j
                  «       |j                  «        | j                  |j                  «       | j                  |j
                  «       y)z6Test that multiple shutdown() calls don't cause issuesTN)	r   r:   r;   r<   r   r   r   r   r   )r   r   Ú	real_socks      r   Útest_multiple_shutdown_callsz;ReconnectBadFileDescriptorTest.test_multiple_shutdown_calls©   s‘   € ä‹_ˆô —M‘M¤&§.¡.´&×2DÑ2DÓEˆ	ØˆŒØˆŒð 	�‰ŒØ×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Ô&ð 	�‰ŒØ×Ñ˜"Ÿ'™'Ô"Ø×Ñ˜Ÿ™Õ&r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r    r"   r8   r>   rB   rE   r/   r   r   r	   r	      s.   „ ÙYò'ò('ò$'ò"
'ò14òj'ò,	*ó'r   r	   Ú__main__)Úunittestr:   Ú	threadingÚtimeÚunittest.mockr   r   Ú	websocketr   r   Úwebsocket._corer   Úwebsocket._exceptionsr   ÚTestCaser	   rF   Úmainr/   r   r   ú<module>rT      sL   ðã Û Û Û ß %ç -Ý 6Ý Dôm' X×%6Ñ%6ô m'ð` ˆzÒØ€H‡M�M…Oð r   