public static object CreateLoader(RetryLogicConfigs cnnConfig, RetryLogicConfigs cmdConfig) { var cnnCfgType = s_sqlClientAssembly.GetType(CnnCfgTypeName); var cnnCfgObj = Activator.CreateInstance(cnnCfgType); SetValue(cnnCfgObj, cnnCfgType, "DeltaTime", cnnConfig.DeltaTime); SetValue(cnnCfgObj, cnnCfgType, "MinTimeInterval", cnnConfig.MinTimeInterval); SetValue(cnnCfgObj, cnnCfgType, "MaxTimeInterval", cnnConfig.MaxTimeInterval); SetValue(cnnCfgObj, cnnCfgType, "NumberOfTries", cnnConfig.NumberOfTries); SetValue(cnnCfgObj, cnnCfgType, "AuthorizedSqlCondition", cnnConfig.AuthorizedSqlCondition); SetValue(cnnCfgObj, cnnCfgType, "TransientErrors", cnnConfig.TransientErrors); SetValue(cnnCfgObj, cnnCfgType, "RetryLogicType", cnnConfig.RetryLogicType); SetValue(cnnCfgObj, cnnCfgType, "RetryMethod", cnnConfig.RetryMethodName); var cmdCfgType = s_sqlClientAssembly.GetType(CmdCfgTypeName); var cmdCfgObj = Activator.CreateInstance(cmdCfgType); SetValue(cmdCfgObj, cmdCfgType, "DeltaTime", cmdConfig.DeltaTime); SetValue(cmdCfgObj, cmdCfgType, "MinTimeInterval", cmdConfig.MinTimeInterval); SetValue(cmdCfgObj, cmdCfgType, "MaxTimeInterval", cmdConfig.MaxTimeInterval); SetValue(cmdCfgObj, cmdCfgType, "NumberOfTries", cmdConfig.NumberOfTries); SetValue(cmdCfgObj, cmdCfgType, "AuthorizedSqlCondition", cmdConfig.AuthorizedSqlCondition); SetValue(cmdCfgObj, cmdCfgType, "TransientErrors", cmdConfig.TransientErrors); SetValue(cmdCfgObj, cmdCfgType, "RetryLogicType", cmdConfig.RetryLogicType); SetValue(cmdCfgObj, cmdCfgType, "RetryMethod", cmdConfig.RetryMethodName); return(s_loaderCtorInfo.Invoke(new object[] { cnnCfgObj, cmdCfgObj, default, default }));
public void OutOfRangeTime(TimeSpan deltaTime, TimeSpan minTime, TimeSpan maxTime) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); cnnCfg.DeltaTime = deltaTime; RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix, @"Don't care!"); bool switchValue = true; var ex = Assert.Throws <System.Reflection.TargetInvocationException>(() => RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, switchValue, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider)); Assert.Equal(typeof(System.Configuration.ConfigurationErrorsException), ex.InnerException?.GetType()); Assert.Equal(typeof(ArgumentException), ex.InnerException?.InnerException?.GetType()); cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); cnnCfg.MinTimeInterval = minTime; ex = Assert.Throws <System.Reflection.TargetInvocationException>(() => RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, switchValue, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider)); Assert.Equal(typeof(System.Configuration.ConfigurationErrorsException), ex.InnerException?.GetType()); Assert.Equal(typeof(ArgumentException), ex.InnerException?.InnerException?.GetType()); cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); cnnCfg.MaxTimeInterval = maxTime; ex = Assert.Throws <System.Reflection.TargetInvocationException>(() => RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, switchValue, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider)); Assert.Equal(typeof(System.Configuration.ConfigurationErrorsException), ex.InnerException?.GetType()); Assert.Equal(typeof(ArgumentException), ex.InnerException?.InnerException?.GetType()); }
public void LoadValidInternalTypes(string method1, string method2) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(method1); RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(method2, // Doesn't accept DML statements @"^\b(?!UPDATE|DELETE|TRUNCATE|INSERT( +INTO){0,1})\b"); // for sake of reducing the retry time in total cnnCfg.NumberOfTries = 1; cmdCfg.NumberOfTries = 1; object loaderObj = RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider); Assert.NotNull(loaderObj); RetryLogicConfigHelper.AssessProvider(cnnProvider, cnnCfg); RetryLogicConfigHelper.AssessProvider(cmdProvider, cmdCfg); // check the retry in action s_connectionCRLTest.ConnectionRetryOpenInvalidCatalogFailed(TcpCnnString, cnnProvider); s_commandCRLTest.RetryExecuteFail(TcpCnnString, cmdProvider); if (DataTestUtility.IsNotAzureSynapse()) { s_commandCRLTest.RetryExecuteUnauthorizedSqlStatementDML(TcpCnnString, cmdProvider); } }
private void TestCommandExecute(SqlRetryLogicBaseProvider provider, RetryLogicConfigs cnfig) { using (SqlConnection cnn = new SqlConnection(TcpCnnString)) using (SqlCommand cmd = new SqlCommand()) { cnn.Open(); cmd.Connection = cnn; cmd.RetryLogicProvider = provider; cmd.CommandText = "SELECT bad command"; var ex = Assert.Throws <AggregateException>(() => cmd.ExecuteScalar()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); ex = Assert.Throws <AggregateException>(() => cmd.ExecuteReader()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); ex = Assert.Throws <AggregateException>(() => cmd.ExecuteReader(CommandBehavior.Default)); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); ex = Assert.Throws <AggregateException>(() => cmd.ExecuteNonQuery()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); if (DataTestUtility.IsNotAzureSynapse()) { cmd.CommandText = cmd.CommandText + " FOR XML AUTO"; ex = Assert.Throws <AggregateException>(() => cmd.ExecuteXmlReader()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); } } }
private void TestConnection(SqlRetryLogicBaseProvider provider, RetryLogicConfigs cnfig) { using (SqlConnection cnn = new SqlConnection(InvalidTcpCnnString)) { cnn.RetryLogicProvider = provider; var ex = Assert.Throws <AggregateException>(() => cnn.Open()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); var tex = Assert.ThrowsAsync <AggregateException>(() => cnn.OpenAsync()); Assert.Equal(cnfig.NumberOfTries, tex.Result.InnerExceptions.Count); } }
public void InvalidTransientError(string errors) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); cnnCfg.TransientErrors = errors; RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix, @"Don't care!"); var ex = Assert.Throws <System.Reflection.TargetInvocationException>(() => RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider)); Assert.Equal(typeof(System.Configuration.ConfigurationErrorsException), ex.InnerException?.GetType()); Assert.Equal(typeof(ArgumentException), ex.InnerException?.InnerException?.GetType()); }
public void InvalidNumberOfTries(int num) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); cnnCfg.NumberOfTries = num; RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix, @"Don't care!"); bool switchValue = true; var ex = Assert.Throws <System.Reflection.TargetInvocationException>(() => RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, switchValue, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider)); Assert.Equal(typeof(System.Configuration.ConfigurationErrorsException), ex.InnerException?.GetType()); Assert.Equal(typeof(ArgumentException), ex.InnerException?.InnerException?.GetType()); }
public void InvalidRetryMethodName(string methodName) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(methodName); RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(methodName, @"Don't care!"); object loaderObj = RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider); Assert.NotNull(loaderObj); // none retriable logic applies. s_connectionCRLTest.DefaultOpenWithoutRetry(TcpCnnString, cnnProvider); s_commandCRLTest.NoneRetriableExecuteFail(TcpCnnString, cmdProvider); }
public void LoadValidInternalTypesWithoutEnablingSwitch(string method1, string method2) { bool switchValue = false; RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(method1); RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(method2, @"Don't care!"); object loaderObj = RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, switchValue, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider); Assert.NotNull(loaderObj); RetryLogicConfigHelper.AssessProvider(cnnProvider, cnnCfg, switchValue); RetryLogicConfigHelper.AssessProvider(cmdProvider, cmdCfg, switchValue); s_connectionCRLTest.DefaultOpenWithoutRetry(TcpCnnString, cnnProvider); s_commandCRLTest.NoneRetriableExecuteFail(TcpCnnString, cmdProvider); }
public void LoadInvalidCustomRetryLogicType(string typeName, string methodName) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(methodName); RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(methodName); // for sake of reducing the retry time in total cnnCfg.RetryLogicType = typeName; cmdCfg.RetryLogicType = typeName; // for sake of reducing the retry time in total cnnCfg.NumberOfTries = 1; cmdCfg.NumberOfTries = 3; object loaderObj = RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider); Assert.NotNull(loaderObj); s_connectionCRLTest.DefaultOpenWithoutRetry(TcpCnnString, cnnProvider); s_commandCRLTest.NoneRetriableExecuteFail(TcpCnnString, cmdProvider); }
public void LoadCustomMethod(string typeName, string methodName) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(methodName); RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(methodName); // for sake of reducing the retry time in total cnnCfg.RetryLogicType = typeName; cmdCfg.RetryLogicType = typeName; // for sake of reducing the retry time in total cnnCfg.NumberOfTries = 1; cmdCfg.NumberOfTries = 3; object loaderObj = RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider); Assert.NotNull(loaderObj); TestConnection(cnnProvider, cnnCfg); TestCommandExecute(cmdProvider, cmdCfg); TestCommandExecuteAsync(cmdProvider, cmdCfg).Wait(); }
public void InvalidRetryLogicTypeWithValidInternalMethodName(string typeName) { RetryLogicConfigs cnnCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); cnnCfg.RetryLogicType = typeName; RetryLogicConfigs cmdCfg = RetryLogicConfigHelper.CreateRandomConfig(RetryLogicConfigHelper.RetryMethodName_Fix); // for sake of reducing the retry time in total cnnCfg.NumberOfTries = 1; cmdCfg.NumberOfTries = 1; object loaderObj = RetryLogicConfigHelper.ReturnLoaderAndProviders(cnnCfg, cmdCfg, out SqlRetryLogicBaseProvider cnnProvider, out SqlRetryLogicBaseProvider cmdProvider); Assert.NotNull(loaderObj); RetryLogicConfigHelper.AssessProvider(cnnProvider, cnnCfg); RetryLogicConfigHelper.AssessProvider(cmdProvider, cmdCfg); // internal type used to resolve the specified method s_connectionCRLTest.ConnectionRetryOpenInvalidCatalogFailed(TcpCnnString, cnnProvider); s_commandCRLTest.RetryExecuteFail(TcpCnnString, cmdProvider); }
private async Task TestCommandExecuteAsync(SqlRetryLogicBaseProvider provider, RetryLogicConfigs cnfig) { using (SqlConnection cnn = new SqlConnection(TcpCnnString)) using (SqlCommand cmd = new SqlCommand()) { cnn.Open(); cmd.Connection = cnn; cmd.RetryLogicProvider = provider; cmd.CommandText = "SELECT bad command"; var ex = await Assert.ThrowsAsync <AggregateException>(() => cmd.ExecuteScalarAsync()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); ex = await Assert.ThrowsAsync <AggregateException>(() => cmd.ExecuteReaderAsync()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); ex = await Assert.ThrowsAsync <AggregateException>(() => cmd.ExecuteReaderAsync(CommandBehavior.Default)); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); ex = await Assert.ThrowsAsync <AggregateException>(() => cmd.ExecuteNonQueryAsync()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); cmd.CommandText = cmd.CommandText + " FOR XML AUTO"; ex = await Assert.ThrowsAsync <AggregateException>(() => cmd.ExecuteXmlReaderAsync()); Assert.Equal(cnfig.NumberOfTries, ex.InnerExceptions.Count); } }