a
    ҏiS                     @   s  d dl mZ d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlZd dlmZ ddlmZ dd	lmZ G d
d deZdd Zdd ZG dd deZG dd deZG dd deZG dd deZG dd deZedkr
d dlZe  dS )    )absolute_import)division)print_functionN)ABCMetaabstractmethod)greenlet   )TestCase)fails_leakcheckc                   @   s   e Zd ZdS )	SomeErrorN__name__
__module____qualname__ r   r   L/home/Claro/venv/lib/python3.9/site-packages/greenlet/tests/test_greenlet.pyr      s   r   c                 C   s<   zt  j  W n    | t d   Y n0 td S Nr   )r   
getcurrentparentswitchappendsysexc_infor   seenr   r   r   fmain   s    r   c                 C   s"   dd }t || d}|| d S )Nc                 S   s   | d S Nr   )excr   r   r   crasher&   s    zsend_exception.<locals>.crasherr   RawGreenletr   )gr   r   g1r   r   r   send_exception#   s    r$   c                   @   sj  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 ZedWd6d7Zed8d9 Zd:d; Z ed<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVS )XTestGreenletc                    s^   g   fdd}t |} d |   d |   d |  ttd d S )Nc                      s&     d t j    d d S )Nr      r   r   r   r   r   r   lstr   r   f1   s    
z'TestGreenlet._do_simple_test.<locals>.fr            )r!   r   r   assertEquallistrange)selfr*   r"   r   r(   r   _do_simple_test.   s    


zTestGreenlet._do_simple_testc                 C   s   |    d S r   )r2   r1   r   r   r   test_simple=   s    zTestGreenlet.test_simplec                 C   sN   t  }| t}|  W d    n1 s.0    Y  | dt|j d S Nrun)r!   assertRaisesAttributeErrorr   assertInstr	exceptionr1   r"   r   r   r   r   (test_switch_no_run_raises_AttributeError@   s    &z5TestGreenlet.test_switch_no_run_raises_AttributeErrorc                 C   sP   t  }| t}|t W d    n1 s00    Y  | dt|j d S r5   )r!   r7   r8   throwr   r9   r:   r;   r<   r   r   r   'test_throw_no_run_raises_AttributeErrorG   s    (z4TestGreenlet.test_throw_no_run_raises_AttributeErrorc                 C   s*   t d d}| | | |jt  d S )Nr   )r!   assertIsNotNoneassertIsr   r   r   r1   r"   r   r   r   test_parent_equals_NoneN   s    

z$TestGreenlet.test_parent_equals_Nonec                 C   s$   t d d}| | | |j d S )N)r6   )r!   r@   assertIsNoner6   rB   r   r   r   test_run_equals_NoneS   s    

z!TestGreenlet.test_run_equals_Nonec                    s   g   fdd}t |}t |}|  | t d |  | t d |  | t d | |jd |  | t d | |jd d S )Nc                      s*     d t j   ddg d S )Nr   )r   r   r   r   r   extendr   r(   r   r   r*   [   s    
z)TestGreenlet.test_two_children.<locals>.fr   r+   r,   T   )r!   r   r.   lendead)r1   r*   r"   hr   r(   r   test_two_childrenX   s    zTestGreenlet.test_two_childrenc                    sf   g fdd  fdd}t |}| t|d |  | g d | t|d d S )Nc                      s     d t j  d S )Nbr'   r   r(   r   r   r*   o   s    
z3TestGreenlet.test_two_recursive_children.<locals>.fc                     s(    d t } |    d d S )Nac)r   r!   r   r"   r*   r)   r   r   r"   s   s    
z3TestGreenlet.test_two_recursive_children.<locals>.gr+   )rM   rL   rN   )r!   r.   r   getrefcountr   rB   r   rP   r   test_two_recursive_childrenl   s    z(TestGreenlet.test_two_recursive_childrenc                    sf   g fdd  fddt dD }|D ]}|  q,|D ]}|d q>tt| d S )Nc                      s       d d S NT)r2   r   r   )r1   successr   r   r*      s    z$TestGreenlet.test_threads.<locals>.fc                    s   g | ]}t j d qS )target)	threadingThread).0ir*   r   r   
<listcomp>       z-TestGreenlet.test_threads.<locals>.<listcomp>
   )r0   startjoinr.   rH   )r1   Zthsthr   )r*   r1   rT   r   test_threads   s    
zTestGreenlet.test_threadsc                 C   s   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.   r7   r   )r1   r   r#   g2valuer   r   r   test_exception   s    


