a
    zeNx                     @   s(  d Z ddlZddlZddlZddlZddlmZmZ ddlZddl	Z	ddl
Z
ddlmZ e	eeddZdd ZG d	d
 d
eZG dd d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dS )z/
Various tests for synchronization primitives.
    N)start_new_threadTIMEOUT_MAX)supportforkz9platform doesn't support fork (no _at_fork_reinit method)c                   C   s   t d d S )N{Gz?)timesleep r	   r	   %/usr/lib/python3.9/test/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                    sx    _ |_g _g _| _t _j   fdd}zt	|D ]}t
|d qLW n   d_ Y n0 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               	      sZ   t  } j|  z$   W j|  jsVt  q*nj|  jsTt  qF0 d S N)	threading	get_identstartedappendfinished	_can_exitr   )tidfselfr	   r
   task,   s    
zBunch.__init__.<locals>.taskr	   TN)r   nr   r   r   r   wait_threads_exitwait_thread	__enter__ranger   )r   r   r   Zwait_before_exitr   ir	   r   r
   __init__   s    


zBunch.__init__c                 C   s   t | j| jk rt  q d S r   )lenr   r   r   r   r	   r	   r
   wait_for_started=   s    zBunch.wait_for_startedc                 C   s,   t | j| jk rt  q | jd d d  d S r   )r    r   r   r   r   __exit__r!   r	   r	   r
   wait_for_finishedA   s    zBunch.wait_for_finishedc                 C   s
   d| _ d S NT)r   r!   r	   r	   r
   	do_finishG   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d ZdS )BaseTestCasec                 C   s   t  | _d S r   )r   Zthreading_setup_threadsr!   r	   r	   r
   setUpL   s    zBaseTestCase.setUpc                 C   s   t j| j  t   d S r   )r   Zthreading_cleanupr,   reap_childrenr!   r	   r	   r
   tearDownO   s    zBaseTestCase.tearDownc                 C   s$   |  ||d  | ||d  d S )Ng333333?g      $@)ZassertGreaterEqual
assertLess)r   actualZexpectedr	   r	   r
   assertTimeoutS   s    zBaseTestCase.assertTimeoutN)r'   r(   r)   r-   r/   r2   r	   r	   r	   r
   r+   K   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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   |   }~d S r   )locktyper   lockr	   r	   r
   test_constructora   s    zBaseLockTests.test_constructorc                 C   s   |   }| t|d ~d S )Nz<unlocked .* object (.*)?at .*>)r4   assertRegexreprr5   r	   r	   r
   	test_repre   s    zBaseLockTests.test_reprc                 C   s&   |   }|  | t|d ~d S )Nz<locked .* object (.*)?at .*>)r4   acquirer8   r9   r5   r	   r	   r
   test_locked_reprj   s    zBaseLockTests.test_locked_reprc                 C   s   |   }|  ~d S r   )r4   r;   r5   r	   r	   r
   test_acquire_destroyp   s    z"BaseLockTests.test_acquire_destroyc                 C   s   |   }|  |  ~d S r   r4   r;   releaser5   r	   r	   r
   test_acquire_releaseu   s    z"BaseLockTests.test_acquire_releasec                 C   s$   |   }| |d |  d S NF)r4   
assertTruer;   r?   r5   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 rA   r   r;   r	   r6   resultr	   r
   r      s    z3BaseLockTests.test_try_acquire_contended.<locals>.f   r   )r4   r;   r   r$   assertFalser?   r   r   r	   rE   r
   test_try_acquire_contended   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 r   r;   r?   r	   r6   r	   r
   r      s    z/BaseLockTests.test_acquire_contended.<locals>.fr   )
