[Zope-Checkins] CVS: Zope/lib/python/ZODB/tests - BasicStorage.py:1.22 HistoryStorage.py:1.10 PackableStorage.py:1.18 StorageTestBase.py:1.27 TransactionalUndoStorage.py:1.32 testDemoStorage.py:1.7 testMappingStorage.py:1.6

Toby Dickenson tdickenson@geminidataloggers.com
Fri, 30 May 2003 05:24:45 -0400


Update of /cvs-repository/Zope/lib/python/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv29725

Modified Files:
	BasicStorage.py HistoryStorage.py PackableStorage.py 
	StorageTestBase.py TransactionalUndoStorage.py 
	testDemoStorage.py testMappingStorage.py 
Log Message:
New tests covering corner cases in the storage API, derived from code coverage analysis of DirectoryStorage. FileStorage currently fails checkCreationUndoneGetSerial

=== Zope/lib/python/ZODB/tests/BasicStorage.py 1.21 => 1.22 ===
--- Zope/lib/python/ZODB/tests/BasicStorage.py:1.21	Mon Jan  6 19:21:35 2003
+++ Zope/lib/python/ZODB/tests/BasicStorage.py	Fri May 30 05:24:44 2003
@@ -184,3 +184,56 @@
         self._storage.store(oid, None, data, '', t)
         self._storage.tpc_vote(t)
         self._storage.tpc_finish(t)
