~landscape/zope3/newer-from-ztk

« back to all changes in this revision

Viewing changes to src/twisted/trial/test/test_tests.py

  • Committer: Thomas Hervé
  • Date: 2009-07-08 13:52:04 UTC
  • Revision ID: thomas@canonical.com-20090708135204-df5eesrthifpylf8
Remove twisted copy

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import gc, StringIO, sys
2
 
 
3
 
from twisted.python import log
4
 
from twisted.trial import unittest, runner, reporter, util
5
 
from twisted.trial.test import erroneous, suppression
6
 
 
7
 
 
8
 
class ResultsTestMixin:
9
 
    def loadSuite(self, suite):
10
 
        self.loader = runner.TestLoader()
11
 
        self.suite = self.loader.loadClass(suite)
12
 
        self.reporter = reporter.TestResult()
13
 
 
14
 
    def test_setUp(self):
15
 
        self.failUnless(self.reporter.wasSuccessful())
16
 
        self.failUnlessEqual(self.reporter.errors, [])
17
 
        self.failUnlessEqual(self.reporter.failures, [])
18
 
        self.failUnlessEqual(self.reporter.skips, [])
19
 
 
20
 
    def assertCount(self, numTests):
21
 
        self.failUnlessEqual(self.suite.countTestCases(), numTests)
22
 
        self.suite(self.reporter)
23
 
        self.failUnlessEqual(self.reporter.testsRun, numTests)
24
 
 
25
 
 
26
 
 
27
 
class TestSuccess(unittest.TestCase):
28
 
    """
29
 
    Test that successful tests are reported as such.
30
 
    """
31
 
 
32
 
    def setUp(self):
33
 
        self.result = reporter.TestResult()
34
 
 
35
 
 
36
 
    def test_successful(self):
37
 
        """
38
 
        A successful test, used by other tests.
39
 
        """
40
 
 
41
 
 
42
 
    def assertSuccessful(self, test, result):
43
 
        self.assertEqual(result.successes,  [(test,)])
44
 
        self.assertEqual(result.failures, [])
45
 
        self.assertEqual(result.errors, [])
46
 
        self.assertEqual(result.expectedFailures, [])
47
 
        self.assertEqual(result.unexpectedSuccesses, [])
48
 
        self.assertEqual(result.skips, [])
49
 
 
50
 
 
51
 
    def test_successfulIsReported(self):
52
 
        """
53
 
        Test that when a successful test is run, it is reported as a success,
54
 
        and not as any other kind of result.
55
 
        """
56
 
        test = TestSuccess('test_successful')
57
 
        test.run(self.result)
58
 
        self.assertSuccessful(test, self.result)
59
 
 
60
 
 
61
 
    def test_defaultIsSuccessful(self):
62
 
        """
63
 
        Test that L{unittest.TestCase} itself can be instantiated, run, and
64
 
        reported as being successful.
65
 
        """
66
 
        test = unittest.TestCase()
67
 
        test.run(self.result)
68
 
        self.assertSuccessful(test, self.result)
69
 
 
70
 
 
71
 
 
72
 
class TestSkipMethods(unittest.TestCase, ResultsTestMixin):
73
 
    class SkippingTests(unittest.TestCase):
74
 
        def test_skip1(self):
75
 
            raise unittest.SkipTest('skip1')
76
 
 
77
 
        def test_skip2(self):
78
 
            raise RuntimeError("I should not get raised")
79
 
        test_skip2.skip = 'skip2'
80
 
 
81
 
        def test_skip3(self):
82
 
            self.fail('I should not fail')
83
 
        test_skip3.skip = 'skip3'
84
 
 
85
 
    class SkippingSetUp(unittest.TestCase):
86
 
        def setUp(self):
87
 
            raise unittest.SkipTest('skipSetUp')
88
 
 
89
 
        def test_1(self):
90
 
            pass
91
 
 
92
 
        def test_2(self):
93
 
            pass
94
 
 
95
 
    def setUp(self):
96
 
        self.loadSuite(TestSkipMethods.SkippingTests)
97
 
 
98
 
    def test_counting(self):
99
 
        self.assertCount(3)
100
 
 
101
 
    def test_results(self):
