
    YjM                        d dl Z d dl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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 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  G d de          Zd Zd 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          Z G d de          Ze d k    r ej!                     dS dS )!    N)ABCMeta)abstractmethod)greenlet   )TestCase)RUNNING_ON_MANYLINUX)PY313)PY314)WIN)RUNNING_ON_FREETHREAD_BUILD)fails_leakcheck) fails_leakcheck_on_py314_or_less)ignores_leakcheck)ignores_leakcheck_ifc                       e Zd ZdS )	SomeErrorN__name__
__module____qualname__     `/var/www/app.qaans.com/backend/venv/lib/python3.11/site-packages/greenlet/tests/test_greenlet.pyr   r   "   s        Dr   r   c                     	 t          j                    j                                         n2#  |                     t          j                    d                     xY wt          Nr   )r   
getcurrentparentswitchappendsysexc_infor   seens    r   fmainr$   &   sV    $++----CLNN1%&&&
Os	   *- /Ac                 X    d }t          ||           }|                    |           d S )Nc                     | Nr   )excs    r   crasherzsend_exception.<locals>.crasher2   s    	r   r   RawGreenletr   )gr(   r)   g1s       r   send_exceptionr/   /   s6      	WQ	'	'	'BIIcNNNNNr   c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
             Zd Zd Zd Zd Z ej        eoed          d             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"e#d6d            Z$e# e%e&oe'j(        dd          d!k    d"          d#                         Z)d$ Z*e+d%             Z,d& Z-d' Z.d( Z/d) Z0d* Z1d+ Z2 ej        eoed,          d-             Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;dS )7TestGreenletc                 b   g fd}t          |          }                    d           |                                                     d           |                                                     d           |                     t	          t          d                               d S )Nc                                            d           t          j                    j                                                               d           d S )Nr      r   r   r   r   r   lsts   r   fz'TestGreenlet._do_simple_test.<locals>.f=   sC    JJqMMM!!(//111JJqMMMMMr   r            )r,   r   r   assertEquallistrange)selfr8   r-   r7   s      @r   _do_simple_testzTestGreenlet._do_simple_test:   s    	 	 	 	 	 NN

1	




1	




1d588nn-----r   c                 .    |                                   d S r'   )r@   r?   s    r   test_simplezTestGreenlet.test_simpleI   s    r   c                     t                      }|                     t                    5 }|                                 d d d            n# 1 swxY w Y   |                     dt          |j                             d S Nrun)r,   assertRaisesAttributeErrorr   assertInstr	exceptionr?   r-   r(   s      r   (test_switch_no_run_raises_AttributeErrorz5TestGreenlet.test_switch_no_run_raises_AttributeErrorL   s    MM~.. 	#HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	eS//00000s   A

AAc                 
   t                      }|                     t                    5 }|                    t                     d d d            n# 1 swxY w Y   |                     dt          |j                             d S rE   )r,   rG   rH   throwr   rI   rJ   rK   rL   s      r   'test_throw_no_run_raises_AttributeErrorz4TestGreenlet.test_throw_no_run_raises_AttributeErrorS   s    MM~.. 	#GGI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	eS//00000s   AAAc                     t          d           }|                     |           |                     |j        t	          j                               d S )Nr*   )r,   assertIsNotNoneassertIsr   r   r   r?   r-   s     r   test_parent_equals_Nonez$TestGreenlet.test_parent_equals_NoneZ   sK    t$$$Qah 3 5 566666r   c                     t          d           }|                     |           |                     |j                   d S )N)rF   )r,   rR   assertIsNonerF   rT   s     r   test_run_equals_Nonez!TestGreenlet.test_run_equals_None_   sB    D!!!Q!%     r   c                 v   g fd}t          |          }t          |          }|                                 |                     t                    d           |                                 |                     t                    d           |                                 |                     t                    d           |                     |j        d           |                                 |                     t                    d           |                     |j        d           d S )Nc                                            d           t          j                    j                                                              ddg           d S )Nr   )r   r   r   r   r   extendr6   s   r   r8   z)TestGreenlet.test_two_children.<locals>.fg   sL    JJqMMM!!(//111JJ1vr   r   r9   r:   T   )r,   r   r<   lendead)r?   r8   r-   hr7   s       @r   test_two_childrenzTestGreenlet.test_two_childrend   s   	 	 	 	 	 NNNN	


S1%%%	


S1%%%	


S1%%%&&&	


S1%%%&&&&&r   c                    g fdfd}|                      t          j        |          t          sdnd           t	          |          }|                      t          j        |          t          sdnd           |                                 |                      g d           |                      t          j        |          t          sdnd           d S )Nc                                            d           t          j                    j                                         d S )Nbr5   r6   s   r   r8   z3TestGreenlet.test_two_recursive_children.<locals>.f{   s6    JJsOOO!!(//11111r   c                                           d           t                    } |                                                       d           d S )Nac)r   r,   r   )r-   r8   r7   s    r   r-   z3TestGreenlet.test_two_recursive_children.<locals>.g   s=    JJsOOOAAHHJJJJJsOOOOOr   r9   r   )re   rc   rf   )r<   r    getrefcountr
   r,   r   )r?   r-   r8   r7   s     @@r   test_two_recursive_childrenz(TestGreenlet.test_two_recursive_childrenx   s    	2 	2 	2 	2 	2	 	 	 	 	 	
 	++e-BQQCCCNN 	++e-BQQCCC	


ooo...++e-BQQCCCCCr   c                     g  fdfdt          d          D             }|D ]}|                                 |D ]}|                    d                                t	                    t	          |                     d S )Nc                  Z                                                           d           d S NT)r@   r   )r?   successs   r   r8   z$TestGreenlet.test_threads.<locals>.f   s-      """NN4     r   c                 :    g | ]}t          j                   S )target	threadingThread).0ir8   s     r   
<listcomp>z-TestGreenlet.test_threads.<locals>.<listcomp>   s'    ===ayq)))===r   
   )r>   startjoinr<   r]   )r?   thsthr8   rl   s   `  @@r   test_threadszTestGreenlet.test_threads   s    	! 	! 	! 	! 	! 	! >===599=== 	 	BHHJJJJ 	 	BGGBKKKKWs3xx00000r   c                     d d dfd	}t          d          D ]} |             t          j                      d S )Nc                     d }t          j         |          }|                                 |                     |           |                                 d S )Nc                  Z    	 t          j                    j                                         +r'   r   r   r   r   r   r   r   bodyzPTestGreenlet.test_switching_many_threads.<locals>.creates_greenlet.<locals>.body   s*    :'))077999:r   )r   r   r   wait)	greenletswait_to_die_untilr   r-   s       r   creates_greenletzBTestGreenlet.test_switching_many_threads.<locals>.creates_greenlet   s\    : : : !$''AHHJJJQ""$$$$$r   c                    |                                  |                                sYt          |           D ]3}	 |j        s|                                 # t
          j        $ r Y 0w xY w|                                Wd S d S r'   )r   is_setr=   r^   r   r   error)r   wait_to_check_until
