
    Yf                        d Z ddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZmZ d	 Zd
 Zd%deedf         defdZ d%deedf         ddf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          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          Z, G d# d$e          Z-dS )&z0
Tests for L{twisted.internet.inlineCallbacks}.
    N)Enum)Any	GeneratorListSetUnion)reactortask)CancelledErrorDeferredFailurefailinlineCallbacksreturnValuesucceed)_PYPY)SynchronousTestCaseTestCasec                 X    t                      }t          j        d|j        |            |S Nr   )r   r	   	callLatercallback)valueds     U/var/www/html/env/lib/python3.11/site-packages/twisted/internet/test/test_inlinecb.pygetValueViaDeferredr      s'    

AaU+++H    c                 0   K   t          |            d {V S Nr   )r   s    r   getValueViaCoror!   #   s&      $U+++++++++r   msgreturnc                 b    	 t          |           # t          $ r t                      }Y nw xY w|S )z6
    Make a L{Failure} of a divide-by-zero error.
    )ZeroDivisionErrorBaseExceptionr   )r"   fs     r   getDivisionFailurer(   '   sB    $$$   IIHs    ,,c                 N   K   t          d           d{V  t          |           )z>
    Make a coroutine that throws a divide-by-zero error.
    r   N)r   r%   )r"   s    r   getDivisionFailureCoror*   2   s6       g
&
&&&&&&&&
C
 
  r   c                       e Zd ZdZdS )TerminalExceptionz[
    Just a specific exception type for use in inlineCallbacks tests in this
    file.
    N__name__
__module____qualname____doc__ r   r   r,   r,   :   s         
 	Dr   r,   c                       e 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d Zd Zd Zd Zd Zd Z ej        ed          dd            ZdS )
BasicTestsar  
    This test suite tests basic use cases of L{inlineCallbacks}. For more
    complex tests see e.g. StackedInlineCallbacksTests.

    Note that it is important to directly call addCallbacks and other
    functions exposed as an API, because both L{inlineCallbacks} and
    L{Deferred} may be optimized in ways that are only exercised in particular
    situations.
    c                 n     t            fd            } |                                 j        d          S )z
        Test that a normal inlineCallbacks works.  Tests yielding a
        deferred which callbacks, as well as a deferred errbacks. Also
        ensures returning a final value works.
        c               3      K   t          d          V }                     | d           	 t          d          V  n:# t          $ r-}                    t	          |          d           Y d }~nd }~ww xY wdS NhiOMGWOOSH)r   assertEqualr(   r%   strxeselfs     r   
_genBasicsz)BasicTests.testBasics.<locals>._genBasicsU   s      )$////AQ%%%0(//////$ 0 0 0  Q////////07s   > 
A5#A00A5r:   r   addCallbackr;   r@   rA   s   ` r   
testBasicszBasicTests.testBasicsN   sI     
		 		 		 		 
		 z||''(8'BBBr   c                 n     t            fd            } |                                 j        d          S )zS
        C{inlineCallbacks} can yield a coroutine and catch its exception.
        c               3     K   t          d          V }                     | d           	 t          d          V  d S # t          $ r=}                    t	          |          d           t          d           Y d }~d S d }~ww xY wr7   )r!   r;   r*   r%   r<   r   r=   s     r   rA   z.BasicTests.testBasicsAsync.<locals>._genBasicsh   s      %d++++AQ%%%%,U3333333$ % % %  Q///G$$$$$$$$$%s   ? 
B	2BBr:   rB   rD   s   ` r   testBasicsAsynczBasicTests.testBasicsAsyncc   sI    
 
		% 		% 		% 		% 
		% z||''(8'BBBr   c                 h    t           d             }|                      |            t                    S )z
        Ensure that a generator that produces an exception signals
        a Failure condition on result deferred by converting the exception to
        a L{Failure}.
        c               3   6   K   t          d          V  ddz   d S )Nr8      r   r    r2   r   r   _genProduceExceptionz>BasicTests.testProducesException.<locals>._genProduceException}   s'      %d+++++EEEEr   )r   assertFailurer%   )r@   rL   s     r   testProducesExceptionz BasicTests.testProducesExceptionv   s@     
	 	 
	 !!"6"6"8"8:KLLLr   c                 h    t           d             } |                                | j        d          S )z9Test that a generator which never yields results in None.c               3   
   K   d S r   r2   r2   r   r   _genNothingz+BasicTests.testNothing.<locals>._genNothing   s       r   NrB   )r@   rQ   s     r   testNothingzBasicTests.testNothing   s>     
	 	 
	 {}}(()94@@@r   c                 h    t           d             } |                                | j        d          S )z
        Create a Deferred Generator which yields a Deferred which fails and
        handles the exception which results.  Assert that the Deferred
        Generator does not errback its Deferred.
        c               3   j   K   	 t          t          d                    V  d S # t          $ r Y d S w xY w)NHandled Terminal Failure)r   r,   r2   r   r   _genHandledTerminalFailurezIBasicTests.testHandledTerminalFailure.<locals>._genHandledTerminalFailure   sQ      ,-GHHIIIIIII$   s   $ 
22NrB   )r@   rV   s     r   testHandledTerminalFailurez%BasicTests.testHandledTerminalFailure   sA     
	 	 
	 *)++778H$OOOr   c                     t           d             }t                      } ||          }|                    t          d                     |                    | j        d          S )z~
        Just like testHandledTerminalFailure, only with a Deferred which fires
        asynchronously with an error.
        c              3   6   K   	 | V  d S # t           $ r Y d S w xY wr   r,   r   s    r   _genHandledTerminalAsyncFailurezSBasicTests.testHandledTerminalAsyncFailure.<locals>._genHandledTerminalAsyncFailure   s:      $   s   
 
rU   N)r   r   errbackr,   rC   r;   )r@   r\   r   deferredGeneratorResultDeferreds       r   testHandledTerminalAsyncFailurez*BasicTests.testHandledTerminalAsyncFailure   sn     
	 	 
	 JJ*I*I!*L*L'			#$>??@@@.::4;KTRRRr   c                     t                      fdt          fd            }t                       |            }                    t          d                     |                    | j        d          S )z
        Just like testHandledCoroAsyncFailure, only with a Deferred which fires
        asynchronously with an error and is wrapped in coroutine.
        c                     K     d {V S r   r2   r[   s   r   coroz4BasicTests.testHandledCoroAsyncFailure.<locals>.coro   s      777777Nr   c               3   H   K   	               V  d S # t           $ r Y d S w xY wr   rZ   )rb   s   r   functionz8BasicTests.testHandledCoroAsyncFailure.<locals>.function   sA      dff$   s    
!!rU   N)r   r   r]   r,   rC   r;   )r@   rd   inlineResultDeferredrb   r   s      @@r   testHandledCoroAsyncFailurez&BasicTests.testHandledCoroAsyncFailure   s     JJ	 	 	 	 	 
	 	 	 	 
	 JJ'xzz			#$>??@@@#//0@$GGGr   c                 h    t           d             } |                                | j        d          S )zj
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        c               3   P   K   t          d          D ]} t          d          V  dS Ni  rK   r   )ranger   r>   s    r   _genStackUsagez1BasicTests.testStackUsage.<locals>._genStackUsage   s5      4[[ ! !ajj    1r   r   rB   )r@   rl   s     r   testStackUsagezBasicTests.testStackUsage   s@     
	 	 
	 ~++D,<a@@@r   c                 h    t           d             } |                                | j        d          S )zg
        Make sure we don't blow the stack when yielding immediately
        available values.
        c               3   6   K   t          d          D ]} dV  dS ri   )rj   rk   s    r   _genStackUsage2z3BasicTests.testStackUsage2.<locals>._genStackUsage2   s+      4[[  1r   r   rB   )r@   rp   s     r   testStackUsage2zBasicTests.testStackUsage2   s@     
	 	 
	   ,,T-=qAAAr   c                 l    d }t          |          } |                                | j        d          S )z
        Ensure that yielding a non-deferred passes it back as the
        result of the yield expression.

        @return: A L{twisted.internet.Deferred}
        @rtype: L{twisted.internet.Deferred}
        c               3      K   dV  dS N   r2   r2   r   r   _testz.BasicTests.testYieldNonDeferred.<locals>._test   s      GGG1r   ru   rB   )r@   rv   s     r   testYieldNonDeferredzBasicTests.testYieldNonDeferred   s?    	 	 	  &&uww""4#3Q777r   c                 l    d }t          |          } |                                | j        d          S )z9Ensure a standard python return results in a None result.c               3      K   dV  d S rt   r2   r2   r   r   	_noReturnz/BasicTests.testReturnNoValue.<locals>._noReturn   s      GGGFr   NrB   )r@   rz   s     r   testReturnNoValuezBasicTests.testReturnNoValue   s?    	 	 	 $I..	y{{&&t'7>>>r   c                 l   t           d             } |            }|                                 }|                     dt          |                     |                     t
          |d         d                    |                     d|d         d                    |                    | j        d          S )z?C{returnValue} is now deprecated but continues to be available.c               3   0   K   dV  t          d           d S )Nru      r   r2   r   r   _returnz5BasicTests.testReturnValueDeprecated.<locals>._return  s      GGGNNNNNr   rK   r   category<twisted.internet.defer.returnValue was deprecated in Twistedmessager~   )r   flushWarningsr;   lenassertIsDeprecationWarningassertInrC   )r@   r   r   warningss       r   testReturnValueDeprecatedz$BasicTests.testReturnValueDeprecated  s     
	 	 
	 GII%%''CMM***((1+j*ABBBJQK	"	
 	
 	

 }}T-q111r   c           	          d }t          |          }|                     dt          |                     t          |                               dS )z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator returns something other than a generator.
        c                      dS rt   r2   r2   r   r   _noYieldz4BasicTests.test_nonGeneratorReturn.<locals>._noYield  s    1r   r   Nr   r   r<   assertRaises	TypeErrorr@   r   s     r   test_nonGeneratorReturnz"BasicTests.test_nonGeneratorReturn  sS    	 	 	 #8,,'T->->y(-S-S)T)TUUUUUr   c           	          d }t          |          }|                     dt          |                     t          |                               dS )z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator calls L{returnValue}.
        c                  $    t          d           d S rt   r   r2   r   r   r   z9BasicTests.test_nonGeneratorReturnValue.<locals>._noYield(  s    NNNNNr   r   Nr   r   s     r   test_nonGeneratorReturnValuez'BasicTests.test_nonGeneratorReturnValue"  sS    	 	 	 #8,,'T->->y(-S-S)T)TUUUUUr   c                 d   t          j                    t          fd            t          fd            } |            }                    d           |                     |          }|                                 }|                     dt          |                     |                     t          |d         d                    | 
                    d|d         d                    |                     d|           |                     d	|           | 
                    d
|           dS )z
        When one inlineCallbacks calls another, the internal L{_DefGen_Return}
        flow control exception raised by calling L{defer.returnValue} doesn't
        leak into tracebacks captured in the caller.
        c               3   X   K   t          j         d          V  t          d           dS )zG
            This is the inner function using returnValue.
            r   z"actual-value-not-used-for-the-testN)r
   
deferLaterr   clocks   r   _returnszEBasicTests.test_internalDefGenReturnValueDoesntLeak.<locals>._returns7  s6      
 /%+++++<=====r   c               3      K   	               V  t          d          # t           $ r t          j                    cY S w xY w)Nzboom returnValuer,   	traceback
format_excr   s   r   _raiseszDBasicTests.test_internalDefGenReturnValueDoesntLeak.<locals>._raises?  s]      .hjj   '(:;;;$ . . . +-----.     A A r   rK   r   r   r   _DefGen_ReturnBDuring handling of the above exception, another exception occurredz1test_inlinecb.TerminalException: boom returnValueN)r
   Clockr   advancesuccessResultOfr   r;   r   r   r   r   assertNotIn)r@   r   r   tbr   r   r   s        @@r   (test_internalDefGenReturnValueDoesntLeakz3BasicTests.test_internalDefGenReturnValueDoesntLeak/  sO    
		> 	> 	> 	> 
	> 
	. 	. 	. 	. 
	. GIIa!!!$$%%''CMM***((1+j*ABBBJQK	"	
 	
 	
 	)2...PRT	
 	
 	
 	I2NNNNNr   c                 d   t          j                    t          fd            t          fd            } |            }                    d           |                     |          }|                     d|           |                     d|           |                     d|           dS )a  
        When one inlineCallbacks calls another, the internal L{StopIteration}
        flow control exception generated when the inner generator returns
        doesn't leak into tracebacks captured in the caller.

        This is similar to C{test_internalDefGenReturnValueDoesntLeak} but the
        inner function uses the "normal" return statemement rather than the
        C{returnValue} helper.
        c               3   :   K   t          j         d          V  dS )Nr   r~   )r
   r   r   s   r   r   zABasicTests.test_internalStopIterationDoesntLeak.<locals>._returnsh  s$      /%+++++1r   c               3      K   	               V  t          d          # t           $ r t          j                    cY S w xY w)Nzboom normal returnr   r   s   r   r   z@BasicTests.test_internalStopIterationDoesntLeak.<locals>._raisesm  s]      .hjj   '(<===$ . . . +-----.r   r   StopIterationr   z3test_inlinecb.TerminalException: boom normal returnN)r
   r   r   r   r   r   r   )r@   r   r   r   r   r   s       @@r   $test_internalStopIterationDoesntLeakz/BasicTests.test_internalStopIterationDoesntLeak\  s     
		 	 	 	 
	 
	. 	. 	. 	. 
	. GIIa!!!$$ 	"---PRT	
 	
 	
 	KRPPPPPr   zGC works differently on PyPy.r#   Nc                    t                      }t          j        |          }t          dt          dt          fd            } ||          }|                     ||                     |                     t          j        |          }~~|                      |                       |                      |                       dS )a  
        When using L{defer.inlineCallbacks}, after the function exits, it will
        not keep references to the function itself or the arguments.

        This ensures that the machinery gets deallocated immediately rather than
        waiting for a GC, on CPython.

        The GC on PyPy works differently (del doesn't immediately deallocate the
        object), so we skip the test.
        ar#   c              3      K   | V  | S r   r2   r   s    r   funcz@BasicTests.test_inlineCallbacksNoCircularReference.<locals>.func  s      GGGHr   N)setweakrefrefr   r   r;   r   assertIsNone)r@   obj
objWeakRefr   funcDfuncDWeakRefs         r   'test_inlineCallbacksNoCircularReferencez2BasicTests.test_inlineCallbacksNoCircularReference  s     [%%
		C 	C 	 	 	 
	
 S		d22599:::{5))  	**,,''',,..)))))r   r#   N)r.   r/   r0   r1   rE   rH   rN   rR   rW   r_   rf   rm   rq   rw   r{   r   r   r   r   r   pyunitskipIfr   r   r2   r   r   r4   r4   C   sg        C C C*C C C&M M MA A AP P P S S S$H H H.A A AB B B8 8 8"	? 	? 	?2 2 2(V V VV V V+O +O +OZ$Q $Q $QL V]59::!* !* !* ;:!* !* !*r   r4   c                       e Zd ZdZd ZdS )StopIterationReturnTestsz
    On Python 3.4 and newer generator functions may use the C{return} statement
    with a value, which is attached to the L{StopIteration} exception that is
    raised.

    L{inlineCallbacks} will use this value when it fires the C{callback}.
    c                     dt           i}t          d|           t                      } |d         |          }|                    d           |                     |                     |          d           dS )z
        If the C{return} statement has a value it is propagated back to the
        L{Deferred} that the C{inlineCallbacks} function returned.
        r   z>
@inlineCallbacks
def f(d):
    yield d
    return 14
        r'   N   )r   execr   r   r;   r   )r@   environd1d2s       r   test_returnWithValuez-StopIterationReturnTests.test_returnWithValue  s    
 %o6 	
 	
 	
 ZZWS\"
D--b11266666r   N)r.   r/   r0   r1   r   r2   r   r   r   r     s-         7 7 7 7 7r   r   c                   N    e 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dS )StackedInlineCallbacksTestsz
    We have an optimization that invokes generators directly when an
    inlineCallbacks-decorated function yields value directly to yield of
    another inlineCallbacks-decorated function.
    c                     |D ]E\  }}t          |t                    r|                    |           0|                    |           FdS )z
        Given a list of L{Deferred}, value tuples, invokes each L{Deferred}
        with the corresponding value. Depending on whether value is an
        exception, either callback or errback is called.
        N)
isinstance	Exceptionr]   r   )r@   deferredListr   r>   s       r   runCallbacksOnDeferredsz3StackedInlineCallbacksTests.runCallbacksOnDeferreds  sU     ! 	 	DAq!Y'' 		!

1		 	r   c                 J   g g t           fd            t           fd            t           fd            } |d          }|                                |                     |                     |          d           |                     g d           dS )z
        Tests the case when a chain of L{inlineCallbacks} calls end up
        yielding and blocking on a L{Deferred}.
        c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           | S Nf1 enterrK   f1 exitappendr   r>   r   r   expectationss     r   f1zIStackedInlineCallbacksTests.test_nonCalledDeferredSingleYield.<locals>.f1  o      Q000

AA'''AFAA///Hr   c              3      K                        d| f            |           V } | dz  }                      d| f           | S Nf2 enter   f2 exitr   r>   r   r   s    r   f2zIStackedInlineCallbacksTests.test_nonCalledDeferredSingleYield.<locals>.f2  V      Q000beeAFAA///Hr   c              3      K                        d| f            |           V } | dz  }                      d| f           | S Nf3 enter   f3 exitr   r>   r   r   s    r   f3zIStackedInlineCallbacksTests.test_nonCalledDeferredSingleYield.<locals>.f3  r   r   rK      r   rK   r   rK   r   rK   r   r   r   r   r   r   Nr   r   r;   r   r@   r   resr   r   r   r   s      @@@@r   !test_nonCalledDeferredSingleYieldz=StackedInlineCallbacksTests.test_nonCalledDeferredSingleYield  s   
  			 		 		 		 		 
		 
	 	 	 	 	 
	 
	 	 	 	 	 
	 bee$$\222--c22A666  
	
 
	
 
	
 
	
 
	
r   c                 0   g g t           fd            fdt           fd            } |d          }|                                |                     |                     |          d           |                     g d           dS )z
        Tests the case when a chain of L{inlineCallbacks} mixed with coroutine
        calls end up yielding and blocking on a L{Deferred}.
        c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           t          |            d S r   r   r   r   r   s     r   r   zMStackedInlineCallbacksTests.test_nonCalledDeferredSingleYieldCoro.<locals>.f1  y      Q000

AA'''AFAA///NNNNNr   c                    K                        d| f            |            d {V } | dz  }                      d| f           | S r   r   r   s    r   r   zMStackedInlineCallbacksTests.test_nonCalledDeferredSingleYieldCoro.<locals>.f2(  s^      Q000beeAFAA///Hr   c              3      K                        d| f            |           V } | dz  }                      d| f           t          |            d S r   r   r   r   s    r   r   zMStackedInlineCallbacksTests.test_nonCalledDeferredSingleYieldCoro.<locals>.f31  s`      Q000beeAFAA///NNNNNr   rK   r   r   Nr   r   s      @@@@r   %test_nonCalledDeferredSingleYieldCorozAStackedInlineCallbacksTests.test_nonCalledDeferredSingleYieldCoro  s    
  			 		 		 		 		 
			 	 	 	 	 	 
	 	 	 	 	 
	 bee$$\222--c22A666  
	
 
	
 
	
 
	
 
	
