o
    U˟i
}                     @   s  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	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ ejZdej_G dd dejZG dd deZG dd deZG dd dejZ G dd dejZ!G dd dejZ"G dd dej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jZ)d&d' Z*G d(d) d)e+Z,G d*d+ d+ejZ-G d,d- d-ejZ.G d.d/ d/eZ/G d0d1 d1eZ0G d2d3 d3eZ1G d4d5 d5eZ2G d6d7 d7ejZ3G d8d9 d9ejZ4G d:d; d;e4Z5G d<d= d=e4Z6G d>d? d?e4Z7G d@dA dAejZ8G dBdC dCejZ9G dDdE dEejZ:G dFdG dGejZ;e<dHG dIdJ dJejZ=e>dKG dLdM dMejZ?e+ Z@[[eAdNkrweB  dS dS )O    N)patch)sleepwith_timeout
getcurrent)greenlet)AsyncResult)QueueChannel)AbstractGenericWaitTestCase)AbstractGenericGetTestCase)timing)ignores_leakcheckFc                   @      e Zd ZdS )ExpectedErrorN__name__
__module____qualname__ r   r   c/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/site-packages/gevent/tests/test__greenlet.pyr   *       r   c                   @   r   )ExpectedJoinErrorNr   r   r   r   r   r   -   r   r   c                   @   r   )SuiteExpectedExceptionNr   r   r   r   r   r   0   r   r   c                   @   s*   e Zd ZdZdZdZdddZdd ZdS )	GreenletRaisesJoinFTNc                 C   s&   |  j d7  _ | jrttj| |S N   )joinedraise_on_joinr   geventGreenletjoinselftimeoutr   r   r   r    8   s   zGreenletRaisesJoin.joinc                 O   s(   |  j d7  _ tjj| g|R i |S r   )killedr   r   kill)r"   argskwargsr   r   r   r%   >   s   zGreenletRaisesJoin.killN)r   r   r   r$   r   r   r    r%   r   r   r   r   r   3   s    
r   c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestLinkc                 C   s`   t dd }t }|| | | d tdD ]}t }|| | | d qd S )Nc                   S      dS Nd   r   r   r   r   r   <lambda>E       z3TestLink.test_link_to_asyncresult.<locals>.<lambda>r-      )r   spawnr   linkassertEqualgetrange)r"   pevent_event2r   r   r   test_link_to_asyncresultD   s   

z!TestLink.test_link_to_asyncresultc              	      s   t d t fdd}t }|| | t }|  W d    n1 s)w   Y  | |j  t	dD ]*}t }|| | t }|  W d    n1 sWw   Y  | |j  q9d S )N"test_link_to_asyncresult_exceptionc                      s   t   S r(   )r   throwr   errr   r   r.   Q   s    z=TestLink.test_link_to_asyncresult_exception.<locals>.<lambda>r0   )
r   r   r1   r   r2   assertRaisesr4   assertIs	exceptionr5   )r"   r6   r7   excr8   r9   r   r=   r   r;   O   s    



z+TestLink.test_link_to_asyncresult_exceptionc                 C   sf   t dd }t }||j | |  d tdD ]}||j | |  d qd S )Nc                   S   r+   r,   r   r   r   r   r   r.   a   r/   z-TestLink.test_link_to_queue.<locals>.<lambda>r-   r0   )r   r1   r   r2   putr3   r4   r5   )r"   r6   qr8   r   r   r   test_link_to_queue`   s   zTestLink.test_link_to_queuec                 C   s   t dd }t dd }t dd }t }||j ||j ||j |  |  |  g}| t|g d| d S )Nc                   S   r+   )Ne   r   r   r   r   r   r.   k   r/   z/TestLink.test_link_to_channel.<locals>.<lambda>c                   S   r+   )Nf   r   r   r   r   r   r.   l   r/   c                   S   r+   )Ng   r   r   r   r   r   r.   m   r/   )rF   rG   rH   )r   r1   r	   r2   rC   r4   r3   sorted)r"   p1p2p3rD   resultsr   r   r   test_link_to_channelj   s   "zTestLink.test_link_to_channelN)r   r   r   r:   r;   rE   rN   r   r   r   r   r*   B   s
    