zTestGreenlet.test_exceptionc                 C   s8   g }t t}|| | tt|t | |tg d S r   )r!   r   r   r7   KeyErrorr$   r.   )r1   r   r#   r   r   r   test_send_exception   s
    
z TestGreenlet.test_send_exceptionc                 C   sp   g }t t}t t}|| || | |g  ~t  | |tjg ~t  | |tjtjg d S r   )r!   r   r   r.   gccollectr   GreenletExit)r1   r   r#   rd   r   r   r   test_dealloc   s    

zTestGreenlet.test_deallocc                 C   s   dd }t |}|  tj}zddlm} W n tyL   ddlm} Y n0 |  }t_z~W |t_n|t_0 | }| 	d| | 	d| | 	d| d S )Nc                   S   s2   zt  j  W n t jy,   td Y n0 d S r   )r   r   r   r   rk   r   r   r   r   r   r6      s    zHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.runr   )StringIO	ExceptionZignoredr   )
r!   r   r   stderr	cStringIOrm   ImportErroriogetvaluer9   )r1   r6   r"   Z	oldstderrrm   ro   vr   r   r   .test_dealloc_catches_GreenletExit_throws_other   s     z;TestGreenlet.test_dealloc_catches_GreenletExit_throws_otherc              	      s  g g t   t  t  t   fdd}t j|d}|   d | g  | td d d = t  | g  	  d z:| t
jg W 	  |d d d = d d = n(	  |d d d = d d = 0 d S )Nc                     sZ   t t} |  |  ~ t     d t     d t   d S )Nr&   )r!   r   r   r   ri   rj   setwait)r#   Z/bg_glet_created_running_and_no_longer_ref_in_bgZbg_should_be_clearZfg_ref_releasedZok_to_exit_bg_threadr   Zsomerefr   r   r*      s    



z1TestGreenlet.test_dealloc_other_thread.<locals>.frU   r^   r   r&   )rW   EventrX   r_   rw   r.   rH   ri   rj   rv   r   rk   r`   )r1   r*   tr   rx   r   test_dealloc_other_thread   s6    






z&TestGreenlet.test_dealloc_other_threadc                    sf    fdd}t |}| } ||ju   | | } |  |d  |jd  d S )Nc                     s,   t d}  | jd  t j|  dS )Nr   meaning of life)r   	_getframer.   f_backr   r   r   r   r[   r3   r   r   f1	  s    
z#TestGreenlet.test_frame.<locals>.f1r|   )r!   r   
assertTruegr_frameassertFalser.   )r1   r   r"   frameZfrom_gr   r3   r   
test_frame  s    

zTestGreenlet.test_framec                 C   sL   dd }t j|dd}t j|dd}|  |  |d |d d S )Nc                    s   t  fdd}|  d S )Nc                      s
   t  S r   )timesleepr   xr   r   <lambda>  r]   z>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>r    )r   r"   r   r   r   runner  s    z,TestGreenlet.test_thread_bug.<locals>.runner)g?rV   args)g333333?r^   )rW   rX   r_   r`   )r1   r   t1t2r   r   r   test_thread_bug  s    
zTestGreenlet.test_thread_bugc                    s.    fdd}t |jddd} |d d S )Nc                    s     | d   |d dS )Nr,   r+   *   )r.   rM   rL   r3   r   r   r6   $  s    z,TestGreenlet.test_switch_kwargs.<locals>.runr,   r+   r   r   r!   r   r.   )r1   r6   r   r   r3   r   test_switch_kwargs#  s    zTestGreenlet.test_switch_kwargsc                 C   sR   dd }t |}| ddi|d | dddif|  | d|  d S )Nc                 S   s2   t  jj| d t  jjddd | | d fS )Nr   r+   r&   r   r   r   r   r   r   r   r   r6   ,  s    z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.runr   r&   )r+   )r&   	   )r!   r.   r   )r1   r6   r"   r   r   r   test_switch_kwargs_to_parent+  s
    z)TestGreenlet.test_switch_kwargs_to_parentc                    s   i t   t   fdd}t j|d}|   d | tj d   W d    n1 sp0    Y  	  |
