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; | |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |