B
    ÐH/\eU  ã               @   sn  d Z ddlZddlZyddlmZmZ W n$ ek
rL   ddlmZmZ Y nX ddlZddl	Z	yddl
mZ W n  ek
rŽ   ddl
mZ Y nX ddlmZ dd„ ZG d	d
„ d
eƒZG dd„ dee	jƒ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 dd„ deƒ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edkrjed ƒ dS )!z/
Various tests for synchronization primitives.
é    N)Ústart_new_threadÚ	get_ident)Úsupport)Útest_support)ÚTimeAssertMixinc               C   s   t  d¡ d S )Ng{®Gáz„?)ÚtimeÚsleep© r	   r	   ú6lib/python3.7/site-packages/gevent/tests/lock_tests.pyÚ_wait   s    r   c               @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚBunchz
    A bunch of threads.
    Fc                sN   ˆ ˆ_ |ˆ_g ˆ_g ˆ_| ˆ_‡ ‡fdd„}xt|ƒD ]}t|dƒ q8W dS )z¹
        Construct a bunch of `n` threads running the same function `f`.
        If `wait_before_exit` is True, the threads won't terminate until
        do_finish() is called.
        c           	      sB   t ƒ } ˆj | ¡ z
ˆ ƒ  W d ˆj | ¡ xˆjs:tƒ  q,W X d S )N)r   ÚstartedÚappendÚfinishedÚ	_can_exitr   )Útid)ÚfÚselfr	   r
   Útask(   s    
zBunch.__init__.<locals>.taskr	   N)r   Únr   r   r   Úranger   )r   r   r   Zwait_before_exitr   Ú_r	   )r   r   r
   Ú__init__   s    	zBunch.__init__c             C   s    xt | jƒ| jk rtƒ  qW d S )N)Úlenr   r   r   )r   r	   r	   r
   Úwait_for_started4   s    zBunch.wait_for_startedc             C   s    xt | jƒ| jk rtƒ  qW d S )N)r   r   r   r   )r   r	   r	   r
   Úwait_for_finished8   s    zBunch.wait_for_finishedc             C   s
   d| _ d S )NT)r   )r   r	   r	   r
   Ú	do_finish<   s    zBunch.do_finishN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r	   r	   r	   r
   r      s
   
r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚBaseTestCasec             C   s   t  ¡ | _d S )N)r   Zthreading_setupÚ_threads)r   r	   r	   r
   ÚsetUpA   s    zBaseTestCase.setUpc             C   s   t j| jŽ  t  ¡  d S )N)r   Zthreading_cleanupr"   Zreap_children)r   r	   r	   r
   ÚtearDownD   s    zBaseTestCase.tearDownN)r   r   r   r#   r$   r	   r	   r	   r
   r!   @   s   r!   c               @   sX   e Zd 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 )ÚBaseLockTestsz;
    Tests for both recursive and non-recursive locks.
    c             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r   r	   r	   r
   ÚlocktypeN   s    zBaseLockTests.locktypec             C   s   |   ¡ }~d S )N)r'   )r   Úlockr	   r	   r
   Útest_constructorQ   s    zBaseLockTests.test_constructorc             C   s   |   ¡ }| ¡  ~d S )N)r'   Úacquire)r   r(   r	   r	   r
   Útest_acquire_destroyU   s    z"BaseLockTests.test_acquire_destroyc             C   s   |   ¡ }| ¡  | ¡  ~d S )N)r'   r*   Úrelease)r   r(   r	   r	   r
   Útest_acquire_releaseZ   s    z"BaseLockTests.test_acquire_releasec             C   s$   |   ¡ }|  | d¡¡ | ¡  d S )NF)r'   Ú