r*   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )
TestUnlinkFc                 C   st   |t  | d|  |t  | d|  || j | d|  || j | d|  |  d S )Nr   r   )dummy_test_funcr3   	has_linksunlinksetUpr%   )r"   r6   r2   r   r   r   
_test_funcy   s   

zTestUnlink._test_funcc                 C      t t}| ||j d S r(   )r   r1   rP   rT   r2   r"   r6   r   r   r   test_func_link      
zTestUnlink.test_func_linkc                 C   rU   r(   )r   r1   rP   rT   
link_valuerV   r   r   r   test_func_link_value   rX   zTestUnlink.test_func_link_valuec                 C   rU   r(   )r   r1   rP   rT   link_exceptionrV   r   r   r   test_func_link_exception   rX   z#TestUnlink.test_func_link_exceptionN)r   r   r   switch_expectedrT   rW   rZ   r\   r   r   r   r   rO   v   s    rO   c                   @   s2   e Zd ZdZd
ddZdd Zdd Zdd	 ZdS )LinksTestCaseNc                 C   s   t || j| d S r(   )getattrlink_method)r"   r6   listenerr   r   r   r2         zLinksTestCase.linkc                    sz   t  }| || td}| ||j dg | | fdd tdD ]}| |t   | |tdj q%|| fS )Nr   initialc                     s
     dS )Nrc   )remove)r&   callback_flagr   r   r.      s   
 z)LinksTestCase.set_links.<locals>.<lambda>
   )r   r2   r   rC   r5   )r"   r6   r7   queuer8   r   re   r   	set_links   s   
zLinksTestCase.set_linksc                 C   s&   t  }|| t }||j ||fS r(   )r   r	   rC   )r"   r2   r7   rh   r   r   r   set_links_timeout   s
   
zLinksTestCase.set_links_timeoutc                 C   s<   t t|jtd}| |t t t|jtd}| |t d S )N)timeout_value)r   DELAYr4   Xr@   )r"   r7   rh   gotr   r   r   check_timed_out   s   zLinksTestCase.check_timed_outr(   )r   r   r   r`   r2   ri   rj   ro   r   r   r   r   r^      s    
	r^   c                   C   r+   )N   r   r   r   r   r   return25      rq   c                   @   s<   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dS )TestReturn_linkr2   Nc                 C   s   | j   d | _ d S r(   )r6   
unlink_allr"   r   r   r   cleanup   s   

zTestReturn_link.cleanupc                 C   s6   t t| _tdD ]	}| | jd q
| j  d S )Nr0   rp   )r   r1   rq   r6   r5   _test_returnr%   )r"   r8   r   r   r   test_return   s   zTestReturn_link.test_returnc                 C   sv   |  |\}}}| |j}ttd  | | | | | | |  | tt | | | j|  d S N   )	ri   rj   r[   r   rl   assertFalser3   r4   ro   )r"   r6   resultr7   rh   rf   xxxxxr   r   r   rw      s   

