| 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 |