U
    gK                     @  s^  U d dl mZ d dlZd dlZd dlmZmZmZ d dlZd dl	m
Z
mZ ddlmZ ddlmZ ddlT dd	lmZ dd
lmZmZ erd dlmZ ddddZddddZddddZddddZddddZddddZddddZejj de!e"gdd dd dd!d"d#Z#ddd$d%Z$dd&l%m&Z& dd'lm'Z' G d(d) d)e'Z(G d*d+ d+e'Z)G d,d- d-e'Z*d.d d/d e!e"d0d d1d e)e*gZ+d2d3d4d5d6d7d+d-gZ,ejj d8e+e,dZ-ee.e/e!e"e(e)e*f Z0d9e1d:< eg e0f Z2d9e1d;< e-d;dd<d=d>Z3e-d;dd<d?d@Z4e-d;dd<dAdBZ5dddCdDZ6dddEdFZ7dddGdHZ8dS )I    )annotationsN)TYPE_CHECKINGCallableUnion)MatcherRaisesGroup   )_core)GLOBAL_PARKING_LOT_BREAKER)*)sleep_forever)assert_checkpointswait_all_tasks_blocked)	TypeAliasNonereturnc               
     s  t     rt  jdks$t     s8tt    I d H  W 5 Q R X t   g dd fdd} t	 4 I d H p}|
|  |
|  t I d H  ddgkst  jdkst   t I d H  ddddgkstW 5 Q I d H R X d S )	Nr   r   r   c                     s&    d   I d H   d d S )Nsleepingwoken)appendwait erecordr   9/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_sync.pychild#   s    
ztest_Event.<locals>.childr   r   r   )Eventis_setAssertionError
statisticstasks_waitingsetr   r   r	   open_nursery
start_soonr   )r   nurseryr   r   r   
test_Event   s&    

r&   c                    s:  t t td W 5 Q R X t jtdd td W 5 Q R X td} t|  | jdks^t| jdkslt| j	dksztt t
 |   W 5 Q R X | jdkst|   | jdkst| j	dkst|  }|jdkst|jdkst|jt gkst|jdkstt t
 |   W 5 Q R X | jdksBtt t
 |  I d H  W 5 Q R X | jdksvtt  | dI d H  W 5 Q R X | jdkstt tj | d	 W 5 Q R X t|  jt dhkst| t  |  jdgkst| d | jdks(tt 4 | 4 I d H  | jdksNtW 5 Q I d H R X W 5 Q R X t 4 I d H }| d
I d H  | dI d H  || jd t I d H  | jdkst|  jdkst| d | jdkstt tj |   W 5 Q R X W 5 Q I d H R X | d | d
 d S )N      ?^total_tokens must be >= 1$matchr   r      Zsomeonezthird partyzvalue 1zvalue 2zvalue 3)pytestraises	TypeErrorCapacityLimiter
ValueErrorreprtotal_tokensr   borrowed_tokensavailable_tokensRuntimeErrorreleaseacquire_nowaitr    	borrowersr	   current_taskr!   acquirer   acquire_on_behalf_of
WouldBlockZacquire_on_behalf_of_nowaitr"   release_on_behalf_ofr#   r$   r   )cstatsr%   r   r   r   test_CapacityLimiter3   sh     
*
"
rA   c               	     s   ddl m}  t| }t| |j| ks*t|jdks8t|j| ksFtt	t
 |  W 5 Q R X |jdksrt|  |jdkst|j| kstd S )Nr   )infr,   )mathrB   r0   r2   r3   r   r4   r5   r-   r.   r6   r7   r8   )rB   r?   r   r   r   test_CapacityLimiter_infx   s    rD   c               
     s  t d} tt d| _W 5 Q R X tjtdd d| _W 5 Q R X tjtdd d| _W 5 Q R X | jdksrtt 4 I d H N}t	dD ]}|