quit_afterr-   s       r   switches_from_other_threadzLTestGreenlet.test_switching_many_threads.<locals>.switches_from_other_thread   s    $$&&& '')) i  A v 'HHJJJ#>     !''))     s   AA)(A)   c                 8   g t          j                    t          j                    fdt          |           D             }fdt          |           D             }||z   D ]}|                                 t	                    | k     r't          j        d           t	                    | k     '                                 |D ]}|                    d                                            |D ]}|                    d           d S )Nc                 @    g | ]}t          j        f           S ro   argsrp   )rs   _r   r   greenlets_all_createds     r   ru   zLTestGreenlet.test_switching_many_threads.<locals>.run_it.<locals>.<listcomp>   sO          (8	@U@W X X X  r   c                 B    g | ]}t          j        f           S r   rp   )rs   r   all_threads_deadr   r   r   s     r   ru   zLTestGreenlet.test_switching_many_threads.<locals>.run_it.<locals>.<listcomp>   sN          (B'02G'7'9: : :  r   g-C6?g      ?)	rq   Eventr>   rw   r]   timesleepsetrx   )	thread_countcreators	switcherstr   r   r   r   r   s	       @@@r   run_itz8TestGreenlet.test_switching_many_threads.<locals>.run_it   sm   I$-O$5$5!(00      &&	  H      
 &&  I *  				 i..<//
6""" i..<//!%%'''  s  """  s r      )r   )r>   gccollect)r?   r   r   r   r   s      @@r   test_switching_many_threadsz(TestGreenlet.test_switching_many_threads   s    	% 	% 	%
	 
	 
	 	  	  	  	  	  	  	H r 	 	AFHHHJLLLL	 	r   c                 z   g }t          t                    }t          t                    }|                    |           |                    |           ||_        |                     |g            |                     t          |j                   |                     |t          g           |                                }|                     |d           |                     |t          g           |                    d          }|                     |d           |                     |t          g           d S )Nr      )r,   r$   r   r   r<   rG   r   )r?   r#   r.   g2values        r   test_exceptionzTestGreenlet.test_exception   s   
		$
		$	r""" 	)RY///	{+++		###	{+++		"###	{+++++r   c                     g }t          t                    }|                    |           |                     t          t
          |t                     |                     |t          g           d S r'   )r,   r$   r   rG   KeyErrorr/   r<   )r?   r#   r.   s      r   test_send_exceptionz TestGreenlet.test_send_exception   s[    
		$(NBAAAz*****r   c                    g }t          t                    }t          t                    }|                    |           |                    |           |                     |g            ~t	          j                     |                     |t          j        g           ~t	          j                     |                     |t          j        t          j        g           d S r'   )r,   r$   r   r<   r   r   r   GreenletExit)r?   r#   r.   r   s       r   test_dealloczTestGreenlet.test_dealloc   s    
		$
		$r"""

 56777

 5x7LMNNNNNr   c                 d   d }t          |          }|                                 g t          j        }fd}|t          _        	 ~|t          _        n# |t          _        w xY w|                     t                    d           |                     d         j        t                     d S )Nc                      	 t          j                    j                                         d S # t           j        $ r	 t
          d w xY wr'   )r   r   r   r   r   r   r   r   r   rF   zHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.run  sQ    *#%%,3355555( * * *T)*s	   *. Ac                 2                         |            d S r'   r   )
unraisableunraisable_eventss    r   _capturezMTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>._capture  s    $$Z00000r   r   r   )	r,   r   r    unraisablehookr<   r]   assertIsInstance	exc_valuer   )r?   rF   r-   old_hookr   r   s        @r   .test_dealloc_catches_GreenletExit_throws_otherz;TestGreenlet.test_dealloc_catches_GreenletExit_throws_other  s    	* 	* 	* 	


%	1 	1 	1 	1 	1%	*!)CC)))).//333/2<iHHHHHs   A A$z=Sometimes flaky (getting one GreenletExit in the second list)c                    g g t          j                    t          j                    t          j                    t          j                    fd}t          j        |          }|                                                     d           |                     g            |                     t                    d           d d = t          st          j	                     |                     g            
                                                     d           	 |                     t          j        g           
                                 |                    d           d d = d d = d S # 
                                 |                    d           d d = d d = w xY w)Nc                     t          t                    } |                                                    |            ~ t	          j                                                                          d           t                                                                            d           t                       d S )Nr4   )r,   r$   r   r   r   r   r   r   )r.   /bg_glet_created_running_and_no_longer_ref_in_bgbg_should_be_clearfg_ref_releasedok_to_exit_bg_threadr#   somerefs    r   r8   z1TestGreenlet.test_dealloc_other_thread.<locals>.f4  s    U##BIIdOOONN2JLLL;??AAA  ###MMM""$$$ %%a(((MMMMMr   rn   rv   r   r4   )rq   r   rr   rw   r   r<   r]   r   r   r   r   r   r   rx   )	r?   r8   r   r   r   r   r   r#   r   s	      @@@@@@r   test_dealloc_other_threadz&TestGreenlet.test_dealloc_other_thread$  s    :C/:K:K7#/++&_..(00	 	 	 	 	 	 	 	 	 	 A&&&				7<<R@@@r"""Wq)))AAAJ* 
	 JLLL 	r""""""	TH$9#:;;; $$&&&FF2JJJQQQ


 !$$&&&FF2JJJQQQ
NNNNs   7!F 5Gc                 n     fd}t          |          }|                                }                     ||j        u                                 |           |                                }                     |                                |d                                |j        d            d S )Nc                      t          j        d          }                     | j        d            t	          j                    j                            |            dS )Nr   meaning of life)r    	_getframer<   f_backr   r   r   r   )r8   r?   s    r   f1z#TestGreenlet.test_frame.<locals>.f1c  sP    a  AQXt,,,!!(//222$$r   r   )r,   r   
assertTruegr_frameassertFalser<   )r?   r   r-   framefrom_gs   `    r   
test_framezTestGreenlet.test_frameb  s    	% 	% 	% 	% 	%
 OO

+,,,!2333T*****r   c                    d }t          j        |d          }t          j        |d          }|                                 |                                 |                    d           |                    d           d S )Nc                 T     t           fd          }|                                 d S )Nc                  ,    t          j                   S r'   )r   r   xs   r   <lambda>z>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>t  s    DJqMM r   r+   )r   r-   s   ` r   runnerz,TestGreenlet.test_thread_bug.<locals>.runners  s+    111122AHHJJJJJr   )g?r   )g333333?rv   )rq   rr   rw   rx   )r?   r   t1t2s       r   test_thread_bugzTestGreenlet.test_thread_bugr  sy    	 	 	 V&999V&999









r   c                       fd}t          |                              dd          }                     |d           d S )Nc                 `                         | d                                |d           dS )Nr:   r9   *   )r<   )re   rc   r?   s     r   rF   z,TestGreenlet.test_switch_kwargs.<locals>.run~  s4    Q"""Q"""2r   r:   r9   )re   rc   r   r,   r   r<   )r?   rF   r   s   `  r   test_switch_kwargszTestGreenlet.test_switch_kwargs}  sZ    	 	 	 	 	 ##a1#--Br   c                 (   d }t          |          }|                     ddi|                    d                     |                     dddif|                                           |                     d|                                           d S )Nc                     t          j                    j                            |            t          j                    j                            dd           | | dz  fS )Nr   r9   r4   r   r   s    r   rF   z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.run  sX    !!(//!/444!!(//Q/777a1f9r   r   r4   )r9   )r4   	   )r,   r<   r   )r?   rF   r-   s      r   test_switch_kwargs_to_parentz)TestGreenlet.test_switch_kwargs_to_parent  s    	 	 	 #q188A;;///$a)188::666,,,,,r   c                    i t          j                    t          j                    fd}t          j        |          }|                                                     d           |                     t          j                  5  d                                          d d d            n# 1 swxY w Y   	                                 |
                    d                                            d S )Nc                      t          d           d<                                                         d           d S )Nc                      d S r'   r   r   r   r   r   zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>      D r   r-   rv   r,   r   r   created_eventdata
