[Zope-Checkins] CVS: Zope/lib/python/ZODB/tests - TransactionalUndoStorage.py:1.21.4.1
Chris McDonough
chrism@zope.com
Sat, 28 Sep 2002 21:41:08 -0400
Update of /cvs-repository/Zope/lib/python/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv16902/lib/python/ZODB/tests
Modified Files:
Tag: chrism-install-branch
TransactionalUndoStorage.py
Log Message:
Merge chrism-install-branch with head. Apologies for the spew.
=== Zope/lib/python/ZODB/tests/TransactionalUndoStorage.py 1.21 => 1.21.4.1 ===
--- Zope/lib/python/ZODB/tests/TransactionalUndoStorage.py:1.21 Wed Aug 14 18:07:09 2002
+++ Zope/lib/python/ZODB/tests/TransactionalUndoStorage.py Sat Sep 28 21:40:37 2002
@@ -9,12 +9,17 @@
from ZODB.Transaction import Transaction
from ZODB.referencesf import referencesf
from ZODB.utils import u64
+from ZODB import DB
+from Persistence import Persistent
from ZODB.tests.MinPO import MinPO
from ZODB.tests.StorageTestBase import zodb_pickle, zodb_unpickle
ZERO = '\0'*8
+class C(Persistent):
+ pass
+
class TransactionalUndoStorage:
def _transaction_begin(self):
@@ -461,3 +466,58 @@
data, revid = self._storage.load(oid, '')
# The object must now be at the second state
eq(zodb_unpickle(data), MinPO(52))
+
+ def checkTransactionalUndoAfterPackWithObjectUnlinkFromRoot(self):
+ eq = self.assertEqual
+ db = DB(self._storage)
+ conn = db.open()
+ root = conn.root()
+
+ o1 = C()
+ o2 = C()
+ root['obj'] = o1
+ o1.obj = o2
+ txn = get_transaction()
+ txn.note('o1 -> o2')
+ txn.commit()
+ now = packtime = time.time()
+ while packtime <= now:
+ packtime = time.time()
+
+ o3 = C()
+ o2.obj = o3
+ txn = get_transaction()
+ txn.note('o1 -> o2 -> o3')
+ txn.commit()
+
+ o1.obj = o3
+ txn = get_transaction()
+ txn.note('o1 -> o3')
+ txn.commit()
+
+ log = self._storage.undoLog()
+ eq(len(log), 4)
+ for entry in zip(log, ('o1 -> o3', 'o1 -> o2 -> o3',
+ 'o1 -> o2', 'initial database creation')):
+ eq(entry[0]['description'], entry[1])
+
+ self._storage.pack(packtime, referencesf)
+
+ log = self._storage.undoLog()
+ for entry in zip(log, ('o1 -> o3', 'o1 -> o2 -> o3')):
+ eq(entry[0]['description'], entry[1])
+
+ tid = log[0]['id']
+ db.undo(tid)
+ txn = get_transaction()
+ txn.note('undo')
+ txn.commit()
+ # undo does a txn-undo, but doesn't invalidate
+ conn.sync()
+
+ log = self._storage.undoLog()
+ for entry in zip(log, ('undo', 'o1 -> o3', 'o1 -> o2 -> o3')):
+ eq(entry[0]['description'], entry[1])
+
+ eq(o1.obj, o2)
+ eq(o1.obj.obj, o3)