B
    18™\q  ã               @   s  d 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
 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)Úsupportc               C   s   t  d¡ d S )Ng{®Gáz„?)ÚtimeÚsleep© r   r   úS/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/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                s|   ˆ ˆ_ |ˆ_g ˆ_g ˆ_| ˆ_t ¡ ˆ_ˆj ¡  ‡ ‡fdd„}y xt	|ƒD ]}t
|dƒ qNW W n   dˆ_‚ Y nX 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           	      sD   t  ¡ } ˆj | ¡ z
ˆ ƒ  W d ˆj | ¡ xˆjs<tƒ  q.W X 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   Úwait_before_exitr   Úir   )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_started6   s    zBunch.wait_for_startedc             C   s0   xt | jƒ| jk rtƒ  qW | j d d d ¡ d S )N)r   r   r   r	   r   Ú__exit__)r   r   r   r   Úwait_for_finished:   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d„ ZdS )ÚBaseTestCasec             C   s   t  ¡ | _d S )N)r   Úthreading_setupÚ_threads)r   r   r   r   ÚsetUpE   s    zBaseTestCase.setUpc             C   s   t j| jŽ  t  ¡  d S )N)r   Úthreading_cleanupr(   Úreap_children)r   r   r   r   ÚtearDownH   s    zBaseTestCase.tearDownc             C   s$   |   ||d ¡ |  ||d ¡ d S )Ng333333ã?g      $@)ÚassertGreaterEqualÚ
assertLess)r   ÚactualÚexpectedr   r   r   ÚassertTimeoutL   s    zBaseTestCase.assertTimeoutN)r"   r#   r$   r)   r,   r1   r   r   r   r   r&   D   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 )N)Úlocktype)r   Úlockr   r   r   Útest_constructorZ   s    zBaseLockTests.test_constructorc             C   s   |   ¡ }|  t|ƒd¡ ~d S )Nz<unlocked .* object (.*)?at .*>)r3   ÚassertRegexÚrepr)r   r4   r   r   r   Ú	test_repr^   s    zBaseLockTests.test_reprc             C   s&   |   ¡ }| ¡  |  t|ƒd¡ ~d S )Nz<locked .* object (.*)?at .*>)r3   Úacquirer6   r7   )r   r4   r   r   r   Útest_locked_reprc   s    zBaseLockTests.test_locked_reprc             C   s   |   ¡ }| ¡  ~d S )N)r3   r9   )r   r4   r   r   r   Útest_acquire_destroyi   s    z"BaseLockTests.test_acquire_destroyc             C   s   |   ¡ }| ¡  | ¡  ~d S )N)r3   r9   Úrelease)r   r4   r   r   r   Útest_acquire_releasen   s    z"BaseLockTests.test_acquire_releasec             C   s$   |   ¡ }|  | d¡¡ | ¡  d S )NF)r3   Ú
assertTruer9   r<   )r   r4   r   r   r   Útest_try_acquiret   s    zBaseLockTests.test_try_acquirec                sJ   |   ¡ ‰ ˆ  ¡  g ‰‡ ‡fdd„}t|dƒ ¡  |  ˆd ¡ ˆ  ¡  d S )Nc                  s   ˆ  ˆ  d¡¡ d S )NF)r   r9   r   )r4   Úresultr   r   r   }   s    z3BaseLockTests.test_try_acquire_contended.<locals>.fé   r   )r3   r9   r
   r    ÚassertFalser<   )r   r   r   )r4   r@   r   Útest_try_acquire_contendedy   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)r9   r<   r   )r4   r   r   r   ‡   s    z/BaseLockTests.test_acquire_contended.<locals>.fr   )
r3   r9   r
   r   r	   ÚassertEqualr   r   r<   r    )r   ÚNr   Úbr   )r4   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 )N)r9   r<   r   )r4   r   r   r   •   s    z"BaseLockTests.test_with.<locals>.fc          	      s    ˆ  | d k	r| ‚W d Q R X d S )Nr   )Úerr)r4   r   r   Ú_with˜   s    z&BaseLockTests.test_with.<locals>._withrA   )N)r3   r
   r    ÚassertRaisesÚ	TypeError)r   r   rJ   r   )r4   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 )N)r9   r<   r   )r4   r   r   r   §   s    z)BaseLockTests.test_thread_leak.<locals>.fé   gš™™™™™Ù?)	r3   r   r   Ú	enumerater
   r    r   r   rE   )r   r   r   r   )r4   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 )