102
 
        self.suite(self.reporter)
103
 
        self.failUnless(self.reporter.wasSuccessful())
104
 
        self.failUnlessEqual(self.reporter.errors, [])
105
 
        self.failUnlessEqual(self.reporter.failures, [])
106
 
        self.failUnlessEqual(len(self.reporter.skips), 3)
107
 
 
108
 
    def test_setUp(self):
109
 
        self.loadSuite(TestSkipMethods.SkippingSetUp)
110
 
        self.suite(self.reporter)
111
 
        self.failUnless(self.reporter.wasSuccessful())
112
 
        self.failUnlessEqual(self.reporter.errors, [])
113
 
        self.failUnlessEqual(self.reporter.failures, [])
114
 
        self.failUnlessEqual(len(self.reporter.skips), 2)
115
 
 
116
 
    def test_reasons(self):
117
 
        self.suite(self.reporter)
118
 
        prefix = 'test_'
119
 
        # whiteboxing reporter
120
 
        for test, reason in self.reporter.skips:
121
 
            self.failUnlessEqual(test.shortDescription()[len(prefix):],
122
 
                                 str(reason))
123
 
 
124
 
 
125
 
class TestSkipClasses(unittest.TestCase, ResultsTestMixin):
126
 
    class SkippedClass(unittest.TestCase):
127
 
        skip = 'class'
128
 
        def setUpClass(self):
129
 
            self.__class__._setUpClassRan = True
130
 
        def setUp(self):
131
 
            self.__class__._setUpRan = True
132
 
        def tearDownClass(self):
133
 
            self.__class__._tearDownClassRan = True
134
 
        def test_skip1(self):
135
 
            raise unittest.SkipTest('skip1')
136
 
        def test_skip2(self):
137
 
            raise RuntimeError("Ought to skip me")
138
 
        test_skip2.skip = 'skip2'
139
 
        def test_skip3(self):
140
 
            pass
141
 
        def test_skip4(self):
142
 
            raise RuntimeError("Skip me too")
143
 
 
144
 
    def setUp(self):
145
 
        self.loadSuite(TestSkipClasses.SkippedClass)
146
 
        TestSkipClasses.SkippedClass._setUpRan = False
147
 
        TestSkipClasses.SkippedClass._setUpClassRan = False
148
 
        TestSkipClasses.SkippedClass._tearDownClassRan = False
149
 
 
150
 
    def test_counting(self):
151
 
        self.assertCount(4)
152
 
 
153
 
    def test_setUpRan(self):
154
 
        self.suite(self.reporter)
155
 
        self.failUnlessEqual(TestSkipClasses.SkippedClass._setUpRan, False)
156
 
        self.failUnlessEqual(TestSkipClasses.SkippedClass._setUpClassRan,
157
 
                             False)
158
 
        self.failUnlessEqual(TestSkipClasses.SkippedClass._tearDownClassRan,
159
 
                             False)
160
 
 
161
 
    def test_results(self):
162
 
        self.suite(self.reporter)
163
 
        self.failUnless(self.reporter.wasSuccessful())
164
 
        self.failUnlessEqual(self.reporter.errors, [])
165
 
        self.failUnlessEqual(self.reporter.failures, [])
166
 
        self.failUnlessEqual(len(self.reporter.skips), 4)
167
 
 
168
 
    def test_reasons(self):
169
 
        self.suite(self.reporter)
170
 
        expectedReasons = ['class', 'skip2', 'class', 'class']
171
 
        # whitebox reporter
172
 
        reasonsGiven = [ reason for test, reason in self.reporter.skips ]
173
 
        self.failUnlessEqual(expectedReasons, reasonsGiven)
174
 
 
175
 
 
176
 
class TestSkipClassesRaised(unittest.TestCase, ResultsTestMixin):
177
 
    class SkippedClass(unittest.TestCase):
178
 
        def setUpClass(self):
179
 
            raise unittest.SkipTest("class")
180
 
        def setUp(self):
181
 
            self.__class__._setUpRan = True
182
 
        def tearDownClass(self):
183
 
            self.__class__._tearDownClassRan = True
184
 
        def test_skip1(self):
185
 
            raise unittest.SkipTest('skip1')
