a
    xdZb                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ ddlmZ ddlmZmZmZ ddlmZ ddlmZ dd	lmZmZmZmZ dd
lmZ dd Zdd Zdd Zdd Zdd Z dd Z!dd Z"ej#$dg dej#$dddgej#$dddgdd  Z%d!d" Z&d#d$ Z'd%d& Z(d'd( Z)d)d* Z*e +d+Z,d,d- Z-d.d/ Z.d0d1 Z/d2d3 Z0d4d5 Z1d6d7 Z2d8d9 Z3d:d; Z4d<d= Z5d>d? Z6ej#j7ed@dAdBdC Z8dDdE Z9dFdG Z:dS )H    N)current_async_library_cvar)	TrioTokencurrent_trio_token   )_core)EventCapacityLimitersleep)wait_all_tasks_blocked)buggy_pypy_asyncgens)to_thread_run_synccurrent_default_thread_limiterfrom_thread_runfrom_thread_run_sync)ki_selfc                     s   t   d fdd	} t }dd }| t|d|dI d H  dd }| t|dtf|dI d H  d	d }| t|d
|dI d H  dd }| t|dtf|dI d H  d S )Nc                    sj   g  fdd}t j|dd}|  | rLtd tdI d H  q,d|fdf|gksfJ d S )	Nc               
      sv   z2 dt f  d}  d| f W n> typ } z&t|  dt|f W Y d }~n
d }~0 0 d S )Nstart
trio_tokengoterror)append	threadingcurrent_threadBaseExceptionprinttype)xexcdo_in_trio_threadfnrecordr    O/var/www/html/Ranjet/env/lib/python3.9/site-packages/trio/tests/test_threads.pythreadfn   s    z<test_do_in_trio_thread.<locals>.check_case.<locals>.threadfnT)targetdaemonZyawn{Gz?r   f)r   Threadr   is_aliver   r	   )r   r    expectedr   r$   child_threadtrio_threadr   r#   
check_case   s    	z*test_do_in_trio_thread.<locals>.check_casec                 S   s"   t  rJ | dt f dS )Nr(   r   )r   currently_ki_protectedr   r   r   r!   r"   r"   r#   r(   1   s    z!test_do_in_trio_thread.<locals>.f)r   r   r   c                 S   s&   t  rJ | dt f td S Nr(   )r   r0   r   r   r   
ValueErrorr1   r"   r"   r#   r(   8   s    r   c                    s0   t  rJ t  I d H  | dt f dS )Nr(      )r   r0   
checkpointr   r   r   r1   r"   r"   r#   r(   ?   s    )r   r4   c                    s4   t  rJ t  I d H  | dt f td S r2   )r   r0   r5   r   r   r   KeyErrorr1   r"   r"   r#   r(   G   s    )N)r   r   r   r   r   r3   r   r6   )r/   tokenr(   r"   r-   r#   test_do_in_trio_thread   s    r8   c                     st   t t tdd  W d    n1 s,0    Y  dd } t t t|  W d    n1 sf0    Y  d S )Nc                   S   s   d S Nr"   r"   r"   r"   r#   <lambda>R       z9test_do_in_trio_thread_from_trio_thread.<locals>.<lambda>c                      s   d S r9   r"   r"   r"   r"   r#   fooT   s    z4test_do_in_trio_thread_from_trio_thread.<locals>.foo)pytestraisesRuntimeErrorr   r   )r<   r"   r"   r#   'test_do_in_trio_thread_from_trio_threadP   s
    *r@   c                     s0   t    fdd} t|   ddhks,J d S )Nc                     s~   t   dd fdd fdd} tj| d}|  td | rbtd	I d H  qJtd
 |  td d S )Nc               
   S   sZ   t d t rJ t d z t  W dd l} t d|   ndd l} t d|   0 d S )Nzin Trio threadr   r   finally)r   r   r0   r   sysexc_info)rB   r"   r"   r#   trio_thread_fnc   s    zTtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.trio_thread_fnc                      s
      d S r9   r"   r"   )rD   r"   r#   trio_thread_afnn   s    zUtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.trio_thread_afnc                      sx   zt d td W n$ ty<   t d  d Y n0 ztd W n$ tyr   t d  d Y n0 d S )Nrunningr   ok1ok2)r   r   KeyboardInterruptaddr   r"   )r!   r7   rE   rD   r"   r#   external_thread_fnq   s    zXtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.external_thread_fn)r%   Zwaitingr'   zwaited, joiningdone)	r   r   r   r)   r   r   r*   r	   join)rK   threadr1   )r7   rE   rD   r#   check_run_in_trio_thread`   s    z<test_run_in_trio_thread_ki.<locals>.check_run_in_trio_threadrG   rH   )setr   run)rO   r"   r1   r#   test_run_in_trio_thread_ki[   s    '
