[Zope-Checkins] CVS: ZODB3/ZODB/tests - testConnection.py:1.1.4.2

Gintautas Miliauskas gintas at pov.lt
Tue Feb 3 14:14:42 EST 2004


Update of /cvs-repository/ZODB3/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv29045/tests

Modified Files:
      Tag: zope3-zodb3-devel-branch
	testConnection.py 
Log Message:
Fixed the implementation of Connection.add() to not lose objects that are
created during a __getstate__ and are also added to the Connection with
add(). (Objects that were created in __getstate__ but not added with add()
were just fine!)

Added tests for this.

SteveA + Gintas


=== ZODB3/ZODB/tests/testConnection.py 1.1.4.1 => 1.1.4.2 ===
--- ZODB3/ZODB/tests/testConnection.py:1.1.4.1	Sun Feb  1 13:38:39 2004
+++ ZODB3/ZODB/tests/testConnection.py	Tue Feb  3 14:14:41 2004
@@ -108,6 +108,37 @@
         self.assertEquals(self.db._storage._stored, [oid])
         self.assertEquals(self.db._storage._finished, [oid])
 
+    def checkModifyOnGetstate(self):
+        subobj = StubObject()
+        obj = ModifyOnGetStateObject(subobj)
+        
+        self.datamgr.tpc_begin(self.transaction)
+        self.datamgr.commit(obj, self.transaction)
+        self.datamgr.tpc_finish(self.transaction)
+        storage = self.db._storage
+        self.assert_(obj._p_oid in storage._stored, "object was not stored")
+        self.assert_(subobj._p_oid in storage._stored,
+                "subobject was not stored")
+        self.assert_(self.datamgr._added_during_commit is None)
+
+    def checkErrorDuringCommit(self):
+        # We need to check that _added_during_commit still gets set to None
+        # when there is an error during commit()/
+        obj = ErrorOnGetstateObject()
+        
+        self.datamgr.tpc_begin(self.transaction)
+        self.assertRaises(ErrorOnGetstateException,
+                self.datamgr.commit, obj, self.transaction)
+        self.assert_(self.datamgr._added_during_commit is None)
+
+    def checkUnusedAddWorks(self):
+        # When an object is added, but not committed, it shouldn't be stored,
+        # but also it should be an error.
+        obj = StubObject()
+        self.datamgr.add(obj)
+        self.datamgr.tpc_begin(self.transaction)
+        self.datamgr.tpc_finish(self.transaction)
+        self.assert_(obj._p_oid not in self.datamgr._storage._stored)
 
 # ---- stubs
 
@@ -117,6 +148,24 @@
 
 class StubTransaction:
     pass
+
+class ErrorOnGetstateException(Exception):
+    pass
+    
+class ErrorOnGetstateObject(Persistent):
+
+    def __getstate__(self):
+        raise ErrorOnGetstateException
+
+class ModifyOnGetStateObject(Persistent):
+
+    def __init__(self, p):
+        self._v_p = p
+
+    def __getstate__(self):
+        self._p_jar.add(self._v_p)
+        self.p = self._v_p
+        return Persistent.__getstate__(self)
 
 
 class StubStorage:




More information about the Zope-Checkins mailing list