diff --git a/tests/protobuf-net.Grpc.Test.Integration/StreamTests.cs b/tests/protobuf-net.Grpc.Test.Integration/StreamTests.cs index bb1457a1..731fb69f 100644 --- a/tests/protobuf-net.Grpc.Test.Integration/StreamTests.cs +++ b/tests/protobuf-net.Grpc.Test.Integration/StreamTests.cs @@ -172,7 +172,18 @@ async ValueTask IStreamAPI.UnaryAsync(Foo value, CallContext ctx) return value; } - Foo IStreamAPI.UnaryBlocking(Foo value, CallContext ctx) => ((IStreamAPI)this).UnaryAsync(value, ctx).Result; // sync-over-async for this test only + Foo IStreamAPI.UnaryBlocking(Foo value, CallContext ctx) + { + try + { + return ((IStreamAPI)this).UnaryAsync(value, ctx).Result; // sync-over-async for this test only + } + catch (RpcException ex) + { + Log($"RpcException: {ex.StatusCode}, '{ex.Message}', {ex.Trailers?.Count ?? 0} trailers"); + throw; + } + } async ValueTask IStreamAPI.ClientStreaming(IAsyncEnumerable values, CallContext ctx) { @@ -289,6 +300,7 @@ public DisposableChannel(Channel channel) #if NETCOREAPP3_1 public class ManagedStreamTests : StreamTests { + public override bool IsManagedClient => true; public ManagedStreamTests(StreamTestsFixture fixture, ITestOutputHelper log) : base(10044, fixture, log) { } protected override IAsyncDisposable CreateClient(out IStreamAPI client) { @@ -322,6 +334,8 @@ public StreamTests(int port, StreamTestsFixture fixture, ITestOutputHelper log) GrpcClientFactory.AllowUnencryptedHttp2 = true; } + public virtual bool IsManagedClient => false; + public void Dispose() => _fixture?.SetOutput(null); protected abstract IAsyncDisposable CreateClient(out IStreamAPI client); @@ -584,8 +598,16 @@ void CheckStatus(Status status) Assert.Equal("before trailers detail", status.Detail); break; case Scenario.FaultSuccessGoodProducer: - Assert.Equal(StatusCode.OK, status.StatusCode); - Assert.Equal("", status.Detail); + if (IsManagedClient) + { + Assert.Equal(StatusCode.OK, status.StatusCode); + Assert.Equal("", status.Detail); + } + else + { // see https://github.com/grpc/grpc-dotnet/issues/915 + Assert.Equal(StatusCode.Internal, status.StatusCode); + Assert.Equal("Failed to deserialize response message.", status.Detail); + } break; default: throw new NotImplementedException(); @@ -684,8 +706,16 @@ void CheckStatus(Status status) Assert.Equal("before trailers detail", status.Detail); break; case Scenario.FaultSuccessGoodProducer: - Assert.Equal(StatusCode.OK, status.StatusCode); - Assert.Equal("", status.Detail); + if (IsManagedClient) + { + Assert.Equal(StatusCode.OK, status.StatusCode); + Assert.Equal("", status.Detail); + } + else + { // see https://github.com/grpc/grpc-dotnet/issues/916 + Assert.Equal(StatusCode.Internal, status.StatusCode); + Assert.Equal("Failed to deserialize response message.", status.Detail); + } break; default: throw new NotImplementedException(); @@ -785,7 +815,7 @@ public async Task ServerStreaming(bool fault) Assert.Equal("oops", ex.Status.Detail); Assert.Equal(StatusCode.Internal, ex.Status.StatusCode); Assert.Equal(10, ctx.ResponseHeaders().GetInt32("req")); - + // managed client doesn't seem to get fault trailers on server-streaming var expect = Enumerable.Range(0, 5).Sum(); Assert.Equal(expect, ctx.ResponseTrailers().GetInt32("sum"));