done_events   r   rF   z7TestGreenlet.test_switch_to_another_thread.<locals>.run  @    #LL11DIOOBr   rn   rv   r-   )rq   r   rr   rw   r   rG   r   r   r   r   rx   clear)r?   rF   threadr   r   r   s      @@@r   test_switch_to_another_threadz*TestGreenlet.test_switch_to_another_thread  s.   !))_&&
	  	  	  	  	  	  	  !---2x~.. 	 	I	 	 	 	 	 	 	 	 	 	 	 	 	 	 	B

s   B77B;>B;c                 b      fd} fdt          |                                           d S )Nc                      	 t          d          #  t          j                    } t                                                                         | t          j                               Y d S xY w)Nfun)
ValueErrorr    r!   r,   r   r<   )r!   r_   r?   s    r   r8   z&TestGreenlet.test_exc_state.<locals>.f  sg    ; ''';<>>A%%'''  3<>>::::::s
    AA2c                  V                          t          j                    d           d S )N)NNN)r<   r    r!   rB   s   r   r_   z&TestGreenlet.test_exc_state.<locals>.h  s&    S\^^-?@@@@@r   r+   )r?   r8   r_   s   ` @r   test_exc_statezTestGreenlet.test_exc_state  s`    	; 	; 	; 	; 	; 	;	A 	A 	A 	A 	A 	Ar   c                    d }d }d }t          |          }|                     |j        i            |                                 |                     |j        d           |                     |j        ddi           |j        |_        |                     |j        ddi           |                     t          ||           |                     t          ||d           d S )Nc                  6    dt          j                    _        d S Nr   )r   r   testr   r   r   r8   z*TestGreenlet.test_instance_dict.<locals>.f  s    )+H!!&&&r   c                 
    | ` d S r'   __dict__)r-   s    r   deldictz0TestGreenlet.test_instance_dict.<locals>.deldict  s    


r   c                     || _         d S r'   r   )r-   r   s     r   setdictz0TestGreenlet.test_instance_dict.<locals>.setdict  s    AJJJr   r   r   )r,   r<   r   r   r   rG   	TypeError)r?   r8   r   r   r-   s        r   test_instance_dictzTestGreenlet.test_instance_dict  s    	, 	, 	,	 	 		 	 	NNR(((	


$$$fb\222Z
fb\222)Wa000)Wa44444r   c                     g fd}t          |          }|                                 |                     dg           d S )Nc                  p                          t          t          j                    d                     d S rE   )r   hasattrr   r   )has_runs   r   funcz;TestGreenlet.test_running_greenlet_has_no_run.<locals>.func  s9    NN+--u55    r   Fr   )r?   r  r-   r  s      @r    test_running_greenlet_has_no_runz-TestGreenlet.test_running_greenlet_has_no_run  s[    	 	 	 	 	
 	


5'*****r   c                     dd l }|                     t          |j         t                                 |                     t          |j        t                                 d S r   )copyrG   r   r,   deepcopy)r?   r  s     r   test_deepcopyzTestGreenlet.test_deepcopy  sM    )TY>>>)T]KMMBBBBBr   c                 f   t          d           t          j                    g fd}t          |          }|                                 ~|                                |                     d                    |                     d         j                   d d = d d d S )Nc                      d S r'   r   r   r   r   r   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>  s    $ r   c                  (   	                                   d S # t          j        $ ri                     t          j                    j                                       t          j                                                                  Y d S w xY wr'   )r   r   r   r   r   r   )hubmainresults   r   workerz9TestGreenlet.test_parent_restored_on_kill.<locals>.worker  s    (   h133:;;;h133444

	s    A4BBr*   r   r   )r,   r   r   r   r   rS   r   )r?   r  r-   r  r  r  s      @@@r   test_parent_restored_on_killz)TestGreenlet.test_parent_restored_on_kill  s    ,,''"$$	 	 	 	 	 	 	 s+++	


fQi&&&fQi&,,, 111Ir   c                     t                      }t          d |          }|                     t                    5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                      d S r'   r   r   r   r   r   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>       r   r*   )r,   rG   rH   r   )r?   r.   r   s      r   test_parent_return_failurez'TestGreenlet.test_parent_return_failure  s    ]]b111~.. 	 	IIKKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA!$A!c                      G d dt                     } |d           }|                     t          |j        t                                 d S )Nc                       e Zd Zd ZdS )>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletc                 J    	 t           #  Y nxY wt          j        | |          S r'   )	Exceptionr,   __getattribute__r?   names     r   r  zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__  s-    #OD"3D$???s   	 Nr   r   r   r  r   r   r   
mygreenletr    s(        @ @ @ @ @r   r  c                      d S r'   r   r   r   r   r   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>      t r   )r,   rG   r   rO   )r?   r  r-   s      r   test_throw_exception_not_lostz*TestGreenlet.test_throw_exception_not_lost  sk    	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ J||$$)QWikk:::::r   Fc                    g d fd}t          j        |          }|                                 |                    d           ~r|                                  |                     t          j                  5 }d                             t                     d d d            n# 1 swxY w Y   s2t          |j                  }|                     |dk    pd|v            n(|                     t          |j                  d           t          d         j        d          rQ|                     t                     5  d         j                                         d d d            n# 1 swxY w Y   sEt          d         j        j        d          r$d         j        j                                         n |                     d         j                   ~d d d = d	| _        d S )
Nc                  Z    t          j                    j                                         d S r'   r   r   r   r   r  zGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.worker  &    !!(//11111r   c                      t                    } |                                                      |            r)|                                  t          j                     d S d S r'   )r,   r   r   r   r   )r-   r  wait_for_cleanupr  s    r   creatorzHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creator  sc    F##AHHJJJMM! &


#%%%%%& &r   rn   rv   r   Bcannot switch to a different thread (which happens to have exited)zCannot switchr   T)rq   rr   rw   rx   wait_for_pending_cleanupsrG   r   r   rO   r   rJ   rK   r   r<   r  r   RuntimeErrorr   f_localsrW   expect_greenlet_leak)r?   r&  r'  r   r(   sr  r  s    `    @@r   *_do_test_throw_to_dead_thread_doesnt_crashz7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crash   s   	2 	2 	2	& 	& 	& 	& 	& 	& 	& G,,,					r


  	-**,,,x~.. 	'#1IOOI&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'   
	CM""AOOYY ("a'   
 CM""T  
 6!9%w// 	+""<00 + +q	"((***+ + + + + + + + + + + + + + +   	2vay)2G<< 4q	"+11333fQi0111111I %)!!!s$   !B11B58B5 E99E= E=Nr9   )r4   rv   z;does not leaks on Windows 3.10, but does on other platformsc                 .    |                                   d S r'   r.  rB   s    r   &test_throw_to_dead_thread_doesnt_crashz3TestGreenlet.test_throw_to_dead_thread_doesnt_crash:  s     	7799999r   c                 0    |                      d           d S rk   r0  rB   s    r   +test_throw_to_dead_thread_doesnt_crash_waitz8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_waitB  s    77=====r   c                      G d dt                     } |            }|                     |                    d          d           d| _        d S )Nc                        e Zd Zd Zd Zd ZdS )7TestGreenlet.test_recursive_startup.<locals>.convolutedc                 <    t          j        |            d| _        d S r   )r,   __init__countrB   s    r   r8  z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__H  s    $T***


r   c                     |dk    r'| j         dk    rd| _         |                     d           t          j        | |          S )NrF   r   r   +   )r9  r   r,   r  r  s     r   r  zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__K  s>    5==TZ1__!"DJKKOOO"3D$???r   c                 :    	 | j                             |           r'   r   r   )r?   r   s     r   rF   z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runP  s"    .K&&u---.r   N)r   r   r   r8  r  rF   r   r   r   
convolutedr6  G  sD          @ @ @
. . . . .r   r>  r   r;  T)r,   r<   r   r,  )r?   r>  r-   s      r   test_recursive_startupz#TestGreenlet.test_recursive_startupE  si    	. 	. 	. 	. 	. 	. 	. 	. JLL"r***
 %)!!!r   c                    t          j                                                     t          j                                                      G fddt                    }d }fd}t	          j                    }t          |          g |            d         _        d                                          t          j	        |          }|
                                                                                                   |                     t	          j                    |           |                    d           d S )Nc                       e Zd Z fdZdS );TestGreenlet.test_threaded_updatecurrent.<locals>.finalizedc                 X                                                                       d S r'   releaseacquire)r?   lock1lock2s    r   __del__zCTestGreenlet.test_threaded_updatecurrent.<locals>.finalized.__del__c  s#     r   Nr   r   r   rI  rG  rH  s   r   	finalizedrB  b  s3                       r   rL  c                  Z    t          j                    j                                         d S r'   r   r   r   r   deallocatorz=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorj  r$  r   c                                                        t          j                      d=                                                                    t          j                                                      d S r   rF  r   r   rE  )r-   rG  rH  s   r   fthreadz9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreadl  s`    MMOOO!!!!MMOOOMMOOO!!!MMOOOOOr   r   rn   rv   )rq   LockrF  objectr   r   r,   bombr   rr   rw   rE  r<   rx   )	r?   rL  rN  rQ  r  r   r-   rG  rH  s	         @@@r   test_threaded_updatecurrentz(TestGreenlet.test_threaded_updatecurrent[  sT       	  	  	  	  	  	  	  	  	  	  	 	2 	2 	2	 	 	 	 	 	 	 "$$%%&IKK!		!G,,,				 	,..555	r




r   c                 "   g fdd t                    gd                                          t          d                                                   }|                                |                     |d           d S )Nc                     t          j                    j                                        } d= t          j                    j        _        	 t          j                    j                            |                                t          j                               d S #                     t          j                               w xY wr   )r   r   r   r   r   )r   	initiatorr#   r  s    r   r  z>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.worker  s    '))07799Eq	'244;I3#%%,33E:::H/1122222H/112222s   +B   (Cc                      dS r   r   r   r   r   rX  zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiator      2r   r   r   )r,   r   r   r<   )r?   r   rX  r#   r  s     @@@r   !test_dealloc_switch_args_not_lostz.TestGreenlet.test_dealloc_switch_args_not_lost  s    	3 	3 	3 	3 	3 	3 	3	 	 	 f%%&q		6!955	  ""#####r   c                     d  G d dt                     } |            t          d          fd}t          |          }|                     |                                           d S )Nc                      | |i | d S r'   r   )r  re   ks      r   _applyz0TestGreenlet.test_tuple_subclass.<locals>._apply  s    D!MqMMMMMr   c                       e Zd Zd ZdS )1TestGreenlet.test_tuple_subclass.<locals>.mytuplec                     t          j                                                     t                              |           S r'   )r   r   r   tuple__len__rB   s    r   rd  z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__  s/    #%%,,...}}T***r   N)r   r   r   rd  r   r   r   mytuplera    s#        + + + + +r   re  r   )re   c                  X      t          j                    j        j                   d S r'   r   )r_  r   kwargss   r   switchapplyz5TestGreenlet.test_tuple_subclass.<locals>.switchapply  s,    F8&((/6fEEEEEr   )rc  dictr,   r<   r   )r?   re  rh  r-   r_  r   rg  s       @@@r   test_tuple_subclassz TestGreenlet.test_tuple_subclass  s    	 	 		+ 	+ 	+ 	+ 	+e 	+ 	+ 	+ wyy	F 	F 	F 	F 	F 	F 	F$$V,,,,,r   c                     t          dt          fdt          d           i          } G d d|          } G d d|          } |             |                     t          |           d S )NAbstractSubclassrF   c                     d S r'   r   rB   s    r   r   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>  s     r   c                       e Zd ZdS ):TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   BadSubclassro            Dr   rp  c                       e Zd Zd ZdS );TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                     d S r'   r   rB   s    r   rF   z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.run  s    r   N)r   r   r   rF   r   r   r   GoodSubclassrs    s#            r   ru  )r   r,   r   rG   r   )r?   rl  rp  ru  s       r   test_abstract_subclassesz%TestGreenlet.test_abstract_subclasses  s    "NN#4#45568 8
	 	 	 	 	* 	 	 		 	 	 	 	+ 	 	 	 	)[11111r   c                      t          j                    sd S t          j                    d         dk     rd S  fd}t          d          D ]} |            r d S d S )Nr   2   c                  L  	
 t          j                    

                                 t          j                                                     dg
fd} t          j        |           }|                                  G 
fddt
                    	 G 	fddt
                    }g }t          dz            }t          j                    } |            }|D ]Q}d }d	         r|	                    d
            dS t                      }d	         r nH|                    |           Rt          j                     d	         r|	                    d
           dS                     |j        |           |D ]}                    |j        |           dS )NFc                  ~                                       t          j                                                      d S r'   rP  rK  s   r   another_threadzWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_thread  s0    #%%%r   rn   c                       e Zd Z fdZdS )TTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callbackc                 b                                                                       dd<   d S )NTr   rD  )r?   rG  rH  recycleds    r   rI  z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__  s*    MMOOOMMOOO"&HQKKKr   NrJ  )rG  rH  r  s   r   gc_callbackr}    s8        ' ' ' ' ' ' ' ' 'r   r  c                       e Zd Z fdZdS )PTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                 4    | | _                      | _        d S r'   )cyclecallback)r?   r  s    r   r8  zYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__  s    !%DJ$/KMMDMMMr   N)r   r   r   r8  )r  s   r   garbager    s.        2 2 2 2 2 2 2r   r  r9   r   rv   T)rq   rR  rF  rr   rw   rS  r>   r   r   rx   r,   r   r   r   r<   r   )r{  r   r  lr   currentr-   r   lastr  rG  rH  r  Nr?   s            @@@@r   attemptz?TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt  s   N$$EMMOOON$$EMMOOOwH             777AGGIII' ' ' ' ' ' ' ' 'f ' ' '
2 2 2 2 2 2 2& 2 2 2 Aac

A)++G		A  A; !FF2JJJ 55"}}A; E 
A; FF2JJJuT['222 4 4  733334r   r;   )r   	isenabledget_thresholdr>   )r?   r  r   r  s   `  @r   !test_implicit_parent_with_threadsz.TestGreenlet.test_implicit_parent_with_threads  s    |~~ 	Fq!r66F,	 ,	 ,	 ,	 ,	 ,	Z q 	 	Awyy 	 	r   c                     ddl m ddl m  G d dt                    }t	          j        |          }g  _         fd}t          d          D ]} ||                                             `t          r* 
                    t	          j        |          |           d S                      t	          j        |          |           d S )Nr   r   )r   c                       e Zd ZdS )TTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   Greenletr    rq  r   r  c                      	              j                                          d S #  $ r& j                                                    Y d S w xY wr'   )r   r   gletsr   )r   r   r?   s   r   greenlet_mainzYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_main  si    0
#**,,,,, 0 0 0
!!**,,//////0s   !& 'AArv   )r   r   r   r,   r    rg   r  r>   r   r   assertGreaterEqualr<   )r?   r  initial_refsr  r   r   r   s   `    @@r   5test_issue_245_reference_counting_subclass_no_threadszBTestGreenlet.test_issue_245_reference_counting_subclass_no_threads  s$    	('''''))))))	 	 	 	 	{ 	 	 	 x00 
	0 	0 	0 	0 	0 	0 	0 r 	- 	-AH]##**,,,,J& 	F ##COH$=$=|LLLLLS_X66EEEEEr   z;The manylinux images appear to hang on this test on 3.13rc2c                 Z   ddl m} ddl m} ddlm  G d dt
                    g  |            fdfd}t          j                  }g }|d	z   }t          rd
}t          |          D ]C} |            } |||f          }	|
                    |           |	                                 D|D ]}
|
                    d           d d =                                  |                                  |                     t          j                  |           d S )Nr   )rr   )r   r  c                       e Zd ZdS )STestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   
MyGreenletr  ?  rq  r   r  c                  J                  j                                          d S r'   r=  r  s   r   r  zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_mainE  s$    JLL&&(((((r   c                                }                     |           |                                 ~|                                                      d                         d S )Nrv   )r   r   r   r   )greenlet_running_eventminer  r   r  r  ref_cleareds     r   thread_mainzTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_mainH  sm    :m,,DLLKKMMM"&&((( R    JLLLLLr   -   rx  r   rv   )rq   rr   r   r   r   r,   r    rg   r   r>   r   rw   r   r   r)  r<   )r?   rr   r   r  r  thread_ready_eventsr   r   eventr   r   r  r   r  r  r  s              @@@@@r   2test_issue_245_reference_counting_subclass_threadsz?TestGreenlet.test_issue_245_reference_counting_subclass_threads1  s    	%$$$$$######''''''	 	 	 	 	 	 	 	 egg	) 	) 	) 	) 	)	 	 	 	 	 	 	 	 	8 z22 #b(& 	 L|$$ 	 	AEGGEV;eX>>>F&&u---LLNNNN . 	  	 JOOB !!!H 	&&(((44lCCCCCr   c                     d }t          |          }d }t          ||          }|                     t                    5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                      dS )N   r   r   r   r   no_argsz\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_args  rZ  r   c                      dS r   r   r   r   r   leafzYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf  rZ  r   )r,   rG   r   r   )r?   r  parent_never_startedr  childs        r   >test_falling_off_end_switches_to_unstarted_parent_raises_errorzKTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error~  s    	 	 	  +733	 	 	 D"677 y)) 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s    A""A&)A&c                     d }t          |          }d }t          ||          }|                                }|                     |d           d S )Nc                 
    | dfS N   r   r   s    r   one_argzUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_arg  s    r7Nr   c                      dS r   r   r   r   r   r  zRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf  rZ  r   )r   r  r   )r?   r  r  r  r  r  s         r   7test_falling_off_end_switches_to_unstarted_parent_workszDTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works  sk    	 	 	  +733	 	 	 D"677*****r   c                     G d dt                     } |            }g t          fd|          }|                     t                    5  |                                 d d d            n# 1 swxY w Y   |                     dg           |                     t                    5  |                                 d d d            n# 1 swxY w Y   |                     dg           d S )Nc                       e Zd Zd ZdS )XTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentc                      |dk    rt           d S rE   )r   r  s     r   r  ziTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parent.__getattribute__  s    5==#O !=r   Nr  r   r   r   Parentr    s#        $ $ $ $ $r   r  c                  .                          d          S r   r   r"   s   r   r   zZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>      DKKOO r   r   )r,   rG   r   r   r<   )r?   r  r  r  r#   s       @r   ;test_switch_to_dead_greenlet_with_unstarted_perverse_parentzHTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent  s   	$ 	$ 	$ 	$ 	$[ 	$ 	$ 	$  &vxx33335IJJ y)) 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	t$$$y)) 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	t$$$$$s$   A//A36A3+CCCc                 :   g t          fd          }t          fd          }|                                 |                     dg           ||_        |                                }|                     |           |                     ddg           d S )Nc                  .                          d          S r  r   r"   s   r   r   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>  s    4;;r?? r   c                  .                          d          S r   r   r"   s   r   r   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>  r  r   r   r  )r,   r   r<   r   rW   )r?   r  r  r  r#   s       @r   %test_switch_to_dead_greenlet_reparentz2TestGreenlet.test_switch_to_dead_greenlet_reparent  s    *+B+B+B+BCC333344t$$$+&!!!Bx(((((r   c                 *   t          j                    fd}fdt          |          }|                                 t          d           }|                                 |                     |j                   |                     |j        j        j        d           |                     |j        j	                   |                     |j        j	        j        j        d           | 
                    |j        j	        j	                   d S )Nc                                     d S r'   r   inners   r   outerzHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.outer  s    EGGGGGr   c                  V                          t          j        d                     d S r   )r   r    r   r  s   r   r  zHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.inner  s%    KKa(()))))r   c                      d S r'   r   r   r   r   r   zKTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.<lambda>       r   r  r  )r   r   r,   r   rR   r   r<   f_codeco_namer   rW   )r?   r  r  	unrelatedr  r  s       @@r   ,test_can_access_f_back_of_suspended_greenletz9TestGreenlet.test_can_access_f_back_of_suspended_greenlet  s    "$$	 	 	 	 		* 	* 	* 	* 	* %  

  --	 	S\***,4g>>>S\0111,3;WEEE#,-455555r   c                    ddl m ddlm fdt	                    }|                    d           |j        }t          d          D ]*}|                     |j	        d         |           |j
        }+|                     |j	        d         d           |                     |j
                   |                     |                    d          d	           d S )
Nr   )partialr   )_test_extension_cppc                     | dk    r%|                       | dz
                      z  S t          j                    j                                        S )Nr   r   )	test_callr   r   r   r   )vr  r  recurses    r   r  z@TestGreenlet.test_get_stack_with_nested_c_calls.<locals>.recurse  sT    1uu.88!a%9P9PQQQQ&((/66888r   r;   r  rv   i  )	functoolsr   r  r,   r   r   r>   r<   r+  r   rW   )r?   grr   rt   r  r  r  s       @@@r   "test_get_stack_with_nested_c_callsz/TestGreenlet.test_get_stack_with_nested_c_calls  s   %%%%%%))))))	9 	9 	9 	9 	9 	9 	9
 !!
		!q 	! 	!AU^C0!444LEE,a000%,'''2-----r   c                 F   t          j                    fd}fdt          |          }|                                }t          d           }|                                 |                     |j        j        d           |                     |j                   d S )Nc                  B      t          j        d                     d S r   )r    r   r  s   r   r  z6TestGreenlet.test_frames_always_exposed.<locals>.outer  s#    E#-""#####r   c                 2                         |            d S r'   r   )r   r  s    r   r  z6TestGreenlet.test_frames_always_exposed.<locals>.inner  s    KKr   c                      d S r'   r   r   r   r   r   z9TestGreenlet.test_frames_always_exposed.<locals>.<lambda>  r  r   r  )	r   r   r,   r   r<   r  r  rW   r   )r?   r  r  r   r  r  r  s        @@r   test_frames_always_exposedz'TestGreenlet.test_frames_always_exposed  s     "$$	$ 	$ 	$ 	$ 	$	 	 	 	 	 		  --	-w777%,'''''r   c                     fdfdfd}fd}t          j         |          t          j         |                                           d S )Nc                 0                                      | S r'   r  )r   r   s    r   k1zITestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.k1      IIKKKHr   c                 0                                      | S r'   r  )r   r.   s    r   k2zITestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.k2  r  r   c                  T    t          dg                                             d S )Nr   key)sortedr   )r   r  s   r   g1_bodyzNTestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.g1_body  s)    A3BIIKKKKKr   c                      t          dg           t          t          dd          5 } |                                  d d d            d S # 1 swxY w Y   d S )Nr   r  rtzutf-8)encoding)r  open__file__read)r8   r  s    r   g2_bodyzNTestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.g2_body"  s    A3B hw777 1                 s   AAA)r   r   )r?   r  r  r.   r   r  r  s      @@@@r   0test_switching_holding_critical_section_no_crashz=TestGreenlet.test_switching_holding_critical_section_no_crash  s    	 	 	 	 	
	 	 	 	 	
	 	 	 	 	 	
	 	 	 	 	 w''w''
		r   )F)<r   r   r   r@   rC   rM   rP   rU   rX   r`   rh   r{   r   r   r   r   r   r   unittestskipIfr	   r   r   r   r   r   r   r   r   r   r  r  r  r  r!  r   r.  r   r   r    version_infor1  r3  r   r?  rU  r[  rj  rv  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r1   r1   8   s       . . .  1 1 11 1 17 7 7
! ! !
' ' '(D D D,1 1 1 = = =~, , ,8+ + +O O OI I I0 X_&&G 5 5 5n+ + + 	 	 	     - - -  &     5 5 5"	+ 	+ 	+C C C
  6  	; 	; 	; &7) 7) 7) &%7)r &/ !$/E : :	  &%
:> > > ) ) _)*- - -^$ $ $4- - -82 2 2 5 5 5n(F (F (FT X_&&E DD DD DDL  + + +% % %*) ) )6 6 6:. . .&( ( (0& & & & &r   r1   c                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )TestGreenletSetParentErrorsc                 R   i t          j                    t          j                    fd}d }t          j        |          }|                                                     d           t          |          }|                                 |                     t                    5 }d         |_	        d d d            n# 1 swxY w Y   
                                 |                    d           |                     t          |j                  d           d S )Nc                      t          d           d<                                                         d           d S )Nc                      d S r'   r   r   r   r   r   zQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>6  r   r   r-   rv   r   r   s   r   rF   z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.run5  r   r   c                  Z    t          j                    j                                         d S r'   r   r   r   r   blankzATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blank:  r$  r   rn   rv   r-   z&parent cannot be on a different thread)rq   r   rr   rw   r   r,   r   rG   r   r   r   rx   r<   rJ   rK   )	r?   rF   r  r   r-   r(   r   r   r   s	         @@@r   test_threaded_reparentz2TestGreenletSetParentErrors.test_threaded_reparent0  s]   !))_&&
	  	  	  	  	  	  	 
	2 	2 	2 !---2	


z** 	!cCyAH	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!BS]++-UVVVVVs   1CCCc                     g fd}t          j        |          }|                                 |                    d           |                     | j        dz               G fddt                    } |d           }|                     t          j	                  5 }|
                                 d d d            n# 1 swxY w Y   |                     t          |j                  d	           d d = d S )
Nc                  z    t          d           }                     |            |                                  d S )Nc                      d S r'   r   r   r   r   r   zYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>L      D r   )r,   r   r   )r-   anothers    r   r  zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.workerK  s5    LL))ANN1HHJJJJJr   rn   rv   r   )initial_main_greenletsc                       e Zd Z fdZdS )KTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedc                 T    |dk    rd         | _         t          j        | |          S NrF   r   r   r,   r  r?   r  r  s     r   r  z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__g  *    5==")!*DK"3D$???r   Nr  r  s   r   r>  r  f  5        @ @ @ @ @ @ @r   r>  c                      d S r'   r   r   r   r   r   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>k  r   r   r(  )rq   rr   rw   rx   r)  main_greenlets_before_testr,   rG   r   r   r   r<   rJ   rK   )r?   r  r   r>  r-   r(   r  s         @r   test_unexpected_reparentingz7TestGreenletSetParentErrors.test_unexpected_reparentingI  ss   	 	 	 	 	 F+++					r


& 	&&d>]`a>a&bbb	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@
 J||$$x~.. 	#HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++]	_ 	_ 	_AAAJJJs   %CC
