
    <|h
}                     N   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j2                  _         G d dej6                        Z G d de      Z G d de      Z G d dej>                        Z  G d dej2                        Z! G d dej2                        Z" G d dej2                        Z#d Z$ G d de#      Z% G d de%      Z& G d d e#      Z' G d! d"e'      Z( G d# d$ej2                        Z)d% Z* G d& d'e+      Z, G d( d)ej>                        Z- G d* d+ej2                        Z. G d, d-e      Z/ G d. d/e      Z0 G d0 d1e      Z1 G d2 d3e      Z2 G d4 d5ej2                        Z3 G d6 d7ej2                        Z4 G d8 d9e4      Z5 G d: d;e4      Z6 G d< d=e4      Z7 G d> d?ej2                        Z8 G d@ dAej2                        Z9 G dB dCej2                        Z: G dD dEej2                        Z; ejx                  dF       G dG dHej2                               Z= ej|                  dI       G dJ dKej2                               Z? e+       Z@[[eAdLk(  r ej                          yy)M    N)patch)sleepwith_timeout
getcurrent)greenlet)AsyncResult)QueueChannel)AbstractGenericWaitTestCase)AbstractGenericGetTestCase)timing)ignores_leakcheckFc                       e Zd Zy)ExpectedErrorN__name__
__module____qualname__     Z/var/www/html/test/engine/venv/lib/python3.12/site-packages/gevent/tests/test__greenlet.pyr   r   *       r   r   c                       e Zd Zy)ExpectedJoinErrorNr   r   r   r   r   r   -   r   r   r   c                       e Zd Zy)SuiteExpectedExceptionNr   r   r   r   r   r   0   r   r   r   c                   &    e Zd ZdZdZdZddZd Zy)GreenletRaisesJoinFTNc                     | xj                   dz  c_         | j                  rt        t        j                  j                  | |      S N   )joinedraise_on_joinr   geventGreenletjoinselftimeouts     r   r&   zGreenletRaisesJoin.join8   s6    q####D'22r   c                 r    | xj                   dz  c_         t        j                  j                  | g|i |S r    )killedr$   r%   kill)r(   argskwargss      r   r,   zGreenletRaisesJoin.kill>   s/    q##D:4:6::r   N)r   r   r   r+   r"   r#   r&   r,   r   r   r   r   r   3   s    FFM3;r   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestLinkc                 <   t        j                  d       }t               }|j                  |       | j	                  |j                         d       t        d      D ]=  }t               }|j                  |       | j	                  |j                         d       ? y )Nc                       yNd   r   r   r   r   <lambda>z3TestLink.test_link_to_asyncresult.<locals>.<lambda>E       r   r5      )r$   spawnr   linkassertEqualgetrange)r(   pevent_event2s        r   test_link_to_asyncresultz!TestLink.test_link_to_asyncresultD   ss    LL%	uc*q 	0A ]FFF6NVZZ\3/	0r   c                 0   t        d      t        j                  fd      }t               }|j	                  |       | j                  t               5 }|j                          d d d        | j                  j                         t        d      D ]g  }t               }|j	                  |       | j                  t               5 }|j                          d d d        | j                  |j                         i y # 1 sw Y   xY w# 1 sw Y   4xY w)N"test_link_to_asyncresult_exceptionc                  6    t               j                         S r/   )r   throw)errs   r   r6   z=TestLink.test_link_to_asyncresult_exception.<locals>.<lambda>Q   s    !3!3C!8 r   r8   )
r   r$   r9   r   r:   assertRaisesr<   assertIs	exceptionr=   )r(   r>   r?   excr@   rA   rG   s         @r   rD   z+TestLink.test_link_to_asyncresult_exceptionO   s    @ALL89	u}- 	IIK	 	cmmS)q 	.A ]FFF6N""=1 S

