@@ -18,21 +18,29 @@ package okhttp.android.test
18
18
import android.os.Build
19
19
import android.support.test.runner.AndroidJUnit4
20
20
import okhttp3.Call
21
+ import okhttp3.CertificatePinner
21
22
import okhttp3.Connection
22
23
import okhttp3.EventListener
23
24
import okhttp3.OkHttpClient
24
25
import okhttp3.Protocol
25
26
import okhttp3.Request
26
27
import okhttp3.TlsVersion
28
+ import okhttp3.mockwebserver.MockResponse
29
+ import okhttp3.mockwebserver.MockWebServer
30
+ import okhttp3.tls.internal.TlsUtil.localhost
27
31
import org.junit.After
28
32
import org.junit.Assert.assertEquals
33
+ import org.junit.Assert.assertTrue
29
34
import org.junit.Assert.fail
30
- import org.junit.Assume
35
+ import org.junit.Assume.assumeNoException
36
+ import org.junit.Assume.assumeTrue
31
37
import org.junit.Before
38
+ import org.junit.Rule
32
39
import org.junit.Test
33
40
import org.junit.runner.RunWith
34
41
import java.net.InetAddress
35
42
import java.net.UnknownHostException
43
+ import javax.net.ssl.SSLPeerUnverifiedException
36
44
37
45
/* *
38
46
* Run with "./gradlew :android-test:connectedCheck" and make sure ANDROID_SDK_ROOT is set.
@@ -41,6 +49,11 @@ import java.net.UnknownHostException
41
49
class OkHttpTest {
42
50
private lateinit var client: OkHttpClient
43
51
52
+ @JvmField
53
+ @Rule
54
+ val server = MockWebServer ()
55
+ private val handshakeCertificates = localhost()
56
+
44
57
@Before
45
58
fun createClient () {
46
59
client = OkHttpClient .Builder ()
@@ -91,13 +104,26 @@ class OkHttpTest {
91
104
assertEquals(TlsVersion .TLS_1_2 , response.handshake?.tlsVersion)
92
105
}
93
106
assertEquals(200 , response.code)
94
- assertEquals(" com.android.org.conscrypt.Java8FileDescriptorSocket" , socketClass)
107
+ assertTrue(socketClass?.startsWith(" com.android.org.conscrypt." ) == true )
108
+ }
109
+ }
110
+
111
+ @Test
112
+ fun testHttpRequestNotBlockedOnLegacyAndroid () {
113
+ assumeTrue(Build .VERSION .SDK_INT < 23 )
114
+
115
+ val request = Request .Builder ().url(" http://squareup.com/robots.txt" ).build()
116
+
117
+ val response = client.newCall(request).execute()
118
+
119
+ response.use {
120
+ assertEquals(200 , response.code)
95
121
}
96
122
}
97
123
98
124
@Test
99
125
fun testHttpRequestBlocked () {
100
- Assume . assumeTrue(Build .VERSION .SDK_INT >= 23 )
126
+ assumeTrue(Build .VERSION .SDK_INT >= 23 )
101
127
102
128
val request = Request .Builder ().url(" http://api.twitter.com/robots.txt" ).build()
103
129
@@ -108,11 +134,75 @@ class OkHttpTest {
108
134
}
109
135
}
110
136
137
+ @Test
138
+ fun testMockWebserverRequest () {
139
+ enableTls()
140
+
141
+ server.enqueue(MockResponse ().setBody(" abc" ))
142
+
143
+ val request = Request .Builder ().url(server.url(" /" )).build()
144
+
145
+ val response = client.newCall(request).execute()
146
+
147
+ response.use {
148
+ assertEquals(200 , response.code)
149
+ }
150
+ }
151
+
152
+ @Test
153
+ fun testCertificatePinningFailure () {
154
+ enableTls()
155
+
156
+ val certificatePinner = CertificatePinner .Builder ()
157
+ .add(server.hostName, " sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" )
158
+ .build()
159
+ client = client.newBuilder().certificatePinner(certificatePinner).build()
160
+
161
+ server.enqueue(MockResponse ().setBody(" abc" ))
162
+
163
+ val request = Request .Builder ().url(server.url(" /" )).build()
164
+
165
+ try {
166
+ client.newCall(request).execute()
167
+ fail()
168
+ } catch (_: SSLPeerUnverifiedException ) {
169
+ }
170
+ }
171
+
172
+ @Test
173
+ fun testCertificatePinningSuccess () {
174
+ enableTls()
175
+
176
+ val certificatePinner = CertificatePinner .Builder ()
177
+ .add(server.hostName,
178
+ CertificatePinner .pin(handshakeCertificates.trustManager.acceptedIssuers[0 ]))
179
+ .build()
180
+ client = client.newBuilder().certificatePinner(certificatePinner).build()
181
+
182
+ server.enqueue(MockResponse ().setBody(" abc" ))
183
+
184
+ val request = Request .Builder ().url(server.url(" /" )).build()
185
+
186
+ val response = client.newCall(request).execute()
187
+
188
+ response.use {
189
+ assertEquals(200 , response.code)
190
+ }
191
+ }
192
+
193
+ private fun enableTls () {
194
+ client = client.newBuilder()
195
+ .sslSocketFactory(
196
+ handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager)
197
+ .build()
198
+ server.useHttps(handshakeCertificates.sslSocketFactory(), false )
199
+ }
200
+
111
201
private fun assumeNetwork () {
112
202
try {
113
203
InetAddress .getByName(" www.google.com" )
114
204
} catch (uhe: UnknownHostException ) {
115
- Assume . assumeNoException(uhe)
205
+ assumeNoException(uhe)
116
206
}
117
207
}
118
208
}
0 commit comments