diff --git a/product/CMFActivity/tests/testCMFActivity.py b/product/CMFActivity/tests/testCMFActivity.py index e91420ee739a0ec80c204135237278297b211bd1..31ee3d1445b23d016b0e25b40f9f8d5cb5e952ad 100644 --- a/product/CMFActivity/tests/testCMFActivity.py +++ b/product/CMFActivity/tests/testCMFActivity.py @@ -2454,6 +2454,68 @@ class TestCMFActivity(ERP5TypeTestCase): finally: delattr(Organisation, 'modifySQL') + def TryActivityRaiseInCommitDoesNotStallActivityConection(self, activity): + """ + Check that an activity which commit raises (as would a regular conflict + error be raised in tpc_vote) does not cause activity connection to + stall. + """ + get_transaction().commit() + self.tic() + activity_tool = self.getActivityTool() + from Shared.DC.ZRDB.TM import TM + class dummy_tm(TM): + def tpc_vote(self, *ignored): + raise Exception, 'vote always raises' + + def _finish(self): + pass + + def _abort(self): + pass + dummy_tm_instance = dummy_tm() + def registerFailingTransactionManager(self, *args, **kw): + dummy_tm_instance._register() + try: + Organisation.registerFailingTransactionManager = registerFailingTransactionManager + obj = self.getPortal().organisation_module.newContent(portal_type='Organisation') + get_transaction().commit() + self.tic() + now = DateTime() + obj.activate(activity=activity).registerFailingTransactionManager() + get_transaction().commit() + self.flushAllActivities(silent=1, loop_size=100) + get_transaction().commit() + # Check that cmf_activity SQL connection still works + connection_da_pool = self.getPortalObject().cmf_activity_sql_connection() + import thread + connection_da = connection_da_pool._db_pool[thread.get_ident()] + self.assertFalse(connection_da._registered) + connection_da_pool.query('select 1') + self.assertTrue(connection_da._registered) + get_transaction().commit() + self.assertFalse(connection_da._registered) + finally: + delattr(Organisation, 'registerFailingTransactionManager') + + def test_96_ActivityRaiseInCommitDoesNotStallActivityConectionSQLDict(self, quiet=0, run=run_all_test): + if not run: return + if not quiet: + message = '\nCheck that raising in commit does not stall cmf activity SQL connection (SQLDict)' + ZopeTestCase._print(message) + LOG('Testing... ',0,message) + self.TryActivityRaiseInCommitDoesNotStallActivityConection('SQLDict') + + def test_97_ActivityRaiseInCommitDoesNotStallActivityConectionSQLQueue(self, quiet=0, run=run_all_test): + if not run: return + if not quiet: + message = '\nCheck that raising in commit does not stall cmf activity SQL connection (SQLQueue)' + ZopeTestCase._print(message) + LOG('Testing... ',0,message) + self.TryActivityRaiseInCommitDoesNotStallActivityConection('SQLQueue') + + + def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestCMFActivity))