
    Ϫf4                     "   d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ d Zd	 Z G d
 de      Z G d d      Zd Z G d deej2                        Z G d deej2                        Z G d dej8                        Zy)zI
Tests for L{twisted.internet.defer.deferredGenerator} and related APIs.
    N)deferreactortask)DeferreddeferredGeneratorinlineCallbacksreturnValuewaitForDeferred)runWithWarningsSuppressed)unittest)suppressc                  \    t               } t        j                  d| j                  d       | S )Nr   hi)r   r   	callLatercallbackds    :/usr/lib/python3/dist-packages/twisted/test/test_defgen.pygetThingr      s$    
AaT*H    c                  R    t               fd} t        j                  d|        S )Nc                  :     j                  t        d             y )NOMG)errbackZeroDivisionErrorr   s   r   CRAPzgetOwie.<locals>.CRAP    s    			#E*+r   r   )r   r   r   )r   r   s    @r   getOwier      s&    
A, aHr   c                       e Zd Zy)TerminalExceptionN)__name__
__module____qualname__ r   r   r   r   +   s    r   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
BaseDefgenTestsa  
    This class sets up a bunch of test cases which will test both
    deferredGenerator and inlineCallbacks based generators. The subclasses
    DeferredGeneratorTests and InlineCallbacksTests each provide the actual
    generator implementations tested.
    c                 V    | j                         j                  | j                  d      S )z
        Test that a normal deferredGenerator works.  Tests yielding a
        deferred which callbacks, as well as a deferred errbacks. Also
        ensures returning a final value works.
        WOOSH)
_genBasicsaddCallbackassertEqualselfs    r   
testBasicszBaseDefgenTests.testBasics7   s$      ,,T-=-=wGGr   c                 J    | j                  | j                         t              S )zp
        Ensure that a buggy generator properly signals a Failure
        condition on result deferred.
        )assertFailure	_genBuggyr   r+   s    r   	testBuggyzBaseDefgenTests.testBuggy@   s    
 !!$.."24EFFr   c                 V    | j                         j                  | j                  d      S )z9Test that a generator which never yields results in None.N)_genNothingr)   r*   r+   s    r   testNothingzBaseDefgenTests.testNothingG   s&     !--d.>.>EEr   c                 V    | j                         j                  | 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.
        N)_genHandledTerminalFailurer)   r*   r+   s    r   testHandledTerminalFailurez*BaseDefgenTests.testHandledTerminalFailureL   s&     ..0<<T=M=MtTTr   c                     t        j                         }| j                  |      }|j                  t	        d             |j                  | j                  d      S )z~
        Just like testHandledTerminalFailure, only with a Deferred which fires
        asynchronously with an error.
        Handled Terminal FailureN)r   r   _genHandledTerminalAsyncFailurer   r   r)   r*   )r,   r   deferredGeneratorResultDeferreds      r   testHandledTerminalAsyncFailurez/BaseDefgenTests.testHandledTerminalAsyncFailureT   sM    
 NN*.*N*Nq*Q'			#$>?@.::4;K;KTRRr   c                 V    | j                         j                  | j                  d      S )zj
        Make sure we don't blow the stack when yielding immediately
        available deferreds.
        r   )_genStackUsager)   r*   r+   s    r   testStackUsagezBaseDefgenTests.testStackUsage^   s&    
 ""$001A1A1EEr   c                 V    | j                         j                  | j                  d      S )zg
        Make sure we don't blow the stack when yielding immediately
        available values.
        r   )_genStackUsage2r)   r*   r+   s    r   testStackUsage2zBaseDefgenTests.testStackUsage2e   s&    
 ##%11$2B2BAFFr   N)r    r!   r"   __doc__r-   r1   r4   r7   r<   r?   rB   r#   r   r   r%   r%   /   s1    HGF
