| Index: net/nqe/network_quality_estimator_unittest.cc
|
| diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
|
| index 36d12bb32a398a8a41e2fd2c6a2d2dd8161adc60..7af79f185187ac01ad91f654d5b6ca25164350c6 100644
|
| --- a/net/nqe/network_quality_estimator_unittest.cc
|
| +++ b/net/nqe/network_quality_estimator_unittest.cc
|
| @@ -118,6 +118,17 @@ class TestRTTObserver : public NetworkQualityEstimator::RTTObserver {
|
| observations_.push_back(Observation(rtt_ms, timestamp, source));
|
| }
|
|
|
| + // Returns the last received RTT observation that has source set to |source|.
|
| + base::TimeDelta last_rtt(NetworkQualityObservationSource source) {
|
| + for (std::vector<Observation>::reverse_iterator i = observations_.rbegin();
|
| + i != observations_.rend(); ++i) {
|
| + Observation observation = *i;
|
| + if (observation.source == source)
|
| + return base::TimeDelta::FromMilliseconds(observation.rtt_ms);
|
| + }
|
| + return nqe::internal::InvalidRTT();
|
| + }
|
| +
|
| private:
|
| std::vector<Observation> observations_;
|
| };
|
| @@ -343,6 +354,10 @@ TEST(NetworkQualityEstimatorTest, Caching) {
|
| TestThroughputObserver throughput_observer;
|
| estimator.AddThroughputObserver(&throughput_observer);
|
|
|
| + // |observer| should be notified as soon as it is added.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(1U, observer.effective_connection_types().size());
|
| +
|
| estimator.SimulateNetworkChange(
|
| NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test");
|
| histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", true,
|
| @@ -353,7 +368,9 @@ TEST(NetworkQualityEstimatorTest, Caching) {
|
| // Verify that the cached network quality was read, and observers were
|
| // notified. |observer| must be notified once right after it was added, and
|
| // once again after the cached network quality was read.
|
| - EXPECT_EQ(2U, observer.effective_connection_types().size());
|
| + EXPECT_LE(2U, observer.effective_connection_types().size());
|
| + EXPECT_EQ(estimator.GetEffectiveConnectionType(),
|
| + observer.effective_connection_types().back());
|
| EXPECT_EQ(1U, rtt_observer.observations().size());
|
| EXPECT_EQ(1U, throughput_observer.observations().size());
|
| }
|
| @@ -2570,4 +2587,114 @@ TEST(NetworkQualityEstimatorTest, TypicalNetworkQualities) {
|
| }
|
| }
|
|
|
| +// Verify that the cached network qualities from the prefs are correctly used.
|
| +TEST(NetworkQualityEstimatorTest, OnPrefsRead) {
|
| + base::HistogramTester histogram_tester;
|
| +
|
| + // Construct the read prefs.
|
| + std::map<nqe::internal::NetworkID, nqe::internal::CachedNetworkQuality>
|
| + read_prefs;
|
| + read_prefs[nqe::internal::NetworkID(NetworkChangeNotifier::CONNECTION_WIFI,
|
| + "test_ect_2g")] =
|
| + nqe::internal::CachedNetworkQuality(EFFECTIVE_CONNECTION_TYPE_2G);
|
| + read_prefs[nqe::internal::NetworkID(NetworkChangeNotifier::CONNECTION_WIFI,
|
| + "test_ect_slow_2g")] =
|
| + nqe::internal::CachedNetworkQuality(EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
|
| + read_prefs[nqe::internal::NetworkID(NetworkChangeNotifier::CONNECTION_4G,
|
| + "test_ect_4g")] =
|
| + nqe::internal::CachedNetworkQuality(EFFECTIVE_CONNECTION_TYPE_4G);
|
| +
|
| + std::map<std::string, std::string> variation_params;
|
| + variation_params["effective_connection_type_algorithm"] =
|
| + "TransportRTTOrDownstreamThroughput";
|
| + // Disable default platform values so that the effect of cached estimates
|
| + // at the time of startup can be studied in isolation.
|
| + TestNetworkQualityEstimator estimator(
|
| + std::unique_ptr<net::ExternalEstimateProvider>(), variation_params, true,
|
| + true, false /* use_default_platform_values */);
|
| +
|
| + // Add observers.
|
| + TestRTTObserver rtt_observer;
|
| + TestThroughputObserver throughput_observer;
|
| + TestRTTAndThroughputEstimatesObserver rtt_throughput_observer;
|
| + TestEffectiveConnectionTypeObserver effective_connection_type_observer;
|
| + estimator.AddRTTObserver(&rtt_observer);
|
| + estimator.AddThroughputObserver(&throughput_observer);
|
| + estimator.AddRTTAndThroughputEstimatesObserver(&rtt_throughput_observer);
|
| + estimator.AddEffectiveConnectionTypeObserver(
|
| + &effective_connection_type_observer);
|
| +
|
| + std::string network_name("test_ect_2g");
|
| +
|
| + estimator.SimulateNetworkChange(
|
| + NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, network_name);
|
| + EXPECT_EQ(0u, rtt_observer.observations().size());
|
| + EXPECT_EQ(0u, throughput_observer.observations().size());
|
| + EXPECT_LE(0, rtt_throughput_observer.notifications_received());
|
| +
|
| + // Simulate reading of prefs.
|
| + estimator.OnPrefsRead(read_prefs);
|
| + histogram_tester.ExpectUniqueSample("NQE.Prefs.ReadSize", read_prefs.size(),
|
| + 1);
|
| +
|
| + // Taken from network_quality_estimator_params.cc.
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(1800),
|
| + rtt_observer.last_rtt(
|
| + NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE));
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(1500),
|
| + rtt_observer.last_rtt(
|
| + NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE));
|
| + EXPECT_EQ(0u, throughput_observer.observations().size());
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(1800),
|
| + rtt_throughput_observer.http_rtt());
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(1500),
|
| + rtt_throughput_observer.transport_rtt());
|
| + EXPECT_EQ(nqe::internal::kInvalidThroughput,
|
| + rtt_throughput_observer.downstream_throughput_kbps());
|
| + EXPECT_LE(
|
| + 1u,
|
| + effective_connection_type_observer.effective_connection_types().size());
|
| + // Compare the ECT stored in prefs with the observer's last entry.
|
| + EXPECT_EQ(
|
| + read_prefs[nqe::internal::NetworkID(
|
| + NetworkChangeNotifier::CONNECTION_WIFI, network_name)]
|
| + .effective_connection_type(),
|
| + effective_connection_type_observer.effective_connection_types().back());
|
| +
|
| + // Change to a different connection type.
|
| + network_name = "test_ect_slow_2g";
|
| + estimator.SimulateNetworkChange(
|
| + NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, network_name);
|
| +
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(3600),
|
| + rtt_observer.last_rtt(
|
| + NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE));
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(3000),
|
| + rtt_observer.last_rtt(
|
| + NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE));
|
| + EXPECT_EQ(0u, throughput_observer.observations().size());
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(3600),
|
| + rtt_throughput_observer.http_rtt());
|
| + EXPECT_EQ(base::TimeDelta::FromMilliseconds(3000),
|
| + rtt_throughput_observer.transport_rtt());
|
| + EXPECT_EQ(nqe::internal::kInvalidThroughput,
|
| + rtt_throughput_observer.downstream_throughput_kbps());
|
| + EXPECT_LE(
|
| + 2u,
|
| + effective_connection_type_observer.effective_connection_types().size());
|
| + // Compare with the last entry.
|
| + EXPECT_EQ(
|
| + read_prefs[nqe::internal::NetworkID(
|
| + NetworkChangeNotifier::CONNECTION_WIFI, network_name)]
|
| + .effective_connection_type(),
|
| + effective_connection_type_observer.effective_connection_types().back());
|
| +
|
| + // Cleanup.
|
| + estimator.RemoveRTTObserver(&rtt_observer);
|
| + estimator.RemoveThroughputObserver(&throughput_observer);
|
| + estimator.RemoveRTTAndThroughputEstimatesObserver(&rtt_throughput_observer);
|
| + estimator.RemoveEffectiveConnectionTypeObserver(
|
| + &effective_connection_type_observer);
|
| +}
|
| +
|
| } // namespace net
|
|
|