| j| t I d H  qt|  jddhkst|  jd	kst|  jd7  _t|  jdddd	hkst|  jdkst|  jd	8  _| jd
ks:t| jdksJt| d | d | d t|  jd	hkst|  jdkst| d	 t|  jd
hkst|  jdkstW 5 Q I d H R X d S )Nr   r'   r(   r)   r   i   r,         )r0   r-   r.   r/   r3   r1   r   r	   r#   ranger$   r<   r   r"   r    r9   r!   r4   r>   )r?   r%   ir   r   r   (test_CapacityLimiter_change_total_tokens   s8     



rJ   c               
     sr   t dd} |  I d H  t 4 I d H (}|| j t I d H  |j  W 5 Q I d H R X t| j	dksnt
d S )Nr,   )r3   r   )r0   r;   r	   r#   r$   r   cancel_scopecancellenZ_pending_borrowersr   )Zlimiternr   r   r    test_CapacityLimiter_memleak_548   s    
rO   c                    s(  t t td W 5 Q R X t jtdd td W 5 Q R X td} t|  | jdks^t| jd kslt| 	  | jdkst| 
 jdkst|   | jdkstt  |  I d H  W 5 Q R X | jdkstt tj |   W 5 Q R X | 	  | jdkstt 4 | 4 I d H  | jdks6tW 5 Q I d H R X W 5 Q R X | jdks`t|   g  dd	d
 fdd}t 4 I d H v}|||  t I d H   dgkst| jdkst| 	  | jdkstt tj |   W 5 Q R X W 5 Q I d H R X  ddgks$td S )Nr'   z^initial value must be >= 0$r)   r+   r,   r   r   	Semaphorer   )sr   c                   s&     d |  I d H    d d S Nstartedfinished)r   r;   )rQ   r   r   r   
do_acquire   s    
z"test_Semaphore.<locals>.do_acquirerS   rT   )r-   r.   r/   rP   r1   r2   valuer   	max_valuer7   r    r!   r8   r   r;   r	   r=   r#   r$   r   )rQ   rV   r%   r   rU   r   test_Semaphore   sJ    *"rY   c               	     s   t t tddd W 5 Q R X t jtdd tddd W 5 Q R X tddd} | jdksbtt|  t jtdd |   W 5 Q R X | j	dkst| 
  | j	dkst|   | j	dkstd S )	Nr,   r'   )rX   z%^max_values must be >= initial_value$r)   r   z#^semaphore released too many times$r   )r-   r.   r/   rP   r1   rX   r   r2   r7   rW   r8   )bsr   r   r   test_Semaphore_bounded   s    r[   lockclsc                 C  s   | j S N)__name__)fnr   r   r   <lambda>       r`   )idsztype[Lock | StrictFIFOLock])r\   r   c                   s  |    rtt}| ks*tt | jtksDtt 8 4 I d H    sftt W 5 Q I d H R X W 5 Q R X   rt    st    rtt  	 I d H  W 5 Q R X   st    rt  t
t   W 5 Q R X   t
t   W 5 Q R X d  dd fdd}t 4 I d H }  rt|| t I d H    stt
tj   W 5 Q R X t
t   W 5 Q R X  }t| |j st|j kst|jdkst|| t I d H   }t| |jdksTt|j  W 5 Q I d H R X  }|j rt|jd kst|jdkstd S )Nr   r   c                
     s6   t   4 I d H  t I d H  W 5 Q I d H R X d S r]   )r	   r:   r   r   Zholder_tasklr   r   holder$  s    z,test_Lock_and_StrictFIFOLock.<locals>.holderr   r,   )lockedr   weakrefrefr2   r^   r   r8   r7   r;   r-   r.   r6   r	   r#   r$   r   r=   r    printownerr!   rK   rL   )r\   rre   r%   r    r   rc   r   test_Lock_and_StrictFIFOLock   sh    
"

