[Zodb-checkins] CVS: Zope2/lib/python/ZODB - ConflictResolution.py:1.2
jeremy@digicool.com
jeremy@digicool.com
Wed, 2 May 2001 17:19:36 -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