B
    v9aÈz  ã               @   sš   d dl Z d dl mZ d dlZd dlZd dlmZ dZe e¡Z	G dd„ dej
ƒZG dd„ dej
ƒZG d	d
„ d
ej
ƒZG dd„ dej
ƒZedkr–e  ¡  dS )é    N)Úmock)Úutilszv^<(?P<class>.*?) object at (?P<address>.*?)\[(?P<extras>(set|unset|locked|unlocked)(, value:\d)?(, waiters:\d+)?)\]>\Zc                   s”   e Zd Z‡ f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‡  ZS )!Ú	LockTestsc                s   t ƒ  ¡  |  ¡ | _d S )N)ÚsuperÚsetUpÚnew_test_loopÚloop)Úself)Ú	__class__© ú /usr/lib/python3.7/test_locks.pyr      s    
zLockTests.setUpc             C   sD   t  ¡ }tj|d}|  |j|¡ tj| jd}|  |j| j¡ d S )N)r   )r   ÚMockÚasyncioÚLockÚassertIsÚ_loopr   )r	   r   Úlockr   r   r   Útest_ctor_loop   s
    zLockTests.test_ctor_loopc             C   s(   t  | j¡ t  ¡ }|  |j| j¡ d S )N)r   Úset_event_loopr   r   r   r   )r	   r   r   r   r   Útest_ctor_noloop!   s    zLockTests.test_ctor_noloopc                s„   t jˆjd‰ ˆ tˆ ƒ d¡¡ ˆ t tˆ ƒ¡¡ t j‡ ‡fdd„ƒ}ˆj 	|ƒ ¡ ˆ tˆ ƒ d¡¡ ˆ t tˆ ƒ¡¡ d S )N)r   z[unlocked]>c            	   3   s$   ˆ  t¡ ˆ E d H  W d Q R X d S )N)ÚassertWarnsÚDeprecationWarningr   )r   r	   r   r   Úacquire_lock+   s    z)LockTests.test_repr.<locals>.acquire_lockz	[locked]>)
r   r   r   Ú
assertTrueÚreprÚendswithÚRGX_REPRÚmatchÚ	coroutineÚrun_until_complete)r	   r   r   )r   r	   r   Ú	test_repr&   s    zLockTests.test_reprc                sb   t jˆjd‰ t j‡ ‡fdd„ƒ}ˆj |ƒ ¡}ˆ |¡ ˆ ˆ  ¡ ¡ ˆ  ¡  ˆ ˆ  ¡ ¡ d S )N)r   c            	   3   s    ˆ  t¡ ˆ E d H S Q R X d S )N)r   r   r   )r   r	   r   r   r   7   s    z)LockTests.test_lock.<locals>.acquire_lock)	r   r   r   r   r   r   ÚlockedÚreleaseÚassertFalse)r	   r   Úresr   )r   r	   r   Ú	test_lock4   s    
zLockTests.test_lockc                s€   t  ¡ ‰ ˆ ˆ ¡ t jˆ dt jˆ dt jˆ dt jˆ dg}t j‡ ‡fdd„ƒ}x(|D ] }ˆ  ||ƒ¡ ˆ 	| 
¡ ¡ qXW d S )N)r   c          
   3   sœ   t jdˆ dE d H  ˆ |  ¡ ¡ ˆ t¡f | E d H B}ˆ |d ¡ ˆ |  ¡ ¡ t jdˆ dE d H  ˆ |  ¡ ¡ W d Q R X ˆ |  ¡ ¡ W d Q R X d S )Ng{®Gáz„?)r   )r   Zsleepr#   r!   r   r   r   r   )r   Ú_lock)r   r	   r   r   ÚtestN   s    z3LockTests.test_lock_by_with_statement.<locals>.test)r   Únew_event_loopr   r   Ú	ConditionÚ	SemaphoreÚBoundedSemaphorer   r   r#   r!   )r	   Z
primitivesr'   Z	primitiver   )r   r	   r   Útest_lock_by_with_statementD   s    




z%LockTests.test_lock_by_with_statementc                s~  t j| jd‰ g }|  | j ˆ  ¡ ¡¡ ‡ fdd„}‡ fdd„}‡ fdd„}t j||ƒ| jd}t j||ƒ| jd}t | j¡ |  	g |¡ ˆ  
¡  t | j¡ |  	dg|¡ t | j¡ |  	dg|¡ t j||ƒ| jd}ˆ  
¡  t | j¡ |  	dd	g|¡ ˆ  
¡  t | j¡ |  	dd	d
g|¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ d S )N)r   c             “   s   ˆ   ¡ I d H r|  d¡ dS )Né   T)ÚacquireÚappend)Úresult)r   r   r   Úc1d   s    
z"LockTests.test_acquire.<locals>.c1c             “   s   ˆ   ¡ I d H r|  d¡ dS )Né   T)r.   r/   )r0   )r   r   r   Úc2i   s    
z"LockTests.test_acquire.<locals>.c2c             “   s   ˆ   ¡ I d H r|  d¡ dS )Né   T)r.   r/   )r0   )r   r   r   Úc3n   s    
z"LockTests.test_acquire.<locals>.c3r-   r2   r4   )r   r   r   r   r   r.   ÚTaskÚ
test_utilsÚrun_brieflyÚassertEqualr"   Údoner0   )r	   r0   r1   r3   r5   Út1Út2Út3r   )r   r   Útest_acquire^   s8    zLockTests.test_acquirec             C   sj   t j| jd}|  | j | ¡ ¡¡ t j| ¡ | jd}| j |j¡ |  	t j
| jj|¡ |  |j¡ d S )N)r   )r   r   r   r   r   r.   r6   Ú	call_soonÚcancelÚassertRaisesÚCancelledErrorr#   Ú_waiters)r	   r   Ztaskr   r   r   Útest_acquire_cancel‘   s    zLockTests.test_acquire_cancelc                s.  t j| jd‰ ‡ fdd„}t j| jd}t j|d|ƒ| jd}t | j¡ |  ˆ  ¡ ¡ t j|dd ƒ| jd}t | j¡ |  	t
ˆ jƒd¡ t j|dd ƒ| jd}t | j¡ |  	t
ˆ jƒd¡ | d ¡ | ¡  |  ˆ jd	  ¡ ¡ t | j¡ |  ˆ  ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ d S )
N)r   c             “   s4   ˆ   ¡ I d H  z|d k	r"|I d H  W d ˆ  ¡  X d S )N)r.   r"   )ÚnameZblocker)r   r   r   Úlockit­   s
    z*LockTests.test_cancel_race.<locals>.lockitÚAÚBr-   ÚCr2   r   )r   r   r   ZFuturer6   r7   r8   r   r!   r9   ÚlenrC   Z
set_resultr@   Ú	cancelledr#   r:   )r	   rF   ÚfaÚtaÚtbÚtcr   )r   r   Útest_cancel_raceœ   s(    
zLockTests.test_cancel_racec                s  t jˆjd‰d‰d‰ ‡ ‡‡fdd„}‡‡‡fdd„}‡‡fdd„‰ˆj |ƒ ¡}ˆj |ƒ ¡‰ˆj |ƒ ¡}ˆj |ƒ ¡}t ˆj¡ ˆ | ¡ ¡ t ˆj¡ t ˆj¡ ˆ ˆd	¡ ˆ ˆ d
¡ ˆ ˆ 	¡ oØ| ¡ ¡ | 
¡  t ˆj¡ ˆ | 	¡ ¡ d S )N)r   r   c               “   s"   ˆ d7 ‰ ˆ  ¡ I d H  ˆd7 ‰d S )Nr-   )r.   r   )Ú
call_countr   Ú
lock_countr   r   rF   Ó   s    z2LockTests.test_cancel_release_race.<locals>.lockitc               “   s   ˆ   ¡ I d H  ˆj ˆ¡ d S )N)r.   r   r?   r   )r   r	   Útriggerr   r   ÚlockandtriggerÚ   s    z:LockTests.test_cancel_release_race.<locals>.lockandtriggerc                  s   ˆ  ¡  ˆ  ¡  d S )N)r@   r"   r   )r   r;   r   r   rS   Þ   s    z3LockTests.test_cancel_release_race.<locals>.triggerr-   r4   )r   r   r   Zcreate_taskr7   r8   r   r:   r9   rK   r@   )r	   rF   rT   Zt0r<   r=   r   )rQ   r   rR   r	   r;   rS   r   Útest_cancel_release_raceË   s(    z"LockTests.test_cancel_release_racec             C   sÌ   t j| jd}t j| ¡ | jd}t | j¡ |  | ¡ ¡ t j| ¡ | jd}t | j¡ |  	t
|jƒd¡ t j| ¡ | jd}| ¡  | ¡  t | j¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ d S )N)r   r-   )r   r   r   r6   r.   r7   r8   r   r!   r9   rJ   rC   r"   r@   r:   rK   )r	   r   rM   rN   rO   r   r   r   Útest_finished_waiter_cancelledû   s    z(LockTests.test_finished_waiter_cancelledc             C   s    t j| jd}|  t|j¡ d S )N)r   )r   r   r   rA   ÚRuntimeErrorr"   )r	   r   r   r   r   Útest_release_not_acquired  s    z#LockTests.test_release_not_acquiredc             C   sF   t j| jd}| j | ¡ ¡ |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)r   )	r   r   r   r   r.   r   r!   r"   r#   )r	   r   r   r   r   Útest_release_no_waiters  s
    z!LockTests.test_release_no_waitersc          	      s\   t jˆjd‰ t j‡ ‡fdd„ƒ}ˆj |ƒ ¡ ˆ ˆ  ¡ ¡ W d Q R X ˆ ˆ  ¡ ¡ d S )N)r   c            	   3   s    ˆ  t¡ ˆ E d H S Q R X d S )N)r   r   r   )r   r	   r   r   r   !  s    z4LockTests.test_context_manager.<locals>.acquire_lock)r   r   r   r   r   r   r!   r#   )r	   r   r   )r   r	   r   Útest_context_manager  s
    zLockTests.test_context_managerc          
      s†   t jˆjd‰ t j‡ ‡fdd„ƒ}ˆj |ƒ ¡}| ˆ ˆ  ¡ ¡ W d Q R X ˆ ˆ  ¡ ¡ ˆ t	¡ | W d Q R X W d Q R X d S )N)r   c            	   3   s    ˆ  t¡ ˆ E d H S Q R X d S )N)r   r   r   )r   r	   r   r   r   .  s    z?LockTests.test_context_manager_cant_reuse.<locals>.acquire_lock)
r   r   r   r   r   r   r!   r#   rA   ÚAttributeError)r	   r   Úcmr   )r   r	   r   Útest_context_manager_cant_reuse+  s    z)LockTests.test_context_manager_cant_reusec          
   C   sr   t j| jd}y| |  d¡ W d Q R X W n2 tk
r^ } z|  t|ƒd¡ W d d }~X Y nX |  | ¡ ¡ d S )N)r   z-RuntimeError is not raised in with expressionz9"yield from" should be used as context manager expression)	r   r   r   ÚfailrW   r9   Ústrr#   r!   )r	   r   Úerrr   r   r   Útest_context_manager_no_yield>  s    z'LockTests.test_context_manager_no_yield)Ú__name__Ú
__module__Ú__qualname__r   r   r   r    r%   r,   r>   rD   rP   rU   rV   rX   rY   rZ   r]   ra   Ú__classcell__r   r   )r
   r   r      s    3/0r   c                   s\   e Zd Z‡ f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‡  ZS )Ú
EventTestsc                s   t ƒ  ¡  |  ¡ | _d S )N)r   r   r   r   )r	   )r
   r   r   r   N  s    
zEventTests.setUpc             C   sD   t  ¡ }tj|d}|  |j|¡ tj| jd}|  |j| j¡ d S )N)r   )r   r   r   ÚEventr   r   r   )r	   r   Úevr   r   r   r   R  s
    zEventTests.test_ctor_loopc             C   s(   t  | j¡ t  ¡ }|  |j| j¡ d S )N)r   r   r   rg   r   r   )r	   rh   r   r   r   r   Z  s    zEventTests.test_ctor_noloopc             C   s¬   t j| jd}|  t|ƒ d¡¡ t t|ƒ¡}|  | 	d¡d¡ | 
¡  |  t|ƒ d¡¡ |  t t|ƒ¡¡ |j t ¡ ¡ |  dt|ƒk¡ |  t t|ƒ¡¡ d S )N)r   z[unset]>ÚextrasZunsetz[set]>z	waiters:1)r   rg   r   r   r   r   r   r   r9   ÚgroupÚsetrC   r/   r   r   )r	   rh   r   r   r   r   r    _  s    zEventTests.test_reprc                s  t j| jd‰ |  ˆ  ¡ ¡ g }‡ fdd„}‡ fdd„}‡ fdd„}t j||ƒ| jd}t j||ƒ| jd}t | j¡ |  g |¡ t j||ƒ| jd}ˆ  	¡  t | j¡ |  dd	d
g|¡ |  
| ¡ ¡ |  | ¡ ¡ |  
| ¡ ¡ |  | ¡ ¡ |  
| ¡ ¡ |  | ¡ ¡ d S )N)r   c             “   s   ˆ   ¡ I d H r|  d¡ d S )Nr-   )Úwaitr/   )r0   )rh   r   r   r1   s  s    z EventTests.test_wait.<locals>.c1c             “   s   ˆ   ¡ I d H r|  d¡ d S )Nr2   )rl   r/   )r0   )rh   r   r   r3   w  s    z EventTests.test_wait.<locals>.c2c             “   s   ˆ   ¡ I d H r|  d¡ d S )Nr4   )rl   r/   )r0   )rh   r   r   r5   {  s    z EventTests.test_wait.<locals>.c3r4   r-   r2   )r   rg   r   r#   Úis_setr6   r7   r8   r9   rk   r   r:   ZassertIsNoner0   )r	   r0   r1   r3   r5   r;   r<   r=   r   )rh   r   Ú	test_waitm  s(    zEventTests.test_waitc             C   s4   t j| jd}| ¡  | j | ¡ ¡}|  |¡ d S )N)r   )r   rg   r   rk   r   rl   r   )r	   rh   r$   r   r   r   Útest_wait_on_set’  s    zEventTests.test_wait_on_setc             C   sT   t j| jd}t j| ¡ | jd}| j |j¡ |  t j| jj	|¡ |  
|j¡ d S )N)r   )r   rg   r   r6   rl   r?   r@   rA   rB   r   r#   rC   )r	   rh   rl   r   r   r   Útest_wait_cancel™  s    zEventTests.test_wait_cancelc             C   sL   t j| jd}|  | ¡ ¡ | ¡  |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)r   )r   rg   r   r#   rm   rk   r   Úclear)r	   rh   r   r   r   Ú
test_clear£  s    zEventTests.test_clearc                sÖ   t j| jd‰ g }‡ fdd„}t j||ƒ| jd}t | j¡ |  g |¡ ˆ  ¡  ˆ  ¡  |  	ˆ  
¡ ¡ ˆ  ¡  ˆ  ¡  |  dtˆ jƒ¡ t | j¡ |  dg|¡ |  dtˆ jƒ¡ |  | ¡ ¡ |  | ¡ ¡ d S )N)r   c             “   s   ˆ   ¡ I d H r|  d¡ dS )Nr-   T)rl   r/   )r0   )rh   r   r   r1   ±  s    
z.EventTests.test_clear_with_waiters.<locals>.c1r-   r   )r   rg   r   r6   r7   r8   r9   rk   rq   r#   rm   rJ   rC   r   r:   r0   )r	   r0   r1   Útr   )rh   r   Útest_clear_with_waiters­  s"    z"EventTests.test_clear_with_waiters)rb   rc   rd   r   r   r   r    rn   ro   rp   rr   rt   re   r   r   )r
   r   rf   L  s   %