C
c                 r   g t          j                    t          j                    fd} G fddt                    }t          j        |          }|                                                     d           	  |d           }|                     t          j                  5 }|	                                 d d d            n# 1 swxY w Y   | 
                    dt          |j                             | 
                    dt          |j                             | 
                    d	t          |j                                                              |                    d           d d = d S #                                  |                    d           d d = w xY w)
Nc                      t          d           }                     |            |                                                                                       d           d S )Nc                      d S r'   r   r   r   r   r   zhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>y  r  r   rv   )r,   r   r   r   r   )r-   r  keep_main_aliveswitched_to_greenlets    r   r  zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerx  s]    LL))ANN1HHJJJ $$&&&  $$$$$r   c                       e Zd Z fdZdS )ZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedc                 T    |dk    rd         | _         t          j        | |          S r	  r
  r  s     r   r  zkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__  r  r   Nr  r  s   r   r>  r  ~  r  r   r>  rn   rv   c                      d S r'   r   r   r   r   r   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>      4 r   z#Cannot switch to a different threadExpectedCurrent)rq   r   r,   rr   rw   r   rG   r   r   r   rI   rJ   rK   r   rx   )	r?   r  r>  r   r-   r(   r  r  r  s	         @@@r   *test_unexpected_reparenting_thread_runningzFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_runningr  s    (00#/++	% 	% 	% 	% 	% 	% 	%	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ F+++				!!"%%%	
