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r�e ¡  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   ú[/var/www/html/flaskapp/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    ÿ ~ÿ