d   d S )Nc                      s&   t dd d<    d d S )Nc                   S   s   d S r   r   r   r   r   r   r   ;  r]   zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>r"   r^   r!   rv   rw   r   Zcreated_eventdata
done_eventr   r   r6   :  s    z7TestGreenlet.test_switch_to_another_thread.<locals>.runrU   r^   r"   )rW   ry   rX   r_   rw   r7   r   errorr   rv   r`   clear)r1   r6   threadr   r   r   test_switch_to_another_thread5  s    
*
z*TestGreenlet.test_switch_to_another_threadc                    s*    fdd}fdd t |  d S )Nc                     sB   zt dW n0   t } t   | t  Y n0 d S )NZfun)
ValueErrorr   r   r!   r   r.   )r   rJ   r1   r   r   r*   I  s    z&TestGreenlet.test_exc_state.<locals>.fc                      s     t d d S )N)NNN)r.   r   r   r   r3   r   r   rJ   Q  s    z&TestGreenlet.test_exc_state.<locals>.hr    )r1   r*   r   r   r   test_exc_stateH  s    zTestGreenlet.test_exc_statec                 C   s   dd }dd }dd }t |}| |ji  |  | |jd | |jddi |j|_| |jddi | t|| | t||d d S )	Nc                   S   s   dt  _d S Nr   )r   r   testr   r   r   r   r*   W  s    z*TestGreenlet.test_instance_dict.<locals>.fc                 S   s   | ` d S r   __dict__rO   r   r   r   deldictY  s    z0TestGreenlet.test_instance_dict.<locals>.deldictc                 S   s
   || _ d S r   r   )r"   re   r   r   r   setdict[  s    z0TestGreenlet.test_instance_dict.<locals>.setdictr   r   )r!   r.   r   r   r   r7   	TypeError)r1   r*   r   r   r"   r   r   r   test_instance_dictV  s    zTestGreenlet.test_instance_dictc                    s2   g   fdd}t |}|  |  dg d S )Nc                      s     tt d d S r5   )r   hasattrr   r   r   Zhas_runr   r   funci  s    z;TestGreenlet.test_running_greenlet_has_no_run.<locals>.funcFr   r1   r   r"   r   r   r    test_running_greenlet_has_no_rung  s
    z-TestGreenlet.test_running_greenlet_has_no_runc                 C   s0   dd l }| t|j t  | t|jt  d S r   )copyr7   r   r!   deepcopy)r1   r   r   r   r   test_deepcopyr  s    zTestGreenlet.test_deepcopyc                    s   t dd  t g  fdd}t | d}|  ~|  | d  | d j  d d = d  d d S )Nc                   S   s   d S r   r   r   r   r   r   r   x  r]   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>c                      sL   z   W n: tjyF   t j t      Y n0 d S r   )r   r   rk   r   r   r   r   hubmainresultr   r   worker{  s    z9TestGreenlet.test_parent_restored_on_kill.<locals>.workerr   r   r   )r!   r   r   r   r   rA   r   )r1   r   r"   r   r   r   test_parent_restored_on_killw  s    	

z)TestGreenlet.test_parent_restored_on_killc                 C   sL   t  }t dd |d}| t |  W d    n1 s>0    Y  d S )Nc                   S   s   d S r   r   r   r   r   r   r     r]   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>r   )r!   r7   r8   r   )r1   r#   rd   r   r   r   test_parent_return_failure  s    z'TestGreenlet.test_parent_return_failurec                 C   s2   G dd dt }|dd }| t|jt  d S )Nc                   @   s   e Zd Zdd ZdS )z>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletc                 S   s$   z
t  W n   Y n0 t| |S r   )rn   r!   __getattribute__r1   namer   r   r   r     s
    
zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__Nr   r   r   r   r   r   r   r   
mygreenlet  s   r   c                   S   s   d S r   r   r   r   r   r   r     r]   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>)r!   r7   r   r>   )r1   r   r"   r   r   r   test_throw_exception_not_lost  s    z*TestGreenlet.test_throw_exception_not_lostFc                    s:  g  dd  fdd}t j|d}|  |d ~rH|   | tj} d t	 W d    n1 sx0    Y  s| 
t|jdd	g n| t|jd t d jd
r| t  d j  W d    n1 s0    Y  s d jj  n|  d j ~d  d d = d| _d S )Nc                   S   s   t  j  d S r   r   r   r   r   r   r     s    zGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.workerc                     s2   t } |    |  r.|   t  d S r   )r!   r   r   r   r   rO   r   wait_for_cleanupr   r   r   creator  s    
zHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creatorrU   r^   r   Bcannot switch to a different thread (which happens to have exited)#cannot switch to a different threadr   T)rW   rX   r_   r`   wait_for_pending_cleanupsr7   r   r   r>   r   r9   r:   r;   r.   r   r   RuntimeErrorr   f_localsrD   expect_greenlet_leak)r1   r   r   rz   r   r   r   r   *_do_test_throw_to_dead_thread_doesnt_crash  s@    
,,
z7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crashc                 C   s   |    d S r   r   r3   r   r   r   &test_throw_to_dead_thread_doesnt_crash  s    z3TestGreenlet.test_throw_to_dead_thread_doesnt_crashc                 C   s   |  d d S rS   r   r3   r   r   r   +test_throw_to_dead_thread_doesnt_crash_wait  s    z8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_waitc                 C   s2   G dd dt }| }| |dd d| _d S )Nc                   @   s$   e Zd Zdd Zdd Zdd ZdS )z7TestGreenlet.test_recursive_startup.<locals>.convolutedc                 S   s   t |  d| _d S r   )r!   __init__countr3   r   r   r   r     s    
z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__c                 S   s.   |dkr"| j dkr"d| _ | d t| |S )Nr6   r   r   +   )r   r   r!   r   r   r   r   r   r     s    
zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__c                 S   s   | j | q d S r   r   r   r1   re   r   r   r   r6     s    z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runN)r   r   r   r   r   r6   r   r   r   r   
convoluted  s   r   r   r   T)r!   r.   r   r   )r1   r   r"   r   r   r   test_recursive_startup  s    z#TestGreenlet.test_recursive_startupc                    s   t    t    G fdddt}dd } fdd}t }t|g |  d _ d   t j	|d}|
      | t | |d	 d S )
