Ë
    Bü´jx  ã                   ód  — d dl Z d dlZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dlZ	d dl
mZ 	 e j                  j                  dd«      dk(  Ze j                  j                  dd«      Zedk7  Zd	Z G d
„ dej$                  «      Z G d„ dej$                  «      Zedk(  r ej,                  «        yy)é    N)Úmock)ÚABNFÚTEST_WITH_INTERNETÚ0Ú1ÚLOCAL_WS_SERVER_PORTz-1Tc                   óø  — e Zd Z G d„ d«      Zd„ Zd„ Zd„ Z ej                  e	d«      d„ «       Z
 ej                  dd	«      d
„ «       Z ej                  e	d«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Z ej                  ed«      d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Z ej                  e	d«      d„ «       Z ej                  e	d«      d„ «       Z ej                  e	d«      d„ «       Zd„ Zd„ Zd„ Zd„ Z d „ Z!y!)"ÚWebSocketAppTestc                   ó   — e Zd ZdZy)úWebSocketAppTest.NotSetYetz?A marker class for signalling that a value hasn't been set yet.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úV/root/workspace/ytshorts/venv/lib/python3.12/site-packages/websocket/tests/test_app.pyÚ	NotSetYetr   +   s   „ ÚMr   r   c                 ó  — t        j                  t        «       t        j	                  «       t        _        t        j	                  «       t        _        t        j	                  «       t        _        t        j	                  «       t        _        y ©N)	ÚwsÚenableTraceÚ	TRACEABLEr
   r   Úkeep_running_openÚkeep_running_closeÚget_mask_key_idÚon_error_data©Úselfs    r   ÚsetUpzWebSocketAppTest.setUp.   sV   € Ü
�‰”yÔ!ä-=×-GÑ-GÓ-IÔÔ*Ü.>×.HÑ.HÓ.JÔÔ+Ü+;×+EÑ+EÓ+GÔÔ(Ü)9×)CÑ)CÓ)EÔÕ&r   c                 óì   — t         j                  «       t         _        t         j                  «       t         _        t         j                  «       t         _        t         j                  «       t         _        y r   )r
   r   r   r   r   r   r   s    r   ÚtearDownzWebSocketAppTest.tearDown6   sJ   € Ü-=×-GÑ-GÓ-IÔÔ*Ü.>×.HÑ.HÓ.JÔÔ+Ü+;×+EÑ+EÓ+GÔÔ(Ü)9×)CÑ)CÓ)EÔÕ&r   c                  ó   — y r   r   r   s    r   ÚclosezWebSocketAppTest.close<   s   € Ør   z/Tests using local websocket server are disabledc                 óv   — d„ }d„ }d„ }t        j                  dt        › �|||¬«      }|j                  «        y)ú{A WebSocketApp should keep running as long as its self.keep_running
        is not False (in the boolean context).
        c                 ó^   — | j                  d«       | j                  t        _        d| _        y)zmSet the keep_running flag for later inspection and immediately
            close the connection.
            úhello!FN)ÚsendÚkeep_runningr
   r   ©r   ÚargsÚkwargss      r   Úon_openz3WebSocketAppTest.test_keep_running.<locals>.on_openG   s'   € ð �I‰I�hÔØ15×1BÑ1BÔÔ.Ø %ˆDÕr   c                 ó:   — t        |«       | j                  «        y r   ©Úprintr$   ©ÚappÚmessages     r   Ú
on_messagez6WebSocketAppTest.test_keep_running.<locals>.on_messageO   ó   € Ü�'ŒNØ�I‰I�Kr   c                 ó.   — | j                   t        _        y)z.Set the keep_running flag for the test to use.N)r*   r
   r   r+   s      r   Úon_closez4WebSocketAppTest.test_keep_running.<locals>.on_closeS   s   € à26×2CÑ2CÔÕ/r   úws://127.0.0.1:)r.   r8   r5   N©r   ÚWebSocketAppr   Úrun_forever)r   r.   r5   r8   r3   s        r   Útest_keep_runningz"WebSocketAppTest.test_keep_running?   sC   € ò	&ò	ò	Dô �o‰oØÔ2Ð3Ð4ØØØ!ô	