r   c                 Z   g g t           fd            t           fd            t           fd            } |d          }D ]\  }}|                    |           |                     |                     |          d           |                     g d           dS )z
        Tests the case when a chain of L{inlineCallbacks} calls end up yielding
        and blocking on a L{Deferred}. In this case the same decorated function
        is yielded multiple times.
        c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           | S r   r   r   s     r   r   zLStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYields.<locals>.f1V  r   r   c              3      K                        d| f            |           V }  |           V }  |           V } | dz  }                      d| f           | S r   r   r   s    r   r   zLStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYields.<locals>.f2b  x      Q000beeAbeeAbeeAFAA///Hr   c              3      K                        d| f            |           V }  |           V }  |           V } | dz  }                      d| f           | S r   r   r   s    r   r   zLStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYields.<locals>.f3n  r  r   rK      r   r   r   r   r   r   r      )r   r	  )r   r   )r   r~   )r   r~   )r   r~   )r      )r   r
  )r   r   )r   r   )r   	   )r      )r   r  )r   r  )r      )r   r  )r      )r   r  )r   r   )r      )r   r  Nr   r   r;   r   	r@   r   r   r   r>   r   r   r   r   s	        @@@@r   $test_nonCalledDeferredMultipleYieldsz@StackedInlineCallbacksTests.test_nonCalledDeferredMultipleYieldsK  s     			 		 		 		 		 
		 
		 		 		 		 		 
		 
		 		 		 		 		 
		 bee  	 	DAqJJqMMMM--c22B777  	
 	
 	
 	
 	
r   c                 @   g g t           fd            fdt           fd            } |d          }D ]\  }}|                    |           |                     |                     |          d           |                     g d           dS )z
        Tests the case when a chain of L{inlineCallbacks} calls mixed with async
        function calls end up yielding and blocking on a L{Deferred}. In this case
        the same decorated function is yielded multiple times.
        c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           t          |            d S r   r   r   s     r   r   zPStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYieldsCoro.<locals>.f1  r   r   c                    K                        d| f            |            d {V }  |            d {V }  |            d {V } | dz  }                      d| f           | S r   r   r   s    r   r   zPStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYieldsCoro.<locals>.f2  s      Q000beeAbeeAbeeAFAA///Hr   c              3      K                        d| f            |           V }  |           V }  |           V } | dz  }                      d| f           t          |            d S r   r   r   s    r   r   zPStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYieldsCoro.<locals>.f3  s      Q000beeAbeeAbeeAFAA///NNNNNr   rK   r  r  Nr  r  s	        @@@@r   (test_nonCalledDeferredMultipleYieldsCorozDStackedInlineCallbacksTests.test_nonCalledDeferredMultipleYieldsCoro  s     			 		 		 		 		 
				 		 		 		 		 		 
		 		 		 		 		 
		 bee  	 	DAqJJqMMMM--c22B777  	
 	
 	
 	
 	
