
    i-                        d dl mZ d dlmZ d dlmZ  ej                     d dlmZ d dlm	Z	 d dl
mZ 	 d dlmZ n# e$ r	 d dlmZ Y nw xY w G d d	e          Z G d
 de          Z G d de          Zg Zg Z G d de          Z G d de          Z G d de          Z G d de          Z G d dee          Z G d de          Z G d de          Z G d dej                  Z G d dej                  Z ej         d            G d! d"ej                              Z! ej"        d#           G d$ d%ej                              Z#e$d&k    r ej%                     dS dS )'    N)copy)monkey)localThread)	interface)Mappingc                       e Zd ZdZd ZdS )ReadPropertyz!A property that can be overriddenc                     |dn| S N*    )selfinstklasss      C/usr/local/lib/python3.11/dist-packages/gevent/tests/test__local.py__get__zReadProperty.__get__   s    %rr4/    N)__name__
__module____qualname____doc__r   r   r   r   r   r      s)        ++0 0 0 0 0r   r   c                   B     e Zd ZddgZdZdZ e            Z fdZ xZ	S )Ainitializedobj MyPathc                     t          t          |                                            t          | d          s|| _        d| _        d S )Nr   r   )superr   __init__hasattrr   path)r   r   	__class__s     r   r"   z
A.__init__#   sA    a!!!t]++ 	DH			r   )
r   r   r   	__slots__r$   	type_pathr   read_propertyr"   __classcell__r%   s   @r   r   r      sW        &IDI LNNM        r   r   c                       e Zd ZdS )ObjNr   r   r   r   r   r   r,   r,   *           Dr   r,   c                       e Zd Zd ZdS )Sentinelc                 T    t                               t          |                      d S N)deleted_sentinelsappendidr   s    r   __del__zSentinel.__del__2   s"      D*****r   N)r   r   r   r7   r   r   r   r0   r0   1   s#        + + + + +r   r0   c                   .    e Zd ZdZd Zed             ZdS )MyLocalr   c                     t          j        |            t                      | _        t                              t          | j                             d S r2   )r   r"   r0   sentinelcreated_sentinelsr4   r5   r6   s    r   r"   zMyLocal.__init__:   sA    t 

  DM!2!233333r   c                     | S r2   r   r6   s    r   desczMyLocal.desc?   s    r   N)r   r   r   
CLASS_PROPr"   propertyr>   r   r   r   r9   r9   6   sC        J4 4 4
   X  r   r9   c                       e Zd ZdS )MyLocalSubclassNr-   r   r   r   rB   rB   C   r.   r   rB   c                        e Zd Z fdZ xZS )WithGetattrc                 d    |dk    rdS t          t          |                               |          S )Nfoor   )r!   rD   __getattr__)r   namer%   s     r   rG   zWithGetattr.__getattr__H   s/    5==2[$''33D999r   )r   r   r   rG   r)   r*   s   @r   rD   rD   F   s8        : : : : : : : : :r   rD   c                        e Zd Zd Zd Zd ZdS )LocalWithABCc                     | j         |         S r2   )d)r   rH   s     r   __getitem__zLocalWithABC.__getitem__O   s    vd|r   c                 *    t          | j                  S r2   )iterrL   r6   s    r   __iter__zLocalWithABC.__iter__R   s    DF||r   c                 *    t          | j                  S r2   )lenrL   r6   s    r   __len__zLocalWithABC.__len__U   s    46{{r   N)r   r   r   rM   rP   rS   r   r   r   rJ   rJ   M   sA                r   rJ   c                   $    e Zd Zed             ZdS )LocalWithStaticMethodc                      dS r   r   r   r   r   a_staticmethodz$LocalWithStaticMethod.a_staticmethodZ   s    rr   N)r   r   r   staticmethodrW   r   r   r   rU   rU   X   s-          \  r   rU   c                   $    e Zd Zed             ZdS )LocalWithClassMethodc                     | S r2   r   )clss    r   a_classmethodz"LocalWithClassMethod.a_classmethod`   s    
