示例#1
0
        public async Task Retry_OneMessageHasBeenReadTransientExceptionOccured_Throws()
        {
            int callCounter = 0;

            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var memoryStream     = new NotSeekableStream(new byte[] { 1, 2, 3 });
            var message          = new Message(memoryStream);
            var messages         = new[] { message };

            innerHandlerMock.SendEventAsync(Arg.Is(messages), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;
                Message m     = t.Arg <IEnumerable <Message> >().First();
                Stream stream = m.GetBodyStream();
                var buffer    = new byte[3];
                stream.Read(buffer, 0, 3);
                throw new IotHubClientTransientException("");
            });

            var sut = new RetryDelegatingHandler(innerHandlerMock);
            var cancellationToken = new CancellationToken();
            await sut.SendEventAsync(messages, cancellationToken).ExpectedAsync <IotHubClientTransientException>();

            Assert.AreEqual(callCounter, 1);
        }
        public async Task DeviceNotFoundExceptionReturnsDeviceDisabledStatus()
        {
            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(t => throw new DeviceNotFoundException());

            ConnectionStatus?              status              = null;
            ConnectionStatusChangeReason?  statusChangeReason  = null;
            ConnectionStatusChangesHandler statusChangeHandler = (s, r) =>
            {
                status             = s;
                statusChangeReason = r;
            };

            contextMock.Get <ConnectionStatusChangesHandler>().Returns(statusChangeHandler);

            var cancellationToken = new CancellationToken();
            var testee            = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            await((Func <Task>)(() => testee.OpenAsync(cancellationToken))).ExpectedAsync <DeviceNotFoundException>().ConfigureAwait(false);

            Assert.AreEqual(ConnectionStatus.Disconnected, status);
            Assert.AreEqual(ConnectionStatusChangeReason.Device_Disabled, statusChangeReason);
        }
        private void PostInit(string baseUri, RestClient restClient)
        {
            this._restClient = restClient;
            if (baseUri == null)
            {
                throw new ArgumentNullException("baseUri");
            }
            if (restClient.Credentials == null)
            {
                throw new ArgumentNullException("credentials");
            }

            BaseUri     = new Uri(baseUri);
            Credentials = restClient.Credentials;
            if (Credentials != null)
            {
                Credentials.InitializeServiceClient(this);
            }

            // Set RetryPolicy
            RetryDelegatingHandler delegatingHandler = this.HttpMessageHandlers.OfType <RetryDelegatingHandler>().FirstOrDefault();

            if (delegatingHandler != null && this._restClient.RetryPolicy != null &&
                delegatingHandler.RetryPolicy != this._restClient.RetryPolicy)
            {
                delegatingHandler.RetryPolicy = this._restClient.RetryPolicy;
            }
        }
        public async Task HttpClientTimeoutReturnsErrorResponse(string content)
        {
            // Setup the RetryDelegatingHandler to retry very quickly.
            var retryStrategy = new FixedIntervalRetryStrategy(Int32.MaxValue, TimeSpan.FromTicks(1));
            var retryPolicy   = new RetryPolicy(new HttpStatusCodeErrorDetectionStrategy(), retryStrategy);

            var fakeHttpHandler = new FakeHttpHandler
            {
                TweakResponse = (response) =>
                {
                    response.Content = content == null ? null : new StringContent(String.Empty);
                }
            };

            var retryHandler = new RetryDelegatingHandler(retryPolicy, fakeHttpHandler);

            // Setup HttpClient to timeout after 500 milliseconds.
            var httpClient = new HttpClient(retryHandler, false)
            {
                Timeout = TimeSpan.FromMilliseconds(500)
            };

            // Make a request using the HttpClient.
            var fakeClient      = new FakeServiceClient(httpClient);
            var responseMessage = fakeClient.DoStuffSync();

            Assert.NotNull(responseMessage);
            Assert.True(fakeHttpHandler.NumberOfTimesFailedSoFar > 1);
            Assert.Equal(HttpStatusCode.InternalServerError, responseMessage.StatusCode);
        }
        public async Task OpenAsyncInnerFailedSutIsOpenAndCanBeReopen()
        {
            var  contextMock      = Substitute.For <IPipelineContext>();
            var  innerHandlerMock = Substitute.For <IDelegatingHandler>();
            bool shouldThrow      = true;

            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(ci =>
            {
                if (shouldThrow)
                {
                    throw new IOException();
                }
                else
                {
                    return(TaskHelpers.CompletedTask);;
                }
            });

            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);
            var cancellationToken = new CancellationToken();
            await sut.OpenAsync(cancellationToken).ExpectedAsync <IOException>().ConfigureAwait(false);

            shouldThrow = false;

            await sut.OpenAsync(cancellationToken).ConfigureAwait(false);
        }
