public void HandleResponse_SecondResponseIsIgnored()
        {
            using (var test = new OutboundRequestContextTest())
            {
                var payload = new HandshakeResponse(MessageResponseCode.Error, protocolVersion: null);
                var firstResponse = MessageUtilities.Create(
                    test.Request.RequestId,
                    MessageType.Response,
                    test.Request.Method,
                    payload);

                test.Context.HandleResponse(firstResponse);

                var response = test.Context.CompletionTask.Result;

                payload = new HandshakeResponse(MessageResponseCode.Success, ProtocolConstants.CurrentVersion);
                var secondResponse = MessageUtilities.Create(
                    test.Request.RequestId,
                    MessageType.Response,
                    test.Request.Method,
                    payload);

                test.Context.HandleResponse(secondResponse);

                Assert.Same(response, test.Context.CompletionTask.Result);
            }
        }
 public void HandleCancelResponse_ThrowsIfNotCancelled()
 {
     using (var test = new OutboundRequestContextTest())
     {
         Assert.Throws<ProtocolException>(() => test.Context.HandleCancelResponse());
     }
 }
 public async Task Constructor_ClosesIfTimedOut()
 {
     using (var test = new OutboundRequestContextTest(TimeSpan.FromMilliseconds(10)))
     {
         await Assert.ThrowsAsync<TaskCanceledException>(
             () => test.Context.CompletionTask);
     }
 }
 public void Dispose_IsIdempotent()
 {
     using (var test = new OutboundRequestContextTest())
     {
         test.Context.Dispose();
         test.Context.Dispose();
     }
 }
 public void Dispose_DoesNotDisposeLogger()
 {
     using (var test = new OutboundRequestContextTest())
     {
         test.Context.Dispose();
         test.Logger.Verify();
     }
 }
 public void Dispose_DoesNotDisposeConnection()
 {
     using (var test = new OutboundRequestContextTest())
     {
         test.Context.Dispose();
         test.Connection.Verify();
     }
 }
 public void Constructor_InitializesProperties()
 {
     using (var test = new OutboundRequestContextTest())
     {
         Assert.Equal(test.Request.RequestId, test.Context.RequestId);
         Assert.NotNull(test.Context.CompletionTask);
         Assert.Equal(TaskStatus.WaitingForActivation, test.Context.CompletionTask.Status);
     }
 }
        public void HandleFault_ThrowsForNullProgress()
        {
            using (var test = new OutboundRequestContextTest())
            {
                var exception = Assert.Throws<ArgumentNullException>(
                    () => test.Context.HandleFault(fault: null));

                Assert.Equal("fault", exception.ParamName);
            }
        }
        public void CancellationToken_CancelledWhenDisposed()
        {
            using (var test = new OutboundRequestContextTest())
            {
                Assert.False(test.Context.CancellationToken.IsCancellationRequested);

                test.Context.Dispose();

                Assert.True(test.Context.CancellationToken.IsCancellationRequested);
            }
        }
        public void CancellationToken_LinksOriginalCancellationToken()
        {
            using (var test = new OutboundRequestContextTest())
            {
                Assert.False(test.Context.CancellationToken.IsCancellationRequested);

                test.CancellationTokenSource.Cancel();

                Assert.True(test.Context.CancellationToken.IsCancellationRequested);
            }
        }
        public void HandleFault_ThrowsFault()
        {
            using (var test = new OutboundRequestContextTest())
            {
                var payload = new Fault("test");
                var response = MessageUtilities.Create(
                    test.Request.RequestId,
                    MessageType.Fault,
                    test.Request.Method,
                    payload);

                var exception = Assert.Throws<ProtocolException>(
                    () => test.Context.HandleFault(response));

                Assert.Equal("test", exception.Message);
            }
        }
        public void HandleResponse_CompletesCompletionTask()
        {
            using (var test = new OutboundRequestContextTest())
            {
                var payload = new HandshakeResponse(MessageResponseCode.Error, protocolVersion: null);
                var response = MessageUtilities.Create(
                    test.Request.RequestId,
                    MessageType.Response,
                    test.Request.Method,
                    payload);

                test.Context.HandleResponse(response);

                Assert.Equal(TaskStatus.RanToCompletion, test.Context.CompletionTask.Status);
                Assert.Equal(MessageResponseCode.Error, test.Context.CompletionTask.Result.ResponseCode);
                Assert.Null(test.Context.CompletionTask.Result.ProtocolVersion);
            }
        }
        public void Constructor_CancelsCompletionTaskAndSendsCancelRequestIfCancelled()
        {
            using (var test = new OutboundRequestContextTest())
            using (var cancelEvent = new ManualResetEventSlim(initialState: false))
            {
                test.Connection.Setup(x => x.MessageDispatcher.DispatchCancelAsync(
                        It.Is<Message>(m => ReferenceEquals(m, test.Request)),
                        It.IsAny<CancellationToken>()))
                    .Callback<Message, CancellationToken>(
                        (message, cancellationToken) =>
                        {
                            cancelEvent.Set();
                        })
                    .Returns(Task.FromResult(0));

                test.CancellationTokenSource.Cancel();

                Assert.Equal(TaskStatus.Canceled, test.Context.CompletionTask.Status);

                cancelEvent.Wait();
            }
        }