SVN: ZODB/branches/jim-transform-wrapping/src/Z checkpoint

Jim Fulton <[email protected]>
Newsgroups gmane.comp.python.zope.zodb.cvs
Message-ID <[email protected]>
Log message for revision 112423:
  checkpoint

Changed:
  U   ZODB/branches/jim-transform-wrapping/src/ZEO/tests/IterationTests.py
  U   ZODB/branches/jim-transform-wrapping/src/ZEO/tests/testZEO.py
  U   ZODB/branches/jim-transform-wrapping/src/ZODB/tests/component.xml
  U   ZODB/branches/jim-transform-wrapping/src/ZODB/tests/hexstorage.py
  U   ZODB/branches/jim-transform-wrapping/src/ZODB/tests/testFileStorage.py

-=-
Modified: ZODB/branches/jim-transform-wrapping/src/ZEO/tests/IterationTests.py
===================================================================
--- ZODB/branches/jim-transform-wrapping/src/ZEO/tests/IterationTests.py	2010-05-17 16:40:20 UTC (rev 112422)
+++ ZODB/branches/jim-transform-wrapping/src/ZEO/tests/IterationTests.py	2010-05-17 17:34:29 UTC (rev 112423)
@@ -35,7 +35,12 @@
 
     def checkIteratorExhaustionStorage(self):
         # Test the storage's garbage collection mechanism.
+        self._dostore()
         iterator = self._storage.iterator()
+
+        # At this point, a wrapping iterator might not have called the CS
+        # iterator yet. We'll consume one item to make sure this happens.
+        iterator.next()
         self.assertEquals(1, len(self._storage._iterator_ids))
         iid = list(self._storage._iterator_ids)[0]
         self.assertEquals([], list(iterator))
@@ -59,8 +64,14 @@
     def checkIteratorGCStorageCommitting(self):
         # We want the iterator to be garbage-collected, so we don't keep any
         # hard references to it. The storage tracks its ID, though.
-        self._storage.iterator()
 
+        # The odd little jig we do below arises from the fact that the
+        # CS iterator may not be constructed right away if the CS is wrapped.
+        # We need to actually do some iteration to get the iterator created.
+        # We do a store to make sure the iterator isn't exhausted right away.
+        self._dostore()
+        self._storage.iterator().next()
+
         self.assertEquals(1, len(self._storage._iterator_ids))
         iid = list(self._storage._iterator_ids)[0]
 
@@ -71,8 +82,15 @@
         self.assertRaises(KeyError, self._storage._server.iterator_next, iid)
 
     def checkIteratorGCStorageTPCAborting(self):
-        self._storage.iterator()
+        # The odd little jig we do below arises from the fact that the
+        # CS iterator may not be constructed right away if the CS is wrapped.
+        # We need to actually do some iteration to get the iterator created.
+        # We do a store to make sure the iterator isn't exhausted right away.
+        self._dostore()
+        self._storage.iterator().next()
+
         iid = list(self._storage._iterator_ids)[0]
+
         t = transaction.Transaction()
         self._storage.tpc_begin(t)
         self._storage.tpc_abort(t)
@@ -80,7 +98,14 @@
         self.assertRaises(KeyError, self._storage._server.iterator_next, iid)
 
     def checkIteratorGCStorageDisconnect(self):
-        self._storage.iterator()
+
+        # The odd little jig we do below arises from the fact that the
+        # CS iterator may not be constructed right away if the CS is wrapped.
+        # We need to actually do some iteration to get the iterator created.
+        # We do a store to make sure the iterator isn't exhausted right away.
+        self._dostore()
+        self._storage.iterator().next()
+
         iid = list(self._storage._iterator_ids)[0]
         t = transaction.Transaction()
         self._storage.tpc_begin(t)

Modified: ZODB/branches/jim-transform-wrapping/src/ZEO/tests/testZEO.py
===================================================================
--- ZODB/branches/jim-transform-wrapping/src/ZEO/tests/testZEO.py	2010-05-17 16:40:20 UTC (rev 112422)
+++ ZODB/branches/jim-transform-wrapping/src/ZEO/tests/testZEO.py	2010-05-17 17:34:29 UTC (rev 112423)
@@ -47,6 +47,7 @@
 import ZEO.zrpc.connection
 import ZODB
 import ZODB.blob
+import ZODB.tests.hexstorage
 import ZODB.tests.testblob
 import ZODB.tests.util
 import ZODB.utils
@@ -59,6 +60,7 @@
         pass
     def invalidateCache(*unused):
         pass
+    transform_record_data = untransform_record_data = lambda self, v: v
 
 
 class CreativeGetState(persistent.Persistent):
@@ -94,7 +96,8 @@
 
     def checkZEOInvalidation(self):
         addr = self._storage._addr
-        storage2 = ClientStorage(addr, wait=1, min_disconnect_poll=0.1)
+        storage2 = self._wrap_client(
+            ClientStorage(addr, wait=1, min_disconnect_poll=0.1))
         try:
             oid = self._storage.new_oid()
             ob = MinPO('first')
@@ -196,13 +199,16 @@
             self.blob_cache_dir = tempfile.mkdtemp(
                 'blob_cache',
                 dir=os.path.abspath(os.getcwd()))
-        self._storage = ClientStorage(
+        self._storage = self._wrap_client(ClientStorage(
             zport, '1', cache_size=20000000,
             min_disconnect_poll=0.5, wait=1,
             wait_timeout=60, blob_dir=self.blob_cache_dir,
-            shared_blob_dir=self.shared_blob_dir)
+            shared_blob_dir=self.shared_blob_dir))
         self._storage.registerDB(DummyDB())
 