Nr   rA   iœÿÿÿ)Útimeoutg}Ã”%­I²TrD   c                 s4   t  ¡ } ˆ ˆ jdd¡ t  ¡ }ˆ ||  ¡ d S )Ng      à?)rQ   )r   Ú	monotonicr   r9   )Út1Út2)r4   Úresultsr   r   r   Ç   s    z%BaseLockTests.test_timeout.<locals>.fg      à?)r3   rK   Ú
ValueErrorr9   ÚOverflowErrorr   r<   r   rR   r>   r.   r
   r    rB   r1   )r   rS   rT   r   r   )r4   rU   r   Útest_timeout¶   s     zBaseLockTests.test_timeoutc             C   s"   |   ¡ }t |¡}|  |ƒ ¡ d S )N)r3   ÚweakrefÚrefÚassertIsNotNone)r   r4   rZ   r   r   r   Útest_weakref_existsÐ   s    
z!BaseLockTests.test_weakref_existsc             C   s$   |   ¡ }t |¡}~|  |ƒ ¡ d S )N)r3   rY   rZ   ÚassertIsNone)r   r4   rZ   r   r   r   Útest_weakref_deletedÕ   s    
z"BaseLockTests.test_weakref_deletedN)r"   r#   r$   r%   r5   r8   r:   r;   r=   r?   rC   rH   rM   rP   rX   r\   r^   r   r   r   r   r2   U   s   
r2   c               @   s(   e Zd ZdZd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 ¡ n t|dƒ xtˆƒdkrDtƒ  q0W tƒ  |  tˆƒd¡ ˆ  ¡  xtˆƒdkrztƒ  qfW |  tˆƒd¡ W d Q R X d S )Nc                  s(   ˆ   ¡  ˆ d ¡ ˆ   ¡  ˆ d ¡ d S )N)r9   r   r   )r4   Úphaser   r   r   æ   s    
z#LockTests.test_reacquire.<locals>.fr   r   rA   é   )r3   r   r   r   r   r	   rE   r<   )r   r   r   )r4   r`   r   Útest_reacquireá   s    



zLockTests.test_reacquirec                sB   |   ¡ ‰ ˆ  ¡  ‡ fdd„}t|dƒ}| ¡  ˆ  ¡  ˆ  ¡  d S )Nc                  s   ˆ   ¡  d S )N)r<   r   )r4   r   r   r   û   s    z*LockTests.test_different_thread.<locals>.frA   )r3   r9   r
   r    r<   )r   r   rG   r   )r4   r   Útest_different_thread÷   s    
zLockTests.test_different_threadc             C   sN   |   ¡ }| ¡  |  |jdd¡ | ¡  |  | ¡ ¡ |  |jdd¡ d S )Ng{®Gáz„?)rQ   F)Úblocking)r3   r9   rB   r<   Úlockedr>   )r   r4   r   r   r   Útest_state_after_timeout  s    z"LockTests.test_state_after_timeoutN)r"   r#   r$   r%   rb   rc   rf   r   r   r   r   r_   Ü   s   r_   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 )N)r3   r9   r<   )r   r4   r   r   r   rb     s    zRLockTests.test_reacquirec             C   sX   |   ¡ }|  t|j¡ | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  |  t|j¡ d S )N)r3   rK   ÚRuntimeErrorr<   r9   )r   r4   r   r   r   Útest_release_unacquired  s    z"RLockTests.test_release_unacquiredc             C   sX   |   ¡ }|  t|j¡ | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  |  t|j¡ d S )N)r3   rK   rh   Ú_release_saver9   r<   )r   r4   r   r   r   Útest_release_save_unacquired&  s    z'RLockTests.test_release_save_unacquiredc                sJ   |   ¡ ‰ ‡ fdd„}t|ddƒ}z|  tˆ j¡ W d | ¡  X | ¡  d S )Nc                  s   ˆ   ¡  d S )N)r9   r   )r4   r   r   r   5  s    z+RLockTests.test_different_thread.<locals>.frA   T)r3   r
   rK   rh   r<   r!   r    )r   r   rG   r   )r4   r   rc   2  s    