r4   r;   r   r"   r   assertEqualr    r   r?   r$   r   Nr   br	   rM   r
   test_acquire_contended   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 r   rL   r	   rM   r	   r
   r      s    z"BaseLockTests.test_with.<locals>.fc                    s4     | d ur| W d    n1 s&0    Y  d S r   r	   errrM   r	   r
   _with   s    z&BaseLockTests.test_with.<locals>._withrG   )N)r4   r   r$   assertRaises	TypeError)r   r   rU   r	   rM   r
   	test_with   s    zBaseLockTests.test_withc                    s`   |     fdd}tt }t|d  tt |kr\td | |tt  d S )Nc                      s          d S r   rL   r	   rM   r	   r
   r      s    z)BaseLockTests.test_thread_leak.<locals>.f   g?)	r4   r    r   	enumerater   r$   r   r   rN   )r   r   r   r	   rM   r
   test_thread_leak   s    
zBaseLockTests.test_thread_leakc                    s   |    | t jdd | jt jdd | jt jdd | jt jtd d  jtd    t }| 	 jdd t }| 
|| d g  fdd}t|d  | d	  | d d
 d S )NFrG   itimeoutg}Ô%ITrK   c                     s4   t  }  jdd t  }||   d S )N      ?r\   )r   	monotonicr   r;   )t1t2r6   resultsr	   r
   r      s    z%BaseLockTests.test_timeout.<locals>.fr   r^   )r4   rV   
ValueErrorr;   OverflowErrorr   r?   r   r_   rB   r0   r   r$   rH   r2   )r   r`   ra   r   r	   rb   r
   test_timeout   s     zBaseLockTests.test_timeoutc                 C   s"   |   }t|}| |  d S r   )r4   weakrefrefZassertIsNotNoner   r6   rh   r	   r	   r
   test_weakref_exists   s    
z!BaseLockTests.test_weakref_existsc                 C   s,   |   }t|}~t  | |  d S r   )r4   rg   rh   gcZcollectZassertIsNoneri   r	   r	   r
   test_weakref_deleted   s
    
z"BaseLockTests.test_weakref_deletedN)r'   r(   r)   r*   r7   r:   r<   r=   r@   rC   rJ   rR   rX   r[   rf   rj   rl   r	   r	   r	   r
   r3   \   s   
