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; | |
8 | |
9 import android.content.Context; | 7 import android.content.Context; |
10 import android.content.ContextWrapper; | 8 import android.content.ContextWrapper; |
11 import android.os.ConditionVariable; | 9 import android.os.ConditionVariable; |
12 import android.os.Handler; | 10 import android.os.Handler; |
13 import android.os.Looper; | 11 import android.os.Looper; |
14 import android.os.StrictMode; | 12 import android.os.StrictMode; |
15 import android.test.suitebuilder.annotation.SmallTest; | 13 import android.test.suitebuilder.annotation.SmallTest; |
16 | 14 |
17 import org.chromium.base.PathUtils; | 15 import org.chromium.base.PathUtils; |
18 import org.chromium.base.annotations.JNINamespace; | 16 import org.chromium.base.annotations.JNINamespace; |
19 import org.chromium.base.test.util.Feature; | 17 import org.chromium.base.test.util.Feature; |
20 import org.chromium.base.test.util.FlakyTest; | 18 import org.chromium.base.test.util.FlakyTest; |
21 import org.chromium.net.CronetEngine.UrlRequestInfo; | |
22 import org.chromium.net.TestUrlRequestCallback.ResponseStep; | 19 import org.chromium.net.TestUrlRequestCallback.ResponseStep; |
23 import org.chromium.net.impl.CronetLibraryLoader; | 20 import org.chromium.net.impl.CronetLibraryLoader; |
24 import org.chromium.net.impl.CronetUrlRequestContext; | 21 import org.chromium.net.impl.CronetUrlRequestContext; |
25 import org.chromium.net.test.EmbeddedTestServer; | 22 import org.chromium.net.test.EmbeddedTestServer; |
26 | 23 |
27 import java.io.BufferedReader; | 24 import java.io.BufferedReader; |
28 import java.io.File; | 25 import java.io.File; |
29 import java.io.FileReader; | 26 import java.io.FileReader; |
30 import java.util.Arrays; | 27 import java.util.Arrays; |
31 import java.util.HashSet; | |
32 import java.util.LinkedList; | 28 import java.util.LinkedList; |
33 import java.util.NoSuchElementException; | 29 import java.util.NoSuchElementException; |
34 import java.util.concurrent.Executor; | 30 import java.util.concurrent.Executor; |
35 import java.util.concurrent.Executors; | 31 import java.util.concurrent.Executors; |
36 import java.util.concurrent.ThreadFactory; | 32 import java.util.concurrent.ThreadFactory; |
37 | 33 |
38 /** | 34 /** |
39 * Test CronetEngine. | 35 * Test CronetEngine. |
40 */ | 36 */ |
41 @JNINamespace("cronet") | 37 @JNINamespace("cronet") |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 callback.blockForDone(); | 274 callback.blockForDone(); |
279 networkQualityExecutor.runAllTasks(); | 275 networkQualityExecutor.runAllTasks(); |
280 assertEquals(0, rttListener.rttObservationCount()); | 276 assertEquals(0, rttListener.rttObservationCount()); |
281 mTestFramework.mCronetEngine.shutdown(); | 277 mTestFramework.mCronetEngine.shutdown(); |
282 } | 278 } |
283 | 279 |
284 @SmallTest | 280 @SmallTest |
285 @Feature({"Cronet"}) | 281 @Feature({"Cronet"}) |
286 public void testRealTimeNetworkQualityObservationsQuicDisabled() throws Exce
ption { | 282 public void testRealTimeNetworkQualityObservationsQuicDisabled() throws Exce
ption { |
287 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); | 283 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); |
288 Executor requestFinishedListenerExecutor = | |
289 Executors.newSingleThreadExecutor(new ExecutorThreadFactory()); | |
290 Executor listenersExecutor = Executors.newSingleThreadExecutor(new Execu
torThreadFactory()); | 284 Executor listenersExecutor = Executors.newSingleThreadExecutor(new Execu
torThreadFactory()); |
291 ConditionVariable waitForThroughput = new ConditionVariable(); | 285 ConditionVariable waitForThroughput = new ConditionVariable(); |
292 TestNetworkQualityRttListener rttListener = | 286 TestNetworkQualityRttListener rttListener = |
293 new TestNetworkQualityRttListener(listenersExecutor); | 287 new TestNetworkQualityRttListener(listenersExecutor); |
294 TestNetworkQualityThroughputListener throughputListener = | 288 TestNetworkQualityThroughputListener throughputListener = |
295 new TestNetworkQualityThroughputListener(listenersExecutor, wait
ForThroughput); | 289 new TestNetworkQualityThroughputListener(listenersExecutor, wait
ForThroughput); |
296 mCronetEngineBuilder.enableHTTP2(true).enableQUIC(false).enableNetworkQu
alityEstimator( | 290 mCronetEngineBuilder.enableHTTP2(true).enableQUIC(false).enableNetworkQu
alityEstimator( |
297 true); | 291 true); |
298 mTestFramework = | 292 mTestFramework = |
299 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); | 293 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); |
300 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); | 294 mTestFramework.mCronetEngine.configureNetworkQualityEstimatorForTesting(
true, true); |
301 // requestFinishedListenerExecutor should not be used for notifying the
RTT and | |
302 // throughput listeners. | |
303 mTestFramework.mCronetEngine.setRequestFinishedListenerExecutor( | |
304 requestFinishedListenerExecutor); | |
305 | 295 |
306 mTestFramework.mCronetEngine.addRttListener(rttListener); | 296 mTestFramework.mCronetEngine.addRttListener(rttListener); |
307 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); | 297 mTestFramework.mCronetEngine.addThroughputListener(throughputListener); |
308 | 298 |
309 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | 299 TestUrlRequestCallback callback = new TestUrlRequestCallback(); |
310 UrlRequest.Builder builder = new UrlRequest.Builder( | 300 UrlRequest.Builder builder = new UrlRequest.Builder( |
311 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | 301 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); |
312 UrlRequest urlRequest = builder.build(); | 302 UrlRequest urlRequest = builder.build(); |
313 urlRequest.start(); | 303 urlRequest.start(); |
314 callback.blockForDone(); | 304 callback.blockForDone(); |
(...skipping 17 matching lines...) Expand all Loading... |
332 // NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC | 322 // NETWORK_QUALITY_OBSERVATION_SOURCE_QUIC |
333 assertEquals(0, rttListener.rttObservationCount(2)); | 323 assertEquals(0, rttListener.rttObservationCount(2)); |
334 | 324 |
335 // Verify that the listeners were notified on the expected thread. | 325 // Verify that the listeners were notified on the expected thread. |
336 assertEquals(mNetworkQualityThread, rttListener.getThread()); | 326 assertEquals(mNetworkQualityThread, rttListener.getThread()); |
337 assertEquals(mNetworkQualityThread, throughputListener.getThread()); | 327 assertEquals(mNetworkQualityThread, throughputListener.getThread()); |
338 | 328 |
339 mTestFramework.mCronetEngine.shutdown(); | 329 mTestFramework.mCronetEngine.shutdown(); |
340 } | 330 } |
341 | 331 |
342 // TODO(tbansal): http://crbug.com/618034 Remove this. | |
343 private static class TestRequestFinishedListener | |
344 implements CronetEngine.RequestFinishedListener { | |
345 private UrlRequestInfo mRequestInfo = null; | |
346 | 332 |
347 @Override | |
348 public void onRequestFinished(UrlRequestInfo requestInfo) { | |
349 assertNull("onRequestFinished called repeatedly", mRequestInfo); | |
350 assertNotNull(requestInfo); | |
351 mRequestInfo = requestInfo; | |
352 } | |
353 } | |
354 | |
355 @SmallTest | |
356 @Feature({"Cronet"}) | |
357 @SuppressWarnings("deprecation") | |
358 public void testRequestFinishedListener_LegacyAPI() throws Exception { | |
359 mTestFramework = startCronetTestFramework(); | |
360 TestExecutor testExecutor = new TestExecutor(); | |
361 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | |
362 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; | |
363 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | |
364 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | |
365 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( | |
366 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | |
367 urlRequestBuilder.addRequestAnnotation("request annotation") | |
368 .addRequestAnnotation(this) | |
369 .build() | |
370 .start(); | |
371 callback.blockForDone(); | |
372 testExecutor.runAllTasks(); | |
373 | |
374 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; | |
375 assertNotNull("RequestFinishedListener must be called", requestInfo); | |
376 assertEquals(mUrl, requestInfo.getUrl()); | |
377 assertNotNull(requestInfo.getResponseInfo()); | |
378 assertEquals(newHashSet("request annotation", this), // Use sets for uno
rdered comparison. | |
379 new HashSet<Object>(requestInfo.getAnnotations())); | |
380 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); | |
381 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); | |
382 assertTrue(metrics.getTotalTimeMs() > 0); | |
383 assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); | |
384 assertTrue(metrics.getReceivedBytesCount() > 0); | |
385 mTestFramework.mCronetEngine.shutdown(); | |
386 } | |
387 | |
388 @SmallTest | |
389 @Feature({"Cronet"}) | |
390 @SuppressWarnings("deprecation") | |
391 public void testRequestFinishedListenerWithExecutorSetLater_LegacyAPI() thro
ws Exception { | |
392 CronetEngine.Builder mCronetEngineBuilder = new CronetEngine.Builder(get
Context()); | |
393 TestExecutor testExecutor = new TestExecutor(); | |
394 mCronetEngineBuilder.enableHTTP2(true).enableQUIC(false).enableNetworkQu
alityEstimator( | |
395 true); | |
396 mTestFramework = | |
397 startCronetTestFrameworkWithUrlAndCronetEngineBuilder(null, mCro
netEngineBuilder); | |
398 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | |
399 mTestFramework.mCronetEngine.setRequestFinishedListenerExecutor(testExec
utor); | |
400 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | |
401 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | |
402 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( | |
403 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | |
404 urlRequestBuilder.addRequestAnnotation("request annotation") | |
405 .addRequestAnnotation(this) | |
406 .build() | |
407 .start(); | |
408 callback.blockForDone(); | |
409 testExecutor.runAllTasks(); | |
410 | |
411 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; | |
412 assertNotNull("RequestFinishedListener must be called", requestInfo); | |
413 assertEquals(mUrl, requestInfo.getUrl()); | |
414 assertNotNull(requestInfo.getResponseInfo()); | |
415 assertEquals(newHashSet("request annotation", this), // Use sets for uno
rdered comparison. | |
416 new HashSet<Object>(requestInfo.getAnnotations())); | |
417 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); | |
418 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); | |
419 assertTrue(metrics.getTotalTimeMs() > 0); | |
420 assertTrue(metrics.getTotalTimeMs() >= metrics.getTtfbMs()); | |
421 assertTrue(metrics.getReceivedBytesCount() > 0); | |
422 mTestFramework.mCronetEngine.shutdown(); | |
423 } | |
424 | |
425 /* | |
426 @SmallTest | |
427 @Feature({"Cronet"}) | |
428 @SuppressWarnings("deprecation") | |
429 */ | |
430 @FlakyTest(message = "https://crbug.com/592444") | |
431 public void testRequestFinishedListenerFailedRequest_LegacyAPI() throws Exce
ption { | |
432 String connectionRefusedUrl = "http://127.0.0.1:3"; | |
433 mTestFramework = startCronetTestFramework(); | |
434 TestExecutor testExecutor = new TestExecutor(); | |
435 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | |
436 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; | |
437 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | |
438 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | |
439 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder(connection
RefusedUrl, | |
440 callback, callback.getExecutor(), mTestFramework.mCronetEngine); | |
441 urlRequestBuilder.build().start(); | |
442 callback.blockForDone(); | |
443 assertTrue(callback.mOnErrorCalled); | |
444 testExecutor.runAllTasks(); | |
445 | |
446 CronetEngine.UrlRequestInfo requestInfo = requestFinishedListener.mReque
stInfo; | |
447 assertNotNull("RequestFinishedListener must be called", requestInfo); | |
448 assertEquals(connectionRefusedUrl, requestInfo.getUrl()); | |
449 assertTrue(requestInfo.getAnnotations().isEmpty()); | |
450 CronetEngine.UrlRequestMetrics metrics = requestInfo.getMetrics(); | |
451 assertNotNull("UrlRequestInfo.getMetrics() must not be null", metrics); | |
452 assertTrue(metrics.getTotalTimeMs() > 0); | |
453 assertNull(metrics.getTtfbMs()); | |
454 assertTrue(metrics.getReceivedBytesCount() == null || metrics.getReceive
dBytesCount() == 0); | |
455 mTestFramework.mCronetEngine.shutdown(); | |
456 } | |
457 | |
458 @SmallTest | |
459 @Feature({"Cronet"}) | |
460 @SuppressWarnings("deprecation") | |
461 public void testRequestFinishedListenerRemoved_LegacyAPI() throws Exception
{ | |
462 mTestFramework = startCronetTestFramework(); | |
463 TestExecutor testExecutor = new TestExecutor(); | |
464 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | |
465 mTestFramework.mCronetEngine.enableNetworkQualityEstimator(testExecutor)
; | |
466 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinishedL
istener); | |
467 mTestFramework.mCronetEngine.removeRequestFinishedListener(requestFinish
edListener); | |
468 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | |
469 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( | |
470 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | |
471 urlRequestBuilder.build().start(); | |
472 callback.blockForDone(); | |
473 testExecutor.runAllTasks(); | |
474 | |
475 assertNull( | |
476 "RequestFinishedListener must not be called", requestFinishedLis
tener.mRequestInfo); | |
477 mTestFramework.mCronetEngine.shutdown(); | |
478 } | |
479 | |
480 @SmallTest | |
481 @Feature({"Cronet"}) | |
482 @SuppressWarnings("deprecation") | |
483 public void testRequestFinishedListenerDisabled_LegacyAPI() throws Exception
{ | |
484 mTestFramework = startCronetTestFramework(); | |
485 TestExecutor testExecutor = new TestExecutor(); | |
486 TestRequestFinishedListener requestFinishedListener = new TestRequestFin
ishedListener(); | |
487 try { | |
488 mTestFramework.mCronetEngine.addRequestFinishedListener(requestFinis
hedListener); | |
489 fail("addRequestFinishedListener unexpectedly succeeded " | |
490 + "without a call to enableNetworkQualityEstimator()"); | |
491 } catch (RuntimeException e) { | |
492 // Expected. | |
493 } | |
494 TestUrlRequestCallback callback = new TestUrlRequestCallback(); | |
495 UrlRequest.Builder urlRequestBuilder = new UrlRequest.Builder( | |
496 mUrl, callback, callback.getExecutor(), mTestFramework.mCronetEn
gine); | |
497 urlRequestBuilder.build().start(); | |
498 callback.blockForDone(); | |
499 testExecutor.runAllTasks(); | |
500 | |
501 assertNull( | |
502 "RequestFinishedListener must not be called", requestFinishedLis
tener.mRequestInfo); | |
503 mTestFramework.mCronetEngine.shutdown(); | |
504 } | |
505 | 333 |
506 /** | 334 /** |
507 @SmallTest | 335 @SmallTest |
508 @Feature({"Cronet"}) | 336 @Feature({"Cronet"}) |
509 https://crbug.com/596929 | 337 https://crbug.com/596929 |
510 */ | 338 */ |
511 @FlakyTest | 339 @FlakyTest |
512 public void testShutdown() throws Exception { | 340 public void testShutdown() throws Exception { |
513 mTestFramework = startCronetTestFramework(); | 341 mTestFramework = startCronetTestFramework(); |
514 TestUrlRequestCallback callback = new ShutdownTestUrlRequestCallback(); | 342 TestUrlRequestCallback callback = new ShutdownTestUrlRequestCallback(); |
(...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1285 } | 1113 } |
1286 }.start(); | 1114 }.start(); |
1287 otherThreadDone.block(); | 1115 otherThreadDone.block(); |
1288 builder.build().shutdown(); | 1116 builder.build().shutdown(); |
1289 uiThreadDone.open(); | 1117 uiThreadDone.open(); |
1290 } | 1118 } |
1291 }); | 1119 }); |
1292 assertTrue(uiThreadDone.block(1000)); | 1120 assertTrue(uiThreadDone.block(1000)); |
1293 } | 1121 } |
1294 } | 1122 } |
OLD | NEW |