[Zope3-checkins] CVS: Zope3/src/ZODB/tests - testmvcc.py:1.11.2.1
testZODB.py:1.24.2.4 testTransaction.py:1.19.2.9
Jeremy Hylton
jeremy at zope.com
Wed Mar 31 17:01:51 EST 2004
Update of /cvs-repository/Zope3/src/ZODB/tests
In directory cvs.zope.org:/tmp/cvs-serv15378/src/ZODB/tests
Modified Files:
Tag: jeremy-txn-branch
testmvcc.py testZODB.py testTransaction.py
Log Message:
Fix tests that depended on details of transaction implementation.
Use explicit transaction manager passed to DB.open() instead of
setLocalTransaction. Add a test of explicit transaction management.
Disable code in testTransaction that checked hosed variable. It
doesn't exist in the new implementation.
=== Zope3/src/ZODB/tests/testmvcc.py 1.11 => 1.11.2.1 ===
--- Zope3/src/ZODB/tests/testmvcc.py:1.11 Fri Mar 12 16:47:35 2004
+++ Zope3/src/ZODB/tests/testmvcc.py Wed Mar 31 17:01:50 2004
@@ -41,8 +41,9 @@
setLocalTransaction() method to make sure that the connections act
independently, even though they'll be run from a single thread.
->>> cn1 = db.open()
->>> txn1 = cn1.setLocalTransaction()
+>>> import transaction
+>>> tm1 = transaction.TransactionManager()
+>>> cn1 = db.open(txn_mgr=tm1)
The test will just use some MinPO objects. The next few lines just
setup an initial database state.
@@ -51,12 +52,12 @@
>>> r = cn1.root()
>>> r["a"] = MinPO(1)
>>> r["b"] = MinPO(1)
->>> txn1.commit()
+>>> tm1.get().commit()
Now open a second connection.
->>> cn2 = db.open()
->>> txn2 = cn2.setLocalTransaction()
+>>> tm2 = transaction.TransactionManager()
+>>> cn2 = db.open(txn_mgr=tm2)
Connection high-water mark
--------------------------
@@ -104,7 +105,7 @@
>>> r1 = cn1.root()
>>> r1["a"].value = 2
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> txn = db.lastTransaction()
The second connection has its high-water mark set now.
@@ -141,7 +142,7 @@
commit the transaction.
>>> r2["a"].value = 3
->>> txn2.commit()
+>>> tm2.get().commit()
Traceback (most recent call last):
...
ConflictError: database conflict error (oid 0000000000000001, class ZODB.tests.MinPO.MinPO)
@@ -155,9 +156,7 @@
>>> r1 = cn1.root()
>>> r1["a"].value = 3
->>> txn1 is cn1.getTransaction()
-True
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> txn = db.lastTransaction()
>>> cn2._txn_time == txn
True
@@ -165,7 +164,7 @@
>>> r2["b"].value = r2["a"].value + 1
>>> r2["b"].value
3
->>> txn2.commit()
+>>> tm2.get().commit()
>>> print cn2._txn_time
None
@@ -185,7 +184,7 @@
>>> cn1.sync()
>>> r1["a"].value = 0
>>> r1["b"].value = 0
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> cn2.sync()
>>> r2["a"].value
@@ -206,7 +205,7 @@
... cn1.sync()
... r1["a"].value = 0
... r1["b"].value = 0
-... cn1.getTransaction().commit()
+... tm1.get().commit()
... cn2.sync()
... r2["b"].value = 1
... cn2.getTransaction().commit()
@@ -217,7 +216,7 @@
>>> r1["b"].value
0
>>> r1["a"].value = 1
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> r1["b"]._p_state
-1
@@ -280,14 +279,13 @@
>>> ts = TestStorage()
>>> db = DB(ts)
->>> cn1 = db.open()
->>> txn1 = cn1.setLocalTransaction()
+>>> cn1 = db.open(txn_mgr=tm1)
>>> r1 = cn1.root()
>>> r1["a"] = MinPO(0)
>>> r1["b"] = MinPO(0)
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> r1["b"].value = 1
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> cn1.cacheMinimize() # makes everything in cache a ghost
>>> oid = r1["b"]._p_oid
@@ -318,12 +316,11 @@
>>> ts = TestStorage()
>>> db = DB(ts)
->>> cn1 = db.open()
->>> txn1 = cn1.setLocalTransaction()
+>>> cn1 = db.open(txn_mgr=tm1)
>>> r1 = cn1.root()
>>> r1["a"] = MinPO(0)
>>> r1["b"] = MinPO(0)
->>> cn1.getTransaction().commit()
+>>> tm1.get().commit()
>>> cn1.cacheMinimize() # makes everything in cache a ghost
>>> oid = r1["b"]._p_oid
=== Zope3/src/ZODB/tests/testZODB.py 1.24.2.3 => 1.24.2.4 ===
--- Zope3/src/ZODB/tests/testZODB.py:1.24.2.3 Mon Mar 29 13:44:28 2004
+++ Zope3/src/ZODB/tests/testZODB.py Wed Mar 31 17:01:50 2004
@@ -16,8 +16,10 @@
import ZODB
import ZODB.FileStorage
from ZODB.POSException import ReadConflictError, ConflictError
+
from persistent import Persistent
from persistent.mapping import PersistentMapping
+import transaction
class P(Persistent):
pass
@@ -163,6 +165,44 @@
self.assert_(len(conn._cache) > 0) # Still not flushed
conn._setDB(self._db) # simulate the connection being reopened
self.assertEqual(len(conn._cache), 0)
+
+ def checkExplicitTransactionManager(self):
+ # Test of transactions that apply to only the connection,
+ # not the thread.
+ tm1 = transaction.TransactionManager()
+ conn1 = self._db.open(txn_mgr=tm1)
+ tm2 = transaction.TransactionManager()
+ conn2 = self._db.open(txn_mgr=tm2)
+ try:
+ r1 = conn1.root()
+ r2 = conn2.root()
+ if r1.has_key('item'):
+ del r1['item']
+ tm1.get().commit()
+ r1.get('item')
+ r2.get('item')
+ r1['item'] = 1
+ tm1.get().commit()
+ self.assertEqual(r1['item'], 1)
+ # r2 has not seen a transaction boundary,
+ # so it should be unchanged.
+ self.assertEqual(r2.get('item'), None)
+ conn2.sync()
+ # Now r2 is updated.
+ self.assertEqual(r2['item'], 1)
+
+ # Now, for good measure, send an update in the other direction.
+ r2['item'] = 2
+ tm2.get().commit()
+ self.assertEqual(r1['item'], 1)
+ self.assertEqual(r2['item'], 2)
+ conn1.sync()
+ conn2.sync()
+ self.assertEqual(r1['item'], 2)
+ self.assertEqual(r2['item'], 2)
+ finally:
+ conn1.close()
+ conn2.close()
def checkLocalTransactions(self):
# Test of transactions that apply to only the connection,
=== Zope3/src/ZODB/tests/testTransaction.py 1.19.2.8 => 1.19.2.9 ===
--- Zope3/src/ZODB/tests/testTransaction.py:1.19.2.8 Wed Mar 31 14:14:24 2004
+++ Zope3/src/ZODB/tests/testTransaction.py Wed Mar 31 17:01:50 2004
@@ -47,7 +47,6 @@
def setUp(self):
self.orig_tm = transaction.manager
transaction.manager = transaction.TransactionManager()
- Transaction.hosed = 0
self.sub1 = DataObject()
self.sub2 = DataObject()
self.sub3 = DataObject()
@@ -337,7 +336,6 @@
assert self.nosub1._p_jar.ctpc_finish == 0
assert self.nosub1._p_jar.ccommit == 1
assert self.nosub1._p_jar.ctpc_abort == 1
- assert Transaction.hosed == 0
def testExceptionInTpcVote(self):
@@ -354,7 +352,6 @@
assert self.nosub1._p_jar.ccommit == 1
assert self.nosub1._p_jar.ctpc_abort == 1
assert self.sub1._p_jar.ctpc_abort == 1
- assert Transaction.hosed == 0
def testExceptionInTpcBegin(self):
"""
@@ -393,7 +390,6 @@
except TestTxnException: pass
assert self.nosub1._p_jar.ctpc_abort == 1
- assert Transaction.hosed == 0
### More Failure modes...
# now we mix in some sub transactions
@@ -472,38 +468,34 @@
# last test, check the hosing mechanism
- def testHoserStoppage(self):
- # XXX We should consult ZConfig to decide whether we can get into a
- # hosed state or not.
- return
-
- # It's hard to test the "hosed" state of the database, where
- # hosed means that a failure occurred in the second phase of
- # the two phase commit. It's hard because the database can
- # recover from such an error if it occurs during the very first
- # tpc_finish() call of the second phase.
-
- for obj in self.sub1, self.sub2:
- j = HoserJar(errors='tpc_finish')
- j.reset()
- obj._p_jar = j
- obj.modify(nojar=1)
-
- try:
- get_transaction().commit()
- except TestTxnException:
- pass
-
- self.assert_(Transaction.hosed)
-
- self.sub2.modify()
-
- try:
- get_transaction().commit()
- except Transaction.POSException.TransactionError:
- pass
- else:
- self.fail("Hosed Application didn't stop commits")
+## def testHoserStoppage(self):
+## # It's hard to test the "hosed" state of the database, where
+## # hosed means that a failure occurred in the second phase of
+## # the two phase commit. It's hard because the database can
+## # recover from such an error if it occurs during the very first
+## # tpc_finish() call of the second phase.
+
+## for obj in self.sub1, self.sub2:
+## j = HoserJar(errors='tpc_finish')
+## j.reset()
+## obj._p_jar = j
+## obj.modify(nojar=1)
+
+## try:
+## get_transaction().commit()
+## except TestTxnException:
+## pass
+
+## self.assert_(Transaction.hosed)
+
+## self.sub2.modify()
+
+## try:
+## get_transaction().commit()
+## except Transaction.POSException.TransactionError:
+## pass
+## else:
+## self.fail("Hosed Application didn't stop commits")
class DataObject:
More information about the Zope3-Checkins
mailing list