o
    Qœ_5d  ã                   @   s~  d dl mZ d dlm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
Z
d dlZd dlZd dlmZ d dlZd dlmZ d dlmZ d dlmZmZmZ d dlmZ d d	lmZmZmZmZ d d
lmZm Z  d dl!Z!e!j"rwd dl!m#Z# G dd„ deƒZ$G dd„ dej%ƒZ&G dd„ deƒZ'G dd„ deƒZ(G dd„ dej%ƒZ)G dd„ dej%ƒZ*G dd„ dej%ƒZ+e,dkr½e -¡  dS dS )é    )ÚThreadPoolExecutor)ÚfuturesN)Úmock)Ú
native_str)Úgen)ÚIOLoopÚTimeoutErrorÚPeriodicCallback)Úapp_log)ÚAsyncTestCaseÚbind_unused_portÚ	ExpectLogÚgen_test)ÚskipIfNonUnixÚskipOnTravis)ÚListc                   @   sü   e Zd Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Ze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/d0„ Zd1d2„ Zed3d4„ ƒZeed5d6„ ƒƒZ d7S )8Ú
TestIOLoopc                    s~   d| _ | j}| ‰|j‰ ‡ ‡fdd„}t ||¡|_| dd„ ¡ | dd„ ¡ | tjdd�|j¡ | 	¡  |  
| j d	¡ d S )
Nr   c                    s(   ˆ j d7  _ ˆ |g|¢R i |¤Ž d S ©Né   ©Úcalls)ÚselfÚcallbackÚargsÚkwargs©Úold_add_callbackÚtest© ú:/usr/lib/python3/dist-packages/tornado/test/ioloop_test.pyÚadd_callback%   s   zBTestIOLoop.test_add_callback_return_sequence.<locals>.add_callbackc                   S   s   i S ©Nr   r   r   r   r   Ú<lambda>*   ó    z>TestIOLoop.test_add_callback_return_sequence.<locals>.<lambda>c                   S   s   g S r!   r   r   r   r   r   r"   +   r#   é2   )Úmillisecondsé
   )r   Úio_loopr    ÚtypesÚ
MethodTypeÚadd_timeoutÚdatetimeÚ	timedeltaÚstopÚstartÚ
assertLess)r   Úloopr    r   r   r   Ú!test_add_callback_return_sequence   s   z,TestIOLoop.test_add_callback_return_sequencec                    s\   ‡fdd„‰ ‡ ‡fdd„}ˆj  ˆj  ¡ |¡ ˆ ¡  ˆjt ¡ ˆjdd� ˆ ˆj¡ d S )Nc                      s   dˆ _ ˆ  ¡  d S ©NT)Úcalledr-   r   ©r   r   r   r   4   ó   z5TestIOLoop.test_add_callback_wakeup.<locals>.callbackc                      s    dˆ_ ˆj ˆ ¡ t ¡ ˆ_d S ©NF)r3   r'   r    ÚtimeÚ
start_timer   ©r   r   r   r   Úschedule_callback8   s   z>TestIOLoop.test_add_callback_wakeup.<locals>.schedule_callbacké   )Úplaces)r'   r*   r7   ÚwaitÚassertAlmostEqualr8   Ú
assertTruer3   )r   r:   r   r9   r   Útest_add_callback_wakeup0   s   z#TestIOLoop.test_add_callback_wakeupc                    sT   ‡ fdd„}t j|d�}ˆ j |j¡ ˆ  ¡  t ¡ ˆ j }ˆ  |d¡ | 	¡  d S )Nc                      s&   t  d¡ t   ¡ ˆ _ˆ j ˆ j¡ d S )Nç{®Gáz„?)r7   ÚsleepÚ	stop_timer'   r    r-   r   r4   r   r   ÚtargetE   s   

z@TestIOLoop.test_add_callback_wakeup_other_thread.<locals>.target©rD   çš™™™™™¹?)
Ú	threadingÚThreadr'   r    r.   r=   r7   rC   r/   Újoin)r   rD   ÚthreadÚdeltar   r4   r   Ú%test_add_callback_wakeup_other_threadC   s   z0TestIOLoop.test_add_callback_wakeup_other_threadc                 C   s$   | j  tjdd�| j¡ |  ¡  d S )Nr   )Úmicroseconds)r'   r*   r+   r,   r-   r=   r4   r   r   r   Útest_add_timeout_timedeltaR   s   z%TestIOLoop.test_add_timeout_timedeltac              
   C   s~   t ƒ \}}z,| j | ¡ dd„ tj¡ |  t| jj| ¡ dd„ tj¡ W | j | ¡ ¡ | 	¡  d S | j | ¡ ¡ | 	¡  w )Nc                 S   ó   d S r!   r   ©ÚfdÚeventsr   r   r   r"   Z   r#   z.TestIOLoop.test_multiple_add.<locals>.<lambda>c                 S   rO   r!   r   rP   r   r   r   r"   b   r#   )
