[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