<<((A""8>22 c


              MM?S]ASASTTTMM*c#-&8&8999MM)S%7%7888!!!FF2JJJ


 !!!FF2JJJ
NNNNs1   +F 2CF CF CA;F 0F6c                 6   t          d           }|                     |j        t          j                               |                     t                    5 }|`d d d            n# 1 swxY w Y   |                     t          |j	                  d           d S )Nc                      d S r'   r   r   r   r   r   zGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>      T r   can't delete attribute)
r,   rS   r   r   r   rG   rH   r<   rJ   rK   )r?   r  r(   s      r   test_cannot_delete_parentz5TestGreenletSetParentErrors.test_cannot_delete_parent  s    \\**fmX%8%:%:;;;~.. 	#	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++-EFFFFFs   A&&A*-A*c                     |                      t                    5 }t          j                    `d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nr"  rG   rH   r   r   r   r<   rJ   rK   r?   r(   s     r   !test_cannot_delete_parent_of_mainz=TestGreenletSetParentErrors.test_cannot_delete_parent_of_main  s    ~.. 	-##%%,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-S]++-EFFFFFs   ;??c                 \    |                      t          j                    j                   d S r'   )rW   r   r   r   rB   s    r   !test_main_greenlet_parent_is_nonez=TestGreenletSetParentErrors.test_main_greenlet_parent_is_none  s(    (-//677777r   c                     d } fd}t          |          }                     |            ||           |                                                      |            ||           |                                 d S )Nc                  Z    t          j                    j                                         d S r'   r   r   r   r   bgzCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bg  s&    !!(//11111r   c                    d ddfD ]x}                     t                    5 }|| _        d d d            n# 1 swxY w Y                       t	          |j                  dt          |          j        z              yd S )Nr   42z4GreenletChecker: Expected any type of greenlet, not )rG   r   r   r<   rJ   rK   typer   )gletpr(   r?   s      r   checkzFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check  s    1dD( _ _&&y11 $S"#DK$ $ $ $ $ $ $ $ $ $ $ $ $ $ $   &&JTRSWWM]]_ _ _ _	_ _s   8<	<	)r,   r   r   r   )r?   r,  r2  r-   s   `   r   test_set_parent_wrong_typesz7TestGreenletSetParentErrors.test_set_parent_wrong_types  s    	2 	2 	2	_ 	_ 	_ 	_ 	_ OOa 	