186
 
        def test_skip2(self):
187
 
            raise RuntimeError("Ought to skip me")
188
 
        test_skip2.skip = 'skip2'
189
 
        def test_skip3(self):
190
 
            pass
191
 
        def test_skip4(self):
192
 
            raise RuntimeError("Skip me too")
193
 
 
194
 
    def setUp(self):
195
 
        if hasattr(TestSkipClassesRaised.SkippedClass, 'skip'):
196
 
            delattr(TestSkipClassesRaised.SkippedClass, 'skip')
197
 
        self.loadSuite(TestSkipClassesRaised.SkippedClass)
198
 
        TestSkipClassesRaised.SkippedClass._setUpRan = False
199
 
        TestSkipClassesRaised.SkippedClass._tearDownClassRan = False
200
 
 
201
 
    def test_counting(self):
202
 
        self.assertCount(4)
203
 
 
204
 
    def test_setUpRan(self):
205
 
        self.suite(self.reporter)
206
 
        self.failUnlessEqual(
207
 
            TestSkipClassesRaised.SkippedClass._setUpRan, False)
208
 
 
209
 
    def test_tearDownClassRan(self):
210
 
        self.suite(self.reporter)
211
 
        self.failUnlessEqual(
212
 
            TestSkipClassesRaised.SkippedClass._tearDownClassRan, False)
213
 
 
214
 
    def test_results(self):
215
 
        self.suite(self.reporter)
216
 
        self.failUnless(self.reporter.wasSuccessful())
217
 
        self.failUnlessEqual(self.reporter.errors, [])
218
 
        self.failUnlessEqual(self.reporter.failures, [])
219
 
        self.failUnlessEqual(len(self.reporter.skips), 4)
220
 
 
221
 
    def test_reasons(self):
222
 
        self.suite(self.reporter)
223
 
        expectedReasons = ['class', 'skip2', 'class', 'class']
224
 
        # whitebox reporter
225
 
        reasonsGiven = [ reason for test, reason in self.reporter.skips ]
226
 
        self.failUnlessEqual(expectedReasons, reasonsGiven)
227
 
 
228
 
 
229
 
class TestTodo(unittest.TestCase, ResultsTestMixin):
230
 
    class TodoTests(unittest.TestCase):
231
 
        def test_todo1(self):
232
 
            self.fail("deliberate failure")
233
 
        test_todo1.todo = "todo1"
234
 
 
235
 
        def test_todo2(self):
236
 
            raise RuntimeError("deliberate error")
237
 
        test_todo2.todo = "todo2"
238
 
 
239
 
        def test_todo3(self):
240
 
            """unexpected success"""
241
 
        test_todo3.todo = 'todo3'
242
 
 
243
 
    def setUp(self):
244
 
        self.loadSuite(TestTodo.TodoTests)
245
 
 
246
 
    def test_counting(self):
247
 
        self.assertCount(3)
248
 
 
249
 
    def test_results(self):
250
 
        self.suite(self.reporter)
251
 
        self.failUnless(self.reporter.wasSuccessful())
252
 
        self.failUnlessEqual(self.reporter.errors, [])
253
 
        self.failUnlessEqual(self.reporter.failures, [])
254
 
        self.failUnlessEqual(self.reporter.skips, [])
255
 
        self.failUnlessEqual(len(self.reporter.expectedFailures), 2)
256
 
        self.failUnlessEqual(len(self.reporter.unexpectedSuccesses), 1)
257
 
 
258
 
    def test_expectedFailures(self):
259
 
        self.suite(self.reporter)
260
 
        expectedReasons = ['todo1', 'todo2']
261
 
        reasonsGiven = [ r.reason
262
 
                         for t, e, r in self.reporter.expectedFailures ]
263
 
        self.failUnlessEqual(expectedReasons, reasonsGiven)
264
 
 
265
 
    def test_unexpectedSuccesses(self):
266
 
        self.suite(self.reporter)
267
 
        expectedReasons = ['todo3']
268
 
        reasonsGiven = [ r.reason
269
 
                         for t, r in self.reporter.unexpectedSuccesses ]
270
 
        self.failUnlessEqual(expectedReasons, reasonsGiven)
271
 
 
272
 
 
273
 