+    def _wrap_client(self, client):
+        return client
+
     def tearDown(self):
         self._storage.close()
         for server in self._servers:
@@ -362,7 +368,23 @@
         </hexstorage>
         """
 
+class FileStorageClientHexTests(FileStorageHexTests):
 
+    def getConfig(self):
+        return """\
+        %import ZODB.tests
+        <serverhexstorage>
+        <filestorage 1>
+        path Data.fs
+        </filestorage>
+        </serverhexstorage>
+        """
+
+    def _wrap_client(self, client):
+        return ZODB.tests.hexstorage.HexStorage(client)
+
+
+
 class MappingStorageTests(GenericTests):
     """ZEO backed by a Mapping storage."""
 
@@ -1429,8 +1451,8 @@
 
 slow_test_classes = [
     BlobAdaptedFileStorageTests, BlobWritableCacheTests,
-    DemoStorageTests, FileStorageTests, FileStorageHexTests,
-    MappingStorageTests,
+    MappingStorageTests, DemoStorageTests,
+    FileStorageTests, FileStorageHexTests, FileStorageClientHexTests,
     ]
 
 quick_test_classes = [

Modified: ZODB/branches/jim-transform-wrapping/src/ZODB/tests/component.xml
===================================================================
--- ZODB/branches/jim-transform-wrapping/src/ZODB/tests/component.xml	2010-05-17 16:40:20 UTC (rev 112422)
+++ ZODB/branches/jim-transform-wrapping/src/ZODB/tests/component.xml	2010-05-17 17:34:29 UTC (rev 112423)
@@ -1,6 +1,16 @@
 <component>
-  <sectiontype name="hexstorage" datatype="ZODB.tests.hexstorage.ZConfig"
-               implements="ZODB.storage">
+  <sectiontype
+     name="hexstorage"
+     datatype="ZODB.tests.hexstorage.ZConfigHex"
+     implements="ZODB.storage"
+     >
     <section type="ZODB.storage" name="*" attribute="base" required="yes" />
   </sectiontype>
+  <sectiontype
+     name="serverhexstorage"
+     datatype="ZODB.tests.hexstorage.ZConfigServerHex"
+     implements="ZODB.storage"
+     >
+    <section type="ZODB.storage" name="*" attribute="base" required="yes" />
+  </sectiontype>
 </component>

Modified: ZODB/branches/jim-transform-wrapping/src/ZODB/tests/hexstorage.py
===================================================================
--- ZODB/branches/jim-transform-wrapping/src/ZODB/tests/hexstorage.py	2010-05-17 16:40:20 UTC (rev 112422)
+++ ZODB/branches/jim-transform-wrapping/src/ZODB/tests/hexstorage.py	2010-05-17 17:34:29 UTC (rev 112423)
@@ -29,21 +29,24 @@
         except StopIteration:
             raise ZODB.interfaces.StorageStopIteration()
 
+
 class HexStorage(object):
 
     zope.interface.implements(ZODB.interfaces.IStorageWrapper)
 
-    def __init__(self, base):
-        self.base = base
-        base.registerDB(self)
-
-        for name in (
+    copied_methods = (
             'close', 'getName', 'getSize', 'history', 'isReadOnly',
             'lastTransaction', 'new_oid', 'sortKey',
             'tpc_abort', 'tpc_begin', 'tpc_finish', 'tpc_vote',
             'loadBlob', 'openCommittedBlobFile', 'temporaryDirectory',
             'supportsUndo', 'undo', 'undoLog', 'undoInfo',
-            ):
+            )
+
+    def __init__(self, base):
+        self.base = base
+        base.registerDB(self)
+
+        for name in self.copied_methods:
             v = getattr(base, name, None)
             if v is not None:
                 setattr(self, name, v)
@@ -132,6 +135,18 @@
     def copyTransactionsFrom(self, other):
         ZODB.blob.copyTransactionsFromTo(other, self)
 
+class ServerHexStorage(HexStorage):
+    """Use on ZEO storage server when Hex is used on client
+
+    Don't do conversion as part of load/store, but provide
+    pickle decoding.
+    """
+
+    copied_methods = HexStorage.copied_methods + (
+        'load', 'loadBefore', 'loadSerial', 'store', 'restore',
+        'iterator', 'storeBlob', 'restoreBlob', 'record_iternext',
+        )
+
 class Transaction(object):
 
     def __init__(self, store, trans):
@@ -150,12 +165,18 @@
     def __getattr__(self, name):
         return getattr(self.__trans, name)
 
-class ZConfig:
+class ZConfigHex:
 
+    _factory = HexStorage
+
     def __init__(self, config):
         self.config = config
         self.name = config.getSectionName()
 
     def open(self):
         base = self.config.base.open()
-        return HexStorage(base)
+        return self._factory(base)
+
+class ZConfigServerHex(ZConfigHex):
+
+    _factory = ServerHexStorage

Modified: ZODB/branches/jim-transform-wrapping/src/ZODB/tests/testFileStorage.py
===================================================================
--- ZODB/branches/jim-transform-wrapping/src/ZODB/tests/testFileStorage.py	2010-05-17 16:40:20 UTC (rev 112422)
+++ ZODB/branches/jim-transform-wrapping/src/ZODB/tests/testFileStorage.py	2010-05-17 17:34:29 UTC (rev 112423)
@@ -690,6 +690,7 @@
     suite.addTest(PackableStorage.IExternalGC_suite(
         lambda : ZODB.FileStorage.FileStorage(
             'data.fs', blob_dir='blobs', pack_gc=False)))
+    suite.layer = ZODB.tests.util.MininalTestLayer('testFileStorage')
     return suite
 
 if __name__=='__main__':
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.