USFGr   r%   c                 :    t        t        d      gt        |       S )z
    Calls L{deferredGenerator} while suppressing the deprecation warning.

    @param f: Function to call
    @return: Return value of function.
    z7twisted.internet.defer.deferredGenerator was deprecatedmessage)r   SUPPRESSr   )fs    r   deprecatedDeferredGeneratorrI   m   s)     %T	

 		 r   c                       e Zd Zed        Zed        Zed        Zed        Zed        Zd Z	 ee	      Z	d Z
 ee
      Z
d Z ed	
      gZy)DeferredGeneratorTestsc              #   8  K   t        t                     }| |j                         }| j                  |d       t        t	                     }| 	 |j                          d y # t
        $ r%}| j                  t        |      d       Y d }~.d }~ww xY wwNr   r   r'   )r
   r   	getResultr*   r   r   str)r,   xowes       r   r(   z!DeferredGeneratorTests._genBasics   s     HJ'KKMD!WY'	,LLN  ! 	,SVU++	,s0   ABA) $B)	B2BBBBc              #   @   K   t        t                      ddz   y wN   r   )r
   r   r+   s    r   r0   z DeferredGeneratorTests._genBuggy   s     hj))	Qs   c              #      K   y wNr#   r+   s    r   r3   z"DeferredGeneratorTests._genNothing   s	        c              #      K   t        t        j                  t        d                  }| 	 |j	                          y # t        $ r Y y w xY wwNr9   )r
   r   failr   rN   r,   rP   s     r   r6   z1DeferredGeneratorTests._genHandledTerminalFailure   sD     EJJ'89S'TUV	KKM  		s'   ,AA  A 	A	AAAc              #   j   K   t        |      }| 	 |j                          y # t        $ r Y y w xY wwrW   )r
   rN   r   )r,   r   rP   s      r   r:   z6DeferredGeneratorTests._genHandledTerminalAsyncFailure   s4     A	KKM  		s   3$ 3	0303c              #      K   t        d      D ]4  }t        t        j                  d            }| |j	                         }6 d y wNi  rU   r   )ranger
   r   succeedrN   r\   s     r   r>   z%DeferredGeneratorTests._genStackUsage   sC     t 	Aa 01AGA		
 s   AA
c              #   <   K   t        d      D ]  }d  d y wr_   )r`   r\   s     r   rA   z&DeferredGeneratorTests._genStackUsage2   s%     t 	AG	 s   c                 T    d }t        |      }| j                   |       t              S )zZ
        Ensure that yielding a Deferred directly is trapped as an
        error.
        c               3   $   K   t                y wrW   r   r#   r   r   _genDeferredzADeferredGeneratorTests.testDeferredYielding.<locals>._genDeferred   s     *s   )rI   r/   	TypeError)r,   rf   s     r   testDeferredYieldingz+DeferredGeneratorTests.testDeferredYielding   s(    	 3<@!!,.)<<r   z5twisted.internet.defer.waitForDeferred was deprecatedrE   N)r    r!   r"   rI   r(   r0   r3   r6   r:   r>   rA   rh   rG   r   r#   r   r   rK   rK      s      !  ! ! ! ! ! ! ! ! 1@N 2/BO= 	STHr   rK   c                       e Zd Zd Z ee      Zd Z ee      Zd Z ee      Zd Z ee      Zd Z ee      Zd Z	 ee	      Z	d Z
 ee
      Z