rR   c                     s\   g t    fddfdd fdd} t| }|  ddgksXJ d S )	Nc                      s*    d    tdd I d H  d S )Nsleepingc                 S   s   t jjS r9   )r   ZAbortZ	SUCCEEDED)_r"   r"   r#   r:      r;   zMtest_await_in_trio_thread_while_main_exits.<locals>.trio_fn.<locals>.<lambda>)r   rP   r   Zwait_task_rescheduledr"   )evr!   r"   r#   trio_fn   s    
z;test_await_in_trio_thread_while_main_exits.<locals>.trio_fnc                    s4   zt | d W n tjy.    d Y n0 d S )Nr   	cancelled)r   r   Z	Cancelledr   )r7   )r!   rV   r"   r#   	thread_fn   s    z=test_await_in_trio_thread_while_main_exits.<locals>.thread_fnc                     s@   t  } tj| fd}|    I d H  dgks<J |S )N)r%   argsrS   )r   r   r   r)   r   wait)r7   rN   )rU   r!   rX   r"   r#   main   s    z8test_await_in_trio_thread_while_main_exits.<locals>.mainrS   rW   )r   r   rQ   rM   )r[   rN   r"   )rU   r!   rX   rV   r#   *test_await_in_trio_thread_while_main_exits   s    
r\   c                     s   t  } dd }t|dI d H \}}|dks0J || ks<J dd }tt}t|I d H  W d    n1 sr0    Y  t|jj |jjd | ksJ d S )Nc                 S   s   | t  fS r9   )r   r   )r   r"   r"   r#   r(      s    z$test_run_in_worker_thread.<locals>.f   c                   S   s   t t d S r9   )r3   r   r   r"   r"   r"   r#   g   s    z$test_run_in_worker_thread.<locals>.gr   )	r   r   r   r=   r>   r3   r   valuerY   )r.   r(   r   r,   r^   excinfor"   r"   r#   test_run_in_worker_thread   s    ,ra   c               	      s  d gfdd  fdd} g t  }t 4 I d H H}|| |d t I d H  dgksfJ |j  W d   I d H  q1 I d H s0    Y  d dksJ |d  d dkrt	
d	 qg d d< t 4 I d H }|| |d
 t I d H  |j  tjdd. tdD ]}t I d H  q$W d    n1 sP0    Y  dgksjJ |d  W d   I d H  q1 I d H s0    Y  t (}|  | |d
I d H  W d    n1 s0    Y  |jsJ d S )Nc                    s   d d< |    d d< d S )Nblockingr   finished)get)q)registerr"   r#   r(      s    z1test_run_in_worker_thread_cancellation.<locals>.fc              	      s<    d z t | |dI d H W  d S  d 0 d S )Nr   cancellableexit)r   r   )re   rh   )r(   r!   r"   r#   child   s    

z5test_run_in_worker_thread_cancellation.<locals>.childTr   r   rc   r'   FZshield
   )stdlib_queueQueuer   open_nursery