rf   c                   s´   e Zd Z‡ f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!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Z‡  ZS ))ÚConditionTestsc                s   t ƒ  ¡  |  ¡ | _d S )N)r   r   r   r   )r	   )r
   r   r   r   Ì  s    
zConditionTests.setUpc             C   sD   t  ¡ }tj|d}|  |j|¡ tj| jd}|  |j| j¡ d S )N)r   )r   r   r   r)   r   r   r   )r	   r   Úcondr   r   r   r   Ð  s
    zConditionTests.test_ctor_loopc             C   s(   t  | j¡ t  ¡ }|  |j| j¡ d S )N)r   r   r   r)   r   r   )r	   rv   r   r   r   r   Ø  s    zConditionTests.test_ctor_noloopc                sü  t j| jd‰ g }‡ fdd„}‡ fdd„}‡ fdd„}t j||ƒ| jd}t j||ƒ| jd}t j||ƒ| jd}t | j¡ |  g |¡ |  ˆ  ¡ ¡ |  	| j 
ˆ  ¡ ¡¡ ˆ  ¡  t | j¡ |  g |¡ |  	ˆ  ¡ ¡ ˆ  ¡  t | j¡ |  dg|¡ |  	ˆ  ¡ ¡ ˆ  d	¡ t | j¡ |  dg|¡ |  	ˆ  ¡ ¡ ˆ  ¡  t | j¡ |  dd	g|¡ |  	ˆ  ¡ ¡ ˆ  ¡  t | j¡ |  dd	d
g|¡ |  	ˆ  ¡ ¡ |  	| ¡ ¡ |  	| ¡ ¡ |  	| ¡ ¡ |  	| ¡ ¡ |  	| ¡ ¡ |  	| ¡ ¡ d S )N)r   c             “   s*   ˆ   ¡ I d H  ˆ  ¡ I d H r&|  d¡ dS )Nr-   T)r.   rl   r/   )r0   )rv   r   r   r1   á  s    
z$ConditionTests.test_wait.<locals>.c1c             “   s*   ˆ   ¡ I d H  ˆ  ¡ I d H r&|  d¡ dS )Nr2   T)r.   rl   r/   )r0   )rv   r   r   r3   ç  s    
z$ConditionTests.test_wait.<locals>.c2c             “   s*   ˆ   ¡ I d H  ˆ  ¡ I d H r&|  d¡ dS )Nr4   T)r.   rl   r/   )r0   )rv   r   r   r5   í  s    
z$ConditionTests.test_wait.<locals>.c3r-   r2   r4   )r   r)   r   r6   r7   r8   r9   r#   r!   r   r   r.   Únotifyr"   r:   r0   )r	   r0   r1   r3   r5   r;   r<   r=   r   )rv   r   rn   Ý  sL    
zConditionTests.test_waitc             C   sr   t j| jd}| j | ¡ ¡ t j| ¡ | jd}| j |j¡ |  	t j
| jj|¡ |  |j¡ |  | ¡ ¡ d S )N)r   )r   r)   r   r   r.   r6   rl   r?   r@   rA   rB   r#   rC   r   r!   )r	   rv   rl   r   r   r   rp     s    zConditionTests.test_wait_cancelc             C   sÖ   t j| jd}| j | ¡ ¡ |  | ¡ ¡ t j| ¡ | jd}t	 
| j¡ |  | ¡ ¡ | j | ¡ ¡ |  | ¡ ¡ | ¡  | j |j¡ | j |j¡ y| j |¡ W n t jk
rÂ   Y nX |  | ¡ ¡ d S )N)r   )r   r)   r   r   r.   r   r!   r6   rl   r7   r8   r#   rw   r?   r@   r"   rB   )r	   rv   Z	wait_taskr   r   r   Útest_wait_cancel_contested(  s     z)ConditionTests.test_wait_cancel_contestedc                s¦   t j| jd‰ d‰‡ ‡fdd„}t j|ƒ | jd}t | j¡ | j ˆ  ¡ ¡ ˆ  ¡  t | j¡ | 	¡  t | j¡ ˆ  
¡  t | j¡ |  | ¡ ¡ |  ˆ¡ d S )N)r   Fc            
   “   s4   ˆ 4 I d H š d‰ˆ   ¡ I d H  W d Q I d H R X d S )NT)rl   r   )rv   Úwaitedr   r   Úwait_on_condF  s    zBConditionTests.test_wait_cancel_after_notify.<locals>.wait_on_cond)r   r)   r   Zensure_futurer7   r8   r   r.   rw   r@   r"   r   rK   )r	   rz   Úwaiterr   )rv   ry   r   Útest_wait_cancel_after_notifyA  s    z,ConditionTests.test_wait_cancel_after_notifyc             C   s(   t j| jd}|  t| jj| ¡ ¡ d S )N)r   )r   r)   r   rA   rW   r   rl   )r	   rv   r   r   r   Útest_wait_unacquiredZ  s    z#ConditionTests.test_wait_unacquiredc                sò   t j| jd‰ d‰‡fdd„‰g }‡ ‡fdd„}t j||ƒ| jd}t | j¡ |  g |¡ | j ˆ  ¡ ¡ ˆ  	¡  ˆ  
