B
    H/\-                 @   s  d dl mZ d dlmZ d dlmZ e  d dlmZ d dlm	Z	 yd dl
mZ W n  ek
rt   d dlmZ Y nX G dd deZG d	d
 d
eZG dd deZg Zg ZG dd deZG dd deZG dd deZG dd deZG dd deeZG dd deZG dd deZG dd dejZyd dlmZ W n ek
r\   dZY nX eedkdG dd  d ejZ e!d!G d"d# d#ejZ"e#d$G d%d& d&ejZ$e%d'kre&  dS )(    N)copy)monkey)local)Thread)Mappingc               @   s   e Zd ZdZdd ZdS )ReadPropertyz!A property that can be overriddenc             C   s   |d k	rdS | S )N*    )selfZinstklassr	   r	   7lib/python3.7/site-packages/gevent/tests/test__local.py__get__   s    zReadProperty.__get__N)__name__
__module____qualname____doc__r   r	   r	   r	   r   r      s   r   c                   s2   e Zd ZddgZdZdZe Z fddZ  Z	S )Ainitializedobj MyPathc                s(   t t|   t| ds|| _d| _d S )Nr   r   )superr   __init__hasattrr   path)r
   r   )	__class__r	   r   r   !   s    
z
A.__init__)
r   r   r   	__slots__r   	type_pathr   read_propertyr   __classcell__r	   r	   )r   r   r      s
   r   c               @   s   e Zd ZdS )ObjN)r   r   r   r	   r	   r	   r   r    (   s   r    c               @   s   e Zd Zdd ZdS )Sentinelc             C   s   t t|  d S )N)deleted_sentinelsappendid)r
   r	   r	   r   __del__0   s    zSentinel.__del__N)r   r   r   r%   r	   r	   r	   r   r!   /   s   r!   c               @   s$   e Zd ZdZdd Zedd ZdS )MyLocalr   c             C   s&   t |  t | _tt| j d S )N)r   r   r!   sentinelcreated_sentinelsr#   r$   )r
   r	   r	   r   r   8   s    
zMyLocal.__init__c             C   s   | S )Nr	   )r
   r	   r	   r   desc=   s    zMyLocal.descN)r   r   r   
CLASS_PROPr   propertyr)   r	   r	   r	   r   r&   4   s   r&   c               @   s   e Zd ZdS )MyLocalSubclassN)r   r   r   r	   r	   r	   r   r,   A   s   r,   c                   s   e Zd Z fddZ  ZS )WithGetattrc                s   |dkrdS t t| |S )Nfoor   )r   r-   __getattr__)r
   name)r   r	   r   r/   F   s    zWithGetattr.__getattr__)r   r   r   r/   r   r	   r	   )r   r   r-   D   s   r-   c               @   s$   e Zd Zdd Zdd Zdd ZdS )LocalWithABCc             C   s
   | j | S )N)d)r
   r0   r	   r	   r   __getitem__M   s    zLocalWithABC.__getitem__c             C   s
   t | jS )N)iterr2   )r
   r	   r	   r   __iter__P   s    zLocalWithABC.__iter__c             C   s
   t | jS )N)lenr2   )r
   r	   r	   r   __len__S   s    zLocalWithABC.__len__N)r   r   r   r3   r5   r7   r	   r	   r	   r   r1   K   s   r1   c               @   s   e Zd Zedd ZdS )LocalWithStaticMethodc               C   s   dS )Nr   r	   r	   r	   r	   r   a_staticmethodX   s    z$LocalWithStaticMethod.a_staticmethodN)r   r   r   staticmethodr9   r	   r	   r	   r   r8   V   s   r8   c               @   s   e Zd Zedd ZdS )LocalWithClassMethodc             C   s   | S )Nr	   )clsr	   r	   r   a_classmethod^   s    z"LocalWithClassMethod.a_classmethodN)r   r   r   classmethodr=   r	   r	   r	   r   r;   \   s   r;   c               @   s   e Zd Zdd Ze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efddZdd Zdd Zeddd Zejd d! Zd"d# Zd$d% Zd&d' Zd(S ))TestGeventLocalc             C   s   t d d = td d = d S )N)r"   r(   )r
   r	   r	   r   setUph   s    