r   c                     g t           fd            fdt           fd            }|                     |                      |d                    d           |                     g d           dS )a  
        Tests the case when a L{Deferred} produced from L{inlineCallbacks} gets
        a callback added via L{addCallback} and then yielded in a function
        decorated with L{inlineCallbacks}. In this case the initial L{Deferred}
        already has a value.
        c              3   z   K                        d| f           | V } | dz  }                      d| f           | S r   r   r>   r   s    r   r   zQStackedInlineCallbacksTests.test_intermediateAddCallbacksAndNoWaiting.<locals>.f1  sN      Q000AFAA///Hr   c                 n                         d| f           | dz  }                      d| f           | S r   r   r  s    r   r   zQStackedInlineCallbacksTests.test_intermediateAddCallbacksAndNoWaiting.<locals>.f2  A    Q000FAA///Hr   c              3      K                        d| f            |           }|                               |V } | dz  }                      d| f           | S r   r   rC   r>   r   r   r   r   s     r   r   zQStackedInlineCallbacksTests.test_intermediateAddCallbacksAndNoWaiting.<locals>.f3  m      Q0001AMM"AFAA///Hr   rK   r   r   r   r   r   r   r   r   N)r   r;   r   )r@   r   r   r   r   s     @@@r   )test_intermediateAddCallbacksAndNoWaitingzEStackedInlineCallbacksTests.test_intermediateAddCallbacksAndNoWaiting  s     		 	 	 	 
		 	 	 	 	 
		 		 		 		 		 		 
		 	--bbee44a888  
	
 
	
 
	
 
	
 
	
r   c                 0   g g t           fd            fdt           fd            } |d          }|                                |                     |                     |          d           |                     g d           dS )a4  
        Tests the case when a L{Deferred} produced from L{inlineCallbacks} gets
        a callback added via L{addCallback} and then yielded in a function
        decorated with L{inlineCallbacks}. In this case the initial L{Deferred}
        does not have a value and blocks entire callback chain.
        c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           | S r   r   r   s     r   r   z]StackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingFirstYield.<locals>.f10  r   r   c                 n                         d| f           | dz  }                      d| f           | S r   r   r  s    r   r   z]StackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingFirstYield.<locals>.f2<  r  r   c              3      K                        d| f            |           }|                               |V } | dz  }                      d| f           | S r   r  r  s     r   r   z]StackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingFirstYield.<locals>.f3B  r   r   rK   r   r!  Nr   r   s      @@@@r   5test_intermediateAddCallbacksAndWithWaitingFirstYieldzQStackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingFirstYield$  s      			 		 		 		 		 
			 	 	 	 	 
		 		 		 		 		 		 
		 bee$$\222--c22A666  
	
 
	
 
	
 
	
 
	
r   c                 0   g g t           fd            fdt           fd            } |d          }|                                |                     |                     |          d           |                     g d           dS )a  
        Tests the case when a L{Deferred} produced from L{inlineCallbacks} gets
        a callback added via L{addCallback} and then yielded in a function
        decorated with L{inlineCallbacks}. In this case the initial L{Deferred}
        does not have a value and blocks the entire callback chain.
        Additionally, a subsequent L{Deferred} blocks the entire callback chain
        again.
        c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           | S r   r   r   s     r   r   z^StackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingSecondYield.<locals>.f1l  r   r   c                 n                         d| f           | dz  }                      d| f           | S r   r   r  s    r   r   z^StackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingSecondYield.<locals>.f2x  r  r   c              3      K                        d| f            |           V }  |           }|                               |V } | dz  }                      d| f           | S r   r  r  s     r   r   z^StackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingSecondYield.<locals>.f3~  s~      Q000beeA1AMM"AFAA///Hr   rK   r  )r   r   r   r  r  )r   r	  )r   ru   )r   r  Nr   r   s      @@@@r   6test_intermediateAddCallbacksAndWithWaitingSecondYieldzRStackedInlineCallbacksTests.test_intermediateAddCallbacksAndWithWaitingSecondYield^  s      			 		 		 		 		 
			 	 	 	 	 

	 
	 
	 
	 
	 
	 

	 bee$$\222--c22A666	 	 		
 	
 	
 	
 	
r   c                 R    g g  G d dt                     t          fd            t           fd            } |d          }                                                                          |          d                                g d           dS )	z
        Tests the case when a function decorated with L{inlineCallbacks} yields
        a L{Deferred} that results in a failure.
        c                       e Zd ZdS )iStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingFirstCallback.<locals>.MyExceptionNr.   r/   r0   r2   r   r   MyExceptionr0            Dr   r2  c              3      K                        d| f           t                      }                     |             f           |V }                      d| f           | S Nr   r   r   r>   r   r2  r   r   s     r   r   z`StackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingFirstCallback.<locals>.f2  o      Q000

AKKMM 2333A
 A///Hr   c              3      K                        d| f                                         5   |           V } d d d            n# 1 swxY w Y   | dz  }                      d| f           | S r   r   r   )r>   r2  r   r   r@   s    r   r   z`StackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingFirstCallback.<locals>.f3  s      Q000"";//    "Q%%KK                             FAA///Hs   A

AArK   ru   )r   r   )r   ru   Nr   r   r   r;   r   )r@   r   r   r2  r   r   r   s   `  @@@@r   8test_raisesExceptionFromDeferredWithWaitingFirstCallbackzTStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingFirstCallback  s   
  	 	 	 	 	) 	 	 	 
	 	 	 	 	 	 
	 
	 	 	 	 	 	 	 
	 bee$$\222--c22A666  	
 	
 	
 	
 	
r   c                 |    g g  G d dt                     t          fd            t          fd            t           fd            } |d          }                                                                          |          d                                g d           d	S )
a  
        Tests the case when a function decorated with L{inlineCallbacks} blocks
        on a L{Deferred} produced by another function decorated with
        L{inlineCallbacks}. Once that unblocks, a L{Deferred} that results
        in an failure is yielded.
        c                       e Zd ZdS )jStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingSecondCallback.<locals>.MyExceptionNr1  r2   r   r   r2  r>    r3  r   r2  c              3      K                        d| f           t                      }                     || f           |V } | dz  }                      d| f           | S r   r   r   s     r   r   zaStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingSecondCallback.<locals>.f1  r   r   c              3      K                        d| f           t                      }                     |             f           |V }                      d| f           | S r5  r   r6  s     r   r   zaStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingSecondCallback.<locals>.f2  r7  r   c              3      K                        d| f            |           V }                               5   |           V } d d d            n# 1 swxY w Y   | dz  }                      d| f           | S r   r9  )r>   r2  r   r   r   r@   s    r   r   zaStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingSecondCallback.<locals>.f3  s      Q000beeA"";//    "Q%%KK                             FAA///Hs   AAArK   r~   )r   r   r   r"  )r   r~   Nr:  )r@   r   r   r2  r   r   r   r   s   `  @@@@@r   9test_raisesExceptionFromDeferredWithWaitingSecondCallbackzUStackedInlineCallbacksTests.test_raisesExceptionFromDeferredWithWaitingSecondCallback  sM     	 	 	 	 	) 	 	 	 
		 		 		 		 		 
		 
	 	 	 	 	 	 
	 
		 		 		 		 		 		 		 		 
		 bee$$\222--c22A666  		
 		
 		
 		
 		
