[conduit: 34/138] Test all datatypes we know about



commit 6bcf4577d9f11b56e31c6d2ddd31675b8c84fdc5
Author: John Carr <john carr unrouted co uk>
Date:   Wed Apr 29 01:38:02 2009 -0700

    Test all datatypes we know about
---
 test/soup/__init__.py          |    5 +---
 test/soup/data/__init__.py     |   37 +++++++++++++++++++++++++++-
 test/soup/test_dataprovider.py |    1 +
 test/soup/test_datatypes.py    |   52 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 90 insertions(+), 5 deletions(-)

diff --git a/test/soup/__init__.py b/test/soup/__init__.py
index 535e56d..2289b18 100644
--- a/test/soup/__init__.py
+++ b/test/soup/__init__.py
@@ -46,7 +46,7 @@ class TestCase(unittest.TestCase):
             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):
+    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")
         conduit.GLOBALS.mappingDB = MappingDB.MappingDB(dbFile)
@@ -60,9 +60,6 @@ class TestCase(unittest.TestCase):
         self.sync_manager = conduit.Synchronization.SyncManager(self.type_converter)
         conduit.GLOBALS.syncManager = self.sync_manager
 
-    def tearDown(self):
-        pass
-
     def get_dataprovider(self, name):
         wrapper = None
         for dp in self.modules.get_all_modules():
diff --git a/test/soup/data/__init__.py b/test/soup/data/__init__.py
index 3f2ac98..474dcf7 100644
--- a/test/soup/data/__init__.py
+++ b/test/soup/data/__init__.py
@@ -5,6 +5,10 @@ class DataWrapper(object):
     This class provides a wrapper around some test data.
     """
 
+    @classmethod
+    def name(cls):
+        return cls.__name__
+
     def get_data_dir(self):
         return os.path.join(os.path.dirname(__file__),"..","..","python-tests","data")
 
@@ -14,6 +18,37 @@ class DataWrapper(object):
         for i in glob.glob(os.path.join(self.get_data_dir(),glob_str)):
             yield os.path.abspath(i)
 
-    def get_all(self):
+    def iter_samples(self):
+        """ Yield DataType objects containing sample data """
+        raise NotImplementedError
+
+    def generate_sample(self):
+        """ Generate a single DataType object with random data """
+        raise NotImplementedError
+
+    def mutate_sample(self, obj):
+        """ Modify a DataType object randomly """
         raise NotImplementedError
 
+def load_modules():
+    basepath = os.path.dirname(__file__)
+    for root, dirs, files in os.walk(basepath):
+        for dir in dirs:
+            if dir[:1] != ".":
+                load_module(dir)
+        for file in files:
+            if file.endswith(".py") and not file.startswith("__"):
+                load_module(file[:-3])
+        break
+
+def load_module(module):
+    if sys.modules.has_key(module):
+        reload(sys.modules[module])
+    else:
+        __import__("soup.data", {}, {}, [module])
+
+def get_all():
+    if len(DataWrapper.__subclasses__()) == 0:
+        load_modules()
+    return DataWrapper.__subclasses__()
+
diff --git a/test/soup/test_dataprovider.py b/test/soup/test_dataprovider.py
index 13018bf..c993204 100644
--- a/test/soup/test_dataprovider.py
+++ b/test/soup/test_dataprovider.py
@@ -10,6 +10,7 @@ def make_testcase(wrp):
 
         def setUp(self):
             super(TestDataprovider, self).setUp()
+            self.setUpSync()
             self.wrapper = self.wrapperclass(self)
             self.dp = self.wrapper.dp
             self.data = self.wrapper.dataclass()
diff --git a/test/soup/test_datatypes.py b/test/soup/test_datatypes.py
new file mode 100644
index 0000000..f76aec3
--- /dev/null
+++ b/test/soup/test_datatypes.py
@@ -0,0 +1,52 @@
+import soup
+
+import pickle
+
+def make_testcase(wrp):
+    class TestDatatype(soup.TestCase):
+        wrapperclass = wrp
+
+        @classmethod
+        def name(self):
+            return "TestDatatype%s" % self.wrapperclass.name()
+
+        def setUp(self):
+            super(TestDatatype, self).setUp()
+            self.wrapper = self.wrapperclass()
+
+        def test_uid(self):
+            """ Datatype should implemenent get_UID """
+            obj = self.wrapper.iter_samples().next()
+            assert obj.get_UID != None
+
+        def test_rid(self):
+            """ Datatype should implement get_rid """
+            obj = self.wrapper.iter_samples().next()
+            assert obj.get_rid() != None
+
+        def test_pickle(self):
+            """ Should be able to pickle a Datatype """
+            obj = self.wrapper.iter_samples().next()
+            pickled = pickle.dumps(obj)
+            clone = pickle.loads(pickled)
+
+            assert type(obj) == type(clone)
+            assert obj.get_UID() == clone.get_UID()
+            assert obj.get_mtime() == clone.get_mtime()
+            assert obj.get_hash() == clone.get_hash()
+            assert obj.get_rid() == clone.get_rid()
+
+    return TestDatatype
+
+
+# Generate TestCase objects for each datatype wrapper
+self = soup.get_module(__name__)
+for wrapper in soup.data.get_all():
+    testklass = make_testcase(wrapper)
+    setattr(self, testklass.name(), testklass)
+
+
+# Allow people to run the test case directly
+if __name__ == "__main__":
+    import unittest
+    unittest.main()



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