a
    ñ»j†4  ã                   @   s¤   d dl Z d dlZd dlmZmZmZ d dlZd dlZd dlZd dl	m
Z
mZmZmZ G dd„ dƒZG dd„ dƒZG dd	„ d	ƒZG d
d„ dejƒZedkr e ¡  dS )é    N)ÚMockÚpatchÚ	MagicMock)Ú
DispatcherÚDispatcherBaseÚSSLDispatcherÚWrappedDispatcherc                   @   s   e Zd ZdZdd„ ZdS )ÚMockAppzMock WebSocketApp for testingc                 C   s   d| _ tƒ | _tƒ | j_d S ©NT)Úkeep_runningr   Úsock©Úself© r   úEE:\soccer\ml_env\Lib\site-packages\websocket/tests/test_dispatcher.pyÚ__init__&   s    zMockApp.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r	   #   s   r	   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
MockSocketzMock socket for testingc                 C   s
   d| _ d S ©NF©Úpending_returnr   r   r   r   r   /   s    zMockSocket.__init__c                 C   s   | j S ©Nr   r   r   r   r   Úpending2   s    zMockSocket.pendingN)r   r   r   r   r   r   r   r   r   r   r   ,   s   r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚMockDispatcherz6Mock external dispatcher for WrappedDispatcher testingc                 C   s"   g | _ g | _g | _g | _g | _d S r   )Úsignal_callsÚabort_callsÚ
read_callsÚbuffwrite_callsÚtimeout_callsr   r   r   r   r   9   s
    zMockDispatcher.__init__c                 C   s   | j  ||f¡ d S r   )r   Úappend)r   ÚsigÚhandlerr   r   r   Úsignal@   s    zMockDispatcher.signalc                 C   s   | j  d¡ d S r
   )r   r"   r   r   r   r   ÚabortC   s    zMockDispatcher.abortc                 C   s   | j  ||f¡ d S r   )r   r"   )r   r   Úcallbackr   r   r   ÚreadF   s    zMockDispatcher.readc                 C   s   | j  ||||f¡ d S r   )r    r"   )r   r   ÚdataZ	send_funcZdisconnect_handlerr   r   r   Ú	buffwriteI   s    zMockDispatcher.buffwritec                 G   s   | j  |||f¡ d S r   )r!   r"   )r   Úsecondsr'   Úargsr   r   r   ÚtimeoutL   s    zMockDispatcher.timeoutN)
r   r   r   r   r   r%   r&   r(   r*   r-   r   r   r   r   r   6   s   r   c                   @   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#S )$ÚDispatcherTestc                 C   s   t ƒ | _d S r   )r	   Úappr   r   r   r   ÚsetUpQ   s    zDispatcherTest.setUpc                 C   s.   t | jdƒ}|  |j| j¡ |  |jd¡ dS )z"Test DispatcherBase initializationç      >@N)r   r/   ÚassertEqualÚping_timeout)r   Ú
dispatcherr   r   r   Útest_dispatcher_base_initT   s    z(DispatcherTest.test_dispatcher_base_initc                 C   sf   t | jdƒ}tƒ }| d|¡ | ¡  | ¡  t ¡ }| d|¡ t ¡ | }| ¡  |  |d¡ dS )z"Test DispatcherBase timeout methodr1   Ngš™™™™™¹?gš™™™™™©?)r   r/   r   r-   Zassert_called_onceÚ
reset_mockÚtimeZassertGreaterEqual)r   r4   r'   Ú
start_timeÚelapsedr   r   r   Útest_dispatcher_base_timeout[   s    z+DispatcherTest.test_dispatcher_base_timeoutc                 C   sv   t | jdƒ}tƒ }| d|¡ |jdd� | ¡  tdƒ|_|  t¡� | d|¡ W d  ƒ n1 sh0    Y  dS )z$Test DispatcherBase reconnect methodr1   é   T)ZreconnectingzUser interruptedN)	r   r/   r   Ú	reconnectÚassert_called_once_withr6   ÚKeyboardInterruptÚside_effectZassertRaises)r   r4   Úreconnectorr   r   r   Útest_dispatcher_base_reconnectm   s    
z-DispatcherTest.test_dispatcher_base_reconnectc                 C   st   t | jdƒ}tƒ }d}tdƒ�B}t|ƒ|_| ||¡}| ||¡ |  |t|ƒ¡ W d  ƒ n1 sf0    Y  dS )zTest DispatcherBase send methodr1   ó	   test dataúwebsocket._dispatcher.sendN)	r   r/   r   r   ÚlenÚreturn_valueÚsendr=   r2   )r   r4   Ú	mock_sockÚ	test_dataÚ	mock_sendÚresultr   r   r   Útest_dispatcher_base_send}   s    

