1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
5 Test the interaction between trial and errors logged during test run.
10 from twisted.internet import reactor, task
11 from twisted.python import failure, log
12 from twisted.trial import unittest, reporter
17 Return a new, realistic failure.
21 except ZeroDivisionError:
28 Hide C{MockTest}s from Trial's automatic test finder.
31 class MockTest(unittest.TestCase):
32 def test_silent(self):
37 def test_single(self):
41 log.err(makeFailure())
43 def test_double(self):
47 log.err(makeFailure())
48 log.err(makeFailure())
50 def test_inCallback(self):
52 Log an error in an asynchronous callback.
54 return task.deferLater(reactor, 0, lambda: log.err(makeFailure()))
57 class TestObserver(unittest.TestCase):
59 Tests for L{unittest._LogObserver}, a helper for the implementation of
60 L{TestCase.flushLoggedErrors}.
63 self.result = reporter.TestResult()
64 self.observer = unittest._LogObserver()
69 Test that a standard log message doesn't go anywhere near the result.
71 self.observer.gotEvent({'message': ('some message',),
72 'time': time.time(), 'isError': 0,
74 self.assertEqual(self.observer.getErrors(), [])
79 Test that an observed error gets added to the result
82 self.observer.gotEvent({'message': (),
83 'time': time.time(), 'isError': 1,
84 'system': '-', 'failure': f,
86 self.assertEqual(self.observer.getErrors(), [f])
91 Check that flushing the observer with no args removes all errors.
94 flushed = self.observer.flushErrors()
95 self.assertEqual(self.observer.getErrors(), [])
96 self.assertEqual(len(flushed), 1)
97 self.assertTrue(flushed[0].check(ZeroDivisionError))
100 def _makeRuntimeFailure(self):
101 return failure.Failure(RuntimeError('test error'))
104 def test_flushByType(self):
106 Check that flushing the observer remove all failures of the given type.
108 self.test_error() # log a ZeroDivisionError to the observer
109 f = self._makeRuntimeFailure()
110 self.observer.gotEvent(dict(message=(), time=time.time(), isError=1,
111 system='-', failure=f, why=None))
112 flushed = self.observer.flushErrors(ZeroDivisionError)
113 self.assertEqual(self.observer.getErrors(), [f])
114 self.assertEqual(len(flushed), 1)
115 self.assertTrue(flushed[0].check(ZeroDivisionError))
118 def test_ignoreErrors(self):
120 Check that C{_ignoreErrors} actually causes errors to be ignored.
122 self.observer._ignoreErrors(ZeroDivisionError)
124 self.observer.gotEvent({'message': (),
125 'time': time.time(), 'isError': 1,
126 'system': '-', 'failure': f,
128 self.assertEqual(self.observer.getErrors(), [])
131 def test_clearIgnores(self):
133 Check that C{_clearIgnores} ensures that previously ignored errors
136 self.observer._ignoreErrors(ZeroDivisionError)
137 self.observer._clearIgnores()
139 self.observer.gotEvent({'message': (),
140 'time': time.time(), 'isError': 1,
141 'system': '-', 'failure': f,
143 self.assertEqual(self.observer.getErrors(), [f])
147 class LogErrors(unittest.TestCase):
149 High-level tests demonstrating the expected behaviour of logged errors
154 self.result = reporter.TestResult()
157 self.flushLoggedErrors(ZeroDivisionError)
159 def test_singleError(self):
161 Test that a logged error gets reported as a test error.
163 test = Mask.MockTest('test_single')
165 self.assertEqual(len(self.result.errors), 1)
166 self.assertTrue(self.result.errors[0][1].check(ZeroDivisionError),
167 self.result.errors[0][1])
169 def test_twoErrors(self):
171 Test that when two errors get logged, they both get reported as test
174 test = Mask.MockTest('test_double')
176 self.assertEqual(len(self.result.errors), 2)
178 def test_inCallback(self):
180 Test that errors logged in callbacks get reported as test errors.
182 test = Mask.MockTest('test_inCallback')
184 self.assertEqual(len(self.result.errors), 1)
185 self.assertTrue(self.result.errors[0][1].check(ZeroDivisionError),
186 self.result.errors[0][1])
188 def test_errorsIsolated(self):
190 Check that an error logged in one test doesn't fail the next test.
192 t1 = Mask.MockTest('test_single')
193 t2 = Mask.MockTest('test_silent')
196 self.assertEqual(len(self.result.errors), 1)
197 self.assertEqual(self.result.errors[0][0], t1)