start_soonr
   cancel_scopecancelputtimer	   CancelScoperanger5   cancelled_caught)rj   re   nurseryrT   Zscoper"   )r(   r!   rf   r#   &test_run_in_worker_thread_cancellation   s:    4

28
0ry   c                    s   | tjdd t  t  fddfdd}t|  d   }| rjt	
d qV|  \}}d|vsJ d|vsJ d S )NZIDLE_TIMEOUTr'   c                      s       t  d S r9   )rd   rs   r   r   r"   )q1q2r"   r#   rX      s    z6test_run_in_worker_thread_abandoned.<locals>.thread_fnc               	      sl    fdd} t  4 I d H 6}||  t I d H  |j  W d   I d H  qh1 I d H s^0    Y  d S )Nc                      s   t  ddI d H  d S )NTrg   r   r"   rX   r"   r#   rj     s    z@test_run_in_worker_thread_abandoned.<locals>.main.<locals>.child)r   ro   rp   r
   rq   rr   )rj   rx   r}   r"   r#   r[      s
    
z1test_run_in_worker_thread_abandoned.<locals>.mainzException in thread)setattrr   _thread_cacherm   rn   rQ   rs   rd   r*   rt   r	   Z
readouterr)Zcapfdmonkeypatchr[   rN   outerrr"   )rz   r{   rX   r#   #test_run_in_worker_thread_abandoned   s    	

r   MAX)r4      rl   rr   FTuse_default_limiterc           
   	      s  d|  }t  t  |r4t }|j}| |_d nt| }| }|zG dd dd_d_d_d_	t
 fdd fdd}t
 4 I d H }td	 g }t|D ],}	|t  |||d
  t I d H  q rtd |d  I d H  t I d H  j	| ks4| j| krFtdI d H  q  W d   I d H  q|1 I d H sr0    Y  j| ksJ  r|jdkrtdI d H  qj|ksJ jdksJ W ||_n||_0 d S )Nr   c                   @   s   e Zd ZdS )z0test_run_in_worker_thread_limiter.<locals>.stateN)__name__
__module____qualname__r"   r"   r"   r#   state9  s   r   r   c                    s   t d t| jd J  jd7  _ jd7  _tjj_ jd7  _W d    n1 sj0    Y     ,  jd8  _ jd8  _W d    n1 s0    Y  t d d S )Nzthread_fn startr   r]   zthread_fn exiting)	r   r   rr   ranrF   max
high_waterparkedrZ   )rq   )gatelockr   r7   r"   r#   rX   C  s    ,,z4test_run_in_worker_thread_limiter.<locals>.thread_fnc                    sV   t  &}t| dI d H  W d    n1 s40    Y  td|j |   d S )N)limiterrh   zrun_thread finished, cancelled:)r   ru   r   r   rw   rP   )eventrq   )rr   limiter_argrX   r"   r#   
run_threadS  s    
*z5test_run_in_worker_thread_limiter.<locals>.run_threadZspawningz'waiting for first cancellation to clearr'   )r   r   Lockr   Ztotal_tokensr   r   r   rF   r   r   r   ro   r   rv   r   rp   r
   rZ   