assertTruer*   r,   )r   r(   r	   r	   r
   Útest_try_acquire`   s    zBaseLockTests.test_try_acquirec                sJ   |   ¡ ‰ ˆ  ¡  g ‰‡ ‡fdd„}t|dƒ ¡  |  ˆd ¡ ˆ  ¡  d S )Nc                  s   ˆ  ˆ  d¡¡ d S )NF)r   r*   r	   )r(   Úresultr	   r
   r   i   s    z3BaseLockTests.test_try_acquire_contended.<locals>.fé   r   )r'   r*   r   r   ÚassertFalser,   )r   r   r	   )r(   r0   r
   Útest_try_acquire_contendede   s    z(BaseLockTests.test_try_acquire_contendedc                sp   |   ¡ ‰ ˆ  ¡  d}‡ fdd„}t||ƒ}| ¡  tƒ  |  t|jƒd¡ ˆ  ¡  | 	¡  |  t|jƒ|¡ d S )Né   c                  s   ˆ   ¡  ˆ  ¡  d S )N)r*   r,   r	   )r(   r	   r
   r   s   s    z/BaseLockTests.test_acquire_contended.<locals>.fr   )
r'   r*   r   r   r   ÚassertEqualr   r   r,   r   )r   ÚNr   Úbr	   )r(   r
   Útest_acquire_contendedo   s    
z$BaseLockTests.test_acquire_contendedc                sV   |   ¡ ‰ ‡ fdd„}d‡ fdd„	}|ƒ  t|dƒ ¡  |  t|t¡ t|dƒ ¡  d S )Nc                  s   ˆ   ¡  ˆ  ¡  d S )N)r*   r,   r	   )r(   r	   r
   r      s    z"BaseLockTests.test_with.<locals>.fc          	      s    ˆ  | d k	r| ‚W d Q R X d S )Nr	   )Úerr)r(   r	   r
   Ú_with„   s    z&BaseLockTests.test_with.<locals>._withr1   )N)r'   r   r   ÚassertRaisesÚ	TypeError)r   r   r:   r	   )r(   r
   Ú	test_with   s    zBaseLockTests.test_withc                sF   |   ¡ ‰ ‡ fdd„}tt ¡ ƒ}t|dƒ ¡  |  |tt ¡ ƒ¡ d S )Nc                  s   ˆ   ¡  ˆ  ¡  d S )N)r*   r,   r	   )r(   r	   r
   r   “   s    z)BaseLockTests.test_thread_leak.<locals>.fé   )r'   r   Ú	threadingÚ	enumerater   r   r5   )r   r   r   r	   )r(   r
   Útest_thread_leak   s
    zBaseLockTests.test_thread_leakN)r   r   r   r    r'   r)   r+   r-   r/   r3   r8   r=   rA   r	   r	   r	   r
   r%   I   s   
r%   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	LockTestszn
    Tests for non-recursive, weak locks
    (which can be acquired and released from different threads).
    c                s~   |   ¡ ‰ g ‰‡ ‡fdd„}t|dƒ xˆs2tƒ  q&W tƒ  |  tˆƒd¡ ˆ  ¡  xtˆƒdkrhtƒ  qTW |  tˆƒd¡ d S )Nc                  s(   ˆ   ¡  ˆ d ¡ ˆ   ¡  ˆ d ¡ d S )N)r*   r   r	   )r(   Úphaser	   r
   r   ¦   s    
z#LockTests.test_reacquire.<locals>.fr	   r1   é   )r'   r   r   r5   r   r,   )r   r   r	   )r(   rC   r
   Útest_reacquire¢   s    


zLockTests.test_reacquirec                sB   |   ¡ ‰ ˆ  ¡  ‡ fdd„}t|dƒ}| ¡  ˆ  ¡  ˆ  ¡  d S )Nc                  s   ˆ   ¡  d S )N)r,   r	   )r(   r	   r
   r   ¹   s    z*LockTests.test_different_thread.<locals>.fr1   )r'   r*   r   r   r,   )r   r   r7   r	   )r(   r
   Útest_different_threadµ   s    
zLockTests.test_different_threadN)r   r   r   r    rE   rF   r	   r	   r	   r
   rB      s   rB   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú
RLockTestsz$
    Tests for recursive locks.
    c             C   s<   |   ¡ }| ¡  | ¡  | ¡  | ¡  | ¡  | ¡  d S )N)r'   r*   r,   )r   r(   r	   r	   r
   rE   Å   s    zRLockTests.test_reacquirec             C   sX   |   ¡ }|  t|j¡ | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  |  t|j¡ d S )N)r'   r;   ÚRuntimeErrorr,   r*   )r   r(   r	   r	   r
   Útest_release_unacquiredÎ   s    z"RLockTests.test_release_unacquiredc                sB   |   ¡ ‰ ‡ fdd„}t|ddƒ}z|  tˆ j¡ W d | ¡  X d S )Nc                  s   ˆ   ¡  d S )N)r*   r	   )r(   r	   r
   r   Ý   s    z+RLockTests.test_different_thread.<locals>.fr1   T)r'   r   r;   rH   r,   r   )r   r   r7   r	   )r(   r
   rF   Ú   s    z RLockTests.test_different_threadc                s    |   ¡ ‰ |  ˆ  ¡ ¡ ˆ  ¡  |  ˆ  ¡ ¡ ˆ  ¡  |  ˆ  ¡ ¡ g ‰‡ ‡fdd„}t|dƒ ¡  |  ˆd ¡ ˆ  ¡  |  ˆ  ¡ ¡ ˆ  ¡  |  ˆ  ¡ ¡ d S )Nc                  s   ˆ  ˆ  ¡ ¡ d S )N)r   Ú	_is_ownedr	   )r(   r0   r	   r
   r   í   s    z$RLockTests.test__is_owned.<locals>.fr1   r   )r'   r2   rJ   r*   r.   r   r   r,   )r   r   r	   )r(   r0   r
   Útest__is_ownedå   s    zRLockTests.test__is_ownedN)r   r   r   r    rE   rI   rF   rK   r	   r	   r	   r
   rG   Á   s
   	rG   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú
EventTestsz"
    Tests for Event objects.
    c             C   s
   t ƒ ‚d S )N)r&   )r   r	   r	   r
   Ú	eventtypeü   s    zEventTests.eventtypec             C   sr   |   ¡ }|  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)rM   r2   Úis_setÚsetr.   Úclear)r   Úevtr	   r	   r
   Útest_is_setÿ   s    zEventTests.test_is_setc                s|   d}g ‰g ‰‡ ‡‡fdd„}t ||ƒ}| ¡  tƒ  |  tˆƒd¡ ˆ  ¡  | ¡  |  ˆdg| ¡ |  ˆdg| ¡ d S )Nr4   c                  s0   ˆ   ¡  ˆ ˆ  ¡ ¡ ˆ   ¡  ˆ ˆ  ¡ ¡ d S )N)Úwaitr   rN   r	   )rQ   Úresults1Úresults2r	   r
   r     s    z#EventTests._check_notify.<locals>.fr   T)r   r   r   r5   r   rO   r   )r   rQ   r6   r   r7   r	   )rQ   rT   rU   r
   Ú_check_notify  s    
zEventTests._check_notifyc             C   s0   |   ¡ }|  |¡ | ¡  | ¡  |  |¡ d S )N)rM   rV   rO   rP   )r   rQ   r	   r	   r
   Útest_notify  s
    
zEventTests.test_notifyc                s¾   |   ¡ ‰ g ‰g ‰d}‡ ‡‡fdd„}t||ƒ ¡  |  ˆdg| ¡ x(ˆD ] \}}|  |¡ |  |dd¡ qJW g ‰g ‰ˆ  ¡  t||ƒ ¡  |  ˆdg| ¡ xˆD ]\}}|  |¡ q¤W d S )Nr4   c                 sP   ˆ   d¡ ˆ ˆ  ¡ ¡ t ¡ } ˆ   d¡ ˆ  ¡ }t ¡ }ˆ |||  f¡ d S )Ng        gš™™™™™É?)rS   r   rN   r   )Út1ÚrÚt2)rQ   rT   rU   r	   r
   r   +  s    

z"EventTests.test_timeout.<locals>.fFg
×£p=
Ç?é
   T)rM   r   r   r5   r2   ÚassertTimeWithinRangerO   r.   )r   r6   r   rY   Údtr	   )rQ   rT   rU   r
   Útest_timeout&  s"    
zEventTests.test_timeoutN)	r   r   r   r    rM   rR   rV   rW   r^   r	   r	   r	   r
   rL   ÷   s   rL   c               @   sH   e Zd 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S )ÚConditionTestsz(
    Tests for condition variables.
    c             G   s
   t ƒ ‚d S )N)r&   )r   Úargsr	   r	   r
   ÚcondtypeG  s    zConditionTests.condtypec          	   C   s¦   |   ¡ }| ¡  | ¡  | ¡  | ¡  t ¡ }|   |¡}| ¡  |  | d¡¡ | ¡  |  | d¡¡ |  | d¡¡ | ¡  | |  | d¡¡ W d Q R X d S )NF)ra   r*   r,   r?   ZLockr2   r.   )r   Úcondr(   r	   r	   r
   Útest_acquireJ  s    
zConditionTests.test_acquirec             C   s   |   ¡ }|  t|j¡ d S )N)ra   r;   rH   rS   )r   rb   r	   r	   r
   Útest_unacquired_wait]  s    z#ConditionTests.test_unacquired_waitc             C   s   |   ¡ }|  t|j¡ d S )N)ra   r;   rH   Únotify)r   rb   r	   r	   r
   Útest_unacquired_notifya  s    z%ConditionTests.test_unacquired_notifyc                s”  d}g ‰g ‰d‰‡ ‡‡‡fdd„}t ||ƒ}| ¡  tƒ  |  ˆg ¡ ˆ  ¡  ˆ  d¡ tƒ  d‰ˆ  ¡  xtˆƒdk r€tƒ  qlW |  ˆdgd ¡ |  ˆg ¡ ˆ  ¡  ˆ  d¡ tƒ  d‰ˆ  ¡  xtˆƒtˆƒ dk râtƒ  qÆW |  ˆdgd dgd  ¡ |  ˆdgd ¡ ˆ  ¡  ˆ  ¡  tƒ  d‰ˆ  ¡  xtˆƒdk rNtƒ  q6W |  ˆdgd dgd  ¡ |  ˆdgd dgd  ¡ | 	¡  d S )	Nr4   r   c                  sH   ˆ   ¡  ˆ  ¡  ˆ  ¡  ˆ ˆ¡ ˆ   ¡  ˆ  ¡  ˆ  ¡  ˆ ˆ¡ d S )N)r*   rS   r,   r   r	   )rb   Ú	phase_numrT   rU   r	   r
   r   j  s    
z'ConditionTests._check_notify.<locals>.fé   r1   rD   é   )
r   r   r   r5   r*   re   r,   r   Z
notify_allr   )r   rb   r6   r   r7   r	   )rb   rg   rT   rU   r
   rV   e  sJ    	




zConditionTests._check_notifyc             C   s    |   ¡ }|  |¡ |  |¡ d S )N)ra   rV   )r   rb   r	   r	   r
   rW   —  s    
zConditionTests.test_notifyc                s\   |   ¡ ‰ g ‰d}‡ ‡fdd„}t||ƒ ¡  |  tˆƒd¡ xˆD ]}|  |dd¡ qBW d S )Nr4   c                 s<   ˆ   ¡  t ¡ } ˆ  d¡ t ¡ }ˆ  ¡  ˆ ||  ¡ d S )Ngš™™™™™É?)r*   r   rS   r,   r   )rX   rZ   )rb   Úresultsr	   r
   r   ¡  s    
z&ConditionTests.test_timeout.<locals>.fgR¸…ëQÈ?g       @)ra   r   r   r5   r   r\   )r   r6   r   r]   r	   )rb   rj   r
   r^     s    
zConditionTests.test_timeoutN)r   r   r   r    ra   rc   rd   rf   rV   rW   r^   r	   r	   r	   r
   r_   B  s   2r_   c               @   sX   e Zd 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 )ÚBaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    c             G   s
   t ƒ ‚d S )N)r&   )r   r`   r	   r	   r
   Úsemtype´  s    zBaseSemaphoreTests.semtypec          
   C   s:   | j t| jdd | j t| jttdttdd ƒƒ d d S )Néÿÿÿÿ)ÚvalueZmaxintÚmaxsize)r;   Ú
