public async Task AsyncUnaryCall_AwaitMultipleTimes_SameMessageReturned()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest {
                Name = "World"
            });

            var response1 = await call;
            var response2 = await call;
            var response3 = await call.ResponseAsync.DefaultTimeout();

            var response4 = await call.ResponseAsync.DefaultTimeout();

            // Assert
            Assert.AreEqual("Hello world", response1.Message);

            Assert.AreEqual(response1, response2);
            Assert.AreEqual(response1, response3);
            Assert.AreEqual(response1, response4);
        }
Beispiel #2
0
        public async Task AsyncUnaryCall_SendDeadlineHeaderAndDeadlineValue_DeadlineValueIsUsed()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            invoker.Clock = new TestSystemClock(new DateTime(2019, 11, 29, 1, 1, 1, DateTimeKind.Utc));

            var headers = new Metadata();

            headers.Add("grpc-timeout", "1D");

            // Act
            var rs = await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(headers : headers, deadline : invoker.Clock.UtcNow.AddSeconds(1)), new HelloRequest());

            // Assert
            Assert.AreEqual("Hello world", rs.Message);

            Assert.IsNotNull(httpRequestMessage);
            Assert.AreEqual("1S", httpRequestMessage.Headers.GetValues(GrpcProtocolConstants.TimeoutHeader).Single());
        }
Beispiel #3
0
        public async Task AsyncUnaryCall_SuccessAndReadValuesAfterDeadline_ValuesReturned()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            invoker.Clock = new TestSystemClock(new DateTime(2019, 11, 29, 1, 1, 1, DateTimeKind.Utc));

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(deadline: invoker.Clock.UtcNow.AddSeconds(0.5)), new HelloRequest());

            // Assert
            var result = await call;

            Assert.IsNotNull(result);

            // Wait for deadline to trigger
            await Task.Delay(1000);

            Assert.IsNotNull(await call.ResponseHeadersAsync);

            Assert.IsNotNull(call.GetTrailers());

            Assert.AreEqual(StatusCode.OK, call.GetStatus().StatusCode);
        }
        public async Task AsyncUnaryCall_Success_RequestContentSent()
        {
            // Arrange
            HttpContent content = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                content = request.Content;

                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var rs = await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest { Name = "World" });

            // Assert
            Assert.AreEqual("Hello world", rs.Message);

            Assert.IsNotNull(content);

            var requestContent = await content.ReadAsStreamAsync().DefaultTimeout();

            var requestMessage = await requestContent.ReadSingleMessageAsync(TestHelpers.ServiceMethod.RequestMarshaller.Deserializer, CancellationToken.None).DefaultTimeout();

            Assert.AreEqual("World", requestMessage.Name);
        }
Beispiel #5
0
        public void AsyncUnaryCall_PercentEncodedMessage_MessageDecoded()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                var response      = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent, grpcStatusCode: StatusCode.Aborted);
                response.TrailingHeaders.Add(GrpcProtocolConstants.MessageTrailer, "%C2%A3");
                return(response);
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());

            // Assert
            var ex = Assert.ThrowsAsync <RpcException>(async() => await call.ResponseAsync.DefaultTimeout());

            Assert.AreEqual(StatusCode.Aborted, ex.StatusCode);

            var status = call.GetStatus();

            Assert.AreEqual(StatusCode.Aborted, status.StatusCode);
            Assert.AreEqual("£", status.Detail);
        }
Beispiel #6
0
        public async Task AsyncUnaryCall_SendHeaders_RequestMessageContainsHeaders()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            var headers = new Metadata();

            headers.Add("custom", "ascii");
            headers.Add("custom-bin", Encoding.UTF8.GetBytes("Hello world"));

            // Act
            var rs = await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(headers : headers), new HelloRequest());

            // Assert
            Assert.AreEqual("Hello world", rs.Message);

            Assert.IsNotNull(httpRequestMessage);
            Assert.AreEqual("ascii", httpRequestMessage.Headers.GetValues("custom").Single());
            Assert.AreEqual("Hello world", Encoding.UTF8.GetString(Convert.FromBase64String(httpRequestMessage.Headers.GetValues("custom-bin").Single())));
        }
