U
    cc#                     @   s   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 z(d dlmZ d dlm	Z	 d dlm
Z
 W n  ek
r   d Z Z	Z
Y nX e edk	dG d	d
 d
e jZe edk	dG dd de jZdS )    N)partial)greenlet)
getcurrent)Context)
ContextVar)copy_contextzContextVar not supportedc                   @   sd   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S )ContextVarsTestsc                 O   s   t  j||S N)r   run)selfargskwargs r   C/tmp/pip-unpacked-wheel-z1hn3a16/greenlet/tests/test_contextvars.py_new_ctx_run   s    zContextVarsTests._new_ctx_runc                 C   s^   |d kr|  |  n| | | || tdD ]}||   d7  < |  q:d S )N      )assertIsNonegetassertEqualsetrange)r   greenlet_idctx_varcallbackcountsexpect_r   r   r   
_increment   s    
zContextVarsTests._incrementc              	      sV  t dd dd t j tdd tdD  fddtd	dD }|D ](}d
krnt |_qXdkrXt j|_qXtdD ]*}   d	7  < |D ]}|  qqdkrt	|D ]}|  qn|D ]}|  q|D ]&}
|j |jd kdk qdkr8d	d	d	d	dd nt tdg d S )Niddefaultr   c                 s   s   | ]}|d fV  qdS )r   Nr   .0ir   r   r   	<genexpr>'   s     z1ContextVarsTests._test_context.<locals>.<genexpr>   c                    sZ   g | ]R}t td kr$tt jjnj| dkr@|d ndkrLdnddqS )r
   sharer   )r   r
   r   N)r   r   r   r   r   )r   r   r   r
   r   r"   r   r   id_varpropagate_byr   r   r   
<listcomp>)   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   values)r   r*   ZletsZletr$   r   r(   r   _test_context"   s6    



zContextVarsTests._test_contextc                 C   s   |  | jd d S )Nr
   r   r5   r   r   r   r   &test_context_propagated_by_context_run\   s    z7ContextVarsTests.test_context_propagated_by_context_runc                 C   s   |  | jd d S )Nr   r6   r7   r   r   r   ,test_context_propagated_by_setting_attribute_   s    z=ContextVarsTests.test_context_propagated_by_setting_attributec                 C   s   |  | jd  d S r	   r6   r7   r   r   r   test_context_not_propagatedb   s    z,ContextVarsTests.test_context_not_propagatedc                 C   s   |  | jd d S )Nr'   r6   r7   r   r   r   test_context_sharede   s    z$ContextVarsTests.test_context_sharedc                 C   s@   t t j}t t j}|t j |t j |  d S r	   )r   r   r
   r/   r   r   let1Zlet2r   r   r   test_break_ctxvarsh   s
    z#ContextVarsTests.test_break_ctxvarsc                 C   sL   t t j}t t j}t |_t |_|  |  |  |  d S r	   )r   r   r/   r   r1   r<   r   r   r   9test_not_broken_if_using_attribute_instead_of_context_runr   s    zJContextVarsTests.test_not_broken_if_using_attribute_instead_of_context_runc              	      s   t dd d fdd}t| td
  `W 5 Q R X  j   \}}| j | d | d |	j
d | _    j| d  _    j| d  _    j d  t  t|d t|d d S )Nr   r    c                     sX       j d  jt  d  j d  j} d  _     j d  jt  d  j d  j}t j	| |f  d | _ d t j	       j |  _ d t j	       j d S Nr   r   )
r   r   r1   r   ZassertIsInstancer   r   r   parentr/   )old_contextnew_contextgrr)   r   r   r   target   s6    

zFContextVarsTests.test_context_assignment_while_running.<locals>.targetzcan't delete attrr   r   )r   r   assertRaisesRegexAttributeErrorr1   r   r/   assertIsr   r
   r   gcZcollectsysgetrefcount)r   rF   rB   rC   r   rD   r   %test_context_assignment_while_running|   s0    )z6ContextVarsTests.test_context_assignment_while_runningc              	      sD  dd l }t  tdd d| | | | g fdd fdd}|j|dd	}|    d }| td
 t	|d W 5 Q R X | td
 d |_
W 5 Q R X     | |j
  | |j
 d d |_
  |  | |d g | |j
  |_
| |j
  d S )Nr   varr    c                      sB    d       d t j     d S r@   )r   waitr   rA   r/   appendr   r   )holder
is_runningshould_suspendrN   r   r   greenlet_in_thread_fn   s    

zXContextVarsTests.test_context_assignment_different_thread.<locals>.greenlet_in_thread_fnc                     s<   t }  | _|  |       |   d S r	   )r   r1   rP   r/   r   rO   )rE   )ctxdid_suspendrT   rQ   should_exitr   r   	thread_fn   s    
zLContextVarsTests.test_context_assignment_different_thread.<locals>.thread_fnT)rF   daemonzrunning in a differentr1   r   )	threadingr   r   EventThreadstartrO   rG   
ValueErrorgetattrr1   r   rI   r   joinr   )r   rZ   rX   threadrE   r   )rU   rV   rT   rQ   rR   rW   rS   rN   r   (test_context_assignment_different_thread   s:    	z9ContextVarsTests.test_context_assignment_different_threadN)__name__
__module____qualname__r   r   r5   r8   r9   r:   r;   r>   r?   rM   rb   r   r   r   r   r      s   
:

Gr   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 )Nr1   )	r   r   r/   ZassertFalsehasattrassertRaisesrH   r_   r1   )r   r=   r   r   r   test_contextvars_errors   s    z*NoContextVarsTests.test_contextvars_errorsN)rc   rd   re   ri   r   r   r   r   rf      s   rf   )ZunittestrJ   rK   	functoolsr   r   r   Zcontextvarsr   r   r   ImportErrorZ
skipUnlessZTestCaser   ZskipIfrf   r   r   r   r   <module>   s     j