ˆð 	�‰Õr   Fz$Test disabled for now (requires rel)c                 ór   — d„ }d„ }t        j                  dt        › �||¬«      }|j                  d¬«       y)r&   c                 ó”   — | j                  d«       | j                  r| j                  j                  «        | j                  d«       y)z*Send a message, receive, and send one morer(   zgoodbye!N)r)   ÚsockÚrecvr+   s      r   r.   z=WebSocketAppTest.test_run_forever_dispatcher.<locals>.on_openf   s/   € à�I‰I�hÔØ�yŠyØ—	‘	—‘Ô Ø�I‰I�jÕ!r   c                 ó:   — t        |«       | j                  «        y r   r0   r2   s     r   r5   z@WebSocketAppTest.test_run_forever_dispatcher.<locals>.on_messagem   r6   r   r9   )r.   r5   Ú
Dispatcher©Ú
dispatcherNr:   )r   r.   r5   r3   s       r   Útest_run_forever_dispatcherz,WebSocketAppTest.test_run_forever_dispatcher`   s>   € ò	"ò	ô �o‰oØÔ2Ð3Ð4ØØ!ô
ˆð
 	�‰ <ˆÕ0r   c                 óÞ   — t        j                  dt        › �«      }t        j                  d|j
                  ¬«      j                  «        |j                  «       }| j                  |d«       y)zaThe WebSocketApp.run_forever() method should return `False` when the application ends gracefully.r9   gš™™™™™É?)ÚintervalÚfunctionFN)	r   r;   r   Ú	threadingÚTimerr$   Ústartr<   ÚassertEqual)r   r3   Úteardowns      r   Ú$test_run_forever_teardown_clean_exitz5WebSocketAppTest.test_run_forever_teardown_clean_exit{   sR   € ô
 �o‰o Ô0DÐ/EÐFÓGˆÜ�‰ ¨s¯y©yÔ9×?Ñ?ÔAØ—?‘?Ó$ˆØ×Ñ˜ 5Õ)r   z%Internet-requiring tests are disabledc                 ó”   — d„ }t        j                  d|¬«      }| j                  t        |j                  «      t        |«      «       y)zhA WebSocketApp should forward the received mask_key function down
        to the actual socket.
        c                   ó   — y)Nz    r   r   r   r   Úmy_mask_key_funcz=WebSocketAppTest.test_sock_mask_key.<locals>.my_mask_key_func‹   s   € Ø%r   úwss://api-pub.bitfinex.com/ws/1)Úget_mask_keyN)r   r;   rM   ÚidrT   )r   rR   r3   s      r   Útest_sock_mask_keyz#WebSocketAppTest.test_sock_mask_key…   s@   € ò	&ô �o‰oØ-Ð<Lô
ˆð 	×Ñœ˜C×,Ñ,Ó-¬rÐ2BÓ/CÕDr   c                 ó¼   — d„ }d„ }t        j                  d||¬«      }| j                  t         j                  |j                  dddt
        j                  i¬«       y	)
z7Test exception handling if ping_interval < ping_timeoutc                 ó:   — t        d«       | j                  «        y ©NzGot a ping!r0   ©r3   Ú_s     r   Úon_pingzIWebSocketAppTest.test_invalid_ping_interval_ping_timeout.<locals>.on_pingš   ó   € Ü�-Ô Ø�I‰I�Kr   c                 ó:   — t        d«       | j                  «        y ©NzGot a pong! No need to respondr0   rZ   s     r   Úon_pongzIWebSocketAppTest.test_invalid_ping_interval_ping_timeout.<locals>.on_pongž   ó   € ÜÐ2Ô3Ø�I‰I�Kr   rS   ©r\   r`   é   é   Ú	cert_reqs©Úping_intervalÚping_timeoutÚssloptN©r   r;   ÚassertRaisesÚWebSocketExceptionr<   ÚsslÚ	CERT_NONE©r   r\   r`   r3   s       r   Ú'test_invalid_ping_interval_ping_timeoutz8WebSocketAppTest.test_invalid_ping_interval_ping_timeout–   sZ   € ò	ò	ô �o‰oØ-°wÈô
ˆð 	×ÑÜ×!Ñ!Ø�O‰OØØØ¤§¡Ð/ð 	õ 	
r   c                 óˆ   — d„ }d„ }t        j                  d||¬«      }|j                  dddt        j                  i¬«       y	)
z+Test WebSocketApp proper ping functionalityc                 ó:   — t        d«       | j                  «        y rY   r0   rZ   s     r   r\   z4WebSocketAppTest.test_ping_interval.<locals>.on_ping±   r]   r   c                 ó:   — t        d«       | j                  «        y r_   r0   rZ   s     r   r`   z4WebSocketAppTest.test_ping_interval.<locals>.on_pongµ   ra   r   rS   rb   rd   rc   re   rf   N)r   r;   r<   rm   rn   ro   s       r   Útest_ping_intervalz#WebSocketAppTest.test_ping_interval­   sF   € ò	ò	ô �o‰oØ-°wÈô
ˆð 	�‰Ø¨!°[Ä#Ç-Á-Ð4Pð 	õ 	
r   c                 óV   — t        j                  d«      }|j                  ddd¬«       y)zTest WebSocketApp close opcodeú'wss://tsock.us1.twilio.com/v3/wsconnectrd   rc   zPing payload)rg   rh   Úping_payloadN)r   r;   r<   ©r   r3   s     r   Útest_opcode_closez"WebSocketAppTest.test_opcode_closeÀ   s%   € ô �o‰oÐGÓHˆØ�‰ a°aÀnˆÕUr   c                 ó¨   — t        j                  d«      }| j                  t         j                  |j                  ddt
        j                  i¬«       y)z1A WebSocketApp handling of negative ping_intervalrS   éûÿÿÿre   )rg   ri   Nrj   rx   s     r   Útest_bad_ping_intervalz'WebSocketAppTest.test_bad_ping_intervalÏ   sE   € ô �o‰oÐ?Ó@ˆØ×ÑÜ×!Ñ!Ø�O‰OØØ¤§¡Ð/ð	 	õ 	
r   c                 ó¨   — t        j                  d«      }| j                  t         j                  |j                  ddt
        j                  i¬«       y)z0A WebSocketApp handling of negative ping_timeoutrS   éýÿÿÿre   )rh   ri   Nrj   rx   s     r   Útest_bad_ping_timeoutz&WebSocketAppTest.test_bad_ping_timeoutÚ   sE   € ô �o‰oÐ?Ó@ˆØ×ÑÜ×!Ñ!Ø�O‰OØØ¤§¡Ð/ð	 	õ 	
r   c                 ó¦  — d„ }t        j                  d|¬«      }t        j                  t         j                  j                  d¬«      }| j	                  ddg|j                  |«      «       t        j                  t         j                  j                  d¬«      }| j	                  d	d	g|j                  |«      «       t        j                  d«      }t        j                  t         j                  j                  d¬«      }| j	                  d	d	g|j                  |«      «       | j                  t         j                  |j                  d
¬«       y	)zKTest extraction of close frame status code and close reason in WebSocketAppc                 ó   — t        d«       y )Nzon_close reached)r1   )ÚwsappÚclose_status_codeÚ	close_msgs      r   r8   z9WebSocketAppTest.test_close_status_code.<locals>.on_closeé   s   € ÜÐ$Õ%r   rv   ©r8   s   èno-init-from-client©ÚopcodeÚdataéè  zno-init-from-clientr   Nztest if connection is closed)rˆ   )	r   r;   r   ÚOPCODE_CLOSErM   Ú_get_close_argsrk   Ú"WebSocketConnectionClosedExceptionr)   )r   r8   r3   Ú
closeframeÚapp2s        r   Útest_close_status_codez'WebSocketAppTest.test_close_status_codeå   s  € ò	&ô �o‰oØ5Àô
ˆô —W‘WÜ—7‘7×'Ñ'Ð.Lô
ˆ
ð 	×Ñ˜$Ð 5Ð6¸×8KÑ8KÈJÓ8WÔXä—W‘W¤B§G¡G×$8Ñ$8¸sÔCˆ
Ø×Ñ˜$ ˜ s×':Ñ':¸:Ó'FÔGä�‰ÐHÓIˆÜ—W‘W¤B§G¡G×$8Ñ$8¸sÔCˆ
Ø×Ñ˜$ ˜ t×';Ñ';¸JÓ'GÔHà×ÑÜ×1Ñ1Ø�H‰HØ/ð 	õ 	
r   c                 ó˜  — t        j                  d«      }t        j                  t         j                  j                  d¬«      }|j	                  |«      \  }}| j                  |d«       | j                  |d«       t        j                  t         j                  j                  d¬«      }|j	                  |«      \  }}| j                  |d«       | j                  |d«       t        j                  t         j                  j                  d¬«      }|j	                  |«      \  }}| j                  |d	«       | j                  |d
«       y)zB_parse_close_frame decodes bytes, str, and invalid UTF-8 payloads.úws://example.coms   ènormal-closurer†   r‰   znormal-closures   èÿþÿu	   ï¿½ï¿½ï¿½zABtext-reasoniBA  ztext-reasonN)r   r;   r   rŠ   Ú_parse_close_framerM   )r   r3   Úbinary_frameÚcodeÚreasonÚinvalid_utf8Ú	text_datas          r   Útest_parse_close_frame_variantsz0WebSocketAppTest.test_parse_close_frame_variants  s  € ô �o‰oÐ0Ó1ˆä—w‘wÜ—7‘7×'Ñ'Ð.Gô
ˆð ×-Ñ-¨lÓ;‰ˆˆfØ×Ñ˜˜tÔ$Ø×Ñ˜Ð!1Ô2ä—w‘wÜ—7‘7×'Ñ'Ð.Eô
ˆð ×-Ñ-¨lÓ;‰ˆˆfØ×Ñ˜˜tÔ$Ø×Ñ˜Ð!5Ô6ä—G‘G¤2§7¡7×#7Ñ#7¸oÔNˆ	Ø×-Ñ-¨iÓ8‰ˆˆfØ×Ñ˜˜vÔ&Ø×Ñ˜ Õ/r   c                 ó  ‡‡	‡
— d}t        j                  t         j                  j                  |¬«      Šg Š	g Š
ˆ	fd„}ˆ
fd„} G ˆfd„d«      } G d„ d«      }t        j                  d	||¬
«      } ||«      }t	        j
                  d|«      5  t        j
                  j                  t         j                  d|¬«      5  |j                  «        ddd«       ddd«       | j                  ‰	dg«       | j                  t        ‰