示例#6
0
        public async Task Retry_MessageHasBeenReadTransientExceptionOccured_Throws()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var memoryStream     = new NotSeekableStream(new byte[] { 1, 2, 3 });
            var message          = new Message(memoryStream);

            innerHandlerMock.SendEventAsync(Arg.Is(message), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;
                var m         = t.Arg <Message>();
                Stream stream = m.GetBodyStream();
                var buffer    = new byte[3];
                stream.Read(buffer, 0, 3);
                throw new IotHubClientTransientException("");
            });

            var sut = new RetryDelegatingHandler(contextMock);

            sut.ContinuationFactory = c => innerHandlerMock;

            var cancellationToken = new CancellationToken();
            await sut.SendEventAsync(message, cancellationToken).ExpectedAsync <IotHubClientTransientException>();

            Assert.AreEqual(callCounter, 1);
        }
示例#7
0
        public async Task Retry_NonTransientErrorThrown_Throws()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(true, Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;

                if (callCounter == 1)
                {
                    throw new InvalidOperationException("");
                }
                return(TaskConstants.Completed);
            });

            var sut = new RetryDelegatingHandler(contextMock);

            sut.ContinuationFactory = c => innerHandlerMock;
            var cancellationToken = new CancellationToken();
            await sut.OpenAsync(true, cancellationToken).ExpectedAsync <InvalidOperationException>();

            Assert.AreEqual(callCounter, 1);
        }
示例#8
0
        public async Task Retry_TransientErrorOccured_Retried()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(true, Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;

                if (callCounter == 1)
                {
                    throw new IotHubClientTransientException("");
                }
                return(TaskConstants.Completed);
            });

            var sut = new RetryDelegatingHandler(contextMock);

            sut.ContinuationFactory = c => innerHandlerMock;

            var cancellationToken = new CancellationToken();
            await sut.OpenAsync(true, cancellationToken);

            Assert.AreEqual(2, callCounter);
        }
        public async Task RetryMessageWithSeekableStreamHasBeenReadTransientExceptionOccuredThrows()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var message          = new Message(new MemoryStream(new byte[] { 1, 2, 3 }));

            innerHandlerMock.SendEventAsync(Arg.Is(message), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;
                var m         = t.Arg <Message>();
                Stream stream = m.GetBodyStream();
                var buffer    = new byte[3];
                stream.Read(buffer, 0, 3);
                if (callCounter == 1)
                {
                    throw new IotHubClientTransientException("");
                }
                return(TaskConstants.Completed);
            });

            var sut = new RetryDelegatingHandler(contextMock);

            sut.ContinuationFactory = c => innerHandlerMock;
            var cancellationToken = new CancellationToken();
            await sut.SendEventAsync(message, cancellationToken).ConfigureAwait(false);

            Assert.AreEqual(callCounter, 2);
        }
示例#10
0
        public async Task Retry_OneMessageHasBeenTouchedTransientExceptionOccured_Success()
        {
            int callCounter = 0;

            var contextMock                = Substitute.For <IPipelineContext>();
            var innerHandlerMock           = Substitute.For <IDelegatingHandler>();
            var message                    = new Message(new MemoryStream(new byte[] { 1, 2, 3 }));
            IEnumerable <Message> messages = new[] { message };

            innerHandlerMock.SendEventAsync(Arg.Is(messages), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;

                Message m     = t.Arg <IEnumerable <Message> >().First();
                Stream stream = m.GetBodyStream();
                if (callCounter == 1)
                {
                    throw new IotHubClientTransientException("");
                }
                var buffer = new byte[3];
                stream.Read(buffer, 0, 3);
                return(TaskConstants.Completed);
            });

            var sut = new RetryDelegatingHandler(contextMock);

            sut.ContinuationFactory = c => innerHandlerMock;
            var cancellationToken = new CancellationToken();
            await sut.SendEventAsync(messages, cancellationToken);

            Assert.AreEqual(2, callCounter);
        }
