diff --git a/test/FunctionalTests/Client/UnaryTests.cs b/test/FunctionalTests/Client/UnaryTests.cs index b0638a7ec..bc58012ff 100644 --- a/test/FunctionalTests/Client/UnaryTests.cs +++ b/test/FunctionalTests/Client/UnaryTests.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2019 The gRPC Authors // @@ -68,6 +68,37 @@ Task UnaryThrowError(HelloRequest request, ServerCallContext context StringAssert.StartsWith("Failed to deserialize response message.", call.GetStatus().Detail); } + [Test] + public async Task WriteResponseHeadersAsync_HeadersSentEarly() + { + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + async Task UnaryThrowError(HelloRequest request, ServerCallContext context) + { + await context.WriteResponseHeadersAsync(new Metadata + { + new Metadata.Entry("key", "value") + }); + + return await tcs.Task; + } + + // Arrange + var method = Fixture.DynamicGrpc.AddUnaryMethod(UnaryThrowError); + var channel = CreateChannel(); + var client = TestClientFactory.Create(channel, method); + + // Act + var call = client.UnaryCall(new HelloRequest()); + + // Assert + var headers = await call.ResponseHeadersAsync.DefaultTimeout(); + Assert.AreEqual("value", headers.GetValue("key")); + Assert.IsFalse(call.ResponseAsync.IsCompleted); + + tcs.SetResult(new HelloReply()); + } + [TestCase("fr", "fr")] [TestCase(null, "en-US")] public async Task Unary_SetAcceptLanguage_ServerCultureChanged(string clientAcceptLanguage, string expectedServerCulture)