B
    H/\a                 @   s\  d dl Z d dl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 ejZd	ej_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$e %d"e j&Z'G d#d$ d$ej(Z)G d%d& d&ej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/d0 d0ejZ/G d1d2 d2ejZ0d3d4 Z1d5d6 Z2G d7d8 d8ejZ3e4d9G d:d; d;ejZ5e6d<G d=d> d>ejZ7e# Z8[[e9d?krXe:  dS )@    N)sleepwith_timeout
getcurrent)greenlet)AsyncResult)QueueChannel)AbstractGenericWaitTestCase)AbstractGenericGetTestCase)timingFc               @   s   e Zd ZdS )ExpectedErrorN)__name__
__module____qualname__ r   r   :lib/python3.7/site-packages/gevent/tests/test__greenlet.pyr   (   s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestLinkc             C   sd   t dd }t }|| | | d x0tdD ]$}t }|| | | d q8W d S )Nc               S   s   dS )Nd   r   r   r   r   r   <lambda>/   s    z3TestLink.test_link_to_asyncresult.<locals>.<lambda>r      )geventspawnr   linkassertEqualgetrange)selfpevent_event2r   r   r   test_link_to_asyncresult.   s    

z!TestLink.test_link_to_asyncresultc          
      s   t d t fdd}t }|| | t }|  W d Q R X | |j  xLt	dD ]@}t }|| | t }|  W d Q R X | |j  q`W d S )N"test_link_to_asyncresult_exceptionc                  s   t   S )N)r   throwr   )errr   r   r   ;   s    z=TestLink.test_link_to_asyncresult_exception.<locals>.<lambda>r   )
r   r   r   r   r   assertRaisesr   assertIs	exceptionr   )r   r   r   excr   r    r   )r$   r   r"   9   s    

z+TestLink.test_link_to_asyncresult_exceptionc             C   sj   t dd }t }||j | |  d x0tdD ]$}||j | |  d q>W d S )Nc               S   s   dS )Nr   r   r   r   r   r   r   K   s    z-TestLink.test_link_to_queue.<locals>.<lambda>r   r   )r   r   r   r   putr   r   r   )r   r   qr   r   r   r   test_link_to_queueJ   s    zTestLink.test_link_to_queuec             C   s   t dd }t dd }t dd }t }||j ||j ||j |  |  |  g}t|dddgkst|d S )Nc               S   s   dS )Ne   r   r   r   r   r   r   U   s    z/TestLink.test_link_to_channel.<locals>.<lambda>c               S   s   dS )Nf   r   r   r   r   r   r   V   s    c               S   s   dS )Ng   r   r   r   r   r   r   W   s    r,   r-   r.   )r   r   r   r   r)   r   sortedAssertionError)r   Zp1Zp2Zp3r*   resultsr   r   r   test_link_to_channelT   s    "zTestLink.test_link_to_channelN)r   r   r   r!   r"   r+   r2   r   r   r   r   r   ,   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 )N   r   )dummy_test_funcr   Z	has_linksunlinkZsetUpkill)r   r   r   r   r   r   
_test_funcc   s    

zTestUnlink._test_funcc             C   s   t t}| ||j d S )N)r   r   r5   r8   r   )r   r   r   r   r   test_func_linkr   s    
zTestUnlink.test_func_linkc             C   s   t t}| ||j d S )N)r   r   r5   r8   
link_value)r   r   r   r   r   test_func_link_valuev   s    
zTestUnlink.test_func_link_valuec             C   s   t t}| ||j d S )N)r   r   r5   r8   link_exception)r   r   r   r   r   test_func_link_exceptionz   s    
z#TestUnlink.test_func_link_exceptionN)r   r   r   switch_expectedr8   r9   r;   r=   r   r   r   r   r3   `   s
   r3   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 )N)getattrlink_method)r   r   Zlistenerr   r   r   r      s    zLinksTestCase.linkc                s~   t  }| || td}| ||j dg | | fdd x0tdD ]$}| |t   | |tdj qLW || fS )Nr4   initialc                 s
     dS )NrB   )remove)args)callback_flagr   r   r      s    z)LinksTestCase.set_links.<locals>.<lambda>
   )r   r   r   r)   r   )r   r   r   queuer   r   )rE   r   	set_links   s    zLinksTestCase.set_linksc             C   s&   t  }|| t }||j ||fS )N)r   r   r)   )r   r   r   rG   r   r   r   set_links_timeout   s
    
