From 1b60e3739c49a8ce9fb1e2ec6c357fe6a3feaa3a Mon Sep 17 00:00:00 2001 From: Yuri Schimke Date: Sun, 11 Aug 2019 10:48:43 +0100 Subject: [PATCH] Test Android session reuse --- android-test/build.gradle | 1 + .../java/okhttp/android/test/OkHttpTest.kt | 72 +++++++++++++++++++ .../java/okhttp3/RecordingEventListener.java | 3 +- 3 files changed, 75 insertions(+), 1 deletion(-) rename {okhttp/src/test => okhttp-testing-support/src/main}/java/okhttp3/RecordingEventListener.java (99%) diff --git a/android-test/build.gradle b/android-test/build.gradle index 995d5bef1..d9559fe20 100644 --- a/android-test/build.gradle +++ b/android-test/build.gradle @@ -32,6 +32,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.kotlin}" implementation project(':okhttp') testImplementation 'junit:junit:4.12' + androidTestImplementation project(':okhttp-testing-support') androidTestImplementation project(':mockwebserver') androidTestImplementation project(':okhttp-tls') androidTestImplementation 'com.android.support.test:runner:1.0.2' diff --git a/android-test/src/androidTest/java/okhttp/android/test/OkHttpTest.kt b/android-test/src/androidTest/java/okhttp/android/test/OkHttpTest.kt index 9af2d997c..3aec4cab3 100644 --- a/android-test/src/androidTest/java/okhttp/android/test/OkHttpTest.kt +++ b/android-test/src/androidTest/java/okhttp/android/test/OkHttpTest.kt @@ -23,11 +23,13 @@ import okhttp3.Connection import okhttp3.EventListener import okhttp3.OkHttpClient import okhttp3.Protocol +import okhttp3.RecordingEventListener import okhttp3.Request import okhttp3.TlsVersion import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer import okhttp3.tls.internal.TlsUtil.localhost +import okio.ByteString.Companion.toByteString import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue @@ -41,6 +43,7 @@ import org.junit.runner.RunWith import java.net.InetAddress import java.net.UnknownHostException import javax.net.ssl.SSLPeerUnverifiedException +import javax.net.ssl.SSLSocket /** * Run with "./gradlew :android-test:connectedCheck" and make sure ANDROID_SDK_ROOT is set. @@ -190,6 +193,75 @@ class OkHttpTest { } } + @Test + fun testEventListener() { + val eventListener = RecordingEventListener() + + client = client.newBuilder().eventListener(eventListener).build() + + enableTls() + + server.enqueue(MockResponse().setBody("abc1")) + server.enqueue(MockResponse().setBody("abc2")) + + val request = Request.Builder().url(server.url("/")).build() + + client.newCall(request).execute().use { response -> + assertEquals(200, response.code) + } + + assertEquals(listOf("CallStart", "ProxySelectStart", "ProxySelectEnd", "DnsStart", "DnsEnd", + "ConnectStart", "SecureConnectStart", "SecureConnectEnd", "ConnectEnd", + "ConnectionAcquired", "RequestHeadersStart", "RequestHeadersEnd", "ResponseHeadersStart", + "ResponseHeadersEnd", "ResponseBodyStart", "ResponseBodyEnd", "ConnectionReleased", + "CallEnd"), eventListener.recordedEventTypes()) + + eventListener.clearAllEvents() + + client.newCall(request).execute().use { response -> + assertEquals(200, response.code) + } + + assertEquals(listOf("CallStart", "ProxySelectStart", "ProxySelectEnd", + "ConnectionAcquired", "RequestHeadersStart", "RequestHeadersEnd", "ResponseHeadersStart", + "ResponseHeadersEnd", "ResponseBodyStart", "ResponseBodyEnd", "ConnectionReleased", + "CallEnd"), eventListener.recordedEventTypes()) + } + + @Test + fun testSessionReuse() { + val sessionIds = mutableListOf() + + client = client.newBuilder().eventListener(object : EventListener() { + override fun connectionAcquired(call: Call, connection: Connection) { + val sslSocket = connection.socket() as SSLSocket + + sessionIds.add(sslSocket.session.id.toByteString().hex()) + } + }).build() + + enableTls() + + server.enqueue(MockResponse().setBody("abc1")) + server.enqueue(MockResponse().setBody("abc2")) + + val request = Request.Builder().url(server.url("/")).build() + + client.newCall(request).execute().use { response -> + assertEquals(200, response.code) + } + + client.connectionPool.evictAll() + assertEquals(0, client.connectionPool.connectionCount()) + + client.newCall(request).execute().use { response -> + assertEquals(200, response.code) + } + + assertEquals(2, sessionIds.size) + assertEquals(sessionIds[0], sessionIds[1]) + } + private fun enableTls() { client = client.newBuilder() .sslSocketFactory( diff --git a/okhttp/src/test/java/okhttp3/RecordingEventListener.java b/okhttp-testing-support/src/main/java/okhttp3/RecordingEventListener.java similarity index 99% rename from okhttp/src/test/java/okhttp3/RecordingEventListener.java rename to okhttp-testing-support/src/main/java/okhttp3/RecordingEventListener.java index dd2b5d68c..8bd4f86f5 100644 --- a/okhttp/src/test/java/okhttp3/RecordingEventListener.java +++ b/okhttp-testing-support/src/main/java/okhttp3/RecordingEventListener.java @@ -27,6 +27,7 @@ import javax.annotation.Nullable; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; public class RecordingEventListener extends EventListener { final Deque eventSequence = new ConcurrentLinkedDeque<>(); @@ -75,7 +76,7 @@ public class RecordingEventListener extends EventListener { CallEvent startEvent = e.closes(); if (startEvent != null) { - assertThat(eventSequence).contains(startEvent); + assertTrue(eventSequence.contains(startEvent)); } eventSequence.offer(e);