r   N)r   r   r   classmethodr]   r   r   r   rZ   rZ   ^   s-          [  r   rZ   c                       e Zd Zd ZeZd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd ZefdZd Zd Z ej        d          d             Zej        d             Zd Zd Zd ZdS )TestGeventLocalc                 .    t           d d = t          d d = d S r2   )r3   r<   r6   s    r   setUpzTestGeventLocal.setUpj   s     aaa aaa   r   c                    |                      t          d          5  t          d           d d d            n# 1 swxY w Y   |                      t          d          5  t          d           d d d            d S # 1 swxY w Y   d S )Nz*Initialization arguments are not supportedrF   )kw)assertRaisesRegex	TypeErrorr   r6   s    r   $test_create_local_subclass_init_argsz4TestGeventLocal.test_create_local_subclass_init_argsp   s   ##I$PR R 	 	%LLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ##I$PR R 	 	UOOOO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8<<A<<B B c                 f    t                      }d|_        |                     |j        d           d S N   )r   attrassertEqualr   ls     r   test_local_opts_not_subclassedz.TestGeventLocal.test_local_opts_not_subclassedz   s0    GG#####r   c                     t                      }|                     t                    5  d|_        d d d            n# 1 swxY w Y   |                     t                    5  |`d d d            d S # 1 swxY w Y   d S ri   )r   assertRaisesAttributeError__dict__rm   s     r   test_cannot_set_delete_dictz+TestGeventLocal.test_cannot_set_delete_dict   s    GG~.. 	 	AJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ~.. 	 	
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s!   =AA"A22A69A6c                 &    t                                           t                    5  t          d           d d d            n# 1 swxY w Y    fd}t	          |          }|                                 |                                 d S )Nthingc                                           t                    5  t           d           d d d            d S # 1 swxY w Y   d S )Nrv   )rq   rr   delattr)rn   r   s   r   	del_localz;TestGeventLocal.test_delete_with_no_dict.<locals>.del_local   s    "">22 $ $7###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s   :>>target)r   rq   rr   rx   r   startjoin)r   ry   trn   s   `  @r   test_delete_with_no_dictz(TestGeventLocal.test_delete_with_no_dict   s    GG~.. 	  	 Aw	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 	$ 	$ 	$ 	$ 	$ 	$ )$$$					s   AAAc                 L    t          t                                d_                             j        d            fd}t	          |          }|                                 |                                                      j        d           dj        d<                        j        d           `                     t          d                      
                    dj                   `                     j        d                                t                    5  `d d d            n# 1 swxY w Y                        j        d           d_                             j        d                                t           j        t                                           j        d                                d	j                   d
_                             j        d
            
                    d	j                   d S )Nrj   c                  L                          j        d           d _        d S )Nrj      )rl   r   )ar   s   r   demonstrate_slots_sharedzOTestGeventLocal.test_slot_and_type_attributes.<locals>.demonstrate_slots_shared   s&    Q]A...AMMMr   rz   r   r   r   r   r   r'   Local)r   r,   r   rl   r   r|   r}   rs   assertFalser#   assertInr$   rq   rr   r(   assertIsInstancer   r'   assertNotIn)r   r   greenletr   s   `  @r   test_slot_and_type_attributesz-TestGeventLocal.test_slot_and_type_attributes   sF   ceeHH***	 	 	 	 	 	 !9:::*** %'
=!*** MM22333mQZ000 F$$$~.. 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	"---!,,,ao|<<< 	h///aj111 g...k1:.....s   5EEEc                    t          t                                |                     t                    5  t	          d           d d d            n# 1 swxY w Y   fd}t          |          }|                                 |                                 |                     t                    5  t	          d           d d d            d S # 1 swxY w Y   d S )N	fizz_buzzc                      d _         d S ri   )r   )r   s   r   set_fizz_buzzz;TestGeventLocal.test_attribute_error.<locals>.set_fizz_buzz   s    AKKKr   rz   )r   r,   rq   rr   getattrr   r|   r}   )r   r   r   r   s      @r   test_attribute_errorz$TestGeventLocal.test_attribute_error   s[   ceeHH~.. 	$ 	$A{###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$	 	 	 	 	 ///~.. 	$ 	$A{###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s#   AAA6CCCc                     t                      }|                     d|j                   d|_        |                     d|j                   d S )Nr   baz)rD   rl   rF   )r   getters     r   test_getattr_calledz#TestGeventLocal.test_getattr_called   sH    VZ(((

+++++r   c                    t          t                                }d|_        d|j        _        t          |          }|                     |j        |j        d           |                     |j        |j        d           d|_        |                     |j        |j        d           d|j        _        |                     |j        |j        d           d S )N123test+The values in the two objects must be equalzThe values must be equal321/The values in the two objects must be differentworks)r   r,   r$   r   echor   rl   assertNotEqualr   r   bs      r   	test_copyzTestGeventLocal.test_copy   s    ceeHH
GG 	)VWWW'ABBBAFAF,]^^^
'ABBBBBr   c                     t                      }t          |dd           t          |          }|                     |j        d           |                     |j        |j                   d S )Nrv   r   )r   setattrr   rl   rv   assertIsNotrs   r   s      r   test_copy_no_subclassz%TestGeventLocal.test_copy_no_subclass   s`    GG7BGG"%%%QZ00000r   c                     t          i           }d|_        t          ddi          }d|_        |                     |j        |j        d           d|_        |                     |j        |j        d           d S )Nr   oner   r   r   r   )r   r$   rl   r   r   s      r   test_objectszTestGeventLocal.test_objects   ss     bEEuajMM)VWWWAFAF,]^^^^^r   c                 F    |            }|                      d|j                   d|_        |                      d|j                   |                      |j        d         d           |`|                      d|j                   |                     ||j                   d S )Nr   rj   r?   )rl   r?   rs   assertIsr>   )r   kindmylocals      r   test_class_attrzTestGeventLocal.test_class_attr  s    $&&W/000G.///),7;;;W/000gw|,,,,,r   c                 <    |                      t                     d S )N)r   )r   rB   r6   s    r   test_class_attr_subclassz(TestGeventLocal.test_class_attr_subclass  s    /22222r   c                 |   dd l }t                      d _        t          j                     t
          d d = t          d d = fdfdt          d          D             }|D ]}|                                 |	                                 | 
                    t          t
                    t          |                     |D ]}|                                rJ |	                                 t          j                     | 
                    t          t                    t          |                     d S )Nr   c                  (    t           d           d S )Nr;   )r   )my_locals   r   demonstrate_my_localzkTestGeventLocal.test_locals_collected_when_greenlet_dead_but_still_referenced.<locals>.demonstrate_my_local  s    Hj)))))r   c                 0    g | ]}t                     S )rz   r   ).0_r   s     r   
