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

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

Issue 2339223002: Cronet API Refactoring (Closed)
Patch Set: Javadoc + rebase Created 4 years, 3 months 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;
10 9
11 import org.chromium.base.Log; 10 import org.chromium.base.Log;
12 import org.chromium.base.annotations.SuppressFBWarnings; 11 import org.chromium.base.annotations.SuppressFBWarnings;
13 import org.chromium.base.test.util.Feature; 12 import org.chromium.base.test.util.Feature;
14 import org.chromium.net.CronetTestBase.OnlyRunNativeCronet;
15 import org.json.JSONObject; 13 import org.json.JSONObject;
16 14
17 import java.io.File; 15 import java.io.File;
18 import java.io.FileInputStream; 16 import java.io.FileInputStream;
19 import java.io.FileNotFoundException; 17 import java.io.FileNotFoundException;
20 import java.io.IOException; 18 import java.io.IOException;
21 import java.util.HashMap;
22 import java.util.concurrent.Executors; 19 import java.util.concurrent.Executors;
23 20
24 /** 21 /**
25 * Tests making requests using QUIC. 22 * Tests making requests using QUIC.
26 */ 23 */
27 public class QuicTest extends CronetTestBase { 24 public class QuicTest extends CronetTestBase {
28 private static final String TAG = "cr.QuicTest"; 25 private static final String TAG = "cr.QuicTest";
29 private CronetTestFramework mTestFramework; 26 private CronetTestFramework mTestFramework;
30 private CronetEngine.Builder mBuilder; 27 private ExperimentalCronetEngine.Builder mBuilder;
31 28
32 @Override 29 @Override
33 protected void setUp() throws Exception { 30 protected void setUp() throws Exception {
34 super.setUp(); 31 super.setUp();
35 // Load library first, since we need the Quic test server's URL. 32 // Load library first, since we need the Quic test server's URL.
36 System.loadLibrary("cronet_tests"); 33 System.loadLibrary("cronet_tests");
37 QuicTestServer.startQuicTestServer(getContext()); 34 QuicTestServer.startQuicTestServer(getContext());
38 35
39 mBuilder = new CronetEngine.Builder(getContext()); 36 mBuilder = new ExperimentalCronetEngine.Builder(getContext());
40 mBuilder.enableQuic(true).enableNetworkQualityEstimator(true); 37 mBuilder.enableNetworkQualityEstimator(true).enableQuic(true);
41 mBuilder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getS erverPort(), 38 mBuilder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getS erverPort(),
42 QuicTestServer.getServerPort()); 39 QuicTestServer.getServerPort());
43 40
44 // TODO(mgersh): Enable connection migration once it works, see http://c rbug.com/634910 41 // TODO(mgersh): Enable connection migration once it works, see http://c rbug.com/634910
45 JSONObject quicParams = new JSONObject() 42 JSONObject quicParams = new JSONObject()
46 .put("connection_options", "PACE,IW10,FO O,DEADBEEF") 43 .put("connection_options", "PACE,IW10,FO O,DEADBEEF")
47 .put("host_whitelist", "test.example.com ") 44 .put("host_whitelist", "test.example.com ")
48 .put("max_server_configs_stored_in_prope rties", 2) 45 .put("max_server_configs_stored_in_prope rties", 2)
49 .put("delay_tcp_race", true) 46 .put("delay_tcp_race", true)
50 .put("idle_connection_timeout_seconds", 300) 47 .put("idle_connection_timeout_seconds", 300)
51 .put("close_sessions_on_ip_change", fals e) 48 .put("close_sessions_on_ip_change", fals e)
52 .put("migrate_sessions_on_network_change ", false) 49 .put("migrate_sessions_on_network_change ", false)
53 .put("migrate_sessions_early", false) 50 .put("migrate_sessions_early", false)
54 .put("race_cert_verification", true); 51 .put("race_cert_verification", true);
55 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules (); 52 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules ();
56 JSONObject experimentalOptions = new JSONObject() 53 JSONObject experimentalOptions = new JSONObject()
57 .put("QUIC", quicParams) 54 .put("QUIC", quicParams)
58 .put("HostResolverRules", hostR esolverParams); 55 .put("HostResolverRules", hostR esolverParams);
59 mBuilder.setExperimentalOptions(experimentalOptions.toString()); 56 mBuilder.setExperimentalOptions(experimentalOptions.toString());
60 mBuilder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVeri fier());
61 mBuilder.setStoragePath(CronetTestFramework.getTestStorage(getContext()) ); 57 mBuilder.setStoragePath(CronetTestFramework.getTestStorage(getContext()) );
62 mBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1 000 * 1024); 58 mBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1 000 * 1024);
59 CronetTestUtil.setMockCertVerifierForTesting(
60 mBuilder, QuicTestServer.createMockCertVerifier());
63 } 61 }
64 62
65 @Override 63 @Override
66 protected void tearDown() throws Exception { 64 protected void tearDown() throws Exception {
67 QuicTestServer.shutdownQuicTestServer(); 65 QuicTestServer.shutdownQuicTestServer();
68 super.tearDown(); 66 super.tearDown();
69 } 67 }
70 68
71 @SmallTest
72 @Feature({"Cronet"})
73 @SuppressWarnings("deprecation")
74 @OnlyRunNativeCronet
75 public void testQuicLoadUrl_LegacyAPI() throws Exception {
76 String[] commandLineArgs = {
77 CronetTestFramework.LIBRARY_INIT_KEY, CronetTestFramework.Librar yInitType.LEGACY};
78 mTestFramework = new CronetTestFramework(null, commandLineArgs, getConte xt(), mBuilder);
79 String quicURL = QuicTestServer.getServerURL() + "/simple.txt";
80
81 HashMap<String, String> headers = new HashMap<String, String>();
82 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
83
84 // Although the native stack races QUIC and SPDY for the first request,
85 // since there is no http server running on the corresponding TCP port,
86 // QUIC will always succeed with a 200 (see
87 // net::HttpStreamFactoryImpl::Request::OnStreamFailed).
88 HttpUrlRequest request = mTestFramework.mRequestFactory.createRequest(
89 quicURL, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listen er);
90 request.start();
91 listener.blockForComplete();
92 assertEquals(200, listener.mHttpStatusCode);
93 assertEquals(
94 "This is a simple text file served by QUIC.\n",
95 listener.mResponseAsString);
96 assertEquals("quic/1+spdy/3", listener.mNegotiatedProtocol);
97 }
98
99 @LargeTest 69 @LargeTest
100 @Feature({"Cronet"}) 70 @Feature({"Cronet"})
101 @OnlyRunNativeCronet 71 @OnlyRunNativeCronet
102 public void testQuicLoadUrl() throws Exception { 72 public void testQuicLoadUrl() throws Exception {
103 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, mBuilder); 73 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, mBuilder);
104 String quicURL = QuicTestServer.getServerURL() + "/simple.txt"; 74 String quicURL = QuicTestServer.getServerURL() + "/simple.txt";
105 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 75 TestUrlRequestCallback callback = new TestUrlRequestCallback();
106 76
107 // Although the native stack races QUIC and SPDY for the first request, 77 // Although the native stack races QUIC and SPDY for the first request,
108 // since there is no http server running on the corresponding TCP port, 78 // since there is no http server running on the corresponding TCP port,
109 // QUIC will always succeed with a 200 (see 79 // QUIC will always succeed with a 200 (see
110 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). 80 // net::HttpStreamFactoryImpl::Request::OnStreamFailed).
111 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( 81 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR equestBuilder(
112 quicURL, callback, callback.getExecutor(), mTestFramework.mCrone tEngine); 82 quicURL, callback, callback.getExecutor());
113 requestBuilder.build().start(); 83 requestBuilder.build().start();
114 callback.blockForDone(); 84 callback.blockForDone();
115 85
116 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 86 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
117 String expectedContent = "This is a simple text file served by QUIC.\n"; 87 String expectedContent = "This is a simple text file served by QUIC.\n";
118 assertEquals(expectedContent, callback.mResponseAsString); 88 assertEquals(expectedContent, callback.mResponseAsString);
119 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc ol()); 89 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc ol());
120 // The total received bytes should be larger than the content length, to account for 90 // The total received bytes should be larger than the content length, to account for
121 // headers. 91 // headers.
122 assertTrue(callback.mResponseInfo.getReceivedBytesCount() > expectedCont ent.length()); 92 assertTrue(callback.mResponseInfo.getReceivedBytesCount() > expectedCont ent.length());
123 // This test takes a long time, since the update will only be scheduled 93 // This test takes a long time, since the update will only be scheduled
124 // after kUpdatePrefsDelayMs in http_server_properties_manager.cc. 94 // after kUpdatePrefsDelayMs in http_server_properties_manager.cc.
125 while (true) { 95 while (true) {
126 Log.i(TAG, "Still waiting for pref file update....."); 96 Log.i(TAG, "Still waiting for pref file update.....");
127 Thread.sleep(10000); 97 Thread.sleep(10000);
128 boolean contains = false; 98 boolean contains = false;
129 try { 99 try {
130 if (fileContainsString("local_prefs.json", "quic")) break; 100 if (fileContainsString("local_prefs.json", "quic")) break;
131 } catch (FileNotFoundException e) { 101 } catch (FileNotFoundException e) {
132 // Ignored this exception since the file will only be created wh en updates are 102 // Ignored this exception since the file will only be created wh en updates are
133 // flushed to the disk. 103 // flushed to the disk.
134 } 104 }
135 } 105 }
136 assertTrue(fileContainsString("local_prefs.json", 106 assertTrue(fileContainsString("local_prefs.json",
137 QuicTestServer.getServerHost() + ":" + QuicTestServer.getServerP ort())); 107 QuicTestServer.getServerHost() + ":" + QuicTestServer.getServerP ort()));
138 mTestFramework.mCronetEngine.shutdown(); 108 mTestFramework.mCronetEngine.shutdown();
139 109
140 // Make another request using a new context but with no QUIC hints. 110 // Make another request using a new context but with no QUIC hints.
141 CronetEngine.Builder builder = new CronetEngine.Builder(getContext()); 111 ExperimentalCronetEngine.Builder builder =
112 new ExperimentalCronetEngine.Builder(getContext());
142 builder.setStoragePath(CronetTestFramework.getTestStorage(getContext())) ; 113 builder.setStoragePath(CronetTestFramework.getTestStorage(getContext())) ;
143 builder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, 1000 * 102 4); 114 builder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, 1000 * 102 4);
144 builder.enableQuic(true); 115 builder.enableQuic(true);
145 JSONObject quicParams = new JSONObject().put("host_whitelist", "test.exa mple.com"); 116 JSONObject quicParams = new JSONObject().put("host_whitelist", "test.exa mple.com");
146 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules (); 117 JSONObject hostResolverParams = CronetTestUtil.generateHostResolverRules ();
147 JSONObject experimentalOptions = new JSONObject() 118 JSONObject experimentalOptions = new JSONObject()
148 .put("QUIC", quicParams) 119 .put("QUIC", quicParams)
149 .put("HostResolverRules", hostR esolverParams); 120 .put("HostResolverRules", hostR esolverParams);
150 builder.setExperimentalOptions(experimentalOptions.toString()); 121 builder.setExperimentalOptions(experimentalOptions.toString());
151 builder.setMockCertVerifierForTesting(QuicTestServer.createMockCertVerif ier()); 122 CronetTestUtil.setMockCertVerifierForTesting(
123 builder, QuicTestServer.createMockCertVerifier());
152 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, builder); 124 mTestFramework = startCronetTestFrameworkWithUrlAndCronetEngineBuilder(n ull, builder);
153 TestUrlRequestCallback callback2 = new TestUrlRequestCallback(); 125 TestUrlRequestCallback callback2 = new TestUrlRequestCallback();
154 requestBuilder = new UrlRequest.Builder( 126 requestBuilder = mTestFramework.mCronetEngine.newUrlRequestBuilder(
155 quicURL, callback2, callback2.getExecutor(), mTestFramework.mCro netEngine); 127 quicURL, callback2, callback2.getExecutor());
156 requestBuilder.build().start(); 128 requestBuilder.build().start();
157 callback2.blockForDone(); 129 callback2.blockForDone();
158 assertEquals(200, callback2.mResponseInfo.getHttpStatusCode()); 130 assertEquals(200, callback2.mResponseInfo.getHttpStatusCode());
159 assertEquals(expectedContent, callback2.mResponseAsString); 131 assertEquals(expectedContent, callback2.mResponseAsString);
160 assertEquals("quic/1+spdy/3", callback2.mResponseInfo.getNegotiatedProto col()); 132 assertEquals("quic/1+spdy/3", callback2.mResponseInfo.getNegotiatedProto col());
161 // The total received bytes should be larger than the content length, to account for 133 // The total received bytes should be larger than the content length, to account for
162 // headers. 134 // headers.
163 assertTrue(callback2.mResponseInfo.getReceivedBytesCount() > expectedCon tent.length()); 135 assertTrue(callback2.mResponseInfo.getReceivedBytesCount() > expectedCon tent.length());
164 } 136 }
165 137
(...skipping 27 matching lines...) Expand all
193 mTestFramework.mCronetEngine.addRttListener(rttListener); 165 mTestFramework.mCronetEngine.addRttListener(rttListener);
194 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); 166 mTestFramework.mCronetEngine.addThroughputListener(throughputListener);
195 167
196 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting( true, true); 168 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting( true, true);
197 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 169 TestUrlRequestCallback callback = new TestUrlRequestCallback();
198 170
199 // Although the native stack races QUIC and SPDY for the first request, 171 // Although the native stack races QUIC and SPDY for the first request,
200 // since there is no http server running on the corresponding TCP port, 172 // since there is no http server running on the corresponding TCP port,
201 // QUIC will always succeed with a 200 (see 173 // QUIC will always succeed with a 200 (see
202 // net::HttpStreamFactoryImpl::Request::OnStreamFailed). 174 // net::HttpStreamFactoryImpl::Request::OnStreamFailed).
203 UrlRequest.Builder requestBuilder = new UrlRequest.Builder( 175 UrlRequest.Builder requestBuilder = mTestFramework.mCronetEngine.newUrlR equestBuilder(
204 quicURL, callback, callback.getExecutor(), mTestFramework.mCrone tEngine); 176 quicURL, callback, callback.getExecutor());
205 requestBuilder.build().start(); 177 requestBuilder.build().start();
206 callback.blockForDone(); 178 callback.blockForDone();
207 179
208 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 180 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
209 String expectedContent = "This is a simple text file served by QUIC.\n"; 181 String expectedContent = "This is a simple text file served by QUIC.\n";
210 assertEquals(expectedContent, callback.mResponseAsString); 182 assertEquals(expectedContent, callback.mResponseAsString);
211 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc ol()); 183 assertEquals("quic/1+spdy/3", callback.mResponseInfo.getNegotiatedProtoc ol());
212 184
213 // Throughput observation is posted to the network quality estimator on the network thread 185 // Throughput observation is posted to the network quality estimator on the network thread
214 // after the UrlRequest is completed. The observations are then eventual ly posted to 186 // after the UrlRequest is completed. The observations are then eventual ly posted to
(...skipping 10 matching lines...) Expand all
225 assertTrue(rttListener.rttObservationCount(2) > 0); 197 assertTrue(rttListener.rttObservationCount(2) > 0);
226 198
227 // Verify that effective connection type callback is received and 199 // Verify that effective connection type callback is received and
228 // effective connection type is correctly set. 200 // effective connection type is correctly set.
229 assertTrue(mTestFramework.mCronetEngine.getEffectiveConnectionType() 201 assertTrue(mTestFramework.mCronetEngine.getEffectiveConnectionType()
230 != EffectiveConnectionType.TYPE_UNKNOWN); 202 != EffectiveConnectionType.TYPE_UNKNOWN);
231 203
232 mTestFramework.mCronetEngine.shutdown(); 204 mTestFramework.mCronetEngine.shutdown();
233 } 205 }
234 } 206 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698