Nc                       s   e Zd Z fddZdS )z;TestGreenlet.test_threaded_updatecurrent.<locals>.finalizedc                    s         d S r   releaseacquirer3   lock1lock2r   r   __del__  s    zCTestGreenlet.test_threaded_updatecurrent.<locals>.finalized.__del__Nr   r   r   r   r   r   r   r   	finalized  s   r   c                   S   s   t  j  d S r   r   r   r   r   r   deallocator  s    z=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorc                      s:      t   d=      t    d S r   r   r   r   r   r   r"   r   r   r   r   fthread  s    z9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreadr   rU   r^   )rW   Lockr   objectr   r   r!   Zbombr   rX   r_   r   r.   r`   )r1   r   r   r   r   rz   r   r   r   test_threaded_updatecurrent  s"    

z(TestGreenlet.test_threaded_updatecurrentc                    sb   g  fdddd  t gd   t  d    }|  | |d d S )Nc               
      sX   t  j } d= t  j _z"t  j|  W t   nt   0 d S r   )r   r   r   r   r   )re   	initiatorr   r   r   r   r   -  s    z>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.workerc                   S   s   dS r   r   r   r   r   r   r   :  s    zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiatorr   r   )r!   r   r   r.   r   r   r   r   !test_dealloc_switch_args_not_lost+  s    

