public async Task BatchRequestNoRetryPolicyNoRetriesExecutedWithAggregateException() { int serviceRequestFuncCallCount = 0; var request = new BatchRequest < JobScheduleListOptions, AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > >(null, CancellationToken.None); request.ServiceRequestFunc = async(token) => { ++serviceRequestFuncCallCount; Action throwsAction = () => { throw new ArgumentException(); }; Task throwsTask1 = Task.Factory.StartNew(throwsAction); Task throwsTask2 = Task.Factory.StartNew(throwsAction); await Task.WhenAll(throwsTask1, throwsTask2); //This will throw return(null); }; Task executeRequestTask = request.ExecuteRequestAsync(); //We will observe only 1 exception (not an Aggregate) from the throw ArgumentException e = await Assert.ThrowsAsync <ArgumentException>(async() => { await executeRequestTask; }); //But the task itself should have the full set of exceptions which were hit AggregateException aggregateException = executeRequestTask.Exception; //TODO: Why can't this be 2? //Assert.Equal(2, aggregateException.InnerExceptions.Count); Assert.Equal(1, aggregateException.InnerExceptions.Count); Assert.Equal(1, serviceRequestFuncCallCount); }
public async Task BatchRequestRetriesExecutedWithAggregateException() { TimeSpan deltaBackoff = TimeSpan.FromSeconds(0); const int maxRetries = 5; int serviceRequestFuncCallCount = 0; var request = new BatchRequest < JobScheduleListOptions, AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > >(null, CancellationToken.None); request.ServiceRequestFunc = async(token) => { ++serviceRequestFuncCallCount; void throwsAction() { throw new InvalidOperationException(); } Task throwsTask1 = Task.Factory.StartNew(throwsAction); Task throwsTask2 = Task.Factory.StartNew(throwsAction); await Task.WhenAll(throwsTask1, throwsTask2); //This will throw return(null); }; IRetryPolicy policy = new LinearRetry(deltaBackoff, maxRetries); request.RetryPolicy = policy; Task executeRequestTask = request.ExecuteRequestAsync(); //We will observe only 1 exception (not an Aggregate) from the throw InvalidOperationException e = await Assert.ThrowsAsync <InvalidOperationException>(async() => { await executeRequestTask; }); //But the task itself should have the full set of exceptions which were hit AggregateException aggregateException = executeRequestTask.Exception; //TODO: Why can't this be 2? //Assert.Equal(2, aggregateException.InnerExceptions.Count); Assert.Single(aggregateException.InnerExceptions); Assert.Equal(maxRetries + 1, serviceRequestFuncCallCount); Assert.Equal(maxRetries + 1, request.OperationContext.RequestResults.Count); foreach (RequestResult requestResult in request.OperationContext.RequestResults) { Assert.IsType <InvalidOperationException>(requestResult.Exception); Assert.Null(requestResult.RequestInformation.BatchError); Assert.Null(requestResult.RequestInformation.HttpStatusCode); Assert.Null(requestResult.RequestInformation.HttpStatusMessage); Assert.Null(requestResult.RequestInformation.ServiceRequestId); Assert.NotEqual(Guid.Empty, requestResult.RequestInformation.ClientRequestId); } }
public async Task BatchRequestSetClientRequestIdOnRetries() { TimeSpan deltaBackoff = TimeSpan.FromSeconds(0); const int maxRetries = 5; var request = new BatchRequest < JobScheduleListOptions, AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > >(null, CancellationToken.None); List <Guid> generatedGuidList = new List <Guid>(); request.ClientRequestIdProvider = new ClientRequestIdProvider(br => { Guid generatedGuid = Guid.NewGuid(); generatedGuidList.Add(generatedGuid); return(generatedGuid); }); request.ServiceRequestFunc = (token) => { throw new TimeoutException(); }; IRetryPolicy policy = new ExponentialRetry(deltaBackoff, maxRetries); request.RetryPolicy = policy; TimeoutException e = await Assert.ThrowsAsync <TimeoutException>(async() => { await request.ExecuteRequestAsync(); }); Assert.Equal(maxRetries + 1, request.OperationContext.RequestResults.Count); for (int i = 0; i < generatedGuidList.Count; i++) { Guid generatedGuid = generatedGuidList[i]; Assert.Equal(generatedGuid, request.OperationContext.RequestResults[i].RequestInformation.ClientRequestId); } }
public async Task BatchRequestRetryPolicyNoExceptionNoRetries() { TimeSpan deltaBackoff = TimeSpan.FromSeconds(0); const int maxRetries = 5; int serviceRequestFuncCallCount = 0; var request = new BatchRequest < JobScheduleListOptions, AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > >(null, CancellationToken.None); request.ServiceRequestFunc = (token) => { ++serviceRequestFuncCallCount; return(Task.FromResult(default(AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> >))); }; IRetryPolicy policy = new ExponentialRetry(deltaBackoff, maxRetries); request.RetryPolicy = policy; AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > result = await request.ExecuteRequestAsync(); Assert.Null(result); Assert.Equal(1, serviceRequestFuncCallCount); }
public async Task BatchRequestRetryStackTracePreserved() { var request = new BatchRequest < JobScheduleListOptions, AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > >(null, CancellationToken.None); request.ServiceRequestFunc = (token) => { throw new TimeoutException(); }; IRetryPolicy policy = new ExponentialRetry(TimeSpan.FromSeconds(0), 3); request.RetryPolicy = policy; TimeoutException e = await Assert.ThrowsAsync <TimeoutException>(async() => { await request.ExecuteRequestAsync(); }); //The StackTrace should contain this method Assert.Contains("BatchRequestRetryStackTracePreserved", e.StackTrace); }
public async Task BatchRequestRetriesExecutedWithNonBatchException() { TimeSpan deltaBackoff = TimeSpan.FromMilliseconds(100); const int maxRetries = 5; int serviceRequestFuncCallCount = 0; var request = new BatchRequest < JobScheduleListOptions, AzureOperationResponse <IPage <ProxyModels.CloudJobSchedule> > >(null, CancellationToken.None); request.ServiceRequestFunc = (token) => { ++serviceRequestFuncCallCount; throw new TimeoutException(); }; IRetryPolicy policy = new LinearRetry(deltaBackoff, maxRetries); request.RetryPolicy = policy; TimeoutException e = await Assert.ThrowsAsync <TimeoutException>(async() => { await request.ExecuteRequestAsync(); }); Assert.Equal(maxRetries + 1, serviceRequestFuncCallCount); Assert.Equal(maxRetries + 1, request.OperationContext.RequestResults.Count); foreach (RequestResult requestResult in request.OperationContext.RequestResults) { Assert.IsType <TimeoutException>(requestResult.Exception); Assert.Null(requestResult.RequestInformation.BatchError); Assert.Null(requestResult.RequestInformation.HttpStatusCode); Assert.Null(requestResult.RequestInformation.HttpStatusMessage); Assert.Null(requestResult.RequestInformation.ServiceRequestId); Assert.NotEqual(Guid.Empty, requestResult.RequestInformation.ClientRequestId); } }