zLinksTestCase.set_links_timeoutc             C   sH   t t|jtdtks$tt| t t|jtdtksDt| d S )N)Ztimeout_value)r   DELAYr   Xr0   repr)r   r   rG   r   r   r   check_timed_out   s    $zLinksTestCase.check_timed_out)N)r   r   r   rA   r   rH   rI   rM   r   r   r   r   r?      s
   
	r?   c               C   s   dS )N   r   r   r   r   r   return25   s    rO   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_linkr   Nc             C   s   | j   d | _ d S )N)r   Z
unlink_all)r   r   r   r   cleanup   s    
zTestReturn_link.cleanupc             C   s:   t t| _xtdD ]}| | jd qW | j  d S )Nr   rN   )r   r   rO   r   r   _test_returnr7   )r   r   r   r   r   test_return   s    zTestReturn_link.test_returnc             C   sv   |  |\}}}| |j}ttd  | | | | | | |  | tt | | | j|  d S )N   )	rH   rI   r<   r   rJ   assertFalser   r   rM   )r   r   resultr   rG   rE   xxxxxr   r   r   rR      s    

zTestReturn_link._test_returnc             C   s~   |  |\}}}| |j}|  tt | | | | t	j
 | |  t	j
 tt | | | j|  d S )N)rH   rI   r<   r7   r   rJ   rU   ZassertIsInstancer   r   GreenletExitrM   )r   r   r   rG   rE   rW   r   r   r   
_test_kill   s    

zTestReturn_link._test_killc             C   s2   t tt }| _xtdD ]}| | qW d S )Nr   )r   r   r   rJ   r   r   rY   )r   r   r   r   r   r   	test_kill   s    zTestReturn_link.test_kill)
r   r   r   rA   r   rQ   rS   rR   rY   rZ   r   r   r   r   rP      s   rP   c               @   s   e Zd ZdZdS )TestReturn_link_valuer:   N)r   r   r   rA   r   r   r   r   r[      s   r[   c               @   s    e Zd ZdZdd Zdd ZdS )TestRaise_linkr   c             C   sp   |  |\}}}| |j}tt |r0t|| t|j | 	| | tt |rbt|| j
|  d S )N)rH   rI   r:   r   rJ   r0   r%   r   r   r   rM   )r   r   r   rG   rE   rW   r   r   r   _test_raise   s    zTestRaise_link._test_raisec             C   s.   t dd }xtdD ]}| | qW d S )Nc               S   s   t  tdS )N
test_raise)r   r#   r   r   r   r   r   r      s    z+TestRaise_link.test_raise.<locals>.<lambda>r   )r   r   r   r]   )r   r   r   r   r   r   r^      s    zTestRaise_link.test_raiseN)r   r   r   rA   r]   r^   r   r   r   r   r\      s   r\   c               @   s   e Zd ZdZdS )TestRaise_link_exceptionr<   N)r   r   r   rA   r   r   r   r   r_      s   r_   c               @   sx   e Zd Zdd Zdd Zdd Zde_dd	 Zde_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   s   dS )Nr4   r   r   r   r   r   r     s    z+TestStuff.test_minimal_id.<locals>.<lambda>r   )r   r   ZassertGreaterEqualZminimal_identparentjoin)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ddd	g t }|| | | d || t }|| | | d d S )
Nc               S   s   dS )Nr4   r   r   r   r   r   r     s    z.TestStuff.test_wait_noerrors.<locals>.<lambda>c               S   s   dS )NrT   r   r   r   r   r   r   	  s    c               S   s   dS )Nr   r   r   r   r   r   r   
  s    T)raise_errorr4   rT   r   )	r   r   joinallr   valuer   r   r   r6   )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 )Nr4   )r   rJ   r   r   r   r   rh     s    z$TestStuff.test_wait_error.<locals>.xc               S   s   t  tdS )Ntest_wait_error)r   r#   r   r   r   r   r   r     s    z+TestStuff.test_wait_error.<locals>.<lambda>T)re   )r   r   r%   r   rf   rb   )r   rh   ri   r   r   r   rm     s    
zTestStuff.test_wait_errorTc          
   C   s   dd }t |}t dd }yt j||gdd W n> tk
