public async Task AsyncServerStreamingCall_NoContent_NoMessagesReturned() { // Arrange HttpRequestMessage httpRequestMessage = null; var httpClient = TestHelpers.CreateTestClient(request => { httpRequestMessage = request; HelloReply reply = new HelloReply { Message = "Hello world" }; return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, new ByteArrayContent(Array.Empty <byte>())))); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var responseStream = call.ResponseStream; // Assert Assert.IsNull(responseStream.Current); Assert.IsFalse(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.IsNull(responseStream.Current); }
public async Task AsyncServerStreamingCall_FinishedReader_ReturnsTrailers() { // Arrange var httpClient = TestHelpers.CreateTestClient(async request => { var streamContent = await TestHelpers.CreateResponseContent( new HelloReply { Message = "Hello world 1" }, new HelloReply { Message = "Hello world 2" }).DefaultTimeout(); var response = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent); response.TrailingHeaders.Add("custom-header", "value"); return(response); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var responseStream = call.ResponseStream; Assert.IsTrue(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.IsTrue(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.IsFalse(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); var trailers = call.GetTrailers(); // Assert Assert.AreEqual("value", trailers.Single(t => t.Key == "custom-header").Value); }
public async Task AsyncServerStreamingCall_UnfinishedReader_ThrowsError() { // Arrange var httpClient = TestHelpers.CreateTestClient(async request => { var streamContent = await TestHelpers.CreateResponseContent( new HelloReply { Message = "Hello world 1" }, new HelloReply { Message = "Hello world 2" }).DefaultTimeout(); return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent)); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var responseStream = call.ResponseStream; Assert.IsTrue(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); var ex = Assert.Throws <InvalidOperationException>(() => call.GetTrailers()); // Assert Assert.AreEqual("Can't get the call trailers because the call is not complete.", ex.Message); }
public void AsyncServerStreamingCall_DisposeBeforeHeadersReceived_ReturnsError() { // Arrange var tcs = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously); var httpClient = TestHelpers.CreateTestClient(async(request, ct) => { await tcs.Task.DefaultTimeout(); ct.ThrowIfCancellationRequested(); var streamContent = await TestHelpers.CreateResponseContent(new HelloReply()).DefaultTimeout(); var response = ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent); response.Headers.Add("custom", "ABC"); return(response); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); call.Dispose(); tcs.TrySetResult(true); // Assert Assert.ThrowsAsync <ObjectDisposedException>(() => call.ResponseHeadersAsync); }
public async Task AsyncServerStreamingCall_MessagesStreamed_MessagesReceived() { // Arrange var streamContent = new SyncPointMemoryStream(); var httpClient = TestHelpers.CreateTestClient(request => { return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(streamContent)))); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var responseStream = call.ResponseStream; // Assert Assert.IsNull(responseStream.Current); var moveNextTask1 = responseStream.MoveNext(CancellationToken.None); Assert.IsFalse(moveNextTask1.IsCompleted); await streamContent.AddDataAndWait(await TestHelpers.GetResponseDataAsync(new HelloReply { Message = "Hello world 1" }).DefaultTimeout()).DefaultTimeout(); Assert.IsTrue(await moveNextTask1.DefaultTimeout()); Assert.IsNotNull(responseStream.Current); Assert.AreEqual("Hello world 1", responseStream.Current.Message); var moveNextTask2 = responseStream.MoveNext(CancellationToken.None); Assert.IsFalse(moveNextTask2.IsCompleted); await streamContent.AddDataAndWait(await TestHelpers.GetResponseDataAsync(new HelloReply { Message = "Hello world 2" }).DefaultTimeout()).DefaultTimeout(); Assert.IsTrue(await moveNextTask2.DefaultTimeout()); Assert.IsNotNull(responseStream.Current); Assert.AreEqual("Hello world 2", responseStream.Current.Message); var moveNextTask3 = responseStream.MoveNext(CancellationToken.None); Assert.IsFalse(moveNextTask3.IsCompleted); await streamContent.AddDataAndWait(Array.Empty <byte>()).DefaultTimeout(); Assert.IsFalse(await moveNextTask3.DefaultTimeout()); var moveNextTask4 = responseStream.MoveNext(CancellationToken.None); Assert.IsTrue(moveNextTask4.IsCompleted); Assert.IsFalse(await moveNextTask3.DefaultTimeout()); }
public void AsyncServerStreamingCall_ErrorSendingRequest_ReturnsError() { // Arrange var httpClient = TestHelpers.CreateTestClient(request => { return(Task.FromException <HttpResponseMessage>(new Exception("An error!"))); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var ex = Assert.CatchAsync <Exception>(() => call.ResponseHeadersAsync); // Assert Assert.AreEqual("An error!", ex.Message); }
public void ClientStreamReader_WriteWithInvalidHttpStatus_ErrorThrown() { // Arrange var httpClient = TestHelpers.CreateTestClient(request => { var streamContent = new StreamContent(new SyncPointMemoryStream()); return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.NotFound, streamContent))); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); // Assert var ex = Assert.ThrowsAsync <InvalidOperationException>(async() => await call.ResponseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.AreEqual("Bad gRPC response. Expected HTTP status code 200. Got status code: 404", ex.Message); }
public void AsyncServerStreamingCall_DeadlineDuringWrite_ResponseThrowsDeadlineExceededStatus() { // Arrange var httpClient = TestHelpers.CreateTestClient(request => { var stream = new SyncPointMemoryStream(); var content = new StreamContent(stream); return(Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, content))); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(deadline: DateTime.UtcNow.AddSeconds(0.5)), new HelloRequest()); // Assert var ex = Assert.ThrowsAsync <RpcException>(async() => await call.ResponseStream.MoveNext(CancellationToken.None)); Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode); }
public void AsyncServerStreamingCall_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.AsyncServerStreamingCall <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); }
public async Task AsyncServerStreamingCall_Success_ResponseHeadersPopulated() { // 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"); return(response); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var responseHeaders = await call.ResponseHeadersAsync.DefaultTimeout(); // Assert var header = responseHeaders.Single(h => h.Key == "custom"); Assert.AreEqual("ABC", header.Value); }
public async Task AsyncServerStreamingCall_MessagesReturnedTogether_MessagesReceived() { // Arrange var httpClient = TestHelpers.CreateTestClient(async request => { var streamContent = await TestHelpers.CreateResponseContent( new HelloReply { Message = "Hello world 1" }, new HelloReply { Message = "Hello world 2" }).DefaultTimeout(); return(ResponseUtils.CreateResponse(HttpStatusCode.OK, streamContent)); }); var invoker = new HttpClientCallInvoker(httpClient); // Act var call = invoker.AsyncServerStreamingCall <HelloRequest, HelloReply>(TestHelpers.ServiceMethod, null, new CallOptions(), new HelloRequest()); var responseStream = call.ResponseStream; // Assert Assert.IsNull(responseStream.Current); Assert.IsTrue(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.IsNotNull(responseStream.Current); Assert.AreEqual("Hello world 1", responseStream.Current.Message); Assert.IsTrue(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.IsNotNull(responseStream.Current); Assert.AreEqual("Hello world 2", responseStream.Current.Message); Assert.IsFalse(await responseStream.MoveNext(CancellationToken.None).DefaultTimeout()); }