B
    ÐH/\L  ã               @   sd  d dl mZ d dlmZm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Zd dlmZ d dlmZ ejdd„ ƒZG d	d
„ d
e
jƒZG dd„ deƒZG dd„ deƒZd@dd„Zdd„ Zd\ZZZG dd„ deƒZdZdZe
jre
jse
jse
j rdZG dd„ deƒZ!G dd„ de!ƒZ"e
j#G dd„ de!ƒƒZ$e
j#G d d!„ d!e!ƒƒZ%G d"d#„ d#eƒZ&G d$d%„ d%eƒZ'd&d'„ Z(G d(d)„ d)eƒZ)G d*d+„ d+eƒZ*G d,d-„ d-eƒZ+G d.d/„ d/eƒZ,G d0d1„ d1eƒZ-G d2d3„ d3eƒZ.d4d5„ Z/G d6d7„ d7eƒZ0e1ej2d8ƒrNd d9l3m4Z5 d d:l3m6Z7 d d;l3m8Z9 d d<lm:Z: G d=d>„ d>eƒZ;e<d?kr`e
 =¡  dS )Aé    )Úprint_function)ÚtimeÚsleepN)Ú
ThreadPool)ÚExpectedException)ÚPYPYc              c   s.   t  ¡ } t  ¡  z
d V  W d | r(t  ¡  X d S )N)ÚgcÚ	isenabledÚdisableÚenable)Zwas_enabled© r   ú<lib/python3.7/site-packages/gevent/tests/test__threadpool.pyÚdisabled_gc   s    
r   c               @   s8   e Zd ZejZdZeZdd„ Z	ej
fdd„Zdd„ ZdS )ÚTestCaseNc             C   s   | j S )N)ÚClassUnderTest)Úselfr   r   r   Ú_FUT'   s    zTestCase._FUTc             C   s"   |   ¡ |ƒ | _}|r|| j_|S )N)r   ÚpoolÚsize)r   r   Úincreaser   r   r   r   Ú_makeOne*   s    zTestCase._makeOnec             C   sT   | j }|d k	rPt|dd ƒp"t|dƒ}|ƒ  ~| ` tjrPxtdƒD ]}t ¡  q@W d S )NÚkillZshutdowné   )r   ÚgetattrÚ	greentestÚRUN_LEAKCHECKSÚranger   Úcollect)r   r   r   Ú_r   r   r   Úcleanup1   s    zTestCase.cleanup)Ú__name__Ú
__module__Ú__qualname__r   ZLARGE_TIMEOUTZ__timeout__r   r   r   r   r   r   r   r   r   r   r   r   !   s   r   c               @   s2   e Zd Zdd„ Zdd„ Zdd„ Zde_dd	„ Zd
S )ÚPoolBasicTestsc             C   s¶   |   d¡}g }| |jd¡}| ¡  |  |dg¡ t d¡ | |jd¡ |  |dg¡ | |jd¡ |  |dg¡ | |jd¡ |  |dg¡ t d¡ |  t	|ƒdddd	g¡ d S )
Né   é   r   )r$   )r   )é   g{®Gáz„?r   r&   )
r   ÚspawnÚappendÚgetÚassertEqualÚgeventr   Úapply_asyncÚassertEqualFlakyRaceConditionÚsorted)r   r   ÚrÚfirstr   r   r   Útest_execute_asyncE   s    


