o
    ‡e|  ã                   @   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 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 d/d0„ d0eƒZ-G d1d2„ d2eƒZ.G d3d4„ d4eƒZ/G d5d6„ d6ejƒZ0G d7d8„ d8ejƒZ1G d9d:„ d:e1ƒZ2G d;d<„ d<e1ƒZ3G d=d>„ d>e1ƒZ4G d?d@„ d@ejƒZ5G dAdB„ dBejƒZ6G dCdD„ dDejƒZ7G dEdF„ dFejƒZ8e 9dG¡G dHdI„ dIejƒƒZ:e ;dJ¡G dKdL„ dLejƒƒZ<e(ƒ Z=[[e>dMkrqe ?¡  dS dS )Né    N)Ú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   úKD:\Projects\ConvertPro\env\Lib\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   /   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   7   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   2   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 ©Néd   r   r   r   r   r   Ú<lambda>D   ó    z3TestLink.test_link_to_asyncresult.<locals>.<lambda>r,   é   )r   Úspawnr   ÚlinkÚassertEqualÚgetÚrange)r!   ÚpÚeventÚ_Úevent2r   r   r   Útest_link_to_asyncresultC   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-   P   s    z=TestLink.test_link_to_asyncresult_exception.<locals>.<lambda>r/   )
r   r   r0   r   r1   ÚassertRaisesr3   ÚassertIsÚ	exceptionr4   )r!   r5   r6   Úexcr7   r8   r   r<   r   r:   N   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-   `   r.   z-TestLink.test_link_to_queue.<locals>.<lambda>r,   r/   )r   r0   r   r1   Úputr2   r3   r4   )r!   r5   Úqr7   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*   )Née   r   r   r   r   r   r-   j   r.   z/TestLink.test_link_to_channel.<locals>.<lambda>c                   S   r*   )Néf   r   r   r   r   r   r-   k   r.   c                   S   r*   )Nég   r   r   r   r   r   r-   l   r.   )rE   rF   rG   )r   r0   r   r1   rB   r3   r2   Úsorted)r!   Úp1Úp2Zp3rC   Úresultsr   r   r   Útest_link_to_channeli   s   "zTestLink.test_link_to_channelN)r   r   r   r9   r:   rD   rL   r   r   r   r   r)   A   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_funcr2   Z	has_linksÚunlinkZsetUpr$   )r!   r5   r1   r   r   r   Ú
_test_funcx   s   

zTestUnlink._test_funcc                 C   ó   t  t¡}|  ||j¡ d S r'   )r   r0   rN   rP   r1   ©r!   r5   r   r   r   Útest_func_link‡   ó   
zTestUnlink.test_func_linkc                 C   rQ   r'   )r   r0   rN   rP   Ú
link_valuerR   r   r   r   Útest_func_link_value‹   rT   zTestUnlink.test_func_link_valuec                 C   rQ   r'   )r   r0   rN   rP   Úlink_exceptionrR   r   r   r   Útest_func_link_exception   rT   z#TestUnlink.test_func_link_exceptionN)r   r   r   Úswitch_expectedrP   rS   rV   rX   r   r   r   r   rM   u   s    rM   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!   r5   Úlistenerr   r   r   r1   ˜   ó   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 )Nr_   )Úremove)r%   ©Úcallback_flagr   r   r-   £   s   
 z)LinksTestCase.set_links.<locals>.<lambda>é
   )r   r1   r   rB   r4   )r!   r5   r6   Úqueuer7   r   ra   r   Ú	set_links›   s   
zLinksTestCase.set_linksc                 C   s&   t ƒ }||ƒ tƒ }||jƒ ||fS r'   )r   r   rB   )r!   r1   r6   rd   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   ÚDELAYr3   ÚXr?   )r!   r6   rd   Úgotr   r   r   Úcheck_timed_out´   s   zLinksTestCase.check_timed_outr'   )r   r   r   r\   r1   re   rf   rk   r   r   r   r   rZ   ”   s    
	rZ   c                   C   r*   )Né   r   r   r   r   r   Úreturn25»   ó   rm   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_linkr1   Nc                 C   s   | j  ¡  d | _ d S r'   )r5   Z
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 )Nr/   rl   )r   r0   rm   r5   r4   Ú_test_returnr$   )r!   r7   r   r   r   Útest_returnÉ   s   zTestReturn_link.test_returnc                 C   sv   |   |¡\}}}|  |j¡}ttd ƒ |  |¡ |  | ¡ |¡ |  | ¡  ¡ |¡ ttƒ |  |¡ | j|Ž  d S ©Né   )	re   rf   rW   r   rh   ÚassertFalser2   r3   rk   )r!   r5   Úresultr6   rd   rb   Úxxxxxr   r   r   rr   Ï   s   

zTestReturn_link._test_returnc                 C   s~   |   |¡\}}}|  |j¡}| ¡  ttƒ |  |¡ |  | ¡ t	j
¡ |  | ¡  ¡ t	j
¡ ttƒ |  |¡ | j|Ž  d S r'   )re   rf   rW   r$   r   rh   rv   ÚassertIsInstancer3   r   ÚGreenletExitrk   ©r!   r5   r6   rd   rb   rx   r   r   r   Ú
_test_killà   s   

zTestReturn_link._test_killc                 C   s.   t  tt¡ }| _tdƒD ]}|  |¡ qd S ©Nr/   )r   r0   r   rh   r5   r4   r|   ©r!   r5   r7   r   r   r   Ú	test_killñ   s   ÿzTestReturn_link.test_kill)
r   r   r   r\   r5   rq   rs   rr   r|   r   r   r   r   r   ro   À   s    ro   c                   @   ó   e Zd ZdZdS )ÚTestReturn_link_valuerU   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_linkr1   c                 C   sp   |   |¡\}}}|  |j¡}ttƒ |  ||¡ |  t|j¡ |  	| ¡ |¡ ttƒ |  ||¡ | j
|Ž  d S r'   )re   rf   rU   r   rh   rv   r>   r   r3   r2   rk   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>r/   )r   r0   r4   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_exceptionrW   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   r0   Z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*   rt   r   r   r   r   r   r-      r.   c                   S   r*   r}   r   r   r   r   r   r-   !  r.   T©Úraise_error)r   ru   r/   r   )	r   r0   Újoinallr2   Úvaluer   r1   r3   rO   )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   rh   r   r   r   r   r•   /  s   z$TestStuff.test_wait_error.<locals>.xc                   S   r†   )NÚtest_wait_errorrˆ   r   r   r   r   r-   3  r‰   z+TestStuff.test_wait_error.<locals>.<lambda>Tr‘   )r   r0   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   r0   ÚassertRaisesRegexr   r“   )r!   rœ   ÚaÚbr   r   r   Útest_joinall_exception_order8  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_ignoredH  ó   zDTestStuff.test_joinall_count_raise_error.<locals>.raises_but_ignoredc                   S   s   	 t dƒ q)NTr›   )r   r   r   r   r   Úsleep_foreverK  s   ÿz?TestStuff.test_joinall_count_raise_error.<locals>.sleep_foreverFr   )r’   r£   )r   r0   r“   Úassert_greenlet_readyÚassert_greenlet_not_readyr$   )r!   r¥   r§   ZsleeperZraiserr   r   r   Útest_joinall_count_raise_errorE  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ƒ‚)Nrc   Ú	listener1©Úappendr   ©Ú_args©rK   r   r   r®   b  ó   
z:TestStuff.test_multiple_listeners_error.<locals>.listener1c                     r­   )Né   Ú	listener2r¯   r±   r³   r   r   r¶   f  r´   z:TestStuff.test_multiple_listeners_error.<locals>.listener2c                  W   r¢   ©NÚ	listener3r¤   r±   r   r   r   r¸   j  r¦   z:TestStuff.test_multiple_listeners_error.<locals>.listener3rc   rµ   c                   S   r†   )NÚtest_multiple_listeners_errorrˆ   r   r   r   r   r-   s  r‰   )r   r0   r1   r   rh   ZassertIn)r!   r5   r®   r¶   r¸   r   r³   r   r¹   Z  s"   





z'TestStuff.test_multiple_listeners_errorc                   @   r(   )
zTestStuff.Resultsc                 C   s
   g | _ d S r'   r³   rp   r   r   r   Ú__init__}  ó   
zTestStuff.Results.__init__c                 C   ó    |  | j¡ | j d¡ tdƒ‚)Nr¬   r®   )rO   r¶   rK   r°   r   rR   r   r   r   r®   €  ó   zTestStuff.Results.listener1c                 C   r¼   )Nr¬   r¶   )rO   r®   rK   r°   r   rR   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 )Nrc   r¬   )r¿   r®   r¶   r¸   r   rh   r2   rK   )r!   r¾   r1   rK   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   r0   rÀ   r1   r$   rR   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   r0   rÀ   ÚrawlinkrR   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   r0   Ú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   rN   ¨  rn   rN   c                   @   ó   e Zd Zdd„ ZdS )ÚAc                 C   rÈ   r'   r   rp   r   r   r   Úmethod®  rn   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   r0   rN   Ú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-ZFooz<Greenlet "Foo"z8at X: <bound method A.method of <module.A object at X>>>)r   r   r0   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é*   )Z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 ©Nrc   ©r"   )r   r0   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   r0   r   r3   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   r0   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   r0   Ú	spawn_rawÚspawn_laterrp   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Ò   ç{®Gáz„?r   )r   rÒ   )r   ræ   r   rv   r2   )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ð   gü©ñÒMbP?g{®Gáz”?©rî   )r   r   rÂ   r°   rv   ÚdeadÚstartedÚreadyÚ
successfulÚassertIsNoner”   r@   ÚstartÚ
assertTruer   r2   Ú_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'   )Ú	greentestZRUNNING_ON_CIr2   )r!   rý   r   r   r   r   rû   G  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ñ   P  s   
z'TestBasic.test_error_exit.<locals>.funcr¬   rò   ró   )r   r   r   ÚSMALLEST_RELIABLE_DELAYrÂ   r°   rù   r   Ú
LARGE_TICKrv   rú   rô   rõ   rö   r÷   rø   r”   r2   r@   r  rû   rü   r   r   r   r   M  s   

zTestBasic.test_error_exitc                 C   s<   |   t ¡ j¡ t tj¡}| ¡  | ¡  |   |j¡ d S r'   )rv   r   r   Úexc_infor   r   rù   r   rŽ   r   r   r   Útest_exc_info_no_errore  s
   z TestBasic.test_exc_info_no_errorzƒStarted 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é   )Z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ÚgetrecursionlimitZ
addCleanupÚsetrecursionlimitr   Úget_hubr  r0   r“   ÚRecursionErrorÚ	NameErrorÚRuntimeErrorr>   r3   rv   r÷   rú   rô   r2   Úlenr?   )r!   r  Úlimitr  rÝ   Úg2Zexpected_excr   )r  r   r  r   Útest_recursion_errorm  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)Úchildrp   r   r   rñ   ¨  s   z(TestBasic.test_tree_locals.<locals>.funcr  rì   )r   r   rv   Úhasattrr   ÚassertIsNotr  rù   r   r   ræ   ÚassertIsNotNoner?   r  rô   r   )r!   r   r  rñ   Úrawr   rp   r   Útest_tree_locals¦  s"   

ÿ

ÿzTestBasic.test_tree_localsc              	      s0  ddi‰ ‡ fdd„}t j |¡ z€t  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 )Nr"  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>r#  r   gñhãˆµøä>c                   S   rÈ   r'   r   r   r   r   r   r-   Ë  r.   ru   c                   S   rÈ   r'   r   r   r   r   r   r-   Ð  r.   r/   c                   S   rÈ   r'   r   r   r   r   r   r-   ×  r.   )r   r   Zadd_spawn_callbackr0   rú   r  r   r2   rç   rù   Zremove_spawn_callbackrv   )r!   r'  r   r   r%  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   r3   ß  r¦   z0TestBasic.test_getframe_value_error.<locals>.getz Cannot mock when Cython compiled)r   Zsys_getframeÚAttributeErrorÚunittestZSkipTestr   rø   Zspawning_stack)r!   r3   Z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   r0   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ÿ   ZskipOnCIr  r!  r(  r,  r-  r   r   r   r   rä      s    	/ÿ
4!rä   c                   @   sª   e Z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dS ))ÚTestKillc                 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'   )rv   rú   rô   rõ   rö   r÷   Úreprr”   r@   ry   r   rz   rø   ZassertNotIsInstancer  ©r!   r   r÷   r   r   r   Z__assertKilled  s   
zTestKill.__assertKilledTc                 C   s&   |   ||¡ t d¡ |   ||¡ d S ©Nrì   )Ú_TestKill__assertKilledr   r   r0  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)r@   Úblock)r   rz   Ú	functoolsÚpartialÚkillallr$   r   r   r  Ú
isinstanceÚtypeÚ
issubclassr3  )r!   r   r4  r7  rA   Zkillerr÷   r   r   r   Z__kill_greenlet  s   ÿzTestKill.__kill_greenletc                 C   s   |   d¡ d S r   ré   ©Zresult_collectorr   r   r   Ú_run_in_greenlet)  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_greenlet-  r.   zTestKill._start_greenletc                 C   sb   g }g }t  | j|¡}| |j¡ |  |¡ |  ||||¡ |  |¡ |  |¡ |  	||g¡ d S r'   )
r   r   r<  r1   r°   r=  Ú_TestKill__kill_greenletÚ_after_kill_greenletrv   r2   )r!   r4  r7  rA   rý   rw   r   r   r   r   Ú_do_test5  s   


zTestKill._do_testc                 C   ó   | j ddd d S )NTF©r4  r7  ©r@  rp   r   r   r   Ú
test_blockD  ó   zTestKill.test_blockc                 C   ó   | j ddd d S )NFrB  rC  rp   r   r   r   Útest_non_blockG  rE  zTestKill.test_non_blockc                 C   rF  )NTrB  rC  rp   r   r   r   Útest_block_killallJ  rE  zTestKill.test_block_killallc                 C   rA  )NFTrB  rC  rp   r   r   r   Útest_non_block_killalM  rE  zTestKill.test_non_block_killalc                 C   ó   | j ddtƒ d d S )NTF©r4  r7  rA   ©r@  Ú	Exceptionrp   r   r   r   Útest_non_type_exceptionP  râ   z TestKill.test_non_type_exceptionc                 C   ó   | j ddtƒ d d S )NFrK  rL  rp   r   r   r   Ú!test_non_type_exception_non_blockS  râ   z*TestKill.test_non_type_exception_non_blockc                 C   rO  )NTrK  rL  rp   r   r   r   Útest_non_type_exception_killallV  râ   z(TestKill.test_non_type_exception_killallc                 C   rJ  )NFTrK  rL  rp   r   r   r   Ú)test_non_type_exception_killall_non_blockY  râ   z2TestKill.test_non_type_exception_killall_non_blockc                 C   ó   | j dddd d S )NTFrÖ   rK  rC  rp   r   r   r   Útest_non_exc_exception\  r^   zTestKill.test_non_exc_exceptionc                 C   ó   | j dddd d S )NFrÖ   rK  rC  rp   r   r   r   Ú test_non_exc_exception_non_block_  r^   z)TestKill.test_non_exc_exception_non_blockc                 C   rU  )NTrÖ   rK  rC  rp   r   r   r   Útest_non_exc_exception_killallb  r^   z'TestKill.test_non_exc_exception_killallc                 C   rS  )NFTrÖ   rK  rC  rp   r   r   r   Ú(test_non_exc_exception_killall_non_blocke  r^   z1TestKill.test_non_exc_exception_killall_non_block)Tr'   )r   r   r   r2  r3  r>  Ústaticmethodr<  r=  r?  r@  rD  rG  rH  rI  rN  rP  rQ  rR  rT  rV  rW  rX  r   r   r   r   r.    s*    



r.  c                   @   rÉ   )ÚTestKillAfterStartc                 C   s   |  ¡  d S r'   )rù   rŽ   r   r   r   r=  k  r  z"TestKillAfterStart._start_greenletN©r   r   r   r=  r   r   r   r   rZ  i  rÌ   rZ  c                   @   rÉ   )ÚTestKillAfterStartLaterc                 C   s   |  tj¡ d S r'   )Zstart_laterr   r  rŽ   r   r   r   r=  p  s   z'TestKillAfterStartLater._start_greenletNr[  r   r   r   r   r\  n  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 )Nrc   )r   r   r.  r<  r;  r   r   r   r<  u  s   
z%TestKillWhileRunning._run_in_greenletc                 C   s   t  | |¡ t d¡ d S r1  )r.  r?  r   r   rŽ   r   r   r   r?  |  s   z)TestKillWhileRunning._after_kill_greenletN)r   r   r   rY  r<  r?  r   r   r   r   r]  s  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æ   r7  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   r0   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   r0   Ú_raise_exceptionr>   rÿ   ÚExpectedExceptionr3   rc  rŽ   r   r   r   Útest_wait_in_suite  s   
ÿ€ÿz%TestContextManager.test_wait_in_suitec                   C   s   t j‚r'   )rÿ   rf  r   r   r   r   re  •  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   r0   re  rc  r>   rÿ   rf  r3   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   r0   r   r   r   ra  rb  rú   rc  r#   )r!   Z	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   ra  r  r>   r   r   r0   r   r   rb  r   rc  rú   r#   r   rv   r÷   r3   )r!   rï   Z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ï   )rk  r   ra  rp   r   r   r   Ú!test_suite_body_raises_with_delayÁ  rE  z4TestContextManager.test_suite_body_raises_with_delayr'   )r   r   r   rd  rg  rY  re  rh  ri  rk  rl  r   r   r   r   r`  ‡  s    