statisticsZtasks_waitingr	   rP   borrowed_tokens)
r   rr   r   ZCOUNTcZorig_total_tokensr   rx   eventsir"   )rr   r   r   r   r   rX   r7   r#   !test_run_in_worker_thread_limiter  sR    	6r   c                     sB   g  G  fddd} t dd |  dI d H   ddgks>J d S )Nc                       s$   e Zd Z fddZ fddZdS )z?test_run_in_worker_thread_custom_limiter.<locals>.CustomLimiterc                    s     d || _d S Nacquirer   Z	_borrowerselfZborrowerr1   r"   r#   acquire_on_behalf_of  s    
zTtest_run_in_worker_thread_custom_limiter.<locals>.CustomLimiter.acquire_on_behalf_ofc                    s     d || jksJ d S Nreleaser   r   r1   r"   r#   release_on_behalf_of  s    
zTtest_run_in_worker_thread_custom_limiter.<locals>.CustomLimiter.release_on_behalf_ofNr   r   r   r   r   r"   r1   r"   r#   CustomLimiter  s   r   c                   S   s   d S r9   r"   r"   r"   r"   r#   r:     r;   z:test_run_in_worker_thread_custom_limiter.<locals>.<lambda>r   r   r   r|   )r   r"   r1   r#   (test_run_in_worker_thread_custom_limiter  s    	r   c                     s   g G fddd} |  }t t&}tdd |dI d H  W d    n1 sR0    Y  |jjd u slJ ddgks|J g i  t t*}t fdd|dI d H  W d    n1 s0    Y  t|jjtsJ ddgksJ d S )	Nc                       s$   e Zd Z fddZ fddZdS )zCtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiterc                    s     d d S r   )r   r   r1   r"   r#   r     s    zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.acquire_on_behalf_ofc                    s     d td S r   )r   r3   r   r1   r"   r#   r     s    
zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.release_on_behalf_ofNr   r"   r1   r"   r#   BadCapacityLimiter  s   r   c                   S   s   d S r9   r"   r"   r"   r"   r#   r:     r;   z9test_run_in_worker_thread_limiter_error.<locals>.<lambda>r   r   r   c                      s    d S )Nr   r"   r"   )dr"   r#   r:     r;   )r=   r>   r3   r   r_   __context__
isinstancer6   )r   bsr`   r"   )r   r!   r#   'test_run_in_worker_thread_limiter_error  s    48r   c                    s   dd }|  tjjd| t }|jdks.J tt"}t	dd I d H  W d    n1 s`0    Y  dt
|jv s|J |jdksJ d S )Nc                 W   s   t dd S )Nz!the engines canna take it captain)r?   )r   rY   r"   r"   r#   	bad_start  s    z:test_run_in_worker_thread_fail_to_spawn.<locals>.bad_startZstart_thread_soonr   c                   S   s   d S r9   r"   r"   r"   r"   r#   r:     r;   z9test_run_in_worker_thread_fail_to_spawn.<locals>.<lambda>Zengines)r~   r   r   ZThreadCacher   r   r=   r>   r?   r   strr_   )r   r   r   r`   r"   r"   r#   'test_run_in_worker_thread_fail_to_spawn  s    0r   c                     s.   dd } t  }t| I d H }||ks*J d S )Nc                  S   s   t tj} | S r9   r   r   r   callee_tokenr"   r"   r#   rX     s    
z5test_trio_to_thread_run_sync_token.<locals>.thread_fnr   r   r   rX   Zcaller_tokenr   r"   r"   r#   "test_trio_to_thread_run_sync_token  s    r   c                     sH   dd } t jtdd t| I d H  W d    n1 s:0    Y  d S )Nc                      s   d S r9   r"   r"   r"   r"   r#   async_fn  s    z=test_trio_to_thread_run_sync_expected_error.<locals>.async_fnexpected a sync functionmatch)r=   r>   	TypeErrorr   r   r"   r"   r#   +test_trio_to_thread_run_sync_expected_error  s    r   trio_test_contextvarc            
         s   t  } td dd }t|I d H \}}}|dks:J |d ksFJ || ksRJ dd }t|I d H \}}}}t }t }	|dksJ |dksJ |dksJ d|d u sJ |	dksJ d S )	Nr[   c                  S   s   t  } t }| |t fS r9   )r   rd   r   r   r   )r_   sniffio_cvar_valuer"   r"   r#   r(     s    z3test_trio_to_thread_run_sync_contextvars.<locals>.fc                  S   s2   t  } t d t  }t }| ||t fS )Nworker)r   rd   rP   r   r   r   )parent_valueinner_valuer   r"   r"   r#   r^     s    