z.TestGreenlet.test_dealloc_switch_args_not_lostc                    sT   dd  G dd dt }| tdd fdd}t|}| |  d S )	Nc                 S   s   | |i | d S r   r   )r   rM   kr   r   r   _applyS  s    z0TestGreenlet.test_tuple_subclass.<locals>._applyc                   @   s   e Zd Zdd ZdS )z1TestGreenlet.test_tuple_subclass.<locals>.mytuplec                 S   s   t    t| S r   )r   r   r   tuple__len__r3   r   r   r   r   W  s    z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__N)r   r   r   r   r   r   r   r   mytupleV  s   r   r   )rM   c                      s    t  jj d S r   r   r   r   r   kwargsr   r   switchapply\  s    z5TestGreenlet.test_tuple_subclass.<locals>.switchapply)r   dictr!   r.   r   )r1   r   r   r"   r   r   r   test_tuple_subclassE  s    
z TestGreenlet.test_tuple_subclassc                 C   sP   t dtfdtdd i}G dd d|}G dd d|}|  | t| d S )	NAbstractSubclassr6   c                 S   s   d S r   r   r3   r   r   r   r   e  r]   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>c                   @   s   e Zd ZdS )z:TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   r   BadSubclassg  s   r   c                   @   s   e Zd Zdd ZdS )z;TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                 S   s   d S r   r   r3   r   r   r   r6   k  s    z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runN)r   r   r   r6   r   r   r   r   GoodSubclassj  s   r   )r   r!   r   r7   r   )r1   r   r   r   r   r   r   test_abstract_subclassesa  s    z%TestGreenlet.test_abstract_subclassesc                    sN   t  sd S t  d   dk r$d S  fdd}tdD ]}| r: qJq:d S )Nr   2   c            	         s  t    t    dgfdd} t j| d}|  G fdddt G  fdddt}g }td	 }t }| }|D ]<}d }d
 r|	d  dS t
 }d
 r q|| qt  d
 r|	d dS |j| |D ]}|j| qdS )NFc                      s       t    d S r   r   r   r   r   r   another_thread}  s    zWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadrU   c                       s   e Zd Z fddZdS )zTTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callbackc                    s         dd< d S )NTr   r   r3   r   r   recycledr   r   r     s    z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__Nr   r   r   r   r   gc_callback  s   r   c                       s   e Zd Z fddZdS )zPTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                    s   | | _   | _d S r   )cyclecallbackr3   r   r   r   r     s    zYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__N)r   r   r   r   r   r   r   r   garbage  s   r   r+   r   r^   T)rW   r   r   rX   r_   r   r0   r   r   r`   r!   r   ri   rj   r.   r   )	r   rz   r   lr   currentr"   _lastNr1   )r   r   r   r   r   attemptw  s>    

z?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptr-   )ri   	isenabledZget_thresholdr0   )r1   r  r   r   r  r   !test_implicit_parent_with_threadsq  s    -z.TestGreenlet.test_implicit_parent_with_threadsc                    s|   ddl m ddl m  G dd dt}t|}g _ fdd}tdD ]}||  qP`	t|| d S )	Nr   r   )rk   c                   @   s   e Zd ZdS )zTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   r   Greenlet  s   r  c                      s6   z j   W n   y0   j  Y n0 d S r   )r   r   gletsr   r   rk   r   r1   r   r   greenlet_main  s    zYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_mainr^   )
r   r   rk   r!   r   rQ   r  r0   r   r.   )r1   r  initial_refsr
  r   r   r	  r   5test_issue_245_reference_counting_subclass_no_threads  s    
zBTestGreenlet.test_issue_245_reference_counting_subclass_no_threadsc           
         s   ddl m} ddl m} ddlm G dd dt g | fdd fd	d
}t }g }t|d D ]*}| }|||fd}|	| |
  qx|D ]}	|	d qd d =   |   | t | d S )Nr   )rX   )ry   r  c                   @   s   e Zd ZdS )zSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   r   
MyGreenlet  s   r  c                      s     j   d S r   r   r   r  r   r   r
    s    zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_mainc                    s8    } | |  ~|   d   d S )Nr^   )r   r   rv   rw   )Zgreenlet_running_eventZminer  r   r  r
  Zref_clearedr   r   thread_main  s    

zTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_main-   r   r^   )rW   rX   ry   r   r   r!   r   rQ   r0   r   r_   rw   rv   r   r.   )
r1   rX   ry   r  r  Zthread_ready_eventsr   eventr   r   r   r  r   2test_issue_245_reference_counting_subclass_threads  s.    



z?TestGreenlet.test_issue_245_reference_counting_subclass_threadsc                 C   sX   dd }t |}dd }t ||}| t |  W d    n1 sJ0    Y  d S )Nc                   S   s   dS )N   r   r   r   r   r   no_args  s    z\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_argsc                   S   s   dS r   r   r   r   r   r   leaf  s    zYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf)r!   r7   r   r   )r1   r  parent_never_startedr  childr   r   r   >test_falling_off_end_switches_to_unstarted_parent_raises_error
  s    
zKTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_errorc                 C   s:   dd }t |}dd }t ||}| }| |d d S )Nc                 S   s   | dfS N   r   r   r   r   r   one_arg  s    zUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_argc                   S   s   dS r   r   r   r   r   r   r    s    zRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf)r   r  r   )r1   r  r  r  r  r   r   r   r   7test_falling_off_end_switches_to_unstarted_parent_works  s    
zDTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_worksc                    s   G dd dt }| }g  t  fdd|}| t |  W d    n1 sT0    Y  |  dg | t |  W d    n1 s0    Y  |  dg d S )Nc                   @   s   e Zd Zdd ZdS )zXTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentc                 S   s   |dkrt d S r5   )r   r   r   r   r   r   )  s    ziTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parent.__getattribute__Nr   r   r   r   r   Parent(  s   r  c                      s
     dS r   r   r   r   r   r   r   0  r]   zZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>r   )r!   r7   r   r   r.   )r1   r  r  r  r   r   r   ;test_switch_to_dead_greenlet_with_unstarted_perverse_parent'  s    &&zHTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parentc                    sf   g  t  fdd}t  fdd}|  |  dg ||_| }| | |  ddg d S )Nc                      s
     dS r  r  r   r   r   r   r   >  r]   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>c                      s
     dS r   r  r   r   r   r   r   ?  r]   r   r  )r!   r   r.   r   rD   )r1   r  r  r   r   r   r   %test_switch_to_dead_greenlet_reparent<  s    