MM#---	.	 	 s   D D D	D	c                    t        j                  d       }t               }|j                  |j                         | j                  |j                         j                         d       t        d      D ]K  }|j                  |j                         | j                  |j                         j                         d       M y )Nc                       yr4   r   r   r   r   r6   z-TestLink.test_link_to_queue.<locals>.<lambda>a   r7   r   r5   r8   )r$   r9   r	   r:   putr;   r<   r=   )r(   r>   qr@   s       r   test_link_to_queuezTestLink.test_link_to_queue`   s    LL%G	quu,q 	1AFF155MQUUW[[]C0	1r   c                 ,   t        j                  d       }t        j                  d       }t        j                  d       }t               }|j                  |j                         |j                  |j                         |j                  |j                         |j                         j                         |j                         j                         |j                         j                         g}| j                  t        |      g d|       y )Nc                       y)Ne   r   r   r   r   r6   z/TestLink.test_link_to_channel.<locals>.<lambda>k   r7   r   c                       y)Nf   r   r   r   r   r6   z/TestLink.test_link_to_channel.<locals>.<lambda>l   r7   r   c                       y)Ng   r   r   r   r   r6   z/TestLink.test_link_to_channel.<locals>.<lambda>m   r7   r   )rS   rU   rW   )r$   r9   r
   r:   rN   r<   r;   sorted)r(   p1p2p3rO   resultss         r   test_link_to_channelzTestLink.test_link_to_channelj   s    \\+&\\+&\\+&I


557;;=!%%'++-?/7Cr   N)r   r   r   rB   rD   rP   r]   r   r   r   r1   r1   B   s    	0."1	Dr   r1   c                   (    e Zd ZdZd Zd Zd Zd Zy)
TestUnlinkFc                     |t                | j                  d|j                                |j                  t                | j                  d|j                                 || j                         | j                  d|j                                |j                  | j                         | j                  d|j                                |j                          y )Nr!   r   )dummy_test_funcr;   	has_linksunlinksetUpr,   )r(   r>   r:   s      r   
_test_funczTestUnlink._test_funcy   s    _AKKM*	!AKKM*TZZAKKM*	AKKM*	r   c                 n    t        j                  t              }| j                  ||j                         y r/   )r$   r9   ra   re   r:   r(   r>   s     r   test_func_linkzTestUnlink.test_func_link   s"    LL)166"r   c                 n    t        j                  t              }| j                  ||j                         y r/   )r$   r9   ra   re   
link_valuerg   s     r   test_func_link_valuezTestUnlink.test_func_link_value   s"    LL)1<<(r   c                 n    t        j                  t              }| j                  ||j                         y r/   )r$   r9   ra   re   link_exceptionrg   s     r   test_func_link_exceptionz#TestUnlink.test_func_link_exception   s$    LL)1++,r   N)r   r   r   switch_expectedre   rh   rk   rn   r   r   r   r_   r_   v   s    O#)-r   r_   c                   *    e Zd ZdZddZd Zd Zd Zy)LinksTestCaseNc                 <     t        || j                        |       y r/   )getattrlink_method)r(   r>   listeners      r   r:   zLinksTestCase.link   s    $4##$X.r   c                 b   t               }| j                  ||       t        d      }| j                  ||j                         dg| j                  |fd       t	        d      D ]A  }| j                  |t                      | j                  |t        d      j                         C ||fS )Nr!   initialc                  &    j                  d      S )Nrw   )remove)r-   callback_flags    r   r6   z)LinksTestCase.set_links.<locals>.<lambda>   s    =#7#7	#B r   
   )r   r:   r	   rN   r=   )r(   r>   r?   queuer@   rz   s        @r   	set_linkszLinksTestCase.set_links   s    		!Ua		!UYY"		!BCr 	'AIIa'IIaq&	' e]**r   c                 f    t               } ||       t               } ||j                         ||fS r/   )r   r
   rN   )r(   r:   r?   r|   s       r   set_links_timeoutzLinksTestCase.set_links_timeout   s,    U	UYYe|r   c                     t        t        |j                  t              }| j	                  |t               t        t        |j                  t              }| j	                  |t               y )N)timeout_value)r   DELAYr<   XrI   )r(   r?   r|   gots       r   check_timed_outzLinksTestCase.check_timed_out   sB    5%))1=c15%))1=c1r   r/   )r   r   r   rt   r:   r}   r   r   r   r   r   rq   rq      s    K/+ r   rq   c                       y)N   r   r   r   r   return25r      s    r   c                   2    e Zd ZdZdZd Zd Zd Zd Zd Z	y)TestReturn_linkr:   Nc                 F    | j                   j                          d | _         y r/   )r>   
unlink_allr(   s    r   cleanupzTestReturn_link.cleanup   s    r   c                     t        j                  t              | _        t	        d      D ]  }| j                  | j                  d         | j                  j                          y )Nr8   r   )r$   r9   r   r>   r=   _test_returnr,   )r(   r@   s     r   test_returnzTestReturn_link.test_return   sF    h'q 	*Adffb)	*r   c                    | j                  |      \  }}}| j                  |j                        }t        t        dz         | j                  |       | j                  |j                         |       | j                  |j                         j                         |       t        t               | j                  |        | j                  |  y N   )	r}   r   rm   r   r   assertFalser;   r<   r   )r(   r>   resultr?   r|   rz   xxxxxs          r   r   zTestReturn_link._test_return   s    &*nnQ&7#um &&q'7'78eaif-*F3e'e$r   c                    | j                  |      \  }}}| j                  |j                        }|j                          t	        t
               | j                  |       | j                  |j                         t        j                         | j                  |j                         j                         t        j                         t	        t
               | j                  |        | j                  |  y r/   )r}   r   rm   r,   r   r   r   assertIsInstancer<   r$   GreenletExitr   r(   r>   r?   r|   rz   r   s         r   
_test_killzTestReturn_link._test_kill   s    &*nnQ&7#um&&q'7'78	e 	eiik6+>+>?eiikoo/1D1DEe'e$r   c                     t        j                  t        t              x}| _        t        d      D ]  }| j                  |        y Nr8   )r$   r9   r   r   r>   r=   r   r(   r>   r@   s      r   	test_killzTestReturn_link.test_kill   s8    \\%//DFq 	AOOA	r   )
r   r   r   rt   r>   r   r   r   r   r   r   r   r   r   r      s%    KA%"%"r   r   c                       e Zd ZdZy)TestReturn_link_valuerj   Nr   r   r   rt   r   r   r   r   r      s    Kr   r   c                       e Zd ZdZd Zd Zy)TestRaise_linkr:   c                    | j                  |      \  }}}| j                  |j                        }t        t               | j                  ||       | j                  t        |j                         | j                  |j                         |       t        t               | j                  ||        | j                  |  y r/   )r}   r   rj   r   r   r   rH   r   r<   r;   r   r   s         r   _test_raisezTestRaise_link._test_raise   s    &*nnQ&7#um&&q||4eA-3a(e6e$r   c                 r    t        j                  d       }t        d      D ]  }| j                  |        y )Nc                  F    t               j                  t        d            S )N
test_raiser   rF   r   r   r   r   r6   z+TestRaise_link.test_raise.<locals>.<lambda>  s    !3!3M,4O!P r   r8   )r$   r9   r=   r   r   s      r   r   zTestRaise_link.test_raise  s2    LLPQq 	 AQ	 r   N)r   r   r   rt   r   r   r   r   r   r   r      s    K% r   r   c                       e Zd ZdZy)TestRaise_link_exceptionrm   Nr   r   r   r   r   r     s    "Kr   r   c                   r    e Zd Zd Zd Zed        Zed        Zd Zd Z	 G d de
      Zd	 Zd
 Zd Zd Zy)	TestStuffc                     t        j                  d       }| j                  |j                  d       | j                  |j                  j                  d       |j                          y )Nc                       yr    r   r   r   r   r6   z+TestStuff.test_minimal_id.<locals>.<lambda>  r7   r   r   )r$   r9   assertGreaterEqualminimal_identparentr&   r(   gs     r   test_minimal_idzTestStuff.test_minimal_id  sG    LL#3 6 6:	r   c                 4   t        j                  d       }t        j                  d       }t        j                  d       }t        j                  |||gd       | j                  |j                  |j                  |j                  gg d       t               }|j                  |       | j                  |j                         d       |j                  |       t               }|j                  |       | j                  |j                         d       y )Nc                       yr    r   r   r   r   r6   z.TestStuff.test_wait_noerrors.<locals>.<lambda>   r7   r   c                       yr   r   r   r   r   r6   z.TestStuff.test_wait_noerrors.<locals>.<lambda>!  r7   r   c                       yr   r   r   r   r   r6   z.TestStuff.test_wait_noerrors.<locals>.<lambda>"  r7   r   Traise_error)r!   r   r8   r!   )	r$   r9   joinallr;   valuer   r:   r<   rc   )r(   xyzes        r   test_wait_noerrorszTestStuff.test_wait_noerrors  s    LL#LL#LL#1ayd3!''177AGG4i@M	q	!$	M	q	!$r   c                 "   d }t        j                  |      }t        j                  d       }| j                  t        t         j                  ||gd       | j                  t        t         j                  |gd       |j                          y )Nc                  "    t        t               yr    )r   r   r   r   r   r   z$TestStuff.test_wait_error.<locals>.x0  s    %Lr   c                  F    t               j                  t        d            S )Ntest_wait_errorr   r   r   r   r6   z+TestStuff.test_wait_error.<locals>.<lambda>4  s    !3!3MBS4T!U r   Tr   )r$   r9   rH   r   r   r&   )r(   r   r   s      r   r   zTestStuff.test_wait_error-  sj    	 LLOLLUV-!QTR-!$O	r   c                    d }t        j                  |      }t        j                  d       }| j                  t        d      5  t        j                  ||gd       d d d        t        j                  ||g       y # 1 sw Y   !xY w)Nc                  .    t        d       t        d      )N皙?first)r   r   r   r   r   r   z5TestStuff.test_joinall_exception_order.<locals>.first<  s    #J((r   c                  F    t               j                  t        d            S )Nsecondr   r   r   r   r6   z8TestStuff.test_joinall_exception_order.<locals>.<lambda>@  s    !3!3M(4K!L r   r   Tr   )r$   r9   assertRaisesRegexr   r   )r(   r   abs       r   test_joinall_exception_orderz&TestStuff.test_joinall_exception_order9  so    	) LLLLLM##M8< 	5NNAq6t4	5 	1v	5 	5s   A??Bc                    d }d }t        j                  |      }t        j                  |      }t        j                  ||gdd       | j                  |       | j	                  |       |j                          | j                  |       y )Nc                      t        d      )Ncountr   r   r   r   raises_but_ignoredzDTestStuff.test_joinall_count_raise_error.<locals>.raises_but_ignoredI  s    ((r   c                      	 t        d       )Nr   )r   r   r   r   sleep_foreverz?TestStuff.test_joinall_count_raise_error.<locals>.sleep_foreverL  s    c
 r   Fr!   )r   r   )r$   r9   r   assert_greenlet_readyassert_greenlet_not_readyr,   )r(   r   r   sleeperraisers        r   test_joinall_count_raise_errorz(TestStuff.test_joinall_count_raise_errorF  su    	)	 ,,}-01(e1E""6*&&w/ 	""7+r   c                    t        j                  d       }g fd}fd}d }|j                  |       |j                  |       |j                  |       t        t        dz         | j                  ddgddgg       t        j                  d       }g |j                  |       |j                  |       |j                  |       t        t        dz         | j                  ddgddgg       y )Nc                       yN   r   r   r   r   r6   z9TestStuff.test_multiple_listeners_error.<locals>.<lambda>`  r7   r   c                  <    j                  d       t        d      )Nr{   	listener1appendr   _argsr\   s    r   r   z:TestStuff.test_multiple_listeners_error.<locals>.listener1c      NN2,,r   c                  <    j                  d       t        d      )N   	listener2r   r   s    r   r   z:TestStuff.test_multiple_listeners_error.<locals>.listener2g  r   r   c                      t        d      N	listener3r   r   s    r   r   z:TestStuff.test_multiple_listeners_error.<locals>.listener3k      ,,r   r{   r   c                  F    t               j                  t        d            S )Ntest_multiple_listeners_errorr   r   r   r   r6   z9TestStuff.test_multiple_listeners_error.<locals>.<lambda>t  s    !3!3MBa4b!c r   )r$   r9   r:   r   r   assertIn)r(   r>   r   r   r   r\   s        @r   r   z'TestStuff.test_multiple_listeners_error[  s    
 LL#	-	-	- 	
y	y	yebjgR2r(34LLcd	y	y	yebjgR2r(34r   c                   $    e Zd Zd Zd Zd Zd Zy)TestStuff.Resultsc                     g | _         y r/   )r\   r   s    r   __init__zTestStuff.Results.__init__~  s	    DLr   c                     |j                  | j                         | j                  j                  d       t	        d      )Nr   r   )rc   r   r\   r   r   rg   s     r   r   zTestStuff.Results.listener1  /    HHT^^$LL",,r   c                     |j                  | j                         | j                  j                  d       t	        d      )Nr   r   )rc   r   r\   r   r   rg   s     r   r   zTestStuff.Results.listener2  r   r   c                     t        d      r   r   )r(   _ps     r   r   zTestStuff.Results.listener3  r   r   N)r   r   r   r   r   r   r   r   r   r   Resultsr   |  s    		-
	-
	-r   r   c                     | j                         } ||j                          ||j                          ||j                         t	        t
        dz         | j                  dg|j                         y )Nr{   r   )r   r   r   r   r   r   r;   r\   )r(   r   r:   r\   s       r   %_test_multiple_listeners_error_unlinkz/TestStuff._test_multiple_listeners_error_unlink  s[     ,,.WWWebj!goo.r   c                     t        j                  d       }| j                  ||j                         |j	                          y )Nc                       yr   r   r   r   r   r6   zNTestStuff.test_multiple_listeners_error_unlink_Greenlet_link.<locals>.<lambda>  r7   r   )r$   r9   r   r:   r,   rg   s     r   2test_multiple_listeners_error_unlink_Greenlet_linkz<TestStuff.test_multiple_listeners_error_unlink_Greenlet_link  s-    LL#221aff=	r   c                 h    t        j                  d       }| j                  ||j                         y )Nc                       yr   r   r   r   r   r6   zQTestStuff.test_multiple_listeners_error_unlink_Greenlet_rawlink.<locals>.<lambda>  r7   r   )r$   r9   r   rawlinkrg   s     r   5test_multiple_listeners_error_unlink_Greenlet_rawlinkz?TestStuff.test_multiple_listeners_error_unlink_Greenlet_rawlink  s$    LL#221aii@r   c                     t               }t        j                  |j                  d       | j	                  ||j
                         y )N   )r   r$   r9   setr   r  )r(   r   s     r   8test_multiple_listeners_error_unlink_AsyncResult_rawlinkzBTestStuff.test_multiple_listeners_error_unlink_AsyncResult_rawlink  s/    MQUUA221aii@r   N)r   r   r   r   r   r   r   r   r   r   objectr   r   r  r  r  r   r   r   r   r     sa    % 	 	 
 
,*5B-& -$	/
AAr   r   c                       y r/   r   r   s    r   ra   ra     s    r   c                       e Zd Zd Zy)Ac                      y r/   r   r   s    r   methodzA.method  s    r   N)r   r   r   r  r   r   r   r  r    s    r   r  c                       e Zd Zy)SubclassNr   r   r   r   r  r    r   r   r  c                       e Zd Zd Zd Zd Zy)TestStrc                     t         j                  j                  t              }| j	                  |d       | j                  |       |j                          | j                  |       | j	                  |d       y )Nzat X: dummy_test_func>)r$   r%   r9   ra   assert_nstr_endswithr   r&   r   r   s     r   test_functionzTestStr.test_function  s]    OO!!/2!!!%=>&&q)	""1%!!!%=>r   c                    t         j                  j                  t               j                        }| j                  |d       t        |d       | j                  |d       d|_        | j                  |d       | j                  |d       | j                  |       |j                          | j                  |       | j                  |d       y )Nz<Greenlet at X:namez<Greenlet "Greenlet-Fooz<Greenlet "Foo"z8at X: <bound method A.method of <module.A object at X>>>)r$   r%   r9   r  r  assert_nstr_startswithrs   r  r  r   r&   r   r   s     r   test_methodzTestStr.test_method  s    OO!!!#**-##A'89 	6##A'=> ##A'89!!!%_`&&q)	""1%!!!%_`r   c                     t               }| j                  |d       | j                  |d       t        d dd      }| j                  |d       y )Nz
<Subclass zat X: _run>question*   )answerz# at X: _run('question', answer=42)>)r  r  r  r   s     r   test_subclasszTestStr.test_subclass  sH    J##A|4!!!]3T:b1!!!%JKr   N)r   r   r   r  r  r"  r   r   r   r  r    s    ?a$Lr   r  c                       e Zd Zd Zy)TestJoinc                     t        j                  t         j                  d      }	 |j                  |      |j	                          S # |j	                          w xY wNr{   r)   )r$   r9   r   r&   r,   r(   r)   r   s      r   waitzTestJoin.wait  s<    LLr*	66'6*FFHAFFH   A ANr   r   r   r)  r   r   r   r$  r$        r   r$  c                       e Zd Zd Zy)TestGetc                     t        j                  t         j                  d      }	 |j                  |      |j	                          S # |j	                          w xY wr&  )r$   r9   r   r<   r,   r(  s      r   r)  zTestGet.wait  s<    LLr*	555)FFHAFFHr*  Nr+  r   r   r   r.  r.    r,  r   r.  c                   4    e Zd Z ej                         Zd Zy)TestJoinAll0c                 H    t        j                  | j                  g|       y )Nr'  )r$   r   r   r'   s     r   r)  zTestJoinAll0.wait  s    x1r   N)r   r   r   r$   r%   r   r)  r   r   r   r1  r1    s    A2r   r1  c                       e Zd Zd Zy)TestJoinAllc                     t        j                  t         j                  d      }	 t        j                  |g|       |j	                          y # |j	                          w xY wr&  )r$   r9   r   r   r,   r(  s      r   r)  zTestJoinAll.wait  s>    LLr*	NNA30FFHAFFHs   A A!Nr+  r   r   r   r4  r4    r,  r   r4  c                   x    e Zd Zd Zd Zd Zd Zd Zd Z e	j                  d      d        Zd	 Zd
 Zd Zd Zy)	TestBasicc                 .   | j                  t        t        j                  d       | j                  t        t        j                  d       | j                  t        t        j
                  d       | j                  t        t        j
                  dd       y r    )rH   	TypeErrorr$   r9   	spawn_rawspawn_laterr   s    r   test_spawn_non_callablez!TestBasic.test_spawn_non_callable  sd    )V\\15)V%5%5q9 	)V%7%7;)V%7%7A>r   c                     g fd}t        j                  |dd      }t        j                  d       | j                  |       | j	                  d   d       | j	                  d   ddi       y )	Nc                  J    j                  |        j                  |       y r/   r   )r-   r.   r   s     r   fz*TestBasic.test_spawn_raw_kwargs.<locals>.f  s    LLLL r   r!   r   )r  {Gz?r   )r!   r  )r$   r:  r   r   r;   )r(   r@  r   r   s      @r   test_spawn_raw_kwargszTestBasic.test_spawn_raw_kwargs  sj    	! Q0Tq4(qFG#45r   c                 >   g }dd}t        j                  |dd      }|j                  |j                         | j	                  ||       | j	                  |j
                  |       | j	                  |j                  |       | j	                  |j                         |       | j	                  |j                         |       | j                  |j                  |       | j                  |j                  |       |j                          | j                  ||       | j	                  |j
                  |       | j                  |j                  |       | j	                  |j                         |       | j	                  |j                         |       | j                  |j                  |       | j                  |j                  |       t        j                  d       | j                  |       | j	                  |j
                  |       | j                  |j                  |       | j	                  |j                         |       | j	                  |j                         |       | j                  |j                  |       | j                  |j                  |       | j	                  |       t        j                  d       | j	                  ||       | j                  |j
                  |       | j	                  |j                  |       | j                  |j                         |       | j                  |j                         |       | j                  |j                  d       | j                  |j                  |       | j!                  ||       y )Nc                 0    t        j                  |        |S r/   )r$   r   )delayreturn_values     r   funcz(TestBasic.test_simple_exit.<locals>.func  s    LLr   rA  r   rF  gMbP?g{Gz?   )r$   r%   r  r   r   deadstartedready
successfulassertIsNoner   rJ   start
assertTruer   r;   _check_flaky_eqr(   	link_testrG  r   s       r   test_simple_exitzTestBasic.test_simple_exit  s   		  OOD$Q7			)""#A#A&A&+!''1%!++q)		1#		1%A&+!''1%!++q)U#		1%A&+!''1%!++q)#TA"A&	1%*!$!++q)Y*r   c                 L    t         j                  s| j                  ||g       y y r/   )	greentestRUNNING_ON_CIr;   )r(   rT  r   s      r   rR  zTestBasic._check_flaky_eqH  s$    && Y, 'r   c                    g }dd}t        j                  |t        j                  d      }|j	                  |j
                         |j                          t        j                          t        j                  t        j                         | j                  |       | j                  |j                         | j                  |j                         | j                  |j                                | j                  |j                                | j                  |j                          | j#                  |j$                  j&                  d       | j)                  ||       y )Nc                 `    t        j                  |        t        d      }t        |d|       |)Ntest_error_exitmyattr)r$   r   r   setattr)rE  rF  errors      r   rG  z'TestBasic.test_error_exit.<locals>.funcQ  s*    LL!"34EE8\2Kr   r   rH  rI  )r$   r%   r   SMALLEST_RELIABLE_DELAYr  r   rP  r   