class TestTodoClass(unittest.TestCase, ResultsTestMixin):
274
 
    class TodoClass(unittest.TestCase):
275
 
        def test_todo1(self):
276
 
            pass
277
 
        test_todo1.todo = "method"
278
 
        def test_todo2(self):
279
 
            pass
280
 
        def test_todo3(self):
281
 
            self.fail("Deliberate Failure")
282
 
        test_todo3.todo = "method"
283
 
        def test_todo4(self):
284
 
            self.fail("Deliberate Failure")
285
 
    TodoClass.todo = "class"
286
 
 
287
 
    def setUp(self):
288
 
        self.loadSuite(TestTodoClass.TodoClass)
289
 
 
290
 
    def test_counting(self):
291
 
        self.assertCount(4)
292
 
 
293
 
    def test_results(self):
294
 
        self.suite(self.reporter)
295
 
        self.failUnless(self.reporter.wasSuccessful())
296
 
        self.failUnlessEqual(self.reporter.errors, [])
297
 
        self.failUnlessEqual(self.reporter.failures, [])
298
 
        self.failUnlessEqual(self.reporter.skips, [])
299
 
        self.failUnlessEqual(len(self.reporter.expectedFailures), 2)
300
 
        self.failUnlessEqual(len(self.reporter.unexpectedSuccesses), 2)
301
 
 
302
 
    def test_expectedFailures(self):
303
 
        self.suite(self.reporter)
304
 
        expectedReasons = ['method', 'class']
305
 
        reasonsGiven = [ r.reason
306
 
                         for t, e, r in self.reporter.expectedFailures ]
307
 
        self.failUnlessEqual(expectedReasons, reasonsGiven)
308
 
 
309
 
    def test_unexpectedSuccesses(self):
310
 
        self.suite(self.reporter)
311
 
        expectedReasons = ['method', 'class']
312
 
        reasonsGiven = [ r.reason
313
 
                         for t, r in self.reporter.unexpectedSuccesses ]
314
 
        self.failUnlessEqual(expectedReasons, reasonsGiven)
315
 
 
316
 
 
317
 
class TestStrictTodo(unittest.TestCase, ResultsTestMixin):
318
 
    class Todos(unittest.TestCase):
319
 
        def test_todo1(self):
320
 
            raise RuntimeError, "expected failure"
321
 
        test_todo1.todo = (RuntimeError, "todo1")
322
 
 
323
 
        def test_todo2(self):
324
 
            raise RuntimeError, "expected failure"
325
 
        test_todo2.todo = ((RuntimeError, OSError), "todo2")
326
 
 
327
 
        def test_todo3(self):
328
 
            raise RuntimeError, "we had no idea!"
329
 
        test_todo3.todo = (OSError, "todo3")
330
 
 
331
 
        def test_todo4(self):
332
 
            raise RuntimeError, "we had no idea!"
333
 
        test_todo4.todo = ((OSError, SyntaxError), "todo4")
334
 
 
335
 
        def test_todo5(self):
336
 
            self.fail("deliberate failure")
337
 
        test_todo5.todo = (unittest.FailTest, "todo5")
338
 
 
339
 
        def test_todo6(self):
340
 
            self.fail("deliberate failure")
341
 
        test_todo6.todo = (RuntimeError, "todo6")
342
 
 
343
 
        def test_todo7(self):
344
 
            pass
345
 
        test_todo7.todo = (RuntimeError, "todo7")
346
 
 
347
 
    def setUp(self):
348
 
        self.loadSuite(TestStrictTodo.Todos)
349
 
 
350
 
    def test_counting(self):
351
 
        self.assertCount(7)
352
 
 
353
 
    def test_results(self):
354
 
        self.suite(self.reporter)
355
 
        self.failIf(self.reporter.wasSuccessful())
356
 
        self.failUnlessEqual(len(self.reporter.errors), 2)
357
 
        self.failUnlessEqual(len(self.reporter.failures), 1)
358
 
        self.failUnlessEqual(len(self.reporter.expectedFailures), 3)
359
 
        self.failUnlessEqual(len(self.reporter.unexpectedSuccesses), 1)
360
 
        self.failUnlessEqual(self.reporter.skips, [])