z RLockTests.test_different_threadc                s    |   ¡ ‰ |  ˆ  ¡ ¡ ˆ  ¡  |  ˆ  ¡ ¡ ˆ  ¡  |  ˆ  ¡ ¡ g ‰‡ ‡fdd„}t|dƒ ¡  |  ˆd ¡ ˆ  ¡  |  ˆ  ¡ ¡ ˆ  ¡  |  ˆ  ¡ ¡ d S )Nc                  s   ˆ  ˆ  ¡ ¡ d S )N)r   Ú	_is_ownedr   )r4   r@   r   r   r   F  s    z$RLockTests.test__is_owned.<locals>.frA   r   )r3   rB   rl   r9   r>   r
   r    r<   )r   r   r   )r4   r@   r   Útest__is_owned>  s    zRLockTests.test__is_ownedN)	r"   r#   r$   r%   rb   ri   rk   rc   rm   r   r   r   r   rg     s   	rg   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S )Ú
EventTestsz"
    Tests for Event objects.
    c             C   sr   |   ¡ }|  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)Ú	eventtyperB   Úis_setÚsetr>   Úclear)r   Úevtr   r   r   Útest_is_setU  s    zEventTests.test_is_setc                s|   d}g ‰g ‰‡ ‡‡fdd„}t ||ƒ}| ¡  tƒ  |  tˆƒd¡ ˆ  ¡  | ¡  |  ˆdg| ¡ |  ˆdg| ¡ d S )NrD   c                  s    ˆ  ˆ  ¡ ¡ ˆ  ˆ  ¡ ¡ d S )N)r   Úwaitr   )rs   Úresults1Úresults2r   r   r   f  s    z#EventTests._check_notify.<locals>.fr   T)r
   r   r	   rE   r   rq   r    )r   rs   rF   r   rG   r   )rs   rv   rw   r   Ú_check_notifya  s    
zEventTests._check_notifyc             C   s0   |   ¡ }|  |¡ | ¡  | ¡  |  |¡ d S )N)ro   rx   rq   rr   )r   rs   r   r   r   Útest_notifyr  s
    
zEventTests.test_notifyc                s¼   |   ¡ ‰ g ‰g ‰d}‡ ‡‡fdd„}t||ƒ ¡  |  ˆdg| ¡ x&ˆD ]\}}|  |¡ |  |d¡ qJW g ‰g ‰ˆ  ¡  t||ƒ ¡  |  ˆdg| ¡ xˆD ]\}}|  |¡ q¢W d S )NrD   c                 s@   ˆ  ˆ  d¡¡ t ¡ } ˆ  d¡}t ¡ }ˆ  |||  f¡ d S )Ng        g      à?)r   ru   r   rR   )rS   ÚrrT   )rs   rv   rw   r   r   r     s
    
z"EventTests.test_timeout.<locals>.fFg      à?T)ro   r
   r    rE   rB   r1   rq   r>   )r   rF   r   rz   Údtr   )rs   rv   rw   r   rX   z  s"    
zEventTests.test_timeoutc                sn   |   ¡ ‰ g ‰d‰d}‡ ‡‡fdd„}t||ƒ}| ¡  t ˆ¡ ˆ  ¡  ˆ  ¡  | ¡  |  ˆdg| ¡ d S )Ng      Ð?rD   c                  s   ˆ  ˆ  ˆd ¡¡ d S )Né   )r   ru   r   )rs   rU   rQ   r   r   r   š  s    z(EventTests.test_set_and_clear.<locals>.fT)	ro   r
   r   r   r   rq   rr   r    rE   )r   rF   r   rG   r   )rs   rU   rQ   r   Útest_set_and_clear“  s    

