[Zope-Checkins] CVS: Zope2 - ConflictResolution.py:1.2

jeremy@digicool.com jeremy@digicool.com
Wed, 2 May 2001 17:19:37 -0400 (EDT)


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

Modified Files:
	ConflictResolution.py 
Log Message:
Three new tests:
checkBuggyResolve2() -- _p_resolveConflict takes too few args
checkUndoConflictResolution() -- make sure conflict resolution is
     invoked properly during transactional undo
checkUndoUnresolvable() -- make sure transactional undo can cope with
     failed conflict resolution




--- Updated File ConflictResolution.py in package Zope2/lib/python/ZODB --
--- ConflictResolution.py	2001/05/02 20:52:53	1.1
+++ ConflictResolution.py	2001/05/02 21:19:35	1.2
@@ -1,7 +1,7 @@
 """Tests for application-level conflict resolution."""
 
 from ZODB.Transaction import Transaction
-from ZODB.POSException import ConflictError
+from ZODB.POSException import ConflictError, UndoError
 from Persistence import Persistent
 
 from ZODB.tests.StorageTestBase import zodb_unpickle, zodb_pickle
@@ -41,6 +41,10 @@
     def _p_resolveConflict(self, oldState, savedState, newState):
         raise AttributeError, "no attribute"
 
+class PCounter4(PCounter):
+    def _p_resolveConflict(self, oldState, savedState):
+        raise RuntimeError, "Can't get here; not enough args"
+
 class ConflictResolvingStorage:
 
     def checkResolve(self):
@@ -82,7 +86,7 @@
                           oid, revid=revid1, data=zodb_pickle(obj))
 
     
-    def checkBuggyResolve(self):
+    def checkBuggyResolve1(self):
         obj = PCounter3()
         obj.inc()
 
@@ -99,5 +103,64 @@
         self.assertRaises(AttributeError,
                           self._dostoreNP,
                           oid, revid=revid1, data=zodb_pickle(obj))
+
+    def checkBuggyResolve2(self):
+        obj = PCounter4()
+        obj.inc()
+
+        oid = self._storage.new_oid()
+
+        revid1 = self._dostoreNP(oid, data=zodb_pickle(obj))
+
+        obj.inc()
+        obj.inc()
+        # The effect of committing two transactions with the same
+        # pickle is to commit two different transactions relative to
+        # revid1 that add two to _value.  
+        revid2 = self._dostoreNP(oid, revid=revid1, data=zodb_pickle(obj))
+        self.assertRaises(TypeError,
+                          self._dostoreNP,
+                          oid, revid=revid1, data=zodb_pickle(obj))
+
+    def checkUndoConflictResolution(self):
+        # This test is based on checkNotUndoable in the
+        # TransactionalUndoStorage test suite.  Except here, conflict
+        # resolution should allow us to undo the transaction anyway.
+        
+        obj = PCounter()
+        obj.inc()
+        oid = self._storage.new_oid()
+        revid_a = self._dostore(oid, data=obj)
+        obj.inc()
+        revid_b = self._dostore(oid, revid=revid_a, data=obj)
+        obj.inc()
+        revid_c = self._dostore(oid, revid=revid_b, data=obj)
+        # Start the undo
+        info = self._storage.undoInfo()
+        tid = info[1]['id']
+        self._storage.tpc_begin(self._transaction)
+        self._storage.transactionalUndo(tid, self._transaction)
+        self._storage.tpc_finish(self._transaction)
+
+    def checkUndoUnresolvable(self):
+        # This test is based on checkNotUndoable in the
+        # TransactionalUndoStorage test suite.  Except here, conflict
+        # resolution should allow us to undo the transaction anyway.
+        
+        obj = PCounter2()
+        obj.inc()
+        oid = self._storage.new_oid()
+        revid_a = self._dostore(oid, data=obj)
+        obj.inc()
+        revid_b = self._dostore(oid, revid=revid_a, data=obj)
+        obj.inc()
+        revid_c = self._dostore(oid, revid=revid_b, data=obj)
+        # Start the undo
+        info = self._storage.undoInfo()
+        tid = info[1]['id']
+        self._storage.tpc_begin(self._transaction)
+        self.assertRaises(UndoError,
+                          self._storage.transactionalUndo,
+                          tid, self._transaction)
+        self._storage.tpc_abort(self._transaction)
 
-    # XXX test conflict error raised during undo



--- Updated File ConflictResolution.py in package Zope2 --
--- ConflictResolution.py	2001/05/02 20:52:53	1.1
+++ ConflictResolution.py	2001/05/02 21:19:35	1.2
@@ -1,7 +1,7 @@
 """Tests for application-level conflict resolution."""
 
 from ZODB.Transaction import Transaction
-from ZODB.POSException import ConflictError
+from ZODB.POSException import ConflictError, UndoError
 from Persistence import Persistent
 
 from ZODB.tests.StorageTestBase import zodb_unpickle, zodb_pickle
@@ -41,6 +41,10 @@
     def _p_resolveConflict(self, oldState, savedState, newState):
         raise AttributeError, "no attribute"
 
+class PCounter4(PCounter):
+    def _p_resolveConflict(self, oldState, savedState):
+        raise RuntimeError, "Can't get here; not enough args"
+
 class ConflictResolvingStorage:
 
     def checkResolve(self):
@@ -82,7 +86,7 @@
                           oid, revid=revid1, data=zodb_pickle(obj))
 
     
-    def checkBuggyResolve(self):
+    def checkBuggyResolve1(self):
         obj = PCounter3()
         obj.inc()
 
@@ -99,5 +103,64 @@
         self.assertRaises(AttributeError,
                           self._dostoreNP,
                           oid, revid=revid1, data=zodb_pickle(obj))
+
+    def checkBuggyResolve2(self):
+        obj = PCounter4()
+        obj.inc()
+
+        oid = self._storage.new_oid()
+
+        revid1 = self._dostoreNP(oid, data=zodb_pickle(obj))
+
+        obj.inc()
+        obj.inc()
+        # The effect of committing two transactions with the same
+        # pickle is to commit two different transactions relative to
+        # revid1 that add two to _value.  
+        revid2 = self._dostoreNP(oid, revid=revid1, data=zodb_pickle(obj))
+        self.assertRaises(TypeError,
+                          self._dostoreNP,
+                          oid, revid=revid1, data=zodb_pickle(obj))
+
+    def checkUndoConflictResolution(self):
+        # This test is based on checkNotUndoable in the
+        # TransactionalUndoStorage test suite.  Except here, conflict
+        # resolution should allow us to undo the transaction anyway.
+        
+        obj = PCounter()
+        obj.inc()
+        oid = self._storage.new_oid()
+        revid_a = self._dostore(oid, data=obj)
+        obj.inc()
+        revid_b = self._dostore(oid, revid=revid_a, data=obj)
+        obj.inc()
+        revid_c = self._dostore(oid, revid=revid_b, data=obj)
+        # Start the undo
+        info = self._storage.undoInfo()
+        tid = info[1]['id']
+        self._storage.tpc_begin(self._transaction)
+        self._storage.transactionalUndo(tid, self._transaction)
+        self._storage.tpc_finish(self._transaction)
+
+    def checkUndoUnresolvable(self):
+        # This test is based on checkNotUndoable in the
+        # TransactionalUndoStorage test suite.  Except here, conflict
+        # resolution should allow us to undo the transaction anyway.
+        
+        obj = PCounter2()
+        obj.inc()
+        oid = self._storage.new_oid()
+        revid_a = self._dostore(oid, data=obj)
+        obj.inc()
+        revid_b = self._dostore(oid, revid=revid_a, data=obj)
+        obj.inc()
+        revid_c = self._dostore(oid, revid=revid_b, data=obj)
+        # Start the undo
+        info = self._storage.undoInfo()
+        tid = info[1]['id']
+        self._storage.tpc_begin(self._transaction)
+        self.assertRaises(UndoError,
+                          self._storage.transactionalUndo,
+                          tid, self._transaction)
+        self._storage.tpc_abort(self._transaction)
 
-    # XXX test conflict error raised during undo