r   N)r.   r/   r0   r1   r   r   r   r  r  r#  r(  r-  r;  rB  r2   r   r   r   r     s         
 
 
8
 8
 8
t7
 7
 7
rR
 R
 R
hQ
 Q
 Q
f0
 0
 0
d8
 8
 8
t=
 =
 =
~0
 0
 0
dA
 A
 A
 A
 A
r   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )NonLocalExitTestsa  
    It's possible for L{returnValue} to be (accidentally) invoked at a stack
    level below the L{inlineCallbacks}-decorated function which it is exiting.
    If this happens, L{returnValue} should report useful errors.

    If L{returnValue} is invoked from a function not decorated by
    L{inlineCallbacks}, it will emit a warning if it causes an
    L{inlineCallbacks} function further up the stack to exit.
    c                 $    t          d           dS )z
        This method mistakenly invokes L{returnValue}, despite the fact that it
        is not decorated with L{inlineCallbacks}.
        rK   Nr   r@   s    r   mistakenMethodz NonLocalExitTests.mistakenMethod  s    
 	Ar   c                    |                      |dg           |                     | j        g          }|                      t          |          d           |                      |d         d         t                     |                      |d         d         t                     |                     d|d         d                    |                      |d         d         d           d	S )
ac  
        Flush the current warnings and assert that we have been told that
        C{mistakenMethod} was invoked, and that the result from the Deferred
        that was fired (appended to the given list) is C{mistakenMethod}'s
        result.  The warning should indicate that an inlineCallbacks function
        called 'inline' was made to exit.
        rK   )offendingFunctionsr   r   r   r   r   zreturnValue() in 'mistakenMethod' causing 'inline' to exit: returnValue should only be invoked by functions decorated with inlineCallbacksN)r;   r   rG  r   r   r   )r@   
resultListr   s      r   assertMistakenMethodWarningz-NonLocalExitTests.assertMistakenMethodWarning%  s     	aS)))%%$:M9N%OOX***!Z02DEEE!Z02DEEEJQK	"	
 	
 	
 	QK	"	
 	
 	
 	
 	
r   c                      t            fd            } |            }g }|                    |j                                        |           dS )z
        L{returnValue} will emit a non-local exit warning in the simplest case,
        where the offending function is invoked immediately.
        c               3   Z   K                                      t          d           dV  d S )Nr   r   rG  r   rF  s   r   inlinezANonLocalExitTests.test_returnValueNonLocalWarning.<locals>.inlineC  s1      !!!NNNGGGGGr   N)r   rC   r   rK  )r@   rO  r   resultss   `   r   test_returnValueNonLocalWarningz1NonLocalExitTests.test_returnValueNonLocalWarning=  sh     
	 	 	 	 
	
 FHH	gn%%%((11111r   c                     t                      t           fd            } |            }g }|                    |j                                        |g                                d                                |           dS )z
        L{returnValue} will emit a non-local warning in the case where the
        L{inlineCallbacks}-decorated function has already yielded a Deferred
        and therefore moved its generator function along.
        c               3   Z   K    V                                    t          d           d S )Nr   rN  )causer@   s   r   rO  zBNonLocalExitTests.test_returnValueNonLocalDeferred.<locals>.inlineV  s1      KKK!!!NNNNNr   rK   N)r   r   rC   r   r;   r   rK  )r@   rO  effectrP  rT  s   `   @r    test_returnValueNonLocalDeferredz2NonLocalExitTests.test_returnValueNonLocalDeferredN  s     

		 	 	 	 	 
	
 7>***"%%%q((11111r   N)r.   r/   r0   r1   rG  rK  rQ  rV  r2   r   r   rD  rD    sZ           
 
 
02 2 2"2 2 2 2 2r   rD  c                   .    e Zd Zd Zd Zd Zd ZddZdS )	ForwardTraceBackTestsc                 6   t           d             t           fd            } |            }|                     |          }|                                }|                     d|           |                     d|           |                     d|           dS )z
        Chained inlineCallbacks are forwarding the traceback information
        from generator to generator.

        A first simple test with a couple of inline callbacks.
        c               3   ,   K   dV  t          d          Nzforcing generatorError Markerr   r2   r   r   erroringz>ForwardTraceBackTests.test_forwardTracebacks.<locals>.erroringm         %%%%N+++r   c               3   $   K                 V  d S r   r2   r^  s   r   callingz=ForwardTraceBackTests.test_forwardTracebacks.<locals>.callingr        (**r   in erroring
in callingr\  N)r   failureResultOfgetTracebackr   )r@   rb  r   r'   r   r^  s        @r   test_forwardTracebacksz,ForwardTraceBackTests.test_forwardTracebackse  s     
	, 	, 
	, 
	 	 	 	 
	 GII  ##^^mR(((lB'''nb)))))r   c                 l     d t           fd            } |            }|j         fd            }|S )z
        Chained inlineCallback and coroutine are forwarding the traceback
        information from coroutine to generator.
        c                  N   K   t          d           d {V  t          d          )Nr   r\  )r   r   r2   r   r   r^  zBForwardTraceBackTests.test_forwardTracebacksCoro.<locals>.erroring  s4      %g.........N+++r   c               3   $   K                 V  d S r   r2   ra  s   r   rb  zAForwardTraceBackTests.test_forwardTracebacksCoro.<locals>.calling  rc  r   c                     |                                  }                    d|                               d|                               d|           d S )Nrd  re  r\  )rg  r   )r'   r   r@   s     r   checkz?ForwardTraceBackTests.test_forwardTracebacksCoro.<locals>.check  sT    !!BMM-,,,MM,+++MM."-----r   )r   
