U
    ‰ª/e™   ã                   @   s˜   d dl Z d dlZd dlZd dlm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mZ G dd„ deƒZG d	d
„ d
ejƒZG dd„ dejƒZdS )é    N)ÚThreadPoolExecutor)Úgen)ÚIOLoop)ÚAsyncIOLoopÚto_asyncio_futureÚAnyThreadEventLoopPolicy)ÚAsyncTestCaseÚgen_testc                   @   s@   e Zd Zedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZd	d
„ Z	dS )ÚAsyncIOLoopTestc                 C   s   | j jS ©N)Úio_loopÚasyncio_loop©Úself© r   ú=/tmp/pip-unpacked-wheel-u_oqpzhd/tornado/test/asyncio_test.pyr      s    zAsyncIOLoopTest.asyncio_loopc                    s&   ‡ fdd„}ˆ j  |ƒ ¡ ˆ  ¡  d S )Nc                   “   s   t  ¡  ˆ j¡ d S r   )ÚasyncioÚget_event_loopÚ	call_soonÚstopr   r   r   r   Úadd_callback#   s    z;AsyncIOLoopTest.test_asyncio_callback.<locals>.add_callback)r   Úrun_until_completeÚwait)r   r   r   r   r   Útest_asyncio_callback!   s    z%AsyncIOLoopTest.test_asyncio_callbackc                 c   sF   t tdƒrtj}n
ttdƒ}|t ¡  d dd„ ¡ƒV }|  |d¡ d S )NÚensure_futureÚasyncc                   S   s   dS ©Né*   r   r   r   r   r   Ú<lambda>5   ó    z5AsyncIOLoopTest.test_asyncio_future.<locals>.<lambda>r   )Úhasattrr   r   Úgetattrr   Úrun_in_executorÚassertEqual)r   r   Úxr   r   r   Útest_asyncio_future)   s    

ÿz#AsyncIOLoopTest.test_asyncio_futurec                 c   s&   t jdd„ ƒ}|ƒ V }|  |d¡ d S )Nc                  s   s"   t  ¡ } |  d dd„ ¡E d H }|S )Nc                   S   s   dS r   r   r   r   r   r   r   >   r   zDAsyncIOLoopTest.test_asyncio_yield_from.<locals>.f.<locals>.<lambda>)r   r   r"   )Z
event_loopr$   r   r   r   Úf;   s    z2AsyncIOLoopTest.test_asyncio_yield_from.<locals>.fr   )r   Ú	coroutiner#   )r   r&   Úresultr   r   r   Útest_asyncio_yield_from9   s    
z'AsyncIOLoopTest.test_asyncio_yield_fromc                    s´   t jdd„ ƒ‰‡fdd„‰ ‡fdd„}‡ fdd„}|  | j ˆ ¡d	¡ |  | j |¡d	¡ |  | j |¡d	¡ |  | j ˆ ƒ ¡d	¡ |  | j |ƒ ¡d	¡ |  | j |ƒ ¡d	¡ d S )
Nc                   s   s   t jV  t  d¡‚d S r   )r   ZmomentZReturnr   r   r   r   Útornado_coroutineI   s    z?AsyncIOLoopTest.test_asyncio_adapter.<locals>.tornado_coroutinec                   “   s   ˆ ƒ I d H S r   r   r   ©r*   r   r   Ú native_coroutine_without_adapterN   s    zNAsyncIOLoopTest.test_asyncio_adapter.<locals>.native_coroutine_without_adapterc                   “   s   t ˆ ƒ ƒI d H S r   ©r   r   r+   r   r   Únative_coroutine_with_adapterQ   s    zKAsyncIOLoopTest.test_asyncio_adapter.<locals>.native_coroutine_with_adapterc                   “   s   t ˆ ƒ ƒI d H S r   r-   r   )r,   r   r   Únative_coroutine_with_adapter2U   s    zLAsyncIOLoopTest.test_asyncio_adapter.<locals>.native_coroutine_with_adapter2r   )r   r'   r#   r   Zrun_syncr   r   )r   r.   r/   r   )r,   r*   r   Útest_asyncio_adapterD   s(    
þþþz$AsyncIOLoopTest.test_asyncio_adapterN)
Ú__name__Ú
__module__Ú__qualname__Úpropertyr   r   r	   r%   r)   r0   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	S )
ÚLeakTestc                 C   s*   t dd ¡  t ¡ | _t t ¡ ¡ d S )NF)Zmake_current)r   Úcloser   Úget_event_loop_policyÚorig_policyÚset_event_loop_policyZDefaultEventLoopPolicyr   r   r   r   ÚsetUpn   s    
zLeakTest.setUpc                 C   s>   zt  ¡  ¡ }W n tk
r$   Y n
X | ¡  t  | j¡ d S r   )r   r7   r   Ú	Exceptionr6   r9   r8   )r   Úloopr   r   r   ÚtearDownv   s    zLeakTest.tearDownc              
   C   sd   t tjƒ}tdƒD ]2}t ¡   t dt¡ tƒ }| 	¡  W 5 Q R X qt tjƒ| }|  
