OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.net; | 5 package org.chromium.net; |
6 | 6 |
7 import android.os.ConditionVariable; | 7 import android.os.ConditionVariable; |
8 import android.test.suitebuilder.annotation.LargeTest; | 8 import android.test.suitebuilder.annotation.LargeTest; |
9 import android.test.suitebuilder.annotation.SmallTest; | 9 import android.test.suitebuilder.annotation.SmallTest; |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 import java.io.IOException; | 22 import java.io.IOException; |
23 import java.util.Date; | 23 import java.util.Date; |
24 import java.util.concurrent.Executors; | 24 import java.util.concurrent.Executors; |
25 | 25 |
26 /** | 26 /** |
27 * Tests making requests using QUIC. | 27 * Tests making requests using QUIC. |
28 */ | 28 */ |
29 public class QuicTest extends CronetTestBase { | 29 public class QuicTest extends CronetTestBase { |
30 private static final String TAG = "cr.QuicTest"; | 30 private static final String TAG = "cr.QuicTest"; |
31 private CronetTestFramework mTestFramework; | 31 private CronetTestFramework mTestFramework; |
32 private CronetEngine.Builder mBuilder; | 32 private ExperimentalCronetEngine.Builder mBuilder; |
33 | 33 |
34 @Override | 34 @Override |
35 protected void setUp() throws Exception { | 35 protected void setUp() throws Exception { |
36 super.setUp(); | 36 super.setUp(); |
37 // Load library first, since we need the Quic test server's URL. | 37 // Load library first, since we need the Quic test server's URL. |
38 System.loadLibrary("cronet_tests"); | 38 System.loadLibrary("cronet_tests"); |
39 QuicTestServer.startQuicTestServer(getContext()); | 39 QuicTestServer.startQuicTestServer(getContext()); |
40 | 40 |
41 mBuilder = new CronetEngine.Builder(getContext()); | 41 mBuilder = new ExperimentalCronetEngine.Builder(getContext()); |
42 mBuilder.enableQuic(true).enableNetworkQualityEstimator(true); | 42 mBuilder.enableNetworkQualityEstimator(true).enableQuic(true); |
43 mBuilder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getS
erverPort(), | 43 mBuilder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getS
erverPort(), |
44 QuicTestServer.getServerPort()); | 44 QuicTestServer.getServerPort()); |
45 | 45 |
46 // TODO(mgersh): Enable connection migration once it works, see http://c
rbug.com/634910 | 46 // TODO(mgersh): Enable connection migration once it works, see http://c
rbug.com/634910 |
47 JSONObject quicParams = new JSONObject() | 47 JSONObject quicParams = new JSONObject() |
48 .put("connection_options", "PACE,IW10,FO
O,DEADBEEF") | 48 .put("connection_options", "PACE,IW10,FO
O,DEADBEEF") |
49 .put("host_whitelist", "test.example.com
") | 49 .put("host_whitelist", "test.example.com
") |
50 .put("max_server_configs_stored_in_prope
rties", 2) | 50 .put("max_server_configs_stored_in_prope
rties", 2) |
51 .put("delay_tcp_race", true) | 51 .put("delay_tcp_race", true) |
52 .put("idle_connection_timeout_seconds",
300) | 52 .put("idle_connection_timeout_seconds",
300) |
53 .put("close_sessions_on_ip_change", fals
e) | 53 .put("close_sessions_on_ip_change", fals
e) |
54 .put("migrate_sessions_on_network_change
", false) | 54 .put("migrate_sessions_on_network_change
", false) |
55 .put("migrate_sessions_early", false) | 55 .put("migrate_sessions_early", false) |
56 .put("race_cert_verification", true); | 56 .put("race_cert_verification", true); |
57 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules
(); | 57 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules
(); |
58 JSONObject experimentalOptions = new JSONObject() | 58 JSONObject experimentalOptions = new JSONObject() |
59 .put("QUIC", quicParams) | 59 .put("QUIC", quicParams) |
60 .put("HostResolverRules", hostR
esolverParams); | 60 .put("HostResolverRules", hostR
esolverParams); |
61 mBuilder.setExperimentalOptions(experimentalOptions.toString()); | 61 mBuilder.setExperimentalOptions(experimentalOptions.toString()); |
62 mBuilder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVeri
fier()); | |
63 mBuilder.setStoragePath(CronetTestFramework.getTestStorage(getContext())
); | 62 mBuilder.setStoragePath(CronetTestFramework.getTestStorage(getContext())
); |
64 mBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1
000 * 1024); | 63 mBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1
000 * 1024); |
| 64 CronetTestUtil.setMockCertVerifierForTesting( |
| 65 mBuilder, QuicTestServer.createMockCertVerifier()); |
65 } | 66 } |
66 | 67 |
67 @Override | 68 @Override |
68 protected void tearDown() throws Exception { | 69 protected void tearDown() throws Exception { |
69 QuicTestServer.shutdownQuicTestServer(); | 70 QuicTestServer.shutdownQuicTestServer(); |
70 super.tearDown(); | 71 super.tearDown(); |
71 } | 72 } |
72 | 73 |
73 @LargeTest | 74 @LargeTest |
74 @Feature({"Cronet"}) | 75 @Feature({"Cronet"}) |
75 @OnlyRunNativeCronet | 76 @OnlyRunNativeCronet |
76 public void testQuicLoadUrl() throws Exception { | 77 public void testQuicLoadUrl() throws Exception { |
77 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, mBuilder); | 78 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, mBuilder); |
78 String quicURL = QuicTestServer.getServerURL() + "/simple.txt"; | 79 String quicURL = QuicTestServer.getServerURL() + "/simple.txt"; |
79 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 80 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
80 | 81 |
81 // Although the native stack races QUIC and SPDY for the first request, | 82 // Although the native stack races QUIC and SPDY for the first request, |
82 // since there is no http server running on the corresponding TCP port, | 83 // since there is no http server running on the corresponding TCP port, |
83 // QUIC will always succeed with a 200 (see | 84 // QUIC will always succeed with a 200 (see |
84 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). | 85 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). |
85 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( | 86 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
86 quicURL, callback, callback.getExecutor(), mTestFramework.mCrone
tEngine); | 87 quicURL, callback, callback.getExecutor()); |
87 requestBuilder.build().start(); | 88 requestBuilder.build().start(); |
88 callback.blockForDone(); | 89 callback.blockForDone(); |
89 | 90 |
90 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 91 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
91 String expectedContent = "This is a simple text file served by QUIC.\n"; | 92 String expectedContent = "This is a simple text file served by QUIC.\n"; |
92 assertEquals(expectedContent, callback.mResponseAsString); | 93 assertEquals(expectedContent, callback.mResponseAsString); |
93 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 94 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); |
94 // The total received bytes should be larger than the content length, to
account for | 95 // The total received bytes should be larger than the content length, to
account for |
95 // headers. | 96 // headers. |
96 assertTrue(callback.mResponseInfo.getReceivedBytesCount() > expectedCont
ent.length()); | 97 assertTrue(callback.mResponseInfo.getReceivedBytesCount() > expectedCont
ent.length()); |
97 // This test takes a long time, since the update will only be scheduled | 98 // This test takes a long time, since the update will only be scheduled |
98 // after kUpdatePrefsDelayMs in http_server_properties_manager.cc. | 99 // after kUpdatePrefsDelayMs in http_server_properties_manager.cc. |
99 while (true) { | 100 while (true) { |
100 Log.i(TAG, "Still waiting for pref file update....."); | 101 Log.i(TAG, "Still waiting for pref file update....."); |
101 Thread.sleep(10000); | 102 Thread.sleep(10000); |
102 boolean contains = false; | 103 boolean contains = false; |
103 try { | 104 try { |
104 if (fileContainsString("local_prefs.json", "quic")) break; | 105 if (fileContainsString("local_prefs.json", "quic")) break; |
105 } catch (FileNotFoundException e) { | 106 } catch (FileNotFoundException e) { |
106 // Ignored this exception since the file will only be created wh
en updates are | 107 // Ignored this exception since the file will only be created wh
en updates are |
107 // flushed to the disk. | 108 // flushed to the disk. |
108 } | 109 } |
109 } | 110 } |
110 assertTrue(fileContainsString("local_prefs.json", | 111 assertTrue(fileContainsString("local_prefs.json", |
111 QuicTestServer.getServerHost() + ":" + QuicTestServer.getServerP
ort())); | 112 QuicTestServer.getServerHost() + ":" + QuicTestServer.getServerP
ort())); |
112 mTestFramework.mCronetEngine.shutdown(); | 113 mTestFramework.mCronetEngine.shutdown(); |
113 | 114 |
114 // Make another request using a new context but with no QUIC hints. | 115 // Make another request using a new context but with no QUIC hints. |
115 CronetEngine.Builder builder = new CronetEngine.Builder(getContext()); | 116 ExperimentalCronetEngine.Builder builder = |
| 117 new ExperimentalCronetEngine.Builder(getContext()); |
116 builder.setStoragePath(CronetTestFramework.getTestStorage(getContext()))
; | 118 builder.setStoragePath(CronetTestFramework.getTestStorage(getContext()))
; |
117 builder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, 1000 * 102
4); | 119 builder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, 1000 * 102
4); |
118 builder.enableQuic(true); | 120 builder.enableQuic(true); |
119 JSONObject quicParams = new JSONObject().put("host_whitelist", "test.exa
mple.com"); | 121 JSONObject quicParams = new JSONObject().put("host_whitelist", "test.exa
mple.com"); |
120 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules
(); | 122 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules
(); |
121 JSONObject experimentalOptions = new JSONObject() | 123 JSONObject experimentalOptions = new JSONObject() |
122 .put("QUIC", quicParams) | 124 .put("QUIC", quicParams) |
123 .put("HostResolverRules", hostR
esolverParams); | 125 .put("HostResolverRules", hostR
esolverParams); |
124 builder.setExperimentalOptions(experimentalOptions.toString()); | 126 builder.setExperimentalOptions(experimentalOptions.toString()); |
125 builder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVerif
ier()); | 127 CronetTestUtil.setMockCertVerifierForTesting( |
| 128 builder, QuicTestServer.createMockCertVerifier()); |
126 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, builder); | 129 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, builder); |
127 TestUrlRequestCallback callback2 = new TestUrlRequestCallback(); | 130 TestUrlRequestCallback callback2 = new TestUrlRequestCallback(); |
128 requestBuilder = new UrlRequest.Builder( | 131 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder( |
129 quicURL, callback2, callback2.getExecutor(), mTestFramework.mCro
netEngine); | 132 quicURL, callback2, callback2.getExecutor()); |
130 requestBuilder.build().start(); | 133 requestBuilder.build().start(); |
131 callback2.blockForDone(); | 134 callback2.blockForDone(); |
132 assertEquals(200, callback2.mResponseInfo.getHttpStatusCode()); | 135 assertEquals(200, callback2.mResponseInfo.getHttpStatusCode()); |
133 assertEquals(expectedContent, callback2.mResponseAsString); | 136 assertEquals(expectedContent, callback2.mResponseAsString); |
134 assertEquals("quic/1+spdy/3", callback2.mResponseInfo.getNegotiatedProto
col()); | 137 assertEquals("quic/1+spdy/3", callback2.mResponseInfo.getNegotiatedProto
col()); |
135 // The total received bytes should be larger than the content length, to
account for | 138 // The total received bytes should be larger than the content length, to
account for |
136 // headers. | 139 // headers. |
137 assertTrue(callback2.mResponseInfo.getReceivedBytesCount() > expectedCon
tent.length()); | 140 assertTrue(callback2.mResponseInfo.getReceivedBytesCount() > expectedCon
tent.length()); |
138 } | 141 } |
139 | 142 |
(...skipping 27 matching lines...) Expand all Loading... |
167 mTestFramework.mCronetEngine.addRttListener(rttListener); | 170 mTestFramework.mCronetEngine.addRttListener(rttListener); |
168 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); | 171 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); |
169 | 172 |
170 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); | 173 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); |
171 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 174 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
172 | 175 |
173 // Although the native stack races QUIC and SPDY for the first request, | 176 // Although the native stack races QUIC and SPDY for the first request, |
174 // since there is no http server running on the corresponding TCP port, | 177 // since there is no http server running on the corresponding TCP port, |
175 // QUIC will always succeed with a 200 (see | 178 // QUIC will always succeed with a 200 (see |
176 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). | 179 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). |
177 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( | 180 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
178 quicURL, callback, callback.getExecutor(), mTestFramework.mCrone
tEngine); | 181 quicURL, callback, callback.getExecutor()); |
179 requestBuilder.build().start(); | 182 requestBuilder.build().start(); |
180 callback.blockForDone(); | 183 callback.blockForDone(); |
181 | 184 |
182 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 185 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
183 String expectedContent = "This is a simple text file served by QUIC.\n"; | 186 String expectedContent = "This is a simple text file served by QUIC.\n"; |
184 assertEquals(expectedContent, callback.mResponseAsString); | 187 assertEquals(expectedContent, callback.mResponseAsString); |
185 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 188 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); |
186 | 189 |
187 // Throughput observation is posted to the network quality estimator on
the network thread | 190 // Throughput observation is posted to the network quality estimator on
the network thread |
188 // after the UrlRequest is completed. The observations are then eventual
ly posted to | 191 // after the UrlRequest is completed. The observations are then eventual
ly posted to |
(...skipping 21 matching lines...) Expand all Loading... |
210 @OnlyRunNativeCronet | 213 @OnlyRunNativeCronet |
211 @Feature({"Cronet"}) | 214 @Feature({"Cronet"}) |
212 public void testMetricsWithQuic() throws Exception { | 215 public void testMetricsWithQuic() throws Exception { |
213 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, mBuilder); | 216 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n
ull, mBuilder); |
214 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | 217 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); |
215 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | 218 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); |
216 | 219 |
217 String quicURL = QuicTestServer.getServerURL() + "/simple.txt"; | 220 String quicURL = QuicTestServer.getServerURL() + "/simple.txt"; |
218 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 221 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
219 | 222 |
220 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( | 223 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR
equestBuilder( |
221 quicURL, callback, callback.getExecutor(), mTestFramework.mCrone
tEngine); | 224 quicURL, callback, callback.getExecutor()); |
222 Date startTime = new Date(); | 225 Date startTime = new Date(); |
223 requestBuilder.build().start(); | 226 requestBuilder.build().start(); |
224 callback.blockForDone(); | 227 callback.blockForDone(); |
225 requestFinishedListener.blockUntilDone(); | 228 requestFinishedListener.blockUntilDone(); |
226 Date endTime = new Date(); | 229 Date endTime = new Date(); |
227 | 230 |
228 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 231 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
229 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 232 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); |
230 | 233 |
231 RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo
(); | 234 RequestFinishedInfo requestInfo = requestFinishedListener.getRequestInfo
(); |
232 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); | 235 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); |
233 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); | 236 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); |
234 MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTim
e, endTime, true); | 237 MetricsTestUtil.checkHasConnectTiming(requestInfo.getMetrics(), startTim
e, endTime, true); |
235 | 238 |
236 // Second request should use the same connection and not have ConnectTim
ing numbers | 239 // Second request should use the same connection and not have ConnectTim
ing numbers |
237 callback = new TestUrlRequestCallback(); | 240 callback = new TestUrlRequestCallback(); |
238 requestFinishedListener.reset(); | 241 requestFinishedListener.reset(); |
239 requestBuilder = new UrlRequest.Builder( | 242 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder( |
240 quicURL, callback, callback.getExecutor(), mTestFramework.mCrone
tEngine); | 243 quicURL, callback, callback.getExecutor()); |
241 startTime = new Date(); | 244 startTime = new Date(); |
242 requestBuilder.build().start(); | 245 requestBuilder.build().start(); |
243 callback.blockForDone(); | 246 callback.blockForDone(); |
244 requestFinishedListener.blockUntilDone(); | 247 requestFinishedListener.blockUntilDone(); |
245 endTime = new Date(); | 248 endTime = new Date(); |
246 | 249 |
247 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 250 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
248 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); | 251 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc
ol()); |
249 | 252 |
250 requestInfo = requestFinishedListener.getRequestInfo(); | 253 requestInfo = requestFinishedListener.getRequestInfo(); |
251 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); | 254 MetricsTestUtil.checkRequestFinishedInfo(requestInfo, quicURL, startTime
, endTime); |
252 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); | 255 assertEquals(RequestFinishedInfo.SUCCEEDED, requestInfo.getFinishedReaso
n()); |
253 MetricsTestUtil.checkNoConnectTiming(requestInfo.getMetrics()); | 256 MetricsTestUtil.checkNoConnectTiming(requestInfo.getMetrics()); |
254 | 257 |
255 mTestFramework.mCronetEngine.shutdown(); | 258 mTestFramework.mCronetEngine.shutdown(); |
256 } | 259 } |
257 } | 260 } |
OLD | NEW |