[conduit: 117/138] Skip tests if prereqs for running are not met



commit 7d27f1943d33f65681a6bb42c69a35d49f123968
Author: John Carr <john carr unrouted co uk>
Date:   Wed May 6 08:59:02 2009 -0700

    Skip tests if prereqs for running are not met
---
 test/soup/__init__.py             |    8 ++++++++
 test/soup/data/__init__.py        |    2 ++
 test/soup/modules/__init__.py     |    2 ++
 test/soup/modules/ipod.py         |   22 ++++++++++++++++++++--
 test/soup/test_dataprovider.py    |    3 +++
 test/soup/test_datatypes.py       |    3 +++
 test/soup/test_synchronization.py |    6 ++++++
 test/soup/utils/test.py           |    4 ++--
 8 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/test/soup/__init__.py b/test/soup/__init__.py
index 8a5640d..ceb21c1 100644
--- a/test/soup/__init__.py
+++ b/test/soup/__init__.py
@@ -62,11 +62,19 @@ class TestCase(unittest.TestCase):
         """ Returns the name of the class and the test this particular instance will run """
         return self.name() + "." + self.testMethodName
 
+    def requires(self):
+        """ Yields feature objects that we depend on to run this test, such as an internet connection or python-gpod """
+        return []
+
     def shortDescription(self):
         """ Describe the test that is currently running
             Returns something like TestClass.test_function: Tests how good Conduit is """
         return "%s.%s: %s" % (self.name(), self.testMethodName, super(TestCase, self).shortDescription())
 
+    def setUp(self):
+        for feature in self.requires():
+            feature.require()
+
     def setUpSync(self):
         #Set up our own mapping DB so we dont pollute the global one
         dbFile = os.path.join(os.environ['TEST_DIRECTORY'],Utils.random_string()+".db")
diff --git a/test/soup/data/__init__.py b/test/soup/data/__init__.py
index 8784c61..0b552b2 100644
--- a/test/soup/data/__init__.py
+++ b/test/soup/data/__init__.py
@@ -9,6 +9,8 @@ class DataWrapper(object):
     This class provides a wrapper around some test data.
     """
 
+    requires = []
+
     @classmethod
     def name(cls):
         return cls.__name__
diff --git a/test/soup/modules/__init__.py b/test/soup/modules/__init__.py
index 0a86020..7bb6495 100644
--- a/test/soup/modules/__init__.py
+++ b/test/soup/modules/__init__.py
@@ -4,6 +4,8 @@ from soup.utils.pluginloader import PluginLoader
 
 class ModuleWrapper(object):
 
+    requires = []
+
     def __init__(self, conduit):
         self.conduit = conduit
         self.dp = self.create_dataprovider()
diff --git a/test/soup/modules/ipod.py b/test/soup/modules/ipod.py
index b11f262..61edf83 100644
--- a/test/soup/modules/ipod.py
+++ b/test/soup/modules/ipod.py
@@ -13,11 +13,24 @@ import conduit.utils as Utils
 
 import uuid
 import shutil
-import gpod
 
-class iPodWrapper(object):
 
+class _GpodModule(soup.Feature):
+
+    def probe(self):
+        import pdb
+        pdb.set_trace()
+        try:
+            import gpod
+            return True
+        except:
+            return False
+
+GpodModule = _GpodModule()
+
+class iPodWrapper(object):
     def create_dataprovider(self):
+        import gpod
         self.folder = Utils.new_tempdir()
         assert gpod.gpod.itdb_init_ipod(self.folder, "MA450", "Test iPod", None)
         return self.klass(self.folder, str(uuid.uuid4()))
@@ -28,20 +41,25 @@ class iPodWrapper(object):
 class iPodNote(soup.modules.ModuleWrapper, iPodWrapper):
     klass = iPodModule.IPodNoteTwoWay
     dataclass = NoteWrapper
+    requires = [GpodModule]
 
 class iPodContacts(soup.modules.ModuleWrapper, iPodWrapper):
     klass = iPodModule.IPodContactsTwoWay
     dataclass = ContactWrapper
+    requires = [GpodModule]
 
 class iPodCalendar(soup.modules.ModuleWrapper, iPodWrapper):
     klass = iPodModule.IPodCalendarTwoWay
     dataclass = EventWrapper
+    requires = [GpodModule]
 
 class iPodPhoto(soup.modules.ModuleWrapper, iPodWrapper):
     klass = iPodModule.IPodPhotoSink
     dataclass = PhotoWrapper
+    requires = [GpodModule]
 
 class iPodMusic(soup.modules.ModuleWrapper, iPodWrapper):
     klass = iPodModule.IPodMusicTwoWay
     dataclass = MusicWrapper
+    requires = [GpodModule]
 
diff --git a/test/soup/test_dataprovider.py b/test/soup/test_dataprovider.py
index 91f03da..0ca4d38 100644
--- a/test/soup/test_dataprovider.py
+++ b/test/soup/test_dataprovider.py
@@ -9,6 +9,9 @@ def make_testcase(wrp):
         def name(self):
             return "TestDataProvider%s" % self.wrapperclass.name()
 
+        def requires(self):
+            return self.wrapperclass.requires
+
         def setUp(self):
             super(TestDataprovider, self).setUp()
             self.wrapper = self.wrapperclass(self)
diff --git a/test/soup/test_datatypes.py b/test/soup/test_datatypes.py
index b93360a..3a8410f 100644
--- a/test/soup/test_datatypes.py
+++ b/test/soup/test_datatypes.py
@@ -11,6 +11,9 @@ def make_testcase(wrp):
         def name(self):
             return "TestDatatype%s" % self.wrapperclass.name()
 
+        def requires(self):
+            return self.wrapperclass.requires
+
         def setUp(self):
             super(TestDatatype, self).setUp()
             self.wrapper = self.wrapperclass()
diff --git a/test/soup/test_synchronization.py b/test/soup/test_synchronization.py
index 3c2849a..d992184 100644
--- a/test/soup/test_synchronization.py
+++ b/test/soup/test_synchronization.py
@@ -15,7 +15,13 @@ def make_testcase(src, src_data, snk, snk_data):
         def name(self):
             return "TestSynchronization%s%s" % (self.source_class.name(), self.sink_class.name())
 
+        def requires(self):
+            for obj in (self.source_class, self.source_data_class, self.sink_class, self.sink_data_class):
+                for thing in obj.requires:
+                    yield thing
+
         def setUp(self):
+            super(TestSynchronization, self).setUp()
             self.setUpSync()
 
             self.source = self.source_class(self)
diff --git a/test/soup/utils/test.py b/test/soup/utils/test.py
index 62c5820..2ebec6c 100644
--- a/test/soup/utils/test.py
+++ b/test/soup/utils/test.py
@@ -28,8 +28,8 @@ class TestResult(unittest.TestResult):
         self.report_test_stop(test)
 
     def addError(self, test, err):
-        if isinstance(err, UnavailableFeature):
-            self.addSkipped(self, test)
+        if isinstance(err[1], UnavailableFeature):
+            self.addSkipped(test)
         else:
             super(TestResult, self).addError(test, err)
             self.report_error(test)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]