361
 
 
362
 
    def test_expectedFailures(self):
363
 
        self.suite(self.reporter)
364
 
        expectedReasons = ['todo1', 'todo2', 'todo5']
365
 
        reasonsGotten = [ r.reason
366
 
                          for t, e, r in self.reporter.expectedFailures ]
367
 
        self.failUnlessEqual(expectedReasons, reasonsGotten)
368
 
 
369
 
    def test_unexpectedSuccesses(self):
370
 
        self.suite(self.reporter)
371
 
        expectedReasons = [([RuntimeError], 'todo7')]
372
 
        reasonsGotten = [ (r.errors, r.reason)
373
 
                          for t, r in self.reporter.unexpectedSuccesses ]
374
 
        self.failUnlessEqual(expectedReasons, reasonsGotten)
375
 
 
376
 
 
377
 
class _CleanUpReporter(reporter.Reporter):
378
 
    def __init__(self):
379
 
        super(_CleanUpReporter, self).__init__(StringIO.StringIO(), 'default',
380
 
                                               False)
381
 
 
382
 
    def cleanupErrors(self, errs):
383
 
        self.cleanerrs = errs
384
 
 
385
 
 
386
 
class TestCleanup(unittest.TestCase):
387
 
    def setUp(self):
388
 
        self.result = _CleanUpReporter()
389
 
        self.loader = runner.TestLoader()
390
 
 
391
 
    def testLeftoverSockets(self):
392
 
        suite = self.loader.loadMethod(
393
 
            erroneous.SocketOpenTest.test_socketsLeftOpen)
394
 
        suite.run(self.result)
395
 
        self.assert_(self.result.cleanerrs)
396
 
        self.assert_(isinstance(self.result.cleanerrs.value,
397
 
                                util.DirtyReactorError))
398
 
 
399
 
    def testLeftoverPendingCalls(self):
400
 
        suite = erroneous.ReactorCleanupTests('test_leftoverPendingCalls')
401
 
        suite.run(self.result)
402
 
        self.assert_(self.result.cleanerrs)
403
 
        self.assert_(isinstance(self.result.cleanerrs.value,
404
 
                                util.PendingTimedCallsError))
405
 
 
406
 
 
407
 
class BogusReporter(reporter.Reporter):
408
 
    def __init__(self):
409
 
        super(BogusReporter, self).__init__(StringIO.StringIO(), 'default',
410
 
                                            False)
411
 
 
412
 
    def upDownError(self, method, error, warn, printStatus):
413
 
        super(BogusReporter, self).upDownError(method, error, False,
414
 
                                               printStatus)
415
 
        self.udeMethod = method
416
 
 
417
 
 
418
 
class FixtureTest(unittest.TestCase):
419
 
    def setUp(self):
420
 
        self.reporter = BogusReporter()
421
 
        self.loader = runner.TestLoader()
422
 
 
423
 
    def testBrokenSetUp(self):
424
 
        self.loader.loadClass(erroneous.TestFailureInSetUp).run(self.reporter)
425
 
        imi = self.reporter.udeMethod
426
 
        self.assertEqual(imi, 'setUp')
427
 
        self.assert_(len(self.reporter.errors) > 0)
428
 
        self.assert_(isinstance(self.reporter.errors[0][1].value,
429
 
                                erroneous.FoolishError))
430
 
 
431
 
    def testBrokenTearDown(self):
432
 
        suite = self.loader.loadClass(erroneous.TestFailureInTearDown)
433
 
        suite.run(self.reporter)
434
 
        imi = self.reporter.udeMethod
435
 
        self.assertEqual(imi, 'tearDown')
436
 
        errors = self.reporter.errors
437
 
        self.assert_(len(errors) > 0)
438
 
        self.assert_(isinstance(errors[0][1].value, erroneous.FoolishError))
439
 
 
440
 
    def testBrokenSetUpClass(self):
441
 
        suite = self.loader.loadClass(erroneous.TestFailureInSetUpClass)
442
 
        suite.run(self.reporter)
443
 
        imi = self.reporter.udeMethod
444
 
        self.assertEqual(imi, 'setUpClass')
445
 
        self.assert_(self.reporter.errors)
