| 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 |