zEventTests.test_set_and_clearc          	   C   s\   |   ¡ }|j |  |j d¡¡ W d Q R X | ¡  |j |  |j d¡¡ W d Q R X d S )NF)ro   Ú_condrB   r9   Ú_reset_internal_locks)r   rs   r   r   r   Útest_reset_internal_locks¤  s    z$EventTests.test_reset_internal_locksN)
r"   r#   r$   r%   rt   rx   ry   rX   r}   r€   r   r   r   r   rn   P  s   rn   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 Q R X d S )NF)Úcondtyper9   r<   r   ÚLockrB   r>   )r   Úcondr4   r   r   r   Útest_acquire³  s    
zConditionTests.test_acquirec             C   s   |   ¡ }|  t|j¡ d S )N)r‚   rK   rh   ru   )r   r„   r   r   r   Útest_unacquired_waitÆ  s    z#ConditionTests.test_unacquired_waitc             C   s   |   ¡ }|  t|j¡ d S )N)r‚   rK   rh   Únotify)r   r„   r   r   r   Útest_unacquired_notifyÊ  s    z%ConditionTests.test_unacquired_notifyc                sê  d}g ‰g ‰g ‰d‰‡ ‡‡‡‡fdd„}t ||ƒ}| ¡  xtˆƒdk rPtƒ  q<W ˆ ¡  |  ˆg ¡ ˆ  ¡  ˆ  d¡ tƒ  d‰ˆ  ¡  xtˆƒdk r tƒ  qŒW |  ˆdgd ¡ |  ˆg ¡ xtˆƒdk rÖtƒ  qÂW ˆ  ¡  ˆ  d¡ tƒ  d‰ˆ  ¡  x tˆƒtˆƒ d	k rtƒ  qþW |  ˆdgd d
gd  ¡ |  ˆd
gd ¡ xtˆƒdk rftƒ  qNW ˆ  ¡  ˆ  	¡  tƒ  d‰ˆ  ¡  xtˆƒdk r¤tƒ  qŒW |  ˆdgd d
gd  ¡ |  ˆd
gd dgd  ¡ | 
¡  d S )NrD   r   c                 sd   ˆ   ¡  ˆ ˆ¡ ˆ  ¡ } ˆ  ¡  ˆ | ˆf¡ ˆ   ¡  ˆ ˆ¡ ˆ  ¡ } ˆ  ¡  ˆ | ˆf¡ d S )N)r9   r   ru   r<   )r@   )r„   Ú	phase_numÚreadyrv   rw   r   r   r   ß  s    

z'ConditionTests._check_notify.<locals>.fé   rA   )TrA   ra   é   )Tra   )Tr‹   )r
   r   r   r	   rr   rE   r9   r‡   r<   Ú
notify_allr    )r   r„   rF   r   rG   r   )r„   r‰   rŠ   rv   rw   r   rx   Î  sX    






zConditionTests._check_notifyc             C   s    |   ¡ }|  |¡ |  |¡ d S )N)r‚   rx   )r   r„   r   r   r   ry     s    
zConditionTests.test_notifyc                sh   |   ¡ ‰ g ‰d}‡ ‡fdd„}t||ƒ ¡  |  tˆƒ|¡ x&ˆD ]\}}|  |d¡ |  |¡ qBW d S )NrD   c                 s@   ˆ   ¡  t ¡ } ˆ  d¡}t ¡ }ˆ  ¡  ˆ ||  |f¡ d S )Ng      à?)r9   r   rR   ru   r<   r   )rS   r@   rT   )r„   rU   r   r   r   "  s    
z&ConditionTests.test_timeout.<locals>.fg      à?)r‚   r
   r    rE   r   r1   rB   )r   rF   r   r{   r@   r   )r„   rU   r   rX     s    zConditionTests.test_timeoutc          
      sv   ˆ  ¡ ‰ d‰‡ ‡‡fdd„}t|dƒ}| ¡  x:tdƒD ].}t d¡ ˆ  ˆd7 ‰ˆ  ¡  W d Q R X q8W | ¡  d S )Nr   c           	      s<   ˆ . ˆ   ‡fdd„¡} ˆ | ¡ ˆ ˆd¡ W d Q R X d S )Nc                  s   ˆ dkS )Nr|   r   r   )Ústater   r   Ú<lambda>9  ó    z8ConditionTests.test_waitfor.<locals>.f.<locals>.<lambda>r|   )Úwait_forr>   rE   )r@   )r„   r   rŽ   r   r   r   7  s    
z&ConditionTests.test_waitfor.<locals>.frA   r|   g{®Gáz„?)r‚   r
   r   r   r   r   r‡   r    )r   r   rG   r   r   )r„   r   rŽ   r   Útest_waitfor4  s    

zConditionTests.test_waitforc          
      sŒ   ˆ  ¡ ‰ d‰g ‰‡ ‡‡‡fdd„}t|dƒ}| ¡  x:tdƒD ].}t d¡ ˆ  ˆd7 ‰ˆ  ¡  W d Q R X q>W | ¡  ˆ t	ˆƒd¡ d S )Nr   c           	      s^   ˆ P t  ¡ } ˆ j‡fdd„dd}t  ¡ |  } ˆ |¡ ˆ | d¡ ˆ d ¡ W d Q R X d S )Nc                  s   ˆ dkS )Nr|   r   r   )rŽ   r   r   r   L  r   z@ConditionTests.test_waitfor_timeout.<locals>.f.<locals>.<lambda>gš™™™™™¹?)rQ   )r   rR   r‘   rB   r1   r   )r{   r@   )r„   r   rŽ   Úsuccessr   r   r   I  s    
