def _runTransientErrorRetryTest(self, numErrors): for errorCode in _ALL_RETRIABLE_ERROR_CODES: clientSideEffects = [sqlalchemy.exc.OperationalError( orig=MySQLdb.OperationalError(errorCode), statement="err", params=None)] \ * numErrors + [DEFAULT] serverSideEffects = [sqlalchemy.exc.InternalError( orig=MySQLdb.InternalError(errorCode), statement="err", params=None)] \ * numErrors + [DEFAULT] if 3000 > errorCode >= 2000: # The error is client side. Return one operationalError, then pass with patch.object(Engine, "execute", spec_set=Engine.execute, side_effect=clientSideEffects) \ as mockExecute: retryOnTransientErrors(mockExecute)(Mock()) self.assertEqual(mockExecute.call_count, numErrors + 1) elif errorCode >= 1000: # The error is server side. Return one internalError, then pass with patch.object(Engine, "execute", spec_set=Engine.execute, side_effect=serverSideEffects) \ as mockExecute: retryOnTransientErrors(mockExecute)(Mock()) self.assertEqual(mockExecute.call_count, numErrors + 1) else: self.fail("Error code is neither client nor server: %s" % errorCode)
def test_mysql_command_internal_error(self, db_cursor_mock, setup_mysql_loop_mock): db_cursor_mock.execute.side_effect = MySQLdb.InternalError() setup_mysql_loop_mock.side_effect = exceptions.DbError() self.assertRaises(exceptions.DbError, self.db.mysql_command, 'execute', 'test_sql', True, 'test_arg') db_cursor_mock.execute.assert_called_once_with('test_sql', ('test_arg', ))