Index: third_party/twisted_8_1/twisted/trial/test/test_tests.py |
diff --git a/third_party/twisted_8_1/twisted/trial/test/test_tests.py b/third_party/twisted_8_1/twisted/trial/test/test_tests.py |
deleted file mode 100644 |
index 8a38c34cee0c1fa0a5152fa8ab11f662b9c1ef58..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/trial/test/test_tests.py |
+++ /dev/null |
@@ -1,1124 +0,0 @@ |
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-""" |
-Tests for the behaviour of unit tests. |
-""" |
- |
-import gc, StringIO, sys, weakref |
- |
-from twisted.internet import defer, reactor |
-from twisted.trial import unittest, runner, reporter, util |
-from twisted.trial.test import erroneous, suppression |
-from twisted.trial.test.test_reporter import LoggingReporter |
- |
- |
-class ResultsTestMixin: |
- def loadSuite(self, suite): |
- self.loader = runner.TestLoader() |
- self.suite = self.loader.loadClass(suite) |
- self.reporter = reporter.TestResult() |
- |
- def test_setUp(self): |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(self.reporter.skips, []) |
- |
- def assertCount(self, numTests): |
- self.failUnlessEqual(self.suite.countTestCases(), numTests) |
- self.suite(self.reporter) |
- self.failUnlessEqual(self.reporter.testsRun, numTests) |
- |
- |
- |
-class TestSuccess(unittest.TestCase): |
- """ |
- Test that successful tests are reported as such. |
- """ |
- |
- def setUp(self): |
- self.result = reporter.TestResult() |
- |
- |
- def test_successful(self): |
- """ |
- A successful test, used by other tests. |
- """ |
- |
- |
- def assertSuccessful(self, test, result): |
- self.assertEqual(result.successes, 1) |
- self.assertEqual(result.failures, []) |
- self.assertEqual(result.errors, []) |
- self.assertEqual(result.expectedFailures, []) |
- self.assertEqual(result.unexpectedSuccesses, []) |
- self.assertEqual(result.skips, []) |
- |
- |
- def test_successfulIsReported(self): |
- """ |
- Test that when a successful test is run, it is reported as a success, |
- and not as any other kind of result. |
- """ |
- test = TestSuccess('test_successful') |
- test.run(self.result) |
- self.assertSuccessful(test, self.result) |
- |
- |
- def test_defaultIsSuccessful(self): |
- """ |
- Test that L{unittest.TestCase} itself can be instantiated, run, and |
- reported as being successful. |
- """ |
- test = unittest.TestCase() |
- test.run(self.result) |
- self.assertSuccessful(test, self.result) |
- |
- |
- def test_noReference(self): |
- """ |
- Test that no reference is kept on a successful test. |
- """ |
- test = TestSuccess('test_successful') |
- ref = weakref.ref(test) |
- test.run(self.result) |
- self.assertSuccessful(test, self.result) |
- del test |
- gc.collect() |
- self.assertIdentical(ref(), None) |
- |
- |
- |
-class TestSkipMethods(unittest.TestCase, ResultsTestMixin): |
- class SkippingTests(unittest.TestCase): |
- def test_skip1(self): |
- raise unittest.SkipTest('skip1') |
- |
- def test_skip2(self): |
- raise RuntimeError("I should not get raised") |
- test_skip2.skip = 'skip2' |
- |
- def test_skip3(self): |
- self.fail('I should not fail') |
- test_skip3.skip = 'skip3' |
- |
- class SkippingSetUp(unittest.TestCase): |
- def setUp(self): |
- raise unittest.SkipTest('skipSetUp') |
- |
- def test_1(self): |
- pass |
- |
- def test_2(self): |
- pass |
- |
- def setUp(self): |
- self.loadSuite(TestSkipMethods.SkippingTests) |
- |
- def test_counting(self): |
- self.assertCount(3) |
- |
- def test_results(self): |
- self.suite(self.reporter) |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(len(self.reporter.skips), 3) |
- |
- def test_setUp(self): |
- self.loadSuite(TestSkipMethods.SkippingSetUp) |
- self.suite(self.reporter) |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(len(self.reporter.skips), 2) |
- |
- def test_reasons(self): |
- self.suite(self.reporter) |
- prefix = 'test_' |
- # whiteboxing reporter |
- for test, reason in self.reporter.skips: |
- self.failUnlessEqual(test.shortDescription()[len(prefix):], |
- str(reason)) |
- |
- |
-class TestSkipClasses(unittest.TestCase, ResultsTestMixin): |
- class SkippedClass(unittest.TestCase): |
- skip = 'class' |
- def setUpClass(self): |
- self.__class__._setUpClassRan = True |
- def setUp(self): |
- self.__class__._setUpRan = True |
- def tearDownClass(self): |
- self.__class__._tearDownClassRan = True |
- def test_skip1(self): |
- raise unittest.SkipTest('skip1') |
- def test_skip2(self): |
- raise RuntimeError("Ought to skip me") |
- test_skip2.skip = 'skip2' |
- def test_skip3(self): |
- pass |
- def test_skip4(self): |
- raise RuntimeError("Skip me too") |
- |
- def setUp(self): |
- self.loadSuite(TestSkipClasses.SkippedClass) |
- TestSkipClasses.SkippedClass._setUpRan = False |
- TestSkipClasses.SkippedClass._setUpClassRan = False |
- TestSkipClasses.SkippedClass._tearDownClassRan = False |
- |
- def test_counting(self): |
- self.assertCount(4) |
- |
- def test_setUpRan(self): |
- self.suite(self.reporter) |
- self.failUnlessEqual(TestSkipClasses.SkippedClass._setUpRan, False) |
- self.failUnlessEqual(TestSkipClasses.SkippedClass._setUpClassRan, |
- False) |
- self.failUnlessEqual(TestSkipClasses.SkippedClass._tearDownClassRan, |
- False) |
- |
- def test_results(self): |
- self.suite(self.reporter) |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(len(self.reporter.skips), 4) |
- |
- def test_reasons(self): |
- self.suite(self.reporter) |
- expectedReasons = ['class', 'skip2', 'class', 'class'] |
- # whitebox reporter |
- reasonsGiven = [ reason for test, reason in self.reporter.skips ] |
- self.failUnlessEqual(expectedReasons, reasonsGiven) |
- |
- |
-class TestSkipClassesRaised(unittest.TestCase, ResultsTestMixin): |
- class SkippedClass(unittest.TestCase): |
- def setUpClass(self): |
- raise unittest.SkipTest("class") |
- def setUp(self): |
- self.__class__._setUpRan = True |
- def tearDownClass(self): |
- self.__class__._tearDownClassRan = True |
- def test_skip1(self): |
- raise unittest.SkipTest('skip1') |
- def test_skip2(self): |
- raise RuntimeError("Ought to skip me") |
- test_skip2.skip = 'skip2' |
- def test_skip3(self): |
- pass |
- def test_skip4(self): |
- raise RuntimeError("Skip me too") |
- |
- def setUp(self): |
- if hasattr(TestSkipClassesRaised.SkippedClass, 'skip'): |
- delattr(TestSkipClassesRaised.SkippedClass, 'skip') |
- self.loadSuite(TestSkipClassesRaised.SkippedClass) |
- TestSkipClassesRaised.SkippedClass._setUpRan = False |
- TestSkipClassesRaised.SkippedClass._tearDownClassRan = False |
- |
- def test_counting(self): |
- self.assertCount(4) |
- |
- def test_setUpRan(self): |
- self.suite(self.reporter) |
- self.failUnlessEqual( |
- TestSkipClassesRaised.SkippedClass._setUpRan, False) |
- |
- def test_tearDownClassRan(self): |
- self.suite(self.reporter) |
- self.failUnlessEqual( |
- TestSkipClassesRaised.SkippedClass._tearDownClassRan, False) |
- |
- def test_results(self): |
- self.suite(self.reporter) |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(len(self.reporter.skips), 4) |
- |
- def test_reasons(self): |
- self.suite(self.reporter) |
- expectedReasons = ['class', 'skip2', 'class', 'class'] |
- # whitebox reporter |
- reasonsGiven = [ reason for test, reason in self.reporter.skips ] |
- self.failUnlessEqual(expectedReasons, reasonsGiven) |
- |
- |
-class TestTodo(unittest.TestCase, ResultsTestMixin): |
- class TodoTests(unittest.TestCase): |
- def test_todo1(self): |
- self.fail("deliberate failure") |
- test_todo1.todo = "todo1" |
- |
- def test_todo2(self): |
- raise RuntimeError("deliberate error") |
- test_todo2.todo = "todo2" |
- |
- def test_todo3(self): |
- """unexpected success""" |
- test_todo3.todo = 'todo3' |
- |
- def setUp(self): |
- self.loadSuite(TestTodo.TodoTests) |
- |
- def test_counting(self): |
- self.assertCount(3) |
- |
- def test_results(self): |
- self.suite(self.reporter) |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(self.reporter.skips, []) |
- self.failUnlessEqual(len(self.reporter.expectedFailures), 2) |
- self.failUnlessEqual(len(self.reporter.unexpectedSuccesses), 1) |
- |
- def test_expectedFailures(self): |
- self.suite(self.reporter) |
- expectedReasons = ['todo1', 'todo2'] |
- reasonsGiven = [ r.reason |
- for t, e, r in self.reporter.expectedFailures ] |
- self.failUnlessEqual(expectedReasons, reasonsGiven) |
- |
- def test_unexpectedSuccesses(self): |
- self.suite(self.reporter) |
- expectedReasons = ['todo3'] |
- reasonsGiven = [ r.reason |
- for t, r in self.reporter.unexpectedSuccesses ] |
- self.failUnlessEqual(expectedReasons, reasonsGiven) |
- |
- |
-class TestTodoClass(unittest.TestCase, ResultsTestMixin): |
- class TodoClass(unittest.TestCase): |
- def test_todo1(self): |
- pass |
- test_todo1.todo = "method" |
- def test_todo2(self): |
- pass |
- def test_todo3(self): |
- self.fail("Deliberate Failure") |
- test_todo3.todo = "method" |
- def test_todo4(self): |
- self.fail("Deliberate Failure") |
- TodoClass.todo = "class" |
- |
- def setUp(self): |
- self.loadSuite(TestTodoClass.TodoClass) |
- |
- def test_counting(self): |
- self.assertCount(4) |
- |
- def test_results(self): |
- self.suite(self.reporter) |
- self.failUnless(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(self.reporter.errors, []) |
- self.failUnlessEqual(self.reporter.failures, []) |
- self.failUnlessEqual(self.reporter.skips, []) |
- self.failUnlessEqual(len(self.reporter.expectedFailures), 2) |
- self.failUnlessEqual(len(self.reporter.unexpectedSuccesses), 2) |
- |
- def test_expectedFailures(self): |
- self.suite(self.reporter) |
- expectedReasons = ['method', 'class'] |
- reasonsGiven = [ r.reason |
- for t, e, r in self.reporter.expectedFailures ] |
- self.failUnlessEqual(expectedReasons, reasonsGiven) |
- |
- def test_unexpectedSuccesses(self): |
- self.suite(self.reporter) |
- expectedReasons = ['method', 'class'] |
- reasonsGiven = [ r.reason |
- for t, r in self.reporter.unexpectedSuccesses ] |
- self.failUnlessEqual(expectedReasons, reasonsGiven) |
- |
- |
-class TestStrictTodo(unittest.TestCase, ResultsTestMixin): |
- class Todos(unittest.TestCase): |
- def test_todo1(self): |
- raise RuntimeError, "expected failure" |
- test_todo1.todo = (RuntimeError, "todo1") |
- |
- def test_todo2(self): |
- raise RuntimeError, "expected failure" |
- test_todo2.todo = ((RuntimeError, OSError), "todo2") |
- |
- def test_todo3(self): |
- raise RuntimeError, "we had no idea!" |
- test_todo3.todo = (OSError, "todo3") |
- |
- def test_todo4(self): |
- raise RuntimeError, "we had no idea!" |
- test_todo4.todo = ((OSError, SyntaxError), "todo4") |
- |
- def test_todo5(self): |
- self.fail("deliberate failure") |
- test_todo5.todo = (unittest.FailTest, "todo5") |
- |
- def test_todo6(self): |
- self.fail("deliberate failure") |
- test_todo6.todo = (RuntimeError, "todo6") |
- |
- def test_todo7(self): |
- pass |
- test_todo7.todo = (RuntimeError, "todo7") |
- |
- def setUp(self): |
- self.loadSuite(TestStrictTodo.Todos) |
- |
- def test_counting(self): |
- self.assertCount(7) |
- |
- def test_results(self): |
- self.suite(self.reporter) |
- self.failIf(self.reporter.wasSuccessful()) |
- self.failUnlessEqual(len(self.reporter.errors), 2) |
- self.failUnlessEqual(len(self.reporter.failures), 1) |
- self.failUnlessEqual(len(self.reporter.expectedFailures), 3) |
- self.failUnlessEqual(len(self.reporter.unexpectedSuccesses), 1) |
- self.failUnlessEqual(self.reporter.skips, []) |
- |
- def test_expectedFailures(self): |
- self.suite(self.reporter) |
- expectedReasons = ['todo1', 'todo2', 'todo5'] |
- reasonsGotten = [ r.reason |
- for t, e, r in self.reporter.expectedFailures ] |
- self.failUnlessEqual(expectedReasons, reasonsGotten) |
- |
- def test_unexpectedSuccesses(self): |
- self.suite(self.reporter) |
- expectedReasons = [([RuntimeError], 'todo7')] |
- reasonsGotten = [ (r.errors, r.reason) |
- for t, r in self.reporter.unexpectedSuccesses ] |
- self.failUnlessEqual(expectedReasons, reasonsGotten) |
- |
- |
- |
-class TestCleanup(unittest.TestCase): |
- |
- def setUp(self): |
- self.result = reporter.Reporter(StringIO.StringIO()) |
- self.loader = runner.TestLoader() |
- |
- |
- def testLeftoverSockets(self): |
- """ |
- Trial reports a L{util.DirtyReactorAggregateError} if a test leaves |
- sockets behind. |
- """ |
- suite = self.loader.loadMethod( |
- erroneous.SocketOpenTest.test_socketsLeftOpen) |
- suite.run(self.result) |
- self.failIf(self.result.wasSuccessful()) |
- # socket cleanup happens at end of class's tests. |
- # all the tests in the class are successful, even if the suite |
- # fails |
- self.assertEqual(self.result.successes, 1) |
- failure = self.result.errors[0][1] |
- self.failUnless(failure.check(util.DirtyReactorAggregateError)) |
- |
- |
- def testLeftoverPendingCalls(self): |
- """ |
- Trial reports a L{util.DirtyReactorAggregateError} and fails the test |
- if a test leaves a L{DelayedCall} hanging. |
- """ |
- suite = erroneous.ReactorCleanupTests('test_leftoverPendingCalls') |
- suite.run(self.result) |
- self.failIf(self.result.wasSuccessful()) |
- failure = self.result.errors[0][1] |
- self.assertEqual(self.result.successes, 0) |
- self.failUnless(failure.check(util.DirtyReactorAggregateError)) |
- |
- |
- |
-class FixtureTest(unittest.TestCase): |
- """ |
- Tests for broken fixture helper methods (e.g. setUp, tearDown). |
- """ |
- |
- def setUp(self): |
- self.reporter = reporter.Reporter() |
- self.loader = runner.TestLoader() |
- |
- |
- def testBrokenSetUp(self): |
- """ |
- When setUp fails, the error is recorded in the result object. |
- """ |
- self.loader.loadClass(erroneous.TestFailureInSetUp).run(self.reporter) |
- self.assert_(len(self.reporter.errors) > 0) |
- self.assert_(isinstance(self.reporter.errors[0][1].value, |
- erroneous.FoolishError)) |
- |
- |
- def testBrokenTearDown(self): |
- """ |
- When tearDown fails, the error is recorded in the result object. |
- """ |
- suite = self.loader.loadClass(erroneous.TestFailureInTearDown) |
- suite.run(self.reporter) |
- errors = self.reporter.errors |
- self.assert_(len(errors) > 0) |
- self.assert_(isinstance(errors[0][1].value, erroneous.FoolishError)) |
- |
- |
- def testBrokenSetUpClass(self): |
- """ |
- When setUpClass fails, an error is recorded in the result object. |
- """ |
- suite = self.loader.loadClass(erroneous.TestFailureInSetUpClass) |
- suite.run(self.reporter) |
- self.assert_(self.reporter.errors) |
- |
- |
- def testBrokenTearDownClass(self): |
- """ |
- When setUpClass fails, an error is recorded in the result object. |
- """ |
- suite = self.loader.loadClass(erroneous.TestFailureInTearDownClass) |
- suite.run(self.reporter) |
- self.assert_(self.reporter.errors) |
- |
- |
- |
-class FixtureMetaTest(unittest.TestCase): |
- |
- def test_testBrokenTearDownClass(self): |
- """FixtureTest.testBrokenTearDownClass succeeds when run twice |
- """ |
- test = FixtureTest('testBrokenTearDownClass') |
- result = reporter.TestResult() |
- test(result) |
- self.failUnless(result.wasSuccessful()) |
- result2 = reporter.TestResult() |
- test(result2) |
- self.failUnless(result2.wasSuccessful()) |
- |
- |
- |
-class SuppressionTest(unittest.TestCase): |
- |
- def runTests(self, suite): |
- suite.run(reporter.TestResult()) |
- |
- |
- def setUp(self): |
- self.stream = StringIO.StringIO() |
- self._stdout, sys.stdout = sys.stdout, self.stream |
- self.loader = runner.TestLoader() |
- |
- |
- def tearDown(self): |
- sys.stdout = self._stdout |
- self.stream = None |
- |
- |
- def getIO(self): |
- return self.stream.getvalue() |
- |
- |
- def testSuppressMethod(self): |
- self.runTests(self.loader.loadMethod( |
- suppression.TestSuppression.testSuppressMethod)) |
- self.assertNotSubstring(suppression.METHOD_WARNING_MSG, self.getIO()) |
- self.assertSubstring(suppression.CLASS_WARNING_MSG, self.getIO()) |
- self.assertSubstring(suppression.MODULE_WARNING_MSG, self.getIO()) |
- |
- |
- def testSuppressClass(self): |
- self.runTests(self.loader.loadMethod( |
- suppression.TestSuppression.testSuppressClass)) |
- self.assertSubstring(suppression.METHOD_WARNING_MSG, self.getIO()) |
- self.assertNotSubstring(suppression.CLASS_WARNING_MSG, self.getIO()) |
- self.assertSubstring(suppression.MODULE_WARNING_MSG, self.getIO()) |
- |
- |
- def testSuppressModule(self): |
- self.runTests(self.loader.loadMethod( |
- suppression.TestSuppression2.testSuppressModule)) |
- self.assertSubstring(suppression.METHOD_WARNING_MSG, self.getIO()) |
- self.assertSubstring(suppression.CLASS_WARNING_MSG, self.getIO()) |
- self.assertNotSubstring(suppression.MODULE_WARNING_MSG, self.getIO()) |
- |
- |
- def testOverrideSuppressClass(self): |
- self.runTests(self.loader.loadMethod( |
- suppression.TestSuppression.testOverrideSuppressClass)) |
- self.assertSubstring(suppression.CLASS_WARNING_MSG, self.getIO()) |
- self.assertSubstring(suppression.MODULE_WARNING_MSG, self.getIO()) |
- self.assertSubstring(suppression.METHOD_WARNING_MSG, self.getIO()) |
- |
- |
- |
-class GCMixin: |
- """ |
- I provide a few mock tests that log setUp, tearDown, test execution and |
- garbage collection. I'm used to test whether gc.collect gets called. |
- """ |
- |
- class BasicTest(unittest.TestCase): |
- def setUp(self): |
- self._log('setUp') |
- def test_foo(self): |
- self._log('test') |
- def tearDown(self): |
- self._log('tearDown') |
- |
- class ClassTest(unittest.TestCase): |
- def test_1(self): |
- self._log('test1') |
- def test_2(self): |
- self._log('test2') |
- def tearDownClass(self): |
- self._log('tearDownClass') |
- |
- def _log(self, msg): |
- self._collectCalled.append(msg) |
- |
- def collect(self): |
- """Fake gc.collect""" |
- self._log('collect') |
- |
- def setUp(self): |
- self._collectCalled = [] |
- self.BasicTest._log = self.ClassTest._log = self._log |
- self._oldCollect = gc.collect |
- gc.collect = self.collect |
- |
- def tearDown(self): |
- gc.collect = self._oldCollect |
- |
- |
- |
-class TestGarbageCollectionDefault(GCMixin, unittest.TestCase): |
- |
- def test_collectNotDefault(self): |
- """ |
- By default, tests should not force garbage collection. |
- """ |
- test = self.BasicTest('test_foo') |
- result = reporter.TestResult() |
- test.run(result) |
- self.failUnlessEqual(self._collectCalled, ['setUp', 'test', 'tearDown']) |
- |
- |
- |
-class TestGarbageCollection(GCMixin, unittest.TestCase): |
- |
- def test_collectCalled(self): |
- """ |
- test gc.collect is called before and after each test. |
- """ |
- test = TestGarbageCollection.BasicTest('test_foo') |
- test = unittest._ForceGarbageCollectionDecorator(test) |
- result = reporter.TestResult() |
- test.run(result) |
- self.failUnlessEqual( |
- self._collectCalled, |
- ['collect', 'setUp', 'test', 'tearDown', 'collect']) |
- |
- def test_collectCalledWhenTearDownClass(self): |
- """ |
- test gc.collect is called after tearDownClass. |
- """ |
- test = unittest.TestSuite( |
- [TestGarbageCollection.ClassTest('test_1'), |
- TestGarbageCollection.ClassTest('test_2')]) |
- test = unittest.decorate( |
- test, unittest._ForceGarbageCollectionDecorator) |
- result = reporter.TestResult() |
- test.run(result) |
- # check that collect gets called after individual tests, and |
- # after tearDownClass |
- self.failUnlessEqual( |
- self._collectCalled, |
- ['collect', 'test1', 'collect', |
- 'collect', 'test2', 'tearDownClass', 'collect']) |
- |
- |
- |
-class TestUnhandledDeferred(unittest.TestCase): |
- |
- def setUp(self): |
- from twisted.trial.test import weird |
- # test_unhandledDeferred creates a cycle. we need explicit control of gc |
- gc.disable() |
- self.test1 = unittest._ForceGarbageCollectionDecorator( |
- weird.TestBleeding('test_unhandledDeferred')) |
- |
- def test_isReported(self): |
- """ |
- Forcing garbage collection should cause unhandled Deferreds to be |
- reported as errors. |
- """ |
- result = reporter.TestResult() |
- self.test1(result) |
- self.assertEqual(len(result.errors), 1, |
- 'Unhandled deferred passed without notice') |
- |
- def test_doesntBleed(self): |
- """ |
- Forcing garbage collection in the test should mean that there are |
- no unreachable cycles immediately after the test completes. |
- """ |
- result = reporter.TestResult() |
- self.test1(result) |
- self.flushLoggedErrors() # test1 logs errors that get caught be us. |
- # test1 created unreachable cycle. |
- # it & all others should have been collected by now. |
- n = gc.collect() |
- self.assertEqual(n, 0, 'unreachable cycle still existed') |
- # check that last gc.collect didn't log more errors |
- x = self.flushLoggedErrors() |
- self.assertEqual(len(x), 0, 'Errors logged after gc.collect') |
- |
- def tearDown(self): |
- gc.collect() |
- gc.enable() |
- self.flushLoggedErrors() |
- |
- |
- |
-class TestAddCleanup(unittest.TestCase): |
- """ |
- Test the addCleanup method of TestCase. |
- """ |
- |
- class MockTest(unittest.TestCase): |
- |
- def setUp(self): |
- self.log = ['setUp'] |
- |
- def brokenSetUp(self): |
- self.log = ['setUp'] |
- raise RuntimeError("Deliberate failure") |
- |
- def skippingSetUp(self): |
- self.log = ['setUp'] |
- raise unittest.SkipTest("Don't do this") |
- |
- def append(self, thing): |
- self.log.append(thing) |
- |
- def tearDown(self): |
- self.log.append('tearDown') |
- |
- def runTest(self): |
- self.log.append('runTest') |
- |
- |
- def setUp(self): |
- unittest.TestCase.setUp(self) |
- self.result = reporter.TestResult() |
- self.test = TestAddCleanup.MockTest() |
- |
- |
- def test_addCleanupCalledIfSetUpFails(self): |
- """ |
- Callables added with C{addCleanup} are run even if setUp fails. |
- """ |
- self.test.setUp = self.test.brokenSetUp |
- self.test.addCleanup(self.test.append, 'foo') |
- self.test.run(self.result) |
- self.assertEqual(['setUp', 'foo'], self.test.log) |
- |
- |
- def test_addCleanupCalledIfSetUpSkips(self): |
- """ |
- Callables added with C{addCleanup} are run even if setUp raises |
- L{SkipTest}. This allows test authors to reliably provide clean up |
- code using C{addCleanup}. |
- """ |
- self.test.setUp = self.test.skippingSetUp |
- self.test.addCleanup(self.test.append, 'foo') |
- self.test.run(self.result) |
- self.assertEqual(['setUp', 'foo'], self.test.log) |
- |
- |
- def test_addCleanupCalledInReverseOrder(self): |
- """ |
- Callables added with C{addCleanup} should be called before C{tearDown} |
- in reverse order of addition. |
- """ |
- self.test.addCleanup(self.test.append, "foo") |
- self.test.addCleanup(self.test.append, 'bar') |
- self.test.run(self.result) |
- self.assertEqual(['setUp', 'runTest', 'bar', 'foo', 'tearDown'], |
- self.test.log) |
- |
- |
- def test_addCleanupWaitsForDeferreds(self): |
- """ |
- If an added callable returns a L{Deferred}, then the test should wait |
- until that L{Deferred} has fired before running the next cleanup |
- method. |
- """ |
- def cleanup(message): |
- d = defer.Deferred() |
- reactor.callLater(0, d.callback, message) |
- return d.addCallback(self.test.append) |
- self.test.addCleanup(self.test.append, 'foo') |
- self.test.addCleanup(cleanup, 'bar') |
- self.test.run(self.result) |
- self.assertEqual(['setUp', 'runTest', 'bar', 'foo', 'tearDown'], |
- self.test.log) |
- |
- |
- def test_errorInCleanupIsCaptured(self): |
- """ |
- Errors raised in cleanup functions should be treated like errors in |
- C{tearDown}. They should be added as errors and fail the test. Skips, |
- todos and failures are all treated as errors. |
- """ |
- self.test.addCleanup(self.test.fail, 'foo') |
- self.test.run(self.result) |
- self.failIf(self.result.wasSuccessful()) |
- self.assertEqual(1, len(self.result.errors)) |
- [(test, error)] = self.result.errors |
- self.assertEqual(test, self.test) |
- self.assertEqual(error.getErrorMessage(), 'foo') |
- |
- |
- def test_cleanupsContinueRunningAfterError(self): |
- """ |
- If a cleanup raises an error then that does not stop the other |
- cleanups from being run. |
- """ |
- self.test.addCleanup(self.test.append, 'foo') |
- self.test.addCleanup(self.test.fail, 'bar') |
- self.test.run(self.result) |
- self.assertEqual(['setUp', 'runTest', 'foo', 'tearDown'], |
- self.test.log) |
- self.assertEqual(1, len(self.result.errors)) |
- [(test, error)] = self.result.errors |
- self.assertEqual(test, self.test) |
- self.assertEqual(error.getErrorMessage(), 'bar') |
- |
- |
- def test_multipleErrorsReported(self): |
- """ |
- If more than one cleanup fails, then the test should fail with more |
- than one error. |
- """ |
- self.test.addCleanup(self.test.fail, 'foo') |
- self.test.addCleanup(self.test.fail, 'bar') |
- self.test.run(self.result) |
- self.assertEqual(['setUp', 'runTest', 'tearDown'], |
- self.test.log) |
- self.assertEqual(2, len(self.result.errors)) |
- [(test1, error1), (test2, error2)] = self.result.errors |
- self.assertEqual(test1, self.test) |
- self.assertEqual(test2, self.test) |
- self.assertEqual(error1.getErrorMessage(), 'bar') |
- self.assertEqual(error2.getErrorMessage(), 'foo') |
- |
- |
- |
-class TestSuiteClearing(unittest.TestCase): |
- """ |
- Tests for our extension that allows us to clear out a L{TestSuite}. |
- """ |
- |
- |
- def test_clearSuite(self): |
- """ |
- Calling L{unittest._clearSuite} on a populated L{TestSuite} removes |
- all tests. |
- """ |
- suite = unittest.TestSuite() |
- suite.addTest(unittest.TestCase()) |
- # Double check that the test suite actually has something in it. |
- self.assertEqual(1, suite.countTestCases()) |
- unittest._clearSuite(suite) |
- self.assertEqual(0, suite.countTestCases()) |
- |
- |
- def test_clearPyunitSuite(self): |
- """ |
- Calling L{unittest._clearSuite} on a populated standard library |
- L{TestSuite} removes all tests. |
- |
- This test is important since C{_clearSuite} operates by mutating |
- internal variables. |
- """ |
- pyunit = __import__('unittest') |
- suite = pyunit.TestSuite() |
- suite.addTest(unittest.TestCase()) |
- # Double check that the test suite actually has something in it. |
- self.assertEqual(1, suite.countTestCases()) |
- unittest._clearSuite(suite) |
- self.assertEqual(0, suite.countTestCases()) |
- |
- |
- |
-class TestTestDecorator(unittest.TestCase): |
- """ |
- Tests for our test decoration features. |
- """ |
- |
- |
- def assertTestsEqual(self, observed, expected): |
- """ |
- Assert that the given decorated tests are equal. |
- """ |
- self.assertEqual(observed.__class__, expected.__class__, |
- "Different class") |
- observedOriginal = getattr(observed, '_originalTest', None) |
- expectedOriginal = getattr(expected, '_originalTest', None) |
- self.assertIdentical(observedOriginal, expectedOriginal) |
- if observedOriginal is expectedOriginal is None: |
- self.assertIdentical(observed, expected) |
- |
- |
- def assertSuitesEqual(self, observed, expected): |
- """ |
- Assert that the given test suites with decorated tests are equal. |
- """ |
- self.assertEqual(observed.__class__, expected.__class__, |
- "Different class") |
- self.assertEqual(len(observed._tests), len(expected._tests), |
- "Different number of tests.") |
- for observedTest, expectedTest in zip(observed._tests, |
- expected._tests): |
- if getattr(observedTest, '_tests', None) is not None: |
- self.assertSuitesEqual(observedTest, expectedTest) |
- else: |
- self.assertTestsEqual(observedTest, expectedTest) |
- |
- |
- def test_usesAdaptedReporterWithRun(self): |
- """ |
- For decorated tests, C{run} uses a result adapter that preserves the |
- test decoration for calls to C{addError}, C{startTest} and the like. |
- |
- See L{reporter._AdaptedReporter}. |
- """ |
- test = unittest.TestCase() |
- decoratedTest = unittest.TestDecorator(test) |
- result = LoggingReporter() |
- decoratedTest.run(result) |
- self.assertTestsEqual(result.test, decoratedTest) |
- |
- |
- def test_usesAdaptedReporterWithCall(self): |
- """ |
- For decorated tests, C{__call__} uses a result adapter that preserves |
- the test decoration for calls to C{addError}, C{startTest} and the |
- like. |
- |
- See L{reporter._AdaptedReporter}. |
- """ |
- test = unittest.TestCase() |
- decoratedTest = unittest.TestDecorator(test) |
- result = LoggingReporter() |
- decoratedTest(result) |
- self.assertTestsEqual(result.test, decoratedTest) |
- |
- |
- def test_decorateSingleTest(self): |
- """ |
- Calling L{decorate} on a single test case returns the test case |
- decorated with the provided decorator. |
- """ |
- test = unittest.TestCase() |
- decoratedTest = unittest.decorate(test, unittest.TestDecorator) |
- self.assertTestsEqual(unittest.TestDecorator(test), decoratedTest) |
- |
- |
- def test_decorateTestSuite(self): |
- """ |
- Calling L{decorate} on a test suite will return a test suite with |
- each test decorated with the provided decorator. |
- """ |
- test = unittest.TestCase() |
- suite = unittest.TestSuite([test]) |
- decoratedTest = unittest.decorate(suite, unittest.TestDecorator) |
- self.assertSuitesEqual( |
- decoratedTest, unittest.TestSuite([unittest.TestDecorator(test)])) |
- |
- |
- def test_decorateInPlaceMutatesOriginal(self): |
- """ |
- Calling L{decorate} on a test suite will mutate the original suite. |
- """ |
- test = unittest.TestCase() |
- suite = unittest.TestSuite([test]) |
- decoratedTest = unittest.decorate( |
- suite, unittest.TestDecorator) |
- self.assertSuitesEqual( |
- decoratedTest, unittest.TestSuite([unittest.TestDecorator(test)])) |
- self.assertSuitesEqual( |
- suite, unittest.TestSuite([unittest.TestDecorator(test)])) |
- |
- |
- def test_decorateTestSuiteReferences(self): |
- """ |
- When decorating a test suite in-place, the number of references to the |
- test objects in that test suite should stay the same. |
- |
- Previously, L{unittest.decorate} recreated a test suite, so the |
- original suite kept references to the test objects. This test is here |
- to ensure the problem doesn't reappear again. |
- """ |
- getrefcount = getattr(sys, 'getrefcount', None) |
- if getrefcount is None: |
- raise unittest.SkipTest( |
- "getrefcount not supported on this platform") |
- test = unittest.TestCase() |
- suite = unittest.TestSuite([test]) |
- count1 = getrefcount(test) |
- decoratedTest = unittest.decorate(suite, unittest.TestDecorator) |
- count2 = getrefcount(test) |
- self.assertEquals(count1, count2) |
- |
- |
- def test_decorateNestedTestSuite(self): |
- """ |
- Calling L{decorate} on a test suite with nested suites will return a |
- test suite that maintains the same structure, but with all tests |
- decorated. |
- """ |
- test = unittest.TestCase() |
- suite = unittest.TestSuite([unittest.TestSuite([test])]) |
- decoratedTest = unittest.decorate(suite, unittest.TestDecorator) |
- expected = unittest.TestSuite( |
- [unittest.TestSuite([unittest.TestDecorator(test)])]) |
- self.assertSuitesEqual(decoratedTest, expected) |
- |
- |
- def test_decorateDecoratedSuite(self): |
- """ |
- Calling L{decorate} on a test suite with already-decorated tests |
- decorates all of the tests in the suite again. |
- """ |
- test = unittest.TestCase() |
- decoratedTest = unittest.decorate(test, unittest.TestDecorator) |
- redecoratedTest = unittest.decorate(decoratedTest, |
- unittest.TestDecorator) |
- self.assertTestsEqual(redecoratedTest, |
- unittest.TestDecorator(decoratedTest)) |
- |
- |
- def test_decoratePreservesSuite(self): |
- """ |
- Tests can be in non-standard suites. L{decorate} preserves the |
- non-standard suites when it decorates the tests. |
- """ |
- test = unittest.TestCase() |
- suite = runner.DestructiveTestSuite([test]) |
- decorated = unittest.decorate(suite, unittest.TestDecorator) |
- self.assertSuitesEqual( |
- decorated, |
- runner.DestructiveTestSuite([unittest.TestDecorator(test)])) |
- |
- |
-class TestMonkeyPatchSupport(unittest.TestCase): |
- """ |
- Tests for the patch() helper method in L{unittest.TestCase}. |
- """ |
- |
- |
- def setUp(self): |
- self.originalValue = 'original' |
- self.patchedValue = 'patched' |
- self.objectToPatch = self.originalValue |
- self.test = unittest.TestCase() |
- |
- |
- def test_patch(self): |
- """ |
- Calling C{patch()} on a test monkey patches the specified object and |
- attribute. |
- """ |
- self.test.patch(self, 'objectToPatch', self.patchedValue) |
- self.assertEqual(self.objectToPatch, self.patchedValue) |
- |
- |
- def test_patchRestoredAfterRun(self): |
- """ |
- Any monkey patches introduced by a test using C{patch()} are reverted |
- after the test has run. |
- """ |
- self.test.patch(self, 'objectToPatch', self.patchedValue) |
- self.test.run(reporter.Reporter()) |
- self.assertEqual(self.objectToPatch, self.originalValue) |
- |
- |
- def test_revertDuringTest(self): |
- """ |
- C{patch()} return a L{monkey.MonkeyPatcher} object that can be used to |
- restore the original values before the end of the test. |
- """ |
- patch = self.test.patch(self, 'objectToPatch', self.patchedValue) |
- patch.restore() |
- self.assertEqual(self.objectToPatch, self.originalValue) |
- |
- |
- def test_revertAndRepatch(self): |
- """ |
- The returned L{monkey.MonkeyPatcher} object can re-apply the patch |
- during the test run. |
- """ |
- patch = self.test.patch(self, 'objectToPatch', self.patchedValue) |
- patch.restore() |
- patch.patch() |
- self.assertEqual(self.objectToPatch, self.patchedValue) |
- |
- |
- def test_successivePatches(self): |
- """ |
- Successive patches are applied and reverted just like a single patch. |
- """ |
- self.test.patch(self, 'objectToPatch', self.patchedValue) |
- self.assertEqual(self.objectToPatch, self.patchedValue) |
- self.test.patch(self, 'objectToPatch', 'second value') |
- self.assertEqual(self.objectToPatch, 'second value') |
- self.test.run(reporter.Reporter()) |
- self.assertEqual(self.objectToPatch, self.originalValue) |
- |
- |
- |
-class TestIterateTests(unittest.TestCase): |
- """ |
- L{_iterateTests} returns a list of all test cases in a test suite or test |
- case. |
- """ |
- |
- def test_iterateTestCase(self): |
- """ |
- L{_iterateTests} on a single test case returns a list containing that |
- test case. |
- """ |
- test = unittest.TestCase() |
- self.assertEqual([test], list(unittest._iterateTests(test))) |
- |
- |
- def test_iterateSingletonTestSuite(self): |
- """ |
- L{_iterateTests} on a test suite that contains a single test case |
- returns a list containing that test case. |
- """ |
- test = unittest.TestCase() |
- suite = runner.TestSuite([test]) |
- self.assertEqual([test], list(unittest._iterateTests(suite))) |
- |
- |
- def test_iterateNestedTestSuite(self): |
- """ |
- L{_iterateTests} returns tests that are in nested test suites. |
- """ |
- test = unittest.TestCase() |
- suite = runner.TestSuite([runner.TestSuite([test])]) |
- self.assertEqual([test], list(unittest._iterateTests(suite))) |
- |
- |
- def test_iterateIsLeftToRightDepthFirst(self): |
- """ |
- L{_iterateTests} returns tests in left-to-right, depth-first order. |
- """ |
- test = unittest.TestCase() |
- suite = runner.TestSuite([runner.TestSuite([test]), self]) |
- self.assertEqual([test, self], list(unittest._iterateTests(suite))) |