Rev 5393: Do a full test suite against all the subunit permutations. in http://bazaar.launchpad.net/~jameinel/bzr/2.3-filter-tests

John Arbash Meinel john at arbash-meinel.com
Sat Sep 25 20:32:19 BST 2010


At http://bazaar.launchpad.net/~jameinel/bzr/2.3-filter-tests

------------------------------------------------------------
revno: 5393
revision-id: john at arbash-meinel.com-20100925193153-lyy1agn4d0rkgfv6
parent: john at arbash-meinel.com-20100924165327-54m2jfhmz5mo69b3
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.3-filter-tests
timestamp: Sat 2010-09-25 14:31:53 -0500
message:
  Do a full test suite against all the subunit permutations.
-------------- next part --------------
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2010-09-24 16:44:38 +0000
+++ b/bzrlib/tests/__init__.py	2010-09-25 19:31:53 +0000
@@ -4533,10 +4533,20 @@
 try:
     from subunit import TestProtocolClient
     from subunit.test_results import AutoTimingTestResultDecorator
+    class SubUnitBzrProtocolClient(TestProtocolClient):
+
+        def addSuccess(self, test, details=None):
+            # The subunit client always includes the details in the subunit
+            # stream, but we don't want to include it in ours.
+            if 'log' in details:
+                del details['log']
+            return super(SubUnitBzrProtocolClient, self).addSuccess(
+                test, details)
+
     class SubUnitBzrRunner(TextTestRunner):
         def run(self, test):
             result = AutoTimingTestResultDecorator(
-                TestProtocolClient(self.stream))
+                SubUnitBzrProtocolClient(self.stream))
             test.run(result)
             return result
 except ImportError:

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2010-09-24 16:53:27 +0000
+++ b/bzrlib/tests/test_selftest.py	2010-09-25 19:31:53 +0000
@@ -1656,41 +1656,75 @@
         self.assertEqual('original', obj.test_attr)
 
 
+class _MissingFeature(tests.Feature):
+    def _probe(self):
+        return False
+missing_feature = _MissingFeature()
+
+
+def _get_test(name):
+    """Get an instance of a specific example test.
+
+    We protect this in a function so that they don't auto-run in the test
+    suite.
+    """
+
+    class ExampleTests(tests.TestCase):
+
+        def test_fail(self):
+            mutter('this was a failing test')
+            self.fail('this test will fail')
+
+        def test_error(self):
+            mutter('this test errored')
+            raise RuntimeError('gotcha')
+
+        def test_missing_feature(self):
+            mutter('missing the feature')
+            self.requireFeature(missing_feature)
+
+        def test_skip(self):
+            mutter('this test will be skipped')
+            raise tests.TestSkipped('reason')
+
+        def test_success(self):
+            mutter('this test succeeds')
+
+        def test_xfail(self):
+            mutter('test with expected failure')
+            self.knownFailure('this_fails')
+
+        def test_unexpected_success(self):
+            mutter('test with unexpected success')
+            self.expectFailure('should_fail', lambda: None)
+
+    return ExampleTests(name)
+
+
 class TestTestCaseLogDetails(tests.TestCase):
 
-    def _run_test(self, a_test):
+    def _run_test(self, test_name):
+        test = _get_test(test_name)
         result = testtools.TestResult()
-        a_test.run(result)
+        test.run(result)
         return result
 
     def test_fail_has_log(self):
-        class Test(tests.TestCase):
-            def test_fail(self):
-                mutter('this was a failing test')
-                self.fail('this test will fail')
-        result = self._run_test(Test('test_fail'))
+        result = self._run_test('test_fail')
         self.assertEqual(1, len(result.failures))
         result_content = result.failures[0][1]
         self.assertContainsRe(result_content, 'Text attachment: log')
         self.assertContainsRe(result_content, 'this was a failing test')
 
     def test_error_has_log(self):
-        class Test(tests.TestCase):
-            def test_error(self):
-                mutter('this test errored')
-                raise RuntimeError('gotcha')
-        result = self._run_test(Test('test_error'))
+        result = self._run_test('test_error')
         self.assertEqual(1, len(result.errors))
         result_content = result.errors[0][1]
         self.assertContainsRe(result_content, 'Text attachment: log')
         self.assertContainsRe(result_content, 'this test errored')
 
     def test_skip_has_no_log(self):
-        class Test(tests.TestCase):
-            def test_skip(self):
-                mutter('this test will be skipped')
-                raise tests.TestSkipped('reason')
-        result = self._run_test(Test('test_skip'))
+        result = self._run_test('test_skip')
         self.assertEqual(['reason'], result.skip_reasons.keys())
         skips = result.skip_reasons['reason']
         self.assertEqual(1, len(skips))
@@ -1698,40 +1732,24 @@
         self.assertFalse('log' in test.getDetails())
 
     def test_missing_feature_has_no_log(self):
-        class MissingFeature(tests.Feature):
-            def _probe(self):
-                return False
-        feature = MissingFeature()
-        class Test(tests.TestCase):
-            def test_missing_feature(self):
-                mutter('missing the feature')
-                self.requireFeature(feature)
         # testtools doesn't know about addNotSupported, so it just gets
         # considered as a skip
