mirror of
https://github.com/square/okhttp.git
synced 2025-08-07 12:42:57 +03:00
Test Android session reuse
This commit is contained in:
@@ -32,6 +32,7 @@ dependencies {
|
|||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.kotlin}"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.kotlin}"
|
||||||
implementation project(':okhttp')
|
implementation project(':okhttp')
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
|
androidTestImplementation project(':okhttp-testing-support')
|
||||||
androidTestImplementation project(':mockwebserver')
|
androidTestImplementation project(':mockwebserver')
|
||||||
androidTestImplementation project(':okhttp-tls')
|
androidTestImplementation project(':okhttp-tls')
|
||||||
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
androidTestImplementation 'com.android.support.test:runner:1.0.2'
|
||||||
|
@@ -23,11 +23,13 @@ import okhttp3.Connection
|
|||||||
import okhttp3.EventListener
|
import okhttp3.EventListener
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Protocol
|
import okhttp3.Protocol
|
||||||
|
import okhttp3.RecordingEventListener
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.TlsVersion
|
import okhttp3.TlsVersion
|
||||||
import okhttp3.mockwebserver.MockResponse
|
import okhttp3.mockwebserver.MockResponse
|
||||||
import okhttp3.mockwebserver.MockWebServer
|
import okhttp3.mockwebserver.MockWebServer
|
||||||
import okhttp3.tls.internal.TlsUtil.localhost
|
import okhttp3.tls.internal.TlsUtil.localhost
|
||||||
|
import okio.ByteString.Companion.toByteString
|
||||||
import org.junit.After
|
import org.junit.After
|
||||||
import org.junit.Assert.assertEquals
|
import org.junit.Assert.assertEquals
|
||||||
import org.junit.Assert.assertTrue
|
import org.junit.Assert.assertTrue
|
||||||
@@ -41,6 +43,7 @@ import org.junit.runner.RunWith
|
|||||||
import java.net.InetAddress
|
import java.net.InetAddress
|
||||||
import java.net.UnknownHostException
|
import java.net.UnknownHostException
|
||||||
import javax.net.ssl.SSLPeerUnverifiedException
|
import javax.net.ssl.SSLPeerUnverifiedException
|
||||||
|
import javax.net.ssl.SSLSocket
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run with "./gradlew :android-test:connectedCheck" and make sure ANDROID_SDK_ROOT is set.
|
* 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<String>()
|
||||||
|
|
||||||
|
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() {
|
private fun enableTls() {
|
||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.sslSocketFactory(
|
.sslSocketFactory(
|
||||||
|
@@ -27,6 +27,7 @@ import javax.annotation.Nullable;
|
|||||||
|
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class RecordingEventListener extends EventListener {
|
public class RecordingEventListener extends EventListener {
|
||||||
final Deque<CallEvent> eventSequence = new ConcurrentLinkedDeque<>();
|
final Deque<CallEvent> eventSequence = new ConcurrentLinkedDeque<>();
|
||||||
@@ -75,7 +76,7 @@ public class RecordingEventListener extends EventListener {
|
|||||||
CallEvent startEvent = e.closes();
|
CallEvent startEvent = e.closes();
|
||||||
|
|
||||||
if (startEvent != null) {
|
if (startEvent != null) {
|
||||||
assertThat(eventSequence).contains(startEvent);
|
assertTrue(eventSequence.contains(startEvent));
|
||||||
}
|
}
|
||||||
|
|
||||||
eventSequence.offer(e);
|
eventSequence.offer(e);
|
Reference in New Issue
Block a user