o
    dTi$U                     @  s  U d dl mZ d dlZd dlZd dlmZ d dl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 dDddZdDddZdDddZdDddZdDddZdDddZdDddZdDddZejjde e!gdd  d!dEd#d$Z"dDd%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  d0d  e e!d1d  d2d  e(e)gZ*g d3Z+ejjd4e*e+d!Z,e-e.B e B e!B e'B e(B e)B Z/d5e0d6< eg e/f Z1d5e0d7< e,dFd8d9Z2e,dFd:d;Z3e,dFd<d=Z4dDd>d?Z5dDd@dAZ6dDdBdCZ7dS )G    )annotationsN)Callable)	TypeAlias)MatcherRaisesGroup   )_core)GLOBAL_PARKING_LOT_BREAKER)*)sleep_forever)assert_checkpointswait_all_tasks_blockedreturnNonec               	     sf  t     r
J   jdksJ tjtdd    W d    n1 s)w   Y       s8J t	   
 I d H  W d    n1 sMw   Y  t   g d fdd} t 4 I d H ?}||  ||  t I d H  ddgksJ   jd	ksJ    t I d H  g d
ksJ W d   I d H  d S 1 I d H sw   Y  d S )Nr   ztrio\.Event\.__bool__ is deprecated since Trio 0\.31\.0; use trio\.Event\.is_set instead \(https://github.com/python-trio/trio/issues/3238\)matchr   r   c                     s(    d   I d H   d d S )Nsleepingwoken)appendwait erecordr   Q/home/air/sos-pdf/back/venv/lib/python3.10/site-packages/trio/_tests/test_sync.pychild'      
ztest_Event.<locals>.childr   r   )r   r   r   r   r   r   )Eventis_set
statisticstasks_waitingpytestwarnsDeprecationWarning__bool__setr   r   r   open_nursery
start_soonr   )r   nurseryr   r   r   
test_Event   s8   


.r*   c               
     s:  t djdks
J tt t d W d    n1 sw   Y  tjtdd t d W d    n1 s9w   Y  t d} t|  | jdksMJ | jdksTJ | jdks[J tt	 | 
  W d    n1 sow   Y  | jdks{J |   | jdksJ | jdksJ |  }|jdksJ |jdksJ |jt gksJ |jdksJ tt	 |   W d    n1 sw   Y  | jdksJ tt	 |  I d H  W d    n1 sw   Y  | jdksJ t  | dI d H  W d    n	1 s
w   Y  | jdksJ ttj | d	 W d    n	1 s.w   Y  t|  jt dhksCJ | t  |  jdgksUJ | d | jdksbJ t - | 4 I d H  | jdksuJ W d   I d H  n1 I d H sw   Y  W d    n	1 sw   Y  t 4 I d H b}| d
I d H  | dI d H  || jd t I d H  | jdksJ |  jdksJ | d | jdksJ ttj |   W d    n	1 sw   Y  W d   I d H  n1 I d H sw   Y  | d | d
 d S )Nr         ?^total_tokens must be >= 0$r   r      someonezthird partyzvalue 1zvalue 2zvalue 3)CapacityLimitertotal_tokensr"   raises	TypeError
ValueErrorreprborrowed_tokensavailable_tokensRuntimeErrorreleaseacquire_nowaitr    	borrowersr   current_taskr!   acquirer   acquire_on_behalf_of
WouldBlockacquire_on_behalf_of_nowaitr&   release_on_behalf_ofr'   r(   r   )cstatsr)   r   r   r   test_CapacityLimiter7   s   



 
*

 *
rD   c                    s   ddl m}  t| }t| |j| ksJ |jdksJ |j| ks$J tt	 |
  W d    n1 s8w   Y  |jdksDJ |  |jdksOJ |j| ksVJ d S )Nr   )infr.   )mathrE   r0   r5   r1   r6   r7   r"   r2   r8   r9   r:   )rE   rB   r   r   r   test_CapacityLimiter_inf}   s   
rG   c               	     s(  t d} tt d| _W d    n1 sw   Y  tjtdd d| _W d    n1 s2w   Y  tjtdd d| _W d    n1 sLw   Y  | jdksXJ t 4 I d H }tdD ]}|	| j
| t I d H  qet|  jdd	hksJ |  jd
ksJ |  jd7  _t|  jh dksJ |  jd	ksJ |  jd
8  _| jdksJ | jd	ksJ | d | d	 | d t|  jd
hksJ |  jd	ksJ | d
 t|  jdhksJ |  jdksJ W d   I d H  d S 1 I d H sw   Y  d S )Nr   r+   r,   r   r-   i   r   r.      >   r   r.   r   rI      )r0   r"   r2   r3   r1   r4   r   r'   ranger(   r>   r   r&   r    r;   r!   r6   rA   rB   r)   ir   r   r   (test_CapacityLimiter_change_total_tokens   sB   



