a
    ñ»jF7  ã                   @   s‚   d dl Z d dlZ d dlZd dlZd dlZd dlZe j dd¡dkZ	e j dd¡Z
e
dkZdZG dd	„ d	ejƒZed
kr~e ¡  dS )é    NÚTEST_WITH_INTERNETÚ0Ú1ÚLOCAL_WS_SERVER_PORTz-1Tc                   @   sV  e Zd ZG dd„ dƒZdd„ Zdd„ Zdd„ Ze e	d	¡d
d„ ƒZ
e dd¡dd„ ƒZe e	d	¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd „ ƒZe e	d	¡d!d"„ ƒZe e	d	¡d#d$„ ƒZe e	d	¡d%d&„ ƒZd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/S )0ÚWebSocketAppTestc                   @   s   e Zd ZdZdS )zWebSocketAppTest.NotSetYetz?A marker class for signalling that a value hasn't been set yet.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú>E:\soccer\ml_env\Lib\site-packages\websocket/tests/test_app.pyÚ	NotSetYet'   s   r   c                 C   s6   t  t¡ t ¡ t_t ¡ t_t ¡ t_t ¡ t_d S ©N)	ÚwsZenableTraceÚ	TRACEABLEr   r   Úkeep_running_openÚkeep_running_closeÚget_mask_key_idÚon_error_data©Úselfr   r   r   ÚsetUp*   s
    



zWebSocketAppTest.setUpc                 C   s,   t  ¡ t _t  ¡ t _t  ¡ t _t  ¡ t _d S r   )r   r   r   r   r   r   r   r   r   r   ÚtearDown2   s    


zWebSocketAppTest.tearDownc                 C   s   d S r   r   r   r   r   r   Úclose8   s    zWebSocketAppTest.closez/Tests using local websocket server are disabledc                    s@   dd„ }‡ fdd„}dd„ }t jdt› �|||d�}| ¡  d	S )
ú{A WebSocketApp should keep running as long as its self.keep_running
        is not False (in the boolean context).
        c                 _   s   |   d¡ | jt_d| _dS )zmSet the keep_running flag for later inspection and immediately
            close the connection.
            úhello!FN)ÚsendÚkeep_runningr   r   ©r   ÚargsÚkwargsr   r   r   Úon_openC   s    
z3WebSocketAppTest.test_keep_running.<locals>.on_openc                    s   t |ƒ ˆ  ¡  d S r   ©Úprintr   ©Ú_Úmessager   r   r   Ú
on_messageK   s    z6WebSocketAppTest.test_keep_running.<locals>.on_messagec                 _   s   | j t_dS )z.Set the keep_running flag for the test to use.N)r   r   r   r   r   r   r   Úon_closeO   s    z4WebSocketAppTest.test_keep_running.<locals>.on_closeúws://127.0.0.1:)r!   r(   r'   N©r   ÚWebSocketAppr   Úrun_forever)r   r!   r'   r(   Úappr   r   r   Útest_keep_running;   s    üz"WebSocketAppTest.test_keep_runningFz$Test disabled for now (requires rel)c                    s:   dd„ }‡ fdd„}t jdt› �||d�}|jdd� d	S )
r   c                 _   s    |   d¡ |  ¡  |   d¡ dS )z*Send a message, receive, and send one morer   zgoodbye!N)r   Úrecvr   r   r   r   r!   b   s    
z=WebSocketAppTest.test_run_forever_dispatcher.<locals>.on_openc                    s   t |ƒ ˆ  ¡  d S r   r"   r$   r   r   r   r'   h   s    z@WebSocketAppTest.test_run_forever_dispatcher.<locals>.on_messager)   )r!   r'   Ú
Dispatcher)Ú
dispatcherNr*   )r   r!   r'   r-   r   r   r   Útest_run_forever_dispatcher\   s    ýz,WebSocketAppTest.test_run_forever_dispatcherc                 C   s<   t  dt› �¡}tjd|jd� ¡  | ¡ }|  |d¡ dS )zaThe WebSocketApp.run_forever() method should return `False` when the application ends gracefully.r)   gš™™™™™É?)ÚintervalÚfunctionFN)	r   r+   r   Ú	threadingÚTimerr   Ústartr,   ÚassertEqual)r   r-   Zteardownr   r   r   Ú$test_run_forever_teardown_clean_exitv   s    z5WebSocketAppTest.test_run_forever_teardown_clean_exitz%Internet-requiring tests are disabledc                 C   s0   dd„ }t jd|d�}|  t|jƒt|ƒ¡ dS )zhA WebSocketApp should forward the received mask_key function down
        to the actual socket.
        c                   S   s   dS )Nz    r   r   r   r   r   Úmy_mask_key_func†   s    z=WebSocketAppTest.test_sock_mask_key.<locals>.my_mask_key_funcúwss://api-pub.bitfinex.com/ws/1)Úget_mask_keyN)r   r+   r8   Úidr<   )r   r:   r-   r   r   r   Útest_sock_mask_key€   s
    ÿz#WebSocketAppTest.test_sock_mask_keyc                 C   sB   dd„ }dd„ }t jd||d�}| jt j|jddd	tjid