zTestReturn_link._test_returnc                 C   s~   |  |\}}}| |j}|  tt | | | | t	j
 | |  t	j
 tt | | | j|  d S r(   )ri   rj   r[   r%   r   rl   r{   assertIsInstancer4   r   GreenletExitro   r"   r6   r7   rh   rf   r}   r   r   r   
_test_kill   s   

zTestReturn_link._test_killc                 C   s.   t tt }| _tdD ]}| | qd S Nr0   )r   r1   r   rl   r6   r5   r   r"   r6   r8   r   r   r   	test_kill   s   zTestReturn_link.test_kill)
r   r   r   r`   r6   rv   rx   rw   r   r   r   r   r   r   rs      s    rs   c                   @      e Zd ZdZdS )TestReturn_link_valuerY   Nr   r   r   r`   r   r   r   r   r          r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestRaise_linkr2   c                 C   sp   |  |\}}}| |j}tt | || | t|j | 	| | tt | || | j
|  d S r(   )ri   rj   rY   r   rl   r{   r?   r   r4   r3   ro   r   r   r   r   _test_raise   s   zTestRaise_link._test_raisec                 C   s*   t dd }tdD ]}| | qd S )Nc                   S      t  tdS )N
test_raiser   r<   r   r   r   r   r   r.         z+TestRaise_link.test_raise.<locals>.<lambda>r0   )r   r1   r5   r   r   r   r   r   r     s   zTestRaise_link.test_raiseN)r   r   r   r`   r   r   r   r   r   r   r      s    r   c                   @   r   )TestRaise_link_exceptionr[   Nr   r   r   r   r   r     r   r   c                   @   st   e Zd Zdd Zdd Zedd Zedd Zd	d
 Zdd Z	G dd de
Zdd Zdd Zdd Zdd ZdS )	TestStuffc                 C   s8   t dd }| |jd | |jjd |  d S )Nc                   S   r+   r   r   r   r   r   r   r.     r/   z+TestStuff.test_minimal_id.<locals>.<lambda>r   )r   r1   assertGreaterEqualminimal_identparentr    r"   gr   r   r   test_minimal_id  s   zTestStuff.test_minimal_idc                 C   s   t dd }t dd }t dd }t j|||gdd | |j|j|jgg d t }|| | | d || t }|| | | d d S )	Nc                   S   r+   r   r   r   r   r   r   r.      r/   z.TestStuff.test_wait_noerrors.<locals>.<lambda>c                   S   r+   ry   r   r   r   r   r   r.   !  r/   c                   S   r+   r   r   r   r   r   r   r.   "  r/   Traise_error)r   rz   r0   r   )	r   r1   joinallr3   valuer   r2   r4   rR   )r"   xyzer   r   r   test_wait_noerrors  s   


zTestStuff.test_wait_noerrorsc                 C   sZ   dd }t |}t dd }| jtt j||gdd | jtt j|gdd |  d S )Nc                   S   s   t t dS r   )r   rl   r   r   r   r   r   0  s   z$TestStuff.test_wait_error.<locals>.xc                   S   r   )Ntest_wait_errorr   r   r   r   r   r.   4  r   z+TestStuff.test_wait_error.<locals>.<lambda>Tr   )r   r1   r?   r   r   r    )r"   r   r   r   r   r   r   -  s   
zTestStuff.test_wait_errorc                 C   sp   dd }t |}t dd }| td t j||gdd W d    n1 s*w   Y  t ||g d S )Nc                   S   s   t d td)N皙?first)r   r   r   r   r   r   r   <  s   z5TestStuff.test_joinall_exception_order.<locals>.firstc                   S   r   )Nsecondr   r   r   r   r   r.   @  r   z8TestStuff.test_joinall_exception_order.<locals>.<lambda>r   Tr   )r   r1   assertRaisesRegexr   r   )r"   r   abr   r   r   test_joinall_exception_order9  s   
z&TestStuff.test_joinall_exception_orderc                 C   sb   dd }dd }t |}t |}t j||gddd | | | | |  | | d S )Nc                   S      t d)Ncountr   r   r   r   r   raises_but_ignoredI     zDTestStuff.test_joinall_count_raise_error.<locals>.raises_but_ignoredc                   S   s   	 t d q)NTr   )r   r   r   r   r   sleep_foreverL  s   z?TestStuff.test_joinall_count_raise_error.<locals>.sleep_foreverFr   )r   r   )r   r1   r   assert_greenlet_readyassert_greenlet_not_readyr%   )r"   r   r   sleeperraiserr   r   r   test_joinall_count_raise_errorF  s   



z(TestStuff.test_joinall_count_raise_errorc                    s   t dd }g   fdd} fdd}dd }|| || || ttd	  |  d	d
gd
d	gg t dd }g  || || || ttd	  |  d	d
gd
d	gg d S )Nc                   S   r+   N   r   r   r   r   r   r.   `  r/   z9TestStuff.test_multiple_listeners_error.<locals>.<lambda>c                          d td)Nrg   	listener1appendr   _argsrM   r   r   r   c     
z:TestStuff.test_multiple_listeners_error.<locals>.listener1c                     r   )N   	listener2r   r   r   r   r   r   g  r   z:TestStuff.test_multiple_listeners_error.<locals>.listener2c                  W   r   N	listener3r   r   r   r   r   r   k  r   z:TestStuff.test_multiple_listeners_error.<locals>.listener3rg   r   c                   S   r   )Ntest_multiple_listeners_errorr   r   r   r   r   r.   t  r   )r   r1   r2   r   rl   assertIn)r"   r6   r   r   r   r   r   r   r   [  s"   