addErrback)r@   rb  r   rm  r^  s   `   @r   test_forwardTracebacksCoroz0ForwardTraceBackTests.test_forwardTracebacksCoro}  sq    	, 	, 	, 
	 	 	 	 
	 GII	
	. 	. 	. 	. 
	. r   c                 V   t           d             t           fd            t           fd            t           fd            } |            }|                     |          }|                                }|                     d|           |                     d|           |                     d|           |                     d|           |                     d	|           |                     d
|           |                     d|                                           dS )a  
        Several Chained inlineCallbacks gives information about all generators.

        A wider test with a 4 chained inline callbacks.

        Application stack-trace should be reported, and implementation details
        like "throwExceptionIntoGenerator" symbols are omitted from the stack.

        Note that the previous test is testing the simple case, and this one is
        testing the deep recursion case.

        That case needs specific code in failure.py to accomodate to stack
        breakage introduced by throwExceptionIntoGenerator.

        Hence we keep the two tests in order to sort out which code we
        might have regression in.
        c               3   ,   K   dV  t          d          r[  r]  r2   r   r   r^  zDForwardTraceBackTests.test_forwardLotsOfTracebacks.<locals>.erroring  r_  r   c               3   $   K                 V  d S r   r2   ra  s   r   calling3zDForwardTraceBackTests.test_forwardLotsOfTracebacks.<locals>.calling3  rc  r   c               3   $   K                 V  d S r   r2   rs  s   r   calling2zDForwardTraceBackTests.test_forwardLotsOfTracebacks.<locals>.calling2  rc  r   c               3   $   K                 V  d S r   r2   rv  s   r   rb  zCForwardTraceBackTests.test_forwardLotsOfTracebacks.<locals>.calling  rc  r   rd  re  in calling2in calling3throwExceptionIntoGeneratorr\  Nr   rf  rg  r   r   r@   rb  r   r'   r   rv  rs  r^  s        @@@r   test_forwardLotsOfTracebacksz2ForwardTraceBackTests.test_forwardLotsOfTracebacks  s]   & 
	, 	, 
	, 
	 	 	 	 
	 
	 	 	 	 
	 
	 	 	 	 
	 GII  ##^^mR(((lB'''mR(((mR(((6;;;nb)))mQ^^%5%566666r   c                 <   t           d             fdt           fd            t           fd            } |            }|                     |          }|                                }|                     d|           |                     d|           |                     d|           |                     d|           |                     d	|           |                     d
|           |                     d|                                           dS )z
        Several chained inlineCallbacks mixed with coroutines gives information
        about all generators.

        A wider test with a 4 chained inline callbacks.
        c               3   ,   K   dV  t          d          r[  r]  r2   r   r   r^  zHForwardTraceBackTests.test_forwardLotsOfTracebacksCoro.<locals>.erroring  r_  r   c                  ,   K                  d {V  d S r   r2   ra  s   r   rs  zHForwardTraceBackTests.test_forwardLotsOfTracebacksCoro.<locals>.calling3  s+      (**r   c               3   $   K                 V  d S r   r2   ru  s   r   rv  zHForwardTraceBackTests.test_forwardLotsOfTracebacksCoro.<locals>.calling2  rc  r   c               3   $   K                 V  d S r   r2   rx  s   r   rb  zGForwardTraceBackTests.test_forwardLotsOfTracebacksCoro.<locals>.calling  rc  r   rd  re  ry  rz  r{  r\  Nr|  r}  s        @@@r    test_forwardLotsOfTracebacksCoroz6ForwardTraceBackTests.test_forwardLotsOfTracebacksCoro  sQ    
	, 	, 
	,	 	 	 	 	 
	 	 	 	 
	 
	 	 	 	 
	 GII  ##^^mR(((lB'''mR(((mR(((6;;;nb)))mQ^^%5%566666r   r#   Nc                 p   t          d          }t                      }	 |                                 n$# t          $ r |                                 Y nw xY wdt
          dt          t          t          df         fd}t          |           | 	                    |          }t          j        |                                          }|                     t          |          d           |                     d|d         d	                    |                     d
|d         d                    |                     d|d         d                    |                     d|d	         d	                    |                     d|d	         d                    |                     d|d	         d                    dS )z
        L{defer.inlineCallbacks} that receives tracebacks from a regular Deferred and
        re-raise tracebacks into their deferred should not lose their tracebacks.
        r"   r   r#   Nc              3      K   | V  dS )aJ  
            This is never called.
            It is only used as the decorated function.
            The resulting function is never called in this test.
            This is used to make sure that if we wrap
            an already failed deferred, inlineCallbacks
            will not add any extra traceback frames.
            Nr2   r[   s    r   iczDForwardTraceBackTests.test_reraiseTracebacksFromDeferred.<locals>.ic  s       GGGGGr   r	  test_inlinecbr   r   r(   zraise ZeroDivisionError(msg)"test_reraiseTracebacksFromDeferredzf.raiseException())r(   r   raiseExceptionr&   r]   objectr   r   r   rf  r   
extract_tbgetTracebackObjectr;   r   r   )r@   r'   r   r  
newFailurer   s         r   r  z8ForwardTraceBackTests.test_reraiseTracebacksFromDeferred  s   
 u%%$JJ	 	 	 	IIKKKKK			& 		YsC~6 		 		 		 		 	))!,,
!*"?"?"A"ABBR!$$$or!uQx000-r!uQx8887AqBBBor!uQx000=r!uQxHHH-r!uQx88888s   4 AAr   )r.   r/   r0   rh  ro  r~  r  r  r2   r   r   rX  rX  d  sf        * * *0  2-7 -7 -7^!7 !7 !7F"9 "9 "9 "9 "9 "9r   rX  c                       e Zd ZdZdS )UntranslatedErrorzL
    Untranslated exception type when testing an exception translation.
    Nr-   r2   r   r   r  r               r   r  c                       e Zd ZdZdS )TranslatedErrorzJ
    Translated exception type when testing an exception translation.
    Nr-   r2   r   r   r  r    r  r   r  c                       e Zd ZdZd ZdS )DontFailz 
    Sample exception type.
    c                 H    t                               |            || _        d S r   )r   __init__actualValue)r@   actuals     r   r  zDontFail.__init__  s$    4   !r   N)r.   r/   r0   r1   r  r2   r   r   r  r    s-         " " " " "r   r  c                       e Zd ZdZdZdZdS )CancellationTestsStackedTyper   rK   r   N)r.   r/   r0   NOT_STACKEDSTACKED_INLINECBSTACKED_COROr2   r   r   r  r  #  s        KLLLr   r  c                   &   e Zd ZdZd Zd Zed             Zd Zed+d            Z	d Z
d,d	Zd-dZd Zd Zd Zd Zd Zd-dZd Zd Zd Zd Zd Zd-dZd Zd Zd Zd Zd Zd-dZd Zd Z d  Z!d! Z"d" Z#d-d#Z$d$ Z%d% Z&d& Z'd' Z(d( Z)d.d*Z*dS )/CancellationTestsa!  
    Tests for cancellation of L{Deferred}s returned by L{inlineCallbacks}.
    For each of these tests, let:
        - C{G} be a generator decorated with C{inlineCallbacks}
        - C{D} be a L{Deferred} returned by C{G}
        - C{C} be a L{Deferred} awaited by C{G} with C{yield}
    c                     g | _         dS )z>
        Set up the list of outstanding L{Deferred}s.
        N)deferredsOutstandingrF  s    r   setUpzCancellationTests.setUp2  s     %'!!!r   c                 N    | j         r|                                  | j         dS dS )zG
        If any L{Deferred}s are still outstanding, fire them.
        N)r  deferredGottenrF  s    r   tearDownzCancellationTests.tearDown8  sB     ' 	"!!! ' 	" 	" 	" 	" 	"r   c              #   "   K    |            V }|S r   r2   )r@   getChildDeferredr>   s      r   stackedInlineCBz!CancellationTests.stackedInlineCB?  s      ""$$$$r   c                 &   K    |             d {V S r   r2   )r@   r  s     r   stackedCorozCancellationTests.stackedCoroD  s'      %%'''''''''r   Nc              #   Z  K   || j         }	 |t          j        k    r |            V }nE|r|V  |t          j        k    r|                     |          V }n|                     |          V }n8# t          $ r t                      t          $ r}|j	        dz
  }Y d}~nd}~ww xY w|dz   S )z
        Generator for testing cascade cancelling cases.

        @param getChildDeferred: Some callable returning L{Deferred} that we
            awaiting (with C{yield})
        Nr   rK   )
getDeferredr  r  r  r  r  r  r  r  r  )r@   	stackTyper  firstDeferredr>   dfs         r   sampleInlineCBz CancellationTests.sampleInlineCBG  s       ##/	#8DDD**,,,,  ('''' < MMM"../?@@@@AA"223CDDDDA  	$ 	$ 	$!### 	# 	# 	#"AAAAAA	#1us   A"A0 0!B%
B  B%c                 h    | j                             t                                 | j         d         S )z
        A sample function that returns a L{Deferred} that can be fired on
        demand, by L{CancellationTests.deferredGotten}.

        @return: L{Deferred} that can be fired on demand.
        )r  r   r   rF  s    r   r  zCancellationTests.getDeferreda  s-     	!((444(,,r   c                 `    | j                             d                              |           dS )z
        Fire the L{Deferred} returned from the least-recent call to
        L{CancellationTests.getDeferred}.

        @param result: result object to be used when firing the L{Deferred}.
        r   N)r  popr   )r@   results     r   r  z CancellationTests.deferredGottenk  s/     	!%%a((11&99999r   Fc                 2   dgfd}d}|rt                      }|                     |||          }|                    d            |r|                    d           |                                 |                     d         t          d           dS )	z
        When C{D} cancelled, C{C} will be immediately cancelled too.

        @param stackType: defines test stacking scenario

        @param cancelOnSecondDeferred: if True, tests cancellation on the
            second yield in inlineCallbacks
        FAILUREc                  X    t                      } fd}|                     |           | S )Nc                 B    |                      t                    d<   | S r   )rm  r   )r  childResultHolders    r   _ebzTCancellationTests.doCascadeCancellingOnCancel.<locals>.getChildDeferred.<locals>._eb  s    '-||N'C'C!!$r   r   rn  )r   r  r  s     r   r  zGCancellationTests.doCascadeCancellingOnCancel.<locals>.getChildDeferred  s>    

