[Zodb-checkins] CVS: Zope2/lib/python/ZODB - PackableStorage.py:1.5
barry@digicool.com
barry@digicool.com
Mon, 9 Jul 2001 15:12:28 -0400 (EDT)
Update of /cvs-repository/Zope2/lib/python/ZODB/tests
In directory korak.digicool.com:/tmp/cvs-serv393
Modified Files:
PackableStorage.py
Log Message:
checkPackOnlyOneObject(): Unit test case for overly aggressive pack()
bug.
--- Updated File PackableStorage.py in package Zope2/lib/python/ZODB --
--- PackableStorage.py 2001/04/24 23:49:05 1.4
+++ PackableStorage.py 2001/07/09 19:12:27 1.5
@@ -188,3 +188,76 @@
assert revid == revid3
pobj = pickle.loads(data)
assert pobj.getoid() == oid and pobj.value == 3
+
+ def checkPackOnlyOneObject(self):
+ loads = self._makeloader()
+ # Create a root object. This can't be an instance of Object,
+ # otherwise the pickling machinery will serialize it as a persistent
+ # id and not as an object that contains references (persistent ids) to
+ # other objects.
+ root = Root()
+ # Create a persistent object, with some initial state
+ obj1 = self._newobj()
+ oid1 = obj1.getoid()
+ # Create another persistent object, with some initial state. Make
+ # sure it's oid is greater than the first object's oid.
+ obj2 = self._newobj()
+ oid2 = obj2.getoid()
+ assert oid2 > oid1
+ # Link the root object to the persistent objects, in order to keep
+ # them alive. Store the root object.
+ root.obj1 = obj1
+ root.obj2 = obj2
+ root.value = 0
+ revid0 = self._dostoreNP(ZERO, data=dumps(root))
+ # Make sure the root can be retrieved
+ data, revid = self._storage.load(ZERO, '')
+ assert revid == revid0 and loads(data).value == 0
+ # Commit three different revisions of the first object
+ obj1.value = 1
+ revid1 = self._dostoreNP(oid1, data=pickle.dumps(obj1))
+ obj1.value = 2
+ revid2 = self._dostoreNP(oid1, revid=revid1, data=pickle.dumps(obj1))
+ obj1.value = 3
+ revid3 = self._dostoreNP(oid1, revid=revid2, data=pickle.dumps(obj1))
+ # Now make sure all three revisions can be extracted
+ data = self._storage.loadSerial(oid1, revid1)
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid1 and pobj.value == 1
+ data = self._storage.loadSerial(oid1, revid2)
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid1 and pobj.value == 2
+ data = self._storage.loadSerial(oid1, revid3)
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid1 and pobj.value == 3
+ # Now commit a revision of the second object
+ obj2.value = 11
+ revid4 = self._dostoreNP(oid2, data=pickle.dumps(obj2))
+ # And make sure the revision can be extracted
+ data = self._storage.loadSerial(oid2, revid4)
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid2 and pobj.value == 11
+ # Now pack just revisions 1 and 2 of object1. Object1's current
+ # revision should stay alive because it's pointed to by the root, as
+ # should Object2's current revision.
+ self._storage.pack(time.time(), referencesf)
+ # Make sure the revisions are gone, but that object zero, object2, and
+ # revision 3 of object1 are still there and correct.
+ data, revid = self._storage.load(ZERO, '')
+ assert revid == revid0 and loads(data).value == 0
+ self.assertRaises(KeyError,
+ self._storage.loadSerial, oid1, revid1)
+ self.assertRaises(KeyError,
+ self._storage.loadSerial, oid1, revid2)
+ data = self._storage.loadSerial(oid1, revid3)
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid1 and pobj.value == 3
+ data, revid = self._storage.load(oid1, '')
+ assert revid == revid3
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid1 and pobj.value == 3
+ data, revid = self._storage.load(oid2, '')
+ assert revid == revid4 and loads(data).value == 11
+ data = self._storage.loadSerial(oid2, revid4)
+ pobj = pickle.loads(data)
+ assert pobj.getoid() == oid2 and pobj.value == 11