Rev 2371: Add operating system Feature model to bzrlib.tests to allow writing tests in file:///home/robertc/source/baz/test-prereqs/

Robert Collins robertc at robertcollins.net
Thu Mar 22 10:54:55 GMT 2007


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

------------------------------------------------------------
revno: 2371
revision-id: robertc at robertcollins.net-20070322105438-gt9qu83u9ml5aubo
parent: robertc at robertcollins.net-20070322100744-96m81fcue8hgsfnd
committer: Robert Collins <robertc at robertcollins.net>
branch nick: test-prereqs
timestamp: Thu 2007-03-22 21:54:38 +1100
message:
  Add operating system Feature model to bzrlib.tests to allow writing tests
  that can declare their needed dependencies and be cleanly disabled.
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 10:07:44 +0000
+++ b/bzrlib/tests/__init__.py	2007-03-22 10:54:38 +0000
@@ -2156,3 +2156,31 @@
             if not quiet:
                 print 'delete directory:', i
             shutil.rmtree(i)
+
+
+class Feature(object):
+    """An operating system Feature."""
+
+    def __init__(self):
+        self._available = None
+
+    def available(self):
+        """Is the feature available?
+
+        :return: True if the feature is available.
+        """
+        if self._available is None:
+            self._available = self._probe()
+        return self._available
+
+    def _probe(self):
+        """Implement this method in concrete features.
+
+        :return: True if the feature is available.
+        """
+        raise NotImplementedError
+
+    def __str__(self):
+        if getattr(self, 'feature_name', None):
+            return self.feature_name()
+        return self.__class__.__name__

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2007-03-22 10:07:44 +0000
+++ b/bzrlib/tests/test_selftest.py	2007-03-22 10:54:38 +0000
@@ -39,6 +39,7 @@
 from bzrlib.tests import (
                           ChrootedTestCase,
                           ExtendedTestResult,
+                          Feature,
                           KnownFailure,
                           TestCase,
                           TestCaseInTempDir,
@@ -1296,3 +1297,36 @@
         # a KnownFailure is an assertion error for compatability with unaware
         # runners.
         self.assertIsInstance(KnownFailure(""), AssertionError)
+
+
+class TestFeature(TestCase):
+
+    def test_caching(self):
+        """Feature._probe is called by the feature at most once."""
+        class InstrumentedFeature(Feature):
+            def __init__(self):
+                Feature.__init__(self)
+                self.calls = []
+            def _probe(self):
+                self.calls.append('_probe')
+                return False
+        feature = InstrumentedFeature()
+        feature.available()
+        self.assertEqual(['_probe'], feature.calls)
+        feature.available()
+        self.assertEqual(['_probe'], feature.calls)
+
+    def test_named_str(self):
+        """Feature.__str__ should thunk to feature_name()."""
+        class NamedFeature(Feature):
+            def feature_name(self):
+                return 'symlinks'
+        feature = NamedFeature()
+        self.assertEqual('symlinks', str(feature))
+
+    def test_default_str(self):
+        """Feature.__str__ should default to __class__.__name__."""
+        class NamedFeature(Feature):
+            pass
+        feature = NamedFeature()
+        self.assertEqual('NamedFeature', str(feature))



More information about the bazaar-commits mailing list