a 	





r   c                     t          d           }|                     t                    5 }||_        d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nc                      d S r'   r   r   r   r   r   z@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>  r  r   cyclic parent chain)r,   rG   r   r   r<   rJ   rK   )r?   r0  r(   s      r   test_trivial_cyclez.TestGreenletSetParentErrors.test_trivial_cycle  s    <<((z** 	cDK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++-BCCCCCs   ?AAc                    |                      t                    5 }t          j                    t          j                    _        d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nz(cannot set the parent of a main greenletr%  r&  s     r   test_trivial_cycle_mainz3TestGreenletSetParentErrors.test_trivial_cycle_main  s    ~.. 	A#+3+>+@+@H!!(	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	AS]++-WXXXXXs   *AAAc                 D   t          d           }t          d           }t          d           }||_        ||_        |                     t                    5 }||_        d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nc                      d S r'   r   r   r   r   r   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>  r  r   c                      d S r'   r   r   r   r   r   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>  r  r   c                      d S r'   r   r   r   r   r   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>  r  r   r6  )r,   r   rG   r   r<   rJ   rK   )r?   r.   r   g3r(   s        r   test_deeper_cyclez-TestGreenletSetParentErrors.test_deeper_cycle  s    &&&&&&		z** 	cBI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	S]++-BCCCCCs   A--A14A1N)r   r   r   r  r  r  r#  r'  r)  r3  r7  r9  r?  r   r   r   r  r  /  s        W W W2' ' 'R" " "HG G GG G G8 8 8  8D D DY Y Y	D 	D 	D 	D 	Dr   r  c                   R    e Zd Z eed          sd
dZd Zd Zd Zd Z	d Z
d	 ZdS )TestReprassertEndsWithNc                 ^    |                      |                    |          |||f           d S r'   )r   endswith)r?   r-  suffixmsgs       r   rB  zTestRepr.assertEndsWith  s/    OOAJJv..FC0@AAAAAr   c                 r    t          t          j                              }|                     |d           d S )N current active started main>)reprr   r   rB  r?   rs     r   test_main_while_runningz TestRepr.test_main_while_running  s5    $&&''A>?????r   c                     t          j                    fd}t          |          }|                                }|                     |d           d S )Nc                  "    t                     S r'   )rI  r  s   r   rF   z-TestRepr.test_main_in_background.<locals>.run  s    ::r    suspended active started main>)r   r   r,   r   rB  )r?   rF   r-   rK  r  s       @r   test_main_in_backgroundz TestRepr.test_main_in_background  sc    "$$	 	 	 	 	 HHJJA@AAAAAr   c                 h    t          t                                }|                     |d           d S )Nz	 pending>)rI  r,   rB  rJ  s     r   test_initialzTestRepr.test_initial  s/    A{+++++r   c                 6   t          j                     G fddt          j                  } |            }|                                 |                    d           |                     |j        d           |                     |j        d           t          d          D ]}t          j        d           t          d          D ]K}|                     |j        j                   t          |j                  }|                     |d           Ld S )	Nc                   &    e Zd ZdxZZdZ fdZdS )/TestRepr.test_main_from_other_thread.<locals>.TNc                     t                    | _        t          j                    | _        t          | j                  | _        d S r'   )rI  original_mainr   r   	main_gletr  )r?   r  s    r   rF   z3TestRepr.test_main_from_other_thread.<locals>.T.run  s9    %)$ZZ"!)!4!6!6#'#7#7   r   )r   r   r   rW  r  rX  rF   r  s   r   TrU    s=        *..MKI8 8 8 8 8 8 8r   rY  rv   rO  rH  r4   gMbP?z (thread exited) dead>)r   r   rq   rr   rw   rx   rB  rW  r  r>   r   r   r   rX  r^   rI  )r?   rY  r   r   rK  r  s        @r   test_main_from_other_threadz$TestRepr.test_main_from_other_thread  s.   "$$	8 	8 	8 	8 	8 	8 	8	  	8 	8 	8 ACC					r


