Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: net/nqe/network_quality_estimator_unittest.cc

Issue 2487883002: NQE: Use cached estimates (Closed)
Patch Set: bengr comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 111
112 std::vector<Observation>& observations() { return observations_; } 112 std::vector<Observation>& observations() { return observations_; }
113 113
114 // RttObserver implementation: 114 // RttObserver implementation:
115 void OnRTTObservation(int32_t rtt_ms, 115 void OnRTTObservation(int32_t rtt_ms,
116 const base::TimeTicks& timestamp, 116 const base::TimeTicks& timestamp,
117 NetworkQualityObservationSource source) override { 117 NetworkQualityObservationSource source) override {
118 observations_.push_back(Observation(rtt_ms, timestamp, source)); 118 observations_.push_back(Observation(rtt_ms, timestamp, source));
119 } 119 }
120 120
121 // Returns the last received RTT observation that has source set to |source|.
122 base::TimeDelta last_rtt(NetworkQualityObservationSource source) {
123 for (std::vector<Observation>::reverse_iterator i = observations_.rbegin();
124 i != observations_.rend(); ++i) {
125 Observation observation = *i;
126 if (observation.source == source)
127 return base::TimeDelta::FromMilliseconds(observation.rtt_ms);
128 }
129 return nqe::internal::InvalidRTT();
130 }
131
121 private: 132 private:
122 std::vector<Observation> observations_; 133 std::vector<Observation> observations_;
123 }; 134 };
124 135
125 class TestThroughputObserver 136 class TestThroughputObserver
126 : public NetworkQualityEstimator::ThroughputObserver { 137 : public NetworkQualityEstimator::ThroughputObserver {
127 public: 138 public:
128 struct Observation { 139 struct Observation {
129 Observation(int32_t kbps, 140 Observation(int32_t kbps,
130 const base::TimeTicks& ts, 141 const base::TimeTicks& ts,
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 1); 347 1);
337 348
338 // Add the observers before changing the network type. 349 // Add the observers before changing the network type.
339 TestEffectiveConnectionTypeObserver observer; 350 TestEffectiveConnectionTypeObserver observer;
340 estimator.AddEffectiveConnectionTypeObserver(&observer); 351 estimator.AddEffectiveConnectionTypeObserver(&observer);
341 TestRTTObserver rtt_observer; 352 TestRTTObserver rtt_observer;
342 estimator.AddRTTObserver(&rtt_observer); 353 estimator.AddRTTObserver(&rtt_observer);
343 TestThroughputObserver throughput_observer; 354 TestThroughputObserver throughput_observer;
344 estimator.AddThroughputObserver(&throughput_observer); 355 estimator.AddThroughputObserver(&throughput_observer);
345 356
357 // |observer| should be notified as soon as it is added.
358 base::RunLoop().RunUntilIdle();
359 EXPECT_EQ(1U, observer.effective_connection_types().size());
360
346 estimator.SimulateNetworkChange( 361 estimator.SimulateNetworkChange(
347 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test"); 362 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test");
348 histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", true, 363 histogram_tester.ExpectBucketCount("NQE.CachedNetworkQualityAvailable", true,
349 1); 364 1);
350 histogram_tester.ExpectTotalCount("NQE.CachedNetworkQualityAvailable", 2); 365 histogram_tester.ExpectTotalCount("NQE.CachedNetworkQualityAvailable", 2);
351 base::RunLoop().RunUntilIdle(); 366 base::RunLoop().RunUntilIdle();
352 367
353 // Verify that the cached network quality was read, and observers were 368 // Verify that the cached network quality was read, and observers were
354 // notified. |observer| must be notified once right after it was added, and 369 // notified. |observer| must be notified once right after it was added, and
355 // once again after the cached network quality was read. 370 // once again after the cached network quality was read.
356 EXPECT_EQ(2U, observer.effective_connection_types().size()); 371 EXPECT_LE(2U, observer.effective_connection_types().size());
372 EXPECT_EQ(estimator.GetEffectiveConnectionType(),
373 observer.effective_connection_types().back());
357 EXPECT_EQ(1U, rtt_observer.observations().size()); 374 EXPECT_EQ(1U, rtt_observer.observations().size());
358 EXPECT_EQ(1U, throughput_observer.observations().size()); 375 EXPECT_EQ(1U, throughput_observer.observations().size());
359 } 376 }
360 377
361 TEST(NetworkQualityEstimatorTest, StoreObservations) { 378 TEST(NetworkQualityEstimatorTest, StoreObservations) {
362 std::map<std::string, std::string> variation_params; 379 std::map<std::string, std::string> variation_params;
363 TestNetworkQualityEstimator estimator(variation_params); 380 TestNetworkQualityEstimator estimator(variation_params);
364 381
365 base::TimeDelta rtt; 382 base::TimeDelta rtt;
366 int32_t kbps; 383 int32_t kbps;
(...skipping 2196 matching lines...) Expand 10 before | Expand all | Expand 10 after
2563 request->SetLoadFlags(request->load_flags() | LOAD_MAIN_FRAME_DEPRECATED); 2580 request->SetLoadFlags(request->load_flags() | LOAD_MAIN_FRAME_DEPRECATED);
2564 request->Start(); 2581 request->Start();
2565 base::RunLoop().Run(); 2582 base::RunLoop().Run();
2566 2583
2567 EXPECT_EQ(effective_connection_type, 2584 EXPECT_EQ(effective_connection_type,
2568 estimator.GetEffectiveConnectionType()); 2585 estimator.GetEffectiveConnectionType());
2569 } 2586 }
2570 } 2587 }
2571 } 2588 }
2572 2589
2590 // Verify that the cached network qualities from the prefs are correctly used.
2591 TEST(NetworkQualityEstimatorTest, OnPrefsRead) {
2592 base::HistogramTester histogram_tester;
2593
2594 // Construct the read prefs.
2595 std::map<nqe::internal::NetworkID, nqe::internal::CachedNetworkQuality>
2596 read_prefs;
2597 read_prefs[nqe::internal::NetworkID(NetworkChangeNotifier::CONNECTION_WIFI,
2598 "test_ect_2g")] =
2599 nqe::internal::CachedNetworkQuality(EFFECTIVE_CONNECTION_TYPE_2G);
2600 read_prefs[nqe::internal::NetworkID(NetworkChangeNotifier::CONNECTION_WIFI,
2601 "test_ect_slow_2g")] =
2602 nqe::internal::CachedNetworkQuality(EFFECTIVE_CONNECTION_TYPE_SLOW_2G);
2603 read_prefs[nqe::internal::NetworkID(NetworkChangeNotifier::CONNECTION_4G,
2604 "test_ect_4g")] =
2605 nqe::internal::CachedNetworkQuality(EFFECTIVE_CONNECTION_TYPE_4G);
2606
2607 std::map<std::string, std::string> variation_params;
2608 variation_params["effective_connection_type_algorithm"] =
2609 "TransportRTTOrDownstreamThroughput";
2610 // Disable default platform values so that the effect of cached estimates
2611 // at the time of startup can be studied in isolation.
2612 TestNetworkQualityEstimator estimator(
2613 std::unique_ptr<net::ExternalEstimateProvider>(), variation_params, true,
2614 true, false /* use_default_platform_values */);
2615
2616 // Add observers.
2617 TestRTTObserver rtt_observer;
2618 TestThroughputObserver throughput_observer;
2619 TestRTTAndThroughputEstimatesObserver rtt_throughput_observer;
2620 TestEffectiveConnectionTypeObserver effective_connection_type_observer;
2621 estimator.AddRTTObserver(&rtt_observer);
2622 estimator.AddThroughputObserver(&throughput_observer);
2623 estimator.AddRTTAndThroughputEstimatesObserver(&rtt_throughput_observer);
2624 estimator.AddEffectiveConnectionTypeObserver(
2625 &effective_connection_type_observer);
2626
2627 std::string network_name("test_ect_2g");
2628
2629 estimator.SimulateNetworkChange(
2630 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, network_name);
2631 EXPECT_EQ(0u, rtt_observer.observations().size());
2632 EXPECT_EQ(0u, throughput_observer.observations().size());
2633 EXPECT_LE(0, rtt_throughput_observer.notifications_received());
2634
2635 // Simulate reading of prefs.
2636 estimator.OnPrefsRead(read_prefs);
2637 histogram_tester.ExpectUniqueSample("NQE.Prefs.ReadSize", read_prefs.size(),
2638 1);
2639
2640 // Taken from network_quality_estimator_params.cc.
2641 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1800),
2642 rtt_observer.last_rtt(
2643 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE));
2644 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1500),
2645 rtt_observer.last_rtt(
2646 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE));
2647 EXPECT_EQ(0u, throughput_observer.observations().size());
2648 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1800),
2649 rtt_throughput_observer.http_rtt());
2650 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1500),
2651 rtt_throughput_observer.transport_rtt());
2652 EXPECT_EQ(nqe::internal::kInvalidThroughput,
2653 rtt_throughput_observer.downstream_throughput_kbps());
2654 EXPECT_LE(
2655 1u,
2656 effective_connection_type_observer.effective_connection_types().size());
2657 // Compare the ECT stored in prefs with the observer's last entry.
2658 EXPECT_EQ(
2659 read_prefs[nqe::internal::NetworkID(
2660 NetworkChangeNotifier::CONNECTION_WIFI, network_name)]
2661 .effective_connection_type(),
2662 effective_connection_type_observer.effective_connection_types().back());
2663
2664 // Change to a different connection type.
2665 network_name = "test_ect_slow_2g";
2666 estimator.SimulateNetworkChange(
2667 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, network_name);
2668
2669 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3600),
2670 rtt_observer.last_rtt(
2671 NETWORK_QUALITY_OBSERVATION_SOURCE_HTTP_CACHED_ESTIMATE));
2672 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3000),
2673 rtt_observer.last_rtt(
2674 NETWORK_QUALITY_OBSERVATION_SOURCE_TRANSPORT_CACHED_ESTIMATE));
2675 EXPECT_EQ(0u, throughput_observer.observations().size());
2676 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3600),
2677 rtt_throughput_observer.http_rtt());
2678 EXPECT_EQ(base::TimeDelta::FromMilliseconds(3000),
2679 rtt_throughput_observer.transport_rtt());
2680 EXPECT_EQ(nqe::internal::kInvalidThroughput,
2681 rtt_throughput_observer.downstream_throughput_kbps());
2682 EXPECT_LE(
2683 2u,
2684 effective_connection_type_observer.effective_connection_types().size());
2685 // Compare with the last entry.
2686 EXPECT_EQ(
2687 read_prefs[nqe::internal::NetworkID(
2688 NetworkChangeNotifier::CONNECTION_WIFI, network_name)]
2689 .effective_connection_type(),
2690 effective_connection_type_observer.effective_connection_types().back());
2691
2692 // Cleanup.
2693 estimator.RemoveRTTObserver(&rtt_observer);
2694 estimator.RemoveThroughputObserver(&throughput_observer);
2695 estimator.RemoveRTTAndThroughputEstimatesObserver(&rtt_throughput_observer);
2696 estimator.RemoveEffectiveConnectionTypeObserver(
2697 &effective_connection_type_observer);
2698 }
2699
2573 } // namespace net 2700 } // namespace net
OLDNEW
« net/nqe/network_quality_estimator.cc ('K') | « net/nqe/network_quality_estimator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698