+
+    def checkLen(self):
+        # len(storage) reports the number of objects.
+        # check it is zero when empty
+        self.assertEqual(len(self._storage),0)
+        # check it is correct when the storage contains two object.
+        # len may also be zero, for storages that do not keep track
+        # of this number
+        self._dostore(data=MinPO(22))
+        self._dostore(data=MinPO(23))
+        self.assert_(len(self._storage) in [0,2])
+
+    def checkGetSize(self):
+        self._dostore(data=MinPO(25))
+        # the size should be a byte count
+        size = self._storage.getSize()
+        # all Zope really cares about is that the size is printable
+        str(size)
+        if type(size) in [type(0),type(0L),type(0.0)]:
+            # a numerical size - that means we can check that the size is reasonable.
+            self.assert_(10<size<100*1024, size)
+
+    def checkNote(self):
+        oid = self._storage.new_oid()
+        t = Transaction()
+        self._storage.tpc_begin(t)
+        t.note('this is a test')
+        self._storage.store(oid, ZERO, zodb_pickle(MinPO(5)), '', t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+
+    def checkOversizeNote(self):
+        oid = self._storage.new_oid()
+        t = Transaction()
+        # Most storages cant cope with comments this long
+        t.note('0'*128*1024)
+        try:
+            self._storage.tpc_begin(t)
+            self._storage.store(oid, ZERO, zodb_pickle(MinPO(5)), '', t)
+            self._storage.tpc_vote(t)
+            self._storage.tpc_finish(t)
+        except POSException.POSError:
+            # failed as expected
+            pass
+        else:
+            self.fail()
+
+    def checkGetExtensionMethods(self):
+        m = self._storage.getExtensionMethods()
+        self.assertEqual(type(m),type({}))
+        for k,v in m.items():
+            self.assertEqual(v,None)
+            self.assert_(callable(getattr(self._storage,k)))


=== Zope/lib/python/ZODB/tests/HistoryStorage.py 1.9 => 1.10 ===
--- Zope/lib/python/ZODB/tests/HistoryStorage.py:1.9	Thu May 15 03:56:42 2003
+++ Zope/lib/python/ZODB/tests/HistoryStorage.py	Fri May 30 05:24:44 2003
@@ -28,6 +28,7 @@
         eq = self.assertEqual
         # Store a couple of non-version revisions of the object
         oid = self._storage.new_oid()
+        self.assertRaises(KeyError,self._storage.history,oid)
         revid1 = self._dostore(oid, data=MinPO(11))
         revid2 = self._dostore(oid, revid=revid1, data=MinPO(12))
         revid3 = self._dostore(oid, revid=revid2, data=MinPO(13))


=== Zope/lib/python/ZODB/tests/PackableStorage.py 1.17 => 1.18 ===
--- Zope/lib/python/ZODB/tests/PackableStorage.py:1.17	Fri May 16 17:00:58 2003
+++ Zope/lib/python/ZODB/tests/PackableStorage.py	Fri May 30 05:24:44 2003
@@ -381,6 +381,65 @@
 
         eq(root['obj'].value, 7)
 
+    def checkPackUndoLog(self):
+        self._initroot()
+        eq = self.assertEqual
+        raises = self.assertRaises
+        # Create a `persistent' object
+        obj = self._newobj()
+        oid = obj.getoid()
+        obj.value = 1
+        # Commit two different revisions
+        revid1 = self._dostoreNP(oid, data=pickle.dumps(obj))
+        obj.value = 2
+        now = packtime = time.time()
+        while packtime <= now:
+            packtime = time.time()
+        revid2 = self._dostoreNP(oid, revid=revid1, data=pickle.dumps(obj))
+        # Now pack the first transaction
+        self.assertEqual(3,len(self._storage.undoLog()))
+        self._storage.pack(packtime, referencesf)
+        # The undo log contains only the most resent transaction
+        self.assertEqual(1,len(self._storage.undoLog()))
+
+    def dont_checkPackUndoLogUndoable(self):
+        # A disabled test. I wanted to test that the content of the undo log was consistent,
+        # but every storage appears to include something slightly different. If the result of
+        # this method is only used to fill a GUI then this difference doesnt matter.
+        # Perhaps re-enable this test once we agree what should be asserted.
+        self._initroot()
+        # Create two `persistent' object
+        obj1 = self._newobj()
+        oid1 = obj1.getoid()
+        obj1.value = 1
+        obj2 = self._newobj()
+        oid2 = obj2.getoid()
+        obj2.value = 2
+        # Commit the first revision of each of them
+        revid11 = self._dostoreNP(oid1, data=pickle.dumps(obj1), description="1-1")
+        revid22 = self._dostoreNP(oid2, data=pickle.dumps(obj2), description="2-2")
+        # remember the time. everything above here will be packed away
+        now = packtime = time.time()
+        while packtime <= now:
+            packtime = time.time()
+        # Commit two revisions of the first object
+        obj1.value = 3
+        revid13 = self._dostoreNP(oid1, revid=revid11, data=pickle.dumps(obj1), description="1-3")
+        obj1.value = 4
+        revid14 = self._dostoreNP(oid1, revid=revid13, data=pickle.dumps(obj1), description="1-4")
+        # Commit one revision of the second object
+        obj2.value = 5
+        revid25 = self._dostoreNP(oid2, revid=revid22, data=pickle.dumps(obj2), description="2-5")
+        # Now pack
+        self.assertEqual(6,len(self._storage.undoLog()))
+        print '\ninitial undoLog was'
+        for r in self._storage.undoLog(): print r
+        self._storage.pack(packtime, referencesf)
+        # The undo log contains only two undoable transaction.
+        print '\nafter packing undoLog was'
+        for r in self._storage.undoLog(): print r
+        # what can we assert about that?
+
     def checkPackWhileWriting(self):
         # A storage should allow some reading and writing during
         # a pack.  This test attempts to exercise locking code


=== Zope/lib/python/ZODB/tests/StorageTestBase.py 1.26 => 1.27 ===
--- Zope/lib/python/ZODB/tests/StorageTestBase.py:1.26	Thu May  1 13:09:41 2003
+++ Zope/lib/python/ZODB/tests/StorageTestBase.py	Fri May 30 05:24:44 2003
@@ -209,7 +209,7 @@
 
     def _dostoreNP(self, oid=None, revid=None, data=None, version=None,
                    user=None, description=None):
-        return self._dostore(oid, revid, data, version, already_pickled=1)
+        return self._dostore(oid, revid, data, version, 1, user, description)
     
     # The following methods depend on optional storage features.
 


=== Zope/lib/python/ZODB/tests/TransactionalUndoStorage.py 1.31 => 1.32 ===
--- Zope/lib/python/ZODB/tests/TransactionalUndoStorage.py:1.31	Thu May 15 03:56:42 2003
+++ Zope/lib/python/ZODB/tests/TransactionalUndoStorage.py	Fri May 30 05:24:44 2003
@@ -2,14 +2,14 @@
 #
 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
 # All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
-# 
+#
 ##############################################################################
 """Check transactionalUndo().
 
@@ -141,7 +141,6 @@
         oids = self._storage.transactionalUndo(tid, t)
         self._storage.tpc_vote(t)
         self._storage.tpc_finish(t)
-
         eq(len(oids), 1)
         eq(oids[0], oid)
         # This should fail since we've undone the object's creation
@@ -161,6 +160,23 @@
         eq(zodb_unpickle(data), MinPO(23))
         self._iterate()
 
+    def checkCreationUndoneGetSerial(self):
+        # create an object
+        oid = self._storage.new_oid()
+        revid = self._dostore(oid, data=MinPO(23))
+        # undo its creation
+        info = self._storage.undoInfo()
+        tid = info[0]['id']
+        t = Transaction()
+        t.note('undo1')
+        self._storage.tpc_begin(t)
+        oids = self._storage.transactionalUndo(tid, t)
+        self._storage.tpc_vote(t)
+        self._storage.tpc_finish(t)
+        # Check that calling getSerial on an uncreated object raises a KeyError
+        # The current version of FileStorage fails this test
+        self.assertRaises(KeyError, self._storage.getSerial, oid)
+
     def checkUndoCreationBranch1(self):
         eq = self.assertEqual
         oid = self._storage.new_oid()
@@ -753,3 +769,25 @@
             eq(L1, L2)
 
         self.assertRaises(IndexError, iter.__getitem__, offset)
+
+    def checkUndoLogMetadata(self):
+        # test that the metadata is correct in the undo log
+        t = get_transaction()
+        t.note('t1')
+        t.setExtendedInfo('k2','this is transaction metadata')
+        t.setUser('u3',path='p3')
+        db = DB(self._storage)
+        conn = db.open()
+        root = conn.root()
+        o1 = C()
+        root['obj'] = o1
+        txn = get_transaction()
+        txn.commit()
+        l = self._storage.undoLog()
+        self.assertEqual(len(l),2)
+        d = l[0]
+        self.assertEqual(d['description'],'t1')
+        self.assertEqual(d['k2'],'this is transaction metadata')
+        self.assertEqual(d['user_name'],'p3 u3')
+
+        


=== Zope/lib/python/ZODB/tests/testDemoStorage.py 1.6 => 1.7 ===
--- Zope/lib/python/ZODB/tests/testDemoStorage.py:1.6	Thu Dec  5 19:00:52 2002
+++ Zope/lib/python/ZODB/tests/testDemoStorage.py	Fri May 30 05:24:44 2003
@@ -2,14 +2,14 @@
 #
 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
 # All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
-# 
+#
 ##############################################################################
 import ZODB.DemoStorage
 import os, unittest
@@ -28,6 +28,13 @@
 
     def tearDown(self):
         self._storage.close()
+
+    def checkOversizeNote(self):
+        # This base class test checks for the common case where a storage
+        # doesnt support huge transaction metadata. This storage doesnt
+        # have this limit, so we inhibit this test here.
+        pass
+
 
 def test_suite():
     suite = unittest.makeSuite(DemoStorageTests, 'check')


=== Zope/lib/python/ZODB/tests/testMappingStorage.py 1.5 => 1.6 ===
--- Zope/lib/python/ZODB/tests/testMappingStorage.py:1.5	Thu Dec  5 19:00:52 2002
+++ Zope/lib/python/ZODB/tests/testMappingStorage.py	Fri May 30 05:24:44 2003
@@ -2,14 +2,14 @@
 #
 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
 # All Rights Reserved.
-# 
+#
 # This software is subject to the provisions of the Zope Public License,
 # Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
 # FOR A PARTICULAR PURPOSE.
-# 
+#
 ##############################################################################
 import ZODB.MappingStorage
 import os, unittest
@@ -26,6 +26,12 @@
 
     def tearDown(self):
         self._storage.close()
+
+    def checkOversizeNote(self):
+        # This base class test checks for the common case where a storage
+        # doesnt support huge transaction metadata. This storage doesnt
+        # have this limit, so we inhibit this test here.
+        pass
 
 def test_suite():
     suite = unittest.makeSuite(MappingStorageTests, 'check')