Beispiel #7
0
        public async Task AsyncUnaryCall_NoHeaders_RequestMessageHasNoHeaders()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            var headers = new Metadata();

            // Act
            var rs = await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(headers : headers), new HelloRequest());

            // Assert
            Assert.AreEqual("Hello world", rs.Message);

            Assert.IsNotNull(httpRequestMessage);

            // User-Agent is always sent
            Assert.AreEqual(0, httpRequestMessage.Headers.Count(h => !string.Equals(h.Key, HeaderNames.UserAgent, StringComparison.OrdinalIgnoreCase)));
        }
        public async Task AsyncUnaryCall_DisposeAfterHeadersAndBeforeMessage_ThrowsError()
        {
            // Arrange
            var stream = new SyncPointMemoryStream();

            var httpClient = TestHelpers.CreateTestClient(request =>
            {
                var response = ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(stream));
                response.Headers.Add("custom", "value!");
                return(Task.FromResult(response));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest {
                Name = "World"
            });
            var responseHeaders = await call.ResponseHeadersAsync.DefaultTimeout();

            call.Dispose();

            // Assert
            Assert.ThrowsAsync <ObjectDisposedException>(async() => await call.ResponseAsync.DefaultTimeout());

            var header = responseHeaders.Single(h => h.Key == "custom");

            Assert.AreEqual("value!", header.Value);
        }
        public void AsyncUnaryCall_NonOkStatusTrailer_ThrowRpcError()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(request =>
            {
                var response = ResponseUtils.CreateResponse(HttpStatusCode.OK, new ByteArrayContent(Array.Empty <byte>()), StatusCode.Unimplemented);
                return(Task.FromResult(response));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var ex = Assert.ThrowsAsync <RpcException>(async() => await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()));

            // Assert
            Assert.AreEqual(StatusCode.Unimplemented, ex.StatusCode);
        }
        public void AsyncUnaryCall_ErrorSendingRequest_ThrowsError()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(request =>
            {
                return(Task.FromException <HttpResponseMessage>(new Exception("An error!")));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());
            var ex   = Assert.CatchAsync <Exception>(() => call.ResponseAsync);

            // Assert
            Assert.AreEqual("An error!", ex.Message);
        }
Beispiel #11
0
        public void AsyncUnaryCall_UnfinishedCall_ThrowsError()
        {
            // Arrange
            var tcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                await tcs.Task.DefaultTimeout();
                return(null);
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());
            var ex   = Assert.Throws <InvalidOperationException>(() => call.GetTrailers());

            // Assert
            Assert.AreEqual("Can't get the call trailers because the call is not complete.", ex.Message);
        }
Beispiel #12
0
        public void AsyncUnaryCall_ErrorCall_ThrowsError()
        {
            // Arrange
            var tcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

            var httpClient = TestHelpers.CreateTestClient(request =>
            {
                return(Task.FromException <HttpResponseMessage>(new Exception("An error!")));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());
            var ex   = Assert.Throws <InvalidOperationException>(() => call.GetTrailers());

            // Assert
            Assert.AreEqual("Can't get the call trailers because an error occured when making the request.", ex.Message);
            Assert.AreEqual("An error!", ex.InnerException.InnerException.Message);
        }
Beispiel #13
0
        public void AsyncUnaryCall_SetNonUtcDeadline_ThrowError()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var ex = Assert.ThrowsAsync <InvalidOperationException>(async() => await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(deadline: new DateTime(2000, DateTimeKind.Local)), new HelloRequest()));

            // Assert
            Assert.AreEqual("Deadline must have a kind DateTimeKind.Utc or be equal to DateTime.MaxValue or DateTime.MinValue.", ex.Message);
        }
Beispiel #14
0
        public void AsyncUnaryCall_MultipleStatusHeaders_ThrowError()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                var response      = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent, grpcStatusCode: StatusCode.Aborted);
                response.TrailingHeaders.Add(GrpcProtocolConstants.MessageTrailer, "one");
                response.TrailingHeaders.Add(GrpcProtocolConstants.MessageTrailer, "two");
                return(response);
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());

            // Assert
            var ex = Assert.ThrowsAsync <InvalidOperationException>(async() => await call.ResponseAsync.DefaultTimeout());

            Assert.AreEqual("Multiple grpc-message headers.", ex.Message);
        }
Beispiel #15
0
        public void AsyncUnaryCall_MissingStatus_ThrowError()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                var response      = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent, grpcStatusCode: null);
                return(response);
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());

            // Assert
            Assert.ThrowsAsync <InvalidOperationException>(async() => await call.ResponseAsync.DefaultTimeout());

            var ex = Assert.Throws <InvalidOperationException>(() => call.GetStatus());

            Assert.AreEqual("Response did not have a grpc-status trailer.", ex.Message);
        }