r3   c                   @   s4   e Zd ZdZdd Zdd Zdd Ze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 p t|d tdkrBt  q.t  | td    tdkrtt  q`| td W d    n1 s0    Y  d S )Nc                      s(       d      d  d S r   r;   r   r	   r6   Zphaser	   r
   r      s    
z#LockTests.test_reacquire.<locals>.fr	   r   rG      )r4   r   r   r   r    r   rN   r?   rI   r	   ro   r
   test_reacquire   s    

zLockTests.test_reacquirec                    sB   |        fdd}t|d}|        d S )Nc                      s       d S r   )r?   r	   rM   r	   r
   r     s    z*LockTests.test_different_thread.<locals>.frG   )r4   r;   r   r$   r?   r   r   rQ   r	   rM   r
   test_different_thread   s    
zLockTests.test_different_threadc                 C   sN   |   }|  | |jdd |  | |  | |jdd d S )Nr   r\   F)blocking)r4   r;   rH   r?   lockedrB   r5   r	   r	   r
   test_state_after_timeout
  s    z"LockTests.test_state_after_timeoutc                 C   sD   dd }|   }|  || |   }|  |  || d S )Nc                 S   s   |    |   d S r   rL   rM   r	   r	   r
   use_lock  s    z/LockTests.test_at_fork_reinit.<locals>.use_lock)r4   _at_fork_reinitr;   )r   rw   r6   Zlock2r	   r	   r
   test_at_fork_reinit  s    zLockTests.test_at_fork_reinitN)	r'   r(   r)   r*   rq   rs   rv   requires_forkry   r	   r	   r	   r
   rm      s   
rm   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 )
RLockTestsz$
    Tests for recursive locks.
    c                 C   s<   |   }|  |  |  |  |  |  d S r   r>   r5   r	   r	   r
   rq   ,  s    zRLockTests.test_reacquirec                 C   sX   |   }| t|j |  |  |  |  |  |  | t|j d S r   )r4   rV   RuntimeErrorr?   r;   r5   r	   r	   r
   test_release_unacquired5  s    z"RLockTests.test_release_unacquiredc                 C   sX   |   }| t|j |  |  |  |  |  |  | t|j d S r   )r4   rV   r|   _release_saver;   r?   r5   r	   r	   r
   test_release_save_unacquiredA  s    z'RLockTests.test_release_save_unacquiredc                    sR   |     fdd}t|dd}z| t j W |  n
|  0 |  d S )Nc                      s       d S r   )r;   r	   rM   r	   r
   r   P  s    z+RLockTests.test_different_thread.<locals>.frG   T)r4   r   rV   r|   r?   r&   r$   rr   r	   rM   r
   rs   M  s    z RLockTests.test_different_threadc                    s   |    |       |       |    g  fdd}t|d  | d     |       |    d S )Nc                      s       d S r   )r   	_is_ownedr	   rE   r	   r
   r   a  s    z$RLockTests.test__is_owned.<locals>.frG   r   )r4   rH   r   r;   rB   r   r$   r?   rI   r	   rE   r
   test__is_ownedY  s    zRLockTests.test__is_ownedN)	r'   r(   r)   r*   rq   r}   r   rs   r   r	   r	   r	   r
   r{   (  s   	r{   c                   @   sD   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dd Z
dS )
EventTestsz"
    Tests for Event objects.
    c                 C   sr   |   }| |  |  | |  |  | |  |  | |  |  | |  d S r   )	eventtyperH   is_setsetrB   clearr   evtr	   r	   r
   test_is_setp  s    zEventTests.test_is_setc                    s|   d}g g  fdd}t ||}|  t  | td    |  | dg|  | dg|  d S )NrK   c                      s            d S r   r   waitr	   r   results1results2r	   r
   r     s    z#EventTests._check_notify.<locals>.fr   T)r   r"   r   rN   r    r   r$   )r   r   rP   r   rQ   r	   r   r
   _check_notify|  s    
zEventTests._check_notifyc                 C   s0   |   }| | |  |  | | d S r   )r   r   r   r   r   r	   r	   r
   test_notify  s
    
zEventTests.test_notifyc                    s   |    g g d} fdd}t||  | dg|  D ]\}}| | | |d qHg g    t||  | dg|  D ]\}}| | qd S )NrK   c                     s@     d t }  d}t } |||  f d S )Ng        r^   )r   r   r   r_   )r`   rra   r   r	   r
   r     s
    
z"EventTests.test_timeout.<locals>.fFr^   T)r   r   r$   rN   rH   r2   r   rB   )r   rP   r   r   dtr	   r   r
   rf     s"    
zEventTests.test_timeoutc                    sn   |    g dd} fdd}t||}|  t       |  | dg|  d S )Ng      ?rK   c                      s     d  d S N   r   r	   r   rc   r]   r	   r
   r     s    z(EventTests.test_set_and_clear.<locals>.fT)	r   r   r"   r   r   r   r   r$   rN   rO   r	   r   r
   test_set_and_clear  s    

zEventTests.test_set_and_clearc                 C   s   |   }|j" | |jd W d    n1 s60    Y  |  |j" | |jd W d    n1 sv0    Y  d S rA   )r   _condrH   r;   rx   r   r	   r	   r
   ry     s    0zEventTests.test_at_fork_reinitN)r'   r(   r)   r*   r   r   r   rf   r   rz   ry   r	   r	   r	   r
   r   k  s   r   c                   @   sP   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S )ConditionTestsz(
    Tests for condition variables.
    c                 C   s   |   }|  |  |  |  t }|  |}|  | |d |  | |d | |d |  |  | |d W d    n1 s0    Y  d S rA   )condtyper;   r?   r   LockrH   rB   )r   condr6   r	   r	   r
   test_acquire  s    