z!PoolBasicTests.test_execute_asyncc             C   s*   |   d¡}| dd„ d¡}|  |d¡ d S )Nr%   c             S   s   d| fS )NÚfoor   )Úar   r   r   Ú<lambda>Z   s    z+PoolBasicTests.test_apply.<locals>.<lambda>)r%   )r2   r%   )r   Úapplyr*   )r   r   Úresultr   r   r   Ú
test_applyX   s    
zPoolBasicTests.test_applyc          	   C   s6   |   d¡}dd„ }|  t¡ | |¡ W d Q R X d S )Nr%   c               S   s
   t ƒ ‚d S )N)r   r   r   r   r   Úraiser`   s    z0PoolBasicTests.test_apply_raises.<locals>.raiser)r   ÚassertRaisesr   r5   )r   r   r8   r   r   r   Útest_apply_raises]   s    
z PoolBasicTests.test_apply_raisesFc          	   C   s*   d| _ |  t¡ |  d¡ W d Q R X d S )NFéÿÿÿÿ)Úswitch_expectedr9   Ú
ValueErrorr   )r   r   r   r   Útest_init_valueerrorj   s    z#PoolBasicTests.test_init_valueerrorN)r    r!   r"   r1   r7   r:   Úerror_fatalr>   r   r   r   r   r#   C   s
   r#   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTimingWrapperc             C   s   || _ d | _d S )N)ÚfuncÚelapsed)r   Zthe_funcr   r   r   Ú__init__u   s    zTimingWrapper.__init__c             O   s&   t ƒ }z| j||ŽS t ƒ | | _X d S )N)r   rA   rB   )r   ÚargsÚkwdsÚtr   r   r   Ú__call__y   s    zTimingWrapper.__call__N)r    r!   r"   rC   rG   r   r   r   r   r@   s   s   r@   ç        c             C   s   t |ƒ | |  S )N)r   )ÚxÚwaitr   r   r   Úsqr   s    rK   c             C   s   t t ¡ d ƒ | |  S )Ngš™™™™™¹?)r   Úrandom)rI   r   r   r   Úsqr_random_sleep†   s    rM   )gË¡E¶óý´?gìQ¸…ë¡?gìQ¸…ëÁ?c               @   s*   e Zd ZdZdZdd„ Zejdd„ ƒZdS )Ú_AbstractPoolTestr%   Fc             C   s   t j | ¡ |  | j¡ d S )N)r   r   ÚsetUpr   r   )r   r   r   r   rO   “   s    z_AbstractPoolTest.setUpc                sv   ˆ j j}ˆ jr‡ fdd„}ˆ  |ttdƒƒttttdƒƒƒ¡ ˆ  |ttdƒƒttttdƒƒƒ¡ ˆ j  ¡  ˆ ` ~d S )Nc                s   t ˆ j | |¡ƒS )N)Úlistr   Úmap)ÚfÚi)r   r   r   r4   ›   s    z,_AbstractPoolTest.test_map.<locals>.<lambda>é
   éd   )r   rQ   Ú