rt } z dt|ksdttt|W d d }~X Y nX t ||g d S )Nc               S   s   t d tdd S )Ng?first)r   r   r   r   r   r   rn   #  s    z5TestStuff.test_joinall_exception_order.<locals>.firstc               S   s   t  tdS )Nsecond)r   r#   r   r   r   r   r   r   '  s    z8TestStuff.test_joinall_exception_order.<locals>.<lambda>T)re   ro   )r   r   rf   r   strr0   rL   )r   rn   abexr   r   r   test_joinall_exception_order!  s    
.z&TestStuff.test_joinall_exception_orderc             C   s\   dd }dd }t |}t |}t j||gddd t| t| |  t| d S )Nc               S   s   t dd S )Ncount)r   r   r   r   r   raises_but_ignored2  s    zDTestStuff.test_joinall_count_raise_error.<locals>.raises_but_ignoredc               S   s   xt d qW d S )Ng?)r   r   r   r   r   sleep_forever5  s    z?TestStuff.test_joinall_count_raise_error.<locals>.sleep_foreverFr4   )re   ru   )r   r   rf   assert_readyassert_not_readyr7   )r   rv   rw   ZsleeperZraiserr   r   r   test_joinall_count_raise_error/  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   s   dS )N   r   r   r   r   r   r   I  s    z9TestStuff.test_multiple_listeners_error.<locals>.<lambda>c                 s     d tdd S )NrF   	listener1)appendr   )_args)r1   r   r   r|   L  s    
z:TestStuff.test_multiple_listeners_error.<locals>.listener1c                 s     d tdd S )N   	listener2)r}   r   )r~   )r1   r   r   r   P  s    
z:TestStuff.test_multiple_listeners_error.<locals>.listener2c              W   s   t dd S )N	listener3)r   )r~   r   r   r   r   T  s    z:TestStuff.test_multiple_listeners_error.<locals>.listener3rF   r   c               S   s   t  tdS )Ntest_multiple_listeners_error)r   r#   r   r   r   r   r   r   ]  s    )r   r   r   r   rJ   ZassertIn)r   r   r|   r   r   r   )r1   r   r   D  s"    





z'TestStuff.test_multiple_listeners_errorc               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
zTestStuff.Resultsc             C   s
   g | _ d S )N)r1   )r   r   r   r   __init__g  s    zTestStuff.Results.__init__c             C   s$   | | j | jd tdd S )Nr{   r|   )r6   r   r1   r}   r   )r   r   r   r   r   r|   j  s    zTestStuff.Results.listener1c             C   s$   | | j | jd tdd S )Nr{   r   )r6   r|   r1   r}   r   )r   r   r   r   r   r   o  s    zTestStuff.Results.listener2c             C   s   t dd S )Nr   )r   )r   _pr   r   r   r   t  s    zTestStuff.Results.listener3N)r   r   r   r   r|   r   r   r   r   r   r   Resultse  s   r   c             C   sF   |   }||j ||j ||j ttd  | dg|j d S )NrF   r{   )r   r|   r   r   r   rJ   r   r1   )r   r   r   r1   r   r   r   %_test_multiple_listeners_error_unlinkw  s    


z/TestStuff._test_multiple_listeners_error_unlinkc             C   s(   t dd }| ||j |  d S )Nc               S   s   dS )Nr{   r   r   r   r   r   r     s    zNTestStuff.test_multiple_listeners_error_unlink_Greenlet_link.<locals>.<lambda>)r   r   r   r   r7   )r   r   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   s   dS )Nr{   r   r   r   r   r   r     s    zQTestStuff.test_multiple_listeners_error_unlink_Greenlet_rawlink.<locals>.<lambda>)r   r   r   rawlink)r   r   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   r   setr   r   )r   rk   r   r   r   8test_multiple_listeners_error_unlink_AsyncResult_rawlink  s    zBTestStuff.test_multiple_listeners_error_unlink_AsyncResult_rawlinkN)r   r   r   rd   rl   rm   Zignore_leakcheckrt   rz   r   objectr   r   r   r   r   r   r   r   r   r`      s   
!r`   c              G   s   d S )Nr   )r~   r   r   r   r5     s    r5   c               @   s   e Zd Zdd ZdS )Ac             C   s   d S )Nr   )r   r   r   r   method  s    zA.methodN)r   r   r   r   r   r   r   r   r     s   r   z-?0x[0123456789abcdef]+L?c               @   s   e Zd ZdS )SubclassN)r   r   r   r   r   r   r   r     s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )TestStrc             C   sf   t jt}| tdt|d t	| |
  t| | tdt|dt| d S )NrK   zat X: dummy_test_func>z at X: dummy_test_func>)r   Greenletr   r5   