z(DispatcherTest.test_dispatcher_base_sendc                    s¬   t ˆ jdƒ}tdd�}tƒ }tƒ }tdƒ�n}tƒ }||_g |j_‡ fdd„}||j_| |||¡ |j 	¡  |j 
d¡ |j 	¡  | 	¡  W d  ƒ n1 sž0    Y  dS )zTest Dispatcher read methodç      @T©rE   úselectors.DefaultSelectorc                     s   dˆ j _g S r   ©r/   r   ©r,   r   r   r   r?   š   s    z8DispatcherTest.test_dispatcher_read.<locals>.side_effectN)r   r/   r   r   rE   Úselectr?   r(   ÚregisterÚassert_calledÚassert_called_withÚclose)r   r4   Úread_callbackÚcheck_callbackrG   Úmock_selector_classÚmock_selectorr?   r   r   r   Útest_dispatcher_readŠ   s    



z#DispatcherTest.test_dispatcher_readc                    s’   t ˆjdƒ}tdd�}tƒ }tƒ }tdƒ�T}tƒ }||_d‰ ‡ ‡fdd„}||j_| |||¡ | ¡  | ¡  W d  ƒ n1 s„0    Y  dS )	z2Test Dispatcher read method when data is availablerL   TrM   rN   r   c                     s&   ˆ d7 ‰ ˆ dkrdgS dˆj _g S d S )Nr;   TFrO   rP   ©Z
call_countr   r   r   Úselect_side_effect¶   s
    zIDispatcherTest.test_dispatcher_read_with_data.<locals>.select_side_effectN)	r   r/   r   r   rE   rQ   r?   r(   rS   )r   r4   rV   rW   rG   rX   rY   r\   r   r[   r   Útest_dispatcher_read_with_data¨   s    

	z-DispatcherTest.test_dispatcher_read_with_datac                    s    t ˆ jdƒ}tdd�}tƒ }tƒ }|ˆ jj_tdƒ�X}tƒ }||_g |j_‡ fdd„}||j_| 	d||¡ |j
 ¡  | ¡  W d  ƒ n1 s’0    Y  dS )zTest SSLDispatcher read methodrL   TrM   rN   c                     s   dˆ j _g S r   rO   rP   r   r   r   r?   Ö   s    z<DispatcherTest.test_ssl_dispatcher_read.<locals>.side_effectN)r   r/   r   r   r   r   rE   rQ   r?   r(   rR   rS   )r   r4   rV   rW   Úmock_ssl_sockrX   rY   r?   r   r   r   Útest_ssl_dispatcher_readÆ   s    



