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))