Ϫf4"dZddlZddlmZmZmZddlmZmZm Z m Z m Z ddl m Z ddlmZddlmZdZd ZGd d eZGd d ZdZGddeej2ZGddeej2ZGddej8Zy)zI Tests for L{twisted.internet.defer.deferredGenerator} and related APIs. N)deferreactortask)DeferreddeferredGeneratorinlineCallbacks returnValuewaitForDeferred)runWithWarningsSuppressed)unittest)suppressc\t}tjd|jd|S)Nrhi)rr callLatercallbackds :/usr/lib/python3/dist-packages/twisted/test/test_defgen.pygetThingrs$ A aT* HcRtfd}tjd|S)Nc:jtdy)NOMG)errbackZeroDivisionErrorrsrCRAPzgetOwie..CRAP s #E*+rr)rrr)rrs @rgetOwiers& A, a Hrc eZdZy)TerminalExceptionN)__name__ __module__ __qualname__rrrr+srrc:eZdZdZdZdZdZdZdZdZ dZ 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. cV|jj|jdS)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 assertEqualselfs r testBasicszBaseDefgenTests.testBasics7s$ ,,T-=-=wGGrcJ|j|jtS)zp Ensure that a buggy generator properly signals a Failure condition on result deferred. ) assertFailure _genBuggyrr+s r testBuggyzBaseDefgenTests.testBuggy@s !!$.."24EFFrcV|jj|jdS)z9Test that a generator which never yields results in None.N) _genNothingr)r*r+s r testNothingzBaseDefgenTests.testNothingGs&!--d.>.>EErcV|jj|jdS)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 rtestHandledTerminalFailurez*BaseDefgenTests.testHandledTerminalFailureLs& ..0<?@.::4;K;KTRRrcV|jj|jdS)zj Make sure we don't blow the stack when yielding immediately available deferreds. r)_genStackUsager)r*r+s rtestStackUsagezBaseDefgenTests.testStackUsage^s& ""$001A1A1EErcV|jj|jdS)zg Make sure we don't blow the stack when yielding immediately available values. r)_genStackUsage2r)r*r+s rtestStackUsage2zBaseDefgenTests.testStackUsage2es& ##%11$2B2BAFFrN) r r!r"__doc__r-r1r4r7r<r?rBr#rrr%r%/s1HGF USFGrr%c:ttdgt|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 deprecatedmessage)r SUPPRESSr)fs rdeprecatedDeferredGeneratorrIms) % T    rceZdZedZedZedZedZedZdZ ee Z dZ ee Z dZ e d gZ y ) DeferredGeneratorTestsc#8Ktt}||j}|j|dtt }| |jdy#t $r%}|jt |dYd}~.d}~wwxYwwNrrr')r r getResultr*rrstr)r,xowes rr(z!DeferredGeneratorTests._genBasicss HJ ' KKM D! WY ' , LLN ! ,   SVU + + ,s0ABA)$B) B2B BBBc#@KttddzywNr)r rr+s rr0z DeferredGeneratorTests._genBuggyshj)) Qsc# KywNr#r+s rr3z"DeferredGeneratorTests._genNothings c#Kttjtd}| |j y#t$rYywxYwwNr9)r rfailrrNr,rPs rr6z1DeferredGeneratorTests._genHandledTerminalFailuresD EJJ'89S'TU V  KKM    s',AAA A  A A  Ac#jKt|}| |jy#t$rYywxYwwrW)r rNr)r,rrPs rr:z6DeferredGeneratorTests._genHandledTerminalAsyncFailures4 A   KKM    s3$3 0303c#KtdD]4}ttjd}||j }6dywNirUr)ranger rsucceedrNr\s rr>z%DeferredGeneratorTests._genStackUsagesCt A a 01AG A   sAA c#<KtdD]}ddywr_)r`r\s rrAz&DeferredGeneratorTests._genStackUsage2s%t AG scTd}t|}|j|tS)zZ Ensure that yielding a Deferred directly is trapped as an error. c3$KtywrWrr#rr _genDeferredzADeferredGeneratorTests.testDeferredYielding.._genDeferreds* s)rIr/ TypeError)r,rfs rtestDeferredYieldingz+DeferredGeneratorTests.testDeferredYieldings( 3<@ !!,.)<rArhrGr r#rrrKrKs ! !!!!!!!!1@N 2/BO = STHrrKceZdZdZeeZdZeeZdZeeZdZeeZdZeeZdZ ee Z dZ ee Z dZ d Z d Z d Zd Zd ZdZy)InlineCallbacksTestsc#Kt}|j|d tt dy#t$r%}|jt |dYd}~5d}~wwxYwwrM)rr*rrrOr )r,rPrRs rr(zInlineCallbacksTests._genBasicss^*  D! ,)O G! ,   SVU + + ,s+A+ : A+ A(A#A+#A((A+c#.Ktddz ywrTrer+s rr0zInlineCallbacksTests._genBuggysj Asc# KywrWr#r+s rr3z InlineCallbacksTests._genNothings rXc#lK tjtdy#t$rYywxYwwrZ)rr[rr+s rr6z/InlineCallbacksTests._genHandledTerminalFailures2 **./IJK K    s4 %4 1414c#4K |y#t$rYywxYwwrW)r)r,rs rr:z4InlineCallbacksTests._genHandledTerminalAsyncFailures! G    s  c#pKtdD]}tjdtdywr_)r`rrar r\s rr>z#InlineCallbacksTests._genStackUsages1t #A--" " # As46c#JKtdD]}dtdywr_)r`r r\s rrAz$InlineCallbacksTests._genStackUsage2 s't AG  As!#c`d}t|}|j|jdS)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} c3*KdtdywNr r#rr_testz8InlineCallbacksTests.testYieldNonDeferred.._testG Nrurr)r*)r,rws rtestYieldNonDeferredz)InlineCallbacksTests.testYieldNonDeferreds.  &w""4#3#3Q77rc`d}t|}|j|jdS)z9Ensure a standard python return results in a None result.c3Kdywrtr#r#rr _noReturnz9InlineCallbacksTests.testReturnNoValue.._noReturn'sG Nrz)r,r~s rtestReturnNoValuez&InlineCallbacksTests.testReturnNoValue$s. $I. {&&t'7'7>>rc`d}t|}|j|jdS)zEnsure that returnValue works.c3*Kdtdyw)Nrurvr#rr_returnz5InlineCallbacksTests.testReturnValue.._return2rxryrrz)r,rs rtestReturnValuez$InlineCallbacksTests.testReturnValue/s. "'*y$$T%5%5q99rc ~d}t|}|jdt|jt|y)z Ensure that C{TypeError} with a message about L{inlineCallbacks} is raised when a non-generator returns something other than a generator. cyrtr#r#rr_noYieldz>InlineCallbacksTests.test_nonGeneratorReturn.._noYield@srrNrassertInrO assertRaisesrgr,rs rtest_nonGeneratorReturnz,InlineCallbacksTests.test_nonGeneratorReturn:s4  #8, 'T->->y(-S)TUrc ~d}t|}|jdt|jt|y)z Ensure that C{TypeError} with a message about L{inlineCallbacks} is raised when a non-generator calls L{returnValue}. ctdyrtrvr#rrrzCInlineCallbacksTests.test_nonGeneratorReturnValue.._noYieldMs NrrNrrs rtest_nonGeneratorReturnValuez1InlineCallbacksTests.test_nonGeneratorReturnValueGs4  #8, 'T->->y(-S)TUrc&tjtfdtfd}|}jd|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. c3TKtjdtdyw)zG This is the inner function using returnValue. rz"actual-value-not-used-for-the-testN)r deferLaterr clocksr_returnszOInlineCallbacksTests.test_internalDefGenReturnValueDoesntLeak.._returns\s# //%+ + < =s%(c3|K td#t$rtjcYSwxYww)Nzboom returnValuer traceback format_excrsr_raiseszNInlineCallbacksTests.test_internalDefGenReturnValueDoesntLeak.._raisesds= .j '(:;;$ . ++-- .<9<9<r_DefGen_ReturnBDuring handling of the above exception, another exception occurredz/test_defgen.TerminalException: boom returnValueNrClockradvancesuccessResultOf assertNotInrr,rrtbrrs @@r(test_internalDefGenReturnValueDoesntLeakz=InlineCallbacksTests.test_internalDefGenReturnValueDoesntLeakTs    >  >  .  . I a  ! !! $ )2.  PRT  GLrc&tjtfdtfd}|}jd|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. c3>Ktjdyw)Nrr)rrrsrrzKInlineCallbacksTests.test_internalStopIterationDoesntLeak.._returnss//%+ +sc3|K td#t$rtjcYSwxYww)Nzboom normal returnrrsrrzJInlineCallbacksTests.test_internalStopIterationDoesntLeak.._raisess= .j '(<==$ . ++-- .rr StopIterationrz1test_defgen.TerminalException: boom normal returnNrrs @@r$test_internalStopIterationDoesntLeakz9InlineCallbacksTests.test_internalStopIterationDoesntLeakys       .  . I a  ! !! $ "-  PRT  I2NrN)r r!r"r(rr0r3r6r:r>rAr{rrrrrrr#rrrjrjs !,J *I"+.K "11K!L '66U&V# %^4N &o6O8" ? : V V#MJ$OrrjceZdZdZdZdZy)DeprecateDeferredGeneratorTestszY Tests that L{DeferredGeneratorTests} and L{waitForDeferred} are deprecated. ctd}|j|jg}|jt |d|j|ddt |j|dddy)z5 L{deferredGenerator} is deprecated. c3KdywrWr#r#rrdecoratedFunctionz[DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecated..decoratedFunctions JrrUrcategoryrFztwisted.internet.defer.deferredGenerator was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)r flushWarnings test_deferredGeneratorDeprecatedr*lenDeprecationWarning)r,rwarningss rrz@DeprecateDeferredGeneratorTests.test_deferredGeneratorDeprecateds~    %%t'L'L&MN X* !Z02DE  QK " = rct}t||j|jg}|j t |d|j |ddt |j |dddy)z3 L{waitForDeferred} is deprecated. rUrrrFztwisted.internet.defer.waitForDeferred was deprecated in Twisted 15.0.0; please use twisted.internet.defer.inlineCallbacks insteadN)rr rtest_waitForDeferredDeprecatedr*rr)r,rrs rrz>DeprecateDeferredGeneratorTests.test_waitForDeferredDeprecatedsy J%%t'J'J&KL X* !Z02DE  QK " = rN)r r!r"rCrrr#rrrrs  & rr)rCrtwisted.internetrrrtwisted.internet.deferrrrr r twisted.python.utilr twisted.trialr twisted.trial.utilr rGrr Exceptionrr%rITestCaserKrjSynchronousTestCaserr#rrrs11:"3    ;G;G|$S_h.?.?SlHO?H,=,=HOV( h&B&B( r