0rN   c               	     s   t dd} |  I d H  t 4 I d H }|| j t I d H  |j  W d   I d H  n1 I d H s7w   Y  t| j	dksEJ d S )Nr.   )r1   r   )
r0   r=   r   r'   r(   r   cancel_scopecancellen_pending_borrowers)limiternr   r   r    test_CapacityLimiter_memleak_548   s   
(rU   c               	     s  t d} | jdksJ t 4 I d H :}d| _tdD ]}|| j| t I d H  qt| 	 j
t ks9J | 	 jdksBJ d| _t| 	 j
h dksRJ || jd t I d H  | 	 jdkshJ tdD ]}| | ql| 	 jdks}J | d d| _ttj |   W d    n1 sw   Y  || jd t I d H  | 	 jdksJ | 	 j
g ksJ d| _| 	 jdksJ | 	 j
dgksJ | d | dI d H  || jd t I d H  d| _| 	 j
dgksJ | d t I d H  | 	 j
g ksJ | 	 jdksJ d| _t I d H  | 	 j
dgks.J | 	 jdks8J | d d| _|j  W d   I d H  n1 I d H sVw   Y  | jdkscJ | 	 j
g ksmJ | ji ksuJ d S )NrH   r   >   r   r.   r   rI   rJ   r.      )r0   r1   r   r'   rK   r(   r>   r   r&   r    r;   r!   rA   r"   r2   r?   r:   rO   rP   rR   rL   r   r   r   &test_CapacityLimiter_zero_limit_tokens   sf   




*CrW   c               
     s  t t td W d    n1 sw   Y  t jtdd td W d    n1 s0w   Y  td} t|  | jdksDJ | jd u sKJ |   | jdksVJ | 	 j
dks_J |   | jdksjJ t  |  I d H  W d    n1 sw   Y  | jdksJ t tj |   W d    n1 sw   Y  |   | jdksJ t + | 4 I d H  | jdksJ W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  | jdksJ |   g  d fdd}t 4 I d H N}|||  t I d H   dgksJ | jdksJ |   | jdks+J t tj |   W d    n	1 sAw   Y  W d   I d H  n1 I d H sWw   Y   ddgkseJ d S )Nr+   z^initial value must be >= 0$r   r-   r.   r   r   s	Semaphorer   r   c                   s(     d |  I d H    d d S Nstartedfinished)r   r=   )rX   r   r   r   
do_acquire+  r   z"test_Semaphore.<locals>.do_acquirer[   r\   )rX   rY   r   r   )r"   r2   r3   rY   r4   r5   value	max_valuer9   r    r!   r:   r   r=   r   r?   r'   r(   r   )rX   r^   r)   r   r]   r   test_Semaphore  s^   


(
 *
ra   c                  C  s  t t tddd W d    n1 sw   Y  t jtdd tddd W d    n1 s3w   Y  tddd} | jdksEJ t|  t jtdd |   W d    n1 s_w   Y  | jdkskJ | 	  | jdksvJ |   | jdksJ d S )	Nr.   r+   )r`   z%^max_values must be >= initial_value$r   r   z#^semaphore released too many times$r   )
r"   r2   r3   rY   r4   r`   r5   r9   r_   r:   )bsr   r   r   test_Semaphore_bounded=  s"   
rc   lockclsc                 C  s   | j S N)__name__)fnr   r   r   <lambda>N  s    rh   )idstype[Lock | StrictFIFOLock]c              
     sT  |    r
J t}| u sJ t | jtv s#J t . 4 I d H    s4J t W d   I d H  n1 I d H sHw   Y  W d    n1 sWw   Y    rbJ     slJ     rvJ t   I d H  W d    n1 sw   Y    sJ     rJ   t	
t   W d    n1 sw   Y    t	
t   W d    n1 sw   Y  d  d fdd}t 4 I d H }  rJ || t I d H    sJ t	
tj   W d    n	1 sw   Y  t	
t   W d    n	1 s5w   Y   }t| |j sHJ |j u sPJ |jdksXJ || t I d H   }t| |jdkssJ |j  W d   I d H  n1 I d H sw   Y   }|j rJ |jd u sJ |jdksJ d S )Nr   r   c                	     sT   t   4 I d H  t I d H  W d   I d H  d S 1 I d H s#w   Y  d S re   )r   r<   r   r   holder_tasklr   r   holderv  s
   .z,test_Lock_and_StrictFIFOLock.<locals>.holderr   r.   r   )lockedweakrefrefr5   rf   r   r:   r9   r=   r"   r2   r8   r   r'   r(   r   r?   r    printownerr!   rO   rP   )rd   rrn   r)   r    r   rk   r   test_Lock_and_StrictFIFOLockN  s|   