z'DispatcherTest.test_ssl_dispatcher_readc                 C   sF   t | jdƒ}tƒ }d|_|| jj_tƒ }| d|¡}|  ||g¡ dS )z2Test SSLDispatcher select method with pending datarL   TN)r   r/   r   r   r   r   rQ   r2   ©r   r4   r^   rY   rJ   r   r   r   Ú'test_ssl_dispatcher_select_with_pendingá   s    
z6DispatcherTest.test_ssl_dispatcher_select_with_pendingc                 C   s^   t | jdƒ}tƒ }d|_|| jj_tƒ }|dfg|j_| d|¡}|  ||¡ |j 	d¡ dS )z5Test SSLDispatcher select method without pending datarL   FN)
r   r/   r   r   r   r   rQ   rE   r2   rT   r`   r   r   r   Ú*test_ssl_dispatcher_select_without_pendingî   s    
z9DispatcherTest.test_ssl_dispatcher_select_without_pendingc                 C   sJ   t | jdƒ}tƒ }d|_|| jj_tƒ }g |j_| d|¡}|  |¡ dS )z0Test SSLDispatcher select method with no resultsrL   FN)	r   r/   r   r   r   r   rQ   rE   ZassertIsNoner`   r   r   r   Ú%test_ssl_dispatcher_select_no_resultsý   s    
z4DispatcherTest.test_ssl_dispatcher_select_no_resultsc                 C   s”   t ƒ }tƒ }t| jd||ƒ}|  |j| j¡ |  |jd¡ |  |j|¡ |  |j|¡ |  t|j	ƒd¡ |j	d \}}|  |d¡ |  ||j
¡ dS )z%Test WrappedDispatcher initializationç      $@r;   r   é   N)r   r   r   r/   r2   r3   r4   ZhandleDisconnectrD   r   r&   )r   Úmock_dispatcherÚhandle_disconnectÚwrappedr#   r$   r   r   r   Útest_wrapped_dispatcher_init  s    z+DispatcherTest.test_wrapped_dispatcher_initc                 C   s¤   t ƒ }tƒ }t| jd||ƒ}tƒ }tƒ }tƒ }| |||¡ |  t|jƒd¡ |  |jd ||f¡ |  t|jƒd¡ |jd }|  |d d¡ |  |d |¡ dS )z"Test WrappedDispatcher read methodrd   r;   r   N©	r   r   r   r/   r(   r2   rD   r   r!   )r   rf   rg   rh   rG   rV   rW   Ztimeout_callr   r   r   Útest_wrapped_dispatcher_read  s    
z+DispatcherTest.test_wrapped_dispatcher_readc                 C   sd   t ƒ }tƒ }t| jd||ƒ}tƒ }tƒ }tƒ }| |||¡ |  t|jƒd¡ |  t|jƒd¡ dS )z7Test WrappedDispatcher read method without ping timeoutNr;   r   rj   )r   rf   rg   rh   rG   rV   rW   r   r   r   Ú,test_wrapped_dispatcher_read_no_ping_timeout3  s    z;DispatcherTest.test_wrapped_dispatcher_read_no_ping_timeoutc           	      C   sÊ   t ƒ }tƒ }t| jd||ƒ}tƒ }d}tdƒ�ˆ}| ||¡}|  t|jƒd¡ |jd }|  |d |¡ |  |d |¡ |  |d |¡ |  |d |¡ |  |t|ƒ¡ W d  ƒ n1 s¼0    Y  dS )	z"Test WrappedDispatcher send methodrd   rB   rC   r;   r   re   é   N)	r   r   r   r/   r   rF   r2   rD   r    )	r   rf   rg   rh   rG   rH   rI   rJ   Úcallr   r   r   Útest_wrapped_dispatcher_sendE  s    

z+DispatcherTest.test_wrapped_dispatcher_sendc                 C   sŠ   t ƒ }tƒ }t| jd||ƒ}tƒ }d}|jd|g|¢R Ž  |  t|jƒd¡ |jd }|  |d d¡ |  |d |¡ |  |d |¡ dS )z%Test WrappedDispatcher timeout methodrd   )Zarg1Zarg2rL   r;   r   re   N)r   r   r   r/   r-   r2   rD   r!   )r   rf   rg   rh   r'   r,   rn   r   r   r   Útest_wrapped_dispatcher_timeout\  s    
z.DispatcherTest.test_wrapped_dispatcher_timeoutc                 C   s~   t ƒ }tƒ }t| jd||ƒ}tƒ }| d|¡ |  t|jƒd¡ |jd }|  |d d¡ |  |d |¡ |  |d d¡ dS )z'Test WrappedDispatcher reconnect methodrd   rm   r;   r   re   )TN)r   r   r   r/   r<   r2   rD   r!   )r   rf   rg   rh   r@   rn   r   r   r   Ú!test_wrapped_dispatcher_reconnectn  s    
z0DispatcherTest.test_wrapped_dispatcher_reconnectN)r   r   r   r0   r5   r:   rA   rK   rZ   r]   r_   ra   rb   rc   ri   rk   rl   ro   rp   rq   r   r   r   r   r.   P   s"   r.   Ú__main__)ÚsocketZunittestZunittest.mockr   r   r   Ú	threadingr7   Z	websocketZwebsocket._dispatcherr   r   r   r   r	   r   r   ZTestCaser.   r   Úmainr   r   r   r   Ú<module>   s   	
  2