示例#11
0
        // Creates a single HttpMessageHandler to construct a HttpClient with from a base httpMessageHandler and some number of custom delegating handlers
        // This is almost a copy of the Microsoft.Rest.ClientRuntime library's implementation, but with the return and parameter type HttpClientHandler replaced
        // with the more abstract HttpMessageHandler in order for us to set the base handler as either a SocketsHttpHandler for .net core or an HttpClientHandler otherwise
        // https://github.com/Azure/azure-sdk-for-net/blob/99f4da88ab0aa01c79aa291c6c101ab94c4ac940/sdk/mgmtcommon/ClientRuntime/ClientRuntime/ServiceClient.cs#L376
        private static HttpMessageHandler CreateHttpHandlerPipeline(HttpMessageHandler httpMessageHandler, params DelegatingHandler[] handlers)
        {
            // The RetryAfterDelegatingHandler should be the absolute outermost handler
            // because it's extremely lightweight and non-interfering
            HttpMessageHandler currentHandler =
#pragma warning disable CA2000 // Dispose objects before losing scope (delegating handler is disposed when the http client that uses it is disposed)
                new RetryDelegatingHandler(new RetryAfterDelegatingHandler {
                InnerHandler = httpMessageHandler
            });

#pragma warning restore CA2000 // Dispose objects before losing scope

            if (handlers != null)
            {
                for (int i = handlers.Length - 1; i >= 0; --i)
                {
                    DelegatingHandler handler = handlers[i];
                    // Non-delegating handlers are ignored since we always
                    // have RetryDelegatingHandler as the outer-most handler
                    while (handler.InnerHandler is DelegatingHandler)
                    {
                        handler = handler.InnerHandler as DelegatingHandler;
                    }

                    handler.InnerHandler = currentHandler;
                    currentHandler       = handlers[i];
                }
            }

            return(currentHandler);
        }
        private DelegatingHandler CreateHttpHandlerPipeline(HttpClientHandler httpClientHandler, params DelegatingHandler[] handlers)
        {
            // Now, the RetryAfterDelegatingHandler should be the absolute outermost handler
            // because it's extremely lightweight and non-interfering
            DelegatingHandler currentHandler =
#pragma warning disable CA2000 // Dispose objects before losing scope (suppressing this warning, for now! we will address this once we implement HttpClientFactory in a future release)
                new RetryDelegatingHandler(new RetryAfterDelegatingHandler {
                InnerHandler = httpClientHandler
            });

#pragma warning restore CA2000 // Dispose objects before losing scope

            if (handlers != null)
            {
                for (var i = handlers.Length - 1; i >= 0; --i)
                {
                    var handler = handlers[i];

                    // Non-delegating handlers are ignored since we always
                    // have RetryDelegatingHandler as the outer-most handler
                    while (handler.InnerHandler is DelegatingHandler)
                    {
                        handler = handler.InnerHandler as DelegatingHandler;
                    }

                    handler.InnerHandler = currentHandler;
                    currentHandler       = handlers[i];
                }
            }

            return(currentHandler);
        }
示例#13
0
        public async Task Retry_MessageHasBeenTouchedTransientExceptionOccured_Success()
        {
            int callCounter = 0;

            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var message          = new Message(new MemoryStream(new byte[] { 1, 2, 3 }));

            innerHandlerMock.SendEventAsync(Arg.Is(message), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;

                var m         = t.Arg <Message>();
                Stream stream = m.GetBodyStream();
                if (callCounter == 1)
                {
                    throw new IotHubClientTransientException("");
                }
                var buffer = new byte[3];
                stream.Read(buffer, 0, 3);
                return(TaskConstants.Completed);
            });

            var sut = new RetryDelegatingHandler(innerHandlerMock);
            var cancellationToken = new CancellationToken();
            await sut.SendEventAsync(message, cancellationToken);

            Assert.AreEqual(2, callCounter);
        }
        private void InitializeHttpClient(HttpClientHandler httpClientHandler, params DelegatingHandler[] handlers)
        {
            this.HttpClientHandler = httpClientHandler;
            DelegatingHandler currentHandler = new RetryDelegatingHandler();

            currentHandler.InnerHandler = this.HttpClientHandler;

            if (handlers != null)
            {
                for (int i = handlers.Length - 1; i >= 0; --i)
                {
                    DelegatingHandler handler = handlers[i];

                    // Non-delegating handlers are ignored since we always
                    // have RetryDelegatingHandler as the outer-most handler
                    while (handler.InnerHandler is DelegatingHandler)
                    {
                        handler = handler.InnerHandler as DelegatingHandler;
                    }

                    handler.InnerHandler = currentHandler;
                    currentHandler       = handlers[i];
                }
            }

            var newClient = new HttpClient(currentHandler, false);

            this.FirstMessageHandler = currentHandler;
            this.HttpClient          = newClient;
            Type type = this.GetType();

            this.HttpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(
                                                                    type.FullName,
                                                                    this.GetAssemblyVersion()));
        }