z'TestStuff.test_multiple_listeners_errorc                   @   r)   )
zTestStuff.Resultsc                 C   s
   g | _ d S r(   r   ru   r   r   r   __init__~     
zTestStuff.Results.__init__c                 C       | | j | jd td)Nr   r   )rR   r   rM   r   r   rV   r   r   r   r        zTestStuff.Results.listener1c                 C   r   )Nr   r   )rR   r   rM   r   r   rV   r   r   r   r     r   zTestStuff.Results.listener2c                 C   r   r   r   )r"   _pr   r   r   r     r   zTestStuff.Results.listener3N)r   r   r   r   r   r   r   r   r   r   r   Results|  s
    r   c                 C   sF   |   }||j ||j ||j ttd  | dg|j d S )Nrg   r   )r   r   r   r   r   rl   r3   rM   )r"   r   r2   rM   r   r   r   %_test_multiple_listeners_error_unlink  s   


z/TestStuff._test_multiple_listeners_error_unlinkc                 C   s(   t dd }| ||j |  d S )Nc                   S   r+   r   r   r   r   r   r   r.     r/   zNTestStuff.test_multiple_listeners_error_unlink_Greenlet_link.<locals>.<lambda>)r   r1   r   r2   r%   rV   r   r   r   2test_multiple_listeners_error_unlink_Greenlet_link  s   z<TestStuff.test_multiple_listeners_error_unlink_Greenlet_linkc                 C   s    t dd }| ||j d S )Nc                   S   r+   r   r   r   r   r   r   r.     r/   zQTestStuff.test_multiple_listeners_error_unlink_Greenlet_rawlink.<locals>.<lambda>)r   r1   r   rawlinkrV   r   r   r   5test_multiple_listeners_error_unlink_Greenlet_rawlink  s   z?TestStuff.test_multiple_listeners_error_unlink_Greenlet_rawlinkc                 C   s&   t  }t|jd | ||j d S )N   )r   r   r1   setr   r   )r"   r   r   r   r   8test_multiple_listeners_error_unlink_AsyncResult_rawlink  s   zBTestStuff.test_multiple_listeners_error_unlink_AsyncResult_rawlinkN)r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r   r   r   r   r     s    

!r   c                  G      d S r(   r   r   r   r   r   rP     rr   rP   c                   @      e Zd Zdd ZdS )Ac                 C   r   r(   r   ru   r   r   r   method  rr   zA.methodN)r   r   r   r   r   r   r   r   r         r   c                   @   r   )SubclassNr   r   r   r   r   r     r   r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )TestStrc                 C   sD   t jt}| |d | | |  | | | |d d S )Nzat X: dummy_test_func>)r   r   r1   rP   assert_nstr_endswithr   r    r   r   r   r   r   test_function  s   

zTestStr.test_functionc                 C   s|   t jt j}| |d t|d | |d d|_| |d | |d | 	| |
  | | | |d d S )Nz<Greenlet at X:namez<Greenlet "Greenlet-Fooz<Greenlet "Foo"z8at X: <bound method A.method of <module.A object at X>>>)r   r   r1   r   r   assert_nstr_startswithr_   r   r   r   r    r   r   r   r   r   test_method  s   


zTestStr.test_methodc                 C   s<   t  }| |d | |d t d ddd}| |d d S )Nz
<Subclass zat X: _run>question*   )answerz# at X: _run('question', answer=42)>)r   r   r   r   r   r   r   test_subclass  s
   zTestStr.test_subclassN)r   r   r   r   r   r   r   r   r   r   r     s    	r   c                   @   r   )TestJoinc                 C   0   t t jd}z|j|dW |  S |  w Nrg   r#   )r   r1   r   r    r%   r"   r#   r   r   r   r   wait     zTestJoin.waitNr   r   r   r   r   r   r   r   r     r   r   c                   @   r   )TestGetc                 C   r   r   )r   r1   r   r4   r%   r   r   r   r   r     r   zTestGet.waitNr   r   r   r   r   r     r   r   c                   @   s   e Zd Ze Zdd ZdS )TestJoinAll0c                 C   s   t j| jg|d d S )Nr   )r   r   r   r!   r   r   r   r        zTestJoinAll0.waitN)r   r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   r   )TestJoinAllc                 C   s8   t t jd}zt j|g|d W |  d S |  w r   )r   r1   r   r   r%   r   r   r   r   r     s   zTestJoinAll.waitNr   r   r   r   r   r     r   r   c                   @   sn   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	