«      d«       | j                  ‰
d   t         j                  «       | j                  t        ‰
d   dd«      d«       | j                  t        ‰
d   dd«      d«       y# 1 sw Y   Œ£xY w# 1 sw Y   Œ§xY w)zDEnsure close frames propagate through closed() to on_error/on_close.s   èclose-reasonr†   c                 ó,   •— ‰j                  ||f«       y r   ©Úappend©r3   r”   r•   Úclose_resultss      €r   r8   zIWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.on_close!  ó   ø€ Ø× Ñ  $¨ Õ0r   c                 ó(   •— ‰j                  |«       y r   r›   ©r3   ÚerrÚerror_resultss     €r   Úon_errorzIWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.on_error$  ó   ø€ Ø× Ñ  Õ%r   c                   ó6   •— e Zd Zd„ Zd„ Zd„ Zˆ fd„Zd„ Zd„ Zy)úNWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocketc                 ó0   — t        «       | _        d| _        y ©NF)Úobjectr@   Ú
_deliveredr+   s      r   Ú__init__zWWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocket.__init__(  s   € Ü"›H�”	Ø"'�•r   c                  ó   — y r   r   ©r   Útimeouts     r   Ú
settimeoutzYWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocket.settimeout,  ó   € Ør   c                  ó   — y r   r   r+   s      r   ÚconnectzVWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocket.connect/  r±   r   c                 óŒ   •— | j                   rt        j                  d«      ‚d| _         t        j                  j                  ‰fS )NÚclosedT)r«   r   rŒ   r   rŠ   )r   r,   r-   Úclose_frames      €r   Úrecv_data_framez^WebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocket.recv_data_frame2  s7   ø€ Ø—?’?Ü×?Ñ?ÀÓIÐIØ"&�”ÜŸ™×,Ñ,¨kÐ:Ð:r   c                  ó   — y r   r   r   s    r   r$   zTWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocket.close8  r±   r   c                  ó   — y r   r   r   s    r   ÚshutdownzWWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeWebSocket.shutdown;  r±   r   N©	r   r   r   r¬   r°   r³   r·   r$   rº   ©r¶   s   €r   ÚFakeWebSocketr§   '  s!   ø„ ò(òòô;òór   r½   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úOWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeDispatcherc                 ó   — || _         y r   ©r3   rx   s     r   r¬   zXWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeDispatcher.__init__?  ó	   € Ø�•r   c                 ó   —  |«        y r   r   ©r   r@   Úread_callbackÚcheck_callbacks       r   ÚreadzTWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeDispatcher.readB  ó   € Ù•r   c                  ó   — y r   r   ©r   ÚsecondsÚreconnectors      r   Ú	reconnectzYWebSocketAppTest.test_close_frame_triggers_closed_logic.<locals>.FakeDispatcher.reconnectE  r±   r   N©r   r   r   r¬   rÇ   rÍ   r   r   r   ÚFakeDispatcherr¿   >  ó   „ òò ór   rÏ   r‘   ©r8   r¤   úwebsocket._app.WebSocketÚcreate_dispatcher©Úreturn_valueN)r‰   úclose-reasonrc   r   Ústatus_coder‰   r•   rÖ   )r   r   rŠ   r;   r   Úpatchrª   r<   rM   ÚlenÚassertIsInstancerŒ   Úgetattr)r   Úclose_payloadr8   r¤   r½   rÏ   r3   Úfake_dispatcherr¶   rž   r£   s           @@@r   Ú&test_close_frame_triggers_closed_logicz7WebSocketAppTest.test_close_frame_triggers_closed_logic  sU  ú€ ð 0ˆÜ—g‘g¤R§W¡W×%9Ñ%9ÀÔNˆØˆØˆô	1ô	&÷	ó 	÷.	ñ 	ô �o‰oÐ0¸8ÈhÔWˆÙ(¨Ó-ˆä�Z‰ZÐ2°MÓBñ 	"Ü—‘×"Ñ"Ü—‘Ð!4À?ð #ó ñ "ð —‘Ô!÷"÷	"ð 	×Ñ˜Ð)?Ð(@ÔAØ×Ñœ˜]Ó+¨QÔ/Ø×Ñ˜m¨AÑ.´×0UÑ0UÔVØ×Ñœ ¨qÑ!1°=À$ÓGÈÔNØ×Ñœ ¨qÑ!1°8¸TÓBÀNÕS÷"ð "ú÷	"ð 	"ús$   Â1E?Ã E3ÃE?Å3E<	Å8E?Å?Fc                 ó¦  ‡‡— g Šg Šˆfd„}ˆfd„} G d„ d«      } G d„ d«      }t        j                  d||¬«      } ||«      }t        j                  d	|«      5  t        j                  j	                  t         j                  d
|¬«      5  |j                  «        ddd«       ddd«       | j                  ‰dg«       | j                  t        ‰«      d«       | j                  ‰d   t         j                  «       | j                  t        ‰d   «      d«       | j                  t        ‰d   d«      «       y# 1 sw Y   ŒŸxY w# 1 sw Y   Œ£xY w)zCEnsure exception path through closed() does not pass a close frame.c                 ó,   •— ‰j                  ||f«       y r   r›   r�   s      €r   r8   zPWebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.on_close]  rŸ   r   c                 ó(   •— ‰j                  |«       y r   r›   r¡   s     €r   r¤   zPWebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.on_error`  r¥   r   c                   ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)úUWebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocketc                 ó6   — t        j                  «       | _        y r   ©r   ÚMockr@   r+   s      r   r¬   z^WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocket.__init__d  ó   € Ü ŸI™I›K�•	r   c                  ó   — y r   r   r®   s     r   r°   z`WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocket.settimeoutg  r±   r   c                  ó   — y r   r   r+   s      r   r³   z]WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocket.connectj  r±   r   c                 ó,   — t        j                  d«      ‚)Núsocket closed©r   rŒ   r+   s      r   r·   zeWebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocket.recv_data_framem  s   € Ü×;Ñ;¸OÓLÐLr   c                  ó   — y r   r   r   s    r   r$   z[WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocket.closep  r±   r   c                  ó   — y r   r   r   s    r   rº   z^WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeWebSocket.shutdowns  r±   r   Nr»   r   r   r   r½   rã   c  s!   „ ò(òòòMòór   r½   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úVWebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeDispatcherc                 ó   — || _         y r   rÁ   rx   s     r   r¬   z_WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeDispatcher.__init__w  rÂ   r   c                 ó   —  |«        y r   r   rÄ   s       r   rÇ   z[WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeDispatcher.readz  rÈ   r   c                  ó   — y r   r   rÊ   s      r   rÍ   z`WebSocketAppTest.test_close_exception_legacy_path_has_no_frame.<locals>.FakeDispatcher.reconnect}  r±   r   NrÎ   r   r   r   rÏ   rð   v  rÐ   r   rÏ   r‘   rÑ   rÒ   rÓ   rÔ   N©NNrc   r   rë   r×   ©r   r;   r   rØ   rª   r<   rM   rÙ   rÚ   rŒ   ÚstrÚassertFalseÚhasattr)	r   r8   r¤   r½   rÏ   r3   rÝ   rž   r£   s	          @@r   Ú-test_close_exception_legacy_path_has_no_framez>WebSocketAppTest.test_close_exception_legacy_path_has_no_frameW  s,  ù€ ð ˆØˆô	1ô	&÷	ñ 	÷&	ñ 	ô �o‰oÐ0¸8ÈhÔWˆÙ(¨Ó-ˆä�Z‰ZÐ2°MÓBñ 	"Ü—‘×"Ñ"Ü—‘Ð!4À?ð #ó ñ "ð —‘Ô!÷"÷	"ð 	×Ñ˜¨¨Ô7Ø×Ñœ˜]Ó+¨QÔ/Ø×Ñ˜m¨AÑ.´×0UÑ0UÔVØ×Ñœ˜]¨1Ñ-Ó.°Ô@Ø×Ñœ ¨qÑ!1°=ÓAÕB÷"ð "ú÷	"ð 	"ús$   Á1EÂD;ÂEÄ;E	Å EÅEc                 óè  ‡‡— g Šg Šˆfd„}ˆfd„} G d„ d«      } G d„ d«      } |«       }t        j                  d||¬«      }t        j                  d	|«      5  t        j                  j	                  t         j                  d
|¬«      5  |j                  t	        «       ¬«       ddd«       ddd«       | j                  |j                  «       | j                  |j                  «       | j                  ‰dg«       | j                  t        ‰«      d«       | j                  ‰d   t         j                  «       | j                  t        ‰d   «      d«       y# 1 sw Y   Œ·xY w# 1 sw Y   Œ»xY w)z<Custom dispatchers should route exceptions through closed().c                 ó,   •— ‰j                  ||f«       y r   r›   r�   s      €r   r8   zIWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.on_close•  rŸ   r   c                 ó(   •— ‰j                  |«       y r   r›   r¡   s     €r   r¤   zIWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.on_error˜  r¥   r   c                   ó0   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)úNWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocketc                 ó6   — t        j                  «       | _        y r   rå   r+   s      r   r¬   zWWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocket.__init__œ  rç   r   c                  ó   — y r   r   r®   s     r   r°   zYWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocket.settimeoutŸ  r±   r   c                  ó   — y r   r   r+   s      r   r³   zVWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocket.connect¢  r±   r   c                 ó,   — t        j                  d«      ‚)Núdispatcher closedrì   r+   s      r   r·   z^WebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocket.recv_data_frame¥  s   € Ü×;Ñ;Ð<OÓPÐPr   c                  ó   — y r   r   r   s    r   r$   zTWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocket.close¨  r±   r   c                  ó   — y r   r   r   s    r   rº   zWWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.FakeWebSocket.shutdown«  r±   r   Nr»   r   r   r   r½   rþ   ›  s!   „ ò(òòòQòór   r½   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)úQWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.CustomDispatcherc                 ó    — d| _         d | _        y r©   ©Úread_calledÚlast_resultr   s    r   r¬   zZWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.CustomDispatcher.__init__¯  s   € Ø#(�Ô Ø#'�Õ r   c                 ó*   — d| _          |«       | _        y )NTr	  rÄ   s       r   rÇ   zVWebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.CustomDispatcher.read³  s   € Ø#'�Ô Ù#0£?�Õ r   c                  ó   — y r   r   rÊ   s      r   rÍ   z[WebSocketAppTest.test_custom_dispatcher_close_exception.<locals>.CustomDispatcher.reconnect·  r±   r   NrÎ   r   r   r   ÚCustomDispatcherr  ®  s   „ ò(ò3ór   r  r‘   rÑ   rÒ   rÓ   rÔ   rD   Nrô   rc   r   r  )r   r;   r   rØ   rª   r<   Ú
assertTruer
  r  rM   rÙ   rÚ   rŒ   rö   )	r   r8   r¤   r½   r  Údispatcher_wrapperr3   rž   r£   s	          @@r   Ú&test_custom_dispatcher_close_exceptionz7WebSocketAppTest.test_custom_dispatcher_close_exception�  s?  ù€ ð ˆØˆô	1ô	&÷	ñ 	÷&
	ñ 
	ñ .Ó/Ðä�o‰oÐ0¸8ÈhÔWˆä�Z‰ZÐ2°MÓBñ 	5Ü—‘×"Ñ"Ü—‘Ð!4ÐCUð #ó ñ 5ð —‘¬6«8�Ô4÷5÷	5ð 	�‰Ð*×6Ñ6Ô7Ø�‰Ð*×6Ñ6Ô7Ø×Ñ˜¨¨Ô7Ø×Ñœ˜]Ó+¨QÔ/Ø×Ñ˜m¨AÑ.´×0UÑ0UÔVØ×Ñœ˜]¨1Ñ-Ó.Ð0CÕD÷5ð 5ú÷	5ð 	5ús$   Á1E(ÂEÂ&E(ÅE%	Å!E(Å(E1c                 ó   ‡‡‡— g Šg Šˆfd„}ˆfd„} G d„ d«      } G d„ d«      Šˆfd„}t        j                  d||¬	«      }t        j                  d