示例#15
0
        public void Retry_SetRetryPolicyVerifyInternals_Success()
        {
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var contextMock      = Substitute.For <IPipelineContext>();
            var sut = new RetryDelegatingHandler(contextMock);

            sut.ContinuationFactory = c => innerHandlerMock;

            var exponentialBackoff = new ExponentialBackoff(10, TimeSpan.FromSeconds(1), TimeSpan.FromMinutes(1), TimeSpan.FromMilliseconds(10));

            sut.SetRetryPolicy(exponentialBackoff);

            Assert.AreEqual(typeof(RetryDelegatingHandler.IotHubTransientErrorIgnoreStrategy), sut.internalRetryPolicy.ErrorDetectionStrategy.GetType());
            Assert.AreEqual(typeof(RetryDelegatingHandler.IotHubRuntimeOperationRetryStrategy), sut.internalRetryPolicy.RetryStrategy.GetType());
            var iotHubRuntimeOperationRetryStrategy = (RetryDelegatingHandler.IotHubRuntimeOperationRetryStrategy)sut.internalRetryPolicy.RetryStrategy;

            Assert.AreEqual(typeof(TransientFaultHandling.RetryStrategyWrapper), iotHubRuntimeOperationRetryStrategy.retryStrategy.GetType());
            Assert.AreSame(exponentialBackoff, ((TransientFaultHandling.RetryStrategyWrapper)iotHubRuntimeOperationRetryStrategy.retryStrategy).retryPolicy);

            var noretry = new NoRetry();

            sut.SetRetryPolicy(noretry);

            Assert.AreEqual(typeof(RetryDelegatingHandler.IotHubTransientErrorIgnoreStrategy), sut.internalRetryPolicy.ErrorDetectionStrategy.GetType());
            Assert.AreEqual(typeof(RetryDelegatingHandler.IotHubRuntimeOperationRetryStrategy), sut.internalRetryPolicy.RetryStrategy.GetType());
            iotHubRuntimeOperationRetryStrategy = (RetryDelegatingHandler.IotHubRuntimeOperationRetryStrategy)sut.internalRetryPolicy.RetryStrategy;
            Assert.AreEqual(typeof(TransientFaultHandling.RetryStrategyWrapper), iotHubRuntimeOperationRetryStrategy.retryStrategy.GetType());
            Assert.AreSame(noretry, ((TransientFaultHandling.RetryStrategyWrapper)iotHubRuntimeOperationRetryStrategy.retryStrategy).retryPolicy);
        }
