U
    nvgl(                     @   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k
r   d Z ZZY nX eedk	dG dd deZeedk	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||S N)r   run)selfargskwargs r   C/tmp/pip-unpacked-wheel-49pzfzc0/greenlet/tests/test_contextvars.py_new_ctx_run#   s    zContextVarsTests._new_ctx_runc                 C   sb   t }|d k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 ]}|  qq|dkrt	|D ]}|  qn|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>6   s     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k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>8   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   r8   r   r   r   r   &test_context_propagated_by_context_runn   s    z7ContextVarsTests.test_context_propagated_by_context_runc                 C   s   |  | jd d S )Nr   r9   r:   r   r   r   ,test_context_propagated_by_setting_attributeq   s    z=ContextVarsTests.test_context_propagated_by_setting_attributec                 C   s   |  | jd  d S r   r9   r:   r   r   r   test_context_not_propagatedt   s    z,ContextVarsTests.test_context_not_propagatedc                 C   s   |  | jd d S )Nr+   r9   r:   r   r   r   test_context_sharedw   s    z$ContextVarsTests.test_context_sharedc                 C   s@   t t j}t t j}|t j |t j |  d S r   )r   r   r   r2   r   r   let1Z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   r2   r   r4   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              	      s  t d   fdd}t| td
  `W 5 Q R X  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   r4   r   ZassertIsInstancer
   r   r   parentr2   )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AttributeErrorr4   r   r2   assertIsr   r   r   gcZcollectsysgetrefcount)r   rH   rD   rE   r   rF   r   %test_context_assignment_while_running   s0    
)z6ContextVarsTests.test_context_assignment_while_runningc              	      sX  dd l }td  t  | | | | g fdd fdd}|j|dd}|  d d }| t	d	 t
|d
 W 5 Q R X | t	d	 d |_W 5 Q R X   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   rC   r2   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 )NrP   )r   r4   rS   r2   r   rR   )rG   )ctxdid_suspendrW   rT   should_exitr   r   	thread_fn   s    

zLContextVarsTests.test_context_assignment_different_thread.<locals>.thread_fnT)rH   daemonrP   zrunning in a differentr4   r   )	threadingrQ   r   r
   EventThreadstartrR   rI   
ValueErrorgetattrr4   rK   r   joinr   )r   r]   r[   threadrG   r   )rX   rY   rW   rT   rU   rZ   rV   r   (test_context_assignment_different_thread   s@    




z9ContextVarsTests.test_context_assignment_different_threadc              	   C   s(   t  }| td | |_W 5 Q R X d S )Nz6greenlet context must be a contextvars.Context or None)r   rI   	TypeErrorr4   )r   gr   r   r   "test_context_assignment_wrong_type  s
    z3ContextVarsTests.test_context_assignment_wrong_typeN)__name__
__module____qualname__r   r%   r8   r;   r<   r=   r>   rA   rB   rO   re   rh   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 5 Q R X | t d |_W 5 Q R X |  | t t|d W 5 Q R X | t d |_W 5 Q R X ~d S )Nr4   )	r   r   r2   ZassertFalsehasattrassertRaisesrJ   rb   r4   )r   r@   r   r   r   test_contextvars_errors!  s    z*NoContextVarsTests.test_contextvars_errorsN)ri   rj   rk   ro   r   r   r   r   rl     s   rl   __main__)
__future__r   rL   rM   Zunittest	functoolsr   r   r   r   r    r	   Zcontextvarsr
   r   r   r   rQ   ImportErrorr   rl   ri   mainr   r   r   r   <module>   s2    ~
