detests.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. """
  4. Tests for Deferred handling by L{twisted.trial.unittest.TestCase}.
  5. """
  6. from __future__ import division, absolute_import
  7. from twisted.trial import unittest
  8. from twisted.internet import defer, threads, reactor
  9. from twisted.trial.util import suppress as SUPPRESS
  10. from twisted.python.util import runWithWarningsSuppressed
  11. class DeferredSetUpOK(unittest.TestCase):
  12. def setUp(self):
  13. d = defer.succeed('value')
  14. d.addCallback(self._cb_setUpCalled)
  15. return d
  16. def _cb_setUpCalled(self, ignored):
  17. self._setUpCalled = True
  18. def test_ok(self):
  19. self.assertTrue(self._setUpCalled)
  20. class DeferredSetUpFail(unittest.TestCase):
  21. testCalled = False
  22. def setUp(self):
  23. return defer.fail(unittest.FailTest('i fail'))
  24. def test_ok(self):
  25. DeferredSetUpFail.testCalled = True
  26. self.fail("I should not get called")
  27. class DeferredSetUpCallbackFail(unittest.TestCase):
  28. testCalled = False
  29. def setUp(self):
  30. d = defer.succeed('value')
  31. d.addCallback(self._cb_setUpCalled)
  32. return d
  33. def _cb_setUpCalled(self, ignored):
  34. self.fail('deliberate failure')
  35. def test_ok(self):
  36. DeferredSetUpCallbackFail.testCalled = True
  37. class DeferredSetUpError(unittest.TestCase):
  38. testCalled = False
  39. def setUp(self):
  40. return defer.fail(RuntimeError('deliberate error'))
  41. def test_ok(self):
  42. DeferredSetUpError.testCalled = True
  43. class DeferredSetUpNeverFire(unittest.TestCase):
  44. testCalled = False
  45. def setUp(self):
  46. return defer.Deferred()
  47. def test_ok(self):
  48. DeferredSetUpNeverFire.testCalled = True
  49. class DeferredSetUpSkip(unittest.TestCase):
  50. testCalled = False
  51. def setUp(self):
  52. d = defer.succeed('value')
  53. d.addCallback(self._cb1)
  54. return d
  55. def _cb1(self, ignored):
  56. raise unittest.SkipTest("skip me")
  57. def test_ok(self):
  58. DeferredSetUpSkip.testCalled = True
  59. class DeferredTests(unittest.TestCase):
  60. touched = False
  61. def _cb_fail(self, reason):
  62. self.fail(reason)
  63. def _cb_error(self, reason):
  64. raise RuntimeError(reason)
  65. def _cb_skip(self, reason):
  66. raise unittest.SkipTest(reason)
  67. def _touchClass(self, ignored):
  68. self.__class__.touched = True
  69. def setUp(self):
  70. self.__class__.touched = False
  71. def test_pass(self):
  72. return defer.succeed('success')
  73. def test_passGenerated(self):
  74. self._touchClass(None)
  75. yield None
  76. test_passGenerated = runWithWarningsSuppressed(
  77. [ SUPPRESS(message="twisted.internet.defer.deferredGenerator was "
  78. "deprecated") ],
  79. defer.deferredGenerator, test_passGenerated)
  80. @defer.inlineCallbacks
  81. def test_passInlineCallbacks(self):
  82. """
  83. Test case that is decorated with L{defer.inlineCallbacks}.
  84. """
  85. self._touchClass(None)
  86. yield None
  87. def test_fail(self):
  88. return defer.fail(self.failureException('I fail'))
  89. def test_failureInCallback(self):
  90. d = defer.succeed('fail')
  91. d.addCallback(self._cb_fail)
  92. return d
  93. def test_errorInCallback(self):
  94. d = defer.succeed('error')
  95. d.addCallback(self._cb_error)
  96. return d
  97. def test_skip(self):
  98. d = defer.succeed('skip')
  99. d.addCallback(self._cb_skip)
  100. d.addCallback(self._touchClass)
  101. return d
  102. def test_thread(self):
  103. return threads.deferToThread(lambda : None)
  104. def test_expectedFailure(self):
  105. d = defer.succeed('todo')
  106. d.addCallback(self._cb_error)
  107. return d
  108. test_expectedFailure.todo = "Expected failure"
  109. class TimeoutTests(unittest.TestCase):
  110. timedOut = None
  111. def test_pass(self):
  112. d = defer.Deferred()
  113. reactor.callLater(0, d.callback, 'hoorj!')
  114. return d
  115. test_pass.timeout = 2
  116. def test_passDefault(self):
  117. # test default timeout
  118. d = defer.Deferred()
  119. reactor.callLater(0, d.callback, 'hoorj!')
  120. return d
  121. def test_timeout(self):
  122. return defer.Deferred()
  123. test_timeout.timeout = 0.1
  124. def test_timeoutZero(self):
  125. return defer.Deferred()
  126. test_timeoutZero.timeout = 0
  127. def test_expectedFailure(self):
  128. return defer.Deferred()
  129. test_expectedFailure.timeout = 0.1
  130. test_expectedFailure.todo = "i will get it right, eventually"
  131. def test_skip(self):
  132. return defer.Deferred()
  133. test_skip.timeout = 0.1
  134. test_skip.skip = "i will get it right, eventually"
  135. def test_errorPropagation(self):
  136. def timedOut(err):
  137. self.__class__.timedOut = err
  138. return err
  139. d = defer.Deferred()
  140. d.addErrback(timedOut)
  141. return d
  142. test_errorPropagation.timeout = 0.1
  143. def test_calledButNeverCallback(self):
  144. d = defer.Deferred()
  145. def neverFire(r):
  146. return defer.Deferred()
  147. d.addCallback(neverFire)
  148. d.callback(1)
  149. return d
  150. test_calledButNeverCallback.timeout = 0.1
  151. class TestClassTimeoutAttribute(unittest.TestCase):
  152. timeout = 0.2
  153. def setUp(self):
  154. self.d = defer.Deferred()
  155. def testMethod(self):
  156. self.methodCalled = True
  157. return self.d