(





*ru   c               
     s,  t t ttd W d    n1 sw   Y  t t tt W d    n1 s0w   Y  t } t|  |  rBJ   rHJ t   	 I d H  W d    n1 s]w   Y  |  shJ   snJ t    rwJ  
    sJ t t  
  W d    n1 sw   Y     t t   I d H  W d    n1 sw   Y  t t    W d    n1 sw   Y  t t    W d    n1 sw   Y  t d fdd}t 4 I d H }tdD ]}||| t I d H  q 4 I d H     W d   I d H  n1 I d H s0w   Y    s<J t I d H  d	hksJJ  4 I d H     W d   I d H  n1 I d H sfw   Y  t I d H  h d
kszJ W d   I d H  n1 I d H sw   Y  t t 4 I d H }tdD ]}||| t I d H  q 4 I d H )  d   }t| |jdksJ |jjdksJ W d   I d H  n1 I d H sw   Y    jjdksJ t I d H  d	dhksJ  4 I d H     W d   I d H  n1 I d H s!w   Y  W d   I d H  n1 I d H s7w   Y  t K} 4 I d H ( |  z  I d H  W   s\J n  sdJ w W d   I d H  n1 I d H svw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr.   rM   intr   r   c              	     sV    4 I d H     I d H  W d   I d H  n1 I d H sw   Y  |  d S re   )r   add)rM   rB   finished_waitersr   r   waiter  s
   (ztest_Condition.<locals>.waiterrI   r   >   r   r.   r   r   )rM   rv   r   r   )r"   r2   r3   	ConditionrY   StrictFIFOLockLockro   r   r=   r:   r8   r9   r   notify
notify_allr&   r   r'   rK   r(   r   r    rr   r!   lock_statisticsCancelScoperP   )rm   rz   r)   rM   r    scoper   rx   r   test_Condition  s   




*
**
*
,*
",$r   )open_memory_channel)AsyncContextManagerMixinc                   @  s4   e Zd ZdddZdddZdd	d
ZdddZdS )ChannelLock1capacityrv   r   r   c                 C  s6   t d  |\| _| _t|d D ]}| jd  qd S Nr.   )r   rX   rt   rK   send_nowait)selfr   _r   r   r   __init__  s   zChannelLock1.__init__c                 C     | j d  d S re   rX   r   r   r   r   r   r:        zChannelLock1.acquire_nowaitc                   s   | j d I d H  d S re   )rX   sendr   r   r   r   r=      s   zChannelLock1.acquirec                 C     | j   d S re   rt   receive_nowaitr   r   r   r   r9        zChannelLock1.releaseN)r   rv   r   r   r   rf   
__module____qualname__r   r:   r=   r9   r   r   r   r   r     s
    


r   c                   @  4   e Zd ZdddZdddZdddZdd	d
ZdS )ChannelLock2r   r   c                 C  s$   t d  d\| _| _| jd  d S N
   )r   rX   rt   r   r   r   r   r   r     s   zChannelLock2.__init__c                 C  r   re   r   r   r   r   r   r:     r   zChannelLock2.acquire_nowaitc                   s   | j  I d H  d S re   )rt   receiver   r   r   r   r=     s   zChannelLock2.acquirec                 C  r   re   r   r   r   r   r   r9     r   zChannelLock2.releaseNr   r   r   r   r   r   r     s
    


r   c                   @  r   )ChannelLock3r   r   c                 C  s   t d  d\| _| _d| _d S )Nr   F)r   rX   rt   acquiredr   r   r   r   r     s   
zChannelLock3.__init__c                 C  s   | j rJ d| _ d S NT)r   r   r   r   r   r:     s   

zChannelLock3.acquire_nowaitc                   s6   | j r| jd I d H  d S d| _ t I d H  d S r   )r   rX   r   r   
checkpointr   r   r   r   r=   "  s
   zChannelLock3.acquirec                 C  s8   z| j   W d S  tjy   | jsJ d| _Y d S w )NF)rt   r   r   r?   r   r   r   r   r   r9   )  s   