MAP_IS_GENr*   rK   r   rP   r   )r   Zpmapr   )r   r   Útest_map—   s    $$
z_AbstractPoolTest.test_mapN)	r    r!   r"   r   rV   rO   r   Úignores_leakcheckrW   r   r   r   r   rN      s   rN   rT   iè  é2   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!S )"ÚTestPoolc             C   s„   ddl m} ddlm} | j |¡}|  ||¡ t|ƒ}|  d|¡ |  d|¡ |  d|¡ ddl	m
} d |ƒ ¡}|  d	|¡ d S )
Nr   )Ú
getcurrent)Ú_WorkerGreenletZThreadPoolWorkerZthread_identzhub=)Úformat_run_infoÚ
z<ThreadPoolWorker)Zgreenletr[   Úgevent.threadpoolr\   r   r5   ZassertIsInstanceÚreprZassertInZgevent.utilr]   Újoin)r   r[   r\   Zworker_greenletr/   r]   Úinfor   r   r   Útest_greenlet_class±   s    zTestPool.test_greenlet_classc             C   s@   | j j}|  |tdƒtdƒ¡ |  |tdddiƒtdd¡ d S )N)é   rd   r   rI   r   )rI   )r   r5   r*   rK   )r   Zpapplyr   r   r   r7   Á   s    zTestPool.test_applyc             C   s>   | j  tdtf¡}t|jƒ}|  |ƒ d¡ |  |jtd¡ d S )Né   é1   r%   )	r   r,   rK   ÚTIMEOUT1r@   r)   r*   ÚassertTimeoutAlmostEqualrB   )r   Úresr)   r   r   r   Ú
test_asyncÆ   s    
zTestPool.test_asyncc             C   sd   g }| j jtdtf|jd}t|jƒ}|  |ƒ d¡ |  |j	td¡ t
 d¡ |dgks`t|ƒ‚d S )Nre   )Úcallbackrf   r%   r   )r   r,   rK   rg   r(   r@   r)   r*   rh   rB   r+   r   ÚAssertionError)r   r6   ri   r)   r   r   r   Útest_async_callbackÌ   s    

zTestPool.test_async_callbackc             C   sP   | j  tdtd f¡}t|jƒ}| jtj|td |  	|j
td¡ | j  ¡  d S )Né   gš™™™™™É?)Útimeoutr%   )r   r,   rK   ÚTIMEOUT2r@   r)   r9   r+   ZTimeoutrh   rB   ra   )r   ri   r)   r   r   r   Útest_async_timeoutÕ   s
    
zTestPool.test_async_timeoutc             C   s4   | j  tttƒ¡}|  t|ƒtttttƒƒƒ¡ d S )N)r   ÚimaprK   r   ÚSMALL_RANGEr*   rP   rQ   )r   Úitr   r   r   Útest_imap_list_smallÜ   s    zTestPool.test_imap_list_smallc             C   sJ   | j  tttƒ¡}x$ttƒD ]}|  t|ƒ|| ¡ qW |  tt|¡ d S )N)	r   rr   rK   r   rs   r*   Únextr9   ÚStopIteration)r   rt   rS   r   r   r   Útest_imap_it_smallà   s    zTestPool.test_imap_it_smallc             C   sJ   | j  tttƒ¡}x$ttƒD ]}|  t|ƒ|| ¡ qW |  tt|¡ d S )N)	r   rr   rK   r   ÚLARGE_RANGEr*   rv   r9   rw   )r   rt   rS   r   r   r   Útest_imap_it_largeæ   s    zTestPool.test_imap_it_largec             C   sR   | j  tttƒ¡}x,ttƒD ] }|  t|ƒ|| ¡ t ¡  qW |  	t
t|¡ d S )N)r   rr   rK   r   rs   r*   rv   r   r   r9   rw   )r   rt   rS   r   r   r   Útest_imap_gcì   s
    zTestPool.test_imap_gcc          	   C   s~   | j  tttƒ¡}g }x&ttƒD ]}| t|ƒ¡ t ¡  q W |  	t
¡ t|ƒ W d Q R X |  t|ƒdd„ ttƒD ƒ¡ d S )Nc             S   s   g | ]}|| ‘qS r   r   )Ú.0rI   r   r   r   ú
<listcomp>û   s    z3TestPool.test_imap_unordered_gc.<locals>.<listcomp>)r   Úimap_unorderedrK   r   rs   r(   rv   r   r   r9   rw   r*   r.   )r   rt   r6   r   r   r   r   Útest_imap_unordered_gcó   s    zTestPool.test_imap_unordered_gcc             C   s4   | j  tttƒ¡}|  t|ƒtttttƒƒƒ¡ d S )N)	r   rr   rM   r   rs   r*   rP   rQ   rK   )r   rt   r   r   r   Útest_imap_randomý   s    zTestPool.test_imap_randomc             C   sd   | j  tttƒ¡}|  t|ƒtttttƒƒƒ¡ | j  tttƒ¡}|  t|ƒtttttƒƒƒ¡ d S )N)	r   r~   rK   r   ry   r*   r.   rP   rQ   )r   rt   r   r   r   Útest_imap_unordered  s    zTestPool.test_imap_unorderedc             C   s4   | j  tttƒ¡}|  t|ƒttt	ttƒƒƒ¡ d S )N)
r   r~   rM   r   rs   r*   r.   rP   rQ   rK   )r   rt   r   r   r   Útest_imap_unordered_random  s    z#TestPool.test_imap_unordered_randomc             C   sh   | j pd}| j tdg|d  ¡}t d¡ t| jjƒ}|ƒ  |jd| j  d k s\t|jƒ‚| 	¡  d S )NrT   gš™™™™™¹?r$   g      à?)
r   r   Z	map_asyncr   r+   r@   r   rB   rl   ra   )r   r   r6   r   r   r   r   Útest_terminate  s    

zTestPool.test_terminatec             C   s   t t|ƒd ƒ t|ƒS )Ng      $@)r   ÚfloatÚstr)r   rI   r   r   r   r     s    zTestPool.sleepc             C   sL   t | j | jdddg¡ƒ}| jjdkr2dddg}n
dddg}|  ||¡ d S )NrT   r%   r$   Z10Ú1Ú2)rP   r   r~   r   r   r*   )r   r6   Zexpectedr   r   r   Útest_imap_unordered_sleep  s
    
z"TestPool.test_imap_unordered_sleepN)r    r!   r"   rc   r7   rj   rm   rq   ru   rx   rz   r{   r   r€   r   r‚   rƒ   r   rˆ   r   r   r   r   rZ   ¯   s    	
	rZ   c               @   s   e Zd ZdZejdd„ ƒZdS )Ú	TestPool2r$   c                s6   | j ‰‡ ‡fdd„}dd„ ‰ ˆ |¡}|  |d¡ d S )Nc                  s
   ˆ  ˆ ¡S )N)r5   r   )ÚbÚpr   r   r3   *  s    z)TestPool2.test_recursive_apply.<locals>.ac               S   s   t  ¡  t  d¡ dS )Ngü©ñÒMbP?ÚB)r+   r   r   r   r   r   rŠ   -  s    
z)TestPool2.test_recursive_apply.<locals>.brŒ   )r   r5   r*   )r   r3   r6   r   )rŠ   r‹   r   Útest_recursive_apply&  s
    
zTestPool2.test_recursive_applyN)r    r!   r"   r   r   rX   r   r   r   r   r   r‰   #  s   r‰   c               @   s   e Zd ZdZdS )Ú	TestPool3r   N)r    r!   r"   r   r   r   r   r   rŽ   9  s   rŽ   c               @   s   e Zd ZdZdS )Ú
TestPool10rT   N)r    r!   r"   r   r   r   r   r   r   =  s   r   c               @   s2   e Zd ZdZe ejo ejo ejd¡dd„ ƒZ	dS )ÚTestJoinEmptyFzqThis sometimes appears to crash in PyPy2 5.9.0, but never crashes on macOS or local Ubunto with same PyPy versionc             C   s   |   d¡}| ¡  d S )Nr%   )r   ra   )r   r   r   r   r   ÚtestV  s    
zTestJoinEmpty.testN)
r    r!   r"   r<   r   ZskipIfr   ZLIBUVZRUNNING_ON_TRAVISr‘   r   r   r   r   r   S  s   r   c               @   s   e Zd ZdZejdd„ ƒZdS )Ú	TestSpawnTc                s¼   |   d¡}|  t|ƒd¡ g ‰ ‡ fdd„}| |dd¡ |  t|ƒd¡ | |dd¡ |  t|ƒd¡ t d	¡ |  ˆ dg¡ |  t|ƒd¡ t d	¡ |  ˆ ddg¡ |  t|ƒd¡ d S )
Nr%   r   c                s   t |ƒˆ  | ¡gS )N)r   r(   )ÚitemZseconds)Úlogr   r   r4   h  s    z TestSpawn.test.<locals>.<lambda>r3   gš™™™™™¹?rŠ   r$   g333333Ã?)r   r*   Úlenr'   r+   r   )r   r   Zsleep_n_logr   )r”   r   r‘   c  s    


zTestSpawn.testN)r    r!   r"   r<   r   rX   r‘   r   r   r   r   r’   `  s   r’   c               c   s   dV  dV  t j‚d S )Nr%   r$   )r   r   r   r   r   r   Ú
error_iterw  s    r–   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestErrorInIteratorFc             C   s6   |   d¡| _|  tj| jjdd„ tƒ ¡ t d¡ d S )Nr   c             S   s   d S )Nr   )rI   r   r   r   r4   ƒ  s    z*TestErrorInIterator.test.<locals>.<lambda>gü©ñÒMbP?)	r   r   r9   r   r   rQ   r–   r+   r   )r   r   r   r   r‘     s    zTestErrorInIterator.testc                s4   ˆ   d¡ˆ _‡ fdd„}ˆ  tj|¡ t d¡ d S )Nr   c                  s   t ˆ j dd„ tƒ ¡ƒS )Nc             S   s   d S )Nr   )rI   r   r   r   r4   Š  s    zGTestErrorInIterator.test_unordered.<locals>.unordered.<locals>.<lambda>)rP   r   r~   r–   r   )r   r   r   Ú	unordered‰  s    z5TestErrorInIterator.test_unordered.<locals>.unorderedgü©ñÒMbP?)r   r   r9   r   r   r+   r   )r   r˜   r   )r   r   Útest_unordered†  s    z"TestErrorInIterator.test_unorderedN)r    r!   r"   r?   r‘   r™   r   r   r   r   r—   }  s   r—   c               @   s"   e Zd Zdd„ Zejdd„ ƒZdS )ÚTestMaxsizec             C   sv   |   d¡| _g }t | jj|jd¡ t d| jj|jd¡ t d¡ |  |g ¡ d| j_t d¡ |  	|ddg¡ d S )Nr   r%   g{®Gáz„?r$   g{®Gáz”?)
r   r   r+   r'   r(   Zspawn_laterr   r*   Úmaxsizer-   )r   Údoner   r   r   Útest_inc’  s    