z.ConditionTests.test_waitfor_timeout.<locals>.frA   r‹   g{®Gáz„?)
r‚   r
   r   r   r   r   r‡   r    rE   r   )r   r   rG   r   r   )r„   r   rŽ   r“   r   Útest_waitfor_timeoutE  s    

z#ConditionTests.test_waitfor_timeoutN)r"   r#   r$   r%   r…   r†   rˆ   rx   ry   rX   r’   r”   r   r   r   r   r   ®  s   J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             C   s,   | j t| jdd | j t| jtj d d S )Néÿÿÿÿ)Úvalue)rK   rV   ÚsemtypeÚsysÚmaxsize)r   r   r   r   r5   b  s    z#BaseSemaphoreTests.test_constructorc             C   sH   |   d¡}| ¡  | ¡  |   d¡}| ¡  | ¡  | ¡  | ¡  d S )NrA   ra   )r˜   r9   r<   )r   Úsemr   r   r   r…   f  s    

zBaseSemaphoreTests.test_acquirec             C   s   |   ¡ }| ¡  ~d S )N)r˜   r9   )r   r›   r   r   r   r;   p  s    z'BaseSemaphoreTests.test_acquire_destroyc                sŠ  |   d¡‰ˆ ¡  d}g ‰g ‰g ‰d‰ ‡ ‡‡‡‡fdd„}t|dƒ}| ¡  xtˆƒtˆƒ dk rjtƒ  qNW |  ˆˆ dgd ¡ d‰ xtdƒD ]}ˆ ¡  qW 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gd ¡ d S )Né   é
   r   c                  s4   ˆ  ˆ ¡ ¡ ˆ  ˆ ¡ ˆ  ˆ ¡ ¡ ˆ  ˆ ¡ d S )N)r   r9   r   )r‰   rv   rw   r›   Úsem_resultsr   r   r   }  s    
z4BaseSemaphoreTests.test_acquire_contended.<locals>.fé   rA   é   ra   é   FTé   )r˜   r9   r
   r   r   r	   rE   r   r<   ÚsortedrB   r    )r   rF   r   rG   r   r   )r‰   rv   rw   r›   rž   r   rH   u  s:    



$.z)BaseSemaphoreTests.test_acquire_contendedc             C   sV   |   d¡}|  | d¡¡ |  | d¡¡ |  | d¡¡ | ¡  |  | d¡¡ d S )Nra   F)r˜   r>   r9   rB   r<   )r   r›   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 )	Nr|   c                  s$   ˆ   ˆ d¡¡ ˆ   ˆ d¡¡ d S )NF)r   r9   r   )rU   r›   r   r   r   ¦  s    z8BaseSemaphoreTests.test_try_acquire_contended.<locals>.frD   Frœ   Tr‹   )r˜   r9   r
   r    rE   r£   )r   r   r   )rU   r›   r   rC   ¢  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 )Nra   Fg      ð?)rQ   g{®Gázt?g      à?)
r˜   rK   rV   r9   r>   rB   r<   r   rR   r1   )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 )N)r9   r<   r   )r›   r   r   r   À  s    z0BaseSemaphoreTests.test_default_value.<locals>.frA   )	r˜   r9   r
   r   r	   rB   r   r<   r    )r   r   rG   r   )r›   r   Útest_default_value¼  s    
z%BaseSemaphoreTests.test_default_valuec                sb   ˆ   d¡‰d‡ ‡fdd„	}|ƒ  ˆ  ˆ d¡¡ ˆ ¡  ˆ  t|t¡ ˆ  ˆ d¡¡ ˆ ¡  d S )Nra   c          
      sT   ˆF ˆ   ˆ d¡¡ ˆ ¡  ˆ ˆ  ˆ d¡¡ | r<| ‚W d Q R X W d Q R X d S )NF)r>   r9   r<   rB   )rI   )r   r›   r   r   rJ   Ì  s    z+BaseSemaphoreTests.test_with.<locals>._withF)N)r˜   r>   r9   r<   rK   rL   )r   rJ   r   )r   r›   r   rM   Ê  s    