LARGE_TICKr   rQ  rK  rL  rM  rN  rO  r   r;   rJ   r\  rR  rS  s       r   r[  zTestBasic.test_error_exitN  s    		 OOD&"@"@qQ			)""#		V&&'#	"(!''"++Q/Y*r   c                    | j                  t        j                         j                         t        j                  t        j
                        }|j                          |j                          | j                  |j                         y r/   )r   r   r%   exc_infor$   r   rP  r&   r   s     r   test_exc_info_no_errorz TestBasic.test_exc_info_no_errorf  sW    **,556fll+			$r   zStarted getting a Fatal Python error on Github Actions on 2020-12-18, even with recursion limits in place. It was fine before that.c                   	 dd l }|j                         }| j                  |j                  |       |j                  |dz         	fd	g fd}	 |t	        j
                         _        t	        j                  	      fd}t	        j                  |      }t	        j                  |g       t	        j
                         `	 t        }| j                  |      5  j                          d d d        | j                  j                                | j!                  j"                         | j!                         | j%                  dt'                     | j)                  d   d          | j%                  d   d   |       d d = y # t	        j
                         `w xY w# t        $ r	 t        }Y w xY w# 1 sw Y   xY w)Nr   rJ  c                                y r/   r   )recurs   r   rf  z-TestBasic.test_recursion_error.<locals>.recur  s    Gr   c                 0    j                  | |||f       y r/   r?  )glettvtberrorss       r   handle_errorz4TestBasic.test_recursion_error.<locals>.handle_error  s    MM4Ar*+r   c                  0    t        j                   g      S r/   )r$   r   )r   s   r   r)  z,TestBasic.test_recursion_error.<locals>.wait  s    ~~qc**r   r!   )sysgetrecursionlimit