¡  t | j¡ |  g |¡ d‰| j ˆ  ¡ ¡ ˆ  	¡  ˆ  
¡  t | j¡ |  dg|¡ |  | ¡ ¡ |  | ¡ ¡ d S )	N)r   Fc                  s   ˆ S )Nr   r   )Úpresultr   r   Ú	predicated  s    z/ConditionTests.test_wait_for.<locals>.predicatec             “   s4   ˆ   ¡ I d H  ˆ  ˆ¡I d H r0|  d¡ ˆ  ¡  dS )Nr-   T)r.   Úwait_forr/   r"   )r0   )rv   r   r   r   r1   i  s
    
z(ConditionTests.test_wait_for.<locals>.c1Tr-   )r   r)   r   r6   r7   r8   r9   r   r.   rw   r"   r   r:   r0   )r	   r0   r1   rs   r   )rv   r   r~   r   Útest_wait_for`  s*    zConditionTests.test_wait_forc             C   sV   t j| jd}| j | dd„ ¡¡}|  dddg|¡ |  t| jj| dd„ ¡¡ d S )N)r   c               S   s
   dddgS )Nr-   r2   r4   r   r   r   r   r   Ú<lambda>‰  ó    z9ConditionTests.test_wait_for_unacquired.<locals>.<lambda>r-   r2   r4   c               S   s   dS )NFr   r   r   r   r   r‚     rƒ   )r   r)   r   r   r€   r9   rA   rW   )r	   rv   r$   r   r   r   Útest_wait_for_unacquired…  s    z'ConditionTests.test_wait_for_unacquiredc                sh  t j| jd‰ g }‡ fdd„}‡ fdd„}‡ fdd„}t j||ƒ| jd}t j||ƒ| jd}t j||ƒ| jd}t | j¡ |  g |¡ | j ˆ  ¡ ¡ ˆ  	d¡ ˆ  
¡  t | j¡ |  dg|¡ | j ˆ  ¡ ¡ ˆ  	d¡ ˆ  	d	¡ ˆ  
¡  t | j¡ |  dd
dg|¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ d S )N)r   c             “   s2   ˆ   ¡ I d H  ˆ  ¡ I d H r.|  d¡ ˆ  ¡  dS )Nr-   T)r.   rl   r/   r"   )r0   )rv   r   r   r1   •  s
    
z&ConditionTests.test_notify.<locals>.c1c             “   s2   ˆ   ¡ I d H  ˆ  ¡ I d H r.|  d¡ ˆ  ¡  dS )Nr2   T)r.   rl   r/   r"   )r0   )rv   r   r   r3   œ  s
    
z&ConditionTests.test_notify.<locals>.c2c             “   s2   ˆ   ¡ I d H  ˆ  ¡ I d H r.|  d¡ ˆ  ¡  dS )Nr4   T)r.   rl   r/   r"   )r0   )rv   r   r   r5   £  s
    