zConditionTests.test_acquirec                 C   s   |   }| t|j d S r   )r   rV   r|   r   r   r   r	   r	   r
   test_unacquired_wait  s    z#ConditionTests.test_unacquired_waitc                 C   s   |   }| t|j d S r   )r   rV   r|   notifyr   r	   r	   r
   test_unacquired_notify  s    z%ConditionTests.test_unacquired_notifyc                    s  d}g g g d fdd}t ||}|  tdk rNt  q:  | g      d t  d   tdk rt  q| dgd  | g  tdk rt  q    d t  d   tt d	k rt  q| dgd d
gd   | d
gd  tdk rTt  q<    	  t  d   tdk rt  qv| dgd d
gd   | d
gd dgd   |
  d S )NrK   r   c                     sd          }    | f        }    | f d S r   )r;   r   r   r?   rF   r   	phase_numreadyr   r   r	   r
   r     s    

z'ConditionTests._check_notify.<locals>.f   rG   )TrG   rp      )Trp   )Tr   )r   r"   r    r   r   rN   r;   r   r?   
notify_allr$   )r   r   rP   r   rQ   r	   r   r
   r     sX    




zConditionTests._check_notifyc                 C   s    |   }| | | | d S r   )r   r   r   r	   r	   r
   r   4  s    
zConditionTests.test_notifyc                    sd   |    g d} fdd}t||  | t| D ]\}}| |d | | q@d S )NrK   c                     s@       t }  d}t }   ||  |f d S )Nr^   )r;   r   r_   r   r?   r   )r`   rF   ra   r   rc   r	   r
   r   >  s    
z&ConditionTests.test_timeout.<locals>.fr^   )r   r   r$   rN   r    r2   rH   )r   rP   r   r   rF   r	   r   r
   rf   :  s    zConditionTests.test_timeoutc              	      s      d fdd}t|d}|  tdD ]B}td    d7    W d    q61 sn0    Y  q6|  d S )Nr   c                     sP    8   fdd} |  d W d    n1 sB0    Y  d S )Nc                      s    dkS r   r	   r	   stater	   r
   <lambda>U      z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>r   )wait_forrB   rN   r   r   r   r   r	   r
   r   S  s    
z&ConditionTests.test_waitfor.<locals>.frG   r   r   )r   r   r"   r   r   r   r   r$   r   r   rQ   r   r	   r   r
   test_waitforP  s    

(zConditionTests.test_waitforc              	      s      dg  fdd}t|d}|  tdD ]B}td    d7    W d    q<1 st0    Y  q<|  t	d d S )Nr   c                     sr    Z t  }  jfdddd}t  |  } | | d d  W d    n1 sd0    Y  d S )Nc                      s    dkS r   r	   r	   r   r	   r
   r   h  r   z@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>g?r\   )r   r_   r   rH   r2   r   )r   rF   r   r   r   successr	   r
   r   e  s    
z.ConditionTests.test_waitfor_timeout.<locals>.frG   r   r   )
r   r   r"   r   r   r   r   r$   rN   r    r   r	   r   r
   test_waitfor_timeouta  s    

(z#ConditionTests.test_waitfor_timeoutN)r'   r(   r)   r*   r   r   r   r   r   rf   r   r   r	   r	   r	   r
   r     s   Jr   c                   @   s`   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d ZdS )BaseSemaphoreTestszB
    Common tests for {bounded, unbounded} semaphore objects.
    c                 C   s,   | j t| jdd | j t| jtj d d S )N)value)rV   rd   semtypesysmaxsizer!   r	   r	   r
   r7   ~  s    z#BaseSemaphoreTests.test_constructorc                 C   sH   |  d}|  |  |  d}|  |  |  |  d S )NrG   rp   )r   r;   r?   r   semr	   r	   r
   r     s    

zBaseSemaphoreTests.test_acquirec                 C   s   |   }|  ~d S r   )r   r;   r   r	   r	   r
   r=     s    z'BaseSemaphoreTests.test_acquire_destroyc                    st  |  d  d}g g g d  fdd}t|d}|  tt dk rht  qL|  dgd  d tdD ]}  qtt dk rt  q| t	 dgd dgd   d	 tdD ]}  qtt d
