OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 static org.chromium.base.CollectionUtil.newHashSet; | 7 import static org.chromium.base.CollectionUtil.newHashSet; |
8 | 8 |
9 import android.content.Context; | 9 import android.content.Context; |
10 import android.content.ContextWrapper; | 10 import android.content.ContextWrapper; |
11 import android.os.ConditionVariable; | 11 import android.os.ConditionVariable; |
12 import android.os.Handler; | 12 import android.os.Handler; |
13 import android.os.Looper; | 13 import android.os.Looper; |
| 14 import android.os.StrictMode; |
14 import android.test.suitebuilder.annotation.SmallTest; | 15 import android.test.suitebuilder.annotation.SmallTest; |
15 | 16 |
16 import org.chromium.base.PathUtils; | 17 import org.chromium.base.PathUtils; |
17 import org.chromium.base.annotations.JNINamespace; | 18 import org.chromium.base.annotations.JNINamespace; |
18 import org.chromium.base.test.util.Feature; | 19 import org.chromium.base.test.util.Feature; |
19 import org.chromium.base.test.util.FlakyTest; | 20 import org.chromium.base.test.util.FlakyTest; |
20 import org.chromium.net.CronetEngine.UrlRequestInfo; | 21 import org.chromium.net.CronetEngine.UrlRequestInfo; |
21 import org.chromium.net.TestUrlRequestCallback.ResponseStep; | 22 import org.chromium.net.TestUrlRequestCallback.ResponseStep; |
22 import org.chromium.net.test.EmbeddedTestServer; | 23 import org.chromium.net.test.EmbeddedTestServer; |
23 | 24 |
24 import java.io.BufferedReader; | 25 import java.io.BufferedReader; |
25 import java.io.File; | 26 import java.io.File; |
26 import java.io.FileReader; | 27 import java.io.FileReader; |
27 import java.util.Arrays; | 28 import java.util.Arrays; |
28 import java.util.HashSet; | 29 import java.util.HashSet; |
29 import java.util.LinkedList; | 30 import java.util.LinkedList; |
30 import java.util.NoSuchElementException; | 31 import java.util.NoSuchElementException; |
31 import java.util.concurrent.Executor; | 32 import java.util.concurrent.Executor; |
32 import java.util.concurrent.Executors; | 33 import java.util.concurrent.Executors; |
| 34 import java.util.concurrent.ThreadFactory; |
33 | 35 |
34 /** | 36 /** |
35 * Test CronetEngine. | 37 * Test CronetEngine. |
36 */ | 38 */ |
37 @JNINamespace("cronet") | 39 @JNINamespace("cronet") |
38 public class CronetUrlRequestContextTest extends CronetTestBase { | 40 public class CronetUrlRequestContextTest extends CronetTestBase { |
39 // URLs used for tests. | 41 // URLs used for tests. |
40 private static final String MOCK_CRONET_TEST_FAILED_URL = | 42 private static final String MOCK_CRONET_TEST_FAILED_URL = |
41 "http://mock.failed.request/-2"; | 43 "http://mock.failed.request/-2"; |
42 private static final String MOCK_CRONET_TEST_SUCCESS_URL = | 44 private static final String MOCK_CRONET_TEST_SUCCESS_URL = |
43 "http://mock.http/success.txt"; | 45 "http://mock.http/success.txt"; |
44 | 46 |
45 private EmbeddedTestServer mTestServer; | 47 private EmbeddedTestServer mTestServer; |
46 private String mUrl; | 48 private String mUrl; |
47 private String mUrl404; | 49 private String mUrl404; |
48 private String mUrl500; | 50 private String mUrl500; |
49 CronetTestFramework mTestFramework; | 51 CronetTestFramework mTestFramework; |
50 | 52 |
| 53 // Thread on which network quality listeners should be notified. |
| 54 private Thread mNetworkQualityThread; |
| 55 |
51 @Override | 56 @Override |
52 protected void setUp() throws Exception { | 57 protected void setUp() throws Exception { |
53 super.setUp(); | 58 super.setUp(); |
54 mTestServer = EmbeddedTestServer.createAndStartDefaultServer(getContext(
)); | 59 mTestServer = EmbeddedTestServer.createAndStartDefaultServer(getContext(
)); |
55 mUrl = mTestServer.getURL("/echo?status=200"); | 60 mUrl = mTestServer.getURL("/echo?status=200"); |
56 mUrl404 = mTestServer.getURL("/echo?status=404"); | 61 mUrl404 = mTestServer.getURL("/echo?status=404"); |
57 mUrl500 = mTestServer.getURL("/echo?status=500"); | 62 mUrl500 = mTestServer.getURL("/echo?status=500"); |
58 } | 63 } |
59 | 64 |
60 @Override | 65 @Override |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 public void runAllTasks() { | 123 public void runAllTasks() { |
119 try { | 124 try { |
120 while (mTaskQueue.size() > 0) { | 125 while (mTaskQueue.size() > 0) { |
121 mTaskQueue.remove().run(); | 126 mTaskQueue.remove().run(); |
122 } | 127 } |
123 } catch (NoSuchElementException e) { | 128 } catch (NoSuchElementException e) { |
124 } | 129 } |
125 } | 130 } |
126 } | 131 } |
127 | 132 |
128 static class TestNetworkQualityListener | 133 private class ExecutorThreadFactory implements ThreadFactory { |
129 implements NetworkQualityRttListener, NetworkQualityThroughputListen
er { | 134 public Thread newThread(final Runnable r) { |
130 // Lock to ensure that observation counts can be updated and read by dif
ferent threads. | 135 mNetworkQualityThread = new Thread(new Runnable() { |
131 private final Object mLock = new Object(); | 136 @Override |
132 private final ConditionVariable mWaitForThroughput; | 137 public void run() { |
133 private int mRttObservationCount; | 138 StrictMode.ThreadPolicy threadPolicy = StrictMode.getThreadP
olicy(); |
134 private int mThroughputObservationCount; | 139 try { |
135 | 140 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.B
uilder() |
136 TestNetworkQualityListener(ConditionVariable waitForThroughput) { | 141 .detectNetwork() |
137 mWaitForThroughput = waitForThroughput; | 142 .penaltyLog() |
138 } | 143 .penaltyDeath() |
139 | 144 .build()); |
140 @Override | 145 r.run(); |
141 public void onRttObservation(int rttMs, long when, int source) { | 146 } finally { |
142 synchronized (mLock) { | 147 StrictMode.setThreadPolicy(threadPolicy); |
143 mRttObservationCount++; | 148 } |
144 } | |
145 } | |
146 | |
147 @Override | |
148 public void onThroughputObservation(int throughputKbps, long when, int s
ource) { | |
149 synchronized (mLock) { | |
150 if (mWaitForThroughput != null) { | |
151 mWaitForThroughput.open(); | |
152 } | 149 } |
153 mThroughputObservationCount++; | 150 }); |
154 } | 151 return mNetworkQualityThread; |
155 } | |
156 | |
157 public int rttObservationCount() { | |
158 synchronized (mLock) { | |
159 return mRttObservationCount; | |
160 } | |
161 } | |
162 | |
163 public int throughputObservationCount() { | |
164 synchronized (mLock) { | |
165 return mThroughputObservationCount; | |
166 } | |
167 } | 152 } |
168 } | 153 } |
169 | 154 |
170 @SmallTest | 155 @SmallTest |
171 @Feature({"Cronet"}) | 156 @Feature({"Cronet"}) |
172 public void testConfigUserAgent() throws Exception { | 157 public void testConfigUserAgent() throws Exception { |
173 String userAgentName = "User-Agent"; | 158 String userAgentName = "User-Agent"; |
174 String userAgentValue = "User-Agent-Value"; | 159 String userAgentValue = "User-Agent-Value"; |
175 CronetEngine.Builder cronetEngineBuilder = new CronetEngine.Builder(getC
ontext()); | 160 CronetEngine.Builder cronetEngineBuilder = new CronetEngine.Builder(getC
ontext()); |
176 if (testingJavaImpl()) { | 161 if (testingJavaImpl()) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 // Proxy logic configured to use the test server as its proxy. | 218 // Proxy logic configured to use the test server as its proxy. |
234 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 219 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
235 assertEquals(serverHostPort, callback.mResponseInfo.getProxyServer()); | 220 assertEquals(serverHostPort, callback.mResponseInfo.getProxyServer()); |
236 assertEquals("http://DomainThatDoesnt.Resolve/datareductionproxysuccess.
txt", | 221 assertEquals("http://DomainThatDoesnt.Resolve/datareductionproxysuccess.
txt", |
237 callback.mResponseInfo.getUrl()); | 222 callback.mResponseInfo.getUrl()); |
238 } | 223 } |
239 | 224 |
240 @SmallTest | 225 @SmallTest |
241 @Feature({"Cronet"}) | 226 @Feature({"Cronet"}) |
242 public void testRealTimeNetworkQualityObservationsNotEnabled() throws Except
ion { | 227 public void testRealTimeNetworkQualityObservationsNotEnabled() throws Except
ion { |
243 mTestFramework = startCronetTestFramework(); | 228 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); |
244 TestNetworkQualityListener networkQualityListener = new TestNetworkQuali
tyListener(null); | 229 mTestFramework = |
| 230 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); |
| 231 Executor networkQualityExecutor = Executors.newSingleThreadExecutor(); |
| 232 TestNetworkQualityRttListener rttListener = |
| 233 new TestNetworkQualityRttListener(networkQualityExecutor); |
| 234 TestNetworkQualityThroughputListener throughputListener = |
| 235 new TestNetworkQualityThroughputListener(networkQualityExecutor,
null); |
245 try { | 236 try { |
246 mTestFramework.mCronetEngine.addRttListener(networkQualityListener); | 237 mTestFramework.mCronetEngine.addRttListener(rttListener); |
247 fail("Should throw an exception."); | 238 fail("Should throw an exception."); |
248 } catch (IllegalStateException e) { | 239 } catch (IllegalStateException e) { |
249 } | 240 } |
250 try { | 241 try { |
251 mTestFramework.mCronetEngine.addThroughputListener(networkQualityLis
tener); | 242 mTestFramework.mCronetEngine.addThroughputListener(throughputListene
r); |
252 fail("Should throw an exception."); | 243 fail("Should throw an exception."); |
253 } catch (IllegalStateException e) { | 244 } catch (IllegalStateException e) { |
254 } | 245 } |
255 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 246 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
256 UrlRequest urlRequest = | 247 UrlRequest urlRequest = |
257 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); | 248 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); |
258 urlRequest.start(); | 249 urlRequest.start(); |
259 callback.blockForDone(); | 250 callback.blockForDone(); |
260 assertEquals(0, networkQualityListener.rttObservationCount()); | 251 assertEquals(0, rttListener.rttObservationCount()); |
261 assertEquals(0, networkQualityListener.throughputObservationCount()); | 252 assertEquals(0, throughputListener.throughputObservationCount()); |
| 253 mTestFramework.mCronetEngine.shutdown(); |
| 254 } |
| 255 |
| 256 @SmallTest |
| 257 @Feature({"Cronet"}) |
| 258 public void testRealTimeNetworkQualityObservationsNotEnabled_LegacyAPI() thr
ows Exception { |
| 259 mTestFramework = startCronetTestFramework(); |
| 260 TestNetworkQualityRttListener rttListener = new TestNetworkQualityRttLis
tener(); |
| 261 try { |
| 262 mTestFramework.mCronetEngine.addRttListener(rttListener); |
| 263 fail("Should throw an exception."); |
| 264 } catch (IllegalStateException e) { |
| 265 } |
| 266 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
| 267 UrlRequest urlRequest = |
| 268 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); |
| 269 urlRequest.start(); |
| 270 callback.blockForDone(); |
| 271 assertEquals(0, rttListener.rttObservationCount()); |
262 mTestFramework.mCronetEngine.shutdown(); | 272 mTestFramework.mCronetEngine.shutdown(); |
263 } | 273 } |
264 | 274 |
265 @SmallTest | 275 @SmallTest |
266 @Feature({"Cronet"}) | 276 @Feature({"Cronet"}) |
267 public void testRealTimeNetworkQualityObservationsListenerRemoved() throws E
xception { | 277 public void testRealTimeNetworkQualityObservationsListenerRemoved() throws E
xception { |
| 278 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); |
| 279 TestExecutor networkQualityExecutor = new TestExecutor(); |
| 280 TestNetworkQualityRttListener rttListener = |
| 281 new TestNetworkQualityRttListener(networkQualityExecutor); |
| 282 mCronetEngineBuilder.enableNetworkQualityEstimator(true); |
| 283 mTestFramework = |
| 284 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); |
| 285 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); |
| 286 |
| 287 mTestFramework.mCronetEngine.addRttListener(rttListener); |
| 288 mTestFramework.mCronetEngine.removeRttListener(rttListener); |
| 289 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
| 290 UrlRequest urlRequest = |
| 291 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); |
| 292 urlRequest.start(); |
| 293 callback.blockForDone(); |
| 294 networkQualityExecutor.runAllTasks(); |
| 295 assertEquals(0, rttListener.rttObservationCount()); |
| 296 mTestFramework.mCronetEngine.shutdown(); |
| 297 } |
| 298 |
| 299 @SmallTest |
| 300 @Feature({"Cronet"}) |
| 301 public void testRealTimeNetworkQualityObservationsListenerRemoved_LegacyAPI(
) throws Exception { |
268 mTestFramework = startCronetTestFramework(); | 302 mTestFramework = startCronetTestFramework(); |
269 TestExecutor testExecutor = new TestExecutor(); | 303 TestExecutor testExecutor = new TestExecutor(); |
270 TestNetworkQualityListener networkQualityListener = new TestNetworkQuali
tyListener(null); | 304 TestNetworkQualityRttListener rttListener = new TestNetworkQualityRttLis
tener(); |
271 mTestFramework.mCronetEngine.enableNetworkQualityEstimatorForTesting( | 305 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; |
272 true, true, testExecutor); | 306 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); |
273 mTestFramework.mCronetEngine.addRttListener(networkQualityListener); | 307 mTestFramework.mCronetEngine.addRttListener(rttListener); |
274 mTestFramework.mCronetEngine.addThroughputListener(networkQualityListene
r); | 308 mTestFramework.mCronetEngine.removeRttListener(rttListener); |
275 mTestFramework.mCronetEngine.removeRttListener(networkQualityListener); | |
276 mTestFramework.mCronetEngine.removeThroughputListener(networkQualityList
ener); | |
277 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 309 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
278 UrlRequest urlRequest = | 310 UrlRequest urlRequest = |
279 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); | 311 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); |
280 urlRequest.start(); | 312 urlRequest.start(); |
281 callback.blockForDone(); | 313 callback.blockForDone(); |
282 testExecutor.runAllTasks(); | 314 testExecutor.runAllTasks(); |
283 assertEquals(0, networkQualityListener.rttObservationCount()); | 315 assertEquals(0, rttListener.rttObservationCount()); |
284 assertEquals(0, networkQualityListener.throughputObservationCount()); | |
285 mTestFramework.mCronetEngine.shutdown(); | 316 mTestFramework.mCronetEngine.shutdown(); |
286 } | 317 } |
287 | 318 |
288 @SmallTest | 319 @SmallTest |
289 @Feature({"Cronet"}) | 320 @Feature({"Cronet"}) |
290 public void testRealTimeNetworkQualityObservations() throws Exception { | 321 public void testRealTimeNetworkQualityObservationsQuicDisabled() throws Exce
ption { |
| 322 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); |
| 323 Executor requestFinishedListenerExecutor = |
| 324 Executors.newSingleThreadExecutor(new ExecutorThreadFactory()); |
| 325 Executor listenersExecutor = Executors.newSingleThreadExecutor(new Execu
torThreadFactory()); |
| 326 ConditionVariable waitForThroughput = new ConditionVariable(); |
| 327 TestNetworkQualityRttListener rttListener = |
| 328 new TestNetworkQualityRttListener(listenersExecutor); |
| 329 TestNetworkQualityThroughputListener throughputListener = |
| 330 new TestNetworkQualityThroughputListener(listenersExecutor, wait
ForThroughput); |
| 331 mCronetEngineBuilder.enableHTTP2(true).enableQUIC(false).enableNetworkQu
alityEstimator( |
| 332 true); |
| 333 mTestFramework = |
| 334 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); |
| 335 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); |
| 336 // requestFinishedListenerExecutor should not be used for notifying the
RTT and |
| 337 // throughput listeners. |
| 338 mTestFramework.mCronetEngine.setRequestFinishedListenerExecutor( |
| 339 requestFinishedListenerExecutor); |
| 340 |
| 341 mTestFramework.mCronetEngine.addRttListener(rttListener); |
| 342 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); |
| 343 |
| 344 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
| 345 UrlRequest urlRequest = |
| 346 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); |
| 347 urlRequest.start(); |
| 348 callback.blockForDone(); |
| 349 |
| 350 // Throughput observation is posted to the network quality estimator on
the network thread |
| 351 // after the UrlRequest is completed. The observations are then eventual
ly posted to |
| 352 // throughput listeners on the executor provided to network quality. |
| 353 waitForThroughput.block(); |
| 354 assertTrue(throughputListener.throughputObservationCount() > 0); |
| 355 |
| 356 // Check RTT observation count after throughput observation has been rec
eived. This ensures |
| 357 // that executor has finished posting the RTT observation to the RTT lis
teners. |
| 358 assertTrue(rttListener.rttObservationCount() > 0); |
| 359 |
| 360 // NETWORK_QUALITY_OBSERVATION_SOURCE_URL_REQUEST |
| 361 assertTrue(rttListener.rttObservationCount(0) > 0); |
| 362 |
| 363 // NETWORK_QUALITY_OBSERVATION_SOURCE_TCP |
| 364 assertTrue(rttListener.rttObservationCount(1) > 0); |
| 365 |
| 366 // NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC |
| 367 assertEquals(0, rttListener.rttObservationCount(2)); |
| 368 |
| 369 // Verify that the listeners were notified on the expected thread. |
| 370 assertEquals(mNetworkQualityThread, rttListener.getThread()); |
| 371 assertEquals(mNetworkQualityThread, throughputListener.getThread()); |
| 372 |
| 373 mTestFramework.mCronetEngine.shutdown(); |
| 374 } |
| 375 |
| 376 @SmallTest |
| 377 @Feature({"Cronet"}) |
| 378 public void testRealTimeNetworkQualityObservations_LegacyAPI() throws Except
ion { |
291 mTestFramework = startCronetTestFramework(); | 379 mTestFramework = startCronetTestFramework(); |
292 Executor executor = Executors.newSingleThreadExecutor(); | 380 Executor executor = Executors.newSingleThreadExecutor(); |
293 ConditionVariable waitForThroughput = new ConditionVariable(); | 381 ConditionVariable waitForThroughput = new ConditionVariable(); |
294 TestNetworkQualityListener networkQualityListener = | 382 TestNetworkQualityRttListener rttListener = new TestNetworkQualityRttLis
tener(); |
295 new TestNetworkQualityListener(waitForThroughput); | 383 TestNetworkQualityThroughputListener throughputListener = |
296 mTestFramework.mCronetEngine.enableNetworkQualityEstimatorForTesting(tru
e, true, executor); | 384 new TestNetworkQualityThroughputListener(executor, waitForThroug
hput); |
297 mTestFramework.mCronetEngine.addRttListener(networkQualityListener); | 385 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(executor); |
298 mTestFramework.mCronetEngine.addThroughputListener(networkQualityListene
r); | 386 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); |
| 387 mTestFramework.mCronetEngine.addRttListener(rttListener); |
| 388 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); |
299 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 389 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
300 UrlRequest urlRequest = | 390 UrlRequest urlRequest = |
301 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); | 391 mTestFramework.mCronetEngine.createRequest(mUrl, callback, callb
ack.getExecutor()); |
302 urlRequest.start(); | 392 urlRequest.start(); |
303 callback.blockForDone(); | 393 callback.blockForDone(); |
304 | 394 |
305 // Throughput observation is posted to the network quality estimator on
the network thread | 395 // Throughput observation is posted to the network quality estimator on
the network thread |
306 // after the UrlRequest is completed. The observations are then eventual
ly posted to | 396 // after the UrlRequest is completed. The observations are then eventual
ly posted to |
307 // throughput listeners on the executor provided to network quality. | 397 // throughput listeners on the executor provided to network quality. |
308 waitForThroughput.block(); | 398 waitForThroughput.block(); |
309 assertTrue(networkQualityListener.throughputObservationCount() > 0); | 399 assertTrue(throughputListener.throughputObservationCount() > 0); |
310 | 400 |
311 // Check RTT observation count after throughput observation has been rec
eived. This ensures | 401 // Check RTT observation count after throughput observation has been rec
eived. This ensures |
312 // that executor has finished posting the RTT observation to the RTT lis
teners. | 402 // that executor has finished posting the RTT observation to the RTT lis
teners. |
313 assertTrue(networkQualityListener.rttObservationCount() > 0); | 403 assertTrue(rttListener.rttObservationCount() > 0); |
314 | 404 |
315 mTestFramework.mCronetEngine.shutdown(); | 405 mTestFramework.mCronetEngine.shutdown(); |
316 } | 406 } |
317 | 407 |
| 408 // TODO(tbansal): http://crbug.com/618034 Remove this. |
318 private static class TestRequestFinishedListener | 409 private static class TestRequestFinishedListener |
319 implements CronetEngine.RequestFinishedListener { | 410 implements CronetEngine.RequestFinishedListener { |
320 private UrlRequestInfo mRequestInfo = null; | 411 private UrlRequestInfo mRequestInfo = null; |
321 | 412 |
322 @Override | 413 @Override |
323 public void onRequestFinished(UrlRequestInfo requestInfo) { | 414 public void onRequestFinished(UrlRequestInfo requestInfo) { |
324 assertNull("onRequestFinished called repeatedly", mRequestInfo); | 415 assertNull("onRequestFinished called repeatedly", mRequestInfo); |
325 assertNotNull(requestInfo); | 416 assertNotNull(requestInfo); |
326 mRequestInfo = requestInfo; | 417 mRequestInfo = requestInfo; |
327 } | 418 } |
328 } | 419 } |
329 | 420 |
330 @SmallTest | 421 @SmallTest |
331 @Feature({"Cronet"}) | 422 @Feature({"Cronet"}) |
332 @SuppressWarnings("deprecation") | 423 @SuppressWarnings("deprecation") |
333 public void testRequestFinishedListener() throws Exception { | 424 public void testRequestFinishedListener_LegacyAPI() throws Exception { |
334 mTestFramework = startCronetTestFramework(); | 425 mTestFramework = startCronetTestFramework(); |
335 TestExecutor testExecutor = new TestExecutor(); | 426 TestExecutor testExecutor = new TestExecutor(); |
336 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | 427 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); |
337 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; | 428 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; |
338 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | 429 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); |
339 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 430 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
340 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( | 431 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
341 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | 432 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); |
342 urlRequestBuilder.addRequestAnnotation("request annotation") | 433 urlRequestBuilder.addRequestAnnotation("request annotation") |
343 .addRequestAnnotation(this) | 434 .addRequestAnnotation(this) |
344 .build() | 435 .build() |
345 .start(); | 436 .start(); |
346 callback.blockForDone(); | 437 callback.blockForDone(); |
347 testExecutor.runAllTasks(); | 438 testExecutor.runAllTasks(); |
348 | 439 |
349 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; | 440 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; |
350 assertNotNull("RequestFinishedListener must be called", requestInfo); | 441 assertNotNull("RequestFinishedListener must be called", requestInfo); |
351 assertEquals(mUrl, requestInfo.getUrl()); | 442 assertEquals(mUrl, requestInfo.getUrl()); |
352 assertNotNull(requestInfo.getResponseInfo()); | 443 assertNotNull(requestInfo.getResponseInfo()); |
353 assertEquals(newHashSet("request annotation", this), // Use sets for uno
rdered comparison. | 444 assertEquals(newHashSet("request annotation", this), // Use sets for uno
rdered comparison. |
354 new HashSet<Object>(requestInfo.getAnnotations())); | 445 new HashSet<Object>(requestInfo.getAnnotations())); |
355 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); | 446 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); |
356 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); | 447 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); |
357 assertTrue(metrics.getTotalTimeMs() > 0); | 448 assertTrue(metrics.getTotalTimeMs() > 0); |
358 assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); | 449 assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); |
359 assertTrue(metrics.getReceivedBytesCount() > 0); | 450 assertTrue(metrics.getReceivedBytesCount() > 0); |
360 mTestFramework.mCronetEngine.shutdown(); | 451 mTestFramework.mCronetEngine.shutdown(); |
361 } | 452 } |
362 | 453 |
| 454 @SmallTest |
| 455 @Feature({"Cronet"}) |
| 456 @SuppressWarnings("deprecation") |
| 457 public void testRequestFinishedListenerWithExecutorSetLater_LegacyAPI() thro
ws Exception { |
| 458 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); |
| 459 TestExecutor testExecutor = new TestExecutor(); |
| 460 mCronetEngineBuilder.enableHTTP2(true).enableQUIC(false).enableNetworkQu
alityEstimator( |
| 461 true); |
| 462 mTestFramework = |
| 463 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); |
| 464 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); |
| 465 mTestFramework.mCronetEngine.setRequestFinishedListenerExecutor(testExec
utor); |
| 466 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); |
| 467 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
| 468 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
| 469 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); |
| 470 urlRequestBuilder.addRequestAnnotation("request annotation") |
| 471 .addRequestAnnotation(this) |
| 472 .build() |
| 473 .start(); |
| 474 callback.blockForDone(); |
| 475 testExecutor.runAllTasks(); |
| 476 |
| 477 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; |
| 478 assertNotNull("RequestFinishedListener must be called", requestInfo); |
| 479 assertEquals(mUrl, requestInfo.getUrl()); |
| 480 assertNotNull(requestInfo.getResponseInfo()); |
| 481 assertEquals(newHashSet("request annotation", this), // Use sets for uno
rdered comparison. |
| 482 new HashSet<Object>(requestInfo.getAnnotations())); |
| 483 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); |
| 484 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); |
| 485 assertTrue(metrics.getTotalTimeMs() > 0); |
| 486 assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); |
| 487 assertTrue(metrics.getReceivedBytesCount() > 0); |
| 488 mTestFramework.mCronetEngine.shutdown(); |
| 489 } |
| 490 |
363 /* | 491 /* |
364 @SmallTest | 492 @SmallTest |
365 @Feature({"Cronet"}) | 493 @Feature({"Cronet"}) |
366 @SuppressWarnings("deprecation") | 494 @SuppressWarnings("deprecation") |
367 */ | 495 */ |
368 @FlakyTest(message = "https://crbug.com/592444") | 496 @FlakyTest(message = "https://crbug.com/592444") |
369 public void testRequestFinishedListenerFailedRequest() throws Exception { | 497 public void testRequestFinishedListenerFailedRequest_LegacyAPI() throws Exce
ption { |
370 String connectionRefusedUrl = "http://127.0.0.1:3"; | 498 String connectionRefusedUrl = "http://127.0.0.1:3"; |
371 mTestFramework = startCronetTestFramework(); | 499 mTestFramework = startCronetTestFramework(); |
372 TestExecutor testExecutor = new TestExecutor(); | 500 TestExecutor testExecutor = new TestExecutor(); |
373 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | 501 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); |
374 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; | 502 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; |
375 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | 503 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); |
376 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 504 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
377 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder(connection
RefusedUrl, | 505 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder(connection
RefusedUrl, |
378 callback, callback.getExecutor(), mTestFramework.mCronetEngine); | 506 callback, callback.getExecutor(), mTestFramework.mCronetEngine); |
379 urlRequestBuilder.build().start(); | 507 urlRequestBuilder.build().start(); |
380 callback.blockForDone(); | 508 callback.blockForDone(); |
381 assertTrue(callback.mOnErrorCalled); | 509 assertTrue(callback.mOnErrorCalled); |
382 testExecutor.runAllTasks(); | 510 testExecutor.runAllTasks(); |
383 | 511 |
384 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; | 512 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; |
385 assertNotNull("RequestFinishedListener must be called", requestInfo); | 513 assertNotNull("RequestFinishedListener must be called", requestInfo); |
386 assertEquals(connectionRefusedUrl, requestInfo.getUrl()); | 514 assertEquals(connectionRefusedUrl, requestInfo.getUrl()); |
387 assertTrue(requestInfo.getAnnotations().isEmpty()); | 515 assertTrue(requestInfo.getAnnotations().isEmpty()); |
388 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); | 516 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); |
389 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); | 517 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); |
390 assertTrue(metrics.getTotalTimeMs() > 0); | 518 assertTrue(metrics.getTotalTimeMs() > 0); |
391 assertNull(metrics.getTtfbMs()); | 519 assertNull(metrics.getTtfbMs()); |
392 assertTrue(metrics.getReceivedBytesCount() == null || metrics.getReceive
dBytesCount() == 0); | 520 assertTrue(metrics.getReceivedBytesCount() == null || metrics.getReceive
dBytesCount() == 0); |
393 mTestFramework.mCronetEngine.shutdown(); | 521 mTestFramework.mCronetEngine.shutdown(); |
394 } | 522 } |
395 | 523 |
396 @SmallTest | 524 @SmallTest |
397 @Feature({"Cronet"}) | 525 @Feature({"Cronet"}) |
398 @SuppressWarnings("deprecation") | 526 @SuppressWarnings("deprecation") |
399 public void testRequestFinishedListenerRemoved() throws Exception { | 527 public void testRequestFinishedListenerRemoved_LegacyAPI() throws Exception
{ |
400 mTestFramework = startCronetTestFramework(); | 528 mTestFramework = startCronetTestFramework(); |
401 TestExecutor testExecutor = new TestExecutor(); | 529 TestExecutor testExecutor = new TestExecutor(); |
402 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | 530 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); |
403 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; | 531 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; |
404 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | 532 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); |
405 mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinish
edListener); | 533 mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinish
edListener); |
406 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 534 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
407 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( | 535 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( |
408 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | 536 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); |
409 urlRequestBuilder.build().start(); | 537 urlRequestBuilder.build().start(); |
410 callback.blockForDone(); | 538 callback.blockForDone(); |
411 testExecutor.runAllTasks(); | 539 testExecutor.runAllTasks(); |
412 | 540 |
413 assertNull( | 541 assertNull( |
414 "RequestFinishedListener must not be called", requestFinishedLis
tener.mRequestInfo); | 542 "RequestFinishedListener must not be called", requestFinishedLis
tener.mRequestInfo); |
415 mTestFramework.mCronetEngine.shutdown(); | 543 mTestFramework.mCronetEngine.shutdown(); |
416 } | 544 } |
417 | 545 |
418 @SmallTest | 546 @SmallTest |
419 @Feature({"Cronet"}) | 547 @Feature({"Cronet"}) |
420 @SuppressWarnings("deprecation") | 548 @SuppressWarnings("deprecation") |
421 public void testRequestFinishedListenerDisabled() throws Exception { | 549 public void testRequestFinishedListenerDisabled_LegacyAPI() throws Exception
{ |
422 mTestFramework = startCronetTestFramework(); | 550 mTestFramework = startCronetTestFramework(); |
423 TestExecutor testExecutor = new TestExecutor(); | 551 TestExecutor testExecutor = new TestExecutor(); |
424 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | 552 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); |
425 try { | 553 try { |
426 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinis
hedListener); | 554 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinis
hedListener); |
427 fail("addRequestFinishedListener unexpectedly succeeded " | 555 fail("addRequestFinishedListener unexpectedly succeeded " |
428 + "without a call to enableNetworkQualityEstimator()"); | 556 + "without a call to enableNetworkQualityEstimator()"); |
429 } catch (RuntimeException e) { | 557 } catch (RuntimeException e) { |
430 // Expected. | 558 // Expected. |
431 } | 559 } |
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 } | 1296 } |
1169 }.start(); | 1297 }.start(); |
1170 otherThreadDone.block(); | 1298 otherThreadDone.block(); |
1171 builder.build().shutdown(); | 1299 builder.build().shutdown(); |
1172 uiThreadDone.open(); | 1300 uiThreadDone.open(); |
1173 } | 1301 } |
1174 }); | 1302 }); |
1175 assertTrue(uiThreadDone.block(1000)); | 1303 assertTrue(uiThreadDone.block(1000)); |
1176 } | 1304 } |
1177 } | 1305 } |
OLD | NEW |