z&ConditionTests.test_notify.<locals>.c3r-   i   r2   r4   )r   r)   r   r6   r7   r8   r9   r   r.   rw   r"   r   r:   r0   )r	   r0   r1   r3   r5   r;   r<   r=   r   )rv   r   Útest_notify‘  s6    


zConditionTests.test_notifyc                sâ   t j| jd‰ g }‡ fdd„}‡ fdd„}t j||ƒ| jd}t j||ƒ| jd}t | j¡ |  g |¡ | j ˆ  ¡ ¡ ˆ  	¡  ˆ  
¡  t | j¡ |  ddg|¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ |  | ¡ ¡ d S )N)r   c             “   s2   ˆ   ¡ I d H  ˆ  ¡ I d H r.|  d¡ ˆ  ¡  dS )Nr-   T)r.   rl   r/   r"   )r0   )rv   r   r   r1   Ê  s
    
z*ConditionTests.test_notify_all.<locals>.c1c             “   s2   ˆ   ¡ I d H  ˆ  ¡ I d H r.|  d¡ ˆ  ¡  dS )Nr2   T)r.   rl   r/   r"   )r0   )rv   r   r   r3   Ñ  s
    
z*ConditionTests.test_notify_all.<locals>.c2r-   r2   )r   r)   r   r6   r7   r8   r9   r   r.   Ú
notify_allr"   r   r:   r0   )r	   r0   r1   r3   r;   r<   r   )rv   r   Útest_notify_allÅ  s"    zConditionTests.test_notify_allc             C   s    t j| jd}|  t|j¡ d S )N)r   )r   r)   r   rA   rW   rw   )r	   rv   r   r   r   Útest_notify_unacquiredé  s    z%ConditionTests.test_notify_unacquiredc             C   s    t j| jd}|  t|j¡ d S )N)r   )r   r)   r   rA   rW   r†   )r	   rv   r   r   r   Útest_notify_all_unacquiredí  s    z)ConditionTests.test_notify_all_unacquiredc             C   sÆ   t j| jd}|  dt|ƒk¡ |  t t|ƒ¡¡ | j | ¡ ¡ |  dt|ƒk¡ |j	 
t ¡ ¡ |  dt|ƒk¡ |  t t|ƒ¡¡ |j	 
t ¡ ¡ |  dt|ƒk¡ |  t t|ƒ¡¡ d S )N)r   Zunlockedr!   z	waiters:1z	waiters:2)r   r)   r   r   r   r   r   r   r.   rC   r/   r   r   )r	   rv   r   r   r   r    ñ  s    zConditionTests.test_reprc          	      s\   t jˆjd‰ t j‡ ‡fdd„ƒ}ˆj |ƒ ¡ ˆ ˆ  ¡ ¡ W d Q R X ˆ ˆ  ¡ ¡ d S )N)r   c            	   3   s    ˆ  t¡ ˆ E d H S Q R X d S )N)r   r   r   )rv   r	   r   r   Úacquire_cond  s    z9ConditionTests.test_context_manager.<locals>.acquire_cond)r   r)   r   r   r   r   r!   r#   )r	   rŠ   r   )rv   r	   r   rZ     s
    z#ConditionTests.test_context_managerc          
   C   sr   t j| jd}y| |  d¡ W d Q R X W n2 tk