r   r'   Úadd_handlerÚfilenor   ÚREADÚassertRaisesÚ	ExceptionÚremove_handlerÚclose©r   ÚsockÚportr   r   r   Útest_multiple_addV   s    
ÿûÿ
zTestIOLoop.test_multiple_addc                 C   s4   t ƒ \}}z| j | ¡ ¡ W | ¡  d S | ¡  w r!   )r   r'   rX   rT   rY   rZ   r   r   r   Útest_remove_without_addi   s   
z"TestIOLoop.test_remove_without_addc                 C   s   | j  | j¡ |  ¡  d S r!   )r'   Úadd_callback_from_signalr-   r=   r4   r   r   r   Útest_add_callback_from_signalr   s   z(TestIOLoop.test_add_callback_from_signalc                 C   s<   t ƒ }tj|jd�}| ¡  | |j¡ | ¡  | ¡  d S )NrE   )r   rG   rH   r.   r_   r-   rI   rY   )r   Úother_iolooprJ   r   r   r   Ú*test_add_callback_from_signal_other_threadx   s   z5TestIOLoop.test_add_callback_from_signal_other_threadc                    sX   t  ¡ ‰ ‡ ‡fdd„}tƒ ‰t j|d�}| ¡  ˆ  ¡  tdƒD ]	}ˆ dd„ ¡ q d S )Nc                      s,   ˆ  ˆj¡ ˆ ¡  ˆ  ¡  ˆjdd� d S )NT©Úall_fds)r    r-   r.   ÚsetrY   r   ©Úclosingra   r   r   rD   ‰   s   z:TestIOLoop.test_add_callback_while_closing.<locals>.targetrE   éè  c                   S   rO   r!   r   r   r   r   r   r"   ”   r#   z<TestIOLoop.test_add_callback_while_closing.<locals>.<lambda>)rG   ÚEventr   rH   r.   r=   Úranger    )r   rD   rJ   Úir   rf   r   Útest_add_callback_while_closingƒ   s   ÿz*TestIOLoop.test_add_callback_while_closingc                    s’   t  ¡ \}}z9‡ fdd„}ˆ j | ¡ |tj¡ ˆ j ˆ j ¡ d t	 
|jd¡¡ ˆ  ¡  ˆ j | ¡ ¡ W | ¡  | ¡  d S | ¡  | ¡  w )Nc                    s   ˆ   |tj¡ ˆ  ¡  d S r!   )ÚassertEqualr   rU   r-   rP   r4   r   r   Úhandlerž   s   z5TestIOLoop.test_read_while_writeable.<locals>.handlerrA   s   asdf)ÚsocketÚ
socketpairr'   rS   rT   r   rU   r*   r7   Ú	functoolsÚpartialÚsendr=   rX   rY   )r   ÚclientÚserverrn   r   r4   r   Útest_read_while_writeable–   s   ÿÿ
z$TestIOLoop.test_read_while_writeablec                 C   s.   | j  | j  ¡ | j¡}|  ¡  | j  |¡ d S r!   )r'   r*   r7   r-   r=   Úremove_timeout©r   Úhandler   r   r   Útest_remove_timeout_after_fire¬   s   z)TestIOLoop.test_remove_timeout_after_firec                    sV   t dƒD ]}ˆ j ˆ j ¡ d dd„ ¡}ˆ j |¡ qˆ j ‡ fdd„¡ ˆ  ¡  d S )NiÐ  i  c                   S   rO   r!   r   r   r   r   r   r"   ¹   r#   z8TestIOLoop.test_remove_timeout_cleanup.<locals>.<lambda>c                      s   ˆ j  ˆ j¡S r!   ©r'   r    r-   r   r4   r   r   r"   ¼   s    )rj   r'   r*   r7   rw   r    r=   )r   rk   Útimeoutr   r4   r   Útest_remove_timeout_cleanup²   s
   z&TestIOLoop.test_remove_timeout_cleanupc                    sŒ   ddg‰ ˆj  ¡ }‡ ‡‡fdd„}ˆj  |d |¡ ‡ fdd„}ˆj  |d |¡‰ˆj  |d ˆj¡ t d¡ ˆ ¡  ˆ ˆ d	dg¡ d S )
NFc                      s   dˆ d< ˆj  ˆ¡ d S ©NTr   )r'   rw   r   ©r   r   Ú	t2_handler   r   Út1Ç   s   z7TestIOLoop.test_remove_timeout_from_timeout.<locals>.t1rA   c                      s   dˆ d< d S )NTr   r   r   r   r   r   Út2Í   ó   z7TestIOLoop.test_remove_timeout_from_timeout.<locals>.t2g{®Gáz”?g¸…ëQ¸ž?T)r'   r7   r*   r-   rB   r=   rm   )r   Únowr�   r‚   r   r   r   Ú test_remove_timeout_from_timeout¿   s   

z+TestIOLoop.test_remove_timeout_from_timeoutc                 C   s�   g }| j  | j  ¡ |jd¡ | j  tjdd�|jd¡ | j  | j  ¡ |jd¡ | j  d|jd¡ | j  d| j¡ |  	¡  |  
t|ƒg d¢¡ d S )Nr   r   )Úsecondsr;   é   é   )r   r;   r‡   rˆ   )r'   r*   r7   Úappendr+   r,   Úcall_atÚ
call_laterr-   r=   rm   Úsorted)r   Úresultsr   r   r   Útest_timeout_with_argumentsÖ   s   z&TestIOLoop.test_timeout_with_argumentsc                 C   ó6   | j  | j  ¡ dd„ ¡}|  |d u ¡ | j  |¡ d S )Nc                   S   rO   r!   r   r   r   r   r   r"   æ   r#   z4TestIOLoop.test_add_timeout_return.<locals>.<lambda>)r'   r*   r7   ÚassertFalserw   rx   r   r   r   Útest_add_timeout_returnã   s   z"TestIOLoop.test_add_timeout_returnc                 C   r�   )Nc                   S   rO   r!   r   r   r   r   r   r"   ë   r#   z0TestIOLoop.test_call_at_return.<locals>.<lambda>)r'   rŠ   r7   r�   rw   rx   r   r   r   Útest_call_at_returnê   s   zTestIOLoop.test_call_at_returnc                 C   s0   | j  ddd„ ¡}|  |d u ¡ | j  |¡ d S )Nr   c                   S   rO   r!   r   r   r   r   r   r"   ð   r#   z3TestIOLoop.test_call_later_return.<locals>.<lambda>)r'   r‹   r�   rw   rx   r   r   r   Útest_call_later_returnï   s   z!TestIOLoop.test_call_later_returnc                 C   sX   G dd„ dt ƒ}tƒ \}}||ƒ}tƒ }| |dd„ tj¡ |jdd� |  |j¡ dS )z¦When a file object is used instead of a numeric file descriptor,
        the object should be closed (by IOLoop.close(all_fds=True),
        not just the fd.
        c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z8TestIOLoop.test_close_file_object.<locals>.SocketWrapperc                 S   s   || _ d| _d S r6   )ÚsockobjÚclosed)r   r”   r   r   r   Ú__init__ý   s   
zATestIOLoop.test_close_file_object.<locals>.SocketWrapper.__init__c                 S   s
   | j  ¡ S r!   )r”   rT   r4   r   r   r   rT     ó   
z?TestIOLoop.test_close_file_object.<locals>.SocketWrapper.filenoc                 S   s   d| _ | j ¡  d S r2   )r•   r”   rY   r4   r   r   r   rY     s   z>TestIOLoop.test_close_file_object.<locals>.SocketWrapper.closeN)Ú__name__Ú
__module__Ú__qualname__r–   rT   rY   r   r   r   r   ÚSocketWrapperü   s    r›   c                 S   rO   r!   r   rP   r   r   r   r"     r#   z3TestIOLoop.test_close_file_object.<locals>.<lambda>Trc   N)Úobjectr   r   rS   rU   rY   r?   r•   )r   r›   r”   r\   Úsocket_wrapperr'   r   r   r   Útest_close_file_objectô   s   
z!TestIOLoop.test_close_file_objectc                    s  t ƒ \‰}g ‰ ‡ ‡‡fdd„}ˆj ˆ|tj¡ t t ¡ ¡�}| d|f¡ ˆ 	¡  W d  ƒ n1 s5w   Y  ˆj 
ˆ¡ ˆj ˆ ¡ |tj¡ t t ¡ ¡�}| d|f¡ ˆ 	¡  W d  ƒ n1 shw   Y  ˆ ˆ d ˆ¡ ˆ ˆ d ˆ ¡ ¡ ˆj 
ˆ ¡ ¡ ˆ ¡  dS )z>The handler callback receives the same fd object it passed in.c                    s*   ˆ   | ¡ ˆ ¡ \}}| ¡  ˆ ¡  d S r!   )r‰   ÚacceptrY   r-   )rQ   rR   ÚconnÚaddr©Úfdsr   Úserver_sockr   r   Úhandle_connection  s   
zGTestIOLoop.test_handler_callback_file_object.<locals>.handle_connectionz	127.0.0.1Nr   r   )r   r'   rS   r   rU   Ú
contextlibrg   ro   Úconnectr=   rX   rT   ÚassertIsrm   rY   )r   r\   r¥   Úclient_sockr   r¢   r   Ú!test_handler_callback_file_object  s$   

þ
þz,TestIOLoop.test_handler_callback_file_objectc                 C   s€   t ƒ \}}dd„ }| j ||tj¡ |  t¡� | j | ¡ |tj¡ W d   ƒ n1 s-w   Y  | j | ¡ ¡ | 	¡  d S )Nc                 S   rO   r!   r   rP   r   r   r   Úf+  ó   z+TestIOLoop.test_mixed_fd_fileobj.<locals>.f)
r   r'   rS   r   rU   rV   rW   rT   rX   rY   )r   r¤   r\   r«   r   r   r   Útest_mixed_fd_fileobj(  s   
ýz TestIOLoop.test_mixed_fd_fileobjc                    sP   dg‰dg‰ ‡ ‡‡fdd„}ˆj  |¡ ˆ ¡  ˆ ˆ d ¡ ˆ ˆd ¡ dS )z:Calling start() twice should raise an error, not deadlock.Fc                      s>   zˆj  ¡  dˆd< W n ty   dˆ d< Y nw ˆ ¡  d S r~   )r'   r.   rW   r-   r   ©Úgot_exceptionÚreturned_from_startr   r   r   r   ;  s   
ÿz+TestIOLoop.test_reentrant.<locals>.callbackr   N)r'   r    r=   r?   r�   ©r   r   r   r®   r   Útest_reentrant6  s   zTestIOLoop.test_reentrantc                 C   sV   | j  dd„ ¡ | j  | j¡ ttdƒ� |  ¡  W d  ƒ dS 1 s$w   Y  dS )z-Uncaught exceptions get logged by the IOLoop.c                   S   ó   dd S ©Nr   r   r   r   r   r   r   r"   J  ó    z3TestIOLoop.test_exception_logging.<locals>.<lambda>úException in callbackN)r'   r    r-   r   r
   r=   r4   r   r   r   Útest_exception_loggingH  s
   
"ÿz!TestIOLoop.test_exception_loggingc                    sV   t j‡ fdd„ƒ}ˆ j |¡ ttdƒ� ˆ  ¡  W d  ƒ dS 1 s$w   Y  dS )z:The IOLoop examines exceptions from Futures and logs them.c                      s   ˆ j  ˆ j¡ dd  d S r´   r{   r   r4   r   r   r   R  s   z:TestIOLoop.test_exception_logging_future.<locals>.callbackr¶   N)r   Ú	coroutiner'   r    r   r
   r=   r±   r   r4   r   Útest_exception_logging_futureO  s   
"ÿz(TestIOLoop.test_exception_logging_futurec                    sP   ‡ fdd„}ˆ j  |¡ ttdƒ� ˆ  ¡  W d  ƒ dS 1 s!w   Y  dS )z=The IOLoop examines exceptions from awaitables and logs them.c                   “   s"   �ˆ j  ˆ j jˆ j¡ dd  d S r´   r{   r   r4   r   r   r   ^  s   €z?TestIOLoop.test_exception_logging_native_coro.<locals>.callbackr¶   N)r'   r    r   r
   r=   r±   r   r4   r   Ú"test_exception_logging_native_coro[  s
   
"ÿz-TestIOLoop.test_exception_logging_native_coroc                 C   s¦   | j  dd„ ¡ | j  | j¡ ttdƒ� |  ¡  W d   ƒ n1 s#w   Y  | j  dd„ ¡ | j  | j¡ ttdƒ� |  ¡  W d   ƒ d S 1 sLw   Y  d S )Nc                   S   r³   r´   r   r   r   r   r   r"   k  rµ   z0TestIOLoop.test_spawn_callback.<locals>.<lambda>r¶   c                   S   r³   r´   r   r   r   r   r   r"   q  rµ   )r'   r    r-   r   r
   r=   Úspawn_callbackr4   r   r   r   Útest_spawn_callbackh  s   
ÿ
"ÿzTestIOLoop.test_spawn_callbackc                    s®   t  ¡ \‰‰zGˆ d¡ ˆ d¡ g ‰ ‡ ‡‡‡fdd„}ˆj ˆ|ˆjj¡ ˆj ˆ|ˆjj¡ ˆj dˆj¡ ˆ ¡  ˆ 	ˆ dg¡ W ˆ 
¡  ˆ 
¡  d S ˆ 
¡  ˆ 
¡  w )Ns   abcc                    s8   ˆ   |  d¡¡ | ˆu rˆj ˆ¡ d S ˆj ˆ¡ d S )Ni   )r‰   Úrecvr'   rX   rP   ©Úchunksrt   r   ru   r   r   Úhandle_read�  s   z@TestIOLoop.test_remove_handler_from_handler.<locals>.handle_readrF   )ro   rp   rs   r'   rS   rU   r‹   r-   r=   rm   rY   )r   rÀ   r   r¾   r   Ú test_remove_handler_from_handlerv  s   

