Ë
    oj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   € ð
 ×!Ñ! $§.¡.Ó"2Ô4EÓ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Ñ=MÈtÓ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   € ô
 �N‰NÓˆØ*.×*NÑ*NÈqÓ*QÐ'Ø	�	‰	Ô#Ð$>Ó?Ô@Ø.×:Ñ:¸4×;KÑ;KÈTÓ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°×1AÑ1AÀ1Ó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°$×2BÑ2BÀAÓ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ƒ   è ø€ äœH›JÓ'ˆØŠØ�K‰K‹Mˆà×Ñ˜˜DÔ!äœW›YÓ'ˆØŠð	,Ø�L‰LŒNð ŠØøô !ò 	,Ø×ÑœS ›V U×+Ñ+ûð	,ü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   è ø€ äœh›jÓ)Ò)Ø	ˆ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   è ø€ äœEŸJ™JÔ'8Ð9SÓ'TÓUÓVˆØŠð	Ø�K‰K�MøÜ ò 	Ùð	ü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ÓˆØŠð	Ø�K‰K�MøÜ ò 	Ùð	ü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Ó1ˆAØŠ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°/ÓB€Oò=ñ 	Ð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 ›V U×+Ñ+ûð	,ü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Ñ#3°QÓ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Ñ%5°qÓ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_ReturnúBDuring 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Ô.à×ÑØPÐRTô	
ð 	�‰Ð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ÔØ×!Ñ! !Ó$ˆð 	×Ñ˜¨"Ô-à×ÑØPÐRTô	
ð 	�‰ÐIÈ2Õ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òñ "1Ð1KÓ!LÐòñ '6Ð6UÓ&VÐ#òñ % ^Ó4€Nòñ & oÓ6€Oò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   è ø€ à‹Jùr   rU   r   ÚcategoryrF   z„twisted.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Ñ0Ô2DÔEØ×ÑØ�Q‰K˜	Ñ"ð=õ	
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   z‚twisted.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Ñ0Ô2DÔEØ×ÑØ�Q‰K˜	Ñ"ð=õ	
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   