r`  c                   @   rÉ   )Ú	TestStartc                 C   sT   t  t jtj¡}|  |¡ | ¡  |  |¡ | ¡  |  	|¡ | ¡  |  	|¡ d S r'   )
r   r0   r   r   ra  rb  rù   Zassert_greenlet_startedr   rc  rŽ   r   r   r   Ú
test_startÆ  s   


zTestStart.test_startN)r   r   r   rn  r   r   r   r   rm  Ä  rÌ   rm  c                   @   rÎ   )ÚTestRefc                 C   s   d| _ t ¡  d S rj  )rY   r   r   rp   r   r   r   Ú	test_init×  s   zTestRef.test_initc                 C   s   t  t jtj¡ ¡  d S r'   )r   r0   r   r   r  r$   rp   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   r0   r   r   r  r  r$   rŽ   r   r   r   Útest_kill_startedß  s   zTestRef.test_kill_startedN)r   r   r   rp  rq  rr  r   r   r   r   ro  Õ  s    ro  zNeeds C extensionc                   @   rÉ   )ÚTestCExtc                 C   ó$   |   tjjd¡ |   tjjd¡ d S )Nzgevent._gevent_cgreenlet©r2   r   r   r   ZSpawnedLinkrp   r   r   r   Útest_c_extensionê  ó   
ÿ
ÿzTestCExt.test_c_extensionN)r   r   r   rv  r   r   r   r   rs  ç  ó    rs  zNeeds pure pythonc                   @   rÉ   )ÚTestPurec                 C   rt  )Nzgevent.greenletru  rp   r   r   r   Ú	test_pureó  rw  zTestPure.test_pureN)r   r   r   rz  r   r   r   r   ry  ð  rx  ry  Ú__main__)@r5  r+  Zgevent.testingÚtestingrÿ   r   r   r   r   r   Zgevent.eventr   Zgevent.queuer   r   Zgevent.testing.timingr	   r
   r   r   ra  rh   ZTestCaseZerror_fatalrf  r   r   r   r   r   r)   rM   rZ   rm   ro   r   r„   rŠ   r‹   rN   rÇ   rÊ   rÍ   rÏ   rØ   rà   rá   rã   rä   r.  rZ  r\  r]  r^  r`  rm  ro  ZskipOnPurePythonrs  ZskipWithCExtensionsry  ri   r   Úmainr   r   r   r   Ú<module>   sr   4'7 &


  h=	
ÿ