[Checkins] SVN: transaction/branches/sphinx/ Coverage for Transactdion._commitResources.
Tres Seaver
cvs-admin at zope.org
Tue Dec 18 05:25:02 UTC 2012
Log message for revision 128744:
Coverage for Transactdion._commitResources.
Changed:
_U transaction/branches/sphinx/
U transaction/branches/sphinx/transaction/tests/common.py
U transaction/branches/sphinx/transaction/tests/test__transaction.py
-=-
Modified: transaction/branches/sphinx/transaction/tests/common.py
===================================================================
--- transaction/branches/sphinx/transaction/tests/common.py 2012-12-18 02:59:09 UTC (rev 128743)
+++ transaction/branches/sphinx/transaction/tests/common.py 2012-12-18 05:25:02 UTC (rev 128744)
@@ -38,6 +38,8 @@
self.log('debug', msg, *args, **kw)
def error(self, msg, *args, **kw):
self.log('error', msg, *args, **kw)
+ def critical(self, msg, *args, **kw):
+ self.log('critical', msg, *args, **kw)
class Monkey(object):
Modified: transaction/branches/sphinx/transaction/tests/test__transaction.py
===================================================================
--- transaction/branches/sphinx/transaction/tests/test__transaction.py 2012-12-18 02:59:09 UTC (rev 128743)
+++ transaction/branches/sphinx/transaction/tests/test__transaction.py 2012-12-18 05:25:02 UTC (rev 128744)
@@ -174,8 +174,8 @@
self.assertTrue(tsp._savepoints[0].transaction is t)
def test__unjoin_miss(self):
- tm = self._makeOne()
- tm._unjoin(object()) #no raise
+ txn = self._makeOne()
+ txn._unjoin(object()) #no raise
def test__unjoin_hit(self):
t = self._makeOne()
@@ -468,23 +468,7 @@
def tpc_begin(self, txn):
raise ValueError('test')
broken = BrokenResource()
- class Resource(object):
- _b = _c = _v = _f = _a = _x =False
- def sortKey(self):
- return 'aaa'
- def tpc_begin(self, txn):
- self._b = True
- def commit(self, txn):
- self._c = True
- def tpc_vote(self, txn):
- self._v = True
- def tpc_finish(self, txn):
- self._f = True
- def abort(self, txn):
- self._a = True
- def tpc_abort(self, txn):
- self._x = True
- resource = Resource()
+ resource = Resource('aaa')
_hooked1, _hooked2 = [], []
def _hook1(*args, **kw):
_hooked1.append((args, kw))
@@ -541,43 +525,43 @@
self.assertTrue(synch._after is t) #called in _cleanup
def test_getBeforeCommitHooks_empty(self):
- tm = self._makeOne()
- self.assertEqual(list(tm.getBeforeCommitHooks()), [])
+ txn = self._makeOne()
+ self.assertEqual(list(txn.getBeforeCommitHooks()), [])
def test_addBeforeCommitHook(self):
def _hook(*args, **kw):
pass
- tm = self._makeOne()
- tm.addBeforeCommitHook(_hook, ('one',), dict(uno=1))
- self.assertEqual(list(tm.getBeforeCommitHooks()),
+ txn = self._makeOne()
+ txn.addBeforeCommitHook(_hook, ('one',), dict(uno=1))
+ self.assertEqual(list(txn.getBeforeCommitHooks()),
[(_hook, ('one',), {'uno': 1})])
def test_addBeforeCommitHook_w_kws(self):
def _hook(*args, **kw):
pass
- tm = self._makeOne()
- tm.addBeforeCommitHook(_hook, ('one',))
- self.assertEqual(list(tm.getBeforeCommitHooks()),
+ txn = self._makeOne()
+ txn.addBeforeCommitHook(_hook, ('one',))
+ self.assertEqual(list(txn.getBeforeCommitHooks()),
[(_hook, ('one',), {})])
def test_getAfterCommitHooks_empty(self):
- tm = self._makeOne()
- self.assertEqual(list(tm.getAfterCommitHooks()), [])
+ txn = self._makeOne()
+ self.assertEqual(list(txn.getAfterCommitHooks()), [])
def test_addAfterCommitHook(self):
def _hook(*args, **kw):
pass
- tm = self._makeOne()
- tm.addAfterCommitHook(_hook, ('one',), dict(uno=1))
- self.assertEqual(list(tm.getAfterCommitHooks()),
+ txn = self._makeOne()
+ txn.addAfterCommitHook(_hook, ('one',), dict(uno=1))
+ self.assertEqual(list(txn.getAfterCommitHooks()),
[(_hook, ('one',), {'uno': 1})])
def test_addAfterCommitHook_wo_kws(self):
def _hook(*args, **kw):
pass
- tm = self._makeOne()
- tm.addAfterCommitHook(_hook, ('one',))
- self.assertEqual(list(tm.getAfterCommitHooks()),
+ txn = self._makeOne()
+ txn.addAfterCommitHook(_hook, ('one',))
+ self.assertEqual(list(txn.getAfterCommitHooks()),
[(_hook, ('one',), {})])
def test_callAfterCommitHook_w_error(self):
@@ -591,11 +575,11 @@
_hooked2.append((args, kw))
logger = DummyLogger()
with Monkey(_transaction, _LOGGER=logger):
- tm = self._makeOne()
+ txn = self._makeOne()
logger._clear()
- tm.addAfterCommitHook(_hook1, ('one',))
- tm.addAfterCommitHook(_hook2, ('two',), dict(dos=2))
- tm._callAfterCommitHooks()
+ txn.addAfterCommitHook(_hook1, ('one',))
+ txn.addAfterCommitHook(_hook2, ('two',), dict(dos=2))
+ txn._callAfterCommitHooks()
# second hook gets called even if first raises
self.assertEqual(_hooked2, [((True, 'two',), {'dos': 2})])
self.assertEqual(len(logger._log), 1)
@@ -614,15 +598,139 @@
_hooked2.append((args, kw))
logger = DummyLogger()
with Monkey(_transaction, _LOGGER=logger):
- tm = self._makeOne()
+ txn = self._makeOne()
logger._clear()
- tm.addAfterCommitHook(_hook1, ('one',))
- tm.addAfterCommitHook(_hook2, ('two',), dict(dos=2))
- tm._callAfterCommitHooks()
+ txn.addAfterCommitHook(_hook1, ('one',))
+ txn.addAfterCommitHook(_hook2, ('two',), dict(dos=2))
+ txn._callAfterCommitHooks()
self.assertEqual(logger._log[0][0], 'error')
self.assertTrue(logger._log[0][1].startswith(
"Error in after commit hook"))
+ def test__commitResources_normal(self):
+ from transaction.tests.common import DummyLogger
+ from transaction.tests.common import Monkey
+ from transaction import _transaction
+ resources = [Resource('bbb'), Resource('aaa')]
+ logger = DummyLogger()
+ with Monkey(_transaction, _LOGGER=logger):
+ txn = self._makeOne()
+ logger._clear()
+ txn._resources.extend(resources)
+ txn._commitResources()
+ self.assertEqual(len(txn._voted), 2)
+ for r in resources:
+ self.assertTrue(r._b and r._c and r._v and r._f)
+ self.assertFalse(r._a and r._x)
+ self.assertTrue(id(r) in txn._voted)
+ self.assertEqual(len(logger._log), 2)
+ self.assertEqual(logger._log[0][0], 'debug')
+ self.assertEqual(logger._log[0][1], 'commit Resource: aaa')
+ self.assertEqual(logger._log[1][0], 'debug')
+ self.assertEqual(logger._log[1][1], 'commit Resource: bbb')
+
+ def test__commitResources_error_in_tpc_begin(self):
+ from transaction.tests.common import DummyLogger
+ from transaction.tests.common import Monkey
+ from transaction import _transaction
+ resources = [Resource('bbb', 'tpc_begin'), Resource('aaa')]
+ logger = DummyLogger()
+ with Monkey(_transaction, _LOGGER=logger):
+ txn = self._makeOne()
+ logger._clear()
+ txn._resources.extend(resources)
+ self.assertRaises(ValueError, txn._commitResources)
+ for r in resources:
+ if r._key == 'aaa':
+ self.assertTrue(r._b)
+ else:
+ self.assertFalse(r._b)
+ self.assertFalse(r._c and r._v and r._f)
+ self.assertTrue(r._a and r._x)
+ self.assertEqual(len(logger._log), 0)
+
+ def test__commitResources_error_in_commit(self):
+ from transaction.tests.common import DummyLogger
+ from transaction.tests.common import Monkey
+ from transaction import _transaction
+ resources = [Resource('bbb', 'commit'), Resource('aaa')]
+ logger = DummyLogger()
+ with Monkey(_transaction, _LOGGER=logger):
+ txn = self._makeOne()
+ logger._clear()
+ txn._resources.extend(resources)
+ self.assertRaises(ValueError, txn._commitResources)
+ for r in resources:
+ self.assertTrue(r._b)
+ if r._key == 'aaa':
+ self.assertTrue(r._c)
+ else:
+ self.assertFalse(r._c)
+ self.assertFalse(r._v and r._f)
+ self.assertTrue(r._a and r._x)
+ self.assertEqual(len(logger._log), 1)
+ self.assertEqual(logger._log[0][0], 'debug')
+ self.assertEqual(logger._log[0][1], 'commit Resource: aaa')
+
+ def test__commitResources_error_in_tpc_vote(self):
+ from transaction.tests.common import DummyLogger
+ from transaction.tests.common import Monkey
+ from transaction import _transaction
+ resources = [Resource('bbb', 'tpc_vote'), Resource('aaa')]
+ logger = DummyLogger()
+ with Monkey(_transaction, _LOGGER=logger):
+ txn = self._makeOne()
+ logger._clear()
+ txn._resources.extend(resources)
+ self.assertRaises(ValueError, txn._commitResources)
+ self.assertEqual(len(txn._voted), 1)
+ for r in resources:
+ self.assertTrue(r._b and r._c)
+ if r._key == 'aaa':
+ self.assertTrue(id(r) in txn._voted)
+ self.assertTrue(r._v)
+ self.assertFalse(r._f)
+ self.assertFalse(r._a)
+ self.assertTrue(r._x)
+ else:
+ self.assertFalse(id(r) in txn._voted)
+ self.assertFalse(r._v)
+ self.assertFalse(r._f)
+ self.assertTrue(r._a and r._x)
+ self.assertEqual(len(logger._log), 2)
+ self.assertEqual(logger._log[0][0], 'debug')
+ self.assertEqual(logger._log[0][1], 'commit Resource: aaa')
+ self.assertEqual(logger._log[1][0], 'debug')
+ self.assertEqual(logger._log[1][1], 'commit Resource: bbb')
+
+ def test__commitResources_error_in_tpc_finish(self):
+ from transaction.tests.common import DummyLogger
+ from transaction.tests.common import Monkey
+ from transaction import _transaction
+ resources = [Resource('bbb', 'tpc_finish'), Resource('aaa')]
+ logger = DummyLogger()
+ with Monkey(_transaction, _LOGGER=logger):
+ txn = self._makeOne()
+ logger._clear()
+ txn._resources.extend(resources)
+ self.assertRaises(ValueError, txn._commitResources)
+ for r in resources:
+ self.assertTrue(r._b and r._c and r._v)
+ self.assertTrue(id(r) in txn._voted)
+ if r._key == 'aaa':
+ self.assertTrue(r._f)
+ else:
+ self.assertFalse(r._f)
+ self.assertFalse(r._a and r._x) #no cleanup if tpc_finish raises
+ self.assertEqual(len(logger._log), 3)
+ self.assertEqual(logger._log[0][0], 'debug')
+ self.assertEqual(logger._log[0][1], 'commit Resource: aaa')
+ self.assertEqual(logger._log[1][0], 'debug')
+ self.assertEqual(logger._log[1][1], 'commit Resource: bbb')
+ self.assertEqual(logger._log[2][0], 'critical')
+ self.assertTrue(logger._log[2][1].startswith(
+ 'A storage error occurred'))
+
def test_note(self):
t = self._makeOne()
try:
@@ -723,6 +831,40 @@
transaction.abort() # should do nothing
self.assertEqual(list(dm.keys()), ['a'])
+class Resource(object):
+ _b = _c = _v = _f = _a = _x = False
+ def __init__(self, key, error=None):
+ self._key = key
+ self._error = error
+ def __repr__(self):
+ return 'Resource: %s' % self._key
+ def sortKey(self):
+ return self._key
+ def tpc_begin(self, txn):
+ if self._error == 'tpc_begin':
+ raise ValueError()
+ self._b = True
+ def commit(self, txn):
+ if self._error == 'commit':
+ raise ValueError()
+ self._c = True
+ def tpc_vote(self, txn):
+ if self._error == 'tpc_vote':
+ raise ValueError()
+ self._v = True
+ def tpc_finish(self, txn):
+ if self._error == 'tpc_finish':
+ raise ValueError()
+ self._f = True
+ def abort(self, txn):
+ if self._error == 'abort':
+ raise ValueError()
+ self._a = True
+ def tpc_abort(self, txn):
+ if self._error == 'tpc_abort':
+ raise ValueError()
+ self._x = True
+
def test_suite():
return unittest.TestSuite((
unittest.makeSuite(TransactionTests),
More information about the checkins
mailing list