assertTruehexobjsubrp   endswithry   rb   rx   )r   rc   r   r   r   test_function  s    zTestStr.test_functionc             C   s  t jt j}tdt|}|t	d}| 
|d| t|d tdt|}|t	d}| 
|d| d|_tdt|}|t	d}| 
|d| | 
|d t| |  t| tdt|}|t	d}| 
|d d S )	NrK   modulez<Greenlet at X:namez<Greenlet "Greenlet-ZFooz<Greenlet "Foo"z8at X: <bound method A.method of <module.A object at X>>>)r   r   r   r   r   r   r   rp   replacer   r   
startswithr@   r   r   ry   rb   rx   )r   rc   str_gr   r   r   test_method  s&    
zTestStr.test_methodc             C   s   t  }tdt|}|td}| |d| | |d t d ddd}tdt|}|td}| |d d S )	NrK   r   z
<Subclass zat X: _run>Zquestion*   )Zanswerz# at X: _run('question', answer=42)>)	r   r   r   rp   r   r   r   r   r   )r   rc   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               @   s   e Zd Zdd ZdS )TestJoinc             C   s*   t t jd}z|j|dS |  X d S )NrF   )timeout)r   r   r   rb   r7   )r   r   rc   r   r   r   wait  s    zTestJoin.waitN)r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )TestGetc             C   s*   t t jd}z|j|dS |  X d S )NrF   )r   )r   r   r   r   r7   )r   r   rc   r   r   r   r     s    zTestGet.waitN)r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Ze Zdd ZdS )TestJoinAll0c             C   s   t j| jg|d d S )N)r   )r   rf   rc   )r   r   r   r   r   r     s    zTestJoinAll0.waitN)r   r   r   r   r   rc   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )TestJoinAllc             C   s2   t t jd}zt j|g|d W d |  X d S )NrF   )r   )r   r   r   rf   r7   )r   r   rc   r   r   r   r     s    zTestJoinAll.waitN)r   r   r   r   r   r   r   r   r     s   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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/S )0	TestBasicc             C   sF   |  ttjd |  ttjd |  ttjd |  ttjdd d S )Nr4   )r%   	TypeErrorr   r   	spawn_rawspawn_later)r   r   r   r   test_spawn_non_callable  s    z!TestBasic.test_spawn_non_callablec                sZ   g   fdd}t j|ddd}t d |r2t|  d d |  d d	di d S )
Nc                 s     |    | d S )N)r}   )rD   kwargs)rg   r   r   f  s    
z*TestBasic.test_spawn_raw_kwargs.<locals>.fr4   rg   )r   g{Gz?r   )r4   r   )r   r   r   r0   r   )r   r   rc   r   )rg   r   test_spawn_raw_kwargs   s    
zTestBasic.test_spawn_raw_kwargsc             C   s  g }d	dd}t j|ddd}||j |r:tt||jrDt|jrNt| rZt|	 rft|j
d kstt|jd kst|  |st|jrt|jst| rt|	 rt|j
d kst|jd kstt d | | | |j| | |j| | | | | |	 | | |j
| | |j| | | t d |rdt|jspt|jr|t| st|	 st|j
dkst|jd kst||gkstjst|d S )
N   c             S   s   t |  |S )N)r   r   )delayreturn_valuer   r   r   func  s    
z(TestBasic.test_simple_exit.<locals>.funcg{Gz?r{   )r   gMbP?g{Gz?)r   )r   r   r   r}   r0   booldeadstartedready
successfulrg   r'   startr   r   rU   assertIsNone	greentestZRUNNING_ON_CI)r   	link_testr   rc   r   r   r   test_simple_exit  sJ    