ValueErrorrl   ÚgetattrÚsys)r   r	   r	   r
   r)   ·  s    
z#BaseSemaphoreTests.test_constructorc             C   sH   |   d¡}| ¡  | ¡  |   d¡}| ¡  | ¡  | ¡  | ¡  d S )Nr1   rD   )rl   r*   r,   )r   Úsemr	   r	   r
   rc   ½  s    

zBaseSemaphoreTests.test_acquirec             C   s   |   ¡ }| ¡  ~d S )N)rl   r*   )r   rs   r	   r	   r
   r+   Ç  s    z'BaseSemaphoreTests.test_acquire_destroyc                sl  |   d¡‰ˆ ¡  g ‰g ‰d‰ ‡ ‡‡‡fdd„}t|dƒ}| ¡  xtˆƒtˆƒ dk r`tƒ  qDW |  ˆˆ dgd ¡ d‰ xtdƒD ]}ˆ ¡  q†W xtˆƒtˆƒ dk r´tƒ  q˜W |  t	ˆˆ ƒdgd dgd  ¡ d	‰ xtdƒD ]}ˆ ¡  qèW x tˆƒtˆƒ d
k rtƒ  qúW |  t	ˆˆ ƒdgd dgd  d	gd  ¡ |  
ˆ d¡¡ ˆ ¡  | ¡  d S )Né   r   c                  s(   ˆ  ¡  ˆ ˆ ¡ ˆ  ¡  ˆ ˆ ¡ d S )N)r*   r   r	   )rg   rT   rU   rs   r	   r
   r   Ó  s    