<listcomp>zaTestGeventLocal.test_locals_collected_when_greenlet_dead_but_still_referenced.<locals>.<listcomp>$  s%    KKKQV#7888KKKr      )geventr9   r;   	greentestgc_collect_if_neededr<   r3   ranger|   sleeprl   rR   is_alive)r   r   	greenletsr~   gr   r   s        @@r   =test_locals_collected_when_greenlet_dead_but_still_referencedzMTestGeventLocal.test_locals_collected_when_greenlet_dead_but_still_referenced  s?   99 &(((aaa aaa 	* 	* 	* 	* 	*
 LKKK%((KKK	 	 	AGGIIII.//Y@@@ 	$ 	$Azz||####&((( 	.//Y@@@@@r   z6GC makes this non-deterministic, especially on Windowsc                 (    dd l }dd l                                 dd  fd}|                    |          |                                                                                       t          t                               d S )Nr     c                     t          d          D ],} t                      }                    |j                   d }-                                                                                      t          t                                                   t          t                               	                    
                                           d S )Nr   )r   r9   assertIsNotNoner;   collectrl   rR   r<   r3   r   	has_links)r   xcountgcrunning_greenletr   s     r   r   znTestGeventLocal.test_locals_collected_when_unreferenced_even_in_running_greenlet.<locals>.demonstrate_my_local@  s    4[[  II$$QZ000JJLLLJJLLLUC(9$:$:;;; UC(9$:$:;;; -7799:::::r   )	r   r   r   spawnr   r}   rl   rR   r3   )r   r   r   r   r   r   s   `  @@@r   @test_locals_collected_when_unreferenced_even_in_running_greenletzPTestGeventLocal.test_locals_collected_when_unreferenced_even_in_running_greenlet3  s    
 				


	; 	; 	; 	; 	; 	; 	; 	;$ "<<(<==$5 6 677777r   c                 8   dd l }ddlm  G fdd|j                  } |            }|                                 |                                 |                     |j        |           |                     |j	        t          |j        fddifg           d S )Nr   all_local_dicts_for_greenletc                   "    e Zd ZdZdZ fdZdS )ATestGeventLocal.test_local_dicts_for_greenlet.<locals>.MyGreenletNc                 z    t                      }d|_        t          |          | _         |           | _        d S r   )r   rF   r5   id_xresults)r   r   r   s     r   _runzFTestGeventLocal.test_local_dicts_for_greenlet.<locals>.MyGreenlet._run`  s6    GGqEE	;;DAAr   )r   r   r   r   r   r   r   s   r   