示例#16
0
        private DelegatingHandler CreateHttpHandlerPipeline(HttpClientHandler httpClientHandler, params DelegatingHandler[] handlers)
        {
            // Now, the RetryAfterDelegatingHandler should be the absolute outermost handler
            // because it's extremely lightweight and non-interfering
            DelegatingHandler currentHandler =
                new RetryDelegatingHandler(new RetryAfterDelegatingHandler {
                InnerHandler = httpClientHandler
            });

            if (handlers != null)
            {
                for (var i = handlers.Length - 1; i >= 0; --i)
                {
                    var handler = handlers[i];

                    // Non-delegating handlers are ignored since we always
                    // have RetryDelegatingHandler as the outer-most handler
                    while (handler.InnerHandler is DelegatingHandler)
                    {
                        handler = handler.InnerHandler as DelegatingHandler;
                    }

                    handler.InnerHandler = currentHandler;
                    currentHandler       = handlers[i];
                }
            }

            return(currentHandler);
        }
        public async Task RetryTransientErrorOccuredRetried()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;

                if (callCounter == 1)
                {
                    throw new IotHubException("Test transient exception", isTransient: true);
                }
                return(Task.CompletedTask);
            });
            innerHandlerMock.WaitForTransportClosedAsync().Returns(Task.Delay(TimeSpan.FromSeconds(10)));

            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            var cancellationToken = new CancellationToken();
            await sut.OpenAsync(cancellationToken).ConfigureAwait(false);

            Assert.AreEqual(2, callCounter);
        }
        public async Task Retry_NonSeekableStream_NotSupportedException()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var memoryStream     = new NotSeekableStream(new byte[] { 1, 2, 3 });
            var message          = new Message(memoryStream);

            innerHandlerMock.SendEventAsync(Arg.Is(message), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;
                var m         = t.Arg <Message>();
                Stream stream = m.GetBodyStream();
                var buffer    = new byte[3];
                stream.Read(buffer, 0, 3);
                throw new IotHubException(TestExceptionMessage, isTransient: true);
            });

            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            var cancellationToken           = new CancellationToken();
            NotSupportedException exception = await sut.SendEventAsync(message, cancellationToken).ExpectedAsync <NotSupportedException>().ConfigureAwait(false);

            Assert.AreEqual(callCounter, 1);
        }
        public async Task RetrySetRetryPolicyVerifyInternalsSuccess()
        {
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var contextMock      = Substitute.For <IPipelineContext>();
            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            var retryPolicy = new TestRetryPolicy();

            sut.SetRetryPolicy(retryPolicy);

            int innerHandlerCallCounter = 0;

            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(t =>
            {
                innerHandlerCallCounter++;
                return(Task.FromException(new IotHubCommunicationException()));
            });

            await sut.OpenAsync(CancellationToken.None).ExpectedAsync <IotHubCommunicationException>().ConfigureAwait(false);

            Assert.AreEqual(2, innerHandlerCallCounter);
            Assert.AreEqual(2, retryPolicy.Counter);

            var noretry = new NoRetry();

            sut.SetRetryPolicy(noretry);
            await sut.OpenAsync(CancellationToken.None).ExpectedAsync <IotHubCommunicationException>().ConfigureAwait(false);

            Assert.AreEqual(3, innerHandlerCallCounter);
            Assert.AreEqual(2, retryPolicy.Counter);
        }
        public async Task RetryMessageHasBeenTouchedTransientExceptionOccuredSuccess()
        {
            int callCounter = 0;

            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();
            var message          = new Message(new MemoryStream(new byte[] { 1, 2, 3 }));

            innerHandlerMock.SendEventAsync(Arg.Is(message), Arg.Any <CancellationToken>()).Returns(t =>
            {
                callCounter++;

                var m         = t.Arg <Message>();
                Stream stream = m.GetBodyStream();
                if (callCounter == 1)
                {
                    throw new IotHubException(TestExceptionMessage, isTransient: true);
                }
                var buffer = new byte[3];
                stream.Read(buffer, 0, 3);
                return(Task.CompletedTask);
            });

            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            var cancellationToken = new CancellationToken();
            await sut.SendEventAsync(message, cancellationToken).ConfigureAwait(false);

            Assert.AreEqual(2, callCounter);
        }
        public async Task Retry_CloseAsyncBeforeOpen_Ok()
        {
            var contextMock      = Substitute.For <PipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.CloseAsync(CancellationToken.None).Returns(t => TaskHelpers.CompletedTask);

            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);
            await sut.CloseAsync(CancellationToken.None).ConfigureAwait(false);
        }
示例#22
0
        public async Task Retry_CancellationTokenCanceled_Receive()
        {
            var innerHandlerMock        = Substitute.For <IDelegatingHandler>();
            var cancellationTokenSource = new CancellationTokenSource();

            cancellationTokenSource.Cancel();
            innerHandlerMock.ReceiveAsync(cancellationTokenSource.Token).Returns(new Task <Message>(() => new Message(new byte[0])));
            var sut = new RetryDelegatingHandler(innerHandlerMock);

            await sut.ReceiveAsync(cancellationTokenSource.Token).ExpectedAsync <TaskCanceledException>();
        }
        public async Task OpenAsyncInnerCompletedSubjIsOpen()
        {
            var contextMock      = Substitute.For <IPipelineContext>();
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(t => Task.CompletedTask);

            var cancellationToken = new CancellationToken();
            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);
            await sut.OpenAsync(cancellationToken).ConfigureAwait(false);
        }