z3test_trio_to_thread_run_sync_contextvars.<locals>.gr   zRThe contextvar value set on the worker would not propagate back to the main threadtrio)r   r   r   rP   r   rd   r   )
r.   r(   r_   r   r,   r^   r   r   current_valueZsniffio_outer_valuer"   r"   r#   (test_trio_to_thread_run_sync_contextvars  s0    
r   c                     sx   dd } t | I d H }t|ts$J dd   fdd} tjtdd t | I d H  W d    n1 sj0    Y  d S )Nc                  S   s   t tj} | S r9   )r   r   current_time)	trio_timer"   r"   r#   rX   
  s    
z1test_trio_from_thread_run_sync.<locals>.thread_fnc                      s   d S r9   r"   r"   r"   r"   r#   r     s    z0test_trio_from_thread_run_sync.<locals>.async_fnc                      s   t   d S r9   )r   r"   r   r"   r#   rX     s    r   r   )r   r   floatr=   r>   r   )rX   r   r"   r   r#   test_trio_from_thread_run_sync  s    r   c                     s   g fdd  fdd} t | I d H  ddgks<J dd }tjtd	d
  t t|I d H  W d    n1 sx0    Y  d S )Nc                      s   t    d d S )Nback in trio)r   r   r   r"   r1   r"   r#   back_in_trio_fn!  s    z2test_trio_from_thread_run.<locals>.back_in_trio_fnc                      s    d t  d S )N	in thread)r   r   r"   r   r!   r"   r#   rX   %  s    
z,test_trio_from_thread_run.<locals>.thread_fnr   r   c                   S   s   d S r9   r"   r"   r"   r"   r#   sync_fn-  s    z*test_trio_from_thread_run.<locals>.sync_fnzappears to be synchronousr   )r   r=   r>   r   r   )rX   r   r"   r   r#   test_trio_from_thread_run  s    r   c                     s.   dd } t  }t| I d H }||ks*J d S )Nc                  S   s   t tj} | S r9   r   r   r"   r"   r#   rX   7  s    
z.test_trio_from_thread_token.<locals>.thread_fnr   r   r"   r"   r#   test_trio_from_thread_token4  s    r   c                     s0   dd } t  }t| |I d H }||ks,J d S )Nc                 S   s   t tj| d}|S )Nr   r   )r7   r   r"   r"   r#   rX   C  s    z4test_trio_from_thread_token_kwarg.<locals>.thread_fnr   r   r"   r"   r#   !test_trio_from_thread_token_kwarg@  s    r   c                      s8   t t ttj W d    n1 s*0    Y  d S r9   r=   r>   r?   r   r   r   r"   r"   r"   r#   test_from_thread_no_tokenL  s    r   c                     s   t d dd } t| I d H \}}}}}}}}t  }	t }
|	|  krTdksZn J ||  krx|  krxdks~n J |dksJ |
|  krdksn J ||  krd ksn J d S )Nr[   c            	      S   s\   t  } t d t  }t }dd }t|\}}}t  }t }| |||||||fS )Nr   c                  S   s,   t  } t d t  }t }| ||fS Nback_in_mainr   rd   rP   r   back_parent_valueback_current_valuesniffio_cvar_back_valuer"   r"   r#   r   ]  s
    
zStest_trio_from_thread_run_sync_contextvars.<locals>.thread_fn.<locals>.back_in_main)r   rd   rP   r   r   )	thread_parent_valuethread_current_valuesniffio_cvar_thread_pre_valuer   r   r   r   thread_after_valuesniffio_cvar_thread_after_valuer"   r"   r#   rX   W  s*    
z=test_trio_from_thread_run_sync_contextvars.<locals>.thread_fnr   r   r   )r   rP   r   rd   r   )rX   r   r   r   r   r   r   r   r   r   Zsniffio_cvar_out_valuer"   r"   r#   *test_trio_from_thread_run_sync_contextvarsT  s&    
($r   c            
         s   t d dd } t| I d H \}}}}}}}}t  }	|	|  krLdksRn J ||  krp|  krpdksvn J |dksJ ||  krd ksn J |dksJ d S )Nr[   c            	      S   s\   t  } t d t  }t }dd }t|\}}}t  }t }| |||||||fS )Nr   c                     s,   t  } t d t  }t }| ||fS r   r   r   r"   r"   r#   async_back_in_main  s
    
