Skip to content

Commit aede7c5

Browse files
authored
Fix ConnectionPoolTest bug (#8384)
1. Advance taskFaker time forward to the present when the test starts. 2. Stop having multiple factories and taskfakers floating around.
1 parent 8d83f92 commit aede7c5

File tree

3 files changed

+24
-23
lines changed

3 files changed

+24
-23
lines changed

okhttp/src/test/java/okhttp3/FakeRoutePlanner.kt

+2-6
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,9 @@ import okhttp3.internal.connection.RoutePlanner
2424
import okhttp3.internal.connection.RoutePlanner.ConnectResult
2525

2626
class FakeRoutePlanner(
27-
private val taskFaker: TaskFaker,
27+
val factory: TestValueFactory = TestValueFactory(),
28+
val taskFaker: TaskFaker = factory.taskFaker,
2829
) : RoutePlanner, Closeable {
29-
/**
30-
* Note that we don't use the same [TaskFaker] for this factory. That way off-topic tasks like
31-
* connection pool maintenance tasks don't add noise to route planning tests.
32-
*/
33-
val factory = TestValueFactory()
3430
val pool = factory.newConnectionPool(routePlanner = this)
3531
val events = LinkedBlockingDeque<String>()
3632
var canceled = false

okhttp/src/test/java/okhttp3/internal/connection/ConnectionPoolTest.kt

+16-16
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import okhttp3.FakeRoutePlanner
2727
import okhttp3.OkHttpClient
2828
import okhttp3.Request
2929
import okhttp3.TestUtil.awaitGarbageCollection
30-
import okhttp3.TestValueFactory
3130
import okhttp3.internal.concurrent.TaskRunner
3231
import okhttp3.internal.connection.Locks.withLock
3332
import okhttp3.internal.http2.Http2
@@ -39,7 +38,9 @@ import org.junit.jupiter.api.AfterEach
3938
import org.junit.jupiter.api.Test
4039

4140
class ConnectionPoolTest {
42-
private val factory = TestValueFactory()
41+
private val routePlanner = FakeRoutePlanner()
42+
private val factory = routePlanner.factory
43+
private val taskFaker = routePlanner.taskFaker
4344
private val peer = MockHttp2Peer()
4445

4546
/** The fake task runner prevents the cleanup runnable from being started. */
@@ -50,8 +51,6 @@ class ConnectionPoolTest {
5051
private val addressC = factory.newAddress("c")
5152
private val routeC1 = factory.newRoute(addressC)
5253

53-
private val routePlanner = FakeRoutePlanner(factory.taskFaker)
54-
5554
@AfterEach fun tearDown() {
5655
factory.close()
5756
peer.close()
@@ -205,7 +204,8 @@ class ConnectionPoolTest {
205204
}
206205

207206
@Test fun connectionPreWarmingHttp1() {
208-
val expireTime = factory.taskFaker.nanoTime + 1_000_000_000_000
207+
taskFaker.advanceUntil(System.nanoTime())
208+
val expireTime = taskFaker.nanoTime + 1_000_000_000_000
209209

210210
routePlanner.autoGeneratePlans = true
211211
routePlanner.defaultConnectionIdleAtNanos = expireTime
@@ -219,19 +219,20 @@ class ConnectionPoolTest {
219219
// Connections are replaced if they idle out or are evicted from the pool
220220
evictAllConnections(pool)
221221
assertThat(pool.connectionCount()).isEqualTo(2)
222-
forceConnectionsToExpire(pool, routePlanner, expireTime)
222+
forceConnectionsToExpire(pool, expireTime)
223223
assertThat(pool.connectionCount()).isEqualTo(2)
224224

225225
// Excess connections aren't removed until they idle out, even if no longer needed
226226
setPolicy(pool, address, ConnectionPool.AddressPolicy(1))
227227
assertThat(pool.connectionCount()).isEqualTo(2)
228-
forceConnectionsToExpire(pool, routePlanner, expireTime)
228+
forceConnectionsToExpire(pool, expireTime)
229229
assertThat(pool.connectionCount()).isEqualTo(1)
230230
}
231231

232232
@Test fun connectionPreWarmingHttp2() {
233-
val expireSooner = factory.taskFaker.nanoTime + 1_000_000_000_000
234-
val expireLater = factory.taskFaker.nanoTime + 2_000_000_000_000
233+
taskFaker.advanceUntil(System.nanoTime())
234+
val expireSooner = taskFaker.nanoTime + 1_000_000_000_000
235+
val expireLater = taskFaker.nanoTime + 2_000_000_000_000
235236

236237
routePlanner.autoGeneratePlans = true
237238
val address = routePlanner.address
@@ -258,7 +259,7 @@ class ConnectionPoolTest {
258259

259260
// Increase the connection's max so that the new connection is no longer needed
260261
updateMaxConcurrentStreams(http2Connection, 5)
261-
forceConnectionsToExpire(pool, routePlanner, expireSooner)
262+
forceConnectionsToExpire(pool, expireSooner)
262263
assertThat(pool.connectionCount()).isEqualTo(1)
263264
}
264265

@@ -268,23 +269,22 @@ class ConnectionPoolTest {
268269
policy: ConnectionPool.AddressPolicy,
269270
) {
270271
pool.setPolicy(address, policy)
271-
routePlanner.factory.taskFaker.runTasks()
272+
taskFaker.runTasks()
272273
}
273274

274275
private fun evictAllConnections(pool: RealConnectionPool) {
275276
pool.evictAll()
276277
assertThat(pool.connectionCount()).isEqualTo(0)
277-
routePlanner.factory.taskFaker.runTasks()
278+
taskFaker.runTasks()
278279
}
279280

280281
private fun forceConnectionsToExpire(
281282
pool: RealConnectionPool,
282-
routePlanner: FakeRoutePlanner,
283283
expireTime: Long,
284284
) {
285285
val idleTimeNanos = expireTime + pool.keepAliveDurationNs
286286
repeat(pool.connectionCount()) { pool.closeConnections(idleTimeNanos) }
287-
routePlanner.factory.taskFaker.runTasks()
287+
taskFaker.runTasks()
288288
}
289289

290290
private fun connectHttp2(
@@ -316,7 +316,7 @@ class ConnectionPoolTest {
316316
assertThat(ackFrame.streamId).isEqualTo(0)
317317
assertThat(ackFrame.ack).isTrue()
318318

319-
routePlanner.factory.taskFaker.runTasks()
319+
taskFaker.runTasks()
320320

321321
return connection
322322
}
@@ -329,7 +329,7 @@ class ConnectionPoolTest {
329329
settings[Settings.MAX_CONCURRENT_STREAMS] = amount
330330
connection.readerRunnable.applyAndAckSettings(true, settings)
331331
assertThat(connection.peerSettings[Settings.MAX_CONCURRENT_STREAMS]).isEqualTo(amount)
332-
routePlanner.factory.taskFaker.runTasks()
332+
taskFaker.runTasks()
333333
}
334334

335335
/** Use a helper method so there's no hidden reference remaining on the stack. */

okhttp/src/test/java/okhttp3/internal/connection/FastFallbackExchangeFinderTest.kt

+6-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ import org.junit.jupiter.api.Test
4141
internal class FastFallbackExchangeFinderTest {
4242
private val taskFaker = TaskFaker()
4343
private val taskRunner = taskFaker.taskRunner
44-
private val routePlanner = FakeRoutePlanner(taskFaker)
44+
45+
/**
46+
* Note that we don't use the same [TaskFaker] for this factory. That way off-topic tasks like
47+
* connection pool maintenance tasks don't add noise to route planning tests.
48+
*/
49+
private val routePlanner = FakeRoutePlanner(taskFaker = taskFaker)
4550
private val finder = FastFallbackExchangeFinder(routePlanner, taskRunner)
4651

4752
@AfterEach

0 commit comments

Comments
 (0)