d Zd	 Zd
 Zd Zd Zd Zd Zy)InlineCallbacksTestsc              #      K   t               }| j                  |d       	 t                t        d       y # t        $ r%}| j                  t	        |      d       Y d }~5d }~ww xY wwrM   )r   r*   r   r   rO   r	   )r,   rP   rR   s      r   r(   zInlineCallbacksTests._genBasics   s^     *D!	,)O 	G ! 	,SVU++	,s+   A+: A+	A(A#A+#A((A+c              #   .   K   t                ddz   y wrT   re   r+   s    r   r0   zInlineCallbacksTests._genBuggy   s     j	As   c              #      K   y wrW   r#   r+   s    r   r3   z InlineCallbacksTests._genNothing   s	     rX   c              #   l   K   	 t        j                  t        d             y # t        $ r Y y w xY wwrZ   )r   r[   r   r+   s    r   r6   z/InlineCallbacksTests._genHandledTerminalFailure   s2     	**./IJKK  		s   4 % 4	1414c              #   4   K   	 | y # t         $ r Y y w xY wwrW   )r   )r,   r   s     r   r:   z4InlineCallbacksTests._genHandledTerminalAsyncFailure   s!     	G  		s   	 	c              #   p   K   t        d      D ]  }t        j                  d        t        d       y wr_   )r`   r   ra   r	   r\   s     r   r>   z#InlineCallbacksTests._genStackUsage  s1     t 	#A--""	# 	As   46c              #   J   K   t        d      D ]  }d  t        d       y wr_   )r`   r	   r\   s     r   rA   z$InlineCallbacksTests._genStackUsage2	  s'     t 	AG	 	As   !#c                 `    d }t        |      } |       j                  | 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.defer.Deferred}
        @rtype: L{twisted.internet.defer.Deferred}
        c               3   *   K   d t        d       y wN   r	   r#   r   r   _testz8InlineCallbacksTests.testYieldNonDeferred.<locals>._test       GN   ru   r   r)   r*   )r,   rw   s     r   testYieldNonDeferredz)InlineCallbacksTests.testYieldNonDeferred  s.    	  &w""4#3#3Q77r   c                 `    d }t        |      } |       j                  | j                  d      S )z9Ensure a standard python return results in a None result.c               3      K   d y wrt   r#   r#   r   r   	_noReturnz9InlineCallbacksTests.testReturnNoValue.<locals>._noReturn'  s     G   Nrz   )r,   r~   s     r   testReturnNoValuez&InlineCallbacksTests.testReturnNoValue$  s.    	 $I.	{&&t'7'7>>r   c                 `    d }t        |      } |       j                  | j                  d      S )zEnsure that returnValue works.c               3   *   K   d t        d       y w)Nru      rv   r#   r   r   _returnz5InlineCallbacksTests.testReturnValue.<locals>._return2  rx   ry   r   rz   )r,   r   s     r   testReturnValuez$InlineCallbacksTests.testReturnValue/  s.    	 "'*y$$T%5%5q99r   c           	      ~    d }t        |      }| j                  dt        | j                  t        |                   y)z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator returns something other than a generator.
        c                       yrt   r#   r#   r   r   _noYieldz>InlineCallbacksTests.test_nonGeneratorReturn.<locals>._noYield@  s    r   r   Nr   assertInrO   assertRaisesrg   r,   r   s     r   test_nonGeneratorReturnz,InlineCallbacksTests.test_nonGeneratorReturn:  s4    	 #8,'T->->y(-S)TUr   c           	      ~    d }t        |      }| j                  dt        | j                  t        |                   y)z
        Ensure that C{TypeError} with a message about L{inlineCallbacks} is
        raised when a non-generator calls L{returnValue}.
        c                      t        d       y rt   rv   r#   r   r   r   zCInlineCallbacksTests.test_nonGeneratorReturnValue.<locals>._noYieldM  s	    Nr   r   Nr   r   s     r   test_nonGeneratorReturnValuez1InlineCallbacksTests.test_nonGeneratorReturnValueG  s4    	 #8,'T->->y(-S)TUr   c                 &   t        j                         t        fd       t        fd       } |       }j                  d       | j	                  |      }| j                  d|       | j                  d|       | j                  d|       y)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   T   K   t        j                   d       t        d       yw)zG
            This is the inner function using returnValue.
            r   z"actual-value-not-used-for-the-testN)r   
deferLaterr	   clocks   r   _returnszOInlineCallbacksTests.test_internalDefGenReturnValueDoesntLeak.<locals>._returns\  s#     
 //%++<=s   %(c               3   |   K   	           t        d      # t         $ r t        j                         cY S w xY ww)Nzboom returnValuer   	traceback
