Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(34)

Side by Side Diff: components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java

Issue 2339223002: Cronet API Refactoring (Closed)
Patch Set: Rebase & Conflict Resolution Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698