z4BaseSemaphoreTests.test_acquire_contended.<locals>.fr[   é   r1   é   rD   é   F)rl   r*   r   r   r   r   r5   r   r,   Úsortedr2   r   )r   r   r7   r   r	   )rg   rT   rU   rs   r
   r8   Ì  s4    



$
.z)BaseSemaphoreTests.test_acquire_contendedc             C   sV   |   d¡}|  | d¡¡ |  | d¡¡ |  | d¡¡ | ¡  |  | d¡¡ d S )NrD   F)rl   r.   r*   r2   r,   )r   rs   r	   r	   r
   r/   ï  s    
z#BaseSemaphoreTests.test_try_acquirec                sV   |   d¡‰ˆ ¡  g ‰ ‡ ‡fdd„}t|dƒ ¡  |  tˆ ƒdgd dgd  ¡ d S )	Né   c                  s$   ˆ   ˆ d¡¡ ˆ   ˆ d¡¡ d S )NF)r   r*   r	   )rj   rs   r	   r
   r   û  s    z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.fr4   Frt   Trh   )rl   r*   r   r   r5   rx   )r   r   r	   )rj   rs   r
   r3   ÷  s    
z-BaseSemaphoreTests.test_try_acquire_contendedc                sT   |   ¡ ‰ ˆ  ¡  ‡ fdd„}t|dƒ}| ¡  tƒ  |  |j¡ ˆ  ¡  | ¡  d S )Nc                  s   ˆ   ¡  ˆ  ¡  d S )N)r*   r,   r	   )rs   r	   r
   r     s    z0BaseSemaphoreTests.test_default_value.<locals>.fr1   )	rl   r*   r   r   r   r2   r   r,   r   )r   r   r7   r	   )rs   r
   Útest_default_value  s    