addCleanupsetrecursionlimitr$   get_hubrm  r9   r   RecursionError	NameErrorRuntimeErrorrH   r<   r   rN  rQ  rK  r;   lenrI   )
r(   ro  limitrm  r)  g2expected_excrl  r   rf  s
          @@@r   test_recursion_errorzTestBasic.test_recursion_errorn  sx     	%%'--u5eqj)	 	,	.,8FNN)U#A+ d#BNNB4  -	()L |, 	EEG	 	(CK(fQilA&1|41I!  -  	('L	(	 	s+   AF F- GF*-F?>F?Gc                     d x}} fd}t        j                  |      }t        j                  |      } j                  t        t	               d      t	                       j                  |j                  |j                         |j                          |j                          t        j                  |      } j                  |j                          j                  |j                  |j                          j                  |j                         t	                      |j                  s#t        j                  d       |j                  s"y y )Nc                      t        j                         } j                  | j                  t	               j                         j                  | j                         t	                      y r/   )r   r%   rI   spawn_tree_localsr   spawning_greenlet)childr(   s    r   rG  z(TestBasic.test_tree_locals.<locals>.func  sF    %%'EMM%11:<3Q3QRMM%113Z\Br   r~  rA  )r   r%   r   hasattrr   assertIsNotr~  rP  r&   r$   r:  assertIsNotNonerI   r  rK  r   )r(   r   ry  rG  raws   `    r   test_tree_localszTestBasic.test_tree_locals  s    B	C d#t$ 	/BC#	',,b.B.BC			t$S223..0C0CDc++-z|<((LL ((r   c                    ddifd}t         j                  j                  |       	 t        j                  d       }| j	                  t        |d             |j                          | j                  d   d       t        j                  dd       }| j	                  t        |d             |j                          | j                  d   d	       t        j                  d
       }|j                          | j	                  t        |d             |j                          | j                  d   d       t         j                  j                  |       t        j                  d       }| j                  t        |d             |j                          | j                  d   d       t         j                  j                  |       y # t         j                  j                  |       w xY w)N#r   c                 .    dxx   dz  cc<   d| _         y )Nr  r!   T)_called_test)grcalleds    r   cbz-TestBasic.test_add_spawn_callback.<locals>.cb  s    3K1K"BOr   c                       y r/   r   r   r   r   r6   z3TestBasic.test_add_spawn_callback.<locals>.<lambda>  r7   r   r  r!   gh㈵>c                       y r/   r   r   r   r   r6   z3TestBasic.test_add_spawn_callback.<locals>.<lambda>  r7   r   r   c                       y r/   r   r   r   r   r6   z3TestBasic.test_add_spawn_callback.<locals>.<lambda>  r7   r   r8   c                       y r/   r   r   r   r   r6   z3TestBasic.test_add_spawn_callback.<locals>.<lambda>  r7   r   )r$   r%   add_spawn_callbackr9   rQ  r  r&   r;   r;  rP  remove_spawn_callbackr   )r(   r  r   r  s      @r   test_add_spawn_callbackz!TestBasic.test_add_spawn_callback  sh   q	# 	**2.	6\*AOOGA~67FFHVC[!,""46AOOGA~67FFHVC[!,-AGGIOOGA~67FFHVC[!,OO11"5\*AWQ78FFHVC[!,OO11"5FOO11"5s   FG !G4c                    d }	 t         j                  }|t         _        	 t        j
                         }| j                  |j                         |t         _        y # t        $ r t        j                  d      w xY w# |t         _        w xY w)Nc                      t        d      )Nzcall stack is not deep enough)