� dS )z7Test exception handling if ping_interval < ping_timeoutc                 S   s   t dƒ |  ¡  d S ©NzGot a ping!r"   ©r-   r%   r   r   r   Úon_ping•   s    zIWebSocketAppTest.test_invalid_ping_interval_ping_timeout.<locals>.on_pingc                 S   s   t dƒ |  ¡  d S ©NzGot a pong! No need to respondr"   r@   r   r   r   Úon_pong™   s    zIWebSocketAppTest.test_invalid_ping_interval_ping_timeout.<locals>.on_pongr;   ©rA   rC   é   é   Ú	cert_reqs©Úping_intervalÚping_timeoutÚssloptN©r   r+   ÚassertRaisesZWebSocketExceptionr,   ÚsslÚ	CERT_NONE©r   rA   rC   r-   r   r   r   Ú'test_invalid_ping_interval_ping_timeout‘   s    ÿûz8WebSocketAppTest.test_invalid_ping_interval_ping_timeoutc                 C   s:   dd„ }dd„ }t jd||d�}|jddd	tjid
� dS )z+Test WebSocketApp proper ping functionalityc                 S   s   t dƒ |  ¡  d S r?   r"   r@   r   r   r   rA   ¬   s    z4WebSocketAppTest.test_ping_interval.<locals>.on_pingc                 S   s   t dƒ |  ¡  d S rB   r"   r@   r   r   r   rC   °   s    z4WebSocketAppTest.test_ping_interval.<locals>.on_pongr;   rD   rF   rE   rG   rH   N)r   r+   r,   rN   rO   rP   r   r   r   Útest_ping_interval¨   s    ÿÿz#WebSocketAppTest.test_ping_intervalc                 C   s   t  d¡}|jdddd� dS )zTest WebSocketApp close opcodeú'wss://tsock.us1.twilio.com/v3/wsconnectrF   rE   zPing payload)rI   rJ   Zping_payloadN)r   r+   r,   ©r   r-   r   r   r   Útest_opcode_close»   s    
z"WebSocketAppTest.test_opcode_closec                 C   s*   t  d¡}| jt j|jddtjid� dS )z1A WebSocketApp handling of negative ping_intervalr;   éûÿÿÿrG   )rI   rK   NrL   rT   r   r   r   Útest_bad_ping_intervalÊ   s    
üz'WebSocketAppTest.test_bad_ping_intervalc                 C   s*   t  d¡}| jt j|jddtjid� dS )z0A WebSocketApp handling of negative ping_timeoutr;   éýÿÿÿrG   )rJ   rK   NrL   rT   r   r   r   Útest_bad_ping_timeoutÕ   s    
üz&WebSocketAppTest.test_bad_ping_timeoutc                 C   s°   dd„ }t jd|d�}t jt jjdd�}|  ddg| |¡¡ t jt jjd	d�}|  d
d
g| |¡¡ t  d¡}t jt jjd	d�}|  d
d
g| |¡¡ | jt j|jdd� d
S )zKTest extraction of close frame status code and close reason in WebSocketAppc                 S   s   t dƒ d S )Nzon_close reached)r#   )ZwsappZclose_status_codeZ	close_msgr   r   r   r(   ä   s    z9WebSocketAppTest.test_close_status_code.<locals>.on_closerS   )r(   s   èno-init-from-client)ÚopcodeÚdataiè  zno-init-from-clientó    Nztest if connection is closed)r[   )	r   r+   ÚABNFZOPCODE_CLOSEr8   Z_get_close_argsrM   Z"WebSocketConnectionClosedExceptionr   )r   r(   r-   Z
closeframeZapp2r   r   r   Útest_close_status_codeà   s$    ÿÿ
ýz'WebSocketAppTest.test_close_status_codec                    sx   d‰ d‰dd„ }‡ ‡fdd„}dd„ }t jdt› �|||d	�}|jd
dd� |  ˆ|¡ |  ˆ t¡ |  tˆ ƒd¡ dS )z)Test callback function exception handlingNc                 S   s   t dƒ‚d S ©NúCallback failed©ÚRuntimeError)r-   r   r   r   r!     s    zBWebSocketAppTest.test_callback_function_exception.<locals>.on_openc                    s   | ‰|‰ d S r   r   )r-   Úerr©ÚexcÚ
passed_appr   r   Úon_error  s    zCWebSocketAppTest.test_callback_function_exception.<locals>.on_errorc                 S   s   |   ¡  d S r   ©r   r@   r   r   r   rC     s    zBWebSocketAppTest.test_callback_function_exception.<locals>.on_pongr)   ©r!   rg   rC   rF   rE   ©rI   rJ   r`   )r   r+   r   r,   r8   ÚassertIsInstancerb   Ústr)r   r!   rg   rC   r-   r   rd   r   Ú test_callback_function_exceptionü   s    üz1WebSocketAppTest.test_callback_function_exceptionc                 C   sH   G dd„ dƒ}|ƒ }|   |j|j¡ |  |jt¡ |   t|jƒd¡ dS )z'Test callback method exception handlingc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
zBWebSocketAppTest.test_callback_method_exception.<locals>.Callbacksc                 S   s@   d | _ d | _tjdt› �| j| j| jd�| _| jj	ddd� d S )Nr)   ri   rF   rE   rj   )
re   rf   r   r+   r   r!   rg   rC   r-   r,   r   r   r   r   Ú__init__$  s    üzKWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.__init__c                 S   s   t dƒ‚d S r_   ra   )r   r%   r   r   r   r!   /  s    zJWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.on_openc                 S   s   || _ || _d S r   )rf   re   )r   r-   rc   r   r   r   rg   2  s    zKWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.on_errorc                 S   s   |  ¡  d S r   rh   )r   r-   r%   r   r   r   rC   6  s    zJWebSocketAppTest.test_callback_method_exception.<locals>.Callbacks.on_pongN)r   r   r	   rn   r!   rg   rC   r   r   r   r   Ú	Callbacks#  s   ro   r`   N)r8   rf   r-   rk   re   rb   rl   )r   ro   Ú	callbacksr   r   r   Útest_callback_method_exception  s
    z/WebSocketAppTest.test_callback_method_exceptionc                    st   d‰d‰ ‡ fdd„}‡fdd„}t jdt› �||d�}|jd	d
