U
    lufñ(  ã                   @   s¾   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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 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dS )é    N)ÚThreadPoolExecutor)Úgen)ÚIOLoop)ÚAsyncIOLoopÚto_asyncio_futureÚAnyThreadEventLoopPolicyÚAddThreadSelectorEventLoop)ÚAsyncTestCaseÚgen_testc                   @   sH   e Zd Zedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZ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-bmg6zs32/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   s,   t  t  ¡  d dd„ ¡¡V }|  |d¡ d S )Nc                   S   s   dS ©Né*   r   r   r   r   r   Ú<lambda>1   ó    z5AsyncIOLoopTest.test_asyncio_future.<locals>.<lambda>r   )r   Zensure_futurer   Úrun_in_executorÚassertEqual)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   Úf7   s    z2AsyncIOLoopTest.test_asyncio_yield_from.<locals>.fr   )r   Ú	coroutiner    )r   r#   Úresultr   r   r   Útest_asyncio_yield_from5   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_coroutineE   s    z?AsyncIOLoopTest.test_asyncio_adapter.<locals>.tornado_coroutinec                   “   s   ˆ ƒ I d H S r   r   r   ©r'   r   r   Ú native_coroutine_without_adapterJ   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_adapterM   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_adapter2Q   s    zLAsyncIOLoopTest.test_asyncio_adapter.<locals>.native_coroutine_with_adapter2r   )r   r$   r    r   Úrun_syncr   r   )r   r+   r,   r   )r)   r'   r   Útest_asyncio_adapter@   s(    
þþþz$AsyncIOLoopTest.test_asyncio_adapterc                 C   s    t t ¡ ƒ}| ¡  | ¡  d S r   )r   r   r   Úclose©r   Úloopr   r   r   Ú test_add_thread_close_idempotenth   s    z0AsyncIOLoopTest.test_add_thread_close_idempotentN)Ú__name__Ú
__module__Ú__qualname__Úpropertyr   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 )NF©Zmake_current)r   r/   r   Úget_event_loop_policyÚorig_policyÚset_event_loop_policyZDefaultEventLoopPolicyr   r   r   r   ÚsetUpo   s    
zLeakTest.setUpc                 C   s>   zt  ¡  ¡ }W n tk
r$   Y n
X | ¡  t  | j¡ d S r   )r   r9   r   Ú	Exceptionr/   r;   r:   r0   r   r   r   ÚtearDownw   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   r/   r    ©r   Z
orig_countÚir1   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?   é   )rA   r   rB   rC   r   Únew_event_loopr   Úcurrentr   Zrun_foreverr/   r    rH   r   r   r   Útest_asyncio_close_leakŒ   s    

z LeakTest.test_asyncio_close_leakN)r3   r4   r5   r<   r>   rJ   rN   r   r   r   r   r7   n   s   
r7   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 )ÚSelectorThreadLeakTestc                 C   s   t  |  ¡ ¡ t ¡ | _d S r   )r   ÚrunÚdummy_tornado_coroutineÚ	threadingÚactive_countÚorig_thread_countr   r   r   r   r<      s    zSelectorThreadLeakTest.setUpc                 C   sX   t   ¡ d }t   ¡ |k r@tt ¡ ƒ}t|ƒ| jkr4q@t  d¡ q|  t|ƒ| j|¡ d S )NrK   gš™™™™™¹?)ÚtimeÚlistrR   Ú	enumeraterA   rT   ÚsleepZassertLessEqual)r   ÚdeadlineÚthreadsr   r   r   Úassert_no_thread_leak£   s    z,SelectorThreadLeakTest.assert_no_thread_leakc                 Ã   s   t  ¡  d S r   )r   rM   r   r   r   r   rQ   ±   s    z.SelectorThreadLeakTest.dummy_tornado_coroutinec                 C   s(   t dƒD ]}t |  ¡ ¡ q|  ¡  d S ©Nr?   )rC   r   rP   rQ   r[   )r   rI   r   r   r   Útest_asyncio_runµ   s    z'SelectorThreadLeakTest.test_asyncio_runc                 C   sF   t dƒD ]0}t ¡ }| |  ¡ ¡ | | ¡ ¡ | ¡  q|  ¡  d S r\   )rC   r   rL   r   rQ   Zshutdown_asyncgensr/   r[   ©r   rI   r1   r   r   r   Útest_asyncio_manual»   s    
z*SelectorThreadLeakTest.test_asyncio_manualc                 C   s8   t dƒD ]"}tdd}| | j¡ | ¡  q|  ¡  d S )Nr?   Fr8   )rC   r   r-   rQ   r/   r[   r^   r   r   r   Útest_tornadoÄ   s
    

z#SelectorThreadLeakTest.test_tornadoN)	r3   r4   r5   r<   r[   rQ   r]   r_   r`   r   r   r   r   rO   ›   s   	rO   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 )NrK   )r   r9   r:   r   Úexecutorr   r   r   r   r<   Ï   s    
z"AnyThreadEventLoopPolicyTest.setUpc                 C   s   t  | j¡ | j ¡  d S r   )r   r;   r:   rb   Ú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   r/   )r1   r   r   r   Úget_and_close_event_loopØ   s    zWAnyThreadEventLoopPolicyTest.get_event_loop_on_thread.<locals>.get_and_close_event_loop)rb   Úsubmitr%   )r   re   Ú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   rd   r   r   r   r   r   ÷   r   zDAnyThreadEventLoopPolicyTest.test_asyncio_accessor.<locals>.<lambda>)rD   rE   rF   rG   ÚassertRaisesÚRuntimeErrorrb   rf   r   r   r%   r;   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   rd   r   r   r   r   r     r   zDAnyThreadEventLoopPolicyTest.test_tornado_accessor.<locals>.<lambda>c                   S   s   t  ¡  ¡ S r   rd   r   r   r   r   r     r   )rD   rE   rF   rG   rk   rb   rf   r   rM   r%   r   r;   r   r   r   r   r   Útest_tornado_accessorù   s    
z2AnyThreadEventLoopPolicyTest.test_tornado_accessorN)r3   r4   r5   r<   r>   rh   rl   rm   r   r   r   r   ra   Î   s
   ra   )r   rR   rU   ZunittestrD   Úconcurrent.futuresr   Ztornador   Ztornado.ioloopr   Ztornado.platform.asyncior   r   r   r   Ztornado.testingr	   r
   r   ZTestCaser7   rO   ra   r   r   r   r   Ú<module>   s   O-3