ddd Zdd Zdd Zdd Zdd ZdS )	TestBasicc                 C   sF   |  ttjd |  ttjd |  ttjd |  ttjdd d S r   )r?   	TypeErrorr   r1   	spawn_rawspawn_laterru   r   r   r   test_spawn_non_callable  s   z!TestBasic.test_spawn_non_callablec                    s\   g   fdd}t j|ddd}t d | | |  d d |  d d	di d S )
Nc                     s     |    | d S r(   r   )r&   r'   r   r   r   f  s   
z*TestBasic.test_spawn_raw_kwargs.<locals>.fr   r   )r   {Gz?r   )r   r   )r   r   r   r{   r3   )r"   r   r   r   r   r   test_spawn_raw_kwargs  s   

zTestBasic.test_spawn_raw_kwargsc                 C   s  g }d	dd}t j|ddd}||j | || | |j| | |j| | | | | | | | 	|j
| | 	|j| |  | || | |j| | |j| | | | | | | | 	|j
| | 	|j| t d | | | |j| | |j| | | | | | | | 	|j
| | 	|j| | | t d | || | |j| | |j| | | | | | | | |j
d | 	|j| | || d S )
N   c                 S   s   t |  |S r(   )r   r   )delayreturn_valuer   r   r   func  s   
z(TestBasic.test_simple_exit.<locals>.funcr   r   r   gMbP?g{Gz?r   )r   r   r   r   r{   deadstartedready
successfulassertIsNoner   rA   start
assertTruer   r3   _check_flaky_eqr"   	link_testr   r   r   r   r   test_simple_exit  sJ   




zTestBasic.test_simple_exitc                 C   s   t js| ||g d S d S r(   )	greentestRUNNING_ON_CIr3   )r"   r  r   r   r   r   r  H  s   zTestBasic._check_flaky_eqc                 C   s   g }ddd}t j|tjdd}||j |  t   t tj | 	| | 
|j | 	|j | 
|  | 	|  | |j | |jjd | || d S )Nr   c                 S   s"   t |  td}t|d| |)Ntest_error_exitmyattr)r   r   r   setattr)r   r   errorr   r   r   r   Q  s   
z'TestBasic.test_error_exit.<locals>.funcr   r   r   )r   r   r   SMALLEST_RELIABLE_DELAYr   r   r  r   
LARGE_TICKr{   r  r   r   r  r  r  r   r3   rA   r  r  r  r   r   r   r  N  s   

zTestBasic.test_error_exitc                 C   s<   |  t j ttj}|  |  |  |j d S r(   )r{   r   r   exc_infor   r   r  r    r   r   r   r   test_exc_info_no_errorf  s
   z TestBasic.test_exc_info_no_errorzStarted getting a Fatal Python error on Github Actions on 2020-12-18, even with recursion limits in place. It was fine before that.c                    sR  dd l }| }| |j| ||d  fddg   fdd}z!|t _tfdd}t|}t|g W t `nt `w zt	}W n t
yZ   t}Y nw | |   W d    n1 sow   Y  |   | j |   | d	t  |  d d  |  d d	 |  d d = d S )
Nr   r   c                      s
      d S r(   r   r   )recurr   r   r    r   z-TestBasic.test_recursion_error.<locals>.recurc                    s     | |||f d S r(   r   )glettvtb)errorsr   r   handle_error  r   z4TestBasic.test_recursion_error.<locals>.handle_errorc                      s   t  gS r(   )r   r   r   )r   r   r   r        z,TestBasic.test_recursion_error.<locals>.waitr   )sysgetrecursionlimit
addCleanupsetrecursionlimitr   get_hubr  r1   r   RecursionError	NameErrorRuntimeErrorr?   r4   r{   r  r  r   r3   lenr@   )r"   r  limitr  r   g2expected_excr   )r  r   r  r   test_recursion_errorn  s:   




