public async Task WriteResponseHeadersAsyncCore_FlushesHeadersToClient() { // Arrange var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "Greet.Greeter/SayHellosSendHeadersFirst"); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var response = await Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = new StreamPipeReader(responseStream); for (var i = 0; i < 3; i++) { var greetingTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); // The headers are already sent // All responses are streamed Assert.False(greetingTask.IsCompleted); var greeting = await greetingTask.DefaultTimeout(); Assert.AreEqual($"How are you World? {i}", greeting.Message); } var goodbyeTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.False(goodbyeTask.IsCompleted); Assert.AreEqual("Goodbye World!", (await goodbyeTask.DefaultTimeout()).Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsNull(await finishedTask.DefaultTimeout()); }
public async Task Buffering_SuccessResponsesStreamed() { // Arrange var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "Greet.Greeter/SayHellosBufferHint"); httpRequest.Content = new StreamContent(requestStream); // Act var responseTask = Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert Assert.IsFalse(responseTask.IsCompleted, "Server should wait for first message from client"); var response = await responseTask; Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual("identity", response.Headers.GetValues("grpc-encoding").Single()); Assert.AreEqual("application/grpc", response.Content.Headers.ContentType.MediaType); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = new StreamPipeReader(new PipeReaderFixStream(responseStream)); for (var i = 0; i < 3; i++) { var greeting = await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout(); Assert.AreEqual($"How are you World? {i}", greeting.Message); } var goodbye = await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout(); Assert.AreEqual("Goodbye World!", goodbye.Message); Assert.IsNull(await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout()); Assert.AreEqual(StatusCode.OK.ToTrailerString(), Fixture.TrailersContainer.Trailers[GrpcProtocolConstants.StatusTrailer].Single()); }
public async Task NoBuffering_SuccessResponsesStreamed() { // Arrange var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = GrpcHttpHelper.Create("Greet.Greeter/SayHellos"); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var response = await Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); for (var i = 0; i < 3; i++) { var greetingTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsFalse(greetingTask.IsCompleted); var greeting = await greetingTask.DefaultTimeout(); Assert.AreEqual($"How are you World? {i}", greeting.Message); } var goodbyeTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.False(goodbyeTask.IsCompleted); Assert.AreEqual("Goodbye World!", (await goodbyeTask.DefaultTimeout()).Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsNull(await finishedTask.DefaultTimeout()); }
public async Task InterceptorsExecutedInRegistrationOrder_AndGlobalInterceptorExecutesFirst_DuplexStreaming() { // Arrange var url = Fixture.DynamicGrpc.AddDuplexStreamingMethod <InterceptorOrderTests, Empty, Empty>((requestStream, responseStream, context) => { var items = context.GetHttpContext().Items; Assert.AreEqual(3, items[OrderedInterceptor.OrderHeaderKey]); return(Task.CompletedTask); }); // Act var response = await Fixture.Client.PostAsync( url, new GrpcStreamContent(new MemoryStream())).DefaultTimeout(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = new StreamPipeReader(responseStream); // Assert await MessageHelpers.AssertReadStreamMessageAsync <Empty>(pipeReader); response.AssertTrailerStatus(); }
public async Task MultipleMessagesFromOneClient_SuccessResponses() { // Arrange var ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "John", Message = "Hello Jill" }); var streamingContent = new StreamingContent(); var httpRequest = GrpcHttpHelper.Create("Chat.Chatter/Chat"); httpRequest.Content = streamingContent; // Act var responseTask = Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead); // Assert Assert.IsFalse(responseTask.IsCompleted, "Server should wait for first message from client"); var requestStream = await streamingContent.GetRequestStreamAsync().DefaultTimeout(); await requestStream.WriteAsync(ms.ToArray()).AsTask().DefaultTimeout(); await requestStream.FlushAsync().DefaultTimeout(); var response = await responseTask.DefaultTimeout(); response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); var message1Task = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); var message1 = await message1Task.DefaultTimeout(); Assert.AreEqual("John", message1.Name); Assert.AreEqual("Hello Jill", message1.Message); var message2Task = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsFalse(message2Task.IsCompleted, "Server is waiting for messages from client"); ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "Jill", Message = "Hello John" }); await requestStream.WriteAsync(ms.ToArray()).AsTask().DefaultTimeout(); await requestStream.FlushAsync().DefaultTimeout(); var message2 = await message2Task.DefaultTimeout(); Assert.AreEqual("Jill", message2.Name); Assert.AreEqual("Hello John", message2.Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsFalse(finishedTask.IsCompleted, "Server is waiting for client to end streaming"); // Complete request stream streamingContent.Complete(); await finishedTask.DefaultTimeout(); response.AssertTrailerStatus(); }
public async Task WriteUntilDeadline_SuccessResponsesStreamed_CoreAsync(ServerStreamingServerMethod <HelloRequest, HelloReply> callHandler) { // Arrange var method = Fixture.DynamicGrpc.AddServerStreamingMethod <HelloRequest, HelloReply>(callHandler); var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = GrpcHttpHelper.Create(method.FullName); httpRequest.Headers.Add(GrpcProtocolConstants.TimeoutHeader, "200m"); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var response = await Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); var messageCount = 0; var readTask = Task.Run(async() => { while (true) { var greeting = await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout(); if (greeting != null) { Assert.AreEqual($"How are you World? {messageCount}", greeting.Message); messageCount++; } else { break; } } }); await readTask.DefaultTimeout(); Assert.AreNotEqual(0, messageCount); response.AssertTrailerStatus(StatusCode.DeadlineExceeded, "Deadline Exceeded"); Assert.True(HasLog(LogLevel.Debug, "DeadlineExceeded", "Request with timeout of 00:00:00.2000000 has exceeded its deadline.")); await TestHelpers.AssertIsTrueRetryAsync( () => HasLog(LogLevel.Trace, "DeadlineStopped", "Request deadline stopped."), "Missing deadline stopped log.").DefaultTimeout(); }
public async Task SendCompressedMessage_ServerStreamingEnabledInCall_CompressedMessageReturned() { async Task ServerStreamingEnableCompression(HelloRequest request, IServerStreamWriter <HelloReply> responseStream, ServerCallContext context) { var headers = new Metadata { new Metadata.Entry("grpc-internal-encoding-request", "gzip") }; await context.WriteResponseHeadersAsync(headers); await responseStream.WriteAsync(new HelloReply { Message = "Hello 1" }); responseStream.WriteOptions = new WriteOptions(WriteFlags.NoCompress); await responseStream.WriteAsync(new HelloReply { Message = "Hello 2" }); } // Arrange var method = Fixture.DynamicGrpc.AddServerStreamingMethod <HelloRequest, HelloReply>(ServerStreamingEnableCompression); var ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new HelloRequest { Name = "World" }); var httpRequest = GrpcHttpHelper.Create(method.FullName); httpRequest.Content = new PushStreamContent( async s => { await s.WriteAsync(ms.ToArray()).AsTask().DefaultTimeout(); await s.FlushAsync().DefaultTimeout(); }); // Act var responseTask = Fixture.Client.SendAsync(httpRequest); // Assert var response = await responseTask.DefaultTimeout(); response.AssertIsSuccessfulGrpcRequest(); Assert.AreEqual("gzip", response.Headers.GetValues("grpc-encoding").Single()); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); ReadResult readResult; readResult = await pipeReader.ReadAsync(); Assert.AreEqual(1, readResult.Buffer.FirstSpan[0]); // Message is compressed var greeting1 = await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader, "gzip").DefaultTimeout(); Assert.AreEqual($"Hello 1", greeting1.Message); readResult = await pipeReader.ReadAsync(); Assert.AreEqual(0, readResult.Buffer.FirstSpan[0]); // Message is uncompressed var greeting2 = await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader, "gzip").DefaultTimeout(); Assert.AreEqual($"Hello 2", greeting2.Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsNull(await finishedTask.DefaultTimeout()); }
public async Task MultipleMessagesFromOneClient_SuccessResponses() { // Arrange var ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "John", Message = "Hello Jill" }); var requestStream = new SyncPointMemoryStream(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "Chat.Chatter/Chat"); httpRequest.Content = new StreamContent(requestStream); // Act var responseTask = Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead); // Assert Assert.IsFalse(responseTask.IsCompleted, "Server should wait for first message from client"); requestStream.AddData(ms.ToArray()); var response = await responseTask.DefaultTimeout(); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual("identity", response.Headers.GetValues("grpc-encoding").Single()); Assert.AreEqual("application/grpc", response.Content.Headers.ContentType.MediaType); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = new StreamPipeReader(responseStream); var message1Task = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsTrue(message1Task.IsCompleted); var message1 = await message1Task.DefaultTimeout(); Assert.AreEqual("John", message1.Name); Assert.AreEqual("Hello Jill", message1.Message); var message2Task = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsFalse(message2Task.IsCompleted, "Server is waiting for messages from client"); ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "Jill", Message = "Hello John" }); requestStream.AddData(ms.ToArray()); var message2 = await message2Task.DefaultTimeout(); Assert.AreEqual("Jill", message2.Name); Assert.AreEqual("Hello John", message2.Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsFalse(finishedTask.IsCompleted, "Server is waiting for client to end streaming"); requestStream.AddData(Array.Empty <byte>()); await finishedTask.DefaultTimeout(); }
public async Task BufferHint_SuccessResponses() { // Arrange var ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "John", Message = "Hello Jill" }); var requestStream = new SyncPointMemoryStream(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "Chat.Chatter/ChatBufferHint"); httpRequest.Content = new StreamContent(requestStream); // Act var responseTask = Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead); // Assert Assert.IsFalse(responseTask.IsCompleted, "Server should wait for first message from client"); await requestStream.AddDataAndWait(ms.ToArray()); Assert.IsFalse(responseTask.IsCompleted, "Server is buffering response"); ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "Jill", Message = "Hello John" }); await requestStream.AddDataAndWait(ms.ToArray()); Assert.IsFalse(responseTask.IsCompleted, "Server is buffering response"); await requestStream.AddDataAndWait(Array.Empty <byte>()); var response = await responseTask.DefaultTimeout(); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual("identity", response.Headers.GetValues("grpc-encoding").Single()); Assert.AreEqual("application/grpc", response.Content.Headers.ContentType.MediaType); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = new StreamPipeReader(new PipeReaderFixStream(responseStream)); var message1 = await MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader).DefaultTimeout(); Assert.AreEqual("John", message1.Name); Assert.AreEqual("Hello Jill", message1.Message); var message2 = await MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader).DefaultTimeout(); Assert.AreEqual("Jill", message2.Name); Assert.AreEqual("Hello John", message2.Message); Assert.IsNull(await MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader).DefaultTimeout()); Assert.AreEqual(StatusCode.OK.ToTrailerString(), Fixture.TrailersContainer.Trailers[GrpcProtocolConstants.StatusTrailer].Single()); }
public async Task MultipleMessagesFromOneClient_SuccessResponses() { // Arrange var ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "John", Message = "Hello Jill" }); var requestStream = new SyncPointMemoryStream(); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "Chat.Chatter/Chat"); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var responseTask = Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead); // Assert Assert.IsFalse(responseTask.IsCompleted, "Server should wait for first message from client"); requestStream.AddData(ms.ToArray()); var response = await responseTask.DefaultTimeout(); response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = new StreamPipeReader(responseStream); var message1Task = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); var message1 = await message1Task.DefaultTimeout(); Assert.AreEqual("John", message1.Name); Assert.AreEqual("Hello Jill", message1.Message); var message2Task = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsFalse(message2Task.IsCompleted, "Server is waiting for messages from client"); ms = new MemoryStream(); MessageHelpers.WriteMessage(ms, new ChatMessage { Name = "Jill", Message = "Hello John" }); requestStream.AddData(ms.ToArray()); var message2 = await message2Task.DefaultTimeout(); Assert.AreEqual("Jill", message2.Name); Assert.AreEqual("Hello John", message2.Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <ChatMessage>(pipeReader); Assert.IsFalse(finishedTask.IsCompleted, "Server is waiting for client to end streaming"); requestStream.AddData(Array.Empty <byte>()); await finishedTask.DefaultTimeout(); Assert.AreEqual(StatusCode.OK.ToTrailerString(), Fixture.TrailersContainer.Trailers[GrpcProtocolConstants.StatusTrailer].Single()); }
public async Task NoBuffering_SuccessResponsesStreamed() { using var httpEventSource = new HttpEventSourceListener(LoggerFactory); var methodWrapper = new MethodWrapper { Logger = Logger, SyncPoint = new SyncPoint(runContinuationsAsynchronously: true) }; async Task SayHellos(HelloRequest request, IServerStreamWriter <HelloReply> responseStream, ServerCallContext context) { // Explicitly send the response headers before any streamed content Metadata responseHeaders = new Metadata(); responseHeaders.Add("test-response-header", "value"); await context.WriteResponseHeadersAsync(responseHeaders); await methodWrapper.SayHellosAsync(request, responseStream); } // Arrange var method = Fixture.DynamicGrpc.AddServerStreamingMethod <HelloRequest, HelloReply>(SayHellos); var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = GrpcHttpHelper.Create(method.FullName); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var response = await Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); for (var i = 0; i < 3; i++) { var greetingTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsFalse(greetingTask.IsCompleted); await methodWrapper.SyncPoint.WaitForSyncPoint().DefaultTimeout(); var currentSyncPoint = methodWrapper.SyncPoint; methodWrapper.SyncPoint = new SyncPoint(runContinuationsAsynchronously: true); currentSyncPoint.Continue(); var greeting = (await greetingTask.DefaultTimeout()) !; Assert.AreEqual($"How are you World? {i}", greeting.Message); } var goodbyeTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.False(goodbyeTask.IsCompleted); await methodWrapper.SyncPoint.WaitForSyncPoint().DefaultTimeout(); methodWrapper.SyncPoint.Continue(); Assert.AreEqual("Goodbye World!", (await goodbyeTask.DefaultTimeout()) !.Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsNull(await finishedTask.DefaultTimeout()); }
public async Task Buffering_SuccessResponsesStreamed() { var methodWrapper = new MethodWrapper { Logger = Logger, SyncPoint = new SyncPoint(runContinuationsAsynchronously: true) }; Task SayHellosBufferHint(HelloRequest request, IServerStreamWriter <HelloReply> responseStream, ServerCallContext context) { context.WriteOptions = new WriteOptions(WriteFlags.BufferHint); return(methodWrapper.SayHellosAsync(request, responseStream)); } // Arrange var method = Fixture.DynamicGrpc.AddServerStreamingMethod <HelloRequest, HelloReply>(SayHellosBufferHint); var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = GrpcHttpHelper.Create(method.FullName); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var responseTask = Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert Assert.IsFalse(responseTask.IsCompleted, "Server should wait for first message from client"); await methodWrapper.SyncPoint.WaitForSyncPoint().DefaultTimeout(); methodWrapper.SyncPoint.Continue(); var response = await responseTask.DefaultTimeout(); response.AssertIsSuccessfulGrpcRequest(); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); for (var i = 0; i < 3; i++) { var greeting = (await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout()) !; Assert.AreEqual($"How are you World? {i}", greeting.Message); } var goodbye = await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout(); Assert.AreEqual("Goodbye World!", goodbye !.Message); Assert.IsNull(await MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader).DefaultTimeout()); response.AssertTrailerStatus(); }
public async Task WriteResponseHeadersAsyncCore_FlushesHeadersToClient() { var methodWrapper = new MethodWrapper { Logger = Logger, SyncPoint = new SyncPoint(runContinuationsAsynchronously: true) }; async Task SayHellosSendHeadersFirst(HelloRequest request, IServerStreamWriter <HelloReply> responseStream, ServerCallContext context) { await context.WriteResponseHeadersAsync(Metadata.Empty); await methodWrapper.SayHellosAsync(request, responseStream); } // Arrange var method = Fixture.DynamicGrpc.AddServerStreamingMethod <HelloRequest, HelloReply>(SayHellosSendHeadersFirst); var requestMessage = new HelloRequest { Name = "World" }; var requestStream = new MemoryStream(); MessageHelpers.WriteMessage(requestStream, requestMessage); var httpRequest = GrpcHttpHelper.Create(method.FullName); httpRequest.Content = new GrpcStreamContent(requestStream); // Act var response = await Fixture.Client.SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead).DefaultTimeout(); // Assert response.AssertIsSuccessfulGrpcRequest(); Logger.LogInformation("Headers received. Starting to read stream"); var responseStream = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var pipeReader = PipeReader.Create(responseStream); for (var i = 0; i < 3; i++) { Logger.LogInformation($"Reading message {i}."); var greetingTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); // The headers are already sent // All responses are streamed Logger.LogInformation($"Message task completed: {greetingTask.IsCompleted}"); Assert.IsFalse(greetingTask.IsCompleted); await methodWrapper.SyncPoint.WaitForSyncPoint().DefaultTimeout(); var currentSyncPoint = methodWrapper.SyncPoint; methodWrapper.SyncPoint = new SyncPoint(runContinuationsAsynchronously: true); currentSyncPoint.Continue(); var greeting = (await greetingTask.DefaultTimeout()) !; Logger.LogInformation($"Received message {i}: {greeting.Message}"); Assert.AreEqual($"How are you World? {i}", greeting.Message); } var goodbyeTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.False(goodbyeTask.IsCompleted); await methodWrapper.SyncPoint.WaitForSyncPoint().DefaultTimeout(); methodWrapper.SyncPoint.Continue(); Assert.AreEqual("Goodbye World!", (await goodbyeTask.DefaultTimeout()) !.Message); var finishedTask = MessageHelpers.AssertReadStreamMessageAsync <HelloReply>(pipeReader); Assert.IsNull(await finishedTask.DefaultTimeout()); }