A     LLHr   Nr  r  r  c                     d S r   r2   )r  s    r   <lambda>z?CancellationTests.doCascadeCancellingOnCancel.<locals>.<lambda>  s    D r   rK   r   zno cascade cancelling occurs)r   r  rn  r   cancelr;   r   )r@   r  cancelOnSecondDeferredr  r  r   r  s         @r   doCascadeCancellingOnCancelz-CancellationTests.doCascadeCancellingOnCancelt  s     'K	 	 	 	 	 ! 	'$JJM-'   
 

 	
(())) 	&""1%%%	


a *	
 	
 	
 	
 	
r   c                 D    |                      t          j                   d S r   )r  r  r  rF  s    r   (test_CascadeCancellingOnCancelNotStackedz:CancellationTests.test_CascadeCancellingOnCancelNotStacked       (()E)QRRRRRr   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   -test_CascadeCancellingOnCancelStackedInlineCbz?CancellationTests.test_CascadeCancellingOnCancelStackedInlineCb       (()E)VWWWWWr   c                 H    |                      t          j        d           d S NT)r  r  rF  s    r   =test_CascadeCancellingOnCancelStackedInlineCbOnSecondDeferredzOCancellationTests.test_CascadeCancellingOnCancelStackedInlineCbOnSecondDeferred  2    (((9RV 	) 	
 	
 	
 	
 	
r   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   )test_CascadeCancellingOnCancelStackedCoroz;CancellationTests.test_CascadeCancellingOnCancelStackedCoro       (()E)RSSSSSr   c                 H    |                      t          j        d           d S r  r  rF  s    r   9test_CascadeCancellingOnCancelStackedCoroOnSecondDeferredzKCancellationTests.test_CascadeCancellingOnCancelStackedCoroOnSecondDeferred  1    (((5d 	) 	
 	
 	
 	
 	
r   c                    d}|rt                      }|                     ||          }|r|                    d           |                                 |                     t
          |                     |          j                   dS )a  
        When C{D} cancelled, CancelledError from C{C} will be errbacked
        through C{D}.

        @param stackType: defines test stacking scenario

        @param cancelOnSecondDeferred: if True, tests cancellation on the
            second yield in inlineCallbacks
        N)r  r  rK   )r   r  r   r  r   r   rf  r  )r@   r  r  r  r   s        r   doErrbackCancelledErrorOnCancelz1CancellationTests.doErrbackCancelledErrorOnCancel  s     ! 	'$JJM)=QQ 	&""1%%%	


.$*>*>q*A*A*PQQQQQr   c                 D    |                      t          j                   d S r   )r  r  r  rF  s    r   "test_ErrbackCancelledErrorOnCancelz4CancellationTests.test_ErrbackCancelledErrorOnCancel  s     ,,-I-UVVVVVr   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   1test_ErrbackCancelledErrorOnCancelStackedInlineCbzCCancellationTests.test_ErrbackCancelledErrorOnCancelStackedInlineCb  s*    ,,(9	
 	
 	
 	
 	
r   c                 H    |                      t          j        d           d S r  r  rF  s    r   Atest_ErrbackCancelledErrorOnCancelStackedInlineCbOnSecondDeferredzSCancellationTests.test_ErrbackCancelledErrorOnCancelStackedInlineCbOnSecondDeferred  s2    ,,(9RV 	- 	
 	
 	
 	
 	
r   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   -test_ErrbackCancelledErrorOnCancelStackedCoroz?CancellationTests.test_ErrbackCancelledErrorOnCancelStackedCoro  s     ,,-I-VWWWWWr   c                 H    |                      t          j        d           d S r  r  rF  s    r   =test_ErrbackCancelledErrorOnCancelStackedCoroOnSecondDeferredzOCancellationTests.test_ErrbackCancelledErrorOnCancelStackedCoroOnSecondDeferred  s1    ,,(5d 	- 	
 	
 	
 	
 	
r   c                 B   d }d}|rt                      }t          |          |                     fd||          }|r|                    d           |                                 |                     t
          |                     |          j                   dS )z
        When C{D} is cancelled, and C raises a particular type of error, C{G}
        may catch that error at the point of yielding and translate it into
        a different error which may be received by application code.
        c                 H    |                      t                                 d S r   )r]   r  its    r   r  z;CancellationTests.doErrorToErrorTranslation.<locals>.cancel  s!    JJ(**+++++r   Nc                       S r   r2   r   s   r   r  z=CancellationTests.doErrorToErrorTranslation.<locals>.<lambda>      Q r   r  rK   )r   r  r   r  r   r  rf  r  )r@   r  r  r  r  r   r   s         @r   doErrorToErrorTranslationz+CancellationTests.doErrorToErrorTranslation  s    	, 	, 	, ! 	'$JJMV&YYY)=   
 
  	&""1%%%	


/4+?+?+B+B+QRRRRRr   c                 D    |                      t          j                   d S r   )r  r  r  rF  s    r   test_ErrorToErrorTranslationz.CancellationTests.test_ErrorToErrorTranslation  s     &&'C'OPPPPPr   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   +test_ErrorToErrorTranslationStackedInlineCbz=CancellationTests.test_ErrorToErrorTranslationStackedInlineCb  s     &&'C'TUUUUUr   c                 H    |                      t          j        d           d S r  r  rF  s    r   ;test_ErrorToErrorTranslationStackedInlineCbOnSecondDeferredzMCancellationTests.test_ErrorToErrorTranslationStackedInlineCbOnSecondDeferred  s2    &&(9RV 	' 	
 	
 	
 	
 	
r   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   'test_ErrorToErrorTranslationStackedCoroz9CancellationTests.test_ErrorToErrorTranslationStackedCoro  s     &&'C'PQQQQQr   c                 H    |                      t          j        d           d S r  r  rF  s    r   7test_ErrorToErrorTranslationStackedCoroOnSecondDeferredzICancellationTests.test_ErrorToErrorTranslationStackedCoroOnSecondDeferred  s1    &&(5d 	' 	
 	
 	
 	
 	
r   c                 B   d }d}|rt                      }t          |          |                     fd||          }g }|                    |j                   |r|                    d           |                                 |                     |dg           dS )z
        When C{D} is cancelled, and C{C} raises a particular type of error,
        C{G} may catch that error at the point of yielding and translate it
        into a result value which may be received by application code.
        c                 J    |                      t          d                     d S )Ni  )r]   r  r  s    r   r  z=CancellationTests.doErrorToSuccessTranslation.<locals>.cancel  s     JJx~~&&&&&r   Nc                       S r   r2   r   s   r   r  z?CancellationTests.doErrorToSuccessTranslation.<locals>.<lambda>  r  r   r  rK   i  )r   r  rC   r   r   r  assertEquals)r@   r  r  r  r  r   rP  r   s          @r   doErrorToSuccessTranslationz-CancellationTests.doErrorToSuccessTranslation   s    	' 	' 	' ! 	'$JJMV&YYY)=   
 
 	gn%%% 	&""1%%%	


