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 #include "net/nqe/network_quality_estimator.h" | 5 #include "net/nqe/network_quality_estimator.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <limits> | 10 #include <limits> |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 estimator.AddThroughputObserver(&throughput_observer); | 344 estimator.AddThroughputObserver(&throughput_observer); |
345 | 345 |
346 estimator.SimulateNetworkChange( | 346 estimator.SimulateNetworkChange( |
347 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test"); | 347 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test"); |
348 histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", true, | 348 histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", true, |
349 1); | 349 1); |
350 histogram_tester.ExpectTotalCount("NQE.CachedNetworkQualityAvailable", 2); | 350 histogram_tester.ExpectTotalCount("NQE.CachedNetworkQualityAvailable", 2); |
351 base::RunLoop().RunUntilIdle(); | 351 base::RunLoop().RunUntilIdle(); |
352 | 352 |
353 // Verify that the cached network quality was read, and observers were | 353 // Verify that the cached network quality was read, and observers were |
354 // notified. | 354 // notified. |observer| must be notified once right after it was added, and |
355 EXPECT_EQ(1U, observer.effective_connection_types().size()); | 355 // once again after the cached network quality was read. |
| 356 EXPECT_EQ(2U, observer.effective_connection_types().size()); |
356 EXPECT_EQ(1U, rtt_observer.observations().size()); | 357 EXPECT_EQ(1U, rtt_observer.observations().size()); |
357 EXPECT_EQ(1U, throughput_observer.observations().size()); | 358 EXPECT_EQ(1U, throughput_observer.observations().size()); |
358 } | 359 } |
359 | 360 |
360 TEST(NetworkQualityEstimatorTest, StoreObservations) { | 361 TEST(NetworkQualityEstimatorTest, StoreObservations) { |
361 std::map<std::string, std::string> variation_params; | 362 std::map<std::string, std::string> variation_params; |
362 TestNetworkQualityEstimator estimator(variation_params); | 363 TestNetworkQualityEstimator estimator(variation_params); |
363 | 364 |
364 base::TimeDelta rtt; | 365 base::TimeDelta rtt; |
365 int32_t kbps; | 366 int32_t kbps; |
(...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1427 estimator.SimulateNetworkChange(NetworkChangeNotifier::CONNECTION_WIFI, | 1428 estimator.SimulateNetworkChange(NetworkChangeNotifier::CONNECTION_WIFI, |
1428 "test"); | 1429 "test"); |
1429 EXPECT_EQ(2U, observer.effective_connection_types().size()); | 1430 EXPECT_EQ(2U, observer.effective_connection_types().size()); |
1430 | 1431 |
1431 // A change in effective connection type does not trigger notification to the | 1432 // A change in effective connection type does not trigger notification to the |
1432 // observers, since it is not accompanied by any new observation or a network | 1433 // observers, since it is not accompanied by any new observation or a network |
1433 // change event. | 1434 // change event. |
1434 estimator.set_start_time_null_http_rtt( | 1435 estimator.set_start_time_null_http_rtt( |
1435 base::TimeDelta::FromMilliseconds(100)); | 1436 base::TimeDelta::FromMilliseconds(100)); |
1436 EXPECT_EQ(2U, observer.effective_connection_types().size()); | 1437 EXPECT_EQ(2U, observer.effective_connection_types().size()); |
| 1438 |
| 1439 TestEffectiveConnectionTypeObserver observer_2; |
| 1440 estimator.AddEffectiveConnectionTypeObserver(&observer_2); |
| 1441 EXPECT_EQ(0U, observer_2.effective_connection_types().size()); |
| 1442 base::RunLoop().RunUntilIdle(); |
| 1443 // |observer_2| must be notified as soon as it is added. |
| 1444 EXPECT_EQ(1U, observer_2.effective_connection_types().size()); |
| 1445 |
| 1446 // |observer_3| should not be notified since it unregisters before the |
| 1447 // message loop is run. |
| 1448 TestEffectiveConnectionTypeObserver observer_3; |
| 1449 estimator.AddEffectiveConnectionTypeObserver(&observer_3); |
| 1450 EXPECT_EQ(0U, observer_3.effective_connection_types().size()); |
| 1451 estimator.RemoveEffectiveConnectionTypeObserver(&observer_3); |
| 1452 base::RunLoop().RunUntilIdle(); |
| 1453 EXPECT_EQ(0U, observer_3.effective_connection_types().size()); |
1437 } | 1454 } |
1438 | 1455 |
1439 // Tests that the network quality is computed at the specified interval, and | 1456 // Tests that the network quality is computed at the specified interval, and |
1440 // that the network quality observers are notified of any change. | 1457 // that the network quality observers are notified of any change. |
1441 TEST(NetworkQualityEstimatorTest, TestRTTAndThroughputEstimatesObserver) { | 1458 TEST(NetworkQualityEstimatorTest, TestRTTAndThroughputEstimatesObserver) { |
1442 base::HistogramTester histogram_tester; | 1459 base::HistogramTester histogram_tester; |
1443 std::unique_ptr<base::SimpleTestTickClock> tick_clock( | 1460 std::unique_ptr<base::SimpleTestTickClock> tick_clock( |
1444 new base::SimpleTestTickClock()); | 1461 new base::SimpleTestTickClock()); |
1445 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); | 1462 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); |
1446 | 1463 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 EXPECT_LE(1, observer.notifications_received() - notifications_received); | 1517 EXPECT_LE(1, observer.notifications_received() - notifications_received); |
1501 notifications_received = observer.notifications_received(); | 1518 notifications_received = observer.notifications_received(); |
1502 | 1519 |
1503 // A change in effective connection type does not trigger notification to the | 1520 // A change in effective connection type does not trigger notification to the |
1504 // observers, since it is not accompanied by any new observation or a network | 1521 // observers, since it is not accompanied by any new observation or a network |
1505 // change event. | 1522 // change event. |
1506 estimator.set_start_time_null_http_rtt( | 1523 estimator.set_start_time_null_http_rtt( |
1507 base::TimeDelta::FromMilliseconds(10000)); | 1524 base::TimeDelta::FromMilliseconds(10000)); |
1508 estimator.set_start_time_null_http_rtt(base::TimeDelta::FromMilliseconds(1)); | 1525 estimator.set_start_time_null_http_rtt(base::TimeDelta::FromMilliseconds(1)); |
1509 EXPECT_EQ(0, observer.notifications_received() - notifications_received); | 1526 EXPECT_EQ(0, observer.notifications_received() - notifications_received); |
| 1527 |
| 1528 TestRTTAndThroughputEstimatesObserver observer_2; |
| 1529 estimator.AddRTTAndThroughputEstimatesObserver(&observer_2); |
| 1530 EXPECT_EQ(nqe::internal::InvalidRTT(), observer_2.http_rtt()); |
| 1531 EXPECT_EQ(nqe::internal::InvalidRTT(), observer_2.transport_rtt()); |
| 1532 EXPECT_EQ(nqe::internal::kInvalidThroughput, |
| 1533 observer_2.downstream_throughput_kbps()); |
| 1534 base::RunLoop().RunUntilIdle(); |
| 1535 EXPECT_NE(nqe::internal::InvalidRTT(), observer_2.http_rtt()); |
| 1536 EXPECT_NE(nqe::internal::InvalidRTT(), observer_2.transport_rtt()); |
| 1537 EXPECT_NE(nqe::internal::kInvalidThroughput, |
| 1538 observer_2.downstream_throughput_kbps()); |
| 1539 |
| 1540 // |observer_3| should not be notified because it is unregisters before the |
| 1541 // message loop is run. |
| 1542 TestRTTAndThroughputEstimatesObserver observer_3; |
| 1543 estimator.AddRTTAndThroughputEstimatesObserver(&observer_3); |
| 1544 EXPECT_EQ(nqe::internal::InvalidRTT(), observer_3.http_rtt()); |
| 1545 EXPECT_EQ(nqe::internal::InvalidRTT(), observer_3.transport_rtt()); |
| 1546 EXPECT_EQ(nqe::internal::kInvalidThroughput, |
| 1547 observer_3.downstream_throughput_kbps()); |
| 1548 estimator.RemoveRTTAndThroughputEstimatesObserver(&observer_3); |
| 1549 base::RunLoop().RunUntilIdle(); |
| 1550 EXPECT_EQ(nqe::internal::InvalidRTT(), observer_3.http_rtt()); |
| 1551 EXPECT_EQ(nqe::internal::InvalidRTT(), observer_3.transport_rtt()); |
| 1552 EXPECT_EQ(nqe::internal::kInvalidThroughput, |
| 1553 observer_3.downstream_throughput_kbps()); |
1510 } | 1554 } |
1511 | 1555 |
1512 // Tests that the effective connection type is computed on every RTT | 1556 // Tests that the effective connection type is computed on every RTT |
1513 // observation if the last computed effective connection type was unknown. | 1557 // observation if the last computed effective connection type was unknown. |
1514 TEST(NetworkQualityEstimatorTest, UnknownEffectiveConnectionType) { | 1558 TEST(NetworkQualityEstimatorTest, UnknownEffectiveConnectionType) { |
1515 std::unique_ptr<base::SimpleTestTickClock> tick_clock( | 1559 std::unique_ptr<base::SimpleTestTickClock> tick_clock( |
1516 new base::SimpleTestTickClock()); | 1560 new base::SimpleTestTickClock()); |
1517 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); | 1561 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); |
1518 | 1562 |
1519 TestEffectiveConnectionTypeObserver observer; | 1563 TestEffectiveConnectionTypeObserver observer; |
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2320 if (expected_count == 1) { | 2364 if (expected_count == 1) { |
2321 EffectiveConnectionType last_notified_type = | 2365 EffectiveConnectionType last_notified_type = |
2322 observer.effective_connection_types().at( | 2366 observer.effective_connection_types().at( |
2323 observer.effective_connection_types().size() - 1); | 2367 observer.effective_connection_types().size() - 1); |
2324 EXPECT_EQ(i, last_notified_type); | 2368 EXPECT_EQ(i, last_notified_type); |
2325 } | 2369 } |
2326 } | 2370 } |
2327 } | 2371 } |
2328 | 2372 |
2329 } // namespace net | 2373 } // namespace net |
OLD | NEW |