1
0
mirror of https://github.com/square/okhttp.git synced 2025-08-08 23:42:08 +03:00

Attempt to minimise WebSocket test flakiness (#6045)

This commit is contained in:
Yuri Schimke
2020-05-13 07:46:19 +01:00
committed by GitHub
parent 5f67bd1e5b
commit fea8fbba5f
4 changed files with 23 additions and 5 deletions

View File

@@ -26,7 +26,7 @@ class ClientRuleEventListener(
var logger: (String) -> Unit
) : EventListener(),
EventListener.Factory {
private var startNs: Long = 0
private var startNs: Long? = null
override fun create(call: Call): EventListener = this
@@ -266,7 +266,14 @@ class ClientRuleEventListener(
}
private fun logWithTime(message: String) {
val timeMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs)
val startNs = startNs
val timeMs = if (startNs == null) {
// Event occurred before start, for an example an early cancel.
0L
} else {
TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs)
}
logger.invoke("[$timeMs ms] $message")
}
}

View File

@@ -43,6 +43,7 @@ class OkHttpClientTestRule : TestRule {
private var testClient: OkHttpClient? = null
private var uncaughtException: Throwable? = null
var logger: Logger? = null
lateinit var testName: String
var recordEvents = true
var recordTaskRunner = false
@@ -131,7 +132,16 @@ class OkHttpClientTestRule : TestRule {
fun ensureAllConnectionsReleased() {
testClient?.let {
val connectionPool = it.connectionPool
connectionPool.evictAll()
if (connectionPool.connectionCount() > 0) {
// Minimise test flakiness due to possible race conditions with connections closing.
// Some number of tests will report here, but not fail due to this delay.
println("Delaying to avoid flakes")
Thread.sleep(500L)
println("After delay: " + connectionPool.connectionCount())
}
assertEquals(0, connectionPool.connectionCount())
}
}
@@ -156,6 +166,8 @@ class OkHttpClientTestRule : TestRule {
): Statement {
return object : Statement() {
override fun evaluate() {
testName = description.methodName
val defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
Thread.setDefaultUncaughtExceptionHandler { _, throwable ->
initUncaughtException(throwable)
@@ -233,7 +245,7 @@ class OkHttpClientTestRule : TestRule {
@Synchronized private fun logEvents() {
// Will be ineffective if test overrides the listener
synchronized(clientEventsList) {
println("Events (${clientEventsList.size})")
println("$testName Events (${clientEventsList.size})")
for (e in clientEventsList) {
println(e)

View File

@@ -78,7 +78,6 @@ import static okhttp3.tls.internal.TlsUtil.localhost;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.any;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeThat;

View File

@@ -100,7 +100,7 @@ public final class WebSocketHttpTest {
platform.assumeNotBouncyCastle();
}
@After public void tearDown() {
@After public void tearDown() throws InterruptedException {
clientListener.assertExhausted();
}