Rev 2373: Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins) in file:///home/robertc/source/baz/test-prereqs/

Robert Collins robertc at robertcollins.net
Thu Mar 22 21:43:45 GMT 2007


At file:///home/robertc/source/baz/test-prereqs/

------------------------------------------------------------
revno: 2373
revision-id: robertc at robertcollins.net-20070322214342-58nmsg7pvh6ghc8b
parent: robertc at robertcollins.net-20070322121903-8sqxzfr5eqvsx5yp
committer: Robert Collins <robertc at robertcollins.net>
branch nick: test-prereqs
timestamp: Fri 2007-03-23 08:43:42 +1100
message:
  Allow per-test-fixture feature requirements via 'requireFeature'.(Robert Collins)
modified:
  bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2007-03-22 12:19:03 +0000
+++ b/bzrlib/tests/__init__.py	2007-03-22 21:43:42 +0000
@@ -231,11 +231,13 @@
             setKeepLogfile()
 
     def addError(self, test, err):
+        self.extractBenchmarkTime(test)
+        self._cleanupLogFile(test)
         if isinstance(err[1], TestSkipped):
             return self.addSkipped(test, err)
+        elif isinstance(err[1], UnavailableFeature):
+            return self.addNotSupported(test, err[1].args[0])
         unittest.TestResult.addError(self, test, err)
-        self._cleanupLogFile(test)
-        self.extractBenchmarkTime(test)
         self.error_count += 1
         self.report_error(test, err)
         if self.stop_early:
@@ -272,7 +274,6 @@
         unittest.TestResult.addSuccess(self, test)
 
     def addSkipped(self, test, skip_excinfo):
-        self.extractBenchmarkTime(test)
         self.report_skip(test, skip_excinfo)
         # seems best to treat this as success from point-of-view of unittest
         # -- it actually does nothing so it barely matters :)
@@ -323,14 +324,14 @@
         ExtendedTestResult.__init__(self, stream, descriptions, verbosity,
             bench_history, num_tests)
         if pb is None:
-            self.pb = ui.ui_factory.nested_progress_bar()
+            self.pb = self.ui.nested_progress_bar()
             self._supplied_pb = False
         else:
             self.pb = pb
             self._supplied_pb = True
         self.pb.show_pct = False
         self.pb.show_spinner = False
-        self.pb.show_eta = False, 
+        self.pb.show_eta = False,
         self.pb.show_count = False
         self.pb.show_bar = False
 
@@ -612,6 +613,13 @@
     """
 
 
+class UnavailableFeature(Exception):
+    """A feature required for this test was not available.
+
+    The feature should be used to construct the exception.
+    """
+
+
 class CommandFailed(Exception):
     pass
 
@@ -1129,6 +1137,14 @@
         """Shortcut that splits cmd into words, runs, and returns stdout"""
         return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
 
+    def requireFeature(self, feature):
+        """This test requires a specific feature is available.
+
+        :raises UnavailableFeature: When feature is not available.
+        """
+        if not feature.available():
+            raise UnavailableFeature(feature)
+
     def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None,
                          working_dir=None):
         """Invoke bzr and return (stdout, stderr).

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2007-03-22 12:19:03 +0000
+++ b/bzrlib/tests/test_selftest.py	2007-03-22 21:43:42 +0000
@@ -48,6 +48,7 @@
                           TestSkipped,
                           TestSuite,
                           TextTestRunner,
+                          UnavailableFeature,
                           )
 from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
 from bzrlib.tests.TestUtil import _load_module_by_name
@@ -853,6 +854,26 @@
             ],
             pb.calls[1:])
     
+    def test_unavailable_exception(self):
+        """An UnavailableFeature being raised should invoke addNotSupported."""
+        class InstrumentedTestResult(ExtendedTestResult):
+
+            def report_test_start(self, test): pass
+            def addNotSupported(self, test, feature):
+                self._call = test, feature
+        result = InstrumentedTestResult(None, None, None, None)
+        feature = Feature()
+        def test_function():
+            raise UnavailableFeature(feature)
+        test = unittest.FunctionTestCase(test_function)
+        test.run(result)
+        # it should invoke 'addNotSupported'.
+        self.assertEqual(2, len(result._call))
+        self.assertEqual(test, result._call[0])
+        self.assertEqual(feature, result._call[1])
+        # and not count as an error
+        self.assertEqual(0, result.error_count)
+
 
 class TestRunner(TestCase):
 
@@ -991,15 +1012,11 @@
         result = self.run_test_runner(runner, test)
         lines = stream.getvalue().splitlines()
         self.assertEqual([
-            '',
-            '----------------------------------------------------------------------',
-            'Ran 2 tests in 0.000s',
-            '',
             'OK',
             "Missing feature 'Feature1' skipped 1 tests.",
             "Missing feature 'Feature2' skipped 1 tests.",
             ],
-            lines)
+            lines[-3:])
 
     def test_bench_history(self):
         # tests that the running the benchmark produces a history file
@@ -1170,6 +1187,20 @@
         """Self.knownFailure() should raise a KnownFailure exception."""
         self.assertRaises(KnownFailure, self.knownFailure, "A Failure")
 
+    def test_requireFeature_available(self):
+        """self.requireFeature(available) is a no-op."""
+        class Available(Feature):
+            def _probe(self):return True
+        feature = Available()
+        self.requireFeature(feature)
+
+    def test_requireFeature_unavailable(self):
+        """self.requireFeature(unavailable) raises UnavailableFeature."""
+        class Unavailable(Feature):
+            def _probe(self):return False
+        feature = Unavailable()
+        self.assertRaises(UnavailableFeature, self.requireFeature, feature)
+
     def test_run_no_parameters(self):
         test = SampleTestCase('_test_pass')
         test.run()
@@ -1430,3 +1461,11 @@
             pass
         feature = NamedFeature()
         self.assertEqual('NamedFeature', str(feature))
+
+
+class TestUnavailableFeature(TestCase):
+
+    def test_access_feature(self):
+        feature = Feature()
+        exception = UnavailableFeature(feature)
+        self.assertIs(feature, exception.args[0])



More information about the bazaar-commits mailing list