[Checkins] SVN: ZODB/branches/3.5/ DemoStorage was unable to wrap base storages without an '_oid' attribute.

Tres Seaver cvs-admin at zope.org
Thu Jun 15 19:32:30 EDT 2006


Log message for revision 68675:
  DemoStorage was unable to wrap base storages without an '_oid' attribute.
  
  o Most notably, ZEO.ClientStorage (http://www.zope.org/Collectors/Zope/2016).
  
  o Forward port from 3.4 branch.
  

Changed:
  U   ZODB/branches/3.5/NEWS.txt
  U   ZODB/branches/3.5/src/ZEO/tests/testZEO.py
  U   ZODB/branches/3.5/src/ZODB/BaseStorage.py
  U   ZODB/branches/3.5/src/ZODB/tests/testDemoStorage.py

-=-
Modified: ZODB/branches/3.5/NEWS.txt
===================================================================
--- ZODB/branches/3.5/NEWS.txt	2006-06-15 23:29:58 UTC (rev 68674)
+++ ZODB/branches/3.5/NEWS.txt	2006-06-15 23:32:26 UTC (rev 68675)
@@ -24,6 +24,13 @@
   left the commit lock in the acquired state, causing any later attempt
   to commit changes hang.
 
+DemoStorage
+-----------
+
+- (3.5.2b1) DemoStorage was unable to wrap base storages who did not have
+            an '_oid' attribute:  most notably, ZEO.ClientStorage
+            (http://www.zope.org/Collectors/Zope/2016).
+
 TimeStamp
 ---------
 

Modified: ZODB/branches/3.5/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/branches/3.5/src/ZEO/tests/testZEO.py	2006-06-15 23:29:58 UTC (rev 68674)
+++ ZODB/branches/3.5/src/ZEO/tests/testZEO.py	2006-06-15 23:32:26 UTC (rev 68675)
@@ -33,6 +33,8 @@
      PackableStorage, Synchronization, ConflictResolution, RevisionStorage, \
      MTStorage, ReadOnlyStorage
 
+from ZODB.tests.testDemoStorage import DemoStorageWrappedBase
+
 from ZEO.ClientStorage import ClientStorage
 from ZEO.tests import forker, Cache, CommitLockTests, ThreadTests
 
@@ -196,9 +198,42 @@
     def getConfig(self):
         return """<mappingstorage 1/>"""
 
+class DemoStorageWrappedAroundClientStorage(DemoStorageWrappedBase):
+
+    def getConfig(self):
+        return """<mappingstorage 1/>"""
+
+    def _makeBaseStorage(self):
+        logger.info("setUp() %s", self.id())
+        port = get_port()
+        zconf = forker.ZEOConfig(('', port))
+        zport, adminaddr, pid, path = forker.start_zeo_server(self.getConfig(),
+                                                              zconf, port)
+        self._pids = [pid]
+        self._servers = [adminaddr]
+        self._conf_path = path
+        _base = ClientStorage(zport, '1', cache_size=20000000,
+                                      min_disconnect_poll=0.5, wait=1,
+                                      wait_timeout=60)
+        _base.registerDB(DummyDB(), None)
+        return _base
+
+    def tearDown(self):
+        DemoStorageWrappedBase.tearDown(self)
+        os.remove(self._conf_path)
+        for server in self._servers:
+            forker.shutdown_zeo_server(server)
+        if hasattr(os, 'waitpid'):
+            # Not in Windows Python until 2.3
+            for pid in self._pids:
+                os.waitpid(pid, 0)
+
+
 test_classes = [OneTimeTests,
                 FileStorageTests,
-                MappingStorageTests]
+                MappingStorageTests,
+                DemoStorageWrappedAroundClientStorage,
+               ]
 
 def test_suite():
     suite = unittest.TestSuite()

Modified: ZODB/branches/3.5/src/ZODB/BaseStorage.py
===================================================================
--- ZODB/branches/3.5/src/ZODB/BaseStorage.py	2006-06-15 23:29:58 UTC (rev 68674)
+++ ZODB/branches/3.5/src/ZODB/BaseStorage.py	2006-06-15 23:32:26 UTC (rev 68675)
@@ -102,10 +102,11 @@
         # a reserved oid for the root object).  Our new_oid() method
         # increments it by 1, and returns the result.  It's really a
         # 64-bit integer stored as an 8-byte big-endian string.
-        if base is None:
+        oid = getattr(base, '_oid', None)
+        if oid is None:
             self._oid = z64
         else:
-            self._oid = base._oid
+            self._oid = oid
 
     def abortVersion(self, src, transaction):
         if transaction is not self._transaction:

Modified: ZODB/branches/3.5/src/ZODB/tests/testDemoStorage.py
===================================================================
--- ZODB/branches/3.5/src/ZODB/tests/testDemoStorage.py	2006-06-15 23:29:58 UTC (rev 68674)
+++ ZODB/branches/3.5/src/ZODB/tests/testDemoStorage.py	2006-06-15 23:32:26 UTC (rev 68675)
@@ -11,7 +11,6 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-import ZODB.DemoStorage
 import unittest
 
 from ZODB.tests import StorageTestBase, BasicStorage, \
@@ -24,6 +23,7 @@
                        ):
 
     def setUp(self):
+        import ZODB.DemoStorage
         self._storage = ZODB.DemoStorage.DemoStorage()
 
     def tearDown(self):
@@ -55,8 +55,40 @@
         pass
 
 
+class DemoStorageWrappedBase(DemoStorageTests):
+
+    def setUp(self):
+        import ZODB.DemoStorage
+        self._base = self._makeBaseStorage()
+        self._storage = ZODB.DemoStorage.DemoStorage(base=self._base)
+
+    def tearDown(self):
+        self._storage.close()
+        self._base.close()
+
+    def _makeBaseStorage(self):
+        raise NotImplementedError
+
+class DemoStorageWrappedAroundFileStorage(DemoStorageWrappedBase):
+
+    def _makeBaseStorage(self):
+        from ZODB.MappingStorage import MappingStorage
+        return MappingStorage()
+
+class DemoStorageWrappedAroundMappingStorage(DemoStorageWrappedBase):
+
+    def _makeBaseStorage(self):
+        from ZODB.FileStorage import FileStorage
+        return FileStorage('FileStorageTests.fs')
+                       
+
 def test_suite():
-    suite = unittest.makeSuite(DemoStorageTests, 'check')
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(DemoStorageTests, 'check'))
+    suite.addTest(unittest.makeSuite(DemoStorageWrappedAroundFileStorage,
+                                     'check'))
+    suite.addTest(unittest.makeSuite(DemoStorageWrappedAroundMappingStorage,
+                                     'check'))
     return suite
 
 if __name__ == "__main__":



More information about the Checkins mailing list