zChannelLock3.releaseNr   r   r   r   r   r   r     s
    


r   c                   C     t dS r   )r0   r   r   r   r   rh   2      c                   C  r   r   )rY   r   r   r   r   rh   3  r   c                   C  r   r   r   r   r   r   r   rh   6  r   c                   C  r   r   r   r   r   r   r   rh   7  r   )zCapacityLimiter(1)zSemaphore(1)r}   r|   zChannelLock1(10)zChannelLock1(1)r   r   lock_factoryr   LockLikeLockFactoryc              	     s   d d}ddd fd	d
}t  4 I d H }|  }t|D ]}||| q"W d   I d H  n1 I d H s;w   Y  rDJ  | ksLJ d S )Nr   rH   Fr   	lock_liker   r   r   c              
     s   t  D ]<}| 4 I d H ) d7 rJ dt I d H  t I d H  s*J dW d   I d H  n1 I d H s<w   Y  qd S )Nr.   TF)rK   r   r   )r   r   LOOPSacquiresin_critical_sectionr   r   workera  s   (z+test_generic_lock_exclusion.<locals>.worker)r   r   r   r   )r   r'   rK   r(   )r   WORKERSr   r)   r   r   r   r   r   test_generic_lock_exclusionZ  s   (r   c              	     s   g g d d fdd	}|  }t  4 I d H  }||d
| ||d| ||d| W d   I d H  n1 I d H sAw   Y  t D ]}d| d|d
   ks\J qJd S )NrH   namerv   r   r   r   r   c              
     s`    |  t D ]#}|4 I d H   |  W d   I d H  n1 I d H s(w   Y  q
d S re   )r   rK   )r   r   r   r   initial_orderr   r   r   loopy}  s   
(z.test_generic_lock_fifo_fairness.<locals>.loopyr.   r   rI   )r   rv   r   r   r   r   )r   r'   r(   rK   )r   r   r   r)   rM   r   r   r   test_generic_lock_fifo_fairnessw  s   ("r   c              	     s   |   g d fdd}t  4 I d H &}   || t I d H  dgks-J    W d   I d H  d S 1 I d H sBw   Y  d S )Nr   r   c                	     sR    d  4 I d H  W d   I d H  n1 I d H sw   Y   d d S rZ   )r   r   r   r   r   r   
lock_taker  s   
(zCtest_generic_lock_acquire_nowait_blocks_acquire.<locals>.lock_takerr[   r   )r   r'   r:   r(   r   r9   )r   r   r)   r   r   r   /test_generic_lock_acquire_nowait_blocks_acquire  s   

.r   c               	     s   t rJ t } t 4 I dH }|| j W d  I dH  n1 I dH s(w   Y  tt| j	j
d }tjtjd| dd |  I dH  W d   n1 sVw   Y  t r_J 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	   trior}   r'   r(   r=   reescapestr_lot	broken_byr"   r2   BrokenResourceError)lockr)   	owner_strr   r   r   test_lock_acquire_unowned_lock  s   (
r   c               
     s   t rJ t } tttjdd2 t 4 I dH }|| j || j W d  I dH  n1 I dH s8w   Y  W d   n1 sGw   Y  t rPJ 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}   r   r   r   r'   r(   r=   )r   r)   r   r   r   test_lock_multiple_acquire  s    (	r   c               	     s   t rJ d } t }|  t |jgit ksJ t 4 I d H 3}||j	 t
 I d H  |  tt dks<J ttt } t |  |jgksLJ W d   I d H  n1 I d H s\w   Y  |jj| gksjJ t rnJ d S r   )r	   r   r}   r:   r   r<   r   r'   r(   r=   r   r9   rQ   nextiterr   )
child_taskr   r)   r   r   r   test_lock_handover  s*   (r   r   )rd   rj   r   r   )r   r   r   r   )8
__future__r   r   rp   collections.abcr   typingr   r"   trio.testingr   r    r   _core._parking_lotr	   _sync	_timeoutsr   testingr   r   r*   rD   rG   rN   rU   rW   ra   rc   markparametrizer}   r|   ru   r   _channelr   r   r   r   r   lock_factorieslock_factory_namesgeneric_lock_testr0   rY   r   __annotations__r   r   r   r   r   r   r   r   r   r   r   <module>   s    

$
F

%

M
0
MT

	

