a
    QIhK                     @  sR  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+g d2Z,ejj d3e+e,dZ-ee.e/e!e"e(e)e*f Z0d4e1d5< eg e0f Z2d4e1d6< e-d6dd7d8d9Z3e-d6dd7d:d;Z4e-d6dd7d<d=Z5ddd>d?Z6ddd@dAZ7dddBdCZ8dS )D    )annotationsN)TYPE_CHECKINGCallableUnion)MatcherRaisesGroup   )_core)GLOBAL_PARKING_LOT_BREAKER)*)sleep_forever)assert_checkpointswait_all_tasks_blocked)	TypeAliasNonereturnc               	     s6  t     rJ   jdks$J      s8J t    I d H  W d    n1 sb0    Y  t   g d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sJ W d   I d H  q21 I d H s(0    Y  d S )	Nr   r   r   c                     s&    d   I d H   d d S )Nsleepingwoken)appendwait erecordr   O/var/www/html/venv_bot_3.9/lib/python3.9/site-packages/trio/_tests/test_sync.pychild#   s    
ztest_Event.<locals>.childr   r   )r   r   r   r   )Eventis_set
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 d    n1 s(0    Y  t jtdd td W d    n1 s^0    Y  td} t|  | jdksJ | jdksJ | jdksJ t t	 | 
  W d    n1 s0    Y  | jdksJ |   | jdksJ | jdksJ |  }|jdks J |jdks0J |jt gksFJ |jdksVJ t t	 |   W d    n1 s0    Y  | jdksJ t t	 |  I d H  W d    n1 s0    Y  | jdksJ t   | dI d H  W d    n1 s0    Y  | jdks,J t tj | d	 W d    n1 sZ0    Y  t|  jt dhksJ | t  |  jdgksJ | d | jdksJ t \ | 4 I d H ( | jdksJ W d   I d H  q1 I d H s0    Y  W d    n1 s,0    Y  t 4 I d H }| 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 s0    Y  W d   I d H  q$1 I d H s0    Y  | 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_tokens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    &&&(.0* 
^
V
r@   c                    s   ddl m}  t| }t| |j| ks*J |jdks8J |j| ksFJ tt	 |
  W d    n1 sn0    Y  |jdksJ |  |jdksJ |j| ksJ d S )Nr   )infr+   )mathrA   r/   r1   r2   r3   r4   r,   r-   r5   r6   r7   )rA   r>   r   r   r   test_CapacityLimiter_infx   s    &rC   c               	     s<  t d} tt d| _W d    n1 s.0    Y  tjtdd d| _W d    n1 sb0    Y  tjtdd d| _W d    n1 s0    Y  | jdksJ t 4 I d H `}tdD ]}|	| j
| t I d H  qt|  jddhksJ |  jd	ksJ |  jd7  _t|  jh d
ksDJ |  jdksXJ |  jd	8  _| jdksvJ | 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s
J W d   I d H  q81 I d H s.0    Y  d S )Nr   r&   r'   r(   r   i   r+      >   r   r+   r   rE      )r/   r,   r-   r.   r2   r0   r	   r"   ranger#   r;   r   r!   r   r8   r    r3   r=   )r>   r$   ir   r   r   (test_CapacityLimiter_change_total_tokens   s8    $$$



rI   c               	     s   t dd} |  I d H  t 4 I d H 8}|| j t I d H  |j  W d   I d H  qv1 I d H sl0    Y  t| j	dksJ d S )Nr+   )r2   r   )
r/   r:   r	   r"   r#   r   cancel_scopecancellenZ_pending_borrowers)Zlimiternr   r   r    test_CapacityLimiter_memleak_548   s    
4rN   c               
     s  t t td W d    n1 s(0    Y  t jtdd td W d    n1 s^0    Y  td} t|  | jdksJ | jd u sJ |   | jdksJ | 	 j
dksJ |   | jdksJ t  |  I d H  W d    n1 s0    Y  | jdksJ t tj |   W d    n1 sB0    Y  |   | jdksdJ t \ | 4 I d H ( | jdksJ W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y  | jdksJ |   g  dd	d
 fdd}t 4 I d H }|||  t I d H   dgksBJ | jdksRJ |   | jdksjJ t tj |   W d    n1 s0    Y  W d   I d H  q1 I d H s0    Y   ddgksJ 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:   )rP   r   r   r   
do_acquire   s    
z"test_Semaphore.<locals>.do_acquirerR   rS   )r,   r-   r.   rO   r0   r1   value	max_valuer6   r   r    r7   r   r:   r	   r<   r"   r#   r   )rP   rU   r$   r   rT   r   test_Semaphore   sJ    &&,(^VrX   c                  C  s  t t tddd W d    n1 s,0    Y  t jtdd tddd W d    n1 sf0    Y  tddd} | jdksJ t|  t jtdd |   W d    n1 s0    Y  | jdksJ | 	  | jdksJ |   | jdksJ d S )	Nr+   r&   )rW   z%^max_values must be >= initial_value$r(   r   z#^semaphore released too many times$r   )
r,   r-   r.   rO   r0   rW   r1   r6   rV   r7   )bsr   r   r   test_Semaphore_bounded   s    **&rZ   lockclsc                 C  s   | j S N)__name__)fnr   r   r   <lambda>       r_   )Zidsztype[Lock | StrictFIFOLock])r[   r   c              
     sf  |    rJ t}| u s*J t | jtv sDJ t \ 4 I d H *   sfJ t W d   I d H  q1 I d H s0    Y  W d    n1 s0    Y    rJ     sJ     rJ t   I d H  W d    n1 s0    Y    s.J     rDJ   t	
t   W d    n1 sv0    Y    t	
t   W d    n1 s0    Y  d  dd fdd}t 4 I d H 0}  rJ || t I d H    sJ t	
tj   W d    n1 sF0    Y  t	
t   W d    n1 sz0    Y   }t| |j sJ |j u sJ |jdksJ || t I d H   }t| |jdksJ |j  W d   I d H  q.1 I d H s$0    Y   }|j rBJ |jd u sRJ |jdksbJ d S )Nr   r   c                	     sP   t   4 I d H " t I d H  W d   I d H  qL1 I d H sB0    Y  d S r\   )r	   r9   r   r   Zholder_tasklr   r   holder$  s    z,test_Lock_and_StrictFIFOLock.<locals>.holderr   r+   )lockedweakrefrefr1   r]   r   r7   r6   r:   r,   r-   r5   r	   r"   r#   r   r<   r   printownerr    rJ   rK   )r[   rrc   r$   r   r   ra   r   test_Lock_and_StrictFIFOLock   sh    
P.((
((
8rj   c               
     s:  t t ttd W d    n1 s,0    Y  t t tt W d    n1 s^0    Y  t } t|  |  rJ   rJ t   	 I d H  W d    n1 s0    Y  |  sJ   sJ t    rJ  
    sJ t t  
  W d    n1 s,0    Y     t t   I d H  W d    n1 sn0    Y  t t    W d    n1 s0    Y  t t    W d    n1 s0    Y  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 d   I d H  q|1 I d H sr0    Y    sJ t I d H  dhksJ  4 I d H      W d   I d H  q1 I d H s0    Y  t I d H  h d	ksJ W d   I d H  q61 I d H s,0    Y  t t 4 I d H 0}tdD ]}||| t I d H  qX 4 I d H T  d
   }t| |jdksJ |jjd
ksJ W d   I d H  q1 I d H s0    Y    jjdksJ t I d H  ddhks$J  4 I d H      W d   I d H  qh1 I d H s^0    Y  W d   I d H  q1 I d H s0    Y  t } 4 I d H R |  z   I d H  W   sJ n  sJ 0 W d   I d H  q1 I d H s0    Y  W d    n1 s,0    Y  d S )Nr+   intr   )rH   r   c              	     sT    4 I d H $    I d H  W d   I d H  qF1 I d H s<0    Y  |  d S r\   )r   add)rH   r>   Zfinished_waitersr   r   waiterl  s    8ztest_Condition.<locals>.waiterrE   r   >   r   r+   r   r   )r,   r-   r.   	ConditionrO   StrictFIFOLockLockrd   r   r:   r7   r5   r6   r   notify
notify_allr!   r	   r"   rG   r#   r   r   rg   r    Zlock_statisticsZCancelScoperK   )rb   rn   r$   rH   r   scoper   rm   r   test_ConditionJ  s|    *&,(.((66@
@d
ru   )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 )ChannelLock1rk   r   )capacityr   c                 C  s6   t d  |\| _| _t|d D ]}| jd  q d S Nr+   )rv   rP   ri   rG   send_nowait)selfry   _r   r   r   __init__  s    zChannelLock1.__init__r   c                 C  s   | j d  d S r\   rP   r{   r|   r   r   r   r7     s    zChannelLock1.acquire_nowaitc                   s   | j d I d H  d S r\   )rP   sendr   r   r   r   r:     s    zChannelLock1.acquirec                 C  s   | j   d S r\   ri   receive_nowaitr   r   r   r   r6     s    zChannelLock1.releaseNr]   
__module____qualname__r~   r7   r:   r6   r   r   r   r   rx     s   rx   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
   )rv   rP   ri   r{   r   r   r   r   r~     s    zChannelLock2.__init__c                 C  s   | j   d S r\   r   r   r   r   r   r7     s    zChannelLock2.acquire_nowaitc                   s   | j  I d H  d S r\   )ri   Zreceiver   r   r   r   r:     s    zChannelLock2.acquirec                 C  s   | j d  d S r\   r   r   r   r   r   r6     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)rv   rP   ri   acquiredr   r   r   r   r~     s    zChannelLock3.__init__c                 C  s   | j r
J d| _ d S NT)r   r   r   r   r   r7     s    
zChannelLock3.acquire_nowaitc                   s2   | j r| jd I d H  nd| _ t I d H  d S r   )r   rP   r   r	   
checkpointr   r   r   r   r:     s    zChannelLock3.acquirec                 C  s8   z| j   W n$ tjy2   | js(J d| _Y n0 d S )NF)ri   r   r	   r<   r   r   r   r   r   r6     s
    
zChannelLock3.releaseNr   r   r   r   r   r     s   r   c                   C  s   t dS rz   )r/   r   r   r   r   r_     r`   c                   C  s   t dS rz   )rO   r   r   r   r   r_     r`   c                   C  s   t dS r   rx   r   r   r   r   r_     r`   c                   C  s   t dS rz   r   r   r   r   r   r_     r`   )zCapacityLimiter(1)zSemaphore(1)rq   rp   zChannelLock1(10)zChannelLock1(1)r   r   lock_factoryr   LockLikeLockFactory)r   r   c              	     s   d d}ddddd fdd	}t  4 I d H 6}|  }t|D ]}||| qHW d   I d H  q1 I d H sz0    Y  rJ  | ksJ d S )
Nr   rD   Fr   r   r   )	lock_liker   c              
     s   t  D ]x}| 4 I d H R d7 r*J dt I d H  t I d H  sRJ dW d   I d H  q1 I d H sv0    Y  qd S )Nr+   TF)rG   r	   r   )r   r}   LOOPSZacquiresZin_critical_sectionr   r   worker  s    z+test_generic_lock_exclusion.<locals>.worker)r	   r"   rG   r#   )r   ZWORKERSr   r$   r   r}   r   r   r   test_generic_lock_exclusion  s    8r   c              	     s   g g d dddd fdd}|  }t  4 I d H @}||d| ||d	| ||d
| W d   I d H  q1 I d H s0    Y  t D ]$}d
| d
|d   ksJ qd S )NrD   rk   r   r   )namer   r   c              
     s^    |  t D ]F}|4 I d H    |  W d   I d H  q1 I d H sN0    Y  qd S r\   )r   rG   )r   r   r}   r   Zinitial_orderr   r   r   loopy+  s    
z.test_generic_lock_fifo_fairness.<locals>.loopyr+   r   rE   )r	   r"   r#   rG   )r   r   r   r$   rH   r   r   r   test_generic_lock_fifo_fairness%  s    8r   c              	     s   |   g dd fdd}t  4 I d H J}   || t I d H  dgks\J    W d   I d H  q1 I d H s0    Y  d S )Nr   r   c                	     sP    d  4 I d H  W d   I d H  qB1 I d H s80    Y   d d S rQ   )r   r   r   r   r   r   
lock_takerE  s    
*zCtest_generic_lock_acquire_nowait_blocks_acquire.<locals>.lock_takerrR   )r	   r"   r7   r#   r   r6   )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  qX1 I dH sN0    Y  tt| j	j
d }tjtjd| dd |  I dH  W d   n1 s0    Y  t rJ 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
   triorq   r"   r#   r:   reescapestr_lot	broken_byr,   r-   BrokenResourceError)lockr$   Z	owner_strr   r   r   test_lock_acquire_unowned_lockS  s    6
,r   c               
     s   t rJ t } tttjddd t 4 I dH .}|| j || j W d  I dH  qx1 I dH sn0    Y  W d   n1 s0    Y  t rJ 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   rq   r   r   r   r"   r#   r:   )r   r$   r   r   r   test_lock_multiple_acquired  s    Tr   c               	     s   t rJ d } t }|  t |jgit ks4J t 4 I d H f}||j	 t
 I d H  |  tt dksvJ ttt } t |  |jgksJ W d   I d H  q1 I d H s0    Y  |jj| gksJ t rJ d S rz   )r
   r   rq   r7   r	   r9   r   r"   r#   r:   r   r6   rL   nextiterr   )Z
child_taskr   r$   r   r   r   test_lock_handoveru  s&    >r   )9
__future__r   r   re   typingr   r   r   r,   Ztrio.testingr   r    r	   Z_core._parking_lotr
   Z_syncZ	_timeoutsr   testingr   r   Ztyping_extensionsr   r%   r@   rC   rI   rN   rX   rZ   markZparametrizerq   rp   rj   ru   Z_channelrv   rw   rx   r   r   Zlock_factoriesZlock_factory_namesZgeneric_lock_testr/   rO   r   __annotations__r   r   r   r   r   r   r   r   r   r   r   <module>   s|   E%0MT
	