AO-NOOOAM+JKKK q 	 	AJu q 	= 	=AOOAK,---Q[!!A#;<<<<	= 	=r   c                 f   t          d           }|                                 |                     t          |          d           |                     dt          |                     |                     dt          |                     |                     dt          |                     d S )Nc                      d S r'   r   r   r   r   r   z$TestRepr.test_dead.<locals>.<lambda>  s     r   z dead>	suspendedstartedactive)r,   r   rB  rI  assertNotInrT   s     r   	test_deadzTestRepr.test_dead  s    %%	


DGGX...d1gg...DGG,,,477+++++r   c                     t          d           }t          d           }t          j                    }|||fD ]:}|                     |t                     |                     |t                     ;d S )Nc                      d S r'   r   r   r   r   r   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>"  r!  r   c                      d S r'   r   r   r   r   r   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>#  r   r   )r,   r   r   r   rJ   )r?   g_deadg_not_startedg_curr-   s        r   #test_formatting_produces_native_strz,TestRepr.test_formatting_produces_native_str  s     \\**#LL11#%%- 		 		A!!   !!   		 		r   r'   )r   r   r   r  r   rB  rL  rP  rR  rZ  ra  rh  r   r   r   rA  rA    s        78-.. B	B 	B 	B 	B@ @ @B B B, , ,!= != !=F, , ,    r   rA  c                   &    e Zd Zd Zd Zd Zd ZdS )TestMainGreenletc                     dt          t          j                              v sJ t          t          j                              }dt          |          vsJ |S )Nr  )rI  r   r   r/  )r?   r   s     r   _check_current_is_mainz'TestMainGreenlet._check_current_is_main6  sV    h133444444$&&''T!WW$$$$r   c                 |    |                                  }t          d|fi           }|                     |           d S )Nsubclass)rl  r/  rR   )r?   	main_typern  s      r   )test_main_greenlet_type_can_be_subclassedz:TestMainGreenlet.test_main_greenlet_type_can_be_subclassed>  s@    //11	
YL"55X&&&&&r   c                     |                                   |                     t          j                    t                     d S r'   )rl  r   r   r   r,   rB   s    r   test_main_greenlet_is_greenletz/TestMainGreenlet.test_main_greenlet_is_greenletC  s9    ##%%%h133[AAAAAr   c                       fd}t          j         |                                                                t                    5  t	          d           d d d            d S # 1 swxY w Y   d S )Nc                                           t                    5  t           d           d d d            d S # 1 swxY w Y   d S rE   )rG   rH   getattr)r-   r?   s   r   do_itz1TestMainGreenlet.test_greenlet_run.<locals>.do_itH  s    "">22 " "5!!!" " " " " " " " " " " " " " " " " "s   :>>rF   )r   r   rG   rH   ru  )r?   rv  r-   s   ` @r   test_greenlet_runz"TestMainGreenlet.test_greenlet_runG  s    	" 	" 	" 	" 	" 	" e$$	