r^ } z|  t|ƒd¡ W d d }~X Y nX |  | ¡ ¡ d S )N)r   z-RuntimeError is not raised in with expressionz9"yield from" should be used as context manager expression)	r   r)   r   r^   rW   r9   r_   r#   r!   )r	   rv   r`   r   r   r   ra     s    z,ConditionTests.test_context_manager_no_yieldc             C   s@   t j| jd}t j|| jd}|  |j|¡ |  |j|j¡ d S )N)r   )r   r   r   r)   r   r&   r   )r	   r   rv   r   r   r   Útest_explicit_lock  s    z!ConditionTests.test_explicit_lockc          	   C   sJ   |   ¡ }|  |j¡ tj| jd}|  t¡ tj||d W d Q R X d S )N)r   )	r   Ú
addCleanupÚcloser   r   r   rA   Ú
ValueErrorr)   )r	   r   r   r   r   r   Útest_ambiguous_loops"  s
    z#ConditionTests.test_ambiguous_loopsc                s2   t  ¡ ‰ ˆ ˆ j¡ ‡ ‡fdd„}ˆ  |ƒ ¡ d S )Nc           
   “   s`   t jˆ d} | 4 I d H š8 ˆ t j¡  t j|  ¡ dˆ dI d H  W d Q R X W d Q I d H R X d S )N)r   g      à?)Ztimeoutr   )r   r)   rA   ÚTimeoutErrorr€   rl   )Z	condition)r   r	   r   r   Útask_timeout.  s
    z:ConditionTests.test_timeout_in_block.<locals>.task_timeout)r   r(   rŒ   r   r   )r	   r‘   r   )r   r	   r   Útest_timeout_in_block*  s    z$ConditionTests.test_timeout_in_block)rb   rc   rd   r   r   r   rn   rp   rx   r|   r}   r   r„   r…   r‡   rˆ   r‰   r    rZ   ra   r‹   r   r’   re   r   r   )r
   r   ru   Ê  s(   ?%4$ru   c                   sŒ   e Zd Z‡ f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‡  ZS )ÚSemaphoreTestsc                s   t ƒ  ¡  |  ¡ | _d S )N)r   r   r   r   )r	   )r
   r   r   r   :  s    
zSemaphoreTests.setUpc             C   sD   t  ¡ }tj|d}|  |j|¡ tj| jd}|  |j| j¡ d S )N)r   )r   r   r   r*   r   r   r   )r	   r   Úsemr   r   r   r   >  s
    zSemaphoreTests.test_ctor_loopc             C   s(   t  | j¡ t  ¡ }|  |j| j¡ d S )N)r   r   r   r*   r   r   )r	   r”   r   r   r   r   F  s    zSemaphoreTests.test_ctor_noloopc             C   s"   t jd| jd}|  | ¡ ¡ d S )Nr   )r   )r   r*   r   r   r!   )r	   r”   r   r   r   Útest_initial_value_zeroK  s    z&SemaphoreTests.test_initial_value_zeroc             C   sð   t j| jd}|  t|ƒ d¡¡ |  t t|ƒ¡¡ | j | 	¡ ¡ |  t|ƒ d¡¡ |  dt|ƒk¡ |  t t|ƒ¡¡ |j
 t ¡ ¡ |  dt|ƒk¡ |  t t|ƒ¡¡ |j
 t ¡ ¡ |  dt|ƒk¡ |  t t|ƒ¡¡ d S )N)r   z[unlocked, value:1]>z	[locked]>Úwaitersz	waiters:1z	waiters:2)r   r*   r   r   r   r   r   r   r   r.   rC   r/   r   r   )r	   r”   r   r   r   r    O  s    zSemaphoreTests.test_reprc                sŒ   t jˆ jd‰ˆ  dˆj¡ t j‡ ‡fdd„ƒ}ˆ j |ƒ ¡}ˆ  |¡ ˆ  ˆ ¡ ¡ ˆ  dˆj¡ ˆ 	¡  ˆ  
ˆ ¡ ¡ ˆ  dˆj¡ d S )N)r   r-   c            	   3   s    ˆ   t¡ ˆE d H S Q R X d S )N)r   r   r   )r	   r”   r   r   r   e  s    z3SemaphoreTests.test_semaphore.<locals>.acquire_lockr   )r   r*   r   r9   Ú_valuer   r   r   r!   r"   r#   )r	   r   r$   r   )r	   r”   r   Útest_semaphorea  s    
zSemaphoreTests.test_semaphorec             C   s   |   ttjd¡ d S )Néÿÿÿÿ)rA   rŽ   r   r*   )r	   r   r   r   Útest_semaphore_valuet  s    z#SemaphoreTests.test_semaphore_valuec                sî  t jd| jd‰ g }|  | j ˆ  ¡ ¡¡ |  | j ˆ  ¡ ¡¡ |  ˆ  ¡ ¡ ‡ fdd„}‡ fdd„}‡ fdd„}‡ fd	d
„}t j||ƒ| jd}t j||ƒ| jd}t j||ƒ| jd}t	 
| j¡ |  dg|¡ |  ˆ  ¡ ¡ |  dtˆ jƒ¡ |  dˆ j¡ t j||ƒ| jd}	ˆ  ¡  ˆ  ¡  |  dˆ j¡ t	 
| j¡ |  dˆ j¡ |  dt|ƒ¡ |  ˆ  ¡ ¡ |  dtˆ jƒ¡ |  dˆ j¡ |  | ¡ ¡ |  | ¡ ¡ |||	g}
dd„ |
D ƒ}|  dt|ƒ¡ ˆ  ¡  | j t j|
Ž ¡ d S )Nr4   )r   c             “   s   ˆ   ¡ I d H  |  d¡ dS )Nr-   T)r.   r/   )r0   )r”   r   r   r1     s    
z'SemaphoreTests.test_acquire.<locals>.c1c             “   s   ˆ   ¡ I d H  |  d¡ dS )Nr2   T)r.   r/   )r0   )r”   r   r   r3   „  s    
z'SemaphoreTests.test_acquire.<locals>.c2c             “   s   ˆ   ¡ I d H  |  d¡ dS )Nr4   T)r.   r/   )r0   )r”   r   r   r5   ‰  s    
z'SemaphoreTests.test_acquire.<locals>.c3c             “   s   ˆ   ¡ I d H  |  d¡ dS )Né   T)r.   r/   )r0   )r”   r   r   Úc4Ž  s    
z'SemaphoreTests.test_acquire.<locals>.c4r-   r2   r   c             S   s    g | ]}|  ¡ r| ¡ r|‘qS r   )r:   r0   )Ú.0rs   r   r   r   ú
<listcomp>­  s    z/SemaphoreTests.test_acquire.<locals>.<listcomp>)r   r*   r   r   r   r.   r#   r!   r6   r7   r8   r9   rJ   rC   r—   r"   r:   r0   Zgather)r	   r0   r1   r3   r5   rœ   r;   r<   r=   Út4Z
race_tasksZ
done_tasksr   )r”   r   r>   w  sD    
zSemaphoreTests.test_acquirec             C   sz   t j| jd}| j | ¡ ¡ t j| ¡ | jd}| j |j¡ |  t j	| jj|¡ |  
|j prtdd„ |jD ƒƒ¡ d S )N)r   c             s   s   | ]}|  ¡ V  qd S )N)r:   )r   r{   r   r   r   ú	<genexpr>¾  s    z5SemaphoreTests.test_acquire_cancel.<locals>.<genexpr>)r   r*   r   r   r.   r6   r?   r@   rA   rB   r   rC   Úall)r	   r”   r.   r   r   r   rD   ´  s    z"SemaphoreTests.test_acquire_cancelc             C   sÒ   t jd| jd}t j| ¡ | jd}t j| ¡ | jd}t j| ¡ | jd}t j| ¡ | jd}t | j¡ | ¡  | ¡  | ¡  t | j¡ t	dd„ ||gD ƒƒ}|  
|d¡ | ¡  | ¡  t | j¡ d S )Nr   )Úvaluer   )r   c             s   s   | ]}|  ¡ V  qd S )N)r:   )r   rs   r   r   r   r    Ï  s    zCSemaphoreTests.test_acquire_cancel_before_awoken.<locals>.<genexpr>r-   )r   r*   r   r6   r.   r7   r8   r"   r@   Úsumr9   )r	   r”   r;   r<   r=   rŸ   Znum_doner   r   r   Ú!test_acquire_cancel_before_awokenÀ  s    z0SemaphoreTests.test_acquire_cancel_before_awokenc             C   sr   t jd| jd}t j| ¡ | jd}t j| ¡ | jd}t | j¡ | ¡  | ¡  t | j¡ |  	| 
¡ ¡ d S )Nr   )r¢   r   )r   )r   r*   r   r6   r.   r7   r8   r"   r@   r   r!   )r	   r”   r;   r<   r   r   r   Útest_acquire_hangÖ  s    z SemaphoreTests.test_acquire_hangc             C   s    t j| jd}|  t|j¡ d S )N)r   )r   r+   r   rA   rŽ   r"   )r	   r”   r   r   r   rX   ä  s    z(SemaphoreTests.test_release_not_acquiredc             C   sF   t j| jd}| j | ¡ ¡ |  | ¡ ¡ | ¡  |  | ¡ ¡ d S )N)r   )	r   r*   r   r   r.   r   r!   r"   r#   )r	   r”   r   r   r   rY   é  s
    z&SemaphoreTests.test_release_no_waitersc          
      s”   t jdˆ jd‰t j‡ ‡fdd„ƒ}ˆ j |ƒ ¡J ˆ  ˆ ¡ ¡ ˆ  dˆj¡ ˆ j |ƒ ¡ ˆ  	ˆ ¡ ¡ W d Q R X W d Q R X ˆ  dˆj¡ d S )Nr2   )r   c            	   3   s    ˆ   t¡ ˆE d H S Q R X d S )N)r   r   r   )r	   r”   r   r   r   ô  s    z9SemaphoreTests.test_context_manager.<locals>.acquire_lockr-   )
r   r*   r   r   r   r#   r!   r9   r—   r   )r	   r   r   )r	   r”   r   rZ   ñ  s    "z#SemaphoreTests.test_context_managerc          
   C   st   t jd| jd}y| |  d¡ W d Q R X W n2 tk
r` } z|  t|ƒd¡ W d d }~X Y nX |  d|j¡ d S )Nr2   )r   z-RuntimeError is not raised in with expressionz9"yield from" should be used as context manager expression)r   r*   r   r^   rW   r9   r_   r—   )r	   r”   r`   r   r   r   ra     s    z,SemaphoreTests.test_context_manager_no_yield)rb   rc   rd   r   r   r   r•   r    r˜   rš   r>   rD   r¤   r¥   rX   rY   rZ   ra   re   r   r   )r
   r   r“   8  s   =r“   Ú__main__)Zunittestr   Úrer   Ztest.test_asyncior   r7   ZSTR_RGX_REPRÚcompiler   ZTestCaser   rf   ru   r“   rb   Úmainr   r   r   r   Ú<module>   s"   
  ;~  p Y