-        result = self._run_test(Test('test_missing_feature'))
-        self.assertEqual([feature], result.skip_reasons.keys())
-        skips = result.skip_reasons[feature]
+        result = self._run_test('test_missing_feature')
+        self.assertEqual([missing_feature], result.skip_reasons.keys())
+        skips = result.skip_reasons[missing_feature]
         self.assertEqual(1, len(skips))
         test = skips[0]
         self.assertFalse('log' in test.getDetails())
 
     def test_xfail_has_no_log(self):
-        class Test(tests.TestCase):
-            def test_xfail(self):
-                mutter('test with expected failure')
-                self.knownFailure('this_fails')
-        result = self._run_test(Test('test_xfail'))
+        result = self._run_test('test_xfail')
         self.assertEqual(1, len(result.expectedFailures))
         result_content = result.expectedFailures[0][1]
         self.assertNotContainsRe(result_content, 'Text attachment: log')
         self.assertNotContainsRe(result_content, 'test with expected failure')
 
     def test_unexpected_success_has_log(self):
-        class Test(tests.TestCase):
-            def test_unexpected_success(self):
-                mutter('test with unexpected success')
-                self.expectFailure('should_fail', lambda: None)
-        result = self._run_test(Test('test_unexpected_success'))
+        result = self._run_test('test_unexpected_success')
         self.assertEqual(1, len(result.unexpectedSuccesses))
         # Inconsistency, unexpectedSuccesses is a list of tests,
         # expectedFailures is a list of reasons?
@@ -2060,24 +2078,75 @@
 
     _test_needs_features = [features.subunit]
 
-    def run_subunit_stream(self, test_suite_factory):
+    def run_subunit_stream(self, test_name):
         from subunit import ProtocolTestCase
+        def factory():
+            return TestUtil.TestSuite([_get_test(test_name)])
         stream = self.run_selftest(runner_class=tests.SubUnitBzrRunner,
-            test_suite_factory=test_suite_factory)
+            test_suite_factory=factory)
         test = ProtocolTestCase(stream)
-        result = unittest.TestResult()
+        result = testtools.TestResult()
         test.run(result)
-        return stream, result
+        content = stream.getvalue()
+        return content, result
+
+    def test_fail_has_log(self):
+        content, result = self.run_subunit_stream('test_fail')
+        self.assertEqual(1, len(result.failures))
+        self.assertContainsRe(content, '(?m)^log$')
+        self.assertContainsRe(content, 'this test will fail')
+
+    def test_error_has_log(self):
+        content, result = self.run_subunit_stream('test_error')
+        self.assertContainsRe(content, '(?m)^log$')
+        self.assertContainsRe(content, 'this test errored')
+
+    def test_skip_has_no_log(self):
+        content, result = self.run_subunit_stream('test_skip')
+        self.assertNotContainsRe(content, '(?m)^log$')
+        self.assertNotContainsRe(content, 'this test will be skipped')
+        self.assertEqual(['reason'], result.skip_reasons.keys())
+        skips = result.skip_reasons['reason']
+        self.assertEqual(1, len(skips))
+        test = skips[0]
+        # RemotedTestCase doesn't preserve the "details"
+        ## self.assertFalse('log' in test.getDetails())
+
+    def test_missing_feature_has_no_log(self):
+        content, result = self.run_subunit_stream('test_missing_feature')
+        self.assertNotContainsRe(content, '(?m)^log$')
+        self.assertNotContainsRe(content, 'missing the feature')
+        self.assertEqual(['_MissingFeature\n'], result.skip_reasons.keys())
+        skips = result.skip_reasons['_MissingFeature\n']
+        self.assertEqual(1, len(skips))
+        test = skips[0]
+        # RemotedTestCase doesn't preserve the "details"
+        ## self.assertFalse('log' in test.getDetails())
+
+    def test_xfail_has_no_log(self):
+        content, result = self.run_subunit_stream('test_xfail')
+        self.assertNotContainsRe(content, '(?m)^log$')
+        self.assertNotContainsRe(content, 'test with expected failure')
+        self.assertEqual(1, len(result.expectedFailures))
+        result_content = result.expectedFailures[0][1]
+        self.assertNotContainsRe(result_content, 'Text attachment: log')
+        self.assertNotContainsRe(result_content, 'test with expected failure')
+
+    def test_unexpected_success_has_log(self):
+        content, result = self.run_subunit_stream('test_unexpected_success')
+        self.assertContainsRe(content, '(?m)^log$')
+        self.assertContainsRe(content, 'test with unexpected success')
+        self.expectFailure('subunit treats "unexpectedSuccess"'
+                           ' as a plain success',
+            self.assertEqual, 1, len(result.unexpectedSuccesses))
+        self.assertEqual(1, len(result.unexpectedSuccesses))
+        test = result.unexpectedSuccesses[0]
+        # RemotedTestCase doesn't preserve the "details"
+        ## self.assertTrue('log' in test.getDetails())
 
     def test_success_has_no_log(self):
-        class Test(tests.TestCase):
-            def test_success(self):
-                mutter('this test succeeds')
-        def factory():
-            return TestUtil.TestSuite([Test('test_success')])
-        stream, result = self.run_subunit_stream(factory)
+        content, result = self.run_subunit_stream('test_success')
         self.assertEqual(1, result.testsRun)
-        content = stream.getvalue()
         self.assertNotContainsRe(content, '(?m)^log$')
         self.assertNotContainsRe(content, 'this test succeeds')
 



More information about the bazaar-commits mailing list