z%BaseSemaphoreTests.test_default_valuec                sb   ˆ   d¡‰d‡ ‡fdd„	}|ƒ  ˆ  ˆ d¡¡ ˆ ¡  ˆ  t|t¡ ˆ  ˆ d¡¡ ˆ ¡  d S )NrD   c          
      sT   ˆF ˆ   ˆ d¡¡ ˆ ¡  ˆ ˆ  ˆ d¡¡ | r<| ‚W d Q R X W d Q R X d S )NF)r.   r*   r,   r2   )r9   )r   rs   r	   r
   r:     s    z+BaseSemaphoreTests.test_with.<locals>._withF)N)rl   r.   r*   r,   r;   r<   )r   r:   r	   )r   rs   r
   r=     s    
zBaseSemaphoreTests.test_withN)r   r   r   r    rl   r)   rc   r+   r8   r/   r3   rz   r=   r	   r	   r	   r
   rk   ¯  s   
#rk   c               @   s   e Zd ZdZdd„ ZdS )ÚSemaphoreTestsz)
    Tests for unbounded semaphores.
    c             C   s.   |   d¡}| ¡  | ¡  | ¡  | ¡  d S )Nr1   )rl   r,   r*   )r   rs   r	   r	   r
   rI   (  s
    
z&SemaphoreTests.test_release_unacquiredN)r   r   r   r    rI   r	   r	   r	   r
   r{   #  s   r{   c               @   s   e Zd ZdZdd„ ZdS )ÚBoundedSemaphoreTestsz'
    Tests for bounded semaphores.
    c             C   s8   |   ¡ }|  t|j¡ | ¡  | ¡  |  t|j¡ d S )N)rl   r;   rp   r,   r*   )r   rs   r	   r	   r
   rI   6  s
    z-BoundedSemaphoreTests.test_release_unacquiredN)r   r   r   r    rI   r	   r	   r	   r
   r|   1  s   r|   c               @   sŠ   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	d"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 )#ÚBarrierTestsz$
    Tests for Barrier objects.
    r4   g       @c             C   s   | j | j| jd| _d S )N)Útimeout)Úbarriertyper6   ÚdefaultTimeoutÚbarrier)r   r	   r	   r
   r#   E  s    zBarrierTests.setUpc             C   s   | j  ¡  d S )N)r   Úabort)r   r	   r	   r
   r$   G  s    zBarrierTests.tearDownc             C   s"   t || jd ƒ}|ƒ  | ¡  d S )Nr1   )r   r6   r   )r   r   r7   r	   r	   r
   Úrun_threadsJ  s    zBarrierTests.run_threadsc             C   s®   | j j}|  || j¡ xtt|ƒD ]h}|d  d¡ |  t|d ƒ|| ¡ | j  ¡  |d  d¡ |  t|d ƒ|d | ¡ | j  ¡  q W |  | j jd¡ |  	| j j
