a
    Ò�éiA(  ã                   @   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 zDd 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yÎ   d Z ZZY n0 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�re ¡  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   úO/home/Claro/venv/lib/python3.9/site-packages/greenlet/tests/test_contextvars.pyÚ_new_ctx_run#   s    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ÚexpectZctx_varÚ_r   r   r   Ú
_increment&   s    
zContextVarsTests._incrementc              	      sV  t  d¡ tƒ j‰ tdd„ tdƒD ƒƒ‰‡ ‡‡‡fdd„tddƒD ƒ}|D ](}ˆdkr`tƒ |_qJˆd	krJtƒ j|_qJtd
ƒD ]*}ˆt  ¡   d7  < |D ]}| ¡  q˜q|ˆdkrÈt	|ƒD ]}| ¡  q¸n|D ]}| ¡  qÌ|D ]4}ˆ 
|j¡ ˆdk�rˆ |j¡ qÞˆ |j¡ qÞˆd	k�r8ˆ ˆddddddœ¡ nˆ tˆ ¡ ƒtd
gƒ¡ d S )Nr   c                 s   s   | ]}|d fV  qdS )r   Nr   ©Ú.0Úir   r   r   Ú	<genexpr>5   ó    z1ContextVarsTests._test_context.<locals>.<genexpr>é   c              
      sX   g | ]P}t tˆd kr$ttƒ jˆjƒnˆj|ˆ ˆˆdkr>|d nˆdv rJd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>7   s   óýþöz2ContextVarsTests._test_context.<locals>.<listcomp>r   r   r,   r   r   é   )r   r   r   é   é   )r   r   r   ÚswitchÚdictr   r   Ú
gr_contextr   ÚreversedÚ
assertTrueZdeadr   ZassertIsNotNoner   Úvalues)r   r.   ZletsZletr(   r   r-   r   Ú_test_context1   s8    
ò



zContextVarsTests._test_contextc                 C   s   |   | jd¡ d S )Nr   ©r   r9   ©r   r   r   r   Ú&test_context_propagated_by_context_runm   s    z7ContextVarsTests.test_context_propagated_by_context_runc                 C   s   |   | jd¡ d S )Nr   r:   r;   r   r   r   Ú,test_context_propagated_by_setting_attributep   s    z=ContextVarsTests.test_context_propagated_by_setting_attributec                 C   s   |   | jd ¡ d S r   r:   r;   r   r   r   Útest_context_not_propagateds   s    z,ContextVarsTests.test_context_not_propagatedc                 C   s   |   | jd¡ d S )Nr,   r:   r;   r   r   r   Útest_context_sharedv   s    z$ContextVarsTests.test_context_sharedc                 C   s@   t tƒ jƒ}t tƒ jƒ}| tƒ j¡ | tƒ j¡ | ¡  d S r   )r   r   r   r3   r   ©r   Úlet1Zlet2r   r   r   Útest_break_ctxvarsy   s
    z#ContextVarsTests.test_break_ctxvarsc                 C   sL   t tƒ jƒ}t tƒ jƒ}tƒ |_tƒ |_| ¡  | ¡  | ¡  | ¡  d S r   )r   r   r3   r   r5   r@   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 sF0    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   r5   r   ZassertIsInstancer
   r   r   Úparentr3   )Ú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ÚAttributeErrorr5   r   r3   ÚassertIsr   r   r   ÚgcZcollectÚsysÚgetrefcount)r   rI   rE   rF   r   rG   r   Ú%test_context_assignment_while_running�   s0    
)"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 s´0    Y  |  t	d	¡� d |_W d   ƒ n1 sæ0    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   rD   r3   Ú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 )NrQ   )r   r5   rT   r3   r   rS   )rH   )ÚctxÚdid_suspendrX   rU   Úshould_exitr   r   Ú	thread_fnè   s    

zLContextVarsTests.test_context_assignment_different_thread.<locals>.thread_fnT)rI   ÚdaemonrQ   zrunning in a differentr5   r   )Ú	threadingrR   r   r
   ÚEventÚThreadÚstartrS   rJ   Ú
ValueErrorÚgetattrr5   rL   r   Újoinr   )r   r^   r\   ÚthreadrH   r   )rY   rZ   rX   rU   rV   r[   rW   r   Ú(test_context_assignment_different_threadÕ   s@    

($


z9ContextVarsTests.test_context_assignment_different_threadc                 C   s<   t ƒ }|  td¡� | |_W d   ƒ n1 s.0    Y  d S )Nz6greenlet context must be a contextvars.Context or None)r   rJ   Ú	TypeErrorr5   )r   Úgr   r   r   Ú"test_context_assignment_wrong_type  s
    ÿz3ContextVarsTests.test_context_assignment_wrong_typeN)Ú__name__Ú
__module__Ú__qualname__r   r%   r9   r<   r=   r>   r?   rB   rC   rP   rf   ri   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 sF0    Y  |  t¡� d |_W d   ƒ n1 sv0    Y  | ¡  |  t¡� t|dƒ W d   ƒ n1 s²0    Y  |  t¡� d |_W d   ƒ n1 sâ0    Y  ~d S )Nr5   )	r   r   r3   ZassertFalseÚhasattrÚassertRaisesrK   rc   r5   )r   rA   r   r   r   Útest_contextvars_errors   s    ($($z*NoContextVarsTests.test_contextvars_errorsN)rj   rk   rl   rp   r   r   r   r   rm     s   rm   Ú__main__)Ú
__future__r   rM   rN   ZunittestÚ	functoolsr   r   r   r   r   Ú r	   Zcontextvarsr
   r   r   r   rR   ÚImportErrorr   rm   rj   Úmainr   r   r   r   Ú<module>   s2    }
