Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
            }
        }