format_excr   s   r   _raiseszNInlineCallbacksTests.test_internalDefGenReturnValueDoesntLeak.<locals>._raisesd  s=     .j '(:;;$ . ++--.   < 9<9<r   _DefGen_ReturnBDuring handling of the above exception, another exception occurredz/test_defgen.TerminalException: boom returnValueNr   Clockr   advancesuccessResultOfassertNotInr   r,   r   r   tbr   r   s       @@r   (test_internalDefGenReturnValueDoesntLeakz=InlineCallbacksTests.test_internalDefGenReturnValueDoesntLeakT  s     

		> 
	> 
	. 
	. Ia!!!$ 	)2.PRT	
 	GLr   c                 &   t        j                         t        fd       t        fd       } |       }j                  d       | j	                  |      }| j                  d|       | j                  d|       | j                  d|       y)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       yw)Nr   r   )r   r   r   s   r   r   zKInlineCallbacksTests.test_internalStopIterationDoesntLeak.<locals>._returns  s     //%++s   c               3   |   K   	           t        d      # t         $ r t        j                         cY S w xY ww)Nzboom normal returnr   r   s   r   r   zJInlineCallbacksTests.test_internalStopIterationDoesntLeak.<locals>._raises  s=     .j '(<==$ . ++--.r   r   StopIterationr   z1test_defgen.TerminalException: boom normal returnNr   r   s       @@r   $test_internalStopIterationDoesntLeakz9InlineCallbacksTests.test_internalStopIterationDoesntLeaky  s     

		 
	 
	. 
	. Ia!!!$ 	"-PRT	
 	I2Nr   N)r    r!   r"   r(   r   r0   r3   r6   r:   r>   rA   r{   r   r   r   r   r   r   r#   r   r   rj   rj      s    	 !,J  	*I "+.K "11K!L '66U&V# %^4N &o6O8"	?	:VV#MJ$Or   rj   c                       e Zd ZdZd Zd Zy)DeprecateDeferredGeneratorTestszY
    Tests that L{DeferredGeneratorTests} and L{waitForDeferred} are
    deprecated.
    c                     t         d        }| j                  | j                  g      }| j                  t	        |      d       | j                  |d   d   t
               | j                  |d   d   d       y)z5
        L{deferredGenerator} is deprecated.
        c               3      K   d  y wrW   r#   r#   r   r   decoratedFunctionz[DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated.<locals>.decoratedFunction  s     Jr   rU   r   categoryrF   ztwisted.internet.defer.deferredGenerator was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   flushWarnings test_deferredGeneratorDeprecatedr*   lenDeprecationWarning)r,   r   warningss      r   r   z@DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated  s~    
 
	 
	 %%t'L'L&MNX*!Z02DEQK	"=	
r   c                    t               }t        |       | j                  | j                  g      }| j	                  t        |      d       | j	                  |d   d   t               | j	                  |d   d   d       y)z3
        L{waitForDeferred} is deprecated.
        rU   r   r   rF   ztwisted.internet.defer.waitForDeferred was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r   r
   r   test_waitForDeferredDeprecatedr*   r   r   )r,   r   r   s      r   r   z>DeprecateDeferredGeneratorTests.test_waitForDeferredDeprecated  sy     J%%t'J'J&KLX*!Z02DEQK	"=	
r   N)r    r!   r"   rC   r   r   r#   r   r   r   r     s    

&
r   r   )rC   r   twisted.internetr   r   r   twisted.internet.deferr   r   r   r	   r
   twisted.python.utilr   twisted.trialr   twisted.trial.utilr   rG   r   r   	Exceptionr   r%   rI   TestCaserK   rj   SynchronousTestCaser   r#   r   r   <module>r      s     1 1  : " 3		 	;G ;G|$S_h.?.? SlHO?H,=,= HOV(
h&B&B (
r   