test_defer.py 101 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. """
  4. Test cases for L{twisted.internet.defer}.
  5. """
  6. from __future__ import division, absolute_import
  7. import warnings
  8. import gc, traceback
  9. import re
  10. from twisted.python.compat import _PY3, _PY34PLUS
  11. if _PY34PLUS:
  12. from asyncio import new_event_loop, Future, CancelledError
  13. asyncSkip = None
  14. else:
  15. asyncSkip = "asyncio not available before python 3.4"
  16. from twisted.python import failure, log
  17. from twisted.internet import defer, reactor
  18. from twisted.internet.task import Clock
  19. from twisted.trial import unittest
  20. class GenericError(Exception):
  21. pass
  22. def getDivisionFailure(*args, **kwargs):
  23. """
  24. Make a L{failure.Failure} of a divide-by-zero error.
  25. @param args: Any C{*args} are passed to Failure's constructor.
  26. @param kwargs: Any C{**kwargs} are passed to Failure's constructor.
  27. """
  28. try:
  29. 1/0
  30. except:
  31. f = failure.Failure(*args, **kwargs)
  32. return f
  33. def fakeCallbackCanceller(deferred):
  34. """
  35. A fake L{defer.Deferred} canceller which callbacks the L{defer.Deferred}
  36. with C{str} "Callback Result" when cancelling it.
  37. @param deferred: The cancelled L{defer.Deferred}.
  38. """
  39. deferred.callback("Callback Result")
  40. class ImmediateFailureMixin(object):
  41. """
  42. Add additional assertion methods.
  43. """
  44. def assertImmediateFailure(self, deferred, exception):
  45. """
  46. Assert that the given Deferred current result is a Failure with the
  47. given exception.
  48. @return: The exception instance in the Deferred.
  49. """
  50. failures = []
  51. deferred.addErrback(failures.append)
  52. self.assertEqual(len(failures), 1)
  53. self.assertTrue(failures[0].check(exception))
  54. return failures[0].value
  55. class UtilTests(unittest.TestCase):
  56. """
  57. Tests for utility functions.
  58. """
  59. def test_logErrorReturnsError(self):
  60. """
  61. L{defer.logError} returns the given error.
  62. """
  63. error = failure.Failure(RuntimeError())
  64. result = defer.logError(error)
  65. self.flushLoggedErrors(RuntimeError)
  66. self.assertIs(error, result)
  67. def test_logErrorLogsError(self):
  68. """
  69. L{defer.logError} logs the given error.
  70. """
  71. error = failure.Failure(RuntimeError())
  72. defer.logError(error)
  73. errors = self.flushLoggedErrors(RuntimeError)
  74. self.assertEqual(errors, [error])
  75. def test_logErrorLogsErrorNoRepr(self):
  76. """
  77. The text logged by L{defer.logError} has no repr of the failure.
  78. """
  79. output = []
  80. def emit(eventDict):
  81. output.append(log.textFromEventDict(eventDict))
  82. log.addObserver(emit)
  83. error = failure.Failure(RuntimeError())
  84. defer.logError(error)
  85. self.flushLoggedErrors(RuntimeError)
  86. self.assertTrue(output[0].startswith("Unhandled Error\nTraceback "))
  87. class DeferredTests(unittest.SynchronousTestCase, ImmediateFailureMixin):
  88. def setUp(self):
  89. self.callbackResults = None
  90. self.errbackResults = None
  91. self.callback2Results = None
  92. # Restore the debug flag to its original state when done.
  93. self.addCleanup(defer.setDebugging, defer.getDebugging())
  94. def _callback(self, *args, **kw):
  95. self.callbackResults = args, kw
  96. return args[0]
  97. def _callback2(self, *args, **kw):
  98. self.callback2Results = args, kw
  99. def _errback(self, *args, **kw):
  100. self.errbackResults = args, kw
  101. def testCallbackWithoutArgs(self):
  102. deferred = defer.Deferred()
  103. deferred.addCallback(self._callback)
  104. deferred.callback("hello")
  105. self.assertIsNone(self.errbackResults)
  106. self.assertEqual(self.callbackResults, (('hello',), {}))
  107. def testCallbackWithArgs(self):
  108. deferred = defer.Deferred()
  109. deferred.addCallback(self._callback, "world")
  110. deferred.callback("hello")
  111. self.assertIsNone(self.errbackResults)
  112. self.assertEqual(self.callbackResults, (('hello', 'world'), {}))
  113. def testCallbackWithKwArgs(self):
  114. deferred = defer.Deferred()
  115. deferred.addCallback(self._callback, world="world")
  116. deferred.callback("hello")
  117. self.assertIsNone(self.errbackResults)
  118. self.assertEqual(self.callbackResults,
  119. (('hello',), {'world': 'world'}))
  120. def testTwoCallbacks(self):
  121. deferred = defer.Deferred()
  122. deferred.addCallback(self._callback)
  123. deferred.addCallback(self._callback2)
  124. deferred.callback("hello")
  125. self.assertIsNone(self.errbackResults)
  126. self.assertEqual(self.callbackResults,
  127. (('hello',), {}))
  128. self.assertEqual(self.callback2Results,
  129. (('hello',), {}))
  130. def testDeferredList(self):
  131. defr1 = defer.Deferred()
  132. defr2 = defer.Deferred()
  133. defr3 = defer.Deferred()
  134. dl = defer.DeferredList([defr1, defr2, defr3])
  135. result = []
  136. def cb(resultList, result=result):
  137. result.extend(resultList)
  138. def catch(err):
  139. return None
  140. dl.addCallbacks(cb, cb)
  141. defr1.callback("1")
  142. defr2.addErrback(catch)
  143. # "catch" is added to eat the GenericError that will be passed on by
  144. # the DeferredList's callback on defr2. If left unhandled, the
  145. # Failure object would cause a log.err() warning about "Unhandled
  146. # error in Deferred". Twisted's pyunit watches for log.err calls and
  147. # treats them as failures. So "catch" must eat the error to prevent
  148. # it from flunking the test.
  149. defr2.errback(GenericError("2"))
  150. defr3.callback("3")
  151. self.assertEqual([result[0],
  152. #result[1][1] is now a Failure instead of an Exception
  153. (result[1][0], str(result[1][1].value)),
  154. result[2]],
  155. [(defer.SUCCESS, "1"),
  156. (defer.FAILURE, "2"),
  157. (defer.SUCCESS, "3")])
  158. def testEmptyDeferredList(self):
  159. result = []
  160. def cb(resultList, result=result):
  161. result.append(resultList)
  162. dl = defer.DeferredList([])
  163. dl.addCallbacks(cb)
  164. self.assertEqual(result, [[]])
  165. result[:] = []
  166. dl = defer.DeferredList([], fireOnOneCallback=1)
  167. dl.addCallbacks(cb)
  168. self.assertEqual(result, [])
  169. def testDeferredListFireOnOneError(self):
  170. defr1 = defer.Deferred()
  171. defr2 = defer.Deferred()
  172. defr3 = defer.Deferred()
  173. dl = defer.DeferredList([defr1, defr2, defr3], fireOnOneErrback=1)
  174. result = []
  175. dl.addErrback(result.append)
  176. # consume errors after they pass through the DeferredList (to avoid
  177. # 'Unhandled error in Deferred'.
  178. def catch(err):
  179. return None
  180. defr2.addErrback(catch)
  181. # fire one Deferred's callback, no result yet
  182. defr1.callback("1")
  183. self.assertEqual(result, [])
  184. # fire one Deferred's errback -- now we have a result
  185. defr2.errback(GenericError("from def2"))
  186. self.assertEqual(len(result), 1)
  187. # extract the result from the list
  188. aFailure = result[0]
  189. # the type of the failure is a FirstError
  190. self.assertTrue(issubclass(aFailure.type, defer.FirstError),
  191. 'issubclass(aFailure.type, defer.FirstError) failed: '
  192. "failure's type is %r" % (aFailure.type,)
  193. )
  194. firstError = aFailure.value
  195. # check that the GenericError("2") from the deferred at index 1
  196. # (defr2) is intact inside failure.value
  197. self.assertEqual(firstError.subFailure.type, GenericError)
  198. self.assertEqual(firstError.subFailure.value.args, ("from def2",))
  199. self.assertEqual(firstError.index, 1)
  200. def testDeferredListDontConsumeErrors(self):
  201. d1 = defer.Deferred()
  202. dl = defer.DeferredList([d1])
  203. errorTrap = []
  204. d1.addErrback(errorTrap.append)
  205. result = []
  206. dl.addCallback(result.append)
  207. d1.errback(GenericError('Bang'))
  208. self.assertEqual('Bang', errorTrap[0].value.args[0])
  209. self.assertEqual(1, len(result))
  210. self.assertEqual('Bang', result[0][0][1].value.args[0])
  211. def testDeferredListConsumeErrors(self):
  212. d1 = defer.Deferred()
  213. dl = defer.DeferredList([d1], consumeErrors=True)
  214. errorTrap = []
  215. d1.addErrback(errorTrap.append)
  216. result = []
  217. dl.addCallback(result.append)
  218. d1.errback(GenericError('Bang'))
  219. self.assertEqual([], errorTrap)
  220. self.assertEqual(1, len(result))
  221. self.assertEqual('Bang', result[0][0][1].value.args[0])
  222. def testDeferredListFireOnOneErrorWithAlreadyFiredDeferreds(self):
  223. # Create some deferreds, and errback one
  224. d1 = defer.Deferred()
  225. d2 = defer.Deferred()
  226. d1.errback(GenericError('Bang'))
  227. # *Then* build the DeferredList, with fireOnOneErrback=True
  228. dl = defer.DeferredList([d1, d2], fireOnOneErrback=True)
  229. result = []
  230. dl.addErrback(result.append)
  231. self.assertEqual(1, len(result))
  232. d1.addErrback(lambda e: None) # Swallow error
  233. def testDeferredListWithAlreadyFiredDeferreds(self):
  234. # Create some deferreds, and err one, call the other
  235. d1 = defer.Deferred()
  236. d2 = defer.Deferred()
  237. d1.errback(GenericError('Bang'))
  238. d2.callback(2)
  239. # *Then* build the DeferredList
  240. dl = defer.DeferredList([d1, d2])
  241. result = []
  242. dl.addCallback(result.append)
  243. self.assertEqual(1, len(result))
  244. d1.addErrback(lambda e: None) # Swallow error
  245. def test_cancelDeferredList(self):
  246. """
  247. When cancelling an unfired L{defer.DeferredList}, cancel every
  248. L{defer.Deferred} in the list.
  249. """
  250. deferredOne = defer.Deferred()
  251. deferredTwo = defer.Deferred()
  252. deferredList = defer.DeferredList([deferredOne, deferredTwo])
  253. deferredList.cancel()
  254. self.failureResultOf(deferredOne, defer.CancelledError)
  255. self.failureResultOf(deferredTwo, defer.CancelledError)
  256. def test_cancelDeferredListCallback(self):
  257. """
  258. When cancelling an unfired L{defer.DeferredList} without the
  259. C{fireOnOneCallback} and C{fireOnOneErrback} flags set, the
  260. L{defer.DeferredList} will be callback with a C{list} of
  261. (success, result) C{tuple}s.
  262. """
  263. deferredOne = defer.Deferred(fakeCallbackCanceller)
  264. deferredTwo = defer.Deferred()
  265. deferredList = defer.DeferredList([deferredOne, deferredTwo])
  266. deferredList.cancel()
  267. self.failureResultOf(deferredTwo, defer.CancelledError)
  268. result = self.successResultOf(deferredList)
  269. self.assertTrue(result[0][0])
  270. self.assertEqual(result[0][1], "Callback Result")
  271. self.assertFalse(result[1][0])
  272. self.assertTrue(result[1][1].check(defer.CancelledError))
  273. def test_cancelDeferredListWithFireOnOneCallback(self):
  274. """
  275. When cancelling an unfired L{defer.DeferredList} with the flag
  276. C{fireOnOneCallback} set, cancel every L{defer.Deferred} in the list.
  277. """
  278. deferredOne = defer.Deferred()
  279. deferredTwo = defer.Deferred()
  280. deferredList = defer.DeferredList([deferredOne, deferredTwo],
  281. fireOnOneCallback=True)
  282. deferredList.cancel()
  283. self.failureResultOf(deferredOne, defer.CancelledError)
  284. self.failureResultOf(deferredTwo, defer.CancelledError)
  285. def test_cancelDeferredListWithFireOnOneCallbackAndDeferredCallback(self):
  286. """
  287. When cancelling an unfired L{defer.DeferredList} with the flag
  288. C{fireOnOneCallback} set, if one of the L{defer.Deferred} callbacks
  289. in its canceller, the L{defer.DeferredList} will callback with the
  290. result and the index of the L{defer.Deferred} in a C{tuple}.
  291. """
  292. deferredOne = defer.Deferred(fakeCallbackCanceller)
  293. deferredTwo = defer.Deferred()
  294. deferredList = defer.DeferredList([deferredOne, deferredTwo],
  295. fireOnOneCallback=True)
  296. deferredList.cancel()
  297. self.failureResultOf(deferredTwo, defer.CancelledError)
  298. result = self.successResultOf(deferredList)
  299. self.assertEqual(result, ("Callback Result", 0))
  300. def test_cancelDeferredListWithFireOnOneErrback(self):
  301. """
  302. When cancelling an unfired L{defer.DeferredList} with the flag
  303. C{fireOnOneErrback} set, cancel every L{defer.Deferred} in the list.
  304. """
  305. deferredOne = defer.Deferred()
  306. deferredTwo = defer.Deferred()
  307. deferredList = defer.DeferredList([deferredOne, deferredTwo],
  308. fireOnOneErrback=True)
  309. deferredList.cancel()
  310. self.failureResultOf(deferredOne, defer.CancelledError)
  311. self.failureResultOf(deferredTwo, defer.CancelledError)
  312. deferredListFailure = self.failureResultOf(deferredList,
  313. defer.FirstError)
  314. firstError = deferredListFailure.value
  315. self.assertTrue(firstError.subFailure.check(defer.CancelledError))
  316. def test_cancelDeferredListWithFireOnOneErrbackAllDeferredsCallback(self):
  317. """
  318. When cancelling an unfired L{defer.DeferredList} with the flag
  319. C{fireOnOneErrback} set, if all the L{defer.Deferred} callbacks
  320. in its canceller, the L{defer.DeferredList} will callback with a
  321. C{list} of (success, result) C{tuple}s.
  322. """
  323. deferredOne = defer.Deferred(fakeCallbackCanceller)
  324. deferredTwo = defer.Deferred(fakeCallbackCanceller)
  325. deferredList = defer.DeferredList([deferredOne, deferredTwo],
  326. fireOnOneErrback=True)
  327. deferredList.cancel()
  328. result = self.successResultOf(deferredList)
  329. self.assertTrue(result[0][0])
  330. self.assertEqual(result[0][1], "Callback Result")
  331. self.assertTrue(result[1][0])
  332. self.assertEqual(result[1][1], "Callback Result")
  333. def test_cancelDeferredListWithOriginalDeferreds(self):
  334. """
  335. Cancelling a L{defer.DeferredList} will cancel the original
  336. L{defer.Deferred}s passed in.
  337. """
  338. deferredOne = defer.Deferred()
  339. deferredTwo = defer.Deferred()
  340. argumentList = [deferredOne, deferredTwo]
  341. deferredList = defer.DeferredList(argumentList)
  342. deferredThree = defer.Deferred()
  343. argumentList.append(deferredThree)
  344. deferredList.cancel()
  345. self.failureResultOf(deferredOne, defer.CancelledError)
  346. self.failureResultOf(deferredTwo, defer.CancelledError)
  347. self.assertNoResult(deferredThree)
  348. def test_cancelDeferredListWithException(self):
  349. """
  350. Cancelling a L{defer.DeferredList} will cancel every L{defer.Deferred}
  351. in the list even exceptions raised from the C{cancel} method of the
  352. L{defer.Deferred}s.
  353. """
  354. def cancellerRaisesException(deferred):
  355. """
  356. A L{defer.Deferred} canceller that raises an exception.
  357. @param deferred: The cancelled L{defer.Deferred}.
  358. """
  359. raise RuntimeError("test")
  360. deferredOne = defer.Deferred(cancellerRaisesException)
  361. deferredTwo = defer.Deferred()
  362. deferredList = defer.DeferredList([deferredOne, deferredTwo])
  363. deferredList.cancel()
  364. self.failureResultOf(deferredTwo, defer.CancelledError)
  365. errors = self.flushLoggedErrors(RuntimeError)
  366. self.assertEqual(len(errors), 1)
  367. def test_cancelFiredOnOneCallbackDeferredList(self):
  368. """
  369. When a L{defer.DeferredList} has fired because one L{defer.Deferred} in
  370. the list fired with a non-failure result, the cancellation will do
  371. nothing instead of cancelling the rest of the L{defer.Deferred}s.
  372. """
  373. deferredOne = defer.Deferred()
  374. deferredTwo = defer.Deferred()
  375. deferredList = defer.DeferredList([deferredOne, deferredTwo],
  376. fireOnOneCallback=True)
  377. deferredOne.callback(None)
  378. deferredList.cancel()
  379. self.assertNoResult(deferredTwo)
  380. def test_cancelFiredOnOneErrbackDeferredList(self):
  381. """
  382. When a L{defer.DeferredList} has fired because one L{defer.Deferred} in
  383. the list fired with a failure result, the cancellation will do
  384. nothing instead of cancelling the rest of the L{defer.Deferred}s.
  385. """
  386. deferredOne = defer.Deferred()
  387. deferredTwo = defer.Deferred()
  388. deferredList = defer.DeferredList([deferredOne, deferredTwo],
  389. fireOnOneErrback=True)
  390. deferredOne.errback(GenericError("test"))
  391. deferredList.cancel()
  392. self.assertNoResult(deferredTwo)
  393. self.failureResultOf(deferredOne, GenericError)
  394. self.failureResultOf(deferredList, defer.FirstError)
  395. def testImmediateSuccess(self):
  396. l = []
  397. d = defer.succeed("success")
  398. d.addCallback(l.append)
  399. self.assertEqual(l, ["success"])
  400. def testImmediateFailure(self):
  401. l = []
  402. d = defer.fail(GenericError("fail"))
  403. d.addErrback(l.append)
  404. self.assertEqual(str(l[0].value), "fail")
  405. def testPausedFailure(self):
  406. l = []
  407. d = defer.fail(GenericError("fail"))
  408. d.pause()
  409. d.addErrback(l.append)
  410. self.assertEqual(l, [])
  411. d.unpause()
  412. self.assertEqual(str(l[0].value), "fail")
  413. def testCallbackErrors(self):
  414. l = []
  415. d = defer.Deferred().addCallback(lambda _: 1 // 0).addErrback(l.append)
  416. d.callback(1)
  417. self.assertIsInstance(l[0].value, ZeroDivisionError)
  418. l = []
  419. d = defer.Deferred().addCallback(
  420. lambda _: failure.Failure(ZeroDivisionError())).addErrback(l.append)
  421. d.callback(1)
  422. self.assertIsInstance(l[0].value, ZeroDivisionError)
  423. def testUnpauseBeforeCallback(self):
  424. d = defer.Deferred()
  425. d.pause()
  426. d.addCallback(self._callback)
  427. d.unpause()
  428. def testReturnDeferred(self):
  429. d = defer.Deferred()
  430. d2 = defer.Deferred()
  431. d2.pause()
  432. d.addCallback(lambda r, d2=d2: d2)
  433. d.addCallback(self._callback)
  434. d.callback(1)
  435. assert self.callbackResults is None, "Should not have been called yet."
  436. d2.callback(2)
  437. assert self.callbackResults is None, "Still should not have been called yet."
  438. d2.unpause()
  439. assert self.callbackResults[0][0] == 2, "Result should have been from second deferred:%s" % (self.callbackResults,)
  440. def test_chainedPausedDeferredWithResult(self):
  441. """
  442. When a paused Deferred with a result is returned from a callback on
  443. another Deferred, the other Deferred is chained to the first and waits
  444. for it to be unpaused.
  445. """
  446. expected = object()
  447. paused = defer.Deferred()
  448. paused.callback(expected)
  449. paused.pause()
  450. chained = defer.Deferred()
  451. chained.addCallback(lambda ignored: paused)
  452. chained.callback(None)
  453. result = []
  454. chained.addCallback(result.append)
  455. self.assertEqual(result, [])
  456. paused.unpause()
  457. self.assertEqual(result, [expected])
  458. def test_pausedDeferredChained(self):
  459. """
  460. A paused Deferred encountered while pushing a result forward through a
  461. chain does not prevent earlier Deferreds from continuing to execute
  462. their callbacks.
  463. """
  464. first = defer.Deferred()
  465. second = defer.Deferred()
  466. first.addCallback(lambda ignored: second)
  467. first.callback(None)
  468. first.pause()
  469. second.callback(None)
  470. result = []
  471. second.addCallback(result.append)
  472. self.assertEqual(result, [None])
  473. def test_gatherResults(self):
  474. # test successful list of deferreds
  475. l = []
  476. defer.gatherResults([defer.succeed(1), defer.succeed(2)]).addCallback(l.append)
  477. self.assertEqual(l, [[1, 2]])
  478. # test failing list of deferreds
  479. l = []
  480. dl = [defer.succeed(1), defer.fail(ValueError())]
  481. defer.gatherResults(dl).addErrback(l.append)
  482. self.assertEqual(len(l), 1)
  483. self.assertIsInstance(l[0], failure.Failure)
  484. # get rid of error
  485. dl[1].addErrback(lambda e: 1)
  486. def test_gatherResultsWithConsumeErrors(self):
  487. """
  488. If a L{Deferred} in the list passed to L{gatherResults} fires with a
  489. failure and C{consumerErrors} is C{True}, the failure is converted to a
  490. L{None} result on that L{Deferred}.
  491. """
  492. # test successful list of deferreds
  493. dgood = defer.succeed(1)
  494. dbad = defer.fail(RuntimeError("oh noes"))
  495. d = defer.gatherResults([dgood, dbad], consumeErrors=True)
  496. unconsumedErrors = []
  497. dbad.addErrback(unconsumedErrors.append)
  498. gatheredErrors = []
  499. d.addErrback(gatheredErrors.append)
  500. self.assertEqual((len(unconsumedErrors), len(gatheredErrors)),
  501. (0, 1))
  502. self.assertIsInstance(gatheredErrors[0].value, defer.FirstError)
  503. firstError = gatheredErrors[0].value.subFailure
  504. self.assertIsInstance(firstError.value, RuntimeError)
  505. def test_cancelGatherResults(self):
  506. """
  507. When cancelling the L{defer.gatherResults} call, all the
  508. L{defer.Deferred}s in the list will be cancelled.
  509. """
  510. deferredOne = defer.Deferred()
  511. deferredTwo = defer.Deferred()
  512. result = defer.gatherResults([deferredOne, deferredTwo])
  513. result.cancel()
  514. self.failureResultOf(deferredOne, defer.CancelledError)
  515. self.failureResultOf(deferredTwo, defer.CancelledError)
  516. gatherResultsFailure = self.failureResultOf(result, defer.FirstError)
  517. firstError = gatherResultsFailure.value
  518. self.assertTrue(firstError.subFailure.check(defer.CancelledError))
  519. def test_cancelGatherResultsWithAllDeferredsCallback(self):
  520. """
  521. When cancelling the L{defer.gatherResults} call, if all the
  522. L{defer.Deferred}s callback in their canceller, the L{defer.Deferred}
  523. returned by L{defer.gatherResults} will be callbacked with the C{list}
  524. of the results.
  525. """
  526. deferredOne = defer.Deferred(fakeCallbackCanceller)
  527. deferredTwo = defer.Deferred(fakeCallbackCanceller)
  528. result = defer.gatherResults([deferredOne, deferredTwo])
  529. result.cancel()
  530. callbackResult = self.successResultOf(result)
  531. self.assertEqual(callbackResult[0], "Callback Result")
  532. self.assertEqual(callbackResult[1], "Callback Result")
  533. def test_maybeDeferredSync(self):
  534. """
  535. L{defer.maybeDeferred} should retrieve the result of a synchronous
  536. function and pass it to its resulting L{defer.Deferred}.
  537. """
  538. S, E = [], []
  539. d = defer.maybeDeferred((lambda x: x + 5), 10)
  540. d.addCallbacks(S.append, E.append)
  541. self.assertEqual(E, [])
  542. self.assertEqual(S, [15])
  543. def test_maybeDeferredSyncError(self):
  544. """
  545. L{defer.maybeDeferred} should catch exception raised by a synchronous
  546. function and errback its resulting L{defer.Deferred} with it.
  547. """
  548. S, E = [], []
  549. try:
  550. '10' + 5
  551. except TypeError as e:
  552. expected = str(e)
  553. d = defer.maybeDeferred((lambda x: x + 5), '10')
  554. d.addCallbacks(S.append, E.append)
  555. self.assertEqual(S, [])
  556. self.assertEqual(len(E), 1)
  557. self.assertEqual(str(E[0].value), expected)
  558. def test_maybeDeferredAsync(self):
  559. """
  560. L{defer.maybeDeferred} should let L{defer.Deferred} instance pass by
  561. so that original result is the same.
  562. """
  563. d = defer.Deferred()
  564. d2 = defer.maybeDeferred(lambda: d)
  565. d.callback('Success')
  566. result = []
  567. d2.addCallback(result.append)
  568. self.assertEqual(result, ['Success'])
  569. def test_maybeDeferredAsyncError(self):
  570. """
  571. L{defer.maybeDeferred} should let L{defer.Deferred} instance pass by
  572. so that L{failure.Failure} returned by the original instance is the
  573. same.
  574. """
  575. d = defer.Deferred()
  576. d2 = defer.maybeDeferred(lambda: d)
  577. d.errback(failure.Failure(RuntimeError()))
  578. self.assertImmediateFailure(d2, RuntimeError)
  579. def test_innerCallbacksPreserved(self):
  580. """
  581. When a L{Deferred} encounters a result which is another L{Deferred}
  582. which is waiting on a third L{Deferred}, the middle L{Deferred}'s
  583. callbacks are executed after the third L{Deferred} fires and before the
  584. first receives a result.
  585. """
  586. results = []
  587. failures = []
  588. inner = defer.Deferred()
  589. def cb(result):
  590. results.append(('start-of-cb', result))
  591. d = defer.succeed('inner')
  592. def firstCallback(result):
  593. results.append(('firstCallback', 'inner'))
  594. return inner
  595. def secondCallback(result):
  596. results.append(('secondCallback', result))
  597. return result * 2
  598. d.addCallback(firstCallback).addCallback(secondCallback)
  599. d.addErrback(failures.append)
  600. return d
  601. outer = defer.succeed('outer')
  602. outer.addCallback(cb)
  603. inner.callback('orange')
  604. outer.addCallback(results.append)
  605. inner.addErrback(failures.append)
  606. outer.addErrback(failures.append)
  607. self.assertEqual([], failures)
  608. self.assertEqual(
  609. results,
  610. [('start-of-cb', 'outer'),
  611. ('firstCallback', 'inner'),
  612. ('secondCallback', 'orange'),
  613. 'orangeorange'])
  614. def test_continueCallbackNotFirst(self):
  615. """
  616. The continue callback of a L{Deferred} waiting for another L{Deferred}
  617. is not necessarily the first one. This is somewhat a whitebox test
  618. checking that we search for that callback among the whole list of
  619. callbacks.
  620. """
  621. results = []
  622. failures = []
  623. a = defer.Deferred()
  624. def cb(result):
  625. results.append(('cb', result))
  626. d = defer.Deferred()
  627. def firstCallback(ignored):
  628. results.append(('firstCallback', ignored))
  629. return defer.gatherResults([a])
  630. def secondCallback(result):
  631. results.append(('secondCallback', result))
  632. d.addCallback(firstCallback)
  633. d.addCallback(secondCallback)
  634. d.addErrback(failures.append)
  635. d.callback(None)
  636. return d
  637. outer = defer.succeed('outer')
  638. outer.addCallback(cb)
  639. outer.addErrback(failures.append)
  640. self.assertEqual([('cb', 'outer'), ('firstCallback', None)], results)
  641. a.callback('withers')
  642. self.assertEqual([], failures)
  643. self.assertEqual(
  644. results,
  645. [('cb', 'outer'),
  646. ('firstCallback', None),
  647. ('secondCallback', ['withers'])])
  648. def test_callbackOrderPreserved(self):
  649. """
  650. A callback added to a L{Deferred} after a previous callback attached
  651. another L{Deferred} as a result is run after the callbacks of the other
  652. L{Deferred} are run.
  653. """
  654. results = []
  655. failures = []
  656. a = defer.Deferred()
  657. def cb(result):
  658. results.append(('cb', result))
  659. d = defer.Deferred()
  660. def firstCallback(ignored):
  661. results.append(('firstCallback', ignored))
  662. return defer.gatherResults([a])
  663. def secondCallback(result):
  664. results.append(('secondCallback', result))
  665. d.addCallback(firstCallback)
  666. d.addCallback(secondCallback)
  667. d.addErrback(failures.append)
  668. d.callback(None)
  669. return d
  670. outer = defer.Deferred()
  671. outer.addCallback(cb)
  672. outer.addCallback(lambda x: results.append('final'))
  673. outer.addErrback(failures.append)
  674. outer.callback('outer')
  675. self.assertEqual([('cb', 'outer'), ('firstCallback', None)], results)
  676. a.callback('withers')
  677. self.assertEqual([], failures)
  678. self.assertEqual(
  679. results,
  680. [('cb', 'outer'),
  681. ('firstCallback', None),
  682. ('secondCallback', ['withers']), 'final'])
  683. def test_reentrantRunCallbacks(self):
  684. """
  685. A callback added to a L{Deferred} by a callback on that L{Deferred}
  686. should be added to the end of the callback chain.
  687. """
  688. deferred = defer.Deferred()
  689. called = []
  690. def callback3(result):
  691. called.append(3)
  692. def callback2(result):
  693. called.append(2)
  694. def callback1(result):
  695. called.append(1)
  696. deferred.addCallback(callback3)
  697. deferred.addCallback(callback1)
  698. deferred.addCallback(callback2)
  699. deferred.callback(None)
  700. self.assertEqual(called, [1, 2, 3])
  701. def test_nonReentrantCallbacks(self):
  702. """
  703. A callback added to a L{Deferred} by a callback on that L{Deferred}
  704. should not be executed until the running callback returns.
  705. """
  706. deferred = defer.Deferred()
  707. called = []
  708. def callback2(result):
  709. called.append(2)
  710. def callback1(result):
  711. called.append(1)
  712. deferred.addCallback(callback2)
  713. self.assertEqual(called, [1])
  714. deferred.addCallback(callback1)
  715. deferred.callback(None)
  716. self.assertEqual(called, [1, 2])
  717. def test_reentrantRunCallbacksWithFailure(self):
  718. """
  719. After an exception is raised by a callback which was added to a
  720. L{Deferred} by a callback on that L{Deferred}, the L{Deferred} should
  721. call the first errback with a L{Failure} wrapping that exception.
  722. """
  723. exceptionMessage = "callback raised exception"
  724. deferred = defer.Deferred()
  725. def callback2(result):
  726. raise Exception(exceptionMessage)
  727. def callback1(result):
  728. deferred.addCallback(callback2)
  729. deferred.addCallback(callback1)
  730. deferred.callback(None)
  731. exception = self.assertImmediateFailure(deferred, Exception)
  732. self.assertEqual(exception.args, (exceptionMessage,))
  733. def test_synchronousImplicitChain(self):
  734. """
  735. If a first L{Deferred} with a result is returned from a callback on a
  736. second L{Deferred}, the result of the second L{Deferred} becomes the
  737. result of the first L{Deferred} and the result of the first L{Deferred}
  738. becomes L{None}.
  739. """
  740. result = object()
  741. first = defer.succeed(result)
  742. second = defer.Deferred()
  743. second.addCallback(lambda ign: first)
  744. second.callback(None)
  745. results = []
  746. first.addCallback(results.append)
  747. self.assertIsNone(results[0])
  748. second.addCallback(results.append)
  749. self.assertIs(results[1], result)
  750. def test_asynchronousImplicitChain(self):
  751. """
  752. If a first L{Deferred} without a result is returned from a callback on
  753. a second L{Deferred}, the result of the second L{Deferred} becomes the
  754. result of the first L{Deferred} as soon as the first L{Deferred} has
  755. one and the result of the first L{Deferred} becomes L{None}.
  756. """
  757. first = defer.Deferred()
  758. second = defer.Deferred()
  759. second.addCallback(lambda ign: first)
  760. second.callback(None)
  761. firstResult = []
  762. first.addCallback(firstResult.append)
  763. secondResult = []
  764. second.addCallback(secondResult.append)
  765. self.assertEqual(firstResult, [])
  766. self.assertEqual(secondResult, [])
  767. result = object()
  768. first.callback(result)
  769. self.assertEqual(firstResult, [None])
  770. self.assertEqual(secondResult, [result])
  771. def test_synchronousImplicitErrorChain(self):
  772. """
  773. If a first L{Deferred} with a L{Failure} result is returned from a
  774. callback on a second L{Deferred}, the first L{Deferred}'s result is
  775. converted to L{None} and no unhandled error is logged when it is
  776. garbage collected.
  777. """
  778. first = defer.fail(RuntimeError("First Deferred's Failure"))
  779. second = defer.Deferred()
  780. second.addCallback(lambda ign, first=first: first)
  781. second.callback(None)
  782. firstResult = []
  783. first.addCallback(firstResult.append)
  784. self.assertIsNone(firstResult[0])
  785. self.assertImmediateFailure(second, RuntimeError)
  786. def test_asynchronousImplicitErrorChain(self):
  787. """
  788. Let C{a} and C{b} be two L{Deferred}s.
  789. If C{a} has no result and is returned from a callback on C{b} then when
  790. C{a} fails, C{b}'s result becomes the L{Failure} that was C{a}'s result,
  791. the result of C{a} becomes L{None} so that no unhandled error is logged
  792. when it is garbage collected.
  793. """
  794. first = defer.Deferred()
  795. second = defer.Deferred()
  796. second.addCallback(lambda ign: first)
  797. second.callback(None)
  798. secondError = []
  799. second.addErrback(secondError.append)
  800. firstResult = []
  801. first.addCallback(firstResult.append)
  802. secondResult = []
  803. second.addCallback(secondResult.append)
  804. self.assertEqual(firstResult, [])
  805. self.assertEqual(secondResult, [])
  806. first.errback(RuntimeError("First Deferred's Failure"))
  807. self.assertTrue(secondError[0].check(RuntimeError))
  808. self.assertEqual(firstResult, [None])
  809. self.assertEqual(len(secondResult), 1)
  810. def test_doubleAsynchronousImplicitChaining(self):
  811. """
  812. L{Deferred} chaining is transitive.
  813. In other words, let A, B, and C be Deferreds. If C is returned from a
  814. callback on B and B is returned from a callback on A then when C fires,
  815. A fires.
  816. """
  817. first = defer.Deferred()
  818. second = defer.Deferred()
  819. second.addCallback(lambda ign: first)
  820. third = defer.Deferred()
  821. third.addCallback(lambda ign: second)
  822. thirdResult = []
  823. third.addCallback(thirdResult.append)
  824. result = object()
  825. # After this, second is waiting for first to tell it to continue.
  826. second.callback(None)
  827. # And after this, third is waiting for second to tell it to continue.
  828. third.callback(None)
  829. # Still waiting
  830. self.assertEqual(thirdResult, [])
  831. # This will tell second to continue which will tell third to continue.
  832. first.callback(result)
  833. self.assertEqual(thirdResult, [result])
  834. def test_nestedAsynchronousChainedDeferreds(self):
  835. """
  836. L{Deferred}s can have callbacks that themselves return L{Deferred}s.
  837. When these "inner" L{Deferred}s fire (even asynchronously), the
  838. callback chain continues.
  839. """
  840. results = []
  841. failures = []
  842. # A Deferred returned in the inner callback.
  843. inner = defer.Deferred()
  844. def cb(result):
  845. results.append(('start-of-cb', result))
  846. d = defer.succeed('inner')
  847. def firstCallback(result):
  848. results.append(('firstCallback', 'inner'))
  849. # Return a Deferred that definitely has not fired yet, so we
  850. # can fire the Deferreds out of order.
  851. return inner
  852. def secondCallback(result):
  853. results.append(('secondCallback', result))
  854. return result * 2
  855. d.addCallback(firstCallback).addCallback(secondCallback)
  856. d.addErrback(failures.append)
  857. return d
  858. # Create a synchronous Deferred that has a callback 'cb' that returns
  859. # a Deferred 'd' that has fired but is now waiting on an unfired
  860. # Deferred 'inner'.
  861. outer = defer.succeed('outer')
  862. outer.addCallback(cb)
  863. outer.addCallback(results.append)
  864. # At this point, the callback 'cb' has been entered, and the first
  865. # callback of 'd' has been called.
  866. self.assertEqual(
  867. results, [('start-of-cb', 'outer'), ('firstCallback', 'inner')])
  868. # Once the inner Deferred is fired, processing of the outer Deferred's
  869. # callback chain continues.
  870. inner.callback('orange')
  871. # Make sure there are no errors.
  872. inner.addErrback(failures.append)
  873. outer.addErrback(failures.append)
  874. self.assertEqual(
  875. [], failures, "Got errbacks but wasn't expecting any.")
  876. self.assertEqual(
  877. results,
  878. [('start-of-cb', 'outer'),
  879. ('firstCallback', 'inner'),
  880. ('secondCallback', 'orange'),
  881. 'orangeorange'])
  882. def test_nestedAsynchronousChainedDeferredsWithExtraCallbacks(self):
  883. """
  884. L{Deferred}s can have callbacks that themselves return L{Deferred}s.
  885. These L{Deferred}s can have other callbacks added before they are
  886. returned, which subtly changes the callback chain. When these "inner"
  887. L{Deferred}s fire (even asynchronously), the outer callback chain
  888. continues.
  889. """
  890. results = []
  891. failures = []
  892. # A Deferred returned in the inner callback after a callback is
  893. # added explicitly and directly to it.
  894. inner = defer.Deferred()
  895. def cb(result):
  896. results.append(('start-of-cb', result))
  897. d = defer.succeed('inner')
  898. def firstCallback(ignored):
  899. results.append(('firstCallback', ignored))
  900. # Return a Deferred that definitely has not fired yet with a
  901. # result-transforming callback so we can fire the Deferreds
  902. # out of order and see how the callback affects the ultimate
  903. # results.
  904. return inner.addCallback(lambda x: [x])
  905. def secondCallback(result):
  906. results.append(('secondCallback', result))
  907. return result * 2
  908. d.addCallback(firstCallback)
  909. d.addCallback(secondCallback)
  910. d.addErrback(failures.append)
  911. return d
  912. # Create a synchronous Deferred that has a callback 'cb' that returns
  913. # a Deferred 'd' that has fired but is now waiting on an unfired
  914. # Deferred 'inner'.
  915. outer = defer.succeed('outer')
  916. outer.addCallback(cb)
  917. outer.addCallback(results.append)
  918. # At this point, the callback 'cb' has been entered, and the first
  919. # callback of 'd' has been called.
  920. self.assertEqual(
  921. results, [('start-of-cb', 'outer'), ('firstCallback', 'inner')])
  922. # Once the inner Deferred is fired, processing of the outer Deferred's
  923. # callback chain continues.
  924. inner.callback('withers')
  925. # Make sure there are no errors.
  926. outer.addErrback(failures.append)
  927. inner.addErrback(failures.append)
  928. self.assertEqual(
  929. [], failures, "Got errbacks but wasn't expecting any.")
  930. self.assertEqual(
  931. results,
  932. [('start-of-cb', 'outer'),
  933. ('firstCallback', 'inner'),
  934. ('secondCallback', ['withers']),
  935. ['withers', 'withers']])
  936. def test_chainDeferredRecordsExplicitChain(self):
  937. """
  938. When we chain a L{Deferred}, that chaining is recorded explicitly.
  939. """
  940. a = defer.Deferred()
  941. b = defer.Deferred()
  942. b.chainDeferred(a)
  943. self.assertIs(a._chainedTo, b)
  944. def test_explicitChainClearedWhenResolved(self):
  945. """
  946. Any recorded chaining is cleared once the chaining is resolved, since
  947. it no longer exists.
  948. In other words, if one L{Deferred} is recorded as depending on the
  949. result of another, and I{that} L{Deferred} has fired, then the
  950. dependency is resolved and we no longer benefit from recording it.
  951. """
  952. a = defer.Deferred()
  953. b = defer.Deferred()
  954. b.chainDeferred(a)
  955. b.callback(None)
  956. self.assertIsNone(a._chainedTo)
  957. def test_chainDeferredRecordsImplicitChain(self):
  958. """
  959. We can chain L{Deferred}s implicitly by adding callbacks that return
  960. L{Deferred}s. When this chaining happens, we record it explicitly as
  961. soon as we can find out about it.
  962. """
  963. a = defer.Deferred()
  964. b = defer.Deferred()
  965. a.addCallback(lambda ignored: b)
  966. a.callback(None)
  967. self.assertIs(a._chainedTo, b)
  968. def test_circularChainWarning(self):
  969. """
  970. When a Deferred is returned from a callback directly attached to that
  971. same Deferred, a warning is emitted.
  972. """
  973. d = defer.Deferred()
  974. def circularCallback(result):
  975. return d
  976. d.addCallback(circularCallback)
  977. d.callback("foo")
  978. circular_warnings = self.flushWarnings([circularCallback])
  979. self.assertEqual(len(circular_warnings), 1)
  980. warning = circular_warnings[0]
  981. self.assertEqual(warning['category'], DeprecationWarning)
  982. pattern = "Callback returned the Deferred it was attached to"
  983. self.assertTrue(
  984. re.search(pattern, warning['message']),
  985. "\nExpected match: %r\nGot: %r" % (pattern, warning['message']))
  986. def test_circularChainException(self):
  987. """
  988. If the deprecation warning for circular deferred callbacks is
  989. configured to be an error, the exception will become the failure
  990. result of the Deferred.
  991. """
  992. self.addCleanup(setattr, warnings, "filters", warnings.filters)
  993. warnings.filterwarnings("error", category=DeprecationWarning)
  994. d = defer.Deferred()
  995. def circularCallback(result):
  996. return d
  997. d.addCallback(circularCallback)
  998. d.callback("foo")
  999. failure = self.failureResultOf(d)
  1000. failure.trap(DeprecationWarning)
  1001. def test_repr(self):
  1002. """
  1003. The C{repr()} of a L{Deferred} contains the class name and a
  1004. representation of the internal Python ID.
  1005. """
  1006. d = defer.Deferred()
  1007. address = id(d)
  1008. self.assertEqual(
  1009. repr(d), '<Deferred at 0x%x>' % (address,))
  1010. def test_reprWithResult(self):
  1011. """
  1012. If a L{Deferred} has been fired, then its C{repr()} contains its
  1013. result.
  1014. """
  1015. d = defer.Deferred()
  1016. d.callback('orange')
  1017. self.assertEqual(
  1018. repr(d), "<Deferred at 0x%x current result: 'orange'>" % (
  1019. id(d),))
  1020. def test_reprWithChaining(self):
  1021. """
  1022. If a L{Deferred} C{a} has been fired, but is waiting on another
  1023. L{Deferred} C{b} that appears in its callback chain, then C{repr(a)}
  1024. says that it is waiting on C{b}.
  1025. """
  1026. a = defer.Deferred()
  1027. b = defer.Deferred()
  1028. b.chainDeferred(a)
  1029. self.assertEqual(
  1030. repr(a), "<Deferred at 0x%x waiting on Deferred at 0x%x>" % (
  1031. id(a), id(b)))
  1032. def test_boundedStackDepth(self):
  1033. """
  1034. The depth of the call stack does not grow as more L{Deferred} instances
  1035. are chained together.
  1036. """
  1037. def chainDeferreds(howMany):
  1038. stack = []
  1039. def recordStackDepth(ignored):
  1040. stack.append(len(traceback.extract_stack()))
  1041. top = defer.Deferred()
  1042. innerDeferreds = [defer.Deferred() for ignored in range(howMany)]
  1043. originalInners = innerDeferreds[:]
  1044. last = defer.Deferred()
  1045. inner = innerDeferreds.pop()
  1046. top.addCallback(lambda ign, inner=inner: inner)
  1047. top.addCallback(recordStackDepth)
  1048. while innerDeferreds:
  1049. newInner = innerDeferreds.pop()
  1050. inner.addCallback(lambda ign, inner=newInner: inner)
  1051. inner = newInner
  1052. inner.addCallback(lambda ign: last)
  1053. top.callback(None)
  1054. for inner in originalInners:
  1055. inner.callback(None)
  1056. # Sanity check - the record callback is not intended to have
  1057. # fired yet.
  1058. self.assertEqual(stack, [])
  1059. # Now fire the last thing and return the stack depth at which the
  1060. # callback was invoked.
  1061. last.callback(None)
  1062. return stack[0]
  1063. # Callbacks should be invoked at the same stack depth regardless of
  1064. # how many Deferreds are chained.
  1065. self.assertEqual(chainDeferreds(1), chainDeferreds(2))
  1066. def test_resultOfDeferredResultOfDeferredOfFiredDeferredCalled(self):
  1067. """
  1068. Given three Deferreds, one chained to the next chained to the next,
  1069. callbacks on the middle Deferred which are added after the chain is
  1070. created are called once the last Deferred fires.
  1071. This is more of a regression-style test. It doesn't exercise any
  1072. particular code path through the current implementation of Deferred, but
  1073. it does exercise a broken codepath through one of the variations of the
  1074. implementation proposed as a resolution to ticket #411.
  1075. """
  1076. first = defer.Deferred()
  1077. second = defer.Deferred()
  1078. third = defer.Deferred()
  1079. first.addCallback(lambda ignored: second)
  1080. second.addCallback(lambda ignored: third)
  1081. second.callback(None)
  1082. first.callback(None)
  1083. third.callback(None)
  1084. L = []
  1085. second.addCallback(L.append)
  1086. self.assertEqual(L, [None])
  1087. def test_errbackWithNoArgsNoDebug(self):
  1088. """
  1089. C{Deferred.errback()} creates a failure from the current Python
  1090. exception. When Deferred.debug is not set no globals or locals are
  1091. captured in that failure.
  1092. """
  1093. defer.setDebugging(False)
  1094. d = defer.Deferred()
  1095. l = []
  1096. exc = GenericError("Bang")
  1097. try:
  1098. raise exc
  1099. except:
  1100. d.errback()
  1101. d.addErrback(l.append)
  1102. fail = l[0]
  1103. self.assertEqual(fail.value, exc)
  1104. localz, globalz = fail.frames[0][-2:]
  1105. self.assertEqual([], localz)
  1106. self.assertEqual([], globalz)
  1107. def test_errbackWithNoArgs(self):
  1108. """
  1109. C{Deferred.errback()} creates a failure from the current Python
  1110. exception. When Deferred.debug is set globals and locals are captured
  1111. in that failure.
  1112. """
  1113. defer.setDebugging(True)
  1114. d = defer.Deferred()
  1115. l = []
  1116. exc = GenericError("Bang")
  1117. try:
  1118. raise exc
  1119. except:
  1120. d.errback()
  1121. d.addErrback(l.append)
  1122. fail = l[0]
  1123. self.assertEqual(fail.value, exc)
  1124. localz, globalz = fail.frames[0][-2:]
  1125. self.assertNotEqual([], localz)
  1126. self.assertNotEqual([], globalz)
  1127. def test_errorInCallbackDoesNotCaptureVars(self):
  1128. """
  1129. An error raised by a callback creates a Failure. The Failure captures
  1130. locals and globals if and only if C{Deferred.debug} is set.
  1131. """
  1132. d = defer.Deferred()
  1133. d.callback(None)
  1134. defer.setDebugging(False)
  1135. def raiseError(ignored):
  1136. raise GenericError("Bang")
  1137. d.addCallback(raiseError)
  1138. l = []
  1139. d.addErrback(l.append)
  1140. fail = l[0]
  1141. localz, globalz = fail.frames[0][-2:]
  1142. self.assertEqual([], localz)
  1143. self.assertEqual([], globalz)
  1144. def test_errorInCallbackCapturesVarsWhenDebugging(self):
  1145. """
  1146. An error raised by a callback creates a Failure. The Failure captures
  1147. locals and globals if and only if C{Deferred.debug} is set.
  1148. """
  1149. d = defer.Deferred()
  1150. d.callback(None)
  1151. defer.setDebugging(True)
  1152. def raiseError(ignored):
  1153. raise GenericError("Bang")
  1154. d.addCallback(raiseError)
  1155. l = []
  1156. d.addErrback(l.append)
  1157. fail = l[0]
  1158. localz, globalz = fail.frames[0][-2:]
  1159. self.assertNotEqual([], localz)
  1160. self.assertNotEqual([], globalz)
  1161. def test_inlineCallbacksTracebacks(self):
  1162. """
  1163. L{defer.inlineCallbacks} that re-raise tracebacks into their deferred
  1164. should not lose their tracebacks.
  1165. """
  1166. f = getDivisionFailure()
  1167. d = defer.Deferred()
  1168. try:
  1169. f.raiseException()
  1170. except:
  1171. d.errback()
  1172. def ic(d):
  1173. yield d
  1174. ic = defer.inlineCallbacks(ic)
  1175. newFailure = self.failureResultOf(d)
  1176. tb = traceback.extract_tb(newFailure.getTracebackObject())
  1177. self.assertEqual(len(tb), 2)
  1178. self.assertIn('test_defer', tb[0][0])
  1179. self.assertEqual('test_inlineCallbacksTracebacks', tb[0][2])
  1180. self.assertEqual('f.raiseException()', tb[0][3])
  1181. self.assertIn('test_defer', tb[1][0])
  1182. self.assertEqual('getDivisionFailure', tb[1][2])
  1183. self.assertEqual('1/0', tb[1][3])
  1184. if _PY3:
  1185. # FIXME: https://twistedmatrix.com/trac/ticket/5949
  1186. test_inlineCallbacksTracebacks.skip = (
  1187. "Python 3 support to be fixed in #5949")
  1188. class FirstErrorTests(unittest.SynchronousTestCase):
  1189. """
  1190. Tests for L{FirstError}.
  1191. """
  1192. def test_repr(self):
  1193. """
  1194. The repr of a L{FirstError} instance includes the repr of the value of
  1195. the sub-failure and the index which corresponds to the L{FirstError}.
  1196. """
  1197. exc = ValueError("some text")
  1198. try:
  1199. raise exc
  1200. except:
  1201. f = failure.Failure()
  1202. error = defer.FirstError(f, 3)
  1203. self.assertEqual(
  1204. repr(error),
  1205. "FirstError[#3, %s]" % (repr(exc),))
  1206. def test_str(self):
  1207. """
  1208. The str of a L{FirstError} instance includes the str of the
  1209. sub-failure and the index which corresponds to the L{FirstError}.
  1210. """
  1211. exc = ValueError("some text")
  1212. try:
  1213. raise exc
  1214. except:
  1215. f = failure.Failure()
  1216. error = defer.FirstError(f, 5)
  1217. self.assertEqual(
  1218. str(error),
  1219. "FirstError[#5, %s]" % (str(f),))
  1220. def test_comparison(self):
  1221. """
  1222. L{FirstError} instances compare equal to each other if and only if
  1223. their failure and index compare equal. L{FirstError} instances do not
  1224. compare equal to instances of other types.
  1225. """
  1226. try:
  1227. 1 // 0
  1228. except:
  1229. firstFailure = failure.Failure()
  1230. one = defer.FirstError(firstFailure, 13)
  1231. anotherOne = defer.FirstError(firstFailure, 13)
  1232. try:
  1233. raise ValueError("bar")
  1234. except:
  1235. secondFailure = failure.Failure()
  1236. another = defer.FirstError(secondFailure, 9)
  1237. self.assertTrue(one == anotherOne)
  1238. self.assertFalse(one == another)
  1239. self.assertTrue(one != another)
  1240. self.assertFalse(one != anotherOne)
  1241. self.assertFalse(one == 10)
  1242. class AlreadyCalledTests(unittest.SynchronousTestCase):
  1243. def setUp(self):
  1244. self._deferredWasDebugging = defer.getDebugging()
  1245. defer.setDebugging(True)
  1246. def tearDown(self):
  1247. defer.setDebugging(self._deferredWasDebugging)
  1248. def _callback(self, *args, **kw):
  1249. pass
  1250. def _errback(self, *args, **kw):
  1251. pass
  1252. def _call_1(self, d):
  1253. d.callback("hello")
  1254. def _call_2(self, d):
  1255. d.callback("twice")
  1256. def _err_1(self, d):
  1257. d.errback(failure.Failure(RuntimeError()))
  1258. def _err_2(self, d):
  1259. d.errback(failure.Failure(RuntimeError()))
  1260. def testAlreadyCalled_CC(self):
  1261. d = defer.Deferred()
  1262. d.addCallbacks(self._callback, self._errback)
  1263. self._call_1(d)
  1264. self.assertRaises(defer.AlreadyCalledError, self._call_2, d)
  1265. def testAlreadyCalled_CE(self):
  1266. d = defer.Deferred()
  1267. d.addCallbacks(self._callback, self._errback)
  1268. self._call_1(d)
  1269. self.assertRaises(defer.AlreadyCalledError, self._err_2, d)
  1270. def testAlreadyCalled_EE(self):
  1271. d = defer.Deferred()
  1272. d.addCallbacks(self._callback, self._errback)
  1273. self._err_1(d)
  1274. self.assertRaises(defer.AlreadyCalledError, self._err_2, d)
  1275. def testAlreadyCalled_EC(self):
  1276. d = defer.Deferred()
  1277. d.addCallbacks(self._callback, self._errback)
  1278. self._err_1(d)
  1279. self.assertRaises(defer.AlreadyCalledError, self._call_2, d)
  1280. def _count(self, linetype, func, lines, expected):
  1281. count = 0
  1282. for line in lines:
  1283. if (line.startswith(' %s:' % linetype) and
  1284. line.endswith(' %s' % func)):
  1285. count += 1
  1286. self.assertTrue(count == expected)
  1287. def _check(self, e, caller, invoker1, invoker2):
  1288. # make sure the debugging information is vaguely correct
  1289. lines = e.args[0].split("\n")
  1290. # the creator should list the creator (testAlreadyCalledDebug) but not
  1291. # _call_1 or _call_2 or other invokers
  1292. self._count('C', caller, lines, 1)
  1293. self._count('C', '_call_1', lines, 0)
  1294. self._count('C', '_call_2', lines, 0)
  1295. self._count('C', '_err_1', lines, 0)
  1296. self._count('C', '_err_2', lines, 0)
  1297. # invoker should list the first invoker but not the second
  1298. self._count('I', invoker1, lines, 1)
  1299. self._count('I', invoker2, lines, 0)
  1300. def testAlreadyCalledDebug_CC(self):
  1301. d = defer.Deferred()
  1302. d.addCallbacks(self._callback, self._errback)
  1303. self._call_1(d)
  1304. try:
  1305. self._call_2(d)
  1306. except defer.AlreadyCalledError as e:
  1307. self._check(e, "testAlreadyCalledDebug_CC", "_call_1", "_call_2")
  1308. else:
  1309. self.fail("second callback failed to raise AlreadyCalledError")
  1310. def testAlreadyCalledDebug_CE(self):
  1311. d = defer.Deferred()
  1312. d.addCallbacks(self._callback, self._errback)
  1313. self._call_1(d)
  1314. try:
  1315. self._err_2(d)
  1316. except defer.AlreadyCalledError as e:
  1317. self._check(e, "testAlreadyCalledDebug_CE", "_call_1", "_err_2")
  1318. else:
  1319. self.fail("second errback failed to raise AlreadyCalledError")
  1320. def testAlreadyCalledDebug_EC(self):
  1321. d = defer.Deferred()
  1322. d.addCallbacks(self._callback, self._errback)
  1323. self._err_1(d)
  1324. try:
  1325. self._call_2(d)
  1326. except defer.AlreadyCalledError as e:
  1327. self._check(e, "testAlreadyCalledDebug_EC", "_err_1", "_call_2")
  1328. else:
  1329. self.fail("second callback failed to raise AlreadyCalledError")
  1330. def testAlreadyCalledDebug_EE(self):
  1331. d = defer.Deferred()
  1332. d.addCallbacks(self._callback, self._errback)
  1333. self._err_1(d)
  1334. try:
  1335. self._err_2(d)
  1336. except defer.AlreadyCalledError as e:
  1337. self._check(e, "testAlreadyCalledDebug_EE", "_err_1", "_err_2")
  1338. else:
  1339. self.fail("second errback failed to raise AlreadyCalledError")
  1340. def testNoDebugging(self):
  1341. defer.setDebugging(False)
  1342. d = defer.Deferred()
  1343. d.addCallbacks(self._callback, self._errback)
  1344. self._call_1(d)
  1345. try:
  1346. self._call_2(d)
  1347. except defer.AlreadyCalledError as e:
  1348. self.assertFalse(e.args)
  1349. else:
  1350. self.fail("second callback failed to raise AlreadyCalledError")
  1351. def testSwitchDebugging(self):
  1352. # Make sure Deferreds can deal with debug state flipping
  1353. # around randomly. This is covering a particular fixed bug.
  1354. defer.setDebugging(False)
  1355. d = defer.Deferred()
  1356. d.addBoth(lambda ign: None)
  1357. defer.setDebugging(True)
  1358. d.callback(None)
  1359. defer.setDebugging(False)
  1360. d = defer.Deferred()
  1361. d.callback(None)
  1362. defer.setDebugging(True)
  1363. d.addBoth(lambda ign: None)
  1364. class DeferredCancellerTests(unittest.SynchronousTestCase):
  1365. def setUp(self):
  1366. self.callbackResults = None
  1367. self.errbackResults = None
  1368. self.callback2Results = None
  1369. self.cancellerCallCount = 0
  1370. def tearDown(self):
  1371. # Sanity check that the canceller was called at most once.
  1372. self.assertIn(self.cancellerCallCount, (0, 1))
  1373. def _callback(self, data):
  1374. self.callbackResults = data
  1375. return data
  1376. def _callback2(self, data):
  1377. self.callback2Results = data
  1378. def _errback(self, data):
  1379. self.errbackResults = data
  1380. def test_noCanceller(self):
  1381. """
  1382. A L{defer.Deferred} without a canceller must errback with a
  1383. L{defer.CancelledError} and not callback.
  1384. """
  1385. d = defer.Deferred()
  1386. d.addCallbacks(self._callback, self._errback)
  1387. d.cancel()
  1388. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1389. self.assertIsNone(self.callbackResults)
  1390. def test_raisesAfterCancelAndCallback(self):
  1391. """
  1392. A L{defer.Deferred} without a canceller, when cancelled must allow
  1393. a single extra call to callback, and raise
  1394. L{defer.AlreadyCalledError} if callbacked or errbacked thereafter.
  1395. """
  1396. d = defer.Deferred()
  1397. d.addCallbacks(self._callback, self._errback)
  1398. d.cancel()
  1399. # A single extra callback should be swallowed.
  1400. d.callback(None)
  1401. # But a second call to callback or errback is not.
  1402. self.assertRaises(defer.AlreadyCalledError, d.callback, None)
  1403. self.assertRaises(defer.AlreadyCalledError, d.errback, Exception())
  1404. def test_raisesAfterCancelAndErrback(self):
  1405. """
  1406. A L{defer.Deferred} without a canceller, when cancelled must allow
  1407. a single extra call to errback, and raise
  1408. L{defer.AlreadyCalledError} if callbacked or errbacked thereafter.
  1409. """
  1410. d = defer.Deferred()
  1411. d.addCallbacks(self._callback, self._errback)
  1412. d.cancel()
  1413. # A single extra errback should be swallowed.
  1414. d.errback(Exception())
  1415. # But a second call to callback or errback is not.
  1416. self.assertRaises(defer.AlreadyCalledError, d.callback, None)
  1417. self.assertRaises(defer.AlreadyCalledError, d.errback, Exception())
  1418. def test_noCancellerMultipleCancelsAfterCancelAndCallback(self):
  1419. """
  1420. A L{Deferred} without a canceller, when cancelled and then
  1421. callbacked, ignores multiple cancels thereafter.
  1422. """
  1423. d = defer.Deferred()
  1424. d.addCallbacks(self._callback, self._errback)
  1425. d.cancel()
  1426. currentFailure = self.errbackResults
  1427. # One callback will be ignored
  1428. d.callback(None)
  1429. # Cancel should have no effect.
  1430. d.cancel()
  1431. self.assertIs(currentFailure, self.errbackResults)
  1432. def test_noCancellerMultipleCancelsAfterCancelAndErrback(self):
  1433. """
  1434. A L{defer.Deferred} without a canceller, when cancelled and then
  1435. errbacked, ignores multiple cancels thereafter.
  1436. """
  1437. d = defer.Deferred()
  1438. d.addCallbacks(self._callback, self._errback)
  1439. d.cancel()
  1440. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1441. currentFailure = self.errbackResults
  1442. # One errback will be ignored
  1443. d.errback(GenericError())
  1444. # I.e., we should still have a CancelledError.
  1445. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1446. d.cancel()
  1447. self.assertIs(currentFailure, self.errbackResults)
  1448. def test_noCancellerMultipleCancel(self):
  1449. """
  1450. Calling cancel multiple times on a deferred with no canceller
  1451. results in a L{defer.CancelledError}. Subsequent calls to cancel
  1452. do not cause an error.
  1453. """
  1454. d = defer.Deferred()
  1455. d.addCallbacks(self._callback, self._errback)
  1456. d.cancel()
  1457. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1458. currentFailure = self.errbackResults
  1459. d.cancel()
  1460. self.assertIs(currentFailure, self.errbackResults)
  1461. def test_cancellerMultipleCancel(self):
  1462. """
  1463. Verify that calling cancel multiple times on a deferred with a
  1464. canceller that does not errback results in a
  1465. L{defer.CancelledError} and that subsequent calls to cancel do not
  1466. cause an error and that after all that, the canceller was only
  1467. called once.
  1468. """
  1469. def cancel(d):
  1470. self.cancellerCallCount += 1
  1471. d = defer.Deferred(canceller=cancel)
  1472. d.addCallbacks(self._callback, self._errback)
  1473. d.cancel()
  1474. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1475. currentFailure = self.errbackResults
  1476. d.cancel()
  1477. self.assertIs(currentFailure, self.errbackResults)
  1478. self.assertEqual(self.cancellerCallCount, 1)
  1479. def test_simpleCanceller(self):
  1480. """
  1481. Verify that a L{defer.Deferred} calls its specified canceller when
  1482. it is cancelled, and that further call/errbacks raise
  1483. L{defer.AlreadyCalledError}.
  1484. """
  1485. def cancel(d):
  1486. self.cancellerCallCount += 1
  1487. d = defer.Deferred(canceller=cancel)
  1488. d.addCallbacks(self._callback, self._errback)
  1489. d.cancel()
  1490. self.assertEqual(self.cancellerCallCount, 1)
  1491. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1492. # Test that further call/errbacks are *not* swallowed
  1493. self.assertRaises(defer.AlreadyCalledError, d.callback, None)
  1494. self.assertRaises(defer.AlreadyCalledError, d.errback, Exception())
  1495. def test_cancellerArg(self):
  1496. """
  1497. Verify that a canceller is given the correct deferred argument.
  1498. """
  1499. def cancel(d1):
  1500. self.assertIs(d1, d)
  1501. d = defer.Deferred(canceller=cancel)
  1502. d.addCallbacks(self._callback, self._errback)
  1503. d.cancel()
  1504. def test_cancelAfterCallback(self):
  1505. """
  1506. Test that cancelling a deferred after it has been callbacked does
  1507. not cause an error.
  1508. """
  1509. def cancel(d):
  1510. self.cancellerCallCount += 1
  1511. d.errback(GenericError())
  1512. d = defer.Deferred(canceller=cancel)
  1513. d.addCallbacks(self._callback, self._errback)
  1514. d.callback('biff!')
  1515. d.cancel()
  1516. self.assertEqual(self.cancellerCallCount, 0)
  1517. self.assertIsNone(self.errbackResults)
  1518. self.assertEqual(self.callbackResults, 'biff!')
  1519. def test_cancelAfterErrback(self):
  1520. """
  1521. Test that cancelling a L{Deferred} after it has been errbacked does
  1522. not result in a L{defer.CancelledError}.
  1523. """
  1524. def cancel(d):
  1525. self.cancellerCallCount += 1
  1526. d.errback(GenericError())
  1527. d = defer.Deferred(canceller=cancel)
  1528. d.addCallbacks(self._callback, self._errback)
  1529. d.errback(GenericError())
  1530. d.cancel()
  1531. self.assertEqual(self.cancellerCallCount, 0)
  1532. self.assertEqual(self.errbackResults.type, GenericError)
  1533. self.assertIsNone(self.callbackResults)
  1534. def test_cancellerThatErrbacks(self):
  1535. """
  1536. Test a canceller which errbacks its deferred.
  1537. """
  1538. def cancel(d):
  1539. self.cancellerCallCount += 1
  1540. d.errback(GenericError())
  1541. d = defer.Deferred(canceller=cancel)
  1542. d.addCallbacks(self._callback, self._errback)
  1543. d.cancel()
  1544. self.assertEqual(self.cancellerCallCount, 1)
  1545. self.assertEqual(self.errbackResults.type, GenericError)
  1546. def test_cancellerThatCallbacks(self):
  1547. """
  1548. Test a canceller which calls its deferred.
  1549. """
  1550. def cancel(d):
  1551. self.cancellerCallCount += 1
  1552. d.callback('hello!')
  1553. d = defer.Deferred(canceller=cancel)
  1554. d.addCallbacks(self._callback, self._errback)
  1555. d.cancel()
  1556. self.assertEqual(self.cancellerCallCount, 1)
  1557. self.assertEqual(self.callbackResults, 'hello!')
  1558. self.assertIsNone(self.errbackResults)
  1559. def test_cancelNestedDeferred(self):
  1560. """
  1561. Verify that a Deferred, a, which is waiting on another Deferred, b,
  1562. returned from one of its callbacks, will propagate
  1563. L{defer.CancelledError} when a is cancelled.
  1564. """
  1565. def innerCancel(d):
  1566. self.cancellerCallCount += 1
  1567. def cancel(d):
  1568. self.assertTrue(False)
  1569. b = defer.Deferred(canceller=innerCancel)
  1570. a = defer.Deferred(canceller=cancel)
  1571. a.callback(None)
  1572. a.addCallback(lambda data: b)
  1573. a.cancel()
  1574. a.addCallbacks(self._callback, self._errback)
  1575. # The cancel count should be one (the cancellation done by B)
  1576. self.assertEqual(self.cancellerCallCount, 1)
  1577. # B's canceller didn't errback, so defer.py will have called errback
  1578. # with a CancelledError.
  1579. self.assertEqual(self.errbackResults.type, defer.CancelledError)
  1580. class LogTests(unittest.SynchronousTestCase):
  1581. """
  1582. Test logging of unhandled errors.
  1583. """
  1584. def setUp(self):
  1585. """
  1586. Add a custom observer to observer logging.
  1587. """
  1588. self.c = []
  1589. log.addObserver(self.c.append)
  1590. def tearDown(self):
  1591. """
  1592. Remove the observer.
  1593. """
  1594. log.removeObserver(self.c.append)
  1595. def _loggedErrors(self):
  1596. return [e for e in self.c if e["isError"]]
  1597. def _check(self):
  1598. """
  1599. Check the output of the log observer to see if the error is present.
  1600. """
  1601. c2 = self._loggedErrors()
  1602. self.assertEqual(len(c2), 2)
  1603. c2[1]["failure"].trap(ZeroDivisionError)
  1604. self.flushLoggedErrors(ZeroDivisionError)
  1605. def test_errorLog(self):
  1606. """
  1607. Verify that when a L{Deferred} with no references to it is fired,
  1608. and its final result (the one not handled by any callback) is an
  1609. exception, that exception will be logged immediately.
  1610. """
  1611. defer.Deferred().addCallback(lambda x: 1 // 0).callback(1)
  1612. gc.collect()
  1613. self._check()
  1614. def test_errorLogWithInnerFrameRef(self):
  1615. """
  1616. Same as L{test_errorLog}, but with an inner frame.
  1617. """
  1618. def _subErrorLogWithInnerFrameRef():
  1619. d = defer.Deferred()
  1620. d.addCallback(lambda x: 1 // 0)
  1621. d.callback(1)
  1622. _subErrorLogWithInnerFrameRef()
  1623. gc.collect()
  1624. self._check()
  1625. def test_errorLogWithInnerFrameCycle(self):
  1626. """
  1627. Same as L{test_errorLogWithInnerFrameRef}, plus create a cycle.
  1628. """
  1629. def _subErrorLogWithInnerFrameCycle():
  1630. d = defer.Deferred()
  1631. d.addCallback(lambda x, d=d: 1 // 0)
  1632. d._d = d
  1633. d.callback(1)
  1634. _subErrorLogWithInnerFrameCycle()
  1635. gc.collect()
  1636. self._check()
  1637. def test_errorLogNoRepr(self):
  1638. """
  1639. Verify that when a L{Deferred} with no references to it is fired,
  1640. the logged message does not contain a repr of the failure object.
  1641. """
  1642. defer.Deferred().addCallback(lambda x: 1 // 0).callback(1)
  1643. gc.collect()
  1644. self._check()
  1645. self.assertEqual(2, len(self.c))
  1646. msg = log.textFromEventDict(self.c[-1])
  1647. expected = "Unhandled Error\nTraceback "
  1648. self.assertTrue(msg.startswith(expected),
  1649. "Expected message starting with: {0!r}".
  1650. format(expected))
  1651. def test_errorLogDebugInfo(self):
  1652. """
  1653. Verify that when a L{Deferred} with no references to it is fired,
  1654. the logged message includes debug info if debugging on the deferred
  1655. is enabled.
  1656. """
  1657. def doit():
  1658. d = defer.Deferred()
  1659. d.debug = True
  1660. d.addCallback(lambda x: 1 // 0)
  1661. d.callback(1)
  1662. doit()
  1663. gc.collect()
  1664. self._check()
  1665. self.assertEqual(2, len(self.c))
  1666. msg = log.textFromEventDict(self.c[-1])
  1667. expected = "(debug: I"
  1668. self.assertTrue(msg.startswith(expected),
  1669. "Expected message starting with: {0!r}".
  1670. format(expected))
  1671. def test_chainedErrorCleanup(self):
  1672. """
  1673. If one Deferred with an error result is returned from a callback on
  1674. another Deferred, when the first Deferred is garbage collected it does
  1675. not log its error.
  1676. """
  1677. d = defer.Deferred()
  1678. d.addCallback(lambda ign: defer.fail(RuntimeError("zoop")))
  1679. d.callback(None)
  1680. # Sanity check - this isn't too interesting, but we do want the original
  1681. # Deferred to have gotten the failure.
  1682. results = []
  1683. errors = []
  1684. d.addCallbacks(results.append, errors.append)
  1685. self.assertEqual(results, [])
  1686. self.assertEqual(len(errors), 1)
  1687. errors[0].trap(Exception)
  1688. # Get rid of any references we might have to the inner Deferred (none of
  1689. # these should really refer to it, but we're just being safe).
  1690. del results, errors, d
  1691. # Force a collection cycle so that there's a chance for an error to be
  1692. # logged, if it's going to be logged.
  1693. gc.collect()
  1694. # And make sure it is not.
  1695. self.assertEqual(self._loggedErrors(), [])
  1696. def test_errorClearedByChaining(self):
  1697. """
  1698. If a Deferred with a failure result has an errback which chains it to
  1699. another Deferred, the initial failure is cleared by the errback so it is
  1700. not logged.
  1701. """
  1702. # Start off with a Deferred with a failure for a result
  1703. bad = defer.fail(Exception("oh no"))
  1704. good = defer.Deferred()
  1705. # Give it a callback that chains it to another Deferred
  1706. bad.addErrback(lambda ignored: good)
  1707. # That's all, clean it up. No Deferred here still has a failure result,
  1708. # so nothing should be logged.
  1709. good = bad = None
  1710. gc.collect()
  1711. self.assertEqual(self._loggedErrors(), [])
  1712. class DeferredListEmptyTests(unittest.SynchronousTestCase):
  1713. def setUp(self):
  1714. self.callbackRan = 0
  1715. def testDeferredListEmpty(self):
  1716. """Testing empty DeferredList."""
  1717. dl = defer.DeferredList([])
  1718. dl.addCallback(self.cb_empty)
  1719. def cb_empty(self, res):
  1720. self.callbackRan = 1
  1721. self.assertEqual([], res)
  1722. def tearDown(self):
  1723. self.assertTrue(self.callbackRan, "Callback was never run.")
  1724. class OtherPrimitivesTests(unittest.SynchronousTestCase, ImmediateFailureMixin):
  1725. def _incr(self, result):
  1726. self.counter += 1
  1727. def setUp(self):
  1728. self.counter = 0
  1729. def testLock(self):
  1730. lock = defer.DeferredLock()
  1731. lock.acquire().addCallback(self._incr)
  1732. self.assertTrue(lock.locked)
  1733. self.assertEqual(self.counter, 1)
  1734. lock.acquire().addCallback(self._incr)
  1735. self.assertTrue(lock.locked)
  1736. self.assertEqual(self.counter, 1)
  1737. lock.release()
  1738. self.assertTrue(lock.locked)
  1739. self.assertEqual(self.counter, 2)
  1740. lock.release()
  1741. self.assertFalse(lock.locked)
  1742. self.assertEqual(self.counter, 2)
  1743. self.assertRaises(TypeError, lock.run)
  1744. firstUnique = object()
  1745. secondUnique = object()
  1746. controlDeferred = defer.Deferred()
  1747. def helper(self, b):
  1748. self.b = b
  1749. return controlDeferred
  1750. resultDeferred = lock.run(helper, self=self, b=firstUnique)
  1751. self.assertTrue(lock.locked)
  1752. self.assertEqual(self.b, firstUnique)
  1753. resultDeferred.addCallback(lambda x: setattr(self, 'result', x))
  1754. lock.acquire().addCallback(self._incr)
  1755. self.assertTrue(lock.locked)
  1756. self.assertEqual(self.counter, 2)
  1757. controlDeferred.callback(secondUnique)
  1758. self.assertEqual(self.result, secondUnique)
  1759. self.assertTrue(lock.locked)
  1760. self.assertEqual(self.counter, 3)
  1761. d = lock.acquire().addBoth(lambda x: setattr(self, 'result', x))
  1762. d.cancel()
  1763. self.assertEqual(self.result.type, defer.CancelledError)
  1764. lock.release()
  1765. self.assertFalse(lock.locked)
  1766. def test_cancelLockAfterAcquired(self):
  1767. """
  1768. When canceling a L{Deferred} from a L{DeferredLock} that already
  1769. has the lock, the cancel should have no effect.
  1770. """
  1771. def _failOnErrback(_):
  1772. self.fail("Unexpected errback call!")
  1773. lock = defer.DeferredLock()
  1774. d = lock.acquire()
  1775. d.addErrback(_failOnErrback)
  1776. d.cancel()
  1777. def test_cancelLockBeforeAcquired(self):
  1778. """
  1779. When canceling a L{Deferred} from a L{DeferredLock} that does not
  1780. yet have the lock (i.e., the L{Deferred} has not fired), the cancel
  1781. should cause a L{defer.CancelledError} failure.
  1782. """
  1783. lock = defer.DeferredLock()
  1784. lock.acquire()
  1785. d = lock.acquire()
  1786. d.cancel()
  1787. self.assertImmediateFailure(d, defer.CancelledError)
  1788. def testSemaphore(self):
  1789. N = 13
  1790. sem = defer.DeferredSemaphore(N)
  1791. controlDeferred = defer.Deferred()
  1792. def helper(self, arg):
  1793. self.arg = arg
  1794. return controlDeferred
  1795. results = []
  1796. uniqueObject = object()
  1797. resultDeferred = sem.run(helper, self=self, arg=uniqueObject)
  1798. resultDeferred.addCallback(results.append)
  1799. resultDeferred.addCallback(self._incr)
  1800. self.assertEqual(results, [])
  1801. self.assertEqual(self.arg, uniqueObject)
  1802. controlDeferred.callback(None)
  1803. self.assertIsNone(results.pop())
  1804. self.assertEqual(self.counter, 1)
  1805. self.counter = 0
  1806. for i in range(1, 1 + N):
  1807. sem.acquire().addCallback(self._incr)
  1808. self.assertEqual(self.counter, i)
  1809. success = []
  1810. def fail(r):
  1811. success.append(False)
  1812. def succeed(r):
  1813. success.append(True)
  1814. d = sem.acquire().addCallbacks(fail, succeed)
  1815. d.cancel()
  1816. self.assertEqual(success, [True])
  1817. sem.acquire().addCallback(self._incr)
  1818. self.assertEqual(self.counter, N)
  1819. sem.release()
  1820. self.assertEqual(self.counter, N + 1)
  1821. for i in range(1, 1 + N):
  1822. sem.release()
  1823. self.assertEqual(self.counter, N + 1)
  1824. def test_semaphoreInvalidTokens(self):
  1825. """
  1826. If the token count passed to L{DeferredSemaphore} is less than one
  1827. then L{ValueError} is raised.
  1828. """
  1829. self.assertRaises(ValueError, defer.DeferredSemaphore, 0)
  1830. self.assertRaises(ValueError, defer.DeferredSemaphore, -1)
  1831. def test_cancelSemaphoreAfterAcquired(self):
  1832. """
  1833. When canceling a L{Deferred} from a L{DeferredSemaphore} that
  1834. already has the semaphore, the cancel should have no effect.
  1835. """
  1836. def _failOnErrback(_):
  1837. self.fail("Unexpected errback call!")
  1838. sem = defer.DeferredSemaphore(1)
  1839. d = sem.acquire()
  1840. d.addErrback(_failOnErrback)
  1841. d.cancel()
  1842. def test_cancelSemaphoreBeforeAcquired(self):
  1843. """
  1844. When canceling a L{Deferred} from a L{DeferredSemaphore} that does
  1845. not yet have the semaphore (i.e., the L{Deferred} has not fired),
  1846. the cancel should cause a L{defer.CancelledError} failure.
  1847. """
  1848. sem = defer.DeferredSemaphore(1)
  1849. sem.acquire()
  1850. d = sem.acquire()
  1851. d.cancel()
  1852. self.assertImmediateFailure(d, defer.CancelledError)
  1853. def testQueue(self):
  1854. N, M = 2, 2
  1855. queue = defer.DeferredQueue(N, M)
  1856. gotten = []
  1857. for i in range(M):
  1858. queue.get().addCallback(gotten.append)
  1859. self.assertRaises(defer.QueueUnderflow, queue.get)
  1860. for i in range(M):
  1861. queue.put(i)
  1862. self.assertEqual(gotten, list(range(i + 1)))
  1863. for i in range(N):
  1864. queue.put(N + i)
  1865. self.assertEqual(gotten, list(range(M)))
  1866. self.assertRaises(defer.QueueOverflow, queue.put, None)
  1867. gotten = []
  1868. for i in range(N):
  1869. queue.get().addCallback(gotten.append)
  1870. self.assertEqual(gotten, list(range(N, N + i + 1)))
  1871. queue = defer.DeferredQueue()
  1872. gotten = []
  1873. for i in range(N):
  1874. queue.get().addCallback(gotten.append)
  1875. for i in range(N):
  1876. queue.put(i)
  1877. self.assertEqual(gotten, list(range(N)))
  1878. queue = defer.DeferredQueue(size=0)
  1879. self.assertRaises(defer.QueueOverflow, queue.put, None)
  1880. queue = defer.DeferredQueue(backlog=0)
  1881. self.assertRaises(defer.QueueUnderflow, queue.get)
  1882. def test_cancelQueueAfterSynchronousGet(self):
  1883. """
  1884. When canceling a L{Deferred} from a L{DeferredQueue} that already has
  1885. a result, the cancel should have no effect.
  1886. """
  1887. def _failOnErrback(_):
  1888. self.fail("Unexpected errback call!")
  1889. queue = defer.DeferredQueue()
  1890. d = queue.get()
  1891. d.addErrback(_failOnErrback)
  1892. queue.put(None)
  1893. d.cancel()
  1894. def test_cancelQueueAfterGet(self):
  1895. """
  1896. When canceling a L{Deferred} from a L{DeferredQueue} that does not
  1897. have a result (i.e., the L{Deferred} has not fired), the cancel
  1898. causes a L{defer.CancelledError} failure. If the queue has a result
  1899. later on, it doesn't try to fire the deferred.
  1900. """
  1901. queue = defer.DeferredQueue()
  1902. d = queue.get()
  1903. d.cancel()
  1904. self.assertImmediateFailure(d, defer.CancelledError)
  1905. def cb(ignore):
  1906. # If the deferred is still linked with the deferred queue, it will
  1907. # fail with an AlreadyCalledError
  1908. queue.put(None)
  1909. return queue.get().addCallback(self.assertIs, None)
  1910. d.addCallback(cb)
  1911. done = []
  1912. d.addCallback(done.append)
  1913. self.assertEqual(len(done), 1)
  1914. class DeferredFilesystemLockTests(unittest.TestCase):
  1915. """
  1916. Test the behavior of L{DeferredFilesystemLock}
  1917. """
  1918. def setUp(self):
  1919. self.clock = Clock()
  1920. self.lock = defer.DeferredFilesystemLock(self.mktemp(),
  1921. scheduler=self.clock)
  1922. def test_waitUntilLockedWithNoLock(self):
  1923. """
  1924. Test that the lock can be acquired when no lock is held
  1925. """
  1926. d = self.lock.deferUntilLocked(timeout=1)
  1927. return d
  1928. def test_waitUntilLockedWithTimeoutLocked(self):
  1929. """
  1930. Test that the lock can not be acquired when the lock is held
  1931. for longer than the timeout.
  1932. """
  1933. self.assertTrue(self.lock.lock())
  1934. d = self.lock.deferUntilLocked(timeout=5.5)
  1935. self.assertFailure(d, defer.TimeoutError)
  1936. self.clock.pump([1] * 10)
  1937. return d
  1938. def test_waitUntilLockedWithTimeoutUnlocked(self):
  1939. """
  1940. Test that a lock can be acquired while a lock is held
  1941. but the lock is unlocked before our timeout.
  1942. """
  1943. def onTimeout(f):
  1944. f.trap(defer.TimeoutError)
  1945. self.fail("Should not have timed out")
  1946. self.assertTrue(self.lock.lock())
  1947. self.clock.callLater(1, self.lock.unlock)
  1948. d = self.lock.deferUntilLocked(timeout=10)
  1949. d.addErrback(onTimeout)
  1950. self.clock.pump([1] * 10)
  1951. return d
  1952. def test_defaultScheduler(self):
  1953. """
  1954. Test that the default scheduler is set up properly.
  1955. """
  1956. lock = defer.DeferredFilesystemLock(self.mktemp())
  1957. self.assertEqual(lock._scheduler, reactor)
  1958. def test_concurrentUsage(self):
  1959. """
  1960. Test that an appropriate exception is raised when attempting
  1961. to use deferUntilLocked concurrently.
  1962. """
  1963. self.lock.lock()
  1964. self.clock.callLater(1, self.lock.unlock)
  1965. d = self.lock.deferUntilLocked()
  1966. d2 = self.lock.deferUntilLocked()
  1967. self.assertFailure(d2, defer.AlreadyTryingToLockError)
  1968. self.clock.advance(1)
  1969. return d
  1970. def test_multipleUsages(self):
  1971. """
  1972. Test that a DeferredFilesystemLock can be used multiple times
  1973. """
  1974. def lockAquired(ign):
  1975. self.lock.unlock()
  1976. d = self.lock.deferUntilLocked()
  1977. return d
  1978. self.lock.lock()
  1979. self.clock.callLater(1, self.lock.unlock)
  1980. d = self.lock.deferUntilLocked()
  1981. d.addCallback(lockAquired)
  1982. self.clock.advance(1)
  1983. return d
  1984. def test_cancelDeferUntilLocked(self):
  1985. """
  1986. When cancelling a L{defer.Deferred} returned by
  1987. L{defer.DeferredFilesystemLock.deferUntilLocked}, the
  1988. L{defer.DeferredFilesystemLock._tryLockCall} is cancelled.
  1989. """
  1990. self.lock.lock()
  1991. deferred = self.lock.deferUntilLocked()
  1992. tryLockCall = self.lock._tryLockCall
  1993. deferred.cancel()
  1994. self.assertFalse(tryLockCall.active())
  1995. self.assertIsNone(self.lock._tryLockCall)
  1996. self.failureResultOf(deferred, defer.CancelledError)
  1997. def test_cancelDeferUntilLockedWithTimeout(self):
  1998. """
  1999. When cancel a L{defer.Deferred} returned by
  2000. L{defer.DeferredFilesystemLock.deferUntilLocked}, if the timeout is
  2001. set, the timeout call will be cancelled.
  2002. """
  2003. self.lock.lock()
  2004. deferred = self.lock.deferUntilLocked(timeout=1)
  2005. timeoutCall = self.lock._timeoutCall
  2006. deferred.cancel()
  2007. self.assertFalse(timeoutCall.active())
  2008. self.assertIsNone(self.lock._timeoutCall)
  2009. self.failureResultOf(deferred, defer.CancelledError)
  2010. def _overrideFunc(v, t):
  2011. """
  2012. Private function to be used to pass as an alternate onTimeoutCancel value
  2013. to timeoutDeferred
  2014. """
  2015. return "OVERRIDDEN"
  2016. class DeferredAddTimeoutTests(unittest.SynchronousTestCase):
  2017. """
  2018. Tests for the function L{Deferred.addTimeout}
  2019. """
  2020. def test_timeoutChainable(self):
  2021. """
  2022. L{defer.Deferred.addTimeout} returns its own L{defer.Deferred} so it
  2023. can be called in a callback chain.
  2024. """
  2025. d = defer.Deferred().addTimeout(5, Clock()).addCallback(lambda _: "done")
  2026. d.callback(None)
  2027. self.assertEqual("done", self.successResultOf(d))
  2028. def test_successResultBeforeTimeout(self):
  2029. """
  2030. The L{defer.Deferred} callbacks with the result if it succeeds before
  2031. the timeout. No cancellation happens after the callback either,
  2032. which could also cancel inner deferreds.
  2033. """
  2034. clock = Clock()
  2035. d = defer.Deferred()
  2036. d.addTimeout(10, clock)
  2037. # addTimeout is added first so that if d is timed out, d would be
  2038. # canceled before innerDeferred gets returned from an callback on d
  2039. innerDeferred = defer.Deferred()
  2040. dCallbacked = [None]
  2041. def onCallback(results):
  2042. dCallbacked[0] = results
  2043. return innerDeferred
  2044. d.addCallback(onCallback)
  2045. d.callback("results")
  2046. # d is callbacked immediately, before innerDeferred is returned from
  2047. # the callback on d
  2048. self.assertIsNot(None, dCallbacked[0])
  2049. self.assertEqual(dCallbacked[0], "results")
  2050. # The timeout never happens - if it did, d would have been cancelled,
  2051. # which would cancel innerDeferred too.
  2052. clock.advance(15)
  2053. self.assertNoResult(innerDeferred)
  2054. def test_successResultBeforeTimeoutCustom(self):
  2055. """
  2056. The L{defer.Deferred} callbacks with the result if it succeeds before
  2057. the timeout, even if a custom C{onTimeoutCancel} function is provided.
  2058. No cancellation happens after the callback either, which could also
  2059. cancel inner deferreds.
  2060. """
  2061. clock = Clock()
  2062. d = defer.Deferred()
  2063. d.addTimeout(10, clock, onTimeoutCancel=_overrideFunc)
  2064. # addTimeout is added first so that if d is timed out, d would be
  2065. # canceled before innerDeferred gets returned from an callback on d
  2066. innerDeferred = defer.Deferred()
  2067. dCallbacked = [None]
  2068. def onCallback(results):
  2069. dCallbacked[0] = results
  2070. return innerDeferred
  2071. d.addCallback(onCallback)
  2072. d.callback("results")
  2073. # d is callbacked immediately, before innerDeferred is returned from
  2074. # the callback on d
  2075. self.assertIsNot(None, dCallbacked[0])
  2076. self.assertEqual(dCallbacked[0], "results")
  2077. # The timeout never happens - if it did, d would have been cancelled,
  2078. # which would cancel innerDeferred too
  2079. clock.advance(15)
  2080. self.assertNoResult(innerDeferred)
  2081. def test_failureBeforeTimeout(self):
  2082. """
  2083. The L{defer.Deferred} errbacks with the failure if it fails before the
  2084. timeout. No cancellation happens after the errback either, which
  2085. could also cancel inner deferreds.
  2086. """
  2087. clock = Clock()
  2088. d = defer.Deferred()
  2089. d.addTimeout(10, clock)
  2090. # addTimeout is added first so that if d is timed out, d would be
  2091. # canceled before innerDeferred gets returned from an errback on d
  2092. innerDeferred = defer.Deferred()
  2093. dErrbacked = [None]
  2094. error = ValueError("fail")
  2095. def onErrback(f):
  2096. dErrbacked[0] = f
  2097. return innerDeferred
  2098. d.addErrback(onErrback)
  2099. d.errback(error)
  2100. # d is errbacked immediately, before innerDeferred is returned from the
  2101. # errback on d
  2102. self.assertIsInstance(dErrbacked[0], failure.Failure)
  2103. self.assertIs(dErrbacked[0].value, error)
  2104. # The timeout never happens - if it did, d would have been cancelled,
  2105. # which would cancel innerDeferred too
  2106. clock.advance(15)
  2107. self.assertNoResult(innerDeferred)
  2108. def test_failureBeforeTimeoutCustom(self):
  2109. """
  2110. The L{defer.Deferred} errbacks with the failure if it fails before the
  2111. timeout, even if using a custom C{onTimeoutCancel} function.
  2112. No cancellation happens after the errback either, which could also
  2113. cancel inner deferreds.
  2114. """
  2115. clock = Clock()
  2116. d = defer.Deferred()
  2117. d.addTimeout(10, clock, onTimeoutCancel=_overrideFunc)
  2118. # addTimeout is added first so that if d is timed out, d would be
  2119. # canceled before innerDeferred gets returned from an errback on d
  2120. innerDeferred = defer.Deferred()
  2121. dErrbacked = [None]
  2122. error = ValueError("fail")
  2123. def onErrback(f):
  2124. dErrbacked[0] = f
  2125. return innerDeferred
  2126. d.addErrback(onErrback)
  2127. d.errback(error)
  2128. # d is errbacked immediately, before innerDeferred is returned from the
  2129. # errback on d
  2130. self.assertIsInstance(dErrbacked[0], failure.Failure)
  2131. self.assertIs(dErrbacked[0].value, error)
  2132. # The timeout never happens - if it did, d would have been cancelled,
  2133. # which would cancel innerDeferred too
  2134. clock.advance(15)
  2135. self.assertNoResult(innerDeferred)
  2136. def test_timedOut(self):
  2137. """
  2138. The L{defer.Deferred} by default errbacks with a L{defer.TimeoutError}
  2139. if it times out before callbacking or errbacking.
  2140. """
  2141. clock = Clock()
  2142. d = defer.Deferred()
  2143. d.addTimeout(10, clock)
  2144. self.assertNoResult(d)
  2145. clock.advance(15)
  2146. self.failureResultOf(d, defer.TimeoutError)
  2147. def test_timedOutCustom(self):
  2148. """
  2149. If a custom C{onTimeoutCancel] function is provided, the
  2150. L{defer.Deferred} returns the custom function's return value if the
  2151. L{defer.Deferred} times out before callbacking or errbacking.
  2152. The custom C{onTimeoutCancel} function can return a result instead of
  2153. a failure.
  2154. """
  2155. clock = Clock()
  2156. d = defer.Deferred()
  2157. d.addTimeout(10, clock, onTimeoutCancel=_overrideFunc)
  2158. self.assertNoResult(d)
  2159. clock.advance(15)
  2160. self.assertEqual("OVERRIDDEN", self.successResultOf(d))
  2161. def test_timedOutProvidedCancelSuccess(self):
  2162. """
  2163. If a cancellation function is provided when the L{defer.Deferred} is
  2164. initialized, the L{defer.Deferred} returns the cancellation value's
  2165. non-failure return value when the L{defer.Deferred} times out.
  2166. """
  2167. clock = Clock()
  2168. d = defer.Deferred(lambda c: c.callback('I was cancelled!'))
  2169. d.addTimeout(10, clock)
  2170. self.assertNoResult(d)
  2171. clock.advance(15)
  2172. self.assertEqual(self.successResultOf(d), 'I was cancelled!')
  2173. def test_timedOutProvidedCancelFailure(self):
  2174. """
  2175. If a cancellation function is provided when the L{defer.Deferred} is
  2176. initialized, the L{defer.Deferred} returns the cancellation value's
  2177. non-L{CanceledError} failure when the L{defer.Deferred} times out.
  2178. """
  2179. clock = Clock()
  2180. error = ValueError('what!')
  2181. d = defer.Deferred(lambda c: c.errback(error))
  2182. d.addTimeout(10, clock)
  2183. self.assertNoResult(d)
  2184. clock.advance(15)
  2185. f = self.failureResultOf(d, ValueError)
  2186. self.assertIs(f.value, error)
  2187. def test_cancelBeforeTimeout(self):
  2188. """
  2189. If the L{defer.Deferred} is manually cancelled before the timeout, it
  2190. is not re-cancelled (no L{AlreadyCancelled} error, and also no
  2191. canceling of inner deferreds), and the default C{onTimeoutCancel}
  2192. function is not called, preserving the original L{CancelledError}.
  2193. """
  2194. clock = Clock()
  2195. d = defer.Deferred()
  2196. d.addTimeout(10, clock)
  2197. # addTimeout is added first so that if d is timed out, d would be
  2198. # canceled before innerDeferred gets returned from an errback on d
  2199. innerDeferred = defer.Deferred()
  2200. dCanceled = [None]
  2201. def onErrback(f):
  2202. dCanceled[0] = f
  2203. return innerDeferred
  2204. d.addErrback(onErrback)
  2205. d.cancel()
  2206. # d is cancelled immediately, before innerDeferred is returned from the
  2207. # errback on d
  2208. self.assertIsInstance(dCanceled[0], failure.Failure)
  2209. self.assertIs(dCanceled[0].type, defer.CancelledError)
  2210. # The timeout never happens - if it did, d would have been cancelled
  2211. # again, which would cancel innerDeferred too
  2212. clock.advance(15)
  2213. self.assertNoResult(innerDeferred)
  2214. def test_cancelBeforeTimeoutCustom(self):
  2215. """
  2216. If the L{defer.Deferred} is manually cancelled before the timeout, it
  2217. is not re-cancelled (no L{AlreadyCancelled} error, and also no
  2218. canceling of inner deferreds), and the custom C{onTimeoutCancel}
  2219. function is not called, preserving the original L{CancelledError}.
  2220. """
  2221. clock = Clock()
  2222. d = defer.Deferred()
  2223. d.addTimeout(10, clock, onTimeoutCancel=_overrideFunc)
  2224. # addTimeout is added first so that if d is timed out, d would be
  2225. # canceled before innerDeferred gets returned from an errback on d
  2226. innerDeferred = defer.Deferred()
  2227. dCanceled = [None]
  2228. def onErrback(f):
  2229. dCanceled[0] = f
  2230. return innerDeferred
  2231. d.addErrback(onErrback)
  2232. d.cancel()
  2233. # d is cancelled immediately, before innerDeferred is returned from the
  2234. # errback on d
  2235. self.assertIsInstance(dCanceled[0], failure.Failure)
  2236. self.assertIs(dCanceled[0].type, defer.CancelledError)
  2237. # The timeout never happens - if it did, d would have been cancelled
  2238. # again, which would cancel innerDeferred too
  2239. clock.advance(15)
  2240. self.assertNoResult(innerDeferred)
  2241. def test_providedCancelCalledBeforeTimeoutCustom(self):
  2242. """
  2243. A custom translation function can handle a L{defer.Deferred} with a
  2244. custom cancellation function.
  2245. """
  2246. clock = Clock()
  2247. d = defer.Deferred(lambda c: c.errback(ValueError('what!')))
  2248. d.addTimeout(10, clock, onTimeoutCancel=_overrideFunc)
  2249. self.assertNoResult(d)
  2250. clock.advance(15)
  2251. self.assertEqual("OVERRIDDEN", self.successResultOf(d))
  2252. def test_errbackAddedBeforeTimeout(self):
  2253. """
  2254. An errback added before a timeout is added errbacks with a
  2255. L{defer.CancelledError} when the timeout fires. If the
  2256. errback returns the L{defer.CancelledError}, it is translated
  2257. to a L{defer.TimeoutError} by the timeout implementation.
  2258. """
  2259. clock = Clock()
  2260. d = defer.Deferred()
  2261. dErrbacked = [None]
  2262. def errback(f):
  2263. dErrbacked[0] = f
  2264. return f
  2265. d.addErrback(errback)
  2266. d.addTimeout(10, clock)
  2267. clock.advance(15)
  2268. self.assertIsInstance(dErrbacked[0], failure.Failure)
  2269. self.assertIsInstance(dErrbacked[0].value, defer.CancelledError)
  2270. self.failureResultOf(d, defer.TimeoutError)
  2271. def test_errbackAddedBeforeTimeoutSuppressesCancellation(self):
  2272. """
  2273. An errback added before a timeout is added errbacks with a
  2274. L{defer.CancelledError} when the timeout fires. If the
  2275. errback suppresses the L{defer.CancelledError}, the deferred
  2276. successfully completes.
  2277. """
  2278. clock = Clock()
  2279. d = defer.Deferred()
  2280. dErrbacked = [None]
  2281. def errback(f):
  2282. dErrbacked[0] = f
  2283. f.trap(defer.CancelledError)
  2284. d.addErrback(errback)
  2285. d.addTimeout(10, clock)
  2286. clock.advance(15)
  2287. self.assertIsInstance(dErrbacked[0], failure.Failure)
  2288. self.assertIsInstance(dErrbacked[0].value, defer.CancelledError)
  2289. self.successResultOf(d)
  2290. def test_errbackAddedBeforeTimeoutCustom(self):
  2291. """
  2292. An errback added before a timeout is added with a custom
  2293. timeout function errbacks with a L{defer.CancelledError} when
  2294. the timeout fires. The timeout function runs if the errback
  2295. returns the L{defer.CancelledError}.
  2296. """
  2297. clock = Clock()
  2298. d = defer.Deferred()
  2299. dErrbacked = [None]
  2300. def errback(f):
  2301. dErrbacked[0] = f
  2302. return f
  2303. d.addErrback(errback)
  2304. d.addTimeout(10, clock, _overrideFunc)
  2305. clock.advance(15)
  2306. self.assertIsInstance(dErrbacked[0], failure.Failure)
  2307. self.assertIsInstance(dErrbacked[0].value, defer.CancelledError)
  2308. self.assertEqual("OVERRIDDEN", self.successResultOf(d))
  2309. def test_errbackAddedBeforeTimeoutSuppressesCancellationCustom(self):
  2310. """
  2311. An errback added before a timeout is added with a custom
  2312. timeout function errbacks with a L{defer.CancelledError} when
  2313. the timeout fires. The timeout function runs if the errback
  2314. suppresses the L{defer.CancelledError}.
  2315. """
  2316. clock = Clock()
  2317. d = defer.Deferred()
  2318. dErrbacked = [None]
  2319. def errback(f):
  2320. dErrbacked[0] = f
  2321. d.addErrback(errback)
  2322. d.addTimeout(10, clock, _overrideFunc)
  2323. clock.advance(15)
  2324. self.assertIsInstance(dErrbacked[0], failure.Failure)
  2325. self.assertIsInstance(dErrbacked[0].value, defer.CancelledError)
  2326. self.assertEqual("OVERRIDDEN", self.successResultOf(d))
  2327. def test_callbackAddedToCancelerBeforeTimeout(self):
  2328. """
  2329. Given a deferred with a cancellation function that resumes the
  2330. callback chain, a callback that is added to the deferred
  2331. before a timeout is added to runs when the timeout fires. The
  2332. deferred completes successfully, without a
  2333. L{defer.TimeoutError}.
  2334. """
  2335. clock = Clock()
  2336. success = "success"
  2337. d = defer.Deferred(lambda d: d.callback(success))
  2338. dCallbacked = [None]
  2339. def callback(value):
  2340. dCallbacked[0] = value
  2341. return value
  2342. d.addCallback(callback)
  2343. d.addTimeout(10, clock)
  2344. clock.advance(15)
  2345. self.assertEqual(dCallbacked[0], success)
  2346. self.assertIs(success, self.successResultOf(d))
  2347. def test_callbackAddedToCancelerBeforeTimeoutCustom(self):
  2348. """
  2349. Given a deferred with a cancellation function that resumes the
  2350. callback chain, a callback that is added to the deferred
  2351. before a timeout is added to runs when the timeout fires. The
  2352. deferred completes successfully, without a
  2353. L{defer.TimeoutError}. The timeout's custom timeout function
  2354. also runs.
  2355. """
  2356. clock = Clock()
  2357. success = "success"
  2358. d = defer.Deferred(lambda d: d.callback(success))
  2359. dCallbacked = [None]
  2360. def callback(value):
  2361. dCallbacked[0] = value
  2362. return value
  2363. d.addCallback(callback)
  2364. d.addTimeout(10, clock, onTimeoutCancel=_overrideFunc)
  2365. clock.advance(15)
  2366. self.assertEqual(dCallbacked[0], success)
  2367. self.assertEqual("OVERRIDDEN", self.successResultOf(d))
  2368. class EnsureDeferredTests(unittest.TestCase):
  2369. """
  2370. Tests for L{twisted.internet.defer.ensureDeferred}.
  2371. """
  2372. def test_passesThroughDeferreds(self):
  2373. """
  2374. L{defer.ensureDeferred} will pass through a Deferred unchanged.
  2375. """
  2376. d = defer.Deferred()
  2377. d2 = defer.ensureDeferred(d)
  2378. self.assertIs(d, d2)
  2379. def test_willNotAllowNonDeferredOrCoroutine(self):
  2380. """
  2381. Passing L{defer.ensureDeferred} a non-coroutine and a non-Deferred will
  2382. raise a L{ValueError}.
  2383. """
  2384. with self.assertRaises(ValueError):
  2385. defer.ensureDeferred("something")
  2386. class TimeoutErrorTests(unittest.TestCase, ImmediateFailureMixin):
  2387. """
  2388. L{twisted.internet.defer} timeout code.
  2389. """
  2390. def test_deprecatedTimeout(self):
  2391. """
  2392. L{twisted.internet.defer.timeout} is deprecated.
  2393. """
  2394. deferred = defer.Deferred()
  2395. defer.timeout(deferred)
  2396. self.assertFailure(deferred, defer.TimeoutError)
  2397. warningsShown = self.flushWarnings([self.test_deprecatedTimeout])
  2398. self.assertEqual(len(warningsShown), 1)
  2399. self.assertIs(warningsShown[0]['category'], DeprecationWarning)
  2400. self.assertEqual(
  2401. warningsShown[0]['message'],
  2402. 'twisted.internet.defer.timeout was deprecated in Twisted 17.1.0;'
  2403. ' please use twisted.internet.defer.Deferred.addTimeout instead')
  2404. def callAllSoonCalls(loop):
  2405. """
  2406. Tickle an asyncio event loop to call all of the things scheduled with
  2407. call_soon, inasmuch as this can be done via the public API.
  2408. @param loop: The asyncio event loop to flush the previously-called
  2409. C{call_soon} entries from.
  2410. """
  2411. loop.call_soon(loop.stop)
  2412. loop.run_forever()
  2413. class DeferredFutureAdapterTests(unittest.TestCase):
  2414. skip = asyncSkip
  2415. def test_asFuture(self):
  2416. """
  2417. L{defer.Deferred.asFuture} returns a L{asyncio.Future} which fires when
  2418. the given L{defer.Deferred} does.
  2419. """
  2420. d = defer.Deferred()
  2421. loop = new_event_loop()
  2422. aFuture = d.asFuture(loop)
  2423. self.assertEqual(aFuture.done(), False)
  2424. d.callback(13)
  2425. callAllSoonCalls(loop)
  2426. self.assertEqual(self.successResultOf(d), None)
  2427. self.assertEqual(aFuture.result(), 13)
  2428. def test_asFutureCancelFuture(self):
  2429. """
  2430. L{defer.Deferred.asFuture} returns a L{asyncio.Future} which, when
  2431. cancelled, will cancel the original L{defer.Deferred}.
  2432. """
  2433. def canceler(dprime):
  2434. canceler.called = True
  2435. canceler.called = False
  2436. d = defer.Deferred(canceler)
  2437. loop = new_event_loop()
  2438. aFuture = d.asFuture(loop)
  2439. aFuture.cancel()
  2440. callAllSoonCalls(loop)
  2441. self.assertEqual(canceler.called, True)
  2442. self.assertEqual(self.successResultOf(d), None)
  2443. self.assertRaises(CancelledError, aFuture.result)
  2444. def test_asFutureSuccessCancel(self):
  2445. """
  2446. While Futures don't support succeeding in response to cancellation,
  2447. Deferreds do; if a Deferred is coerced into a success by a Future
  2448. cancellation, that should just be ignored.
  2449. """
  2450. def canceler(dprime):
  2451. dprime.callback(9)
  2452. d = defer.Deferred(canceler)
  2453. loop = new_event_loop()
  2454. aFuture = d.asFuture(loop)
  2455. aFuture.cancel()
  2456. callAllSoonCalls(loop)
  2457. self.assertEqual(self.successResultOf(d), None)
  2458. self.assertRaises(CancelledError, aFuture.result)
  2459. def test_asFutureFailure(self):
  2460. """
  2461. L{defer.Deferred.asFuture} makes a L{asyncio.Future} fire with an
  2462. exception when the given L{defer.Deferred} does.
  2463. """
  2464. d = defer.Deferred()
  2465. theFailure = failure.Failure(ZeroDivisionError())
  2466. loop = new_event_loop()
  2467. future = d.asFuture(loop)
  2468. callAllSoonCalls(loop)
  2469. d.errback(theFailure)
  2470. callAllSoonCalls(loop)
  2471. self.assertRaises(ZeroDivisionError, future.result)
  2472. def test_fromFuture(self):
  2473. """
  2474. L{defer.Deferred.fromFuture} returns a L{defer.Deferred} that fires
  2475. when the given L{asyncio.Future} does.
  2476. """
  2477. loop = new_event_loop()
  2478. aFuture = Future(loop=loop)
  2479. d = defer.Deferred.fromFuture(aFuture)
  2480. self.assertNoResult(d)
  2481. aFuture.set_result(7)
  2482. callAllSoonCalls(loop)
  2483. self.assertEqual(self.successResultOf(d), 7)
  2484. def test_fromFutureFutureCancelled(self):
  2485. """
  2486. L{defer.Deferred.fromFuture} makes a L{defer.Deferred} fire with
  2487. an L{asyncio.CancelledError} when the given
  2488. L{asyncio.Future} is cancelled.
  2489. """
  2490. loop = new_event_loop()
  2491. cancelled = Future(loop=loop)
  2492. d = defer.Deferred.fromFuture(cancelled)
  2493. cancelled.cancel()
  2494. callAllSoonCalls(loop)
  2495. self.assertRaises(CancelledError, cancelled.result)
  2496. self.failureResultOf(d).trap(CancelledError)
  2497. def test_fromFutureDeferredCancelled(self):
  2498. """
  2499. L{defer.Deferred.fromFuture} makes a L{defer.Deferred} which, when
  2500. cancelled, cancels the L{asyncio.Future} it was created from.
  2501. """
  2502. loop = new_event_loop()
  2503. cancelled = Future(loop=loop)
  2504. d = defer.Deferred.fromFuture(cancelled)
  2505. d.cancel()
  2506. callAllSoonCalls(loop)
  2507. self.assertEqual(cancelled.cancelled(), True)
  2508. self.assertRaises(CancelledError, cancelled.result)
  2509. self.failureResultOf(d).trap(CancelledError)