z2TestGreenlet.test_switch_to_dead_greenlet_reparentc                    sB   t    fdd}t|}|  | |j | |jj d S )Nc                      s       d S r   )r   r   r   r   r   HubP  s    zFTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.Hub)r   r   r!   r   r@   r   rD   r~   )r1   r"  r   r   r!  r   ,test_can_access_f_back_of_suspended_greenletJ  s    z9TestGreenlet.test_can_access_f_back_of_suspended_greenletN)F).r   r   r   r2   r4   r=   r?   rC   rE   rK   rR   rb   rf   rh   rl   ru   r{   r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r   r#  r   r   r   r   r%   ,   sZ   ,
	8

/7Cr%   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )TestGreenletSetParentErrorsc                    s   i t   t   fdd}dd }t j|d}|   d t|}|  | t}d |_	W d    n1 s0    Y  
  |d | t|jd d S )	Nc                      s&   t dd d<    d d S )Nc                   S   s   d S r   r   r   r   r   r   r   e  r]   zQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>r"   r^   r   r   r   r   r   r6   d  s    z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.runc                   S   s   t  j  d S r   r   r   r   r   r   blanki  s    zATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blankrU   r^   r"   z&parent cannot be on a different thread)rW   ry   rX   r_   rw   r!   r   r7   r   r   rv   r`   r.   r:   r;   )r1   r6   r%  r   r"   r   r   r   r   test_threaded_reparent_  s    
(
z2TestGreenletSetParentErrors.test_threaded_reparentc                    s   g   fdd}t j|d}|  |d | j| jd d G  fdddt}|d	d
 }| tj	}|
  W d    n1 s0    Y  | t|jd  d d = d S )Nc                     s"   t dd }  |  |   d S )Nc                   S   s   d S r   r   r   r   r   r   r   {  r]   zYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>)r!   r   r   rO   anotherr   r   r   z  s    
zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.workerrU   r^   r   )Zinitial_main_greenletsc                       s   e Zd Z fddZdS )zKTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedc                    s   |dkr d | _ t| |S Nr6   r   r   r!   r   r   r'  r   r   r     s    
z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__Nr   r   r'  r   r   r     s   r   c                   S   s   d S r   r   r   r   r   r   r     r]   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>r   )rW   rX   r_   r`   r   Zmain_greenlets_before_testr!   r7   r   r   r   r.   r:   r;   )r1   r   rz   r   r"   r   r   r'  r   test_unexpected_reparentingx  s    
&z7TestGreenletSetParentErrors.test_unexpected_reparentingc              	      s   g  t  t   fdd}G  fdddt}t j|d}|  d zr|dd }| tj}|	  W d    n1 s0    Y  | 
t|jd	 W   |d  d d = n  |d  d d = 0 d S )
Nc                     s4   t dd }  |  |     d d S )Nc                   S   s   d S r   r   r   r   r   r   r     r]   zhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>r^   )r!   r   r   rv   rw   rO   r(  Zkeep_main_aliveZswitched_to_greenletr   r   r     s
    
zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerc                       s   e Zd Z fddZdS )zZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedc                    s   |dkr d | _ t| |S r)  r*  r   r'  r   r   r     s    
zkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__Nr   r   r'  r   r   r     s   r   rU   r^   c                   S   s   d S r   r   r   r   r   r   r     r]   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>r   )rW   ry   r!   rX   r_   rw   r7   r   r   r   r.   r:   r;   rv   r`   )r1   r   r   rz   r"   r   r   r,  r   *test_unexpected_reparenting_thread_running  s&    
&

zFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_runningc                 C   sb   t dd }| |jt  | t}|`W d    n1 sB0    Y  | t|j	d d S )Nc                   S   s   d S r   r   r   r   r   r   r     r]   zGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>can't delete attribute)
r!   rA   r   r   r   r7   r8   r.   r:   r;   )r1   r   r   r   r   r   test_cannot_delete_parent  s
    "z5TestGreenletSetParentErrors.test_cannot_delete_parentc                 C   sH   |  t}t `W d    n1 s(0    Y  | t|jd d S )Nr.  r7   r8   r   r   r   r.   r:   r;   r1   r   r   r   r   !test_cannot_delete_parent_of_main  s    &z=TestGreenletSetParentErrors.test_cannot_delete_parent_of_mainc                 C   s   |  t j d S r   )rD   r   r   r   r3   r   r   r   !test_main_greenlet_parent_is_none  s    z=TestGreenletSetParentErrors.test_main_greenlet_parent_is_nonec                    sT   dd } fdd}t |} | || |   | || |  d S )Nc                   S   s   t  j  d S r   r   r   r   r   r   bg  s    zCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bgc              	      sb   d d dfD ]P}  t}|| _W d    n1 s60    Y   t|jdt|j  qd S )Nr   Z42z4GreenletChecker: Expected any type of greenlet, not )r7   r   r   r.   r:   r;   typer   )gletpr   r3   r   r   check  s    $zFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check)r!   r   r   r   )r1   r4  r8  r"   r   r3   r   test_set_parent_wrong_types  s    


z7TestGreenletSetParentErrors.test_set_parent_wrong_typesc                 C   sR   t dd }| t}||_W d    n1 s20    Y  | t|jd d S )Nc                   S   s   d S r   r   r   r   r   r   r     r]   z@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>cyclic parent chain)r!   r7   r   r   r.   r:   r;   )r1   r6  r   r   r   r   test_trivial_cycle  s    $z.TestGreenletSetParentErrors.test_trivial_cyclec                 C   sN   |  t}t t _W d    n1 s.0    Y  | t|jd d S )Nz(cannot set the parent of a main greenletr0  r1  r   r   r   test_trivial_cycle_main  s    ,z3TestGreenletSetParentErrors.test_trivial_cycle_mainc                 C   sv   t dd }t dd }t dd }||_||_| t}||_W d    n1 sV0    Y  | t|jd d S )Nc                   S   s   d S r   r   r   r   r   r   r     r]   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>c                   S   s   d S r   r   r   r   r   r   r     r]   c                   S   s   d S r   r   r   r   r   r   r      r]   r:  )r!   r   r7   r   r.   r:   r;   )r1   r#   rd   Zg3r   r   r   r   test_deeper_cycle  s    $z-TestGreenletSetParentErrors.test_deeper_cycleN)r   r   r   r&  r+  r-  r/  r2  r3  r9  r;  r<  r=  r   r   r   r   r$  ^  s   )"r$  c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestReprc                 C   s   |  ||||f d S r   )r   endswith)r1   gotsuffixr   r   r   assertEndsWith  s    zTestRepr.assertEndsWithc                 C   s   t t }| |d d S )N current active started main>)reprr   r   rB  r1   rr   r   r   test_main_while_running  s    z TestRepr.test_main_while_runningc                    s4   t    fdd}t|}| }| |d d S )Nc                      s   t  S r   )rD  r   r!  r   r   r6     s    z-TestRepr.test_main_in_background.<locals>.run suspended active started main>)r   r   r!   r   rB  )r1   r6   r"   rF  r   r!  r   test_main_in_background  s
    z TestRepr.test_main_in_backgroundc                 C   s   t t }| |d d S )Nz	 pending>)rD  r!   rB  rE  r   r   r   test_initial  s    
zTestRepr.test_initialc                    s   t   G  fdddtj}| }|  |d | |jd | |jd t	dD ]}t
d qZt	dD ](}| |jj t|j}| |d qrd S )	Nc                       s$   e Zd Zd ZZdZ fddZdS )z/TestRepr.test_main_from_other_thread.<locals>.TNc                    s$   t  | _t | _t | j| _d S r   )rD  original_mainr   r   	main_gletr  r3   r!  r   r   r6   %  s    

z3TestRepr.test_main_from_other_thread.<locals>.T.run)r   r   r   rK  r  rL  r6   r   r!  r   r   T"  s   rM  r^   rH  rC  r&   gMbP?z (thread exited) dead>)r   r   rW   rX   r_   r`   rB  rK  r  r0   r   r   r   rL  rI   rD  )r1   rM  rz   r   rF  r   r!  r   test_main_from_other_thread  s    