¡ d S )Nr   Tr1   )r   Zpartiesr5   r6   r   r   r   rS   Ú	n_waitingr2   Úbroken)r   rj   r   ÚmÚir	   r	   r
   Ú	multipassO  s    
zBarrierTests.multipassr1   c                s&   g g g‰‡ ‡‡fdd„}ˆ  |¡ dS )z;
        Test that a barrier is passed in lockstep
        c                  s   ˆ  ˆˆ ¡ d S )N)rˆ   r	   )Úpassesrj   r   r	   r
   r   a  s    z$BarrierTests.test_barrier.<locals>.fN)rƒ   )r   r‰   r   r	   )r‰   rj   r   r
   Útest_barrier\  s    zBarrierTests.test_barrierc             C   s
   |   d¡S )zC
        Test that a barrier works for 10 consecutive runs
        r[   )rŠ   )r   r	   r	   r
   Útest_barrier_10e  s    zBarrierTests.test_barrier_10c                s:   g ‰ ‡ ‡fdd„}ˆ  |¡ ˆ tˆ ƒttˆjƒƒ¡ dS )z9
        test the return value from barrier.wait
        c                 s   ˆj  ¡ } ˆ  | ¡ d S )N)r   rS   r   )rY   )rj   r   r	   r
   r   p  s    
z(BarrierTests.test_wait_return.<locals>.fN)rƒ   r5   Úsumr   r6   )r   r   r	   )rj   r   r
   Útest_wait_returnk  s    
zBarrierTests.test_wait_returnc                s<   g ‰‡fdd„}ˆ  ˆj|¡‰ ‡ ‡‡fdd„}ˆ |¡ dS )z,
        Test the 'action' callback
        c                  s   ˆ   d¡ d S )NT)r   r	   )rj   r	   r
   Úaction|  s    z(BarrierTests.test_action.<locals>.actionc                  s   ˆ   ¡  ˆ tˆƒd¡ d S )Nr1   )rS   r5   r   r	   )r   rj   r   r	   r
   r     s    z#BarrierTests.test_action.<locals>.fN)r   r6   rƒ   )r   rŽ   r   r	   )r   rj   r   r
   Útest_actionw  s
    zBarrierTests.test_actionc                sZ   g ‰ g ‰‡ ‡‡fdd„}ˆ  |¡ ˆ tˆ ƒd¡ ˆ tˆƒˆjd ¡ ˆ ˆjj¡ dS )zK
        Test that an abort will put the barrier in a broken state
        c                 sv   y4ˆj  ¡ } | ˆjd krt‚ˆj  ¡  ˆ  d¡ W n< tjk
rT   ˆ d¡ Y n tk
rp   ˆj  ¡  Y nX d S )NrD   T)r   rS   r6   rH   r   r?   ÚBrokenBarrierErrorr‚   )r‡   )rT   rU   r   r	   r
   r   ‹  s    

z"BarrierTests.test_abort.<locals>.fr   r1   N)rƒ   r5   r   r6   r.   r   r…   )r   r   r	   )rT   rU   r   r
   Ú