|d¡ d S )Né
   Úignorer   )Úlenr   Ú_ioloop_for_asyncioÚrangeÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningr   r6   r#   ©r   Z
orig_countÚir<   Z	new_countr   r   r   Útest_ioloop_close_leak€   s    

zLeakTest.test_ioloop_close_leakc                 C   sf   t tjƒ}tdƒD ]4}t ¡ }| tj¡ | |j¡ | 	¡  | 
¡  qt tjƒ| }|  |d¡ d S )Nr>   é   )r@   r   rA   rB   r   Znew_event_loopr   Úcurrentr   Zrun_foreverr6   r#   rG   r   r   r   Útest_asyncio_close_leak‹   s    

z LeakTest.test_asyncio_close_leakN)r1   r2   r3   r:   r=   rI   rL   r   r   r   r   r5   m   s   
r5   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚAnyThreadEventLoopPolicyTestc                 C   s   t  ¡ | _tdƒ| _d S )NrJ   )r   r7   r8   r   Úexecutorr   r   r   r   r:   ›   s    
z"AnyThreadEventLoopPolicyTest.setUpc                 C   s   t  | j¡ | j ¡  d S r   )r   r9   r8   rN   Úshutdownr   r   r   r   r=   Ÿ   s    z%AnyThreadEventLoopPolicyTest.tearDownc                 C   s   dd„ }| j  |¡}| ¡ S )Nc                  S   s   t  ¡ } |  ¡  | S )a#  Get the event loop. Close it if one is returned.

            Returns the (closed) event loop. This is a silly thing
            to do and leaves the thread in a broken state, but it's
            enough for this test. Closing the loop avoids resource
            leak warnings.
            ©r   r   r6   )r<   r   r   r   Úget_and_close_event_loop¤   s    zWAnyThreadEventLoopPolicyTest.get_event_loop_on_thread.<locals>.get_and_close_event_loop)rN   Úsubmitr(   )r   rQ   Úfuturer   r   r   Úget_event_loop_on_thread£   s    z5AnyThreadEventLoopPolicyTest.get_event_loop_on_threadc              	   C   sx   t  ¡ f t  dt¡ |  t| j tj	¡j
¡ t tƒ ¡ |  | j tj	¡ 
¡ tj¡ | j dd„ ¡ 
¡  W 5 Q R X d S )Nr?   c                   S   s   t  ¡  ¡ S r   rP   r   r   r   r   r   Ã   r   zDAnyThreadEventLoopPolicyTest.test_asyncio_accessor.<locals>.<lambda>)rC   rD   rE   rF   ÚassertRaisesÚRuntimeErrorrN   rR   r   r   r(   r9   r   ÚassertIsInstanceZAbstractEventLoopr   r   r   r   Útest_asyncio_accessor³   s    
 ÿþz2AnyThreadEventLoopPolicyTest.test_asyncio_accessorc              	   C   sŒ   t  ¡ z t  dt¡ |  | j tj¡ 	¡ t¡ | j dd„ ¡ 	¡  t
 tƒ ¡ |  | j tj¡ 	¡ t¡ | j dd„ ¡ 	¡  W 5 Q R X d S )Nr?   c                   S   s   t  ¡  ¡ S r   rP   r   r   r   r   r   Í   r   zDAnyThreadEventLoopPolicyTest.test_tornado_accessor.<locals>.<lambda>c                   S   s   t  ¡  ¡ S r   rP   r   r   r   r   r   Ñ   r   )rC   rD   rE   rF   rW   rN   rR   r   rK   r(   r   r9   r   r   r   r   r   Útest_tornado_accessorÅ   s    
z2AnyThreadEventLoopPolicyTest.test_tornado_accessorN)r1   r2   r3   r:   r=   rT   rX   rY   r   r   r   r   rM   š   s
   rM   )r   ZunittestrC   Úconcurrent.futuresr   Ztornador   Ztornado.ioloopr   Ztornado.platform.asyncior   r   r   Ztornado.testingr   r	   r
   ZTestCaser5   rM   r   r   r   r   Ú<module>   s   Q-