z$TestRepr.test_main_from_other_threadc                 C   sX   t dd }|  | t|d | dt| | dt| | dt| d S )Nc                   S   s   d S r   r   r   r   r   r   r   C  r]   z$TestRepr.test_dead.<locals>.<lambda>z dead>Z	suspendedstartedactive)r!   r   rB  rD  ZassertNotInrB   r   r   r   	test_deadB  s    zTestRepr.test_deadc                 C   sX   t dd }t dd }t }|||fD ](}| d|f t | d|f t q*d S )Nc                   S   s   d S r   r   r   r   r   r   r   N  r]   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>c                   S   s   d S r   r   r   r   r   r   r   O  r]   z%sz%r)r!   r   r   assertIsInstancer:   )r1   Zg_deadZg_not_startedZg_curr"   r   r   r   #test_formatting_produces_native_strJ  s    z,TestRepr.test_formatting_produces_native_strN)
r   r   r   rB  rG  rI  rJ  rN  rQ  rS  r   r   r   r   r>  	  s   	#r>  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestMainGreenletc                 C   s4   dt t v sJ tt }dt |vs0J |S )Nr   )rD  r   r   r5  )r1   rz   r   r   r   _check_current_is_mainb  s    z'TestMainGreenlet._check_current_is_mainc                 C   s$   |   }td|fi }| | d S )Nsubclass)rU  r5  r@   )r1   Z	main_typerV  r   r   r   )test_main_greenlet_type_can_be_subclassedj  s    z:TestMainGreenlet.test_main_greenlet_type_can_be_subclassedc                 C   s   |    | t t d S r   )rU  rR  r   r   r!   r3   r   r   r   test_main_greenlet_is_greenleto  s    z/TestMainGreenlet.test_main_greenlet_is_greenletN)r   r   r   rU  rW  rX  r   r   r   r   rT  ^  s   rT  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestBrokenGreenletsc                 C   sR   dd }t j|}d|_| td |  W d    n1 sD0    Y  d S )Nc                   S   s   t dd S )NzNever get here)AssertionErrorr   r   r   r   r   z  s    z<TestBrokenGreenlets.test_failed_to_initialstub.<locals>.funcTz;Failed to switch stacks into a greenlet for the first time.)r   	_greenletUnswitchableGreenletforce_switch_errorassertRaisesRegexSystemErrorr   r   r   r   r   test_failed_to_initialstuby  s    z.TestBrokenGreenlets.test_failed_to_initialstubc                    s   g   fdd}t j|}|  |  dg |  |  ddg d|_| td |  W d    n1 sz0    Y  d|_|  |  g d d S )	Nc                      s>     d t j    d t j    d d S )Nr   r+   r&   r'   r   runsr   r   r     s
    

zDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.funcr   r+   Tz0Failed to switch stacks into a running greenlet.F)r   r+   r&   )r   r[  r\  r   r.   r]  r^  r_  r   r   ra  r   "test_failed_to_switch_into_running  s    &z6TestBrokenGreenlets.test_failed_to_switch_into_runningc                 C   s.   |  d}| d|j | |j|   d S )Nzfail_slp_switch.pyzfail_slp_switch is running)assertScriptRaisesr9   output
returncodeZ,get_expected_returncodes_for_aborted_processr1   exr   r   r   &test_failed_to_slp_switch_into_running  s    
z:TestBrokenGreenlets.test_failed_to_slp_switch_into_runningc                 C   sV   |  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_scriptr9   r1   re  r   r   r   #test_reentrant_switch_two_greenlets  s    
z7TestBrokenGreenlets.test_reentrant_switch_two_greenletsc                 C   s.   | j ddd}| d|j | d|j d S )Nzfail_switch_three_greenlets.py)r   )Z	exitcodesr   zpositional arguments)rd  r9   re  rg  r   r   r   %test_reentrant_switch_three_greenlets  s    z9TestBrokenGreenlets.test_reentrant_switch_three_greenletsc                 C   s   |  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')]rk  rm  r   r   r   &test_reentrant_switch_three_greenlets2  s
    
z:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2c                 C   s   |  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)]rk  rm  r   r   r   4test_reentrant_switch_GreenletAlreadyStartedInPython  s
    
zHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPythonc                 C   s   |  d}| d| d S )Nzfail_clearing_run_switches.pyzRESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]rk  rm  r   r   r   *test_reentrant_switch_run_callable_has_del  s
    
z>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_delN)r   r   r   r`  rc  ri  rn  ro  rp  rq  rr  r   r   r   r   rY  u  s   
	rY  __main__)
__future__r   r   r   ri   r   r   rW   abcr   r   r   r!    r	   Z	leakcheckr
   rn   r   r   r$   r%   r$  r>  rT  rY  r   Zunittestr   r   r   r   r   <module>   s:   		      8 ,Um