zTestGeventLocal.setUpc          	   C   sF   |  td td W d Q R X |  td tdd W d Q R X d S )Nz*Initialization arguments are not supportedr.   )kw)ZassertRaisesRegex	TypeErrorr   )r
   r	   r	   r   $test_create_local_subclass_init_argsn   s    z4TestGeventLocal.test_create_local_subclass_init_argsc             C   s   t  }d|_| |jd d S )N   )r   attrassertEqual)r
   lr	   r	   r   test_local_opts_not_subclassedx   s    z.TestGeventLocal.test_local_opts_not_subclassedc          	   C   s@   t  }| t d|_W d Q R X | t
 |`W d Q R X d S )NrD   )r   assertRaisesAttributeError__dict__)r
   rG   r	   r	   r   test_cannot_set_delete_dict}   s
    z+TestGeventLocal.test_cannot_set_delete_dictc          	      sR   t   t t d W d Q R X  fdd}t|d}|  |  d S )Nthingc            	      s$    t t d W d Q R X d S )NrM   )rI   rJ   delattrr	   )rG   r
   r	   r   	del_local   s    z;TestGeventLocal.test_delete_with_no_dict.<locals>.del_local)target)r   rI   rJ   rN   r   startjoin)r
   rO   tr	   )rG   r
   r   test_delete_with_no_dict   s    
z(TestGeventLocal.test_delete_with_no_dictc          	      s,  t t  d _ jd  fdd}t|d}|  |   jd d jd<  jd  `t	 d 
d j  ` jd t
  `W d Q R X  jd d _ jd t jt  jd	 d
 j d _ jd 
d
 j d S )NrD   c                  s     jd d _d S )NrD      )rF   r   r	   )ar
   r	   r   demonstrate_slots_shared   s    zOTestGeventLocal.test_slot_and_type_attributes.<locals>.demonstrate_slots_shared)rP   rU   r   r   r   r   r   ZLocal)r   r    r   rF   r   rQ   rR   rK   assertFalser   assertInr   rI   rJ   r   ZassertIsInstancer   r   ZassertNotIn)r
   rW   greenletr	   )rV   r
   r   test_slot_and_type_attributes   s4    


z-TestGeventLocal.test_slot_and_type_attributesc          	      st   t t  | t t d W d Q R X  fdd}t|d}|  |  | t t d W d Q R X d S )N	fizz_buzzc                  s
   d _ d S )NrD   )r\   r	   )rV   r	   r   set_fizz_buzz   s    z;TestGeventLocal.test_attribute_error.<locals>.set_fizz_buzz)rP   )r   r    rI   rJ   getattrr   rQ   rR   )r
   r]   rZ   r	   )rV   r   test_attribute_error   s    

z$TestGeventLocal.test_attribute_errorc             C   s,   t  }| d|j d|_| d|j d S )Nr   Zbaz)r-   rF   r.   )r
   getterr	   r	   r   test_getattr_called   s    z#TestGeventLocal.test_getattr_calledc             C   sz   t t }d|_d|j_t|}| |j|jd | |j|jd d|_| |j|jd d|j_| |j|jd d S )N123Ztestz+The values in the two objects must be equalzThe values must be equal321z/The values in the two objects must be differentZworks)r   r    r   r   Zechor   rF   assertNotEqual)r
   rV   br	   r	   r   	test_copy   s    
zTestGeventLocal.test_copyc             C   s<   t  }t|dd t|}| |jd | |j|j d S )NrM   r   )r   setattrr   rF   rM   ZassertIsNotrK   )r
   rV   re   r	   r	   r   test_copy_no_subclass   s
    z%TestGeventLocal.test_copy_no_subclassc             C   sN   t i }d|_t ddi}d|_| |j|jd d|_| |j|jd d S )Nrb   ZonerU   z+The values in the two objects must be equalrc   z/The values in the two objects must be different)r   r   rF   rd   )r
   rV   re   r	   r	   r   test_objects   s    zTestGeventLocal.test_objectsc             C   s^   | }|  d|j d|_|  d|j |  |jd d |`|  d|j | ||j d S )Nr   rD   r*   )rF   r*   rK   assertIsr)   )r
   kindZmylocalr	   r	   r   test_class_attr  s    zTestGeventLocal.test_class_attrc             C   s   | j td d S )N)rk   )rl   r,   )r
   r	   r	   r   test_class_attr_subclass  s    z(TestGeventLocal.test_class_attr_subclassc                s   dd l }t d _t  td d = td d = fdd  fddtdD }x|D ]}|  qXW |	  | 
ttt| x|D ]}| rtqW |	  t  | 
ttt| d S )Nr   c                  s   t  d d S )Nr'   )r^   r	   )my_localr	   r   demonstrate_my_local  s    zkTestGeventLocal.test_locals_collected_when_greenlet_dead_but_still_referenced.<locals>.demonstrate_my_localc                s   g | ]}t  d qS ))rP   )r   ).0_)ro   r	   r   
<listcomp>"  s    zaTestGeventLocal.test_locals_collected_when_greenlet_dead_but_still_referenced.<locals>.<listcomp>   )geventr&   r'   	greentestZgc_collect_if_neededr(   r"   rangerQ   sleeprF   r6   Zis_aliveAssertionError)r
   rt   Z	greenletsrS   gr	   )ro   rn   r   =test_locals_collected_when_greenlet_dead_but_still_referenced  s"    



zMTestGeventLocal.test_locals_collected_when_greenlet_dead_but_still_referencedz6GC makes this non-deterministic, especially on Windowsc                s`   dd l }dd l  d d  fdd}|||     tt d S )Nr   i  c                 sj   x&t dD ]} t }|j d }q
W      tt  tt 	
  d S )Ni  )rv   r&   ZassertIsNotNoner'   collectrF   r6   r(   r"   rX   Z	has_links)rq   x)countgcrunning_greenletr
   r	   r   ro   >  s    znTestGeventLocal.test_locals_collected_when_unreferenced_even_in_running_greenlet.<locals>.demonstrate_my_local)	rt   r~   r{   Zspawnrw   rR   rF   r6   r"   )r
   rt   ro   r	   )r}   r~   r   r
   r   @test_locals_collected_when_unreferenced_even_in_running_greenlet1  s    