ValueErrorr   r   r   r<   z0TestBasic.test_getframe_value_error.<locals>.get  s    <==r   z Cannot mock when Cython compiled)r   sys_getframeAttributeErrorunittestSkipTestr%   rO  spawning_stack)r(   r<   ogfr  s       r   test_getframe_value_errorz#TestBasic.test_getframe_value_error  s    	>	H''C !$	(%%'Ee223$'H!  	H##$FGG	H %(H!s   A /A> A;>Bc                 0   t        j                  d       }| j                  |j                  t        j                                t               |_        	 | j                  |j                  t        j                                | j                  t        t        fd      5  t        |d       d d d        t        j                         |_        |j                          y # 1 sw Y   3xY w# t        j                         |_        |j                          w xY w)Nc                       yr    r   r   r   r   r6   z=TestBasic.test_minimal_ident_parent_not_hub.<locals>.<lambda>  r7   r   zCannot convert|ident_registryr   )r$   r9   rI   r   rs  r   r  r   r9  r  rs   r,   r   s     r   !test_minimal_ident_parent_not_hubz+TestBasic.test_minimal_ident_parent_not_hub  s    LL#ahh 01<	QXXv~~'78'')7)9(GI , ?+, ~~'AHFFH, , ~~'AHFFHs%   A
C* C,C* C'#C* *+DN)r   r   r   r<  rB  rU  rR  r[  rc  rW  skipOnCIr{  r  r  r  r  r   r   r   r7  r7    s]    ?6-+^-+0% Y	-
1
1h.6B(r   r7  c                        e Zd Z fdZd ZddZddZed        Zd Z	e	Z
ddZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )TestKillc                     t         |           t        j                         }t	        j
                  |dd      }|j                          | j                  |j                         y )Nprint_exceptionT)autospec)	superrd   r$   rs  Patchr  rP  rq  stop)r(   hubpatcher	__class__s      r   rd   zTestKill.setUp  sD    nn,,s$5E%r   c                    | j                  |       | j                  |j                         | j                  |j                         | j                  |j	                                |r| j                  |j                         t        |      |j                  |j                  f       | j                  |j                  t        j                         | j                  |j                         y | j                  |j                         t        |      |j                  |j                  f       | j                  |j                  t        j                         | j                  |j                         y r/   )r   rQ  rK  rL  rM  rN  reprr   rJ   r   r$   r   rO  assertNotIsInstancer  r(   r   rN  s      r   __assertKilledzTestKill.__assertKilled  s    #	"OOALLNT!Waggq{{,KL!!!''6+>+>?akk*Q\\^d1gqww-LM$$QWWf.A.AB  -r   c                 v    | j                  ||       t        j                  d       | j                  ||       y NrA  )_TestKill__assertKilledr$   r   r  s      r   assertKilledzTestKill.assertKilled  s.    Az*TAz*r   c                    |t         j                  }|r)t        j                  t         j                  |g||      }n"t        j                  |j
                  ||      } |        |s#t        j                  t        j                         |d u xs, t        |t              xr t        |t         j                        }| j                  ||        |        | j                  ||       y )N)rJ   block)r$   r   	functoolspartialkillallr,   r   r   r_  
