From d2f0b717baa2daea94b1b882ce7c1b5f1104b9ed Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 12 Jun 2026 19:13:14 +0200 Subject: [PATCH] Code review: - apply exception-class fallback to connect() too - dedup message construction --- .../client/single/basic/BasicRelayClient.kt | 8 +++-- .../single/basic/BasicRelayClientTest.kt | 29 ++++++++++--------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt index 45d3a42595..46be99d3bb 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt @@ -103,7 +103,7 @@ open class BasicRelayClient( socket?.connect() } catch (e: Exception) { if (e is CancellationException) throw e - listener.onCannotConnect(this, "Error when trying to connect: ${e.message}") + listener.onCannotConnect(this, "Error when trying to connect: ${e.message ?: e::class.simpleName}") listener.onDisconnected(this) dontTryAgainForALongTime() markConnectionAsClosed() @@ -154,7 +154,9 @@ open class BasicRelayClient( } else { socket?.disconnect() + // suppression rules below must match the raw message; displayMsg is for listener output only val msg = t.message + val displayMsg = msg ?: t::class.simpleName // checks if this is an actual failure. Closing the socket generates an onFailure as well. // ignore tor errors. @@ -167,9 +169,9 @@ open class BasicRelayClient( ) ) { if (code != null || response != null) { - listener.onCannotConnect(this@BasicRelayClient, "Server Misconfigured. Response: $code $response. Exception: ${t.message ?: t::class.simpleName}") + listener.onCannotConnect(this@BasicRelayClient, "Server Misconfigured. Response: $code $response. Exception: $displayMsg") } else { - listener.onCannotConnect(this@BasicRelayClient, "WebSocket Failure: ${t.message ?: t::class.simpleName}") + listener.onCannotConnect(this@BasicRelayClient, "WebSocket Failure: $displayMsg") } } else { // ignore local disconnect requests and tor errors diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClientTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClientTest.kt index 1c3475928f..f46945cde4 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClientTest.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClientTest.kt @@ -66,10 +66,14 @@ class BasicRelayClientTest { private class MessagelessException : Exception() - private fun connectAndCapture( - builder: FakeWebsocketBuilder, - listener: RecordingConnectionListener, - ): WebSocketListener { + private data class Harness( + val socketListener: WebSocketListener, + val connectionListener: RecordingConnectionListener, + ) + + private fun connectAndCapture(): Harness { + val builder = FakeWebsocketBuilder() + val listener = RecordingConnectionListener() val client = BasicRelayClient( NormalizedRelayUrl("wss://relay.example.com/"), @@ -79,15 +83,14 @@ class BasicRelayClientTest { client.connect() val socketListener = builder.capturedListener assertNotNull(socketListener) - return socketListener + return Harness(socketListener, listener) } @Test fun onFailureWithNullMessageReportsExceptionClassName() { - val builder = FakeWebsocketBuilder() - val listener = RecordingConnectionListener() + val (socket, listener) = connectAndCapture() - connectAndCapture(builder, listener).onFailure(MessagelessException(), null, null) + socket.onFailure(MessagelessException(), null, null) assertEquals( listOf("WebSocket Failure: MessagelessException"), @@ -97,10 +100,9 @@ class BasicRelayClientTest { @Test fun onFailureWithMessageKeepsExistingFormat() { - val builder = FakeWebsocketBuilder() - val listener = RecordingConnectionListener() + val (socket, listener) = connectAndCapture() - connectAndCapture(builder, listener).onFailure(Exception("Connection reset"), null, null) + socket.onFailure(Exception("Connection reset"), null, null) assertEquals( listOf("WebSocket Failure: Connection reset"), @@ -110,10 +112,9 @@ class BasicRelayClientTest { @Test fun serverMisconfiguredWithNullMessageReportsExceptionClassName() { - val builder = FakeWebsocketBuilder() - val listener = RecordingConnectionListener() + val (socket, listener) = connectAndCapture() - connectAndCapture(builder, listener).onFailure(MessagelessException(), 200, "OK") + socket.onFailure(MessagelessException(), 200, "OK") assertEquals( listOf("Server Misconfigured. Response: 200 OK. Exception: MessagelessException"),