From e4721510ae15fd60188ab8e49b362996d43b3081 Mon Sep 17 00:00:00 2001 From: Jesse Wilson Date: Tue, 4 Nov 2025 11:11:23 -0500 Subject: [PATCH] Fix some failing tests that CI hasn't been running (#9179) Thankfully there's nothing here that indicates we've shipped a bug to our users. Co-authored-by: Jesse Wilson --- .../kotlin/okhttp3/internal/ws/WebSocketReader.kt | 13 +++++++++---- .../src/jvmTest/kotlin/okhttp3/InterceptorTest.kt | 5 +---- .../kotlin/okhttp3/internal/tls/ClientAuthTest.kt | 3 ++- .../okhttp3/internal/ws/WebSocketReaderTest.kt | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/ws/WebSocketReader.kt b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/ws/WebSocketReader.kt index ae0faf593..3c7bd0f6d 100644 --- a/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/ws/WebSocketReader.kt +++ b/okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/ws/WebSocketReader.kt @@ -60,6 +60,7 @@ class WebSocketReader( private val noContextTakeover: Boolean, ) : Closeable { private var closed = false + private var receivedCloseFrame = false // Stateful data about the current frame. private var opcode = 0 @@ -105,6 +106,8 @@ class WebSocketReader( */ @Throws(IOException::class) fun processNextFrame() { + check(!closed) { "closed" } + readHeader() if (isControlFrame) { readControlFrame() @@ -115,7 +118,7 @@ class WebSocketReader( @Throws(IOException::class, ProtocolException::class) private fun readHeader() { - if (closed) throw IOException("closed") + if (receivedCloseFrame) throw IOException("closed") // Disable the timeout to read the first byte of a new frame. val b0: Int @@ -228,7 +231,7 @@ class WebSocketReader( if (codeExceptionMessage != null) throw ProtocolException(codeExceptionMessage) } frameCallback.onReadClose(code, reason) - closed = true + receivedCloseFrame = true } else -> { throw ProtocolException("Unknown control opcode: " + opcode.toHexString()) @@ -262,7 +265,7 @@ class WebSocketReader( /** Read headers and process any control frames until we reach a non-control frame. */ @Throws(IOException::class) private fun readUntilNonControlFrame() { - while (!closed) { + while (!receivedCloseFrame) { readHeader() if (!isControlFrame) { break @@ -279,7 +282,7 @@ class WebSocketReader( @Throws(IOException::class) private fun readMessage() { while (true) { - if (closed) throw IOException("closed") + if (receivedCloseFrame) throw IOException("closed") if (frameLength > 0L) { source.readFully(messageFrameBuffer, frameLength) @@ -303,6 +306,8 @@ class WebSocketReader( @Throws(IOException::class) override fun close() { + if (closed) return + closed = true messageInflater?.closeQuietly() source.closeQuietly() } diff --git a/okhttp/src/jvmTest/kotlin/okhttp3/InterceptorTest.kt b/okhttp/src/jvmTest/kotlin/okhttp3/InterceptorTest.kt index 22f1ceaf5..953c72452 100644 --- a/okhttp/src/jvmTest/kotlin/okhttp3/InterceptorTest.kt +++ b/okhttp/src/jvmTest/kotlin/okhttp3/InterceptorTest.kt @@ -640,10 +640,7 @@ class InterceptorTest { call.enqueue(callback) val recordedResponse = callback.await(server.url("/")) assertThat(recordedResponse.failure, "canceled due to java.lang.RuntimeException: boom!") - recordedResponse.failure!!.assertSuppressed { throwables: List? -> - assertThat(throwables!!).contains(boom) - Unit - } + assertThat(recordedResponse.failure?.cause).isEqualTo(boom) assertThat(call.isCanceled()).isTrue() assertThat(executor.takeException()).isEqualTo(boom) } diff --git a/okhttp/src/jvmTest/kotlin/okhttp3/internal/tls/ClientAuthTest.kt b/okhttp/src/jvmTest/kotlin/okhttp3/internal/tls/ClientAuthTest.kt index d78fd43e1..bb495e519 100644 --- a/okhttp/src/jvmTest/kotlin/okhttp3/internal/tls/ClientAuthTest.kt +++ b/okhttp/src/jvmTest/kotlin/okhttp3/internal/tls/ClientAuthTest.kt @@ -38,6 +38,7 @@ import kotlin.test.assertFailsWith import mockwebserver3.MockResponse import mockwebserver3.MockWebServer import mockwebserver3.junit5.StartStop +import okhttp3.CallEvent.CallFailed import okhttp3.CallEvent.CallStart import okhttp3.CallEvent.ConnectStart import okhttp3.CallEvent.DnsEnd @@ -363,7 +364,7 @@ class ClientAuthTest { ConnectStart::class, SecureConnectStart::class, ) - assertThat(recordedEventTypes).endsWith("CallFailed") + assertThat(recordedEventTypes).endsWith(CallFailed::class) } private fun buildClient( diff --git a/okhttp/src/jvmTest/kotlin/okhttp3/internal/ws/WebSocketReaderTest.kt b/okhttp/src/jvmTest/kotlin/okhttp3/internal/ws/WebSocketReaderTest.kt index d3f264333..d9f1b3a55 100644 --- a/okhttp/src/jvmTest/kotlin/okhttp3/internal/ws/WebSocketReaderTest.kt +++ b/okhttp/src/jvmTest/kotlin/okhttp3/internal/ws/WebSocketReaderTest.kt @@ -437,7 +437,7 @@ class WebSocketReaderTest { callback.assertTextMessage("Hello") data.write("c107f248cdc9c90700".decodeHex()) // Hello clientReaderWithCompression.close() - assertFailsWith { + assertFailsWith { clientReaderWithCompression.processNextFrame() }.also { expected -> assertThat(expected.message!!).contains("closed")