|«      5  t        j                  j	                  t         j                  d|«      5  |j                  «        ddd«       ddd«       | j                  ‰dg«       | j                  t        ‰«      d«       | j                  ‰d   t         j                  «       | j                  t        ‰d   «      d«       | j                  t        ‰d   d«      «       y# 1 sw Y   ŒŸxY w# 1 sw Y   Œ£xY w)zDCalling closed() with a string should still reach on_error/on_close.c                 ó,   •— ‰j                  ||f«       y r   r›   r�   s      €r   r8   zUWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.on_closeÑ  rŸ   r   c                 ó(   •— ‰j                  |«       y r   r›   r¡   s     €r   r¤   zUWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.on_errorÔ  r¥   r   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)úZWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.FakeWebSocketc                 ó6   — t        j                  «       | _        y r   rå   r+   s      r   r¬   zcWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.FakeWebSocket.__init__Ø  rç   r   c                  ó   — y r   r   r®   s     r   r°   zeWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.FakeWebSocket.settimeoutÛ  r±   r   c                  ó   — y r   r   r+   s      r   r³   zbWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.FakeWebSocket.connectÞ  r±   r   c                  ó   — y r   r   r   s    r   rº   zcWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.FakeWebSocket.shutdowná  r±   r   c                  ó   — y r   r   r   s    r   r$   z`WebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.FakeWebSocket.closeä  r±   r   N)r   r   r   r¬   r°   r³   rº   r$   r   r   r   r½   r  ×  s   „ ò(òòòór   r½   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)údWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.ClosedCallingDispatcherc                 ó.   — || _         || _        d| _        y r©   )r3   Ú	closed_fnr
  )r   r3   r  s      r   r¬   zmWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.ClosedCallingDispatcher.__init__è  s   € Ø�”Ø!*�”Ø#(�Õ r   c                 óV   — d| _         | j                  d«       d| j                  _        y )NTúmanual string closeF)r
  r  r3   r*   rÄ   s       r   rÇ   ziWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.ClosedCallingDispatcher.readí  s#   € Ø#'�Ô Ø—‘Ð4Ô5Ø(-�—‘Õ%r   c                  ó   — y r   r   rÊ   s      r   rÍ   znWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.ClosedCallingDispatcher.reconnectò  r±   r   NrÎ   r   r   r   ÚClosedCallingDispatcherr  ç  s   „ ò)ò