zTtest_trio_from_thread_run_contextvars.<locals>.thread_fn.<locals>.async_back_in_main)r   rd   rP   r   r   )	r   r   r   r   r   r   r   r   r   r"   r"   r#   rX     s*    
z8test_trio_from_thread_run_contextvars.<locals>.thread_fnr   r   r   )r   rP   r   rd   )
rX   r   r   r   r   r   r   r   r   r   r"   r"   r#   %test_trio_from_thread_run_contextvars  s$    
($r   c                   C   s<   t t ttjdd W d    n1 s.0    Y  d S )NzNot TrioTokentyper   r   r"   r"   r"   r#   4test_run_fn_as_system_task_catched_badly_typed_token  s    r   c                     sJ   dd } t  }tt t| |d W d    n1 s<0    Y  d S )Nc                   S   s   dsJ d S )NFr"   r"   r"   r"   r#   
not_called  s    z7test_from_thread_inside_trio_thread.<locals>.not_calledr   )r   r   r=   r>   r?   r   )r   r   r"   r"   r#   #test_from_thread_inside_trio_thread  s    r   zpypy 7.2.0 is buggy)reasonc                     s>   g g fdd  fdd} t |  dgks:J d S )Nc                     s   z~d V  W t tjN tjdd" tttdI d H  W d    n1 sL0    Y  W d    n1 sj0    Y   d nvt tjN tjdd" tttdI d H  W d    n1 s0    Y  W d    n1 s0    Y   d 0 d S )NTrk   r   ok)	r=   r>   r   ZRunFinishedErrorru   r   r   r	   r   r"   r1   r"   r#   agen  s    NNz2test_from_thread_run_during_shutdown.<locals>.agenc                      s$       d d I d H  d S )Nr   )r   asendr"   )r   saver"   r#   r[     s    z2test_from_thread_run_during_shutdown.<locals>.mainr   )r   rQ   )r[   r"   )r   r!   r   r#   $test_from_thread_run_during_shutdown  s    
r   c                     s0   t  } t| tsJ t| }| | u s,J d S r9   )r   r   r   weakrefref)r7   Zweak_referencer"   r"   r#   "test_trio_token_weak_referenceable  s    
r   c                     sP   G dd d} t t$ tt|  dI d H  W d    n1 sB0    Y  d S )Nc                   @   s   e Zd Zdd ZdS )z.test_unsafe_cancellable_kwarg.<locals>.BadBoolc                 S   s   t d S r9   )NotImplementedError)r   r"   r"   r#   __bool__  s    z7test_unsafe_cancellable_kwarg.<locals>.BadBool.__bool__N)r   r   r   r   r"   r"   r"   r#   BadBool  s   r   rg   )r=   r>   r   r   int)r   r"   r"   r#   test_unsafe_cancellable_kwarg  s    r   );Zcontextvarsr   queuerm   rt   r   r=   Zsniffior   Z
trio._corer   r    r   r   r   r	   Ztestingr
   Z_core.tests.tutilr   _threadsr   r   r   r   Z_core.tests.test_kir   r8   r@   rR   r\   ra   ry   r   markZparametrizer   r   r   r   r   r   Z
ContextVarr   r   r   r   r   r   r   r   r   r   r   Zskipifr   r   r   r"   r"   r"   r#   <module>   sX   70<#h	
+54	