Beispiel #16
0
        public async Task AsyncUnaryCall_SetMaxValueDeadline_RequestMessageHasNoDeadlineHeader()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(deadline : DateTime.MaxValue), new HelloRequest());

            // Assert
            Assert.IsNotNull(httpRequestMessage);
            Assert.AreEqual(0, httpRequestMessage.Headers.Count(h => string.Equals(h.Key, GrpcProtocolConstants.TimeoutHeader, StringComparison.OrdinalIgnoreCase)));
        }
Beispiel #17
0
        public async Task AsyncUnaryCall_HeadersReturned_ReturnsTrailers()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                var response      = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent);
                response.Headers.Add("custom", "ABC");
                response.TrailingHeaders.Add("custom-header", "value");
                return(response);
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call            = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());
            var responseHeaders = await call.ResponseHeadersAsync.DefaultTimeout();

            var trailers = call.GetTrailers();

            // Assert
            Assert.AreEqual("value", trailers.Single(t => t.Key == "custom-header").Value);
        }
        public async Task AsyncUnaryCall_Success_ResponseHeadersPopulated()
        {
            // Arrange
            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();
                var response      = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent);
                response.Headers.Server.Add(new ProductInfoHeaderValue("TestName", "1.0"));
                response.Headers.Add("custom", "ABC");
                response.Headers.Add("binary-bin", Convert.ToBase64String(Encoding.UTF8.GetBytes("Hello world")));
                return(response);
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var call             = invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());
            var responseHeaders1 = await call.ResponseHeadersAsync.DefaultTimeout();

            var responseHeaders2 = await call.ResponseHeadersAsync.DefaultTimeout();

            // Assert
            Assert.AreSame(responseHeaders1, responseHeaders2);

            var header = responseHeaders1.Single(h => h.Key == "server");

            Assert.AreEqual("TestName/1.0", header.Value);

            header = responseHeaders1.Single(h => h.Key == "custom");
            Assert.AreEqual("ABC", header.Value);

            header = responseHeaders1.Single(h => h.Key == "binary-bin");
            Assert.AreEqual(true, header.IsBinary);
            CollectionAssert.AreEqual(Encoding.UTF8.GetBytes("Hello world"), header.ValueBytes);
        }
        public async Task AsyncUnaryCall_Success_HttpRequestMessagePopulated()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                HelloReply reply = new HelloReply
                {
                    Message = "Hello world"
                };

                var streamContent = await TestHelpers.CreateResponseContent(reply).DefaultTimeout();

                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            // Act
            var rs = await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest());

            // Assert
            Assert.AreEqual("Hello world", rs.Message);

            Assert.IsNotNull(httpRequestMessage);
            Assert.AreEqual(new Version(2, 0), httpRequestMessage.Version);
            Assert.AreEqual(HttpMethod.Post, httpRequestMessage.Method);
            Assert.AreEqual(new Uri("https://localhost/ServiceName/MethodName"), httpRequestMessage.RequestUri);
            Assert.AreEqual(new MediaTypeHeaderValue("application/grpc"), httpRequestMessage.Content.Headers.ContentType);
            Assert.AreEqual(GrpcProtocolConstants.TEHeader, httpRequestMessage.Headers.TE.Single());

            var userAgent = httpRequestMessage.Headers.UserAgent.Single();

            Assert.AreEqual(GrpcProtocolConstants.UserAgentHeader, userAgent);
            Assert.AreEqual("grpc-dotnet", userAgent.Product.Name);
            Assert.IsTrue(!string.IsNullOrEmpty(userAgent.Product.Version));
        }
Beispiel #20
0
        public async Task AsyncUnaryCall_SetSecondDeadline_RequestMessageContainsDeadlineHeader()
        {
            // Arrange
            HttpRequestMessage httpRequestMessage = null;

            var httpClient = TestHelpers.CreateTestClient(async request =>
            {
                httpRequestMessage = request;

                var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout();
                return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent));
            });
            var invoker = new HttpClientCallInvoker(httpClient);

            invoker.Clock = new TestSystemClock(new DateTime(2019, 11, 29, 1, 1, 1, DateTimeKind.Utc));

            // Act
            await invoker.AsyncUnaryCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(deadline : invoker.Clock.UtcNow.AddSeconds(1)), new HelloRequest());

            // Assert
            Assert.IsNotNull(httpRequestMessage);
            Assert.AreEqual("1S", httpRequestMessage.Headers.GetValues(GrpcProtocolConstants.TimeoutHeader).Single());
        }