From 2955cb79e818eea496b39f74d051c092a8337a0f Mon Sep 17 00:00:00 2001 From: nehme-bilal-ah Date: Sat, 18 Nov 2023 19:17:34 +0300 Subject: [PATCH] Preserve stacktrace order for unknown exceptions --- stub/src/main/java/io/grpc/kotlin/ServerCalls.kt | 4 +++- .../test/java/io/grpc/kotlin/ServerCallsTest.kt | 14 ++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/stub/src/main/java/io/grpc/kotlin/ServerCalls.kt b/stub/src/main/java/io/grpc/kotlin/ServerCalls.kt index d2b532b4..c77de0ef 100644 --- a/stub/src/main/java/io/grpc/kotlin/ServerCalls.kt +++ b/stub/src/main/java/io/grpc/kotlin/ServerCalls.kt @@ -262,7 +262,9 @@ object ServerCalls { null -> Status.OK is CancellationException -> Status.CANCELLED.withCause(failure) is StatusException, is StatusRuntimeException -> Status.fromThrowable(failure) - else -> Status.fromThrowable(failure).withCause(failure) + else -> Status.UNKNOWN + .withDescription("Unknown Exception") + .withCause(failure) } val trailers = failure?.let { Status.trailersFromThrowable(it) } ?: GrpcMetadata() mutex.withLock { call.close(closeStatus, trailers) } diff --git a/stub/src/test/java/io/grpc/kotlin/ServerCallsTest.kt b/stub/src/test/java/io/grpc/kotlin/ServerCallsTest.kt index 9ed61a66..3361a074 100644 --- a/stub/src/test/java/io/grpc/kotlin/ServerCallsTest.kt +++ b/stub/src/test/java/io/grpc/kotlin/ServerCallsTest.kt @@ -1184,7 +1184,7 @@ class ServerCallsTest : AbstractCallsTest() { } } - val receivedStatusCause = CompletableDeferred() + val receivedStatus = CompletableDeferred() val interceptor = object : ServerInterceptor { override fun interceptCall( @@ -1195,7 +1195,7 @@ class ServerCallsTest : AbstractCallsTest() { next.startCall( object : ForwardingServerCall.SimpleForwardingServerCall(call) { override fun close(status: Status, trailers: Metadata) { - receivedStatusCause.complete(status.cause) + receivedStatus.complete(status) super.close(status, trailers) } }, @@ -1213,11 +1213,13 @@ class ServerCallsTest : AbstractCallsTest() { // the exception should not propagate to the client assertThat(clientException.cause).isNull() - assertThat(clientException.status.code).isEqualTo(Status.Code.INTERNAL) - val statusCause = receivedStatusCause.await() + assertThat(clientException.status.code).isEqualTo(Status.Code.UNKNOWN) + val status = receivedStatus.await()!! // but the exception should propagate to server interceptors, with stack trace intact - assertThat(statusCause).isEqualTo(thrownStatusCause.await()) - assertThat(statusCause!!.stackTraceToString()).contains("internalServerCall") + assertThat(status.code).isEqualTo(Status.UNKNOWN.code) + assertThat(status.description).isEqualTo("Unknown Exception") + assertThat(status.cause).isEqualTo(thrownStatusCause.await()) + assertThat(status.cause?.stackTraceToString()).contains("internalServerCall") } }