zBaseSemaphoreTests.test_withN)r"   r#   r$   r%   r5   r…   r;   rH   r?   rC   r¥   r¦   rM   r   r   r   r   r•   ]  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 )NrA   )r˜   r<   r9   )r   r›   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)r˜   rK   rV   r<   r9   )r   r›   r   r   r   ri   î  s
    z-BoundedSemaphoreTests.test_release_unacquiredN)r"   r#   r$   r%   ri   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.
    rD   g       @c             C   s   | j | j| jd| _d S )N)rQ   )ÚbarriertyperF   ÚdefaultTimeoutÚbarrier)r   r   r   r   r)   þ  s    zBarrierTests.setUpc             C   s   | j  ¡  d S )N)r¬   Úabort)r   r   r   r   r,      s    zBarrierTests.tearDownc             C   s"   t || jd ƒ}|ƒ  | ¡  d S )NrA   )r
   rF   r    )r   r   rG   r   r   r   Úrun_threads  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   TrA   )r¬   ÚpartiesrE   rF   r   r   r   ru   Ú	n_waitingrB   Úbroken)r   rU   r   Úmr   r   r   r   Ú	multipass  s    
zBarrierTests.multipassrA   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   )ÚpassesrU   r   r   r   r     s    z$BarrierTests.test_barrier.<locals>.fN)r®   )r   r´   r   r   )r´   rU   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_10  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¬   ru   r   )rz   )rU   r   r   r   r   )  s    
z(BarrierTests.test_wait_return.<locals>.fN)r®   rE   Úsumr   rF   )r   r   r   )rU   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 )NT)r   r   )rU   r   r   Úaction5  s    z(BarrierTests.test_action.<locals>.actionc                  s   ˆ   ¡  ˆ tˆƒd¡ d S )NrA   )ru   rE   r   r   )r¬   rU   r   r   r   r   8  s    z#BarrierTests.test_action.<locals>.fN)rª   rF   r®   )r   r¹   r   r   )r¬   rU   r   r   Útest_action0  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 )Nra   T)r¬   ru   rF   rh   r   r   ÚBrokenBarrierErrorr­   )r   )rv   rw   r   r   r   r   D  s    


z"BarrierTests.test_abort.<locals>.fr   rA   N)r®   rE   r   rF   r>   r¬   r±   )r   r   r   )rv   rw   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 )Nra   rA   gü©ñÒMbP?T)
r¬   ru   rF   r°   r   r   Úresetr   r   r»   )r   )rv   rw   Úresults3r   r   r   r   ]  s    


z"BarrierTests.test_reset.<locals>.fr   rA   N)r®   rE   r   rF   )r   r   r   )rv   rw   r¾   r   r   Ú
test_resetV  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 )Nra   T)	r¬   ru   rF   rh   r   r   r»   r­   r½   )r   )Úbarrier2rv   rw   r¾   r   r   r   r   |  s     




z,BarrierTests.test_abort_and_reset.<locals>.fr   rA   N)rª   rF   r®   rE   r   )r   r   r   )rÀ   rv   rw   r¾   r   r   Útest_abort_and_resett  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 )Nra   g      ð?g      à?)r¬   ru   rF   r   r   rK   r   r»   )r   )r   r   r   r   š  s
    

z$BarrierTests.test_timeout.<locals>.fN)r®   )r   r   r   )r   r   rX   –  s    zBarrierTests.test_timeoutc                s,   ˆj ˆjdd‰ ‡ ‡fdd„}ˆ |¡ dS )z4
        Test the barrier's default timeout
        g333333Ó?)rQ   c                 s4   ˆ   ¡ } | ˆjd kr t d¡ ˆ tjˆ j ¡ d S )Nra   g      ð?)ru   rF   r   r   rK   r   r»   )r   )r¬   r   r   r   r   ª  s    
z,BarrierTests.test_default_timeout.<locals>.fN)rª   rF   r®   )r   r   r   )r¬   r   r   Útest_default_timeout¤  s    z!BarrierTests.test_default_timeoutc             C   s   |   d¡}| ¡  | ¡  d S )NrA   )rª   ru   )r   rG   r   r   r   Útest_single_thread²  s    
zBarrierTests.test_single_threadN)rA   )r"   r#   r$   r%   rF   r«   r)   r,   r®   r³   rµ   r¶   r¸   rº   r¼   r¿   rÁ   rX   rÂ   rÃ   r   r   r   r   r©   ÷  s"   
	"r©   )r%   r™   r   Ú_threadr   r   r   ÚunittestrY   Útestr   r	   Úobjectr
   ÚTestCaser&   r2   r_   rg   rn   r   r•   r§   r¨   r©   r   r   r   r   Ú<module>   s*   1 1C^ 0~