zTestBasic.test_simple_exitc             C   s   g }ddd}t j|tjdd}||j |  t   t tj | 	| | 
|j | 	|j | 
|  | 	|  | |j | |jjd ||gkstjst|d S )Nr   c             S   s&   t |  td}t|d| |d S )Ntest_error_exitmyattr)r   r   r   setattr)r   r   errorr   r   r   r   >  s    
z'TestBasic.test_error_exit.<locals>.funcr{   )r   )r   )r   r   r   ZSMALLEST_RELIABLE_DELAYr   r}   r   r   Z
LARGE_TICKrU   r   r   r   r   r   r   rg   r   r'   r   r   ZRUNNING_ON_APPVEYORr0   )r   r   r   rc   r   r   r   r   ;  s    

zTestBasic.test_error_exitc             C   s|   |rt |jst |jrt | s(t | sFt t||j|jft|jt	j
sjt t||j|jf|jd ksxt d S )N)r0   r   r   r   r   rL   rg   r'   
isinstancer   rX   )r   rc   r   r   r   _assertKilledT  s    

$zTestBasic._assertKilledc             C   s"   |  | td |  | d S )Ng{Gz?)r   r   r   )r   rc   r   r   r   assertKilled]  s    

zTestBasic.assertKilledc             C   s>   |j |d |std | | |j |d | | d S )N)blockg{Gz?)r7   r   r   r   )r   rc   r   r   r   r   rY   b  s    

zTestBasic._test_killc                sN   g }g  t  fdd}||j | j||d  r<t||gksJtd S )Nc                  s
     dS )Nr4   )r}   r   )rV   r   r   r   n  s    z2TestBasic._test_kill_not_started.<locals>.<lambda>)r   )r   r   r   r}   rY   r0   )r   r   r   rc   r   )rV   r   _test_kill_not_startedk  s    z TestBasic._test_kill_not_startedc             C   s   | j dd d S )NT)r   )r   )r   r   r   r   test_kill_not_started_blockt  s    z%TestBasic.test_kill_not_started_blockc             C   s   | j dd d S )NF)r   )r   )r   r   r   r   test_kill_not_started_noblockw  s    z'TestBasic.test_kill_not_started_noblockc                sZ   g  g }t  fdd}||j |  | j||d  rHt ||gksVtd S )Nc                  s
     dS )Nr4   )r}   r   )rV   r   r   r   }  s    z3TestBasic._test_kill_just_started.<locals>.<lambda>)r   )r   r   r   r}   r   rY   r0   )r   r   r   rc   r   )rV   r   _test_kill_just_startedz  s    z!TestBasic._test_kill_just_startedc             C   s   | j dd d S )NT)r   )r   )r   r   r   r   test_kill_just_started_block  s    z&TestBasic.test_kill_just_started_blockc             C   s   | j dd d S )NF)r   )r   )r   r   r   r   test_kill_just_started_noblock  s    z(TestBasic.test_kill_just_started_noblockc                sJ   g  g }t  fdd}||j |d | j||d  rFtd S )Nc                  s
     dS )Nr4   )r}   r   )rV   r   r   r     s    z9TestBasic._test_kill_just_started_later.<locals>.<lambda>r4   )r   )r   r   r   r}   Zstart_laterrY   r0   )r   r   r   rc   r   )rV   r   _test_kill_just_started_later  s    
z'TestBasic._test_kill_just_started_laterc             C   s   | j dd d S )NT)r   )r   )r   r   r   r   "test_kill_just_started_later_block  s    z,TestBasic.test_kill_just_started_later_blockc             C   s   | j dd d S )NF)r   )r   )r   r   r   r   $test_kill_just_started_later_noblock  s    z.TestBasic.test_kill_just_started_later_noblockc             C   sH   g }t t jd}||j | j||d t d ||gksDtd S )NrF   )r   g{Gz?)r   r   r   r   r}   rY   r0   )r   r   r   rc   r   r   r   _test_kill_running  s    
zTestBasic._test_kill_runningc             C   s   | j dd d S )NT)r   )r   )r   r   r   r   test_kill_running_block  s    z!TestBasic.test_kill_running_blockc             C   s   | j dd d S )NF)r   )r   )r   r   r   r   test_kill_running_noblock  s    z#TestBasic.test_kill_running_noblockc             C   s<   |  t j ttj}|  |  |  |j d S )N)rU   r   r   exc_infor   r   r   rb   )r   rc   r   r   r   test_exc_info_no_error  s
    z TestBasic.test_exc_info_no_errorc                s   d  }} fdd}t |}t |} tt dt   |j|j |  |  t	