k rt  q| t	 dgd dgd  d	gd   | 
d   |  | dgd  d S )N   
   r   c                      s4               d S r   rD   r	   r   r   r   r   Zsem_resultsr	   r
   r     s    
z4BaseSemaphoreTests.test_acquire_contended.<locals>.f   rG      rp      FT   )r   r;   r   r"   r    r   rN   r   r?   sortedrH   r$   )r   rP   r   rQ   r   r	   r   r
   rR     s:    


$
.z)BaseSemaphoreTests.test_acquire_contendedc                    s>  |  d  g g d  fdd}t|d}|  tt dk r^t  qB|  dgd  d d tt dk rt  q| t dgd dgd   d	 d tt d
k rt  q| t dgd dgd  d	gd   | 	d   |
  d S )Nr   r   c                      s(             d S r   rn   r	   r   r   r   r   r	   r
   r     s    
z/BaseSemaphoreTests.test_multirelease.<locals>.fr   r   rG   r   rp   r   F)r   r;   r   r"   r    r   rN   r?   r   rH   r$   rr   r	   r   r
   test_multirelease  s0    


$
.z$BaseSemaphoreTests.test_multireleasec                 C   sV   |  d}| |d | |d | |d |  | |d d S )Nrp   F)r   rB   r;   rH   r?   r   r	   r	   r
   rC     s    
z#BaseSemaphoreTests.test_try_acquirec                    sV   |  d  g   fdd}t|d  | t dgd dgd   d S )	Nr   c                      s$     d   d d S rA   rD   r	   rc   r   r	   r
   r     s    z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.frK   Fr   Tr   )r   r;   r   r$   rN   r   rI   r	   r   r
   rJ     s    
z-BaseSemaphoreTests.test_try_acquire_contendedc                 C   s   |  d}| jt|jddd | |jdd | |jdd | |jdd |  | |jdd t }| |jdd t | }| 	|d d S )Nrp   F      ?r\   g{Gzt?r^   )
r   rV   rd   r;   rB   rH   r?   r   r_   r2   )r   r   tr   r	   r	   r
   test_acquire_timeout  s    
z'BaseSemaphoreTests.test_acquire_timeoutc                    sT   |        fdd}t|d}|  t  | |j    |  d S )Nc                      s          d S r   rL   r	   r   r	   r
   r     s    z0BaseSemaphoreTests.test_default_value.<locals>.frG   )	r   r;   r   r"   r   rH   r   r?   r$   rr   r	   r   r
   test_default_value  s    
z%BaseSemaphoreTests.test_default_valuec                    sb     dd fdd	}|   d    t|t  d   d S )Nrp   c              	      s|   d   d   (  d | r<| W d    n1 sP0    Y  W d    n1 sn0    Y  d S rA   )rB   r;   r?   rH   rS   r   r	   r
   rU     s    z+BaseSemaphoreTests.test_with.<locals>._withF)N)r   rB   r;   r?   rV   rW   )r   rU   r	   r   r
   rX     s    
zBaseSemaphoreTests.test_withN)r'   r(   r)   r*   r7   r   r=   rR   r   rC   rJ   r   r   rX   r	   r	   r	   r
   r   y  s   
% r   c                   @   s   e Zd ZdZdd ZdS )SemaphoreTestsz)
    Tests for unbounded semaphores.
    c                 C   s.   |  d}|  |  |  |  d S NrG   )r   r?   r;   r   r	   r	   r
   r}     s
    