zPTestGeventLocal.test_locals_collected_when_unreferenced_even_in_running_greenletc                sp   dd l }ddlm  G  fddd|j}| }|  |  | |j| | |j	t
|jfddifg d S )Nr   )all_local_dicts_for_greenletc                   s    e Zd ZdZdZ fddZdS )zATestGeventLocal.test_local_dicts_for_greenlet.<locals>.MyGreenletNc                s$   t  }d|_t|| _ | | _d S )Nr   )r   r.   r$   id_xresults)r
   r|   )r   r	   r   _run^  s    
zFTestGeventLocal.test_local_dicts_for_greenlet.<locals>.MyGreenlet._run)r   r   r   r   r   r   r	   )r   r	   r   
MyGreenlet[  s   r   r.   r   )rt   Zgevent.localr   ZGreenletrQ   rR   Z
assertTrueZ
successfulrF   r   r   r   )r
   rt   r   ry   r	   )r   r   test_local_dicts_for_greenletV  s    	z-TestGeventLocal.test_local_dicts_for_greenletc             C   sJ   t  }ddi|_| ddi|j | d|j | dgt|  d S )NrV   rD   )r1   r2   rF   rY   listkeys)r
   r|   r	   r	   r   test_local_with_abck  s
    
z#TestGeventLocal.test_local_with_abcc             C   s   t  }| d|  d S )Nr   )r8   rF   r9   )r
   r|   r	   r	   r   test_local_with_staticmethodv  s    z,TestGeventLocal.test_local_with_staticmethodc             C   s   t  }| t |  d S )N)r;   rj   r=   )r
   r|   r	   r	   r   test_local_with_classmethodz  s    z+TestGeventLocal.test_local_with_classmethodN)r   r   r   r@   ZtearDownrC   rH   rL   rT   r[   r_   ra   rf   rh   ri   r&   rl   rm   rz   ru   ZskipOnLibuvOnPyPyOnWinr   ignores_leakcheckr   r   r   r   r	   r	   r	   r   r?   e   s(   
0%r?   )	interfacezNeeds zope.interfacec               @   s   e Zd ZdZejdd ZdS )TestLocalInterfaceNc             C   sd   G dd dt j}t |G dd dt}G dd d|t}| }tt |}| |g| d S )Nc               @   s   e Zd ZdS )z.TestLocalInterface.test_provides.<locals>.IFooN)r   r   r   r	   r	   r	   r   IFoo  s   r   c               @   s   e Zd ZdS )z.TestLocalInterface.test_provides.<locals>.BaseN)r   r   r   r	   r	   r	   r   Base  s   r   c               @   s   e Zd ZdS )z1TestLocalInterface.test_provides.<locals>.DerivedN)r   r   r   r	   r	   r	   r   Derived  s   r   )r   Z	InterfaceZimplementerobjectr   r   Z
providedByrF   )r
   r   r   r   r2   pr	   r	   r   test_provides  s    z TestLocalInterface.test_provides)r   r   r   Z__timeout__ru   r   r   r	   r	   r	   r   r     s   r   zNeeds C extensionc               @   s   e Zd Zdd ZdS )TestCExtc             C   s   |  tjd d S )Nzgevent._local)rF   r   r   )r
   r	   r	   r   test_c_extension  s    zTestCExt.test_c_extensionN)r   r   r   r   r	   r	   r	   r   r     s   r   zNeeds pure-pythonc               @   s   e Zd Zdd ZdS )TestPurec             C   s   |  tjd d S )Nzgevent.local)rF   r   r   )r
   r	   r	   r   test_extension  s    zTestPure.test_extensionN)r   r   r   r   r	   r	   r	   r   r     s   r   __main__)'Zgevent.testingZtestingru   r   rt   r   Z	patch_allZ	threadingr   r   Zcollections.abcr   ImportErrorcollectionsr   r   r   r    r"   r(   r!   r&   r,   r-   r1   r8   r;   ZTestCaser?   Zzoper   ZskipIfr   ZskipOnPurePythonr   ZskipWithCExtensionsr   r   mainr	   r	   r	   r   <module>   sH    		  