zTestMaxsize.test_incc             C   sn   |   d¡ }| _| td¡ | td¡ | td¡ t d¡ |  |jd¡ d|_t d¡ |  |jd¡ d S )Nr   gš™™™™™¹?gš™™™™™É?g333333Ó?r   )	r   r   r'   r   r+   r*   r   r›   r-   )r   r   r   r   r   Útest_setzero   s    

zTestMaxsize.test_setzeroN)r    r!   r"   r   r   rX   rž   r   r   r   r   rš     s   rš   c               @   s   e Zd Ze ¡ dd„ ƒZdS )ÚTestSizec          	   C   sÂ   | j ddd }| _|  |jd¡ d|_|  |jd¡ d|_|  |jd¡ d|_|  |jd¡ |  t¡ d|_W d Q R X |  t¡ d|_W d Q R X d|_|  |jd¡ d|_|  |jd¡ d S )Nr$   F)r   r   r%   r;   r   )r   r   r*   r   r9   r=   )r   r   r   r   r   r‘   ¯  s     zTestSize.testN)r    r!   r"   r   Zreraises_flaky_race_conditionr‘   r   r   r   r   rŸ   ­  s   rŸ   c               @   s   e Zd Zdd„ ZdS )ÚTestRefc          	   C   sÈ   |   d¡ }| _g }tƒ }||_|j}~tƒ  | |tƒ fdtƒ i¡}t|tƒs^t	t
|ƒƒ‚t d¡ | t |¡¡ ~~trt ¡  t ¡  x|D ]}|  |ƒ ¡ q–W |  dt|ƒ¡ W d Q R X d S )Nr$   Úkwarg1gš™™™™™¹?r&   )r   r   Ú	SomeClassÚrefsrA   r   r5   ÚObjectÚ
isinstancerl   r`   r+   r   r(   ÚweakrefÚrefr   r   r   ZassertIsNoner*   r•   )r   r   r£   ÚobjrA   r6   r/   r   r   r   r‘   È  s$    

zTestRef.testN)r    r!   r"   r‘   r   r   r   r   r    Æ  s   r    c               @   s   e Zd ZdS )r¤   N)r    r!   r"   r   r   r   r   r¤   ä  s   r¤   c               @   s   e Zd ZdZddd„ZdS )r¢   Nc             C   s&   t ƒ }| j dd„ |||gD ƒ¡ |S )Nc             S   s   g | ]}t  |¡‘qS r   )r¦   r§   )r|   rI   r   r   r   r}   î  s    z"SomeClass.func.<locals>.<listcomp>)r¤   r£   Úextend)r   Zarg1r¡   r6   r   r   r   rA   ì  s    zSomeClass.func)N)r    r!   r"   r£   rA   r   r   r   r   r¢   è  s   r¢   c               C   s   d S )Nr   r   r   r   r   Únoopò  s    rª   c               @   s   e Zd Zdd„ ZdS )ÚTestRefCountc             C   s*   |   d¡}| t¡ t d¡ | ¡  d S )Nr%   r   )r   r'   rª   r+   r   r   )r   r   r   r   r   r‘   ø  s    


zTestRefCount.testN)r    r!   r"   r‘   r   r   r   r   r«   ö  s   r«   ÚThreadPoolExecutor)ÚTimeoutError)rJ   )Úas_completed)Úmonkeyc               @   sJ   e Zd ZdZdZejjZdZ	e
jdd„ ƒZe
jdd„ ƒZe
jdd	„ ƒZd
S )ÚTestTPEr%   TFc       	         sZ  |   t d¡| j¡ | j}g ‰ dd„ }dd„ }| |¡}d|_| |¡ | jt	|j
dd d	d
„ }t |¡}|   | 
¡ d¡ |  | ¡ ¡ |  | ¡ ¡ t ¡  |   |jd¡ |  | ¡ ¡ |   |jd¡ | ‡ fdd„¡ |   ˆ dg¡ t|fƒ\}}|   t|ƒ|g¡ |   tt|fƒƒ|g¡ |   |jd¡ t ¡  |   |jd¡ | ¡  ~~| `d S )NÚ	threadingc               S   s   t  d¡ dS )Ng      à?é*   )r+   r   r   r   r   r   Úfn  s    
zTestTPE.test_future.<locals>.fnc             S   s   |  j d7  _ t d¡‚d S )Nr%   zExpected, ignored)Ú
calledbackr   r   )Úfuturer   r   r   rk     s    z%TestTPE.test_future.<locals>.callbackr   gü©ñÒMbP?)ro   c               S   s   dS )Nià  r   r   r   r   r   Úspawned$  s    z$TestTPE.test_future.<locals>.spawnedr²   r%   ià  c                s
   ˆ   d¡S )NT)r(   )rR   )r´   r   r   r4   8  s    z%TestTPE.test_future.<locals>.<lambda>T)r*   r¯   Úis_module_patchedÚMONKEY_PATCHEDr   Úsubmitr´   Zadd_done_callbackr9   ÚFutureTimeoutErrorr6   r+   r'   Ú