446
 
 
447
 
    def testBrokenTearDownClass(self):
448
 
        suite = self.loader.loadClass(erroneous.TestFailureInTearDownClass)
449
 
        suite.run(self.reporter)
450
 
        imi = self.reporter.udeMethod
451
 
        self.assertEqual(imi, 'tearDownClass')
452
 
 
453
 
 
454
 
class FixtureMetaTest(unittest.TestCase):
455
 
    def test_testBrokenTearDownClass(self):
456
 
        """FixtureTest.testBrokenTearDownClass succeeds when run twice
457
 
        """
458
 
        test = FixtureTest('testBrokenTearDownClass')
459
 
        result = reporter.TestResult()
460
 
        test(result)
461
 
        self.failUnless(result.wasSuccessful())
462
 
        result2 = reporter.TestResult()
463
 
        test(result2)
464
 
        self.failUnless(result2.wasSuccessful())
465
 
 
466
 
 
467
 
class SuppressionTest(unittest.TestCase):
468
 
    def runTests(self, suite):
469
 
        suite.run(reporter.TestResult())
470
 
 
471
 
    def setUp(self):
472
 
        self.stream = StringIO.StringIO()
473
 
        self._stdout, sys.stdout = sys.stdout, self.stream
474
 
        self.loader = runner.TestLoader()
475
 
 
476
 
    def tearDown(self):
477
 
        sys.stdout = self._stdout
478
 
        self.stream = None
479
 
 
480
 
    def getIO(self):
481
 
        return self.stream.getvalue()
482
 
 
483
 
    def testSuppressMethod(self):
484
 
        self.runTests(self.loader.loadMethod(
485
 
            suppression.TestSuppression.testSuppressMethod))
486
 
        self.assertNotSubstring(suppression.METHOD_WARNING_MSG, self.getIO())
487
 
        self.assertSubstring(suppression.CLASS_WARNING_MSG, self.getIO())
488
 
        self.assertSubstring(suppression.MODULE_WARNING_MSG, self.getIO())
489
 
 
490
 
    def testSuppressClass(self):
491
 
        self.runTests(self.loader.loadMethod(
492
 
            suppression.TestSuppression.testSuppressClass))
493
 
        self.assertSubstring(suppression.METHOD_WARNING_MSG, self.getIO())
494
 
        self.assertNotSubstring(suppression.CLASS_WARNING_MSG, self.getIO())
495
 
        self.assertSubstring(suppression.MODULE_WARNING_MSG, self.getIO())
496
 
 
497
 
    def testSuppressModule(self):
498
 
        self.runTests(self.loader.loadMethod(
499
 
            suppression.TestSuppression2.testSuppressModule))
500
 
        self.assertSubstring(suppression.METHOD_WARNING_MSG, self.getIO())
501
 
        self.assertSubstring(suppression.CLASS_WARNING_MSG, self.getIO())
502
 
        self.assertNotSubstring(suppression.MODULE_WARNING_MSG, self.getIO())
503
 
 
504
 
    def testOverrideSuppressClass(self):
505
 
        self.runTests(self.loader.loadMethod(
506
 
            suppression.TestSuppression.testOverrideSuppressClass))
507
 
        self.assertSubstring(suppression.CLASS_WARNING_MSG, self.getIO())
508
 
        self.assertSubstring(suppression.MODULE_WARNING_MSG, self.getIO())
509
 
        self.assertSubstring(suppression.METHOD_WARNING_MSG, self.getIO())
510
 
 
511
 
 
512
 
class GCMixin:
513
 
    """I provide a few mock tests that log setUp, tearDown, test execution and
514
 
    garbage collection.  I'm used to test whether gc.collect gets called.
515
 
    """
516
 
 
517
 
    class BasicTest(unittest.TestCase):
518
 
        def setUp(self):
519
 
            self._log('setUp')
520
 
        def test_foo(self):
521
 
            self._log('test')
522
 
        def tearDown(self):
523
 
            self._log('tearDown')
524
 
 
525
 
    class ClassTest(unittest.TestCase):
526
 
        def test_1(self):
527
 
            self._log('test1')
528
 
        def test_2(self):
529
 
            self._log('test2')
530
 
        def tearDownClass(self):
