
    i?                        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  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)RUNNING_ON_FREETHREAD_BUILD)fails_leakcheck)ignores_leakcheckc                       e Zd ZdS )	SomeErrorN__name__
__module____qualname__     l/var/www/html/crypto-mining-system/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>.crasher/   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#d2d            Z$e#d             Z%d  Z&e#d!             Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z- ej        eoed(          d)             Z.d* Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5d1S )3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)selfr5   r*   r4   s      @r   _do_simple_testzTestGreenlet._do_simple_test7   s    	 	 	 	 	 NN

1	




1	




1d588nn-----r   c                 .    |                                   d S r$   )r=   r<   s    r   test_simplezTestGreenlet.test_simpleF   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_AttributeErrorI   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 rB   )r)   rD   rE   throwr   rF   rG   rH   rI   s      r   'test_throw_no_run_raises_AttributeErrorz4TestGreenlet.test_throw_no_run_raises_AttributeErrorP   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_NoneW   sK    t$$$Qah 3 5 566666r   c                     t          d           }|                     |           |                     |j                   d S )N)rC   )r)   rO   assertIsNonerC   rQ   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   extendr3   s   r   r5   z)TestGreenlet.test_two_children.<locals>.fd   sL    JJqMMM!!(//111JJ1vr   r   r6   r7   T   )r)   r   r9   lendead)r<   r5   r*   hr4   s       @r   test_two_childrenzTestGreenlet.test_two_childrena   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br2   r3   s   r   r5   z3TestGreenlet.test_two_recursive_children.<locals>.fx   s6    JJsOOO!!(//11111r   c                                           d           t                    } |                                                       d           d S )Nac)r   r)   r   )r*   r5   r4   s    r   r*   z3TestGreenlet.test_two_recursive_children.<locals>.g|   s=    JJsOOOAAHHJJJJJsOOOOOr   r6   r   )rb   r`   rc   )r9   r   getrefcountr
   r)   r   )r<   r*   r5   r4   s     @@r   test_two_recursive_childrenz(TestGreenlet.test_two_recursive_childrenu   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   r5   z$TestGreenlet.test_threads.<locals>.f   s-      """NN4     r   c                 :    g | ]}t          j                   S )target	threadingThread).0ir5   s     r   
<listcomp>z-TestGreenlet.test_threads.<locals>.<listcomp>   s'    ===ayq)))===r   
   )r;   startjoinr9   rZ   )r<   thsthr5   ri   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 rl   argsrm   )rp   _r   r   greenlets_all_createds     r   rr   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   rm   )rp   r   all_threads_deadr   r   r   s     r   rr   zLTestGreenlet.test_switching_many_threads.<locals>.run_it.<locals>.<listcomp>   sN          (B'02G'7'9: : :  r   g-C6?g      ?)	rn   Eventr;   rt   rZ   timesleepsetru   )	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   r9   rD   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   rD   KeyErrorr,   r9   )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   r9   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   rC   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   unraisablehookr9   rZ   assertIsInstance	exc_valuer   )r<   rC   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 )Nr1   )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   r5   z1TestGreenlet.test_dealloc_other_thread.<locals>.f1  s    U##BIIdOOONN2JLLL;??AAA  ###MMM""$$$ %%a(((MMMMMr   rk   rs   r   r1   )rn   r   ro   rt   r~   r9   rZ   r   r   r   r   r   r   ru   )	r<   r5   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   	_getframer9   f_backr   r   r   r   )r5   r<   s    r   f1z#TestGreenlet.test_frame.<locals>.f1`  sP    a  AQXt,,,!!(//222$$r   r   )r)   r   
assertTruegr_frameassertFalser9   )r<   r   r*   framefrom_gs   `    r   
test_framezTestGreenlet.test_frame_  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>q  s    DJqMM r   r(   )r   r*   s   ` r   runnerz,TestGreenlet.test_thread_bug.<locals>.runnerp  s+    111122AHHJJJJJr   )g?r   )g333333?rs   )rn   ro   rt   ru   )r<   r   t1t2s       r   test_thread_bugzTestGreenlet.test_thread_bugo  sy    	 	 	 V&999V&999









r   c                       fd}t          |                              dd          }                     |d           d S )Nc                 `                         | d                                |d           dS )Nr7   r6   *   )r9   )rb   r`   r<   s     r   rC   z,TestGreenlet.test_switch_kwargs.<locals>.run{  s4    Q"""Q"""2r   r7   r6   )rb   r`   r   r)   r   r9   )r<   rC   r   s   `  r   test_switch_kwargszTestGreenlet.test_switch_kwargsz  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   r6   r1   r|   r   s    r   rC   z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.run  sX    !!(//!/444!!(//Q/777a1f9r   r   r1   )r6   )r1   	   )r)   r9   r   )r<   rC   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*   rs   r)   r   r~   created_eventdata
done_events   r   rC   z7TestGreenlet.test_switch_to_another_thread.<locals>.run  @    #LL11DIOOBr   rk   rs   r*   )rn   r   ro   rt   r~   rD   r   r   r   r   ru   clear)r<   rC   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   r9   )r   r\   r<   s    r   r5   z&TestGreenlet.test_exc_state.<locals>.f  sg    ; ''';<>>A%%'''  3<>>::::::s
    AA2c                  V                          t          j                    d           d S )N)NNN)r9   r   r   r?   s   r   r\   z&TestGreenlet.test_exc_state.<locals>.h  s&    S\^^-?@@@@@r   r(   )r<   r5   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   r5   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)   r9   r   r   r   rD   	TypeError)r<   r5   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 rB   )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   )copyrD   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   rP   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)   rD   rE   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)   rD   r   rL   )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   rk   rs   r   Bcannot switch to a different thread (which happens to have exited)zCannot switchr   T)rn   ro   rt   ru   wait_for_pending_cleanupsrD   r   r   rL   r   rG   rH   r   r9   r   r   RuntimeErrorr   f_localsrT   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=c                 .    |                                   d S r$   r+  r?   s    r   &test_throw_to_dead_thread_doesnt_crashz3TestGreenlet.test_throw_to_dead_thread_doesnt_crash7  s    7799999r   c                 0    |                      d           d S rh   r-  r?   s    r   +test_throw_to_dead_thread_doesnt_crash_waitz8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_wait;  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__countr?   s    r   r5  z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__A  s    $T***


r   c                     |dk    r'| j         dk    rd| _         |                     d           t          j        | |          S )NrC   r   r   +   )r6  r   r)   r  r  s     r   r  zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__D  s>    5==TZ1__!"DJKKOOO"3D$???r   c                 :    	 | j                             |           r$   r   r   )r<   r   s     r   rC   z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runI  s"    .K&&u---.r   N)r   r   r   r5  r  rC   r   r   r   
convolutedr3  @  sD          @ @ @
. . . . .r   r;  r   r8  T)r)   r9   r   r)  )r<   r;  r*   s      r   test_recursive_startupz#TestGreenlet.test_recursive_startup>  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__\  s#     r   Nr   r   r   rF  rD  rE  s   r   	finalizedr?  [  s3                       r   rI  c                  Z    t          j                    j                                         d S r$   r|   r   r   r   deallocatorz=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorc  r!  r   c                                                        t          j                      d=                                                                    t          j                                                      d S r   rC  r   r   rB  )r*   rD  rE  s   r   fthreadz9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreade  s`    MMOOO!!!!MMOOOMMOOO!!!MMOOOOOr   r   rk   rs   )rn   LockrC  objectr   r   r)   bombr   ro   rt   rB  r9   ru   )	r<   rI  rK  rN  r
  r   r*   rD  rE  s	         @@@r   test_threaded_updatecurrentz(TestGreenlet.test_threaded_updatecurrentT  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   rU  zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiator      2r   r   r   )r)   r   r   r9   )r<   r   rU  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   rb   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__r?   s    r   ra  z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__  s/    #%%,,...}}T***r   N)r   r   r   ra  r   r   r   mytupler^    s#        + + + + +r   rb  r   )rb   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   )r`  dictr)   r9   r   )r<   rb  re  r*   r\  r   rd  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AbstractSubclassrC   c                     d S r$   r   r?   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   BadSubclassrl            Dr   rm  c                       e Zd Zd ZdS );TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                     d S r$   r   r?   s    r   rC   z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.run  s    r   N)r   r   r   rC   r   r   r   GoodSubclassrp    s#            r   rr  )r   r)   r   rD   r   )r<   ri  rm  rr  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$   rM  rH  s   r   another_threadzWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_thread  s0    #%%%r   rk   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   rA  )r<   rD  rE  recycleds    r   rF  z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__  s*    MMOOOMMOOO"&HQKKKr   NrG  )rD  rE  r|  s   r   gc_callbackrz    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   r5  zYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__  s    !%DJ$/KMMDMMMr   N)r   r   r   r5  )r}  s   r   garbager    s.        2 2 2 2 2 2 2r   r  r6   r   rs   T)rn   rO  rC  ro   rt   rP  r;   r   r   ru   r)   r   r   r   r9   r   )rx  r   r  lr   currentr*   r   lastr}  rD  rE  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   r8   )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  	  rn  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rs   )r   r   r   r)   r   rd   r  r;   r   r   assertGreaterEqualr9   )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   )ro   )r   r  c                       e Zd ZdS )STestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   
MyGreenletr  8  rn  r   r  c                  J                  j                                          d S r$   r:  r  s   r   r  zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_main>  s$    JLL&&(((((r   c                                }                     |           |                                 ~|                                                      d                         d S )Nrs   )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_mainA  sm    :m,,DLLKKMMM"&&((( R    JLLLLLr   -   ru  r   rs   )rn   ro   r   r   r   r)   r   rd   r   r;   r   rt   r~   r   r&  r9   )r<   ro   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_threads*  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_argsx  rW  r   c                      dS r   r   r   r   r   leafzYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf}  rW  r   )r)   rD   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_errorw  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  rW  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 rB   )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)   rD   r   r   r9   )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   r9   r   rT   )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   rO   r   r9   f_codeco_namer   rT   )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   r8   r  rs   i  )	functoolsr   r  r)   r   r   r;   r9   r(  r   rT   )r<   grr   rq   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   r9   r  r  rT   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   N)F)6r   r   r   r=   r@   rJ   rM   rR   rU   r]   re   rx   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.  r0  r<  rR  rX  rg  rs  r  r  r  r  r  r  r  r  r  r  r   r   r   r.   r.   5   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 : : _:> > > ) ) _)*- - -^$ $ $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:. . .&( ( ( ( (r   r.   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>  r   r   r*   rs   r   r   s   r   rC   z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.run  r   r   c                  Z    t          j                    j                                         d S r$   r|   r   r   r   blankzATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blank  r!  r   rk   rs   r*   z&parent cannot be on a different thread)rn   r   ro   rt   r~   r)   r   rD   r   r   r   ru   r9   rG   rH   )	r<   rC   r  r   r*   r%   r   r   r   s	         @@@r   test_threaded_reparentz2TestGreenletSetParentErrors.test_threaded_reparent  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>      D r   )r)   r   r   )r*   anothers    r   r  zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker  s5    LL))ANN1HHJJJJJr   rk   rs   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 NrC   r   r   r)   r  r<   r  r  s     r   r  z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__8  *    5==")!*DK"3D$???r   Nr  r  s   r   r;  r  7  5        @ @ @ @ @ @ @r   r;  c                      d S r$   r   r   r   r   r   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda><  r  r   r%  )rn   ro   rt   ru   r&  main_greenlets_before_testr)   rD   r   r   r   r9   rG   rH   )r<   r  r   r;  r*   r%   r  s         @r   test_unexpected_reparentingz7TestGreenletSetParentErrors.test_unexpected_reparenting  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>J  r  r   rs   )r)   r   r   r   r~   )r*   r  keep_main_aliveswitched_to_greenlets    r   r  zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerI  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__P  r  r   Nr  r  s   r   r;  r   O  r  r   r;  rk   rs   c                      d S r$   r   r   r   r   r   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>Z      4 r   z#Cannot switch to a different threadExpectedCurrent)rn   r   r)   ro   rt   r~   rD   r   r   r   rF   rG   rH   r   ru   )	r<   r  r;  r   r*   r%   r  r  r  s	         @@@r   *test_unexpected_reparenting_thread_runningzFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_runningC  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>h      T r   can't delete attribute)
r)   rP   r   r   r   rD   rE   r9   rG   rH   )r<   r  r%   s      r   test_cannot_delete_parentz5TestGreenletSetParentErrors.test_cannot_delete_parentg  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
  rD   rE   r   r   r   r9   rG   rH   r<   r%   s     r   !test_cannot_delete_parent_of_mainz=TestGreenletSetParentErrors.test_cannot_delete_parent_of_maino  s    ~.. 	-##%%,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-S]++-EFFFFFs   ;??c                 \    |                      t          j                    j                   d S r$   )rT   r   r   r   r?   s    r   !test_main_greenlet_parent_is_nonez=TestGreenletSetParentErrors.test_main_greenlet_parent_is_noneu  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>.bgz  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 )rD   r   r   r9   rG   rH   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  r  r*   s   `   r   test_set_parent_wrong_typesz7TestGreenletSetParentErrors.test_set_parent_wrong_typesy  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)   rD   r   r   r9   rG   rH   )r<   r  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   r  )r)   r   rD   r   r9   rG   rH   )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  r  r  r!  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   r*  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   r*  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$   )r1  r  s   r   rC   z-TestRepr.test_main_in_background.<locals>.run  s    ::r    suspended active started main>)r   r   r)   r   r*  )r<   rC   r*   r3  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>)r1  r)   r*  r2  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$   )r1  original_mainr   r   	main_gletr  )r<   r
  s    r   rC   z3TestRepr.test_main_from_other_thread.<locals>.T.run  s9    %)$ZZ"!)!4!6!6#'#7#7   r   )r   r   r   r?  r  r@  rC   r  s   r   Tr=    s=        *..MKI8 8 8 8 8 8 8r   rA  rs   r7  r0  r1   gMbP?z (thread exited) dead>)r   r   rn   ro   rt   ru   r*  r?  r  r;   r   r   r   r@  r[   r1  )r<   rA  r   r   r3  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   r*  r1  assertNotInrQ   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   rG   )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   r*  r4  r8  r:  rB  rI  rP  r   r   r   r)  r)    s        78-.. B	B 	B 	B 	B@ @ @B B B, , ,!= != !=F, , ,    r   r)  c                        e 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
  )r1  r   r   r  )r<   r   s     r   _check_current_is_mainz'TestMainGreenlet._check_current_is_main  sV    h133444444$&&''T!WW$$$$r   c                 |    |                                  }t          d|fi           }|                     |           d S )Nsubclass)rT  r  rO   )r<   	main_typerV  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$   )rT  r   r   r   r)   r?   s    r   test_main_greenlet_is_greenletz/TestMainGreenlet.test_main_greenlet_is_greenlet  s9    ##%%%h133[AAAAAr   N)r   r   r   rT  rX  rZ  r   r   r   rR  rR    sF          ' ' '
B B B B Br   rR  c                   >    e 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>.func  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_initialstub  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   r6   r1   r2   )runss   r   r   zDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.func,  sp    KKNNN!!(//111KKNNN!!(//111KKNNNNNr   r   r6   Tz0Failed to switch stacks into a running greenlet.F)r   r6   r1   )r   r`  ra  r   r9   rb  rc  rd  )r<   r   r*   rh  s      @r   "test_failed_to_switch_into_runningz6TestBrokenGreenlets.test_failed_to_switch_into_running*  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)assertScriptRaisesrF   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_runningF  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_scriptrF   r<   rl  s     r   #test_reentrant_switch_two_greenletsz7TestBrokenGreenlets.test_reentrant_switch_two_greenletsL  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)rk  rF   rl  ro  s     r   %test_reentrant_switch_three_greenletsz9TestBrokenGreenlets.test_reentrant_switch_three_greenletsV  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')]rt  rv  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)]rt  rv  s     r   4test_reentrant_switch_GreenletAlreadyStartedInPythonzHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPythonq  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')]rt  rv  s     r   *test_reentrant_switch_run_callable_has_delz>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_del}  s>    !@AA 	
 	
 	
 	
 	
r   N)r   r   r   re  ri  rq  rw  rz  r|  r~  r  r   r   r   r\  r\    s        
 
 
* * *8Z Z Z7 7 79 9 9
 
 
$

 

 


 
 
 
 
r   r\  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   r?   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   rn   r  abcr   r   r   r)   r  r   r   r	   r
   r   	leakcheckr   r   r  r   r!   r,   r.   r  r)  rR  r\  r  r   r
  r   r   r   <module>r     s   				 



                    , , , , , ,       " " " " " "             ) ) ) ) ) ) & & & & & & ( ( ( ( ( (	 	 	 	 		 	 	 	    H( H( H( H( H(8 H( H( H(V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B B B B Bx B B B.k
 k
 k
 k
 k
( k
 k
 k
Z3 3 3 3 3 3 3 3 zHMOOOOO r   