Code review:

- apply exception-class fallback to connect() too
- dedup message construction
This commit is contained in:
davotoula
2026-06-12 19:30:09 +02:00
parent 16e5ddbc5f
commit d2f0b717ba
2 changed files with 20 additions and 17 deletions
@@ -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
@@ -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"),