MyGreenletr   ]  s?        GDB B B B B B Br   r   rF   r   )r   gevent.localr   Greenletr|   r}   
assertTrue
successfulrl   r   r   r   )r   r   r   r   r   s       @r   test_local_dicts_for_greenletz-TestGeventLocal.test_local_dicts_for_greenletX  s    ======	B 	B 	B 	B 	B 	B 	B 	B 	B 	B JLL					a(((!16?UBK89	; 	; 	; 	; 	;r   c                    t                      }ddi|_        |                     ddi|j                   |                     d|j                   |                     dgt	          |                                                     d S )Nr   rj   )rJ   rL   rl   r   listkeysr   r   s     r   test_local_with_abcz#TestGeventLocal.test_local_with_abcm  sv     NNAh#q13'''c13#QVVXX/////r   c                 r    t                      }|                     d|                                           d S r   )rU   rl   rW   r   s     r   test_local_with_staticmethodz,TestGeventLocal.test_local_with_staticmethodx  s5    !##Q--//00000r   c                 |    t                      }|                     t           |                                           d S r2   )rZ   r   r]   r   s     r   test_local_with_classmethodz+TestGeventLocal.test_local_with_classmethod|  s2     ""*AOO,=,=>>>>>r   N)r   r   r   rb   tearDownrg   ro   rt   r   r   r   r   r   r   r   r9   r   r   r   r   skipOnLibuvOnPyPyOnWinr   ignores_leakcheckr   r   r   r   r   r   r   r`   r`   g   sy       ! ! ! H  $ $ $
    ./ ./ ./`$ $ $ , , ,C C C(1 1 1_ _ _ $+ - - - -3 3 3A A A> &Y%&^__"8 "8 `_"8H  ; ; ! ;(	0 	0 	01 1 1? ? ? ? ?r   r`   c                   2    e Zd ZdZej        d             ZdS )TestLocalInterfaceNc                 <    G d dt           j                  }t          j        |           G d dt                                } G d d|t                    } |            }t          t          j        |                    }|                     |g|           d S )Nc                       e Zd ZdS ).TestLocalInterface.test_provides.<locals>.IFooNr-   r   r   r   IFoor             Dr   r   c                       e Zd ZdS ).TestLocalInterface.test_provides.<locals>.BaseNr-   r   r   r   Baser     s        Dr   r   c                       e Zd ZdS )1TestLocalInterface.test_provides.<locals>.DerivedNr-   r   r   r   Derivedr     r   r   r   )r   	Interfaceimplementerobjectr   r   
providedByrl   )r   r   r   r   rL   ps         r   test_providesz TestLocalInterface.test_provides  s    
	 	 	 	 	9& 	 	 	 
	t	$	$	 	 	 	 	6 	 	 
%	$		 	 	 	 	dE 	 	 	 GII%a(())$#####r   )r   r   r   __timeout__r   r   r   r   r   r   r   r     s6        K $ $ ! $ $ $r   r   zNeeds C extensionc                       e Zd Zd ZdS )TestCExtc                 F    |                      t          j        d           d S )Nzgevent._gevent_clocalrl   r   r   r6   s    r   test_c_extensionzTestCExt.test_c_extension  s,    )0	2 	2 	2 	2 	2r   N)r   r   r   r  r   r   r   r   r     s#        2 2 2 2 2r   r   zNeeds pure-pythonc                       e Zd Zd ZdS )TestPurec                 F    |                      t          j        d           d S )Nzgevent.localr   r6   s    r   test_extensionzTestPure.test_extension  s,    )'	) 	) 	) 	) 	)r   N)r   r   r   r  r   r   r   r  r    s#        ) ) ) ) )r   r  __main__)&gevent.testingtestingr   r   r   r   	patch_all	threadingr   r   zoper   collections.abcr	   ImportErrorcollectionsr   r   r   r,   r3   r<   r0   r9   rB   rD   rJ   rU   rZ   TestCaser`   r   skipOnPurePythonr   skipWithCExtensionsr  r   mainr   r   r   <module>r     s   " " " " " "            +6+---                  $''''''' $ $ $########$0 0 0 0 06 0 0 0        	 	 	 	 	& 	 	 	   + + + + +v + + +
    e   	 	 	 	 	g 	 	 	: : : : :% : : :	 	 	 	 	5' 	 	 	    E       5   W? W? W? W? W?i( W? W? W?t$ $ $ $ $+ $ $ $0 /002 2 2 2 2y! 2 2 102 233) ) ) ) )y! ) ) 43) zIN s   < A
	A