zTestBasic.test_recursion_errorc                    s   d  }} fdd}t |}t |} tt dt   |j|j |  |  t	
|} |j  |j|j  | t  |jsXt	d |jrNd S d S )Nc                     s0   t  }  | jt j  |  t  d S r(   )r   r   r@   spawn_tree_localsr   spawning_greenlet)childru   r   r   r     s   z(TestBasic.test_tree_locals.<locals>.funcr)  r   )r   r   r{   hasattrr   assertIsNotr)  r  r    r   r   assertIsNotNoner@   r*  r   r   )r"   r   r&  r   rawr   ru   r   test_tree_locals  s"   



zTestBasic.test_tree_localsc              	      s0  ddi  fdd}t j| zt dd }| t|d |  |  d d t d	d
d }| t|d |  |  d d t dd }|	  | t|d |  |  d d t j
| t dd }| t|d |  |  d d W t j
| d S t j
| w )N#r   c                    s    d  d7  < d| _ d S )Nr1  r   T)_called_test)grcalledr   r   cb  s   
z-TestBasic.test_add_spawn_callback.<locals>.cbc                   S   r   r(   r   r   r   r   r   r.     r/   z3TestBasic.test_add_spawn_callback.<locals>.<lambda>r2  r   gh㈵>c                   S   r   r(   r   r   r   r   r   r.     r/   rz   c                   S   r   r(   r   r   r   r   r   r.     r/   r0   c                   S   r   r(   r   r   r   r   r   r.     r/   )r   r   add_spawn_callbackr1   r  r,  r    r3   r   r  remove_spawn_callbackr{   )r"   r6  r   r   r4  r   test_add_spawn_callback  s.   z!TestBasic.test_add_spawn_callbackc                 C   s\   dd }zt j}W n ty   tdw |t _zt  }| |j W |t _d S |t _w )Nc                   S   r   )Nzcall stack is not deep enough)
ValueErrorr   r   r   r   r4     r   z0TestBasic.test_getframe_value_error.<locals>.getz Cannot mock when Cython compiled)r   sys_getframeAttributeErrorunittestSkipTestr   r  spawning_stack)r"   r4   ogfr+  r   r   r   test_getframe_value_error  s   

z#TestBasic.test_getframe_value_errorc                 C   s   t dd }| |jt   t |_z>| |jt   | tt	fd t
|d W d    n1 s6w   Y  W t  |_|  d S W t  |_|  d S t  |_|  w )Nc                   S   r+   r   r   r   r   r   r   r.     r/   z=TestBasic.test_minimal_ident_parent_not_hub.<locals>.<lambda>zCannot convert|ident_registryr   )r   r1   r@   r   r   r   r-  r   r   r<  r_   r%   r   r   r   r   !test_minimal_ident_parent_not_hub  s&   



z+TestBasic.test_minimal_ident_parent_not_hubN)r   r   r   r   r   r	  r  r  r  r
  skipOnCIr(  r0  r9  rA  rB  r   r   r   r   r     s    	/
4!r   c                       s   e Zd Z fddZdd Zd)ddZd*d	d
Zedd Zdd Z	e	Z
d*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  ZS )+TestKillc                    s:   t    t }tj|ddd}|  | |j d S )Nprint_exceptionT)autospec)	superrS   r   r   Patchr   r  r  stop)r"   hubpatcher	__class__r   r   rS     s
   
zTestKill.setUpc                 C   s   |  | | |j |  |j | |  |r9| | t||j|jf | 	|jt
j | |j d S |  | t||j|jf | |jt
j | |j d S r(   )r{   r  r   r   r  r  reprr   rA   r~   r   r   r  assertNotIsInstancer.  r"   r   r  r   r   r   __assertKilled  s   
zTestKill.__assertKilledTc                 C   s&   |  || td |  || d S Nr   )_TestKill__assertKilledr   r   rP  r   r   r   assertKilled  s   
zTestKill.assertKilledNc                 C   s   |d u rt j}|rtjt j|g||d}n	tj|j||d}|  |s)t tj |d u p7t	|t
o7t|t j}| || |  | || d S )N)rA   block)r   r   	functoolspartialkillallr%   r   r   r  
isinstancetype
issubclassrT  )r"   r   rU  rX  rB   killerr  r   r   r   __kill_greenlet  s   zTestKill.__kill_greenletc                 C   s   |  d d S r   r   result_collectorr   r   r   _run_in_greenlet2  s   zTestKill._run_in_greenletc                 C   r+   )zU
        Subclasses should override. This doesn't actually start a greenlet.
        Nr   r   r   r   r   _start_greenlet6  r/   zTestKill._start_greenletc                 C   sb   g }g }t | j|}||j | | | |||| | | | | | 	||g d S r(   )
