U
    ‰d"  ã                   @   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dd„ Zdd„ Zedd„ ƒZedd„ ƒZd	d
„ ZdS )ÚAsyncIOLoopTestc                 C   s   t dd}|S ©NF)Zmake_current)r   )ÚselfÚio_loop© r   ú=/tmp/pip-unpacked-wheel-fekwu36z/tornado/test/asyncio_test.pyÚget_new_ioloop   s    
zAsyncIOLoopTest.get_new_ioloopc                    s&   ‡ fdd„}ˆ j  |ƒ ¡ ˆ  ¡  d S )Nc                   “   s   t  ¡  ˆ j¡ d S ©N)ÚasyncioÚget_event_loopÚ	call_soonÚstopr   ©r   r   r   Úadd_callback#   s    z;AsyncIOLoopTest.test_asyncio_callback.<locals>.add_callback)Úasyncio_loopÚ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	¡ t 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   Zset_event_loop)r   r0   r1   r   )r.   r,   r   Útest_asyncio_adapterD   s*    
þþþz$AsyncIOLoopTest.test_asyncio_adapterN)	Ú__name__Ú
__module__Ú__qualname__r   r   r	   r'   r+   r2   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 r   )r   Úcloser   Úget_event_loop_policyÚorig_policyÚset_event_loop_policyZDefaultEventLoopPolicyr   r   r   r   ÚsetUpq   s    
zLeakTest.setUpc                 C   s    t  ¡  ¡  ¡  t  | j¡ d S r   )r   r8   r   r7   r:   r9   r   r   r   r   ÚtearDowny   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   r7   r%   ©r   Z
orig_countÚiÚloopZ	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   r@   rA   r   Znew_event_loopr   Úcurrentr   Zrun_foreverr7   r%   rF   r   r   r   Útest_asyncio_close_leakˆ   s    

z LeakTest.test_asyncio_close_leakN)r3   r4   r5   r;   r<   rI   rL   r   r   r   r   r6   p   s   r6   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 )ÚAnyThreadEventLoopPolicyTestc                 C   s   t  ¡ | _tdƒ| _d S )NrJ   )r   r8   r9   r   Úexecutorr   r   r   r   r;   ˜   s    
z"AnyThreadEventLoopPolicyTest.setUpc                 C   s   t  | j¡ | j ¡  d S r   )r   r:   r9   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   r7   )rH   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   sv   t  ¡ d t  dt¡ |  ttf| j |¡j	¡ t
 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!   z>AnyThreadEventLoopPolicyTest.run_policy_test.<locals>.<lambda>)rB   rC   rD   rE   ÚassertRaisesÚRuntimeErrorÚAssertionErrorrN   rR   r*   r   r:   r   ZassertIsInstance)r   ÚaccessorZexpected_typer   r   r   Úrun_policy_test°   s    
 ÿ ÿz,AnyThreadEventLoopPolicyTest.run_policy_testc                 C   s   |   tjtj¡ d S r   )rY   r   r   ZAbstractEventLoopr   r   r   r   Útest_asyncio_accessorÁ   s    z2AnyThreadEventLoopPolicyTest.test_asyncio_accessorc                 C   s   |   tjt¡ d S r   )rY   r   rK   r   r   r   r   Útest_tornado_accessorÄ   s    z2AnyThreadEventLoopPolicyTest.test_tornado_accessorN)	r3   r4   r5   r;   r<   rT   rY   rZ   r[   r   r   r   r   rM   —   s   rM   )r   ZunittestrB   Úconcurrent.futuresr   Ztornador   Ztornado.ioloopr   Ztornado.platform.asyncior   r   r   Ztornado.testingr   r	   r
   ZTestCaser6   rM   r   r   r   r   Ú<module>   s   T'