[Zodb-checkins] CVS: Zope2/lib/python/ZODB - PackableStorage.py:1.3

barry@digicool.com barry@digicool.com
Fri, 20 Apr 2001 14:23:33 -0400 (EDT)


Update of /cvs-repository/Zope2/lib/python/ZODB/tests
In directory korak:/tmp/cvs-serv22756

Modified Files:
	PackableStorage.py 
Log Message:
Updates to do some simple pack() testing first.

dumps(), makeloader(): Take these out of the PackableStorage class,
and keep them even though they aren't currently used.

checkOldRevisionPacked(): Removed -- it's too complicated as a first
test.

checkSimplePack(): New pack() checker; it creates three revisions of
the same object, then attempts to pack to `now'.  Then it makes sure
that revisions 1 and 2 of the object are gone, but that revision 3
(the current revision) still exists.  Full passes this test, but
FileStorage fails. :(



--- Updated File PackableStorage.py in package Zope2/lib/python/ZODB --
--- PackableStorage.py	2001/04/19 20:49:24	1.2
+++ PackableStorage.py	2001/04/20 18:23:32	1.3
@@ -27,6 +27,25 @@
         return self._oid
 
 
+def dumps(obj):
+    def getpersid(obj):
+        return obj.getoid()
+    s = StringIO()
+    p = pickle.Pickler(s)
+    p.persistent_id = getpersid
+    p.dump(obj)
+    return s.getvalue()
+
+
+def makeloader(persfunc):
+    def loads(str, persfunc=persfunc):
+        fp = StringIO(str)
+        u = pickle.Unpickler(fp)
+        u.persistent_load = persfunc
+        return u.load()
+    return loads
+
+
 
 class PackableStorage:
     def _newobj(self):
@@ -36,54 +55,40 @@
         self._cache[obj.getoid()] = obj
         return obj
 
-    def checkOldRevisionPacked(self):
-        # The initial revision has an object graph like so:
-        # o1 -> o2 -> o3
-        o1 = self._newobj()
-        o2 = self._newobj()
-        o3 = self._newobj()
-        o1.object = o2
-        o2.object = o3
-        # Pickle these objects
-        def dumps(obj):
-            def getpersid(obj):
-                return obj.getoid()
-            s = StringIO()
-            p = pickle.Pickler(s)
-            p.persistent_id = getpersid
-            p.dump(obj)
-            return s.getvalue()
-        p1, p2, p3 = map(dumps, (o1, o2, o3))
-        # Now commit these objects
-        revid1 = self._dostoreNP(oid=o1.getoid(), data=p1)
-        revid2 = self._dostoreNP(oid=o2.getoid(), data=p2)
-        revid3 = self._dostoreNP(oid=o3.getoid(), data=p3)
-        # Record this moment in history so we can pack everything before it
-        t0 = time.time()
-        # Now change the object graph to look like so:
-        # o1 -> o3
-        # and note that o2 is no longer referenced
-        o1.object = o3
-        p11 = dumps(o1)
-        revid11 = self._dostoreNP(oid=o1.getoid(), revid=revid1, data=p11)
-        # Pack away transaction 2
-        self._storage.pack(t0, referencesf)
-        # Now, objects 1 and 3 should exist, but object 2 should have been
-        # reference counted away.  First, we need a custom unpickler.
-        def loads(str, persfunc=self._cache.get):
-            fp = StringIO(str)
-            u = pickle.Unpickler(fp)
-            u.persistent_load = persfunc
-            return u.load()
-        # Get object 1
-        data, revid = self._storage.load(o1.getoid(), '')
-        assert revid == revid11
-        from ZODB import utils
-        assert loads(data).getoid() == o1.getoid()
-        # Get object 3
-        data, revid = self._storage.load(o3.getoid(), '')
-        assert revid == revid2
-        assert loads(data).getoid() == o3.getoid()
-        # Object 2 should fail
+    def checkSimplePack(self):
+        # Create the object
+        obj = self._newobj()
+        oid = obj.getoid()
+        obj.value = 1
+        # Commit three different revisions
+        revid1 = self._dostoreNP(oid, data=pickle.dumps(obj))
+        obj.value = 2
+        revid2 = self._dostoreNP(oid, revid=revid1, data=pickle.dumps(obj))
+        obj.value = 3
+        revid3 = self._dostoreNP(oid, revid=revid2, data=pickle.dumps(obj))
+        # Now make sure all three revisions can be extracted
+        #loads = makeloader(self._cache.get)
+        data = self._storage.loadSerial(oid, revid1)
+        pobj = pickle.loads(data)
+        assert pobj.getoid() == oid and pobj.value == 1
+        data = self._storage.loadSerial(oid, revid2)
+        pobj = pickle.loads(data)
+        assert pobj.getoid() == oid and pobj.value == 2
+        data = self._storage.loadSerial(oid, revid3)
+        pobj = pickle.loads(data)
+        assert pobj.getoid() == oid and pobj.value == 3
+        # Now pack away all but the most current revision
+        self._storage.pack(time.time(), referencesf)
+        # Make sure the first two revisions are gone but the third (current)
+        # still exists.
+        self.assertRaises(KeyError,
+                          self._storage.loadSerial, oid, revid1)
         self.assertRaises(KeyError,
-                          self._storage.load, o2.getoid(), '')
+                          self._storage.loadSerial, oid, revid2)
+        data = self._storage.loadSerial(oid, revid3)
+        pobj = pickle.loads(data)
+        assert pobj.getoid() == oid and pobj.value == 3
+        data, revid = self._storage.load(oid, '')
+        assert revid == revid3
+        pobj = pickle.loads(data)
+        assert pobj.getoid() == oid and pobj.value == 3