r   r   r`  r2   r   ra  _TestKill__kill_greenlet_after_kill_greenletr{   r3   )r"   rU  rX  rB   r  r|   r   r   r   r   _do_test>  s   


zTestKill._do_testc                 C      | j ddd d S )NTFrU  rX  rd  ru   r   r   r   
test_blockM     zTestKill.test_blockc                 C      | j ddd d S )NFrf  rg  ru   r   r   r   test_non_blockP  ri  zTestKill.test_non_blockc                 C   rj  )NTrf  rg  ru   r   r   r   test_block_killallS  ri  zTestKill.test_block_killallc                 C   re  )NFTrf  rg  ru   r   r   r   test_non_block_killalV  ri  zTestKill.test_non_block_killalc                 C      | j ddt d d S )NTFrU  rX  rB   rd  	Exceptionru   r   r   r   test_non_type_exceptionY  r   z TestKill.test_non_type_exceptionc                 C      | j ddt d d S )NFro  rp  ru   r   r   r   !test_non_type_exception_non_block\  r   z*TestKill.test_non_type_exception_non_blockc                 C   rs  )NTro  rp  ru   r   r   r   test_non_type_exception_killall_  r   z(TestKill.test_non_type_exception_killallc                 C   rn  )NFTro  rp  ru   r   r   r   )test_non_type_exception_killall_non_blockb  r   z2TestKill.test_non_type_exception_killall_non_blockc                 C      | j dddd d S )NTFr   ro  rg  ru   r   r   r   test_non_exc_exceptione  rb   zTestKill.test_non_exc_exceptionc                 C      | j dddd d S )NFr   ro  rg  ru   r   r   r    test_non_exc_exception_non_blockh  rb   z)TestKill.test_non_exc_exception_non_blockc                 C   ry  )NTr   ro  rg  ru   r   r   r   test_non_exc_exception_killallk  rb   z'TestKill.test_non_exc_exception_killallc                 C   rw  )NFTr   ro  rg  ru   r   r   r   (test_non_exc_exception_killall_non_blockn  rb   z1TestKill.test_non_exc_exception_killall_non_block)Tr(   )r   r   r   rS   rS  rT  rb  staticmethodr`  ra  rc  rd  rh  rk  rl  rm  rr  rt  ru  rv  rx  rz  r{  r|  __classcell__r   r   rL  r   rD    s,    



rD  c                   @   r   )TestKillAfterStartc                 C   s   |   d S r(   )r  r   r   r   r   ra  t  r  z"TestKillAfterStart._start_greenletNr   r   r   ra  r   r   r   r   r  r  r   r  c                   @   r   )TestKillAfterStartLaterc                 C   s   | tj d S r(   )start_laterr   r  r   r   r   r   ra  y  s   z'TestKillAfterStartLater._start_greenletNr  r   r   r   r   r  w  r   r  c                   @   s    e Zd Zedd Zdd ZdS )TestKillWhileRunningc                 C   s   t d t|  d S )Nrg   )r   r   rD  r`  r^  r   r   r   r`  ~  s   
z%TestKillWhileRunning._run_in_greenletc                 C   s   t | | td d S rR  )rD  rc  r   r   r   r   r   r   rc    s   z)TestKillWhileRunning._after_kill_greenletN)r   r   r   r}  r`  rc  r   r   r   r   r  |  s    
r  c                   @   r   )TestKillallRawGreenletc                 C   s   t dd }t |g d S )Nc                   S   r+   r   r   r   r   r   r   r.     r/   z9TestKillallRawGreenlet.test_killall_raw.<locals>.<lambda>)r   r   rX  r   r   r   r   test_killall_raw  s   z'TestKillallRawGreenlet.test_killall_rawN)r   r   r   r  r   r   r   r   r    r   r  c                   @   sJ   e Zd Zdd Zdd Zedd Zdd Zd	d
 ZdddZ	dd Z
dS )TestContextManagerc                 C   sH   t t jtj}| | W d    n1 sw   Y  | | d S r(   )r   r1   r   r   
SMALL_TICKassert_greenlet_spawnedassert_greenlet_finishedr   r   r   r   test_simple  s   zTestContextManager.test_simplec              	   C   sn   t | j"}| tj |  W d    n1 sw   Y  W d    n1 s+w   Y  | | d S r(   )r   r1   _raise_exceptionr?   r
  ExpectedExceptionr4   r  r   r   r   r   test_wait_in_suite  s   
z%TestContextManager.test_wait_in_suitec                   C   s   t jr(   )r
  r  r   r   r   r   r    s   z#TestContextManager._raise_exceptionc                 C   sp   t | j}W d    n1 sw   Y  | | | tj |  W d    d S 1 s1w   Y  d S r(   )r   r1   r  r  r?   r
  r  r4   r   r   r   r   test_greenlet_raises  s   

"z'TestContextManager.test_greenlet_raisesc              	   C   s   d}|  t' ttjtj}| | d}W d    n1 s"w   Y  W d    n1 s1w   Y  | 	| | 
| | 	|j d S )Nr   r   )r?   r   r   r1   r   r   r   r  r  r  r  r$   )r"   	suite_ranr   r   r   r   test_join_raises  s   


z#TestContextManager.test_join_raisesNc              	   C   s   |st jnt j}| t) ttj|}| 	| |r%d|_
t| t1 s*w   Y  W d    n1 s9w   Y  | | | |j |rR| |j n| |j | |  | t |  W d    d S 1 stw   Y  d S NF)r   r  r  r?   r   r   r1   r   r   r  r   r  r  r$   r   r{   r  r4   )r"   r   greenlet_sleepr   r   r   r   test_suite_body_raises  s&   



"z)TestContextManager.test_suite_body_raisesc                 C   s   | j tjd d S )N)r   )r  r   r  ru   r   r   r   !test_suite_body_raises_with_delay  ri  z4TestContextManager.test_suite_body_raises_with_delayr(   )r   r   r   r  r  r}  r  r  r  r  r  r   r   r   r   r    s    

r  c                   @   r   )	TestStartc                 C   sT   t t jtj}| | |  | | |  | 	| |  | 	| d S r(   )
r   r1   r   r   r  r  r  assert_greenlet_startedr    r  r   r   r   r   
test_start  s   


zTestStart.test_startN)r   r   r   r  r   r   r   r   r    r   r  c                   @   r   )TestRefc                 C   s   d| _ t  d S r  )r]   r   r   ru   r   r   r   	test_init  s   zTestRef.test_initc                 C   s   t t jtj  d S r(   )r   r1   r   r   r  r%   ru   r   r   r   test_kill_scheduled  s   zTestRef.test_kill_scheduledc                 C   s6   t t jtj}zt tj W |  d S |  w r(   )r   r1   r   r   r  r  r%   r   r   r   r   test_kill_started  s   zTestRef.test_kill_startedN)r   r   r   r  r  r  r   r   r   r   r    s    r  zNeeds C extensionc                   @   r   )TestCExtc                 C   $   |  tjjd |  tjjd d S )Nzgevent._gevent_cgreenletr3   r   r   r   SpawnedLinkru   r   r   r   test_c_extension     

zTestCExt.test_c_extensionN)r   r   r   r  r   r   r   r   r        r  zNeeds pure pythonc                   @   r   )TestPurec                 C   r  )Nzgevent.greenletr  ru   r   r   r   	test_pure  r  zTestPure.test_pureN)r   r   r   r  r   r   r   r   r    r  r  __main__)CrV  r=  unittest.mockr   rH  gevent.testingtestingr
  r   r   r   r   r   gevent.eventr   gevent.queuer   r	   gevent.testing.timingr
   r   r   r   r  rl   TestCaseerror_fatalr  r   r   r   r   r   r*   rO   r^   rq   rs   r   r   r   r   rP   r   r   r   r   r   r   r   r   r   rD  r  r  r  r  r  r  r  skipOnPurePythonr  skipWithCExtensionsr  rm   r   mainr   r   r   r   <module>   st   4'7 &


  p=	