.ó
r   r#  c                 ó   •—  ‰| |«      S r   r   )r   rh   rE   Úis_sslÚhandleDisconnectr#  s        €r   Úfake_create_dispatcherzcWebSocketAppTest.test_closed_string_argument_converted_to_exception.<locals>.fake_create_dispatcherõ  s   ø€ ñ +¨4Ð1AÓBÐBr   r‘   rÑ   rÒ   rÓ   Nrô   rc   r   r!  r×   rõ   )	r   r8   r¤   r½   r'  r3   r#  rž   r£   s	         @@@r   Ú2test_closed_string_argument_converted_to_exceptionzCWebSocketAppTest.test_closed_string_argument_converted_to_exceptionË  s%  ú€ ð ˆØˆô	1ô	&÷	ñ 	÷ 	ñ 	ô	Cô
 �o‰oÐ0¸8ÈhÔWˆä�Z‰ZÐ2°MÓBñ 	"Ü—‘×"Ñ"Ü—‘Ð!4Ð6Lóñ "ð —‘Ô!÷"÷	"ð 	×Ñ˜¨¨Ô7Ø×Ñœ˜]Ó+¨QÔ/Ø×Ñ˜m¨AÑ.´×0UÑ0UÔVØ×Ñœ˜]¨1Ñ-Ó.Ð0EÔFØ×Ñœ ¨qÑ!1°=ÓAÕB÷"ð "ú÷	"ð 	"ús$   Á0EÂ	D8ÂEÄ8E	Ä=EÅEc                 ó  ‡‡— dŠdŠd„ }ˆˆfd„}d„ }t        j                  dt        › �|||¬«      }|j                  dd¬	«       | j	                  ‰|«       | j                  ‰t        «       | j	                  t        ‰«      d