~.. 	 	Au	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A))A-0A-N)r   r   r   rl  rp  rr  rw  r   r   r   rj  rj  2  sS          ' ' '
B B B    r   rj  c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestBrokenGreenletsc                     d }t           j                            |          }d|_        |                     t
          d          5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                       t          d          )NzNever get here)AssertionErrorr   r   r   r  z<TestBrokenGreenlets.test_failed_to_initialstub.<locals>.funcW  s     !1222r   Tz;Failed to switch stacks into a greenlet for the first time.)r   	_greenletUnswitchableGreenletforce_switch_errorassertRaisesRegexSystemErrorr   )r?   r  r-   s      r   test_failed_to_initialstubz.TestBrokenGreenlets.test_failed_to_initialstubV  s    	3 	3 	3 33D99###K$ac c 	 	HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A''A+.A+c                    g fd}t           j                            |          }|                                 |                     dg           |                                 |                     ddg           d|_        |                     t          d          5  |                                 d d d            n# 1 swxY w Y   d|_        |                                 |                     g d           d S )Nc                  .                         d           t          j                    j                                                               d           t          j                    j                                                               d           d S )Nr   r9   r4   r5   )runss   r   r  zDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.funcd  sp    KKNNN!!(//111KKNNN!!(//111KKNNNNNr   r   r9   Tz0Failed to switch stacks into a running greenlet.F)r   r9   r4   )r   r}  r~  r   r<   r  r  r  )r?   r  r-   r  s      @r   "test_failed_to_switch_into_runningz6TestBrokenGreenlets.test_failed_to_switch_into_runningb  sC   	 	 	 	 	 33D99	


s###	


1v&&&###K$VX X 	 	HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  %	


yyy)))))s   !CC	Cc                     |                      d          }|                     d|j                   |                     |j        |                                            d S )Nzfail_slp_switch.pyzfail_slp_switch is running)assertScriptRaisesrI   output
returncode,get_expected_returncodes_for_aborted_processr?   exs     r   &test_failed_to_slp_switch_into_runningz:TestBrokenGreenlets.test_failed_to_slp_switch_into_running~  sU    $$%9::2BI>>>bmT%V%V%X%XYYYYYr   c                 8   |                      d          }|                     d|           |                     d|           |                     d|           |                     d|           |                     d|           |                     d|           d S )Nzfail_switch_two_greenlets.pyz	In g1_runTRACEzLEAVE TRACEzFalling off end of mainzFalling off end of g1_runzFalling off end of g2
run_scriptrI   r?   r  s     r   #test_reentrant_switch_two_greenletsz7TestBrokenGreenlets.test_reentrant_switch_two_greenlets  s    !?@@k6***gv&&&mV,,,/88816:::-v66666r   c                     |                      dd          }|                     d|j                   |                     d|j                   d S )Nzfail_switch_three_greenlets.py)r   )	exitcodesr   zpositional arguments)r  rI   r  r  s     r   %test_reentrant_switch_three_greenletsz9TestBrokenGreenlets.test_reentrant_switch_three_greenlets  sQ     $$%EQU$VVk29---,bi88888r   c                 \    |                      d          }|                     d|           d S )Nzfail_switch_three_greenlets2.pya  RESULTS: [('trace', 'switch'), ('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), ('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), ('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), ('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), ('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), ('trace', 'switch'), ('main g2.2', 'g2 done')]r  r  s     r   &test_reentrant_switch_three_greenlets2z:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2  s@     !BCC= 		
 		
 		
 		
 		
r   c                 \    |                      d          }|                     d|           d S )Nz#fail_initialstub_already_started.pya!  RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', ('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), 'B.__getattribute__ back from main in C', ('Begin A', (None,)), ('A dead?', True, 'B dead?', True, 'C dead?', False), 'C done', ('main from c.2', None)]r  r  s     r   4test_reentrant_switch_GreenletAlreadyStartedInPythonzHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython  s>    !FGG1
 	
 	
 	
 	
 	
r   c                 \    |                      d          }|                     d|           d S )Nzfail_clearing_run_switches.pyzRESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]r  r  s     r   *test_reentrant_switch_run_callable_has_delz>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_del  s>    !@AA 	
 	
 	
 	
 	
r   c                     t           s|                     d           |                     d          }|                     d|           d S )Nz0Only free-threaded builds take critical sectionszfail_switch_critical_section.pyzSWITCH CS OK)r   skipTestr  rI   r  s     r   +test_switch_leaves_no_critical_section_heldz?TestBrokenGreenlets.test_switch_leaves_no_critical_section_held  sL     + 	NMMLMMM!BCCnf-----r   N)r   r   r   r  r  r  r  r  r  r  r  r  r   r   r   ry  ry  R  s        
 
 
* * *8Z Z Z7 7 79 9 9
 
 
$

 

 


 
 
. . . . .r   ry  c                   V    e Zd Z ej         eed          d          d             ZdS )
TestModule_is_gil_enabledz,Needs 3.13 and above for sys._is_gil_enabledc                     t           r(|                     t          j                               d S |                     t          j                               d S r'   )r   r   r    r  r   rB   s    r   test_no_gil_on_free_threadedz'TestModule.test_no_gil_on_free_threaded  sP     ' 	3S02233333OOC/1122222r   N)r   r   r   r  
skipUnlessr  r    r  r   r   r   r  r    sU        X&788GI I3 3I I3 3 3r   r  __main__)"r   r    r   rq   r  abcr   r   r   r,   r  r   r   r	   r
   r   r   	leakcheckr   r   r   r   r  r   r$   r/   r1   r  rA  rj  ry  r  r   r  r   r   r   <module>r     s   				 



                    , , , , , ,       " " " " " "                   ) ) ) ) ) ) & & & & & & 7 7 7 7 7 7 ( ( ( ( ( ( + + + + + +	 	 	 	 		 	 	 	    t t t t t8 t t tnjD jD jD jD jD( jD jD jDZS S S S Sx S S Sl    x   @y. y. y. y. y.( y. y. y.v3 3 3 3 3 3 3 3 zHMOOOOO r   