o
    gl(                     @   s$  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m	Z	 d dl	m
Z
 dd	lmZ z"d d
lmZ d dlmZ d dlmZ edddZedddZdZW n eyg   d Z ZZY nw eedudG dd deZeedudG dd deZedkre  dS dS )    )print_functionN)partial)
skipUnless)skipIf)greenlet)
getcurrent   )TestCase)Context)
ContextVar)copy_contextid)defaultvarzContextVar not supportedc                   @   sl   e Z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S )ContextVarsTestsc                 O   s   t  j|i |S N)r   run)selfargskwargs r   a/var/www/html/ecg_monitoring/venv/lib/python3.10/site-packages/greenlet/tests/test_contextvars.py_new_ctx_run#      zContextVarsTests._new_ctx_runc                 C   sb   t }|d u r| |  n| | | || tdD ]}||   d7  < |  qd S )N   r   )ID_VARassertIsNonegetassertEqualsetrange)r   greenlet_idcallbackcountsexpectctx_var_r   r   r   
_increment&   s   
zContextVarsTests._incrementc              	      sT  t d t j tdd tdD  fddtddD }|D ]}dkr0t |_q%d	kr9t j|_q%td
D ]}t    d7  < |D ]}|  qLq>dkrdt	|D ]}|  q\n	|D ]}|  qf|D ]}
|j dkr|j qo|j qod	krdddddd d S t td
g d S )Nr   c                 s   s    | ]}|d fV  qdS )r   Nr   .0ir   r   r   	<genexpr>6   s    z1ContextVarsTests._test_context.<locals>.<genexpr>   c              
      sX   g | ](}t td krtt jjnj| dkr|d ndv r%dnddqS )r   sharer   )r   r   r   N)r!   r"   r#   r$   )r   r   r   r   r'   r(   r"   r#   propagate_byr   r   r   
<listcomp>8   s     z2ContextVarsTests._test_context.<locals>.<listcomp>r   r   r-   r   r      )r   r   r         )r   r   r   switchdictr    r   
gr_contextr   reversed
assertTruedeadr   assertIsNotNoner   values)r   r/   letsletr*   r   r.   r   _test_context1   s>   





zContextVarsTests._test_contextc                 C      |  | jd d S )Nr   r   r>   r   r   r   r   &test_context_propagated_by_context_runn   r   z7ContextVarsTests.test_context_propagated_by_context_runc                 C   r?   )Nr   r@   rA   r   r   r   ,test_context_propagated_by_setting_attributeq   r   z=ContextVarsTests.test_context_propagated_by_setting_attributec                 C   s   |  | jd  d S r   r@   rA   r   r   r   test_context_not_propagatedt   r   z,ContextVarsTests.test_context_not_propagatedc                 C   r?   )Nr-   r@   rA   r   r   r   test_context_sharedw   r   z$ContextVarsTests.test_context_sharedc                 C   s@   t t j}t t j}|t j |t j |  d S r   )r   r   r   r4   r   r   let1let2r   r   r   test_break_ctxvarsz   s
   z#ContextVarsTests.test_break_ctxvarsc                 C   sL   t t j}t t j}t |_t |_|  |  |  |  d S r   )r   r   r4   r   r6   rF   r   r   r   9test_not_broken_if_using_attribute_instead_of_context_run   s   zJContextVarsTests.test_not_broken_if_using_attribute_instead_of_context_runc                    s0  t d   fdd}t| td
  `W d    n1 s#w   Y   j   \}}| j 	|t  d 	|t  d 	|
t jd | _    j| d  _    j| d  _    j d  t  	t|d 	t|d d S )Nc                     sX   t    j td  jt t d  jt d  j} d  _ t    j td  jt t d  jt d  j}t j	
| |f t d | _t d t j	
   t    j |  _t d t j	
   t    j d S )Nr   r   )r   r   r   r6   r   assertIsInstancer
   r   r   parentr4   )old_contextnew_contextgrr   r   r   target   s6   

zFContextVarsTests.test_context_assignment_while_running.<locals>.targetzcan't delete context attributer   r   )r   r   r   assertRaisesRegexAttributeErrorr6   r   r4   assertIsr   r   r   gccollectsysgetrefcount)r   rQ   rM   rN   r   rO   r   %test_context_assignment_while_running   s2   
)z6ContextVarsTests.test_context_assignment_while_runningc                    s  dd l }td  t  | | | | g fdd fdd}|j|dd}|  d d }| t	d	 t
|d
 W d    n1 sZw   Y  | t	d	 d |_W d    n1 ssw   Y    d | |j  | |jt d d |_  |d | |d g | |j  |_| |j  d d = d }d }d S )Nr   c                      sD   t d   d t d t j   t   d S )Nr   
   r   )VAR_VARr   waitr   rL   r4   appendr   r   )holder
is_runningshould_suspendr   r   greenlet_in_thread_fn   s   


zXContextVarsTests.test_context_assignment_different_thread.<locals>.greenlet_in_thread_fnc                     sF   t }  | _|  |     d |   ~ t   d S )NrZ   )r   r6   r]   r4   r   r\   )rP   )ctxdid_suspendra   r^   should_exitr   r   	thread_fn   s   


zLContextVarsTests.test_context_assignment_different_thread.<locals>.thread_fnT)rQ   daemonrZ   zrunning in a differentr6   r   )	threadingr[   r   r
   EventThreadstartr\   rR   
ValueErrorgetattrr6   rT   r   joinr   )r   rg   re   threadrP   r   )rb   rc   ra   r^   r_   rd   r`   r   (test_context_assignment_different_thread   sD   




z9ContextVarsTests.test_context_assignment_different_threadc                 C   s>   t  }| td | |_W d    d S 1 sw   Y  d S )Nz6greenlet context must be a contextvars.Context or None)r   rR   	TypeErrorr6   )r   gr   r   r   "test_context_assignment_wrong_type  s   "z3ContextVarsTests.test_context_assignment_wrong_typeN)__name__
__module____qualname__r   r'   r>   rB   rC   rD   rE   rI   rJ   rY   ro   rr   r   r   r   r   r   !   s    =

HBr   zContextVar supportedc                   @   s   e Zd Zdd ZdS )NoContextVarsTestsc                 C   s   t t j}| t|d | t t|d W d    n1 s#w   Y  | t d |_W d    n1 s;w   Y  |  | t t|d W d    n1 sYw   Y  | t d |_W d    ~d S 1 ssw   Y  ~d S )Nr6   )	r   r   r4   assertFalsehasattrassertRaisesrS   rl   r6   )r   rG   r   r   r   test_contextvars_errors!  s$   
z*NoContextVarsTests.test_contextvars_errorsN)rs   rt   ru   rz   r   r   r   r   rv     s    rv   __main__)
__future__r   rU   rW   unittest	functoolsr   r   r   r   r    r	   contextvarsr
   r   r   r   r[   ImportErrorr   rv   rs   mainr   r   r   r   <module>   s8     ~