assertTruerœ   ZassertFalseZ	cancelledr   ÚreadyÚvalueÚcf_waitrP   Úcf_as_completedr   )	r   r   r³   rk   rµ   r¶   Úspawned_greenletrœ   Ú	_not_doner   )r´   r   Útest_future  s>    


zTestTPE.test_futurec       
      C   sÊ   |   t d¡| j¡ | j}dd„ }| |¡}| jr¦t|fdd\}}|   t|ƒ|g¡ dd„ }t 	|¡}t|fƒ\}}	|   t|ƒ|g¡ |  
| ¡ ¡ |   |jd¡ n|  tt|f¡ | ¡  ~~| `d S )	Nr±   c               S   s   t  d¡ dS )Ng      à?r²   )r+   r   r   r   r   r   r³   S  s    
z4TestTPE.test_future_wait_module_function.<locals>.fngü©ñÒMbP?)ro   c               S   s   dS )Nià  r   r   r   r   r   r¶   ]  s    z9TestTPE.test_future_wait_module_function.<locals>.spawnedià  )r*   r¯   r·   r¸   r   r¹   r¾   rP   r+   r'   r»   r¼   r½   r9   ÚAttributeErrorr   )
r   r   r³   rµ   Z_doneZnot_doner¶   rÀ   rœ   rÁ   r   r   r   Ú test_future_wait_module_functionK  s&    

z(TestTPE.test_future_wait_module_functionc             C   sŒ   |   t d¡| j¡ | j}dd„ }| |¡}dd„ }t |¡}t |f¡}|   t	|ƒ|g¡ |  
| ¡ ¡ |   |jd¡ | ¡  ~~| `d S )Nr±   c               S   s   t  d¡ dS )Ng      à?r²   )r+   r   r   r   r   r   r³   v  s    
z4TestTPE.test_future_wait_gevent_function.<locals>.fnc               S   s   dS )Nià  r   r   r   r   r   r¶   |  s    z9TestTPE.test_future_wait_gevent_function.<locals>.spawnedià  )r*   r¯   r·   r¸   r   r¹   r+   r'   rJ   rP   r»   r¼   r½   r   )r   r   r³   rµ   r¶   rÀ   rœ   r   r   r   Ú test_future_wait_gevent_functiono  s    

z(TestTPE.test_future_wait_gevent_functionN)r    r!   r"   r   rV   r+   Ú
threadpoolr¬   r   r¸   r   rX   rÂ   rÄ   rÅ   r   r   r   r   r°     s   <$r°   Ú__main__)rH   )>Z
__future__r   r   r   Ú
contextlibrL   r¦   r   Zgevent.testingZtestingr   r_   r+   r   r   r   Úcontextmanagerr   r   r#   Úobjectr@   rK   rM   rg   rp   ZTIMEOUT3rN   rs   ry   ZWINZRUN_COVERAGEr   rZ   r‰   rX   rŽ   r   r   r’   r–   r—   rš   rŸ   r    r¤   r¢   rª   r«   ÚhasattrrÆ   Zconcurrent.futuresr­   rº   rJ   r¾   r®   r¿   r¯   r°   r    Úmainr   r   r   r   Ú<module>   sb   "0

 t
 