z&SemaphoreTests.test_release_unacquiredNr'   r(   r)   r*   r}   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 r   )r   rV   rd   r?   r;   r   r	   r	   r
   r}   *  s
    z-BoundedSemaphoreTests.test_release_unacquiredNr   r	   r	   r	   r
   r   %  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.
    rK   g       @c                 C   s   | j | j| jd| _d S )Nr\   )barriertyperP   defaultTimeoutbarrierr!   r	   r	   r
   r-   :  s    zBarrierTests.setUpc                 C   s   | j   d S r   )r   abortr!   r	   r	   r
   r/   <  s    zBarrierTests.tearDownc                 C   s"   t || jd }|  |  d S r   )r   rP   r$   rr   r	   r	   r
   run_threads?  s    zBarrierTests.run_threadsc                 C   s   | j j}| || j t|D ]h}|d d | t|d ||  | j   |d d | t|d |d |  | j   q| | j jd | 	| j j
 d S )Nr   TrG   )r   partiesrN   rP   r   r   r    r   	n_waitingrH   broken)r   rc   r   mr   r	   r	   r
   	multipassD  s    
zBarrierTests.multipassrG   c                    s&   g g g fdd} | dS )z;
        Test that a barrier is passed in lockstep
        c                      s      d S r   )r   r	   passesrc   r   r	   r
   r   V  s    z$BarrierTests.test_barrier.<locals>.fNr   )r   r   r   r	   r   r
   test_barrierQ  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_10Z  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 r   )r   r   r   )r   rc   r   r	   r
   r   e  s    
z(BarrierTests.test_wait_return.<locals>.fN)r   rN   sumr   rP   rI   r	   r   r
   test_wait_return`  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 r%   )r   r	   )rc   r	   r
   actionq  s    z(BarrierTests.test_action.<locals>.actionc                      s       td d S r   )r   rN   r    r	   r   rc   r   r	   r
   r   t  s    z#BarrierTests.test_action.<locals>.fNr   rP   r   )r   r   r   r	   r   r
   test_actionl  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                     sr   z4j  } | jd krtj    d W n8 tjyR   d Y n tyl   j   Y n0 d S Nrp   T)r   r   rP   r|   r   r   BrokenBarrierErrorr   r   r   r   r   r	   r
   r     s    


z"BarrierTests.test_abort.<locals>.fr   rG   N)r   rN   r    rP   rB   r   r   rI   r	   r   r
   
test_abortz  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rBj jjd k r6td qj   n8zj    d W n tj	yx   d Y n0 j   d d S )Nrp   rG   gMbP?T)
r   r   rP   r   r   r   resetr   r   r   r   r   r   results3r   r	   r
   r     s    


z"BarrierTests.test_reset.<locals>.fr   rG   N)r   rN   r    rP   rI   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   z4j  } | jd krtj   d W n8 tjyR   d Y n tyl   j   Y n0   jd krj      j   d d S r   )	r   r   rP   r|   r   r   r   r   r   r   Zbarrier2r   r   r   r   r	   r
   r     s     




z,BarrierTests.test_abort_and_reset.<locals>.fr   rG   N)r   rP   r   rN   r    rI   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 )Nrp   r   r^   )r   r   rP   r   r   rV   r   r   r   r!   r	   r
   r     s    

z$BarrierTests.test_timeout.<locals>.fNr   rI   r	   r!   r
   rf     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 )Nrp   r   )r   rP   r   r   rV   r   r   r   r   r   r	   r
   r     s    
z,BarrierTests.test_default_timeout.<locals>.fNr   rI   r	   r   r
   test_default_timeout  s    z!BarrierTests.test_default_timeoutc                 C   s   |  d}|  |  d S r   )r   r   )r   rQ   r	   r	   r
   test_single_thread  s    
zBarrierTests.test_single_threadN)rG   )r'   r(   r)   r*   rP   r   r-   r/   r   r   r   r   r   r   r   r   r   rf   r   r   r	   r	   r	   r
   r   3  s"   
	"r   )r*   osrk   r   r   _threadr   r   r   Zunittestrg   testr   Z
skipUnlesshasattrrz   r   objectr   ZTestCaser+   r3   rm   r{   r   r   r   r   r   r   r	   r	   r	   r
   <module>   s6   1 	DC_ 0 