rl   c                    s  t t ttd W 5 Q R X t t tt W 5 Q R X t } t|  |  rZt  rftt	   
 I d H  W 5 Q R X |  st  stt    rt     stt t    W 5 Q R X    t t   I d H  W 5 Q R X t t    W 5 Q R X t t    W 5 Q R X t ddd fdd}t 4 I d H }tdD ]}||| t I d H  q 4 I d H     W 5 Q I d H R X   stt I d H  dhkst 4 I d H     W 5 Q I d H R X t I d H  ddd	hks6tW 5 Q I d H R X t t 4 I d H }tdD ]}||| t I d H  qf 4 I d H B  d	   }t| |jdkst|jjd	kstW 5 Q I d H R X   jjdkstt I d H  ddhkst 4 I d H     W 5 Q I d H R X W 5 Q I d H R X t P} 4 I d H 2 |  z  I d H  W 5   stX W 5 Q I d H R X W 5 Q R X d S )
Nr,   intr   )rI   r   c              
     s:    4 I d H     I d H  W 5 Q I d H R X |  d S r]   )r   add)rI   r?   Zfinished_waitersr   r   waiterl  s    ztest_Condition.<locals>.waiterrF   r   r   )r-   r.   r/   	ConditionrP   StrictFIFOLockLockrf   r   r   r;   r8   r6   r7   r   notify
notify_allr"   r	   r#   rH   r$   r   r    ri   r!   Zlock_statisticsZCancelScoperL   )rd   rp   r%   rI   r    Zscoper   ro   r   test_ConditionJ  s|    $
"(
rv   )open_memory_channel)AsyncContextManagerMixinc                   @  sF   e Zd ZdddddZddddZddd	d
ZddddZdS )ChannelLock1rm   r   )capacityr   c                 C  s6   t d  |\| _| _t|d D ]}| jd  q d S Nr,   )rw   rQ   rk   rH   send_nowait)selfrz   _r   r   r   __init__  s    zChannelLock1.__init__r   c                 C  s   | j d  d S r]   rQ   r|   r}   r   r   r   r8     s    zChannelLock1.acquire_nowaitc                   s   | j d I d H  d S r]   )rQ   sendr   r   r   r   r;     s    zChannelLock1.acquirec                 C  s   | j   d S r]   rk   receive_nowaitr   r   r   r   r7     s    zChannelLock1.releaseNr^   
__module____qualname__r   r8   r;   r7   r   r   r   r   ry     s   ry   c                   @  sD   e Zd ZddddZddddZddddZddd	d
ZdS )ChannelLock2r   r   c                 C  s$   t d  d\| _| _| jd  d S N
   )rw   rQ   rk   r|   r   r   r   r   r     s    zChannelLock2.__init__c                 C  s   | j   d S r]   r   r   r   r   r   r8     s    zChannelLock2.acquire_nowaitc                   s   | j  I d H  d S r]   )rk   Zreceiver   r   r   r   r;     s    zChannelLock2.acquirec                 C  s   | j d  d S r]   r   r   r   r   r   r7     s    zChannelLock2.releaseNr   r   r   r   r   r     s   r   c                   @  sD   e Zd ZddddZddddZddddZddd	d
ZdS )ChannelLock3r   r   c                 C  s   t d  d\| _| _d| _d S )Nr   F)rw   rQ   rk   acquiredr   r   r   r   r     s    zChannelLock3.__init__c                 C  s   | j r
td| _ d S NT)r   r   r   r   r   r   r8     s    
zChannelLock3.acquire_nowaitc                   s2   | j r| jd I d H  nd| _ t I d H  d S r   )r   rQ   r   r	   
checkpointr   r   r   r   r;     s    zChannelLock3.acquirec                 C  s:   z| j   W n& tjk
r4   | js*td| _Y nX d S )NF)rk   r   r	   r=   r   r   r   r   r   r   r7     s
    
zChannelLock3.releaseNr   r   r   r   r   r     s   r   c                   C  s   t dS r{   )r0   r   r   r   r   r`     ra   c                   C  s   t dS r{   )rP   r   r   r   r   r`     ra   c                   C  s   t dS r   ry   r   r   r   r   r`     ra   c                   C  s   t dS r{   r   r   r   r   r   r`     ra   zCapacityLimiter(1)zSemaphore(1)rs   rr   zChannelLock1(10)zChannelLock1(1)lock_factoryr   LockLikeLockFactory)r   r   c              
     s   d d}ddddd fdd	}t  4 I d H &}|  }t|D ]}||| qHW 5 Q I d H R X rrt | kstd S )
