[Zope-Checkins] CVS: StandaloneZODB/ZODB/tests - IteratorStorage.py:1.7

Jeremy Hylton jeremy@zope.com
Thu, 24 Jan 2002 12:33:11 -0500


Update of /cvs-repository/StandaloneZODB/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv9635

Modified Files:
	IteratorStorage.py 
Log Message:
checkVersionIterator() provokes a failure in FileStorage.

XXX checkTransactionalUndoIterator() should too, but doesn't.


=== StandaloneZODB/ZODB/tests/IteratorStorage.py 1.6 => 1.7 ===
 from ZODB.tests.StorageTestBase import zodb_unpickle
 from ZODB.utils import U64, p64
-
+from ZODB.Transaction import Transaction
 
 
 class IteratorCompare:
@@ -26,9 +26,6 @@
                 val = val + 1
         eq(val, val0 + len(revids))
 
-# XXX need a test case that covers iteration over a storage that
-# includes a transactional undo that un-created an object.
-
 class IteratorStorage(IteratorCompare):
 
     def checkSimpleIteration(self):
@@ -40,6 +37,69 @@
         # Now iterate over all the transactions and compare carefully
         txniter = self._storage.iterator()
         self.iter_verify(txniter, [revid1, revid2, revid3], 11)
+
+    def checkVersionIterator(self):
+        if not self._storage.supportsVersions():
+            return
+        self._dostore()
+        self._dostore(version='abort')
+        self._dostore()
+        self._dostore(version='abort')
+        t = Transaction()
+        self._storage.tpc_begin(t)
+        self._storage.abortVersion('abort', t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+
+        self._dostore(version='commit')
+        self._dostore()
+        self._dostore(version='commit')
+        t = Transaction()
+        self._storage.tpc_begin(t)
+        self._storage.commitVersion('commit', '', t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+
+        # XXX extend these checks.  right now, just iterating with CVS
+        # FS or Berkeley will fail here, but once fixed we should
+        # check that the right data is returned.
+        txniter = self._storage.iterator()
+        for trans in txniter:
+            for data in trans:
+                pass
+
+    def checkTransactionalUndoIterator(self):
+        if not hasattr(self._storage, 'supportsTransactionalUndo'):
+            return
+        if not self._storage.supportsTransactionalUndo():
+            return
+
+        oid = self._storage.new_oid()
+        revid = self._dostore(oid)
+        self._dostore(oid, revid)
+
+        self.undoLastTrans()
+        self.undoLastTrans()
+
+        # XXX extend these checks.  right now, just iterating with CVS
+        # FS or Berkeley will fail here, but once fixed we should
+        # check that the right data is returned.
+        txniter = self._storage.iterator()
+        for trans in txniter:
+            for data in trans:
+                print repr(data.oid), repr(data.data)
+        
+
+    def undoLastTrans(self):
+        info = self._storage.undoInfo()
+        print len(info)
+        tid = info[0]['id']
+        t = Transaction()
+        self._storage.tpc_begin(t)
+        oids = self._storage.transactionalUndo(tid, t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+        
 
 class ExtendedIteratorStorage(IteratorCompare):