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 testNonTransientError(self): # Pass MySQLdb error constant for CANT_CREATE_TABLE errorCode = 1005 #The error is client side. Return an operationalError with patch.object(Engine, "execute", spec_set=Engine.execute, side_effect=[sqlalchemy.exc.OperationalError( orig=MySQLdb.OperationalError(errorCode), statement="err", params=None)])\ as mockExecute: self.assertRaises(sqlalchemy.exc.OperationalError, retryOnTransientErrors(mockExecute))