isinstancetype
issubclassr  )r(   r   r  r  rK   killerrN  s          r   __kill_greenletzTestKill.__kill_greenlet  s    ;%%C&&v~~s14ECF &&qvvEJFLL778D[dZT%:%cz#vObOb?c
!Z(!Z(r   c                 &    | j                  d       y r    r?  result_collectors    r   _run_in_greenletzTestKill._run_in_greenlet2  s    "r   c                      y)zU
        Subclasses should override. This doesn't actually start a greenlet.
        Nr   r   s     r   _start_greenletzTestKill._start_greenlet6  r7   r   c                 6   g }g }t        j                  | j                  |      }|j                  |j                         | j                  |       | j                  ||||       | j                  |       | j                  |       | j                  ||g       y r/   )
r$   r%   r  r:   r   r  _TestKill__kill_greenlet_after_kill_greenletr   r;   )r(   r  r  rK   rT  r   r   s          r   _do_testzTestKill._do_test>  s    	OOD116:	y QQw4!!!$ QC(r   c                 *    | j                  dd       y )NTFr  r  r  r   s    r   
test_blockzTestKill.test_blockM  s    D%0r   c                 *    | j                  dd       y )NFr  r  r   s    r   test_non_blockzTestKill.test_non_blockP  s    E51r   c                 *    | j                  dd       y )NTr  r  r   s    r   test_block_killallzTestKill.test_block_killallS  s    D$/r   c                 *    | j                  dd       y )NFTr  r  r   s    r   test_non_block_killalzTestKill.test_non_block_killalV  s    E40r   c                 <    | j                  ddt                      y )NTFr  r  rK   r  	Exceptionr   s    r   test_non_type_exceptionz TestKill.test_non_type_exceptionY  s    D%Y[Ar   c                 <    | j                  ddt                      y )NFr  r  r   s    r   !test_non_type_exception_non_blockz*TestKill.test_non_type_exception_non_block\  s    E5ikBr   c                 <    | j                  ddt                      y )NTr  r  r   s    r   test_non_type_exception_killallz(TestKill.test_non_type_exception_killall_  s    D$IK@r   c                 <    | j                  ddt                      y )NFTr  r  r   s    r   )test_non_type_exception_killall_non_blockz2TestKill.test_non_type_exception_killall_non_blockb  s    E4Y[Ar   c                 ,    | j                  ddd       y )NTFr   r  r  r   s    r   test_non_exc_exceptionzTestKill.test_non_exc_exceptione  s    D%R8r   c                 ,    | j                  ddd       y )NFr   r  r  r   s    r    test_non_exc_exception_non_blockz)TestKill.test_non_exc_exception_non_blockh  s    E5b9r   c                 ,    | j                  ddd       y )NTr   r  r  r   s    r   test_non_exc_exception_killallz'TestKill.test_non_exc_exception_killallk  s    D$B7r   c                 ,    | j                  ddd       y )NFTr   r  r  r   s    r   (test_non_exc_exception_killall_non_blockz1TestKill.test_non_exc_exception_killall_non_blockn  s    E4R8r   )Tr/   )r   r   r   rd   r  r  r  staticmethodr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__)r  s   @r   r  r    s}    &.+
)& # #
 +)1201BCAB9:89r   r  c                       e Zd Zd Zy)TestKillAfterStartc                 $    |j                          y r/   )rP  r   s     r   r  z"TestKillAfterStart._start_greenlett  s    		r   Nr   r   r   r  r   r   r   r  r  r  s    r   r  c                       e Zd Zd Zy)TestKillAfterStartLaterc                 B    |j                  t        j                         y r/   )start_laterr   r`  r   s     r   r  z'TestKillAfterStartLater._start_greenlety  s    	f''(r   Nr  r   r   r   r  r  w  s    )r   r  c                   "    e Zd Zed        Zd Zy)TestKillWhileRunningc                 X    t        j                  d       t        j                  |        y )Nr{   )r$   r   r  r  r  s    r   r  z%TestKillWhileRunning._run_in_greenlet~  s    R 	!!"23r   c                 Z    t         j                  | |       t        j                  d       y r  )r  r  r$   r   r   s     r   r  z)TestKillWhileRunning._after_kill_greenlet  s    %%dA.Tr   N)r   r   r   r  r  r  r   r   r   r  r  |  s    4 4r   r  c                       e Zd Zd Zy)TestKillallRawGreenletc                 \    t        j                  d       }t        j                  |g       y )Nc                       yr    r   r   r   r   r6   z9TestKillallRawGreenlet.test_killall_raw.<locals>.<lambda>  r7   r   )r$   r:  r  r   s     r   test_killall_rawz'TestKillallRawGreenlet.test_killall_raw  s     Y'sr   N)r   r   r   r  r   r   r   r  r    s    r   r  c                   B    e Zd Zd Zd Zed        Zd Zd Zd	dZ	d Z