|} |j  |j|j  | t  x|jst	d qW d S )Nc                 s0   t  }  | jt j  |  t  d S )N)r   r   r&   spawn_tree_localsr   spawning_greenlet)child)r   r   r   r     s    z(TestBasic.test_tree_locals.<locals>.funcr   g{Gz?)r   r   rU   hasattrr   ZassertIsNotr   r   rb   r   r   ZassertIsNotNoner&   r   r   r   )r   rc   Zg2r   rawr   )r   r   test_tree_locals  s    


zTestBasic.test_tree_localsc          	      s&  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 d t j
| X d S )N#r   c                s    d  d7  < d| _ d S )Nr   r4   T)_called_test)Zgr)calledr   r   cb  s    z-TestBasic.test_add_spawn_callback.<locals>.cbc               S   s   d S )Nr   r   r   r   r   r     s    z3TestBasic.test_add_spawn_callback.<locals>.<lambda>r   r4   gh㈵>c               S   s   d S )Nr   r   r   r   r   r     s    rT   c               S   s   d S )Nr   r   r   r   r   r     s    r   c               S   s   d S )Nr   r   r   r   r   r     s    )r   r   Zadd_spawn_callbackr   r   r   rb   r   r   r   Zremove_spawn_callbackrU   )r   r   rc   r   )r   r   test_add_spawn_callback  s.    z!TestBasic.test_add_spawn_callbackc             C   s^   dd }y
t j}W n tk
r0   tdY nX |t _zt  }| |j W d |t _X d S )Nc               S   s   t dd S )Nzcall stack is not deep enough)
ValueErrorr   r   r   r   r     s    z0TestBasic.test_getframe_value_error.<locals>.getz Cannot mock when Cython compiled)r   Zsys_getframeAttributeErrorunittestZSkipTestr   r   Zspawning_stack)r   r   Zogfr   r   r   r   test_getframe_value_error  s    
z#TestBasic.test_getframe_value_errorN)r   r   r   r   r   r   r   r   r   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s.   	.			
	!r   c               @   s   e Zd Zdd ZdS )	TestStartc             C   sz   t t jd}|jst|jr"t|  |js4t|jr>t|  |jrPt|jsZt|  |jrlt|jsvtd S )Ng{Gz?)r   r   r   r   r0   r   r   rb   )r   rc   r   r   r   test  s    






zTestStart.testN)r   r   r   r   r   r   r   r   r     s   r   c             C   s2   | j st| |  st| t| r.t| d S )N)r   r0   r   r   )rc   r   r   r   rx     s    rx   c             C   s"   | j rt| |  rt| d S )N)r   r0   r   )rc   r   r   r   ry     s    ry   c               @   s$   e Zd Zdd Zdd Zdd ZdS )TestRefc             C   s   d| _ t  d S )NF)r>   r   r   )r   r   r   r   	test_init  s    zTestRef.test_initc             C   s   t t jd  d S )NrF   )r   r   r   r7   )r   r   r   r   test_kill_scheduled  s    zTestRef.test_kill_scheduledc             C   s,   t t jd}zt d W d |  X d S )NrF   gMbP?)r   r   r   r7   )r   rc   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               @   s   e Zd Zdd ZdS )TestCExtc             C   s$   |  tjjd |  tjjd d S )Nzgevent._greenlet)r   r   r   r   SpawnedLink)r   r   r   r   test_c_extension(  s    

zTestCExt.test_c_extensionN)r   r   r   r   r   r   r   r   r   %  s   r   zNeeds pure pythonc               @   s   e Zd Zdd ZdS )TestPurec             C   s$   |  tjjd |  tjjd d S )Nzgevent.greenlet)r   r   r   r   r   )r   r   r   r   	test_pure1  s    

zTestPure.test_pureN)r   r   r   r   r   r   r   r   r   .  s   r   __main__);rer   Zgevent.testingZtestingr   r   r   r   r   r   Zgevent.eventr   Zgevent.queuer   r   Zgevent.testing.timingr	   r
   r   Z
SMALL_TICKrJ   ZTestCaseZerror_fatalZExpectedExceptionr   r   r3   r?   rO   rP   r[   r\   r_   r`   r5   r   r   compileIr   r   r   r   r   r   r   r   r   r   rx   ry   r   ZskipOnPurePythonr   ZskipWithCExtensionsr   rK   r   mainr   r   r   r   <module>   s`   4%7 /


  

	