dd� |  ˆd	¡ |  ˆ t j¡ |  tˆ ƒd¡ dS )zTest reconnectr   Nc                    s   |‰ d S r   r   )r%   rc   )re   r   r   rg   G  s    z1WebSocketAppTest.test_reconnect.<locals>.on_errorc                    s.   ˆ d7 ‰ ˆ dkr| j  ¡  ˆ dkr*|  ¡  d S )NrE   rF   )ÚsockÚshutdownr   r@   )Ú
pong_countr   r   rC   K  s
    
z0WebSocketAppTest.test_reconnect.<locals>.on_pongr)   )rC   rg   rF   rE   é   )rI   rJ   Z	reconnectzping/pong timed out)r   r+   r   r,   r8   rk   ZWebSocketTimeoutExceptionrl   )r   rg   rC   r-   r   )re   rt   r   Útest_reconnect?  s    
ÿzWebSocketAppTest.test_reconnectc                 C   s,   t  d¡}|jddd�}|  |t jj¡ dS )z!Test default dispatcher selectionúws://example.comé
   F©rJ   Zis_sslN)r   r+   Úcreate_dispatcherrk   Ú_dispatcherr0   ©r   r-   r1   r   r   r   Ú!test_dispatcher_selection_default^  s    
z2WebSocketAppTest.test_dispatcher_selection_defaultc                 C   s,   t  d¡}|jddd�}|  |t jj¡ dS )zTest SSL dispatcher selectionzwss://example.comrx   Try   N)r   r+   rz   rk   r{   ZSSLDispatcherr|   r   r   r   Útest_dispatcher_selection_sslf  s    
z.WebSocketAppTest.test_dispatcher_selection_sslc                 C   sb   ddl m} t d¡}|ƒ }|ƒ }|jd||d�}|  |tjj¡ |  |j	|¡ |  |j
|¡ dS )z Test custom dispatcher selectionr   )ÚMockrw   rx   )rJ   r1   ÚhandleDisconnectN)Zunittest.mockr   r   r+   rz   rk   r{   ZWrappedDispatcherr8   r1   r€   )r   r   r-   Zcustom_dispatcherZhandle_disconnectr1   r   r   r   Ú test_dispatcher_selection_customn  s    
ýz1WebSocketAppTest.test_dispatcher_selection_customc                 C   s:   t  d¡}|jddd�}|  |t jj¡ |  |jd¡ dS )z.Test dispatcher selection without ping timeoutrw   NFry   rx   )r   r+   rz   rk   r{   r0   r8   rJ   r|   r   r   r   Ú)test_dispatcher_selection_no_ping_timeout€  s    
z:WebSocketAppTest.test_dispatcher_selection_no_ping_timeoutN)r   r   r	   r   r   r   r   ÚunittestZ
skipUnlessÚTEST_WITH_LOCAL_SERVERr.   r2   r9   r   r>   rQ   rR   rU   rW   rY   r^   rm   rq   rv   r}   r~   r�   r‚   r   r   r   r   r   &   sX   ÿ


ÿ
















ÿ
ÿ
ÿ
r   Ú__main__)ÚosÚos.pathrN   r5   rƒ   Z	websocketr   ÚenvironÚgetr   r   r„   r   ZTestCaser   r   Úmainr   r   r   r   Ú<module>   s     f