y)
TestContextManagerc                     t        j                  t         j                  t        j                        5 }| j                  |       d d d        | j                         y # 1 sw Y   xY wr/   )r$   r9   r   r   
SMALL_TICKassert_greenlet_spawnedassert_greenlet_finishedr   s     r   test_simplezTestContextManager.test_simple  sO    \\&,,(9(9: 	,a((+	, 	%%a(	, 	,s   AA(c                    t        j                  | j                        5 }| j                  t        j
                        5  |j                          d d d        d d d        | j                         y # 1 sw Y   #xY w# 1 sw Y   'xY wr/   )r$   r9   _raise_exceptionrH   rW  ExpectedExceptionr<   r  r   s     r   test_wait_in_suitez%TestContextManager.test_wait_in_suite  sm    \\$//0 	A""9#>#>? 	 	%%a( 	 	s#    A? A3A?3A<	8A??Bc                  "    t         j                  r/   )rW  r  r   r   r   r  z#TestContextManager._raise_exception  s    )))r   c                    t        j                  | j                        5 }	 d d d        | j                         | j	                  t
        j                        5  |j                          d d d        y # 1 sw Y   SxY w# 1 sw Y   y xY wr/   )r$   r9   r  r  rH   rW  r  r<   r   s     r   test_greenlet_raisesz'TestContextManager.test_greenlet_raises  su    \\$//0 	A	 	%%a(y::; 	EEG	 			 		 	s   A4B 4A= B	c                    d}| j                  t              5  t        j                  t        j
                  t        j                        5 }| j                  |       d}d d d        d d d        | j                  |       | j                         | j                  |j                         y # 1 sw Y   OxY w# 1 sw Y   SxY w)Nr   r!   )rH   r   r   r9   r$   r   r   r  r  rQ  r  r+   )r(   	suite_ranr   s      r   test_join_raisesz#TestContextManager.test_join_raises  s    	01 	#))&,,8I8IJ a,,Q/		
 		"%%a(! 	 	s#   3B9B-B9-B6	2B99CNc                    |st         j                  nt         j                  }| j                  t              5  t
        j                  t        j                  |      5 }| j                  |       |rd|_
        t        j                  |       t        # 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY w| j                         | j                  |j                         |r| j                  |j                         n| j                  |j                         | j                  |j!                                | j                  t              5  |j#                          d d d        y # 1 sw Y   y xY wNF)r   r  r`  rH   r   r   r9   r$   r   r  r#   r  rQ  r+   r"   r   rN  r<   )r(   rE  greenlet_sleepr   s       r   test_suite_body_raisesz)TestContextManager.test_suite_body_raises  s   27**V=N=N56 	-#))&,,G -1,,Q/&+AOLL',,- - -	- 	- 	- 	%%a(!OOAHH%QXX&(56 	EEG	 	 	s)   %B)6BB	B))B2E((E1c                 D    | j                  t        j                         y )N)rE  )r  r   r  r   s    r   !test_suite_body_raises_with_delayz4TestContextManager.test_suite_body_raises_with_delay  s    ##&*;*;#<r   r/   )r   r   r   r   r  r  r  r  r
  r  r  r   r   r   r  r    s4    )) * *	"*=r   r  c                       e Zd Zd Zy)	TestStartc                 P   t        j                  t         j                  t        j                        }| j                  |       |j                          | j                  |       |j                          | j                  |       |j                          | j                  |       y r/   )
r$   r9   r   r   r  r  rP  assert_greenlet_startedr&   r  r   s     r   
test_startzTestStart.test_start  sq    LLv'8'89$$Q'		$$Q'	%%a( 	
	%%a(r   N)r   r   r   r  r   r   r   r  r    s    )r   r  c                       e Zd Zd Zd Zd Zy)TestRefc                 :    d| _         t        j                          y r  )ro   r$   r%   r   s    r   	test_initzTestRef.test_init  s    $r   c                     t        j                  t         j                  t        j                        j                          y r/   )r$   r9   r   r   r`  r,   r   s    r   test_kill_scheduledzTestRef.test_kill_scheduled  s#    V\\6#4#45::<r   c                     t        j                  t         j                  t        j                        }	 t        j                  t        j
                         |j                          y # |j                          w xY wr/   )r$   r9   r   r   r`  r_  r,   r   s     r   test_kill_startedzTestRef.test_kill_started  sF    LLv'8'89	LL778FFHAFFHs   #A( (A:N)r   r   r   r  r  r  r   r   r   r  r    s    
=r   r  zNeeds C extensionc                       e Zd Zd Zy)TestCExtc                     | j                  t        j                  j                  d       | j                  t        j                  j                  d       y )Nzgevent._gevent_cgreenletr;   r   r%   r   SpawnedLinkr   s    r   test_c_extensionzTestCExt.test_c_extension  s@    **553	5--883	5r   N)r   r   r   r#  r   r   r   r  r    s    5r   r  zNeeds pure pythonc                       e Zd Zd Zy)TestPurec                     | j                  t        j                  j                  d       | j                  t        j                  j                  d       y )Nzgevent.greenletr!  r   s    r   	test_purezTestPure.test_pure  s@    **55*	,--88*	,r   N)r   r   r   r'  r   r   r   r%  r%    s    ,r   r%  __main__)Cr  r  unittest.mockr   r  gevent.testingtestingrW  r$   r   r   r   r   gevent.eventr   gevent.queuer	   r
   gevent.testing.timingr   r   r   r   r  r   TestCaseerror_fatalr  r   r   r   r%   r   r1   r_   rq   r   r   r   r   r   r   ra   r  r  r  r  r$  r.  r1  r4  r7  r  r  r  r  r  r  r  r  skipOnPurePythonr  skipWithCExtensionsr%  r   r   mainr   r   r   <module>r4     s  *   ( "  2 2  $ ' = < ! ,!&	   	I// 		 		] 	; ;1Dy!! 1Dh-## ->$I&& $N
4m 4nO  ]  .#~ #OA	"" OAd	 
	v 	#Li   #LL* ( 2. 2- ~	"" ~Bm9y!! m9` 
)h )
8 Y// ;=++ ;=z)	"" )"i   $ /05y!! 5 15 23,y!! , 4, H zINN r   