test_abort…  s    
zBarrierTests.test_abortc                sd   g ‰ g ‰g ‰‡ ‡‡‡fdd„}ˆ  |¡ ˆ tˆ ƒd¡ ˆ tˆƒˆjd ¡ ˆ tˆƒˆj¡ dS )zL
        Test that a 'reset' on a barrier frees the waiting threads
        c                 s˜   ˆj  ¡ } | ˆjd krFx ˆj jˆjd k r8t d¡ qW ˆj  ¡  n:yˆj  ¡  ˆ  d¡ W n  tj	k
r~   ˆ d¡ Y nX ˆj  ¡  ˆ d¡ d S )NrD   r1   gü©ñÒMbP?T)
r   rS   r6   r„   r   r   Úresetr   r?   r   )r‡   )rT   rU   Úresults3r   r	   r
   r   £  s    


z"BarrierTests.test_reset.<locals>.fr   r1   N)rƒ   r5   r   r6   )r   r   r	   )rT   rU   r“   r   r
   Ú
test_resetœ  s    
zBarrierTests.test_resetc                sr   g ‰g ‰g ‰ˆ  ˆj¡‰ ‡ ‡‡‡‡fdd„}ˆ |¡ ˆ tˆƒd¡ ˆ tˆƒˆjd ¡ ˆ tˆƒˆj¡ dS )zF
        Test that a barrier can be reset after being broken.
        c                 s®   y4ˆj  ¡ } | ˆjd krt‚ˆj  ¡  ˆ d¡ W n< tjk
rT   ˆ d¡ Y n tk
rp   ˆj  ¡  Y nX ˆ  ¡ ˆjd krŽˆj  ¡  ˆ  ¡  ˆj  ¡  ˆ d¡ d S )NrD   T)	r   rS   r6   rH   r   r?   r   r‚   r’   )r‡   )Úbarrier2rT   rU   r“   r   r	   r
   r   Â  s    



z,BarrierTests.test_abort_and_reset.<locals>.fr   r1   N)r   r6   rƒ   r5   r   )r   r   r	   )r•   rT   rU   r“   r   r
   Útest_abort_and_resetº  s    
z!BarrierTests.test_abort_and_resetc                s   ‡ fdd„}ˆ   |¡ dS )z$
        Test wait(timeout)
        c                 s:   ˆ j  ¡ } | ˆ jd kr"t d¡ ˆ  tjˆ j jd¡ d S )NrD   g      ð?g      à?)r   rS   r6   r   r   r;   r?   r   )r‡   )r   r	   r
   r   à  s
    

z$BarrierTests.test_timeout.<locals>.fN)rƒ   )r   r   r	   )r   r
   r^   Ü  s    zBarrierTests.test_timeoutc                s,   ˆj ˆjdd‰ ‡ ‡fdd„}ˆ |¡ dS )z4
        Test the barrier's default timeout
        g333333Ó?)r~   c                 s4   ˆ   ¡ } | ˆjd kr t d¡ ˆ tjˆ j ¡ d S )NrD   g      ð?)rS   r6   r   r   r;   r?   r   )r‡   )r   r   r	   r
   r   ð  s    
z,BarrierTests.test_default_timeout.<locals>.fN)r   r6   rƒ   )r   r   r	   )r   r   r
   Útest_default_timeoutê  s    z!BarrierTests.test_default_timeoutc             C   s   |   d¡}| ¡  | ¡  d S )Nr1   )r   rS   )r   r7   r	   r	   r
   Útest_single_threadø  s    
zBarrierTests.test_single_threadN)r1   )r   r   r   r    r6   r€   r#   r$   rƒ   rˆ   rŠ   r‹   r   r   r‘   r”   r–   r^   r—   r˜   r	   r	   r	   r
   r}   >  s"   
	"r}   Ú__main__zSThis module contains no tests; it is used by other test cases like test_threading_2)r    rr   r   Zthreadr   r   ÚImportErrorÚ_threadr?   ZunittestZtestr   r   Zgevent.testing.testcaser   r   Úobjectr   ZTestCaser!   r%   rB   rG   rL   r_   rk   r{   r|   r}   r   Úprintr	   r	   r	   r
   Ú<module>   s8   '	T$6Kmt A
