Rev 4784: Switch reporting of KnownFailure to be Python2.7 compatible. in http://bazaar.launchpad.net/~lifeless/bzr/subunit

Robert Collins robertc at robertcollins.net
Sun Nov 1 05:42:09 GMT 2009


At http://bazaar.launchpad.net/~lifeless/bzr/subunit

------------------------------------------------------------
revno: 4784
revision-id: robertc at robertcollins.net-20091101054157-1pddq7pqwsn5f7f0
parent: robertc at robertcollins.net-20091101050147-sj4ltnewftl0lw98
committer: Robert Collins <robertc at robertcollins.net>
branch nick: subunit
timestamp: Sun 2009-11-01 16:41:57 +1100
message:
  Switch reporting of KnownFailure to be Python2.7 compatible.
=== modified file 'NEWS'
--- a/NEWS	2009-11-01 05:01:47 +0000
+++ b/NEWS	2009-11-01 05:41:57 +0000
@@ -36,6 +36,9 @@
 Testing
 *******
 
+* KnownFailure is now signalled to ``ExtendedTestResult`` using the same
+  method that Python 2.7 uses - ``addExpectedFailure``. (Robert Collins)
+
 * TestNotApplicable is now handled within the TestCase.run method rather
   than being looked for within ``ExtendedTestResult.addError``. This
   provides better handling with other ``TestResult`` objects, degrading to

=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2009-11-01 05:01:47 +0000
+++ b/bzrlib/tests/__init__.py	2009-11-01 05:41:57 +0000
@@ -312,16 +312,13 @@
         Called from the TestCase run() method when the test
         fails because e.g. an assert() method failed.
         """
-        if isinstance(err[1], KnownFailure):
-            return self._addKnownFailure(test, err)
-        else:
-            self._post_mortem()
-            unittest.TestResult.addFailure(self, test, err)
-            self.failure_count += 1
-            self.report_failure(test, err)
-            if self.stop_early:
-                self.stop()
-            self._cleanupLogFile(test)
+        self._post_mortem()
+        unittest.TestResult.addFailure(self, test, err)
+        self.failure_count += 1
+        self.report_failure(test, err)
+        if self.stop_early:
+            self.stop()
+        self._cleanupLogFile(test)
 
     def addSuccess(self, test):
         """Tell result that test completed successfully.
@@ -339,7 +336,7 @@
         unittest.TestResult.addSuccess(self, test)
         test._log_contents = ''
 
-    def _addKnownFailure(self, test, err):
+    def addExpectedFailure(self, test, err):
         self.known_failure_count += 1
         self.report_known_failure(test, err)
 
@@ -1573,6 +1570,14 @@
         else:
             addSkip(self, reason)
 
+    def _do_known_failure(self, result):
+        err = sys.exc_info()
+        addExpectedFailure = getattr(result, 'addExpectedFailure', None)
+        if addExpectedFailure is not None:
+            addExpectedFailure(self, err)
+        else:
+            result.addSuccess(self)
+
     def _do_not_applicable(self, result, e):
         addNotApplicable = getattr(result, 'addNotApplicable', None)
         if addNotApplicable is not None:
@@ -1622,6 +1627,10 @@
                 except KeyboardInterrupt:
                     self._runCleanups()
                     raise
+                except KnownFailure:
+                    self._do_known_failure(result)
+                    self.tearDown()
+                    return
                 except TestNotApplicable, e:
                     self._do_not_applicable(result, e)
                     self.tearDown()
@@ -1643,6 +1652,8 @@
                 try:
                     testMethod()
                     ok = True
+                except KnownFailure:
+                    self._do_known_failure(result)
                 except self.failureException:
                     result.addFailure(self, sys.exc_info())
                 except TestNotApplicable, e:
@@ -3379,8 +3390,8 @@
     def addFailure(self, test, err):
         known = self._error_looks_like('KnownFailure: ', err)
         if known is not None:
-            self.result._addKnownFailure(test, [KnownFailure,
-                                                KnownFailure(known), None])
+            self.result.addExpectedFailure(test,
+                [KnownFailure, KnownFailure(known), None])
         else:
             self.result.addFailure(test, err)
 

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2009-11-01 05:01:47 +0000
+++ b/bzrlib/tests/test_selftest.py	2009-11-01 05:41:57 +0000
@@ -827,9 +827,10 @@
             def report_known_failure(self, test, err):
                 self._call = test, err
         result = InstrumentedTestResult(None, None, None, None)
-        def test_function():
-            raise tests.KnownFailure('failed!')
-        test = unittest.FunctionTestCase(test_function)
+        class Test(tests.TestCase):
+            def test_function(self):
+                raise tests.KnownFailure('failed!')
+        test = Test("test_function")
         test.run(result)
         # it should invoke 'report_known_failure'.
         self.assertEqual(2, len(result._call))
@@ -952,7 +953,7 @@
                                              verbosity=1)
         test = self.get_passing_test()
         err = (tests.KnownFailure, tests.KnownFailure('foo'), None)
-        result._addKnownFailure(test, err)
+        result.addExpectedFailure(test, err)
         self.assertFalse(result.wasStrictlySuccessful())
         self.assertEqual(None, result._extractBenchmarkTime(test))
 
@@ -1015,10 +1016,11 @@
     def test_known_failure_failed_run(self):
         # run a test that generates a known failure which should be printed in
         # the final output when real failures occur.
-        def known_failure_test():
-            raise tests.KnownFailure('failed')
+        class Test(tests.TestCase):
+            def known_failure_test(self):
+                raise tests.KnownFailure('failed')
         test = unittest.TestSuite()
-        test.addTest(unittest.FunctionTestCase(known_failure_test))
+        test.addTest(Test("known_failure_test"))
         def failing_test():
             raise AssertionError('foo')
         test.addTest(unittest.FunctionTestCase(failing_test))
@@ -1042,10 +1044,12 @@
             )
 
     def test_known_failure_ok_run(self):
-        # run a test that generates a known failure which should be printed in the final output.
-        def known_failure_test():
-            raise tests.KnownFailure('failed')
-        test = unittest.FunctionTestCase(known_failure_test)
+        # run a test that generates a known failure which should be printed in
+        # the final output.
+        class Test(tests.TestCase):
+            def known_failure_test(self):
+                raise tests.KnownFailure('failed')
+        test = Test("known_failure_test")
         stream = StringIO()
         runner = tests.TextTestRunner(stream=stream)
         result = self.run_test_runner(runner, test)




More information about the bazaar-commits mailing list