'D6*****r   c                 D    |                      t          j                   d S r   )r  r  r  rF  s    r   test_ErrorToSuccessTranslationz0CancellationTests.test_ErrorToSuccessTranslation  r  r   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   -test_ErrorToSuccessTranslationStackedInlineCbz?CancellationTests.test_ErrorToSuccessTranslationStackedInlineCb  r  r   c                 H    |                      t          j        d           d S r  r  rF  s    r   =test_ErrorToSuccessTranslationStackedInlineCbOnSecondDeferredzOCancellationTests.test_ErrorToSuccessTranslationStackedInlineCbOnSecondDeferred  r  r   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   )test_ErrorToSuccessTranslationStackedCoroz;CancellationTests.test_ErrorToSuccessTranslationStackedCoro#  r  r   c                 H    |                      t          j        d           d S r  r  rF  s    r   9test_ErrorToSuccessTranslationStackedCoroOnSecondDeferredzKCancellationTests.test_ErrorToSuccessTranslationStackedCoroOnSecondDeferred&  r  r   c                    t                      fdfd}d}|rt                      }|                     |||          }|r|                    d           |                                 |                     |                               d           |                     |                     |          d           dS )a"  
        When C{D} is cancelled, it won't reach the callbacks added to it by
        application code until C{C} reaches the point in its callback chain
        where C{G} awaits it.  Otherwise, application code won't be able to
        track resource usage that C{D} may be using.
        c                 <    |                      t                     S r   )trapr   )r  moreDeferreds    r   deferMeMorezACancellationTests.doAsynchronousCancellation.<locals>.deferMeMore4  s    KK'''r   c                  N    t                      } |                                | S r   r  )r   r  s    r   deferMez=CancellationTests.doAsynchronousCancellation.<locals>.deferMe8  s#    

ALL%%%Hr   Nr  rK   i  i  )r   r  r   r  assertNoResultr;   r   )r@   r  r  r  r  r   r  r  s         @@r   doAsynchronousCancellationz,CancellationTests.doAsynchronousCancellation+  s      zz	  	  	  	  	 	 	 	 	 	
 ! 	'$JJM$	   
 
  	&""1%%%	


Ad###--a00$77777r   c                 D    |                      t          j                   d S r   )r  r  r  rF  s    r   test_AsynchronousCancellationz/CancellationTests.test_AsynchronousCancellationJ  s     ''(D(PQQQQQr   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   ,test_AsynchronousCancellationStackedInlineCbz>CancellationTests.test_AsynchronousCancellationStackedInlineCbM  s     ''(D(UVVVVVr   c                 H    |                      t          j        d           d S r  r  rF  s    r   <test_AsynchronousCancellationStackedInlineCbOnSecondDeferredzNCancellationTests.test_AsynchronousCancellationStackedInlineCbOnSecondDeferredP  s2    ''(9RV 	( 	
 	
 	
 	
 	
r   c                 D    |                      t          j                   d S r   r  r  r  rF  s    r   (test_AsynchronousCancellationStackedCoroz:CancellationTests.test_AsynchronousCancellationStackedCoroU  s     ''(D(QRRRRRr   c                 H    |                      t          j        d           d S r  r  rF  s    r   8test_AsynchronousCancellationStackedCoroOnSecondDeferredzJCancellationTests.test_AsynchronousCancellationStackedCoroOnSecondDeferredX  s1    ''(5d 	( 	
 	
 	
 	
 	
r   r#   c                 *   g }g }t          |j                  t          |j                  t          dt          t           t                   t          df         ffd            } |            }|                                |                                |                     |           |                     |g            |                     |g            |                                 |                     |g           |                     |g            |                     |           |                                 |                     |          }|                     |j	        t                     |                     |g           dS )a  
        Cancelling an L{defer.inlineCallbacks} correctly handles the function
        catching the L{defer.CancelledError}.

        The desired behavior is:
            1. If the function is waiting on an inner deferred, that inner
               deferred is cancelled, and a L{defer.CancelledError} is raised
               within the function.
            2. If the function catches that exception, execution continues, and
               the deferred returned by the function is not resolved.
            3. Cancelling the deferred again cancels any deferred the function
               is waiting on, and the exception is raised.
        r#   Nc               3   @   K   	  V  n# t           $ r Y nw xY wV  d S r   r]  )r   r   s   r   testFunczFCancellationTests.test_inlineCallbacksCancelCaptured.<locals>.testFuncp  sF          HHHHHs   
 
)r   r   r   r   r  r  r;   r  rf  typer   )r@   canceller1Callscanceller2Callsr  r   failurer   r   s         @@r   "test_inlineCallbacksCancelCapturedz4CancellationTests.test_inlineCallbacksCancelCaptured]  s    3524'(>??'(>??		)HV$4fd$BC 	 	 	 	 	 	 
	 

BBE""""---"---
 	2$///"---E"""
 	&&u--~6662$/////r   )NNr   )Fr   )+r.   r/   r0   r1   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r$  r2   r   r   r  r  )  s        ' ' '" " "   _( ( (    _2- - -: : : :%
 %
 %
 %
NS S SX X X
 
 

T T T
 
 

R R R R(W W W
 
 


 
 

X X X
 
 

S S S S,Q Q QV V V
 
 

R R R
 
 

+ + + +0S S SX X X
 
 

T T T
 
 

8 8 8 8>R R RW W W
 
 

S S S
 
 

50 50 50 50 50 50r   r  r   ).r1   r   unittestr   r   enumr   typingr   r   r   r   r   twisted.internetr	   r
   twisted.internet.deferr   r   r   r   r   r   r   twisted.python.compatr   twisted.trial.unittestr   r   r   r!   r<   r(   r*   r   r,   r4   r   r   rD  rX  r  r  r  r  r  r2   r   r   <module>r,     s  
                 3 3 3 3 3 3 3 3 3 3 3 3 3 3 * * * * * * * *                  ( ' ' ' ' ' @ @ @ @ @ @ @ @  , , , E#t),     ! !eCI&6 !$ ! ! ! !	 	 	 	 		 	 	 	a* a* a* a* a* a* a* a*H7 7 7 7 7x 7 7 7<K	
 K	
 K	
 K	
 K	
( K	
 K	
 K	
\N2 N2 N2 N2 N2 N2 N2 N2bf9 f9 f9 f9 f9/ f9 f9 f9R    	       i   " " " " "y " " "    4   i0 i0 i0 i0 i0+ i0 i0 i0 i0 i0r   