«       y)z)Test callback function exception handlingNc                 ó   — t        d«      ‚©NúCallback failed©ÚRuntimeErrorrÁ   s    r   r.   zBWebSocketAppTest.test_callback_function_exception.<locals>.on_open  s   € ÜÐ0Ó1Ð1r   c                 ó   •— | Š|Šy r   r   )r3   r¢   ÚexcÚ
passed_apps     €€r   r¤   zCWebSocketAppTest.test_callback_function_exception.<locals>.on_error  s   ø€ àˆJà‰Cr   c                 ó$   — | j                  «        y r   ©r$   rZ   s     r   r`   zBWebSocketAppTest.test_callback_function_exception.<locals>.on_pong  s   € Ø�I‰I�Kr   r9   ©r.   r¤   r`   rd   rc   ©rg   rh   r,  )r   r;   r   r<   rM   rÚ   r.  rö   )r   r.   r¤   r`   r3   r0  r1  s        @@r   Ú test_callback_function_exceptionz1WebSocketAppTest.test_callback_function_exception  sŠ   ù€ ð ˆØˆ
ò	2õ	ò	ô �o‰oØÔ2Ð3Ð4ØØØô	
ˆð 	�‰ a°aˆÔ8à×Ñ˜ SÔ)Ø×Ñ˜c¤<Ô0Ø×Ñœ˜S›Ð#4Õ5r   c                 óü   —  G d„ d«      } |«       }| j                  |j                  |j                  «       | j                  |j                  t
        «       | j                  t        |j                  «      d«       y)z'Test callback method exception handlingc                   ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)úBWebSocketAppTest.test_callback_method_exception.<locals>.Callbacksc                 óà   — d | _         d | _        t        j                  dt        › �| j
                  | j                  | j                  ¬«      | _        | j                  j                  dd¬«       y )Nr9   r4  rd   rc   r5  )
r0  r1  r   r;   r   r.   r¤   r`   r3   r<   r   s    r   r¬   zKWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.__init__0  sZ   € Ø�”Ø"&�”ÜŸ?™?Ø%Ô&:Ð%;Ð<Ø ŸL™LØ!Ÿ]™]Ø ŸL™Lô	�”ð —‘×$Ñ$°1À1Ð$ÕEr   c                 ó   — t        d«      ‚r+  r-  )r   r[   s     r   r.   zJWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.on_open;  s   € Ü"Ð#4Ó5Ð5r   c                 ó    — || _         || _        y r   )r1  r0  )r   r3   r¢   s      r   r¤   zKWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.on_error>  s   € Ø"%�”Ø�•r   c                 ó$   — |j                  «        y r   r3  )r   r3   r[   s      r   r`   zJWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.on_pongB  s   € Ø—	‘	•r   N)r   r   r   r¬   r.   r¤   r`   r   r   r   Ú	Callbacksr9  /  s   „ ò	Fò6òór   r>  r,  N)rM   r1  r3   rÚ   r0  r.  rö   )r   r>  Ú	callbackss      r   Útest_callback_method_exceptionz/WebSocketAppTest.test_callback_method_exception)  s]   € ÷	ñ 	ñ, “Kˆ	à×Ñ˜×-Ñ-¨y¯}©}Ô=Ø×Ñ˜iŸm™m¬\Ô:Ø×Ñœ˜YŸ]™]Ó+Ð->Õ?r   c                 ó$  ‡‡— dŠdŠˆfd„}ˆfd„}t        j                  dt        › �||¬«      }|j                  ddd	¬
«       | j	                  ‰d«       | j                  ‰t         j                  «       | j	                  t        ‰«      d«       y)zTest reconnectr   Nc                 ó
   •— |Šy r   r   )r[   r¢   r0  s     €r   r¤   z1WebSocketAppTest.test_reconnect.<locals>.on_errorS  s   ø€ à‰Cr   c                 óz   •— ‰dz  Š‰dk(  r| j                   j                  «        ‰dk\  r| j                  «        y y )Nrc   rd   )r@   rº   r$   )r3   r[   Ú
pong_counts     €r   r`   z0WebSocketAppTest.test_reconnect.<locals>.on_pongW  s8   ø€ à˜!‰OˆJØ˜QŠà—‘×!Ñ!Ô#Ø˜QŠà—	‘	•ð r   r9   )r`   r¤   rd   rc   é   )rg   rh   rÍ   zping/pong timed out)r   r;   r   r<   rM   rÚ   ÚWebSocketTimeoutExceptionrö   )r   r¤   r`   r3   r0  rD  s       @@r   Útest_reconnectzWebSocketAppTest.test_reconnectK  s‰   ù€ ð
 ˆ
Øˆô	ô	ô �o‰oØÔ2Ð3Ð4¸gÐPXô
ˆð 	�‰ a°aÀ1ˆÔEà×Ñ˜ QÔ'Ø×Ñ˜c¤2×#?Ñ#?Ô@Ø×Ñœ˜S›Ð#8Õ9r   c                 ó¨   — t        j                  d«      }|j                  dd¬«      }| j                  |t         j                  j
                  «       y)z!Test default dispatcher selectionr‘   é
   F©rh   r%  N)r   r;   rÓ   rÚ   Ú_dispatcherrC   ©r   r3   rE   s      r   Ú!test_dispatcher_selection_defaultz2WebSocketAppTest.test_dispatcher_selection_defaultj  sB   € ä�o‰oÐ0Ó1ˆð ×*Ñ*¸À5Ð*ÓIˆ
Ø×Ñ˜j¬"¯.©.×*CÑ*CÕDr   c                 ó¨   — t        j                  d«      }|j                  dd¬«      }| j                  |t         j                  j
                  «       y)zTest SSL dispatcher selectionzwss://example.comrI  TrJ  N)r   r;   rÓ   rÚ   rK  ÚSSLDispatcherrL  s      r   Útest_dispatcher_selection_sslz.WebSocketAppTest.test_dispatcher_selection_sslr  sB   € ä�o‰oÐ1Ó2ˆð ×*Ñ*¸À4Ð*ÓHˆ
Ø×Ñ˜j¬"¯.©.×*FÑ*FÕGr   c                 óB  — ddl m} t        j                  d«      } |«       } |«       }|j	                  d||¬«      }| j                  |t        j                  j                  «       | j                  |j                  |«       | j                  |j                  |«       y)z Test custom dispatcher selectionr   )ræ   r‘   rI  )rh   rE   r&  N)Úunittest.mockræ   r   r;   rÓ   rÚ   rK  ÚWrappedDispatcherrM   rE   r&  )r   ræ   r3   Úcustom_dispatcherÚhandle_disconnectrE   s         r   Ú test_dispatcher_selection_customz1WebSocketAppTest.test_dispatcher_selection_customz  sŽ   € å&ä�o‰oÐ0Ó1ˆÙ ›FÐÙ ›FÐð ×*Ñ*ØØ(Ø.ð +ó 
ˆ
ð
 	×Ñ˜j¬"¯.©.×*JÑ*JÔKØ×Ñ˜×.Ñ.Ð0AÔBØ×Ñ˜×4Ñ4Ð6GÕHr   c                 óà   — t        j                  d«      }|j                  dd¬«      }| j                  |t         j                  j
                  «       | j                  |j                  d«       y)z.Test dispatcher selection without ping timeoutr‘   NFrJ  rI  )r   r;   rÓ   rÚ   rK  rC   rM   rh   rL  s      r   Ú)test_dispatcher_selection_no_ping_timeoutz:WebSocketAppTest.test_dispatcher_selection_no_ping_timeoutŒ  sX   € ä�o‰oÐ0Ó1ˆð ×*Ñ*¸ÀUÐ*ÓKˆ
Ø×Ñ˜j¬"¯.©.×*CÑ*CÔDØ×Ñ˜×0Ñ0°"Õ5r   c                 óŽ  — t        j                  d«      }	 |j                  dt        j                  t        j
                  dff¬«       	 |j                  dt        j                  t        j
                  dff¬«       y# t         j                  t        t        f$ r Y ŒUw xY w# t         j                  t        t        f$ r Y yw xY w)zKTest that suppress_host parameter is accepted by WebSocketApp.run_forever()zws://nonexistent.example.comTrc   )Úsuppress_hostÚsockoptFN)	r   r;   r<   ÚsocketÚ
SOL_SOCKETÚSO_REUSEADDRÚWebSocketAddressExceptionÚOSErrorÚConnectionRefusedErrorrx   s     r   Útest_suppress_host_parameterz-WebSocketAppTest.test_suppress_host_parameter•  s¸   € ä�o‰oÐ<Ó=ˆð	Ø�O‰OØ"Ü ×+Ñ+¬V×-@Ñ-@À!ÐDÐFð ô ð	Ø�O‰OØ#Ü ×+Ñ+¬V×-@Ñ-@À!ÐDÐFð õ øô ×,Ñ,¬gÔ7MÐNò 	áð	ûô ×,Ñ,¬gÔ7MÐNò 	áð	ús#   —3A? Á3B# Á?B ÂB Â#CÃCN)"r   r   r   r   r    r"   r$   ÚunittestÚ
skipUnlessÚTEST_WITH_LOCAL_SERVERr=   rF   rO   r   rV   rp   rt   ry   r|   r   r�   r˜   rÞ   rù   r  r(  r6  r@  rG  rM  rP  rV  rX  rb  r   r   r   r
   r
   *   sT  „ ÷Nñ NòFòFòð €X×ÑØÐ Qóñóðð< €X×Ñ˜Ð FÓGñ1ó Hð1ð4 €X×ÑØÐ Qóñ*óð*ð €X×ÑÐ+Ð-TÓUñEó VðEð  €X×ÑÐ+Ð-TÓUñ
ó Vð
ð, €X×ÑÐ+Ð-TÓUñ
ó Vð
ð$ €X×ÑÐ+Ð-TÓUñVó VðVð €X×ÑÐ+Ð-TÓUñ
ó Vð
ð €X×ÑÐ+Ð-TÓUñ
ó Vð
ð €X×ÑÐ+Ð-TÓUñ
ó Vð
ò60ò0<Tò|6Còp:Eòx;Cðz €X×ÑØÐ Qóñ6óð6ð< €X×ÑØÐ Qóñ@óð@ð> €X×ÑØÐ Qóñ:óð:ò8EòHòIò$6ór   r
   c                   óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚWebSocketAppUnitTestsc                 ó,   — t        j                  d«      S )Nr‘   )r   r;   r   s    r   Ú
_build_appz WebSocketAppUnitTests._build_app°  s   € Ü�‰Ð1Ó2Ð2r   c                 óò  —  G d„ d«      }| j                  «       } |d¬«      |_        | j                  t        j                  «      5  |j                  d«       d d d «       | j                  t        j                  «      5  |j                  d«       d d d «       | j                  t        j                  «      5  |j                  d«       d d d «       y # 1 sw Y   Œ|xY w# 1 sw Y   ŒOxY w# 1 sw Y   y xY w)Nc                   ó   — e Zd Zdd„Zd„ Zy)úUWebSocketAppUnitTests.test_send_helpers_raise_when_socket_inactive.<locals>.DummySockc                 ó    — || _         g | _        y r   )rÕ   Úcalls)r   rÕ   s     r   r¬   z^WebSocketAppUnitTests.test_send_helpers_raise_when_socket_inactive.<locals>.DummySock.__init__µ  s   € Ø$0�Ô!Ø�•
r   c                 óT   — | j                   j                  ||f«       | j                  S r   )rn  rœ   rÕ   )r   rˆ   r‡   s      r   r)   zZWebSocketAppUnitTests.test_send_helpers_raise_when_socket_inactive.<locals>.DummySock.send¹  s$   € Ø—
‘
×!Ñ! 4¨ .Ô1Ø×(Ñ(Ð(r   N)r   )r   r   r   r¬   r)   r   r   r   Ú	DummySockrl  ´  s   „ ó ó)r   rp  r   rÔ   Úpayloads   payload)ri  r@   rk   r   rŒ   r)   Ú	send_textÚ
send_bytes)r   rp  r3   s      r   Ú,test_send_helpers_raise_when_socket_inactivezBWebSocketAppUnitTests.test_send_helpers_raise_when_socket_inactive³  sÊ   € ÷	)ñ 	)ð �o‰oÓˆÙ¨!Ô,ˆŒà×Ñœr×DÑDÓEñ 	 Ø�H‰H�YÔ÷	 à×Ñœr×DÑDÓEñ 	%Ø�M‰M˜)Ô$÷	%à×Ñœr×DÑDÓEñ 	'Ø�N‰N˜:Ô&÷	'ð 	'÷		 ð 	 ú÷	%ð 	%ú÷	'ð 	'ús$   ÁCÂC!Â:C-ÃCÃ!C*Ã-C6c                 óÊ  — | j                  «       }| j                  t        j                  «      5  |j	                  d¬«       d d d «       | j                  t        j                  «      5  |j	                  d¬«       d d d «       | j                  t        j                  «      5  |j	                  dd¬«       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   ŒQxY w# 1 sw Y   y xY w)Nr   )rh   éÿÿÿÿ)rg   rc   r5  )ri  rk   r   rl   r<   rx   s     r   Ú-test_run_forever_validates_ping_configurationzCWebSocketAppUnitTests.test_run_forever_validates_ping_configurationÇ  s¾   € Ø�o‰oÓˆà×Ñœr×4Ñ4Ó5ñ 	,Ø�O‰O¨ˆOÔ+÷	,ð ×Ñœr×4Ñ4Ó5ñ 	.Ø�O‰O¨"ˆOÔ-÷	.ð ×Ñœr×4Ñ4Ó5ñ 	=Ø�O‰O¨!¸!ˆOÔ<÷	=ð 	=÷	,ð 	,ú÷	.ð 	.ú÷	=ð 	=ús#   °CÁ*CÂ$CÃC
ÃCÃC"c                 óÊ   — | j                  «       }t        «       |_        | j                  t        j
                  «      5  |j                  «        d d d «       y # 1 sw Y   y xY wr   )ri  rª   r@   rk   r   rl   r<   rx   s     r   Ú1test_run_forever_rejects_when_socket_already_openzGWebSocketAppUnitTests.test_run_forever_rejects_when_socket_already_openÓ  sJ   € Ø�o‰oÓˆÜ“8ˆŒà×Ñœr×4Ñ4Ó5ñ 	Ø�O‰OÔ÷	÷ 	ñ 	ús   ¿AÁA"c                 óÊ  — | j                  «       }d„ |_        t        j                  dd«      dj	                  d«      z   }t        j                  |t
        j                  «      }|j                  |«      \  }}| j                  |d«       | j                  |d«       t        j                  dt
        j                  «      }| j                  |j                  |«      d d g«       y )Nc                   ó   — y r   r   )r[   s    r   ú<lambda>z@WebSocketAppUnitTests.test_close_frame_parsing.<locals>.<lambda>Ü  s   � r   ú!Hi   Úbyeúutf-8r   )
ri  r8   ÚstructÚpackÚencoder   Úcreate_framerŠ   r‹   rM   )r   r3   rÜ   r¶   Ústatusr•   Úempty_frames          r   Útest_close_frame_parsingz.WebSocketAppUnitTests.test_close_frame_parsingÚ  s¶   € Ø�o‰oÓˆÙ&ˆŒÜŸ™ D¨$Ó/°%·,±,¸wÓ2GÑGˆÜ×'Ñ'¨´t×7HÑ7HÓIˆà×,Ñ,¨[Ó9‰ˆ�Ø×Ñ˜ Ô&Ø×Ñ˜ Ô'ä×'Ñ'¨¬T×->Ñ->Ó?ˆØ×Ñ˜×,Ñ,¨[Ó9¸DÀ$¸<ÕHr   c                 óî  ‡‡— g Šˆfd„}t        j                  dd«      dj                  d«      z   }t        j                  |t        j
                  «      Š G ˆfd„d«      }d„ }t        j                  d	|¬
«      }t        j                  d|«      5  t        j                  d|¬«      5  |j                  «        ddd«       ddd«       | j                  ‰dg«       y# 1 sw Y   Œ%xY w# 1 sw Y   Œ)xY w)zETest that client-initiated close uses stored close frame in teardown.c                 ó,   •— ‰j                  ||f«       y r   r›   r�   s      €r   r8   z]WebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.on_closeë  rŸ   r   r}  r‰   úpeer-goodbyer  c                   ó6   •— e Zd Zd„ Zd„ Zd„ Zˆ fd„Zd„ Zd„ Zy)úbWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocketc                 óD   — t        j                  «       | _        d | _        y r   )r   ræ   r@   r¶   r+   s      r   r¬   zkWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocket.__init__ò  s   € Ü ŸI™I›K�”	Ø#'�Õ r   c                  ó   — y r   r   r®   s     r   r°   zmWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocket.settimeoutö  r±   r   c                  ó   — y r   r   r+   s      r   r³   zjWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocket.connectù  r±   r   c                 ó   •— ‰| _         y r   r¼   )r   r-   Úpeer_close_frames     €r   r$   zhWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocket.closeü  s   ø€ à#3�Õ r   c                  ó   — y r   r   r   s    r   rº   zkWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocket.shutdown   r±   r   c                 ó,   — t        j                  d«      ‚)Nrµ   rì   r+   s      r   r·   zrWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.FakeWebSocket.recv_data_frame  s   € Ü×;Ñ;¸HÓEÐEr   N)	r   r   r   r¬   r°   r³   r$   rº   r·   )r�  s   €r   r½   r‹  ñ  s"   ø„ ò(òòô4òóFr   r½   c                 óF   — | j                   j                  «         |«        y r   )r3   r$   rÄ   s       r   Ú	fake_readz^WebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frame.<locals>.fake_read  s   € à�H‰H�N‰NÔÙ�Or   r‘   r…   rÒ   zwebsocket._app.Dispatcher.read)ÚnewN)r‰   r‰  )r€  r�  r‚  r   rƒ  rŠ   r   r;   r   rØ   r<   rM   )r   r8   Úpeer_close_payloadr½   r”  r3   rž   r�  s         @@r   Ú5test_client_initiated_close_captures_peer_close_framezKWebSocketAppUnitTests.test_client_initiated_close_captures_peer_close_frameç  sÖ   ù€ àˆô	1ô $Ÿ[™[¨¨tÓ4°~×7LÑ7LÈWÓ7UÑUÐÜ×,Ñ,Ð-?Ä×ARÑARÓSÐ÷	Fó 	Fò*	ô
 �o‰oÐ0¸8ÔDˆä�Z‰ZÐ2°MÓBñ 	"Ü—‘Ð<À)ÔLñ "Ø—‘Ô!÷"÷	"ð 	×Ñ˜Ð)?Ð(@ÕA÷"ð "ú÷	"ð 	"ús$   ÂC+Â*CÂ;C+ÃC(	Ã$C+Ã+C4c                 ó²  ‡‡‡‡‡— | j                  «       Št        j                  t        j                  dd«      dz   t        j
                  «      Št        j                  «       Št        j                  «       Šg Š G ˆˆˆfd„d«      } |«       ‰_        ˆˆfd„}t        j                  |¬«      }|j                  «        | j                  ‰j                  d¬	«      «       d
‰_        ‰j                  «        |j                  d¬	«       | j                  |j!                  «       «       | j#                  ‰g «       | j%                  ‰j&                  ‰«       y
)zEclose() retains its socket while concurrent teardown clears app.sock.r}  r‰   s   peer-goodbyec                   ó    •— e Zd ZdZˆ ˆˆfd„Zy)úbWebSocketAppUnitTests.test_close_captures_frame_when_teardown_clears_socket.<locals>.FakeWebSocketNc                 ón   •— ‰| _         ‰j                  «        ‰j                  d¬«      st        d«      ‚y )Nrc   ©r¯   z*test did not release FakeWebSocket.close())r¶   ÚsetÚwaitÚTimeoutError)r   r-   Úallow_close_to_returnÚclose_startedr�  s     €€€r   r$   zhWebSocketAppUnitTests.test_close_captures_frame_when_teardown_clears_socket.<locals>.FakeWebSocket.close   s9   ø€ Ø#3�Ô Ø×!Ñ!Ô#Ø,×1Ñ1¸!Ð1Ô<Ü&Ð'SÓTÐTð =r   )r   r   r   r¶   r$   )r   r¡  r�  s   €€€r   r½   rš    s   ø„ ØˆK÷Ur   r½   c                  óv   •— 	 ‰j                  «        y # t        $ r} ‰j                  | «       Y d } ~ y d } ~ ww xY wr   )r$   Ú	Exceptionrœ   )Úerrorr3   Úerrorss    €€r   Ú	close_appz^WebSocketAppUnitTests.test_close_captures_frame_when_teardown_clears_socket.<locals>.close_app(  s0   ø€ ð%Ø—	‘	•øÜò %Ø—‘˜e×$Ñ$ûð%ús   ƒ ”	8�3³8)Útargetrc   rœ  N)ri  r   rƒ  r€  r�  rŠ   rJ   ÚEventr@   ÚThreadrL   r  rž  r�  Újoinr÷   Úis_aliverM   ÚassertIsÚlast_close_frame)	r   r½   r¦  Úclose_threadr   r3   r¡  r¥  r�  s	       @@@@@r   Ú5test_close_captures_frame_when_teardown_clears_socketzKWebSocketAppUnitTests.test_close_captures_frame_when_teardown_clears_socket  s  ü€ à�o‰oÓˆÜ×,Ñ,Ü�K‰K˜˜dÓ# oÑ5´t×7HÑ7Hó
Ðô "Ÿ™Ó)ˆÜ )§¡Ó 1ÐØˆ÷	Uõ 	Uñ !“?ˆŒõ	%ô !×'Ñ'¨yÔ9ˆØ×ÑÔØ�‰˜×*Ñ*°1Ð*Ó5Ô6ð ˆŒØ×!Ñ!Ô#Ø×Ñ !ÐÔ$à×Ñ˜×.Ñ.Ó0Ô1Ø×Ñ˜ Ô$Ø�‰�c×*Ñ*Ð,<Õ=r   c                 ó@  — | j                  «       }t        j                  dd«      dj                  d«      z   }t	        j
                  |t        j                  «      |_        | j                  |j                  «       d|_        | j                  |j                  «       y)zCTest that last_close_frame is reset when initializing a new socket.r}  ié  z
old-reasonr  N)
ri  r€  r�  r‚  r   rƒ  rŠ   r­  ÚassertIsNotNoneÚassertIsNone)r   r3   Úold_close_payloads      r   Ú(test_last_close_frame_reset_on_reconnectz>WebSocketAppUnitTests.test_last_close_frame_reset_on_reconnect;  s�   € à�o‰oÓˆô #ŸK™K¨¨dÓ3°l×6IÑ6IÈ'Ó6RÑRÐÜ#×0Ñ0Ð1BÄD×DUÑDUÓVˆÔð 	×Ñ˜S×1Ñ1Ô2ð  $ˆÔØ×Ñ˜#×.Ñ.Õ/r   c                 óZ  ‡— g Šˆfd„}d„ }| j                  «       }||_        |j                  |«       | j                  t	        ‰«      d«       | j                  ‰d   t        «       ‰j                  «        ||_        |j                  |j                  «       | j                  ‰g «       y )Nc                 ó(   •— ‰j                  |«       y r   r›   )r3   r¢   Úcaptures     €r   r¤   zWWebSocketAppUnitTests.test_callback_errors_propagate_to_on_error_once.<locals>.on_errorN  s   ø€ Ø�N‰N˜3Õr   c                 ó   — t        d«      ‚)NÚboomr-  rZ   s     r   Úfailing_callbackz_WebSocketAppUnitTests.test_callback_errors_propagate_to_on_error_once.<locals>.failing_callbackQ  s   € Ü˜vÓ&Ð&r   rc   r   )ri  r¤   Ú	_callbackrM   rÙ   rÚ   r.  Úclear)r   r¤   rº  r3   r·  s       @r   Ú/test_callback_errors_propagate_to_on_error_oncezEWebSocketAppUnitTests.test_callback_errors_propagate_to_on_error_onceK  sŽ   ø€ Øˆô	 ò	'ð �o‰oÓˆØˆŒØ�‰Ð&Ô'Ø×Ñœ˜W› qÔ)Ø×Ñ˜g a™j¬,Ô7ð 	�‰ŒØ'ˆŒØ�‰�c—l‘lÔ#Ø×Ñ˜ "Õ%r   N)r   r   r   ri  rt  rw  ry  r†  r—  r¯  r´  r½  r   r   r   rg  rg  ¯  s3   „ ò3ò'ò(
=òòIò*BòX&>òP0ó &r   rg  Ú__main__)ÚosÚos.pathr\  rm   r€  rJ   rc  r   Ú	websocketr   Úwebsocket._abnfr   ÚenvironÚgetr   r   re  r   ÚTestCaser
   rg  r   Úmainr   r   r   ú<module>rÇ     s±   ðó 
Û Û Û 
Û Û Û Ý ã Ý  ðð( —Z‘Z—^‘^Ð$8¸#Ó>À#ÑEÐ à—z‘z—~‘~Ð&<¸dÓCÐ Ø-°Ñ5Ð Ø€	ôB
�x×(Ñ(ô B
ôJo&˜H×-Ñ-ô o&ðd ˆzÒØ€H‡M�M…Oð r   