Nr   rE   Fr   r   r   )	lock_liker   c                   sl   t  D ]^}| 4 I d H B d7 r*tdt I d H  t I d H  sRtdW 5 Q I d H R X qd S )Nr,   TF)rH   r   r	   r   )r   r~   LOOPSZacquiresZin_critical_sectionr   r   worker  s    z+test_generic_lock_exclusion.<locals>.worker)r	   r#   rH   r$   r   )r   ZWORKERSr   r%   r   r~   r   r   r   test_generic_lock_exclusion  s    r   c              
     s   g g d dddd fdd}|  }t  4 I d H 0}||d| ||d	| ||d
| W 5 Q I d H R X t D ]$}d
| d
|d   kstqd S )NrE   rm   r   r   )namer   r   c                   sD    |  t D ],}|4 I d H   |  W 5 Q I d H R X qd S r]   )r   rH   )r   r   r~   r   Zinitial_orderr   r   r   loopy+  s    
z.test_generic_lock_fifo_fairness.<locals>.loopyr,   r   rF   )r	   r#   r$   rH   r   )r   r   r   r%   rI   r   r   r   test_generic_lock_fifo_fairness%  s    r   c              
     sx   |   g dd fdd}t  4 I d H :}   || t I d H  dgks\t   W 5 Q I d H R X d S )Nr   r   c                
     s6    d  4 I d H  W 5 Q I d H R X  d d S rR   )r   r   r   r   r   r   
lock_takerE  s    
zCtest_generic_lock_acquire_nowait_blocks_acquire.<locals>.lock_takerrS   )r	   r#   r8   r$   r   r   r7   )r   r   r%   r   r   r   /test_generic_lock_acquire_nowait_blocks_acquire=  s    
r   c               
     s   t rtt } t 4 I dH }|| j W 5 Q I dH R X tt	| j
jd }tjtjd| dd |  I dH  W 5 Q R X t rtdS )zTest that trying to acquire a lock whose owner has exited raises an error.
    see https://github.com/python-trio/trio/issues/3035
    Nr   .^Owner of this lock exited without releasing: $r)   )r
   r   triors   r#   r$   r;   reescapestr_lot	broken_byr-   r.   BrokenResourceError)lockr%   Z	owner_strr   r   r   test_lock_acquire_unowned_lockS  s    
r   c                    st   t rtt } tttjdd@ t 4 I dH }|| j	 || j	 W 5 Q I dH R X W 5 Q R X t rptdS )zTest for error if awaiting on a lock whose owner exits without releasing.
    see https://github.com/python-trio/trio/issues/3035r   r)   N)
r
   r   r   rs   r   r   r   r#   r$   r;   )r   r%   r   r   r   test_lock_multiple_acquired  s    &r   c               
     s   t rtd } t }|  t t |jgiks4tt 4 I d H V}|	|j
 t I d H  |  tt dksvtttt } t |  |jgkstW 5 Q I d H R X |jj| gkstt rtd S r{   )r
   r   r   rs   r8   r	   r:   r   r#   r$   r;   r   r7   rM   nextiterr   )Z
child_taskr   r%   r   r   r   test_lock_handoveru  s$    
$r   )9
__future__r   r   rg   typingr   r   r   r-   Ztrio.testingr   r    r	   Z_core._parking_lotr
   Z_syncZ	_timeoutsr   Ztestingr   r   Ztyping_extensionsr   r&   rA   rD   rJ   rO   rY   r[   markZparametrizers   rr   rl   rv   Z_channelrw   rx   ry   r   r   Zlock_factoriesZlock_factory_namesZgeneric_lock_testr0   rP   r   __annotations__r   r   r   r   r   r   r   r   r   r   r   <module>   s    E%0MT	