示例#24
0
        public async Task Retry_CancellationTokenCanceled_Reject()
        {
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.RejectAsync(Arg.Any <string>(), Arg.Any <CancellationToken>()).Returns(TaskConstants.Completed);

            var sut = new RetryDelegatingHandler(innerHandlerMock);
            var cancellationTokenSource = new CancellationTokenSource();

            cancellationTokenSource.Cancel();
            await sut.RejectAsync(Arg.Any <string>(), cancellationTokenSource.Token).ExpectedAsync <TaskCanceledException>();
        }
        public async Task RetryCancellationTokenCanceledReceive()
        {
            var innerHandlerMock        = Substitute.For <IDelegatingHandler>();
            var cancellationTokenSource = new CancellationTokenSource();

            cancellationTokenSource.Cancel();
            innerHandlerMock.ReceiveAsync(cancellationTokenSource.Token).Returns(new Task <Message>(() => new Message(new byte[0])));
            var contextMock = Substitute.For <IPipelineContext>();
            var sut         = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            await sut.ReceiveAsync(cancellationTokenSource.Token).ExpectedAsync <TaskCanceledException>().ConfigureAwait(false);
        }
示例#26
0
        public async Task Retry_TransientErrorThrownAfterNumberOfRetries_Throws()
        {
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(Arg.Is(true)).Returns(t =>
            {
                throw new IotHubClientTransientException("");
            });

            var sut = new RetryDelegatingHandler(innerHandlerMock);

            await sut.OpenAsync(true).ExpectedAsync <IotHubClientTransientException>();
        }
        public async Task OpenAsyncInnerCompletedSubjIsOpen()
        {
            var contextMock = Substitute.For <PipelineContext>();

            contextMock.ConnectionStatusChangesHandler = new ConnectionStatusChangesHandler(delegate(ConnectionStatus status, ConnectionStatusChangeReason reason) { });
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(t => TaskHelpers.CompletedTask);

            var cancellationToken = new CancellationToken();
            var sut = new RetryDelegatingHandler(contextMock, innerHandlerMock);
            await sut.OpenAsync(cancellationToken).ConfigureAwait(false);
        }
示例#28
0
        public void InstantiateRetryDelegatingHandler()
        {
            RetryDelegatingHandler retryHandler = new RetryDelegatingHandler();
            FakeServiceClient      fakeClient   = new FakeServiceClient(new FakeHttpHandler(), retryHandler);

            var handlers = fakeClient.HttpMessageHandlers;

            if (handlers.Any <HttpMessageHandler>())
            {
                List <HttpMessageHandler> handlerList = handlers.ToList <HttpMessageHandler>();
                Assert.Equal(4, handlerList.Count);
            }
        }
示例#29
0
        public async Task RetryCancellationTokenCanceledReject()
        {
            var innerHandlerMock = Substitute.For <IDelegatingHandler>();

            innerHandlerMock.RejectAsync(null, CancellationToken.None).ReturnsForAnyArgs(TaskHelpers.CompletedTask);

            var contextMock = Substitute.For <IPipelineContext>();
            var sut         = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            using var cancellationTokenSource = new CancellationTokenSource();
            cancellationTokenSource.Cancel();
            await sut.RejectAsync(Arg.Any <string>(), cancellationTokenSource.Token).ExpectedAsync <TaskCanceledException>().ConfigureAwait(false);
        }
        public async Task RetryCancellationTokenCanceledOpen()
        {
            var innerHandlerMock        = Substitute.For <IDelegatingHandler>();
            var cancellationTokenSource = new CancellationTokenSource();

            cancellationTokenSource.Cancel();
            innerHandlerMock.OpenAsync(Arg.Any <CancellationToken>()).Returns(TaskHelpers.CompletedTask);

            var contextMock = Substitute.For <IPipelineContext>();
            var sut         = new RetryDelegatingHandler(contextMock, innerHandlerMock);

            await sut.OpenAsync(cancellationTokenSource.Token).ExpectedAsync <TaskCanceledException>().ConfigureAwait(false);
        }