531
 
            self._log('tearDownClass')
532
 
 
533
 
    def _log(self, msg):
534
 
        self._collectCalled.append(msg)
535
 
 
536
 
    def collect(self):
537
 
        """Fake gc.collect"""
538
 
        self._log('collect')
539
 
 
540
 
    def setUp(self):
541
 
        self._collectCalled = []
542
 
        self.BasicTest._log = self.ClassTest._log = self._log
543
 
        self._oldCollect = gc.collect
544
 
        gc.collect = self.collect
545
 
 
546
 
    def tearDown(self):
547
 
        gc.collect = self._oldCollect
548
 
 
549
 
 
550
 
class TestGarbageCollectionDefault(GCMixin, unittest.TestCase):
551
 
    def test_collectNotDefault(self):
552
 
        """
553
 
        By default, tests should not force garbage collection.
554
 
        """
555
 
        test = self.BasicTest('test_foo')
556
 
        result = reporter.TestResult()
557
 
        test.run(result)
558
 
        self.failUnlessEqual(self._collectCalled, ['setUp', 'test', 'tearDown'])
559
 
 
560
 
 
561
 
class TestGarbageCollection(GCMixin, unittest.TestCase):
562
 
    def test_collectCalled(self):
563
 
        """test gc.collect is called before and after each test
564
 
        """
565
 
        test = TestGarbageCollection.BasicTest('test_foo')
566
 
        test.forceGarbageCollection = True
567
 
        result = reporter.TestResult()
568
 
        test.run(result)
569
 
        self.failUnlessEqual(
570
 
            self._collectCalled,
571
 
            ['collect', 'setUp', 'test', 'tearDown', 'collect'])
572
 
 
573
 
    def test_collectCalledWhenTearDownClass(self):
574
 
        """test gc.collect is called after tearDownClasss"""
575
 
        tests = [TestGarbageCollection.ClassTest('test_1'),
576
 
                 TestGarbageCollection.ClassTest('test_2')]
577
 
        for t in tests:
578
 
            t.forceGarbageCollection = True
579
 
        test = runner.TestSuite(tests)
580
 
        result = reporter.TestResult()
581
 
        test.run(result)
582
 
        # check that collect gets called after individual tests, and
583
 
        # after tearDownClass
584
 
        self.failUnlessEqual(
585
 
            self._collectCalled,
586
 
            ['collect', 'test1', 'collect',
587
 
             'collect', 'test2', 'tearDownClass', 'collect'])
588
 
 
589
 
 
590
 
class TestUnhandledDeferred(unittest.TestCase):
591
 
    def setUp(self):
592
 
        from twisted.trial.test import weird
593
 
        # test_unhandledDeferred creates a cycle. we need explicit control of gc
594
 
        gc.disable()
595
 
        self.test1 = weird.TestBleeding('test_unhandledDeferred')
596
 
        self.test1.forceGarbageCollection = True
597
 
 
598
 
    def test_isReported(self):
599
 
        """
600
 
        Forcing garbage collection should cause unhandled Deferreds to be
601
 
        reported as errors.
602
 
        """
603
 
        result = reporter.TestResult()
604
 
        self.test1(result)
605
 
        self.assertEqual(len(result.errors), 1,
606
 
                         'Unhandled deferred passed without notice')
607
 
 
608
 
    def test_doesntBleed(self):
609
 
        """
610
 
        Forcing garbage collection in the test should mean that there are
611
 
        no unreachable cycles immediately after the test completes.
612
 
        """
613
 
        result = reporter.TestResult()
614
 
        self.test1(result)
615
 
        self.flushLoggedErrors() # test1 logs errors that get caught be us.
616
 
        # test1 created unreachable cycle.
617
 
        # it & all others should have been collected by now.
618
 
        n = gc.collect()
619
 
        self.assertEqual(n, 0, 'unreachable cycle still existed')
620
 
        # check that last gc.collect didn't log more errors
621
 
        x = self.flushLoggedErrors()
622
 
        self.assertEqual(len(x), 0, 'Errors logged after gc.collect')
623
 
 
624
 
    def tearDown(self):
625
 
        gc.collect()
626
 
        gc.enable()
627
 
        self.flushLoggedErrors()