ÿ
z+TestIOLoop.test_remove_handler_from_handlerc                 #   s.   � dd„ ‰ t  ‡ ‡fdd„tdƒD ƒ¡V  d S )Nc                  S   s    t dƒD ]	} tƒ }| ¡  qd S )Nr&   )rj   r   rY   )rk   r0   r   r   r   r«   ›  s   
þz*TestIOLoop.test_init_close_race.<locals>.fc                    s   g | ]	}ˆj  d ˆ ¡‘qS r!   )r'   Úrun_in_executor)Ú.0rk   ©r«   r   r   r   Ú
<listcomp>   s    z3TestIOLoop.test_init_close_race.<locals>.<listcomp>r;   )r   Úmultirj   r4   r   rÄ   r   Útest_init_close_race“  s   €$zTestIOLoop.test_init_close_raceN)!r˜   r™   rš   r1   r   r@   rL   rN   r]   r^   r`   rb   rl   r   rv   rz   r}   r…   rŽ   r‘   r’   r“   rž   rª   r­   r²   r·   r¹   rº   r¼   rÁ   r   rÇ   r   r   r   r   r      sD    

	

r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestIOLoopCurrentc                 C   s   d | _ t ¡  d S r!   )r'   r   Úclear_currentr4   r   r   r   ÚsetUp¦  r5   zTestIOLoopCurrent.setUpc                 C   s   | j d ur| j  ¡  d S d S r!   ©r'   rY   r4   r   r   r   ÚtearDownª  s   
ÿzTestIOLoopCurrent.tearDownc                 C   s>   t ƒ | _|  | jt  ¡ ¡ t ƒ }|  | jt  ¡ ¡ | ¡  d S r!   )r   r'   r¨   ÚcurrentrY   )r   Úio_loop2r   r   r   Útest_default_current®  s
   z&TestIOLoopCurrent.test_default_currentc                    st   t dd�ˆ _ˆ  t jdd�¡ tdƒD ]$}‡ fdd„}ˆ j |¡ ˆ j ¡  ˆ  ˆ jˆ j¡ ˆ  t jdd�¡ qd S )NF©Úmake_current)Úinstancer‡   c                      s&   t  ¡ ˆ _ˆ jd usJ ‚ˆ j ¡  d S r!   )r   rÍ   Úcurrent_io_loopr'   r-   r   r4   r   r   r«   ¿  s   
z-TestIOLoopCurrent.test_non_current.<locals>.f)	r   r'   ÚassertIsNonerÍ   rj   r    r.   r¨   rÓ   )r   rk   r«   r   r4   r   Útest_non_current·  s   
õz"TestIOLoopCurrent.test_non_currentc                 C   sh   t dd�| _|  | jt  ¡ ¡ |  t¡� t dd� W d   ƒ n1 s$w   Y  |  | jt  ¡ ¡ d S )NTrÐ   )r   r'   r¨   rÍ   rV   ÚRuntimeErrorr4   r   r   r   Útest_force_currentÊ  s   þz$TestIOLoopCurrent.test_force_currentN)r˜   r™   rš   rÊ   rÌ   rÏ   rÕ   r×   r   r   r   r   rÈ   ¥  s    	rÈ   c                   @   s   e Zd Zedd„ ƒZdS )ÚTestIOLoopCurrentAsyncc                 c   s>   � t dƒ�}| tj¡V  W d   ƒ d S 1 sw   Y  d S r   )r   Úsubmitr   rÉ   )r   Úer   r   r   Útest_clear_without_currentÕ  s   €
"ÿz1TestIOLoopCurrentAsync.test_clear_without_currentN)r˜   r™   rš   r   rÛ   r   r   r   r   rØ   Ô  s    rØ   c                   @   s8   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZd	S )
ÚTestIOLoopFuturesc                    s|   t  d¡�/}dd„ }ˆ j | |¡‡ fdd„¡ ˆ  ¡ }ˆ  | ¡ ¡ ˆ  | ¡ d u ¡ W d   ƒ d S 1 s7w   Y  d S )Nr   c                   S   rO   r!   r   r   r   r   r   Údummyâ  r¬   z8TestIOLoopFutures.test_add_future_threads.<locals>.dummyc                    s
   ˆ   | ¡S r!   )r-   )Úfuturer4   r   r   r"   æ  s   
 z;TestIOLoopFutures.test_add_future_threads.<locals>.<lambda>)	r   r   r'   Ú
add_futurerÙ   r=   r?   ÚdoneÚresult)r   ÚpoolrÝ   rÞ   r   r4   r   Útest_add_future_threadsß  s   ÿ"öz)TestIOLoopFutures.test_add_future_threadsc                 c   sX   � t  ¡ }t  ¡ }dd„ }t ¡  d |||¡t ¡  d |||¡gV }|  ||g|¡ d S )Nc                 S   ó   |   ¡  | ¡  | S r!   ©re   r=   ©Ú
self_eventÚother_eventr   r   r   Ú	sync_funcñ  s   z=TestIOLoopFutures.test_run_in_executor_gen.<locals>.sync_func)rG   ri   r   rÍ   rÂ   rm   )r   Úevent1Úevent2ré   Úresr   r   r   Útest_run_in_executor_genì  s   €þz*TestIOLoopFutures.test_run_in_executor_genc                 #   sP   � t  ¡ }t  ¡ }dd„ ‰ ‡ fdd„}|||ƒ|||ƒgV }|  ||g|¡ d S )Nc                 S   rä   r!   rå   ræ   r   r   r   ré     s   z@TestIOLoopFutures.test_run_in_executor_native.<locals>.sync_funcc                 “   s   �t  ¡  d ˆ | |¡I d H S r!   )r   rÍ   rÂ   ræ   ©ré   r   r   Úasync_wrapper  s   €
ÿzDTestIOLoopFutures.test_run_in_executor_native.<locals>.async_wrapper)rG   ri   rm   )r   rê   rë   rï   rì   r   rî   r   Útest_run_in_executor_native  s   €z-TestIOLoopFutures.test_run_in_executor_nativec                 #   s|   � dg‰ G ‡ fdd„dt jƒ}t ¡ ‰‡fdd„}|dƒ}t ¡ }| |¡ | d |¡V  |  dˆ d ¡ |  	ˆ 
¡ ¡ d S )Nr   c                       s   e Zd Z‡ ‡fdd„Z‡  ZS )z?TestIOLoopFutures.test_set_default_executor.<locals>.MyExecutorc                    s$   ˆd  d7  < t ƒ j|g|¢R Ž S )Nr   r   )ÚsuperrÙ   )r   Úfuncr   )Ú	__class__Úcountr   r   rÙ     s   zFTestIOLoopFutures.test_set_default_executor.<locals>.MyExecutor.submit)r˜   r™   rš   rÙ   Ú__classcell__r   )rô   )ró   r   Ú
MyExecutor  s    rö   c                      s   ˆ   ¡  d S r!   )re   r   )Úeventr   r   ré   #  rƒ   z>TestIOLoopFutures.test_set_default_executor.<locals>.sync_funcr   )r   r   rG   ri   r   rÍ   Úset_default_executorrÂ   rm   r?   Úis_set)r   rö   ré   Úexecutorr0   r   )rô   r÷   r   Útest_set_default_executor  s   €
z+TestIOLoopFutures.test_set_default_executorN)r˜   r™   rš   rã   r   rí   rð   rû   r   r   r   r   rÜ   Þ  s    

rÜ   c                   @   sT   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S )ÚTestIOLoopRunSyncc                 C   s   t ƒ | _d S r!   )r   r'   r4   r   r   r   rÊ   /  rƒ   zTestIOLoopRunSync.setUpc                 C   s   | j  ¡  d S r!   rË   r4   r   r   r   rÌ   2  s   zTestIOLoopRunSync.tearDownc                 C   sB   |   tj¡� | j dd„ ¡ W d   ƒ d S 1 sw   Y  d S )Nc                   S   s   dS ©Né*   r   r   r   r   r   r"   7  r#   z4TestIOLoopRunSync.test_sync_result.<locals>.<lambda>)rV   r   ÚBadYieldErrorr'   Úrun_syncr4   r   r   r   Útest_sync_result5  s   "ÿz"TestIOLoopRunSync.test_sync_resultc                 C   s@   |   t¡� | j dd„ ¡ W d   ƒ d S 1 sw   Y  d S )Nc                   S   r³   r´   r   r   r   r   r   r"   ;  rµ   z7TestIOLoopRunSync.test_sync_exception.<locals>.<lambda>)rV   ÚZeroDivisionErrorr'   r   r4   r   r   r   Útest_sync_exception9  s   "ÿz%TestIOLoopRunSync.test_sync_exceptionc                 C   s&   t jdd„ ƒ}|  | j |¡d¡ d S )Nc                   s   s   � t jV  t  d¡‚rý   )r   ÚmomentÚReturnr   r   r   r   r«   >  s   €
z.TestIOLoopRunSync.test_async_result.<locals>.frþ   )r   r¸   rm   r'   r   ©r   r«   r   r   r   Útest_async_result=  s   
z#TestIOLoopRunSync.test_async_resultc                 C   sJ   t jdd„ ƒ}|  t¡� | j |¡ W d   ƒ d S 1 sw   Y  d S )Nc                   s   s   � t jV  dd  d S r´   ©r   r  r   r   r   r   r«   F  s   €z1TestIOLoopRunSync.test_async_exception.<locals>.f)r   r¸   rV   r  r'   r   r  r   r   r   Útest_async_exceptionE  s
   
"ÿz&TestIOLoopRunSync.test_async_exceptionc                    s   ‡ fdd„}ˆ j  |¡ d S )Nc                      s   ˆ   t ¡ ˆ j¡ d S r!   )r¨   r   rÍ   r'   r   r4   r   r   r«   O  s   z)TestIOLoopRunSync.test_current.<locals>.f)r'   r   r  r   r4   r   Útest_currentN  s   zTestIOLoopRunSync.test_currentc                 C   s(   t jdd„ ƒ}| jt| jj|dd� d S )Nc                   s   s   � t  d¡V  d S r   )r   rB   r   r   r   r   r«   U  s   €z)TestIOLoopRunSync.test_timeout.<locals>.frA   )r|   )r   r¸   rV   r   r'   r   r  r   r   r   Útest_timeoutT  s   
zTestIOLoopRunSync.test_timeoutc                    s*   t jdd„ ƒ‰ ‡ fdd„}| j |¡ d S )Nc                   s   s   � t jV  d S r!   r  r   r   r   r   Úf1\  s   €z3TestIOLoopRunSync.test_native_coroutine.<locals>.f1c                   “   s   �ˆ ƒ I d H  d S r!   r   r   ©r  r   r   Úf2`  s   €z3TestIOLoopRunSync.test_native_coroutine.<locals>.f2)r   r¸   r'   r   )r   r  r   r  r   Útest_native_coroutine[  s   
z'TestIOLoopRunSync.test_native_coroutineN)r˜   r™   rš   rÊ   rÌ   r  r  r  r	  r
  r  r  r   r   r   r   rü   .  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S )ÚTestPeriodicCallbackMathc                 C   s<   g }d}||_ |D ]}| |¡ | |j ¡ |j | }q	|S )a9  Simulate a series of calls to the PeriodicCallback.

        Pass a list of call durations in seconds (negative values
        work to simulate clock adjustments during the call, or more or
        less equivalently, between calls). This method returns the
        times at which each call would be made.
        rh   )Ú_next_timeoutÚ_update_nextr‰   )r   ÚpcÚ	durationsr   r„   Údr   r   r   Úsimulate_callsg  s   
z'TestPeriodicCallbackMath.simulate_callsc                 C   rO   r!   r   r4   r   r   r   rÝ   x  r¬   zTestPeriodicCallbackMath.dummyc                 C   s.   t | jdƒ}|  |  |dgd ¡g d¢¡ d S )Né'  r   é   ©éò  éü  é  i  é  ©r	   rÝ   rm   r  ©r   r  r   r   r   Ú
test_basic{  s   ÿz#TestPeriodicCallbackMath.test_basicc                 C   s4   g d¢}g d¢}t | jdƒ}|  |  ||¡|¡ d S )N)é	   r!  r&   é   é   r#  é#   r$  r   r   r   )r  r  r  r  i.  iL  ij  i’  iº  iÄ  iÎ  r  r  )r   Úcall_durationsÚexpectedr  r   r   r   Útest_overrun�  s   z%TestPeriodicCallbackMath.test_overrunc                 C   sH   t | jdƒ}|  |  |g d¢¡g d¢¡ |  |  |g d¢¡g d¢¡ d S )Nr  )éþÿÿÿéÿÿÿÿéýÿÿÿr(  r   r  )iœÿÿÿr   r   )r  r  r  r  r  r   r   r   Útest_clock_backwards–  s
   ÿ 	z-TestPeriodicCallbackMath.test_clock_backwardsc                    s€   g d¢‰ g d¢}dgt ˆ ƒ }t| jddd�}‡ fdd„}t d	|¡� |  |  ||¡|¡ W d   ƒ d S 1 s9w   Y  d S )
N)ç      à?r   r   g      è?)r  g     ô�@r  g     E�@r   r  r,  )Újitterc                      s
   ˆ   d¡S )Nr   )Úpopr   ©Úrandom_timesr   r   Úmock_random­  r—   z9TestPeriodicCallbackMath.test_jitter.<locals>.mock_randomzrandom.random)Úlenr	   rÝ   r   Úpatchrm   r  )r   r&  r%  r  r1  r   r/  r   Útest_jitter§  s   "ÿz$TestPeriodicCallbackMath.test_jitterN)	r˜   r™   rš   r  rÝ   r   r'  r+  r4  r   r   r   r   r  f  s    r  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestIOLoopConfigurationc                 G   s4   ddgt |ƒ }tjdd |¡g}tt |¡ƒ ¡ S )Nz!from tornado.ioloop import IOLoopz*classname = lambda x: x.__class__.__name__z-cz; )ÚlistÚsysÚ
executablerI   r   Ú
subprocessÚcheck_outputÚstrip)r   Ú
statementsÚ	stmt_listr   r   r   r   Ú
run_pythonµ  s   þýz"TestIOLoopConfiguration.run_pythonc                 C   s0   |   d¡}|  |d¡ |   d¡}|  |d¡ d S )Nú"print(classname(IOLoop.current()))ÚAsyncIOMainLoopzprint(classname(IOLoop()))ÚAsyncIOLoop©r>  rm   ©r   Úclsr   r   r   Útest_default½  s   

z$TestIOLoopConfiguration.test_defaultc                 C   s   |   dd¡}|  |d¡ d S )Nz8IOLoop.configure("tornado.platform.asyncio.AsyncIOLoop")r?  r@  rB  rC  r   r   r   Útest_asyncioÄ  s
   þz$TestIOLoopConfiguration.test_asyncioc                 C   s   |   ddd¡}|  |d¡ d S )Nz4from tornado.platform.asyncio import AsyncIOMainLoopzAsyncIOMainLoop().install()r?  r@  rB  rC  r   r   r   Útest_asyncio_mainË  s   ýz)TestIOLoopConfiguration.test_asyncio_mainN)r˜   r™   rš   r>  rE  rF  rG  r   r   r   r   r5  ´  s
    r5  Ú__main__).Úconcurrent.futuresr   Ú
concurrentr   r¦   r+   rq   ro   r9  r7  rG   r7   r(   Úunittestr   Útornado.escaper   Útornador   Útornado.ioloopr   r   r	   Útornado.logr
   Útornado.testingr   r   r   r   Útornado.test.utilr   r   ÚtypingÚTYPE_CHECKINGr   r   ÚTestCaserÈ   rØ   rÜ   rü   r  r5  r˜   Úmainr   r   r   r   Ú<module>   sF       /
P8N ÿ