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

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

Issue 1144163008: Add in-memory caching of network quality estimates across network changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Paul's comments Created 5 years, 6 months 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/base/network_quality_estimator.h" 5 #include "net/base/network_quality_estimator.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/strings/safe_sprintf.h"
13 #include "base/test/histogram_tester.h" 14 #include "base/test/histogram_tester.h"
14 #include "base/time/time.h" 15 #include "base/time/time.h"
15 #include "build/build_config.h" 16 #include "build/build_config.h"
16 #include "net/base/network_change_notifier.h" 17 #include "net/base/network_change_notifier.h"
17 #include "net/base/network_quality.h" 18 #include "net/base/network_quality.h"
18 #include "net/test/embedded_test_server/embedded_test_server.h" 19 #include "net/test/embedded_test_server/embedded_test_server.h"
19 #include "net/url_request/url_request_test_util.h" 20 #include "net/url_request/url_request_test_util.h"
20 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
21 #include "url/gurl.h" 22 #include "url/gurl.h"
22 23
24 namespace {
25
26 // Helps in setting the current network type and id.
27 class TestNetworkQualityEstimator : public net::NetworkQualityEstimator {
28 public:
29 TestNetworkQualityEstimator() : NetworkQualityEstimator(true, true) {}
30
31 ~TestNetworkQualityEstimator() override {}
32
33 // Overrides the current network type and id.
34 // Notifies network quality estimator of change in connection.
35 void SimulateNetworkChangeTo(net::NetworkChangeNotifier::ConnectionType type,
36 std::string network_id) {
37 current_network_type_ = type;
38 current_network_id_ = network_id;
39 OnConnectionTypeChanged(type);
40 }
41
42 using NetworkQualityEstimator::GetNetworkQualityCacheSizeForTests;
43 using NetworkQualityEstimator::ReadCachedNetworkQualityEstimate;
44 using NetworkQualityEstimator::OnConnectionTypeChanged;
45
46 private:
47 // NetworkQualityEstimator implementation that returns the overridden network
48 // id (instead of invoking platform APIs).
49 NetworkQualityEstimator::NetworkID GetCurrentNetworkID() const override {
50 return NetworkQualityEstimator::NetworkID(current_network_type_,
51 current_network_id_);
52 }
53
54 net::NetworkChangeNotifier::ConnectionType current_network_type_;
55 std::string current_network_id_;
56 };
57
58 } // namespace
59
23 namespace net { 60 namespace net {
24 61
25 // http://crbug.com/492410 62 // http://crbug.com/492410
26 TEST(NetworkQualityEstimatorTest, DISABLED_TestPeakKbpsFastestRTTUpdates) { 63 TEST(NetworkQualityEstimatorTest, DISABLED_TestPeakKbpsFastestRTTUpdates) {
27 net::test_server::EmbeddedTestServer embedded_test_server; 64 net::test_server::EmbeddedTestServer embedded_test_server;
28 embedded_test_server.ServeFilesFromDirectory( 65 embedded_test_server.ServeFilesFromDirectory(
29 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 66 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
30 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady()); 67 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady());
31 68
32 // Enable requests to local host to be used for network quality estimation. 69 // Enable requests to local host to be used for network quality estimation.
33 NetworkQualityEstimator estimator(true, true); 70 TestNetworkQualityEstimator estimator;
34 { 71 {
35 NetworkQuality network_quality = estimator.GetPeakEstimate(); 72 NetworkQuality network_quality = estimator.GetPeakEstimate();
36 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max()); 73 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max());
37 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); 74 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0);
38 } 75 }
39 76
40 TestDelegate test_delegate; 77 TestDelegate test_delegate;
41 TestURLRequestContext context(false); 78 TestURLRequestContext context(false);
42 79
43 scoped_ptr<URLRequest> request( 80 scoped_ptr<URLRequest> request(
44 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), 81 context.CreateRequest(embedded_test_server.GetURL("/echo.html"),
45 DEFAULT_PRIORITY, &test_delegate)); 82 DEFAULT_PRIORITY, &test_delegate));
46 request->Start(); 83 request->Start();
47 84
48 base::RunLoop().Run(); 85 base::RunLoop().Run();
49 86
50 // Both RTT and downstream throughput should be updated. 87 // Both RTT and downstream throughput should be updated.
51 estimator.NotifyDataReceived(*request, 1000, 1000); 88 estimator.NotifyDataReceived(*request, 1000, 1000);
52 { 89 {
53 NetworkQuality network_quality = estimator.GetPeakEstimate(); 90 NetworkQuality network_quality = estimator.GetPeakEstimate();
54 EXPECT_GT(network_quality.rtt(), base::TimeDelta());
55 EXPECT_LT(network_quality.rtt(), base::TimeDelta::Max()); 91 EXPECT_LT(network_quality.rtt(), base::TimeDelta::Max());
56 EXPECT_GE(network_quality.downstream_throughput_kbps(), 1); 92 EXPECT_GE(network_quality.downstream_throughput_kbps(), 1);
57 } 93 }
58 94
59 // Check UMA histograms. 95 // Check UMA histograms.
60 base::HistogramTester histogram_tester; 96 base::HistogramTester histogram_tester;
61 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 0); 97 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 0);
62 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 0); 98 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 0);
63 99
64 estimator.OnConnectionTypeChanged( 100 estimator.SimulateNetworkChangeTo(
65 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); 101 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, std::string());
66 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 1); 102 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 1);
67 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 1); 103 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 1);
68 { 104 {
69 NetworkQuality network_quality = estimator.GetPeakEstimate(); 105 NetworkQuality network_quality = estimator.GetPeakEstimate();
70 EXPECT_EQ(estimator.current_connection_type_,
71 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI);
72 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max()); 106 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max());
73 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); 107 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0);
74 } 108 }
75 } 109 }
76 110
77 TEST(NetworkQualityEstimatorTest, StoreObservations) { 111 TEST(NetworkQualityEstimatorTest, StoreObservations) {
78 net::test_server::EmbeddedTestServer embedded_test_server; 112 net::test_server::EmbeddedTestServer embedded_test_server;
79 embedded_test_server.ServeFilesFromDirectory( 113 embedded_test_server.ServeFilesFromDirectory(
80 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); 114 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
81 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady()); 115 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady());
82 116
83 NetworkQualityEstimator estimator(true, true); 117 NetworkQualityEstimator estimator(true, true);
84 TestDelegate test_delegate; 118 TestDelegate test_delegate;
85 TestURLRequestContext context(false); 119 TestURLRequestContext context(false);
86 120
87 // Push 10 more observations than the maximum buffer size. 121 // Push 10 more observations than the maximum buffer size.
88 for (size_t i = 0; 122 for (size_t i = 0;
89 i < estimator.GetMaximumObservationBufferSizeForTests() + 10U; ++i) { 123 i < estimator.GetMaximumObservationBufferSizeForTests() + 10U; ++i) {
90 scoped_ptr<URLRequest> request( 124 scoped_ptr<URLRequest> request(
91 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), 125 context.CreateRequest(embedded_test_server.GetURL("/echo.html"),
92 DEFAULT_PRIORITY, &test_delegate)); 126 DEFAULT_PRIORITY, &test_delegate));
93 request->Start(); 127 request->Start();
94 base::RunLoop().Run(); 128 base::RunLoop().Run();
95 129
96 estimator.NotifyDataReceived(*request, 1000, 1000); 130 estimator.NotifyDataReceived(*request, 1000, 1000);
97 } 131 }
98 132
99 EXPECT_TRUE(estimator.VerifyBufferSizeForTests( 133 EXPECT_EQ(estimator.GetMaximumObservationBufferSizeForTests(),
100 estimator.GetMaximumObservationBufferSizeForTests())); 134 estimator.GetKbpsObservationBufferSizeForTests());
135 EXPECT_EQ(estimator.GetMaximumObservationBufferSizeForTests(),
136 estimator.GetRTTObservationBufferSizeForTests());
101 137
102 // Verify that the stored observations are cleared on network change. 138 // Verify that the stored observations are cleared on network change.
103 estimator.OnConnectionTypeChanged( 139 estimator.OnConnectionTypeChanged(
104 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); 140 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI);
105 EXPECT_TRUE(estimator.VerifyBufferSizeForTests(0U)); 141 EXPECT_EQ(0U, estimator.GetKbpsObservationBufferSizeForTests());
142 EXPECT_EQ(0U, estimator.GetRTTObservationBufferSizeForTests());
106 143
107 scoped_ptr<URLRequest> request( 144 scoped_ptr<URLRequest> request(
108 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), 145 context.CreateRequest(embedded_test_server.GetURL("/echo.html"),
109 DEFAULT_PRIORITY, &test_delegate)); 146 DEFAULT_PRIORITY, &test_delegate));
110 147
111 // Verify that overflow protection works. 148 // Verify that overflow protection works.
112 request->Start(); 149 request->Start();
113 base::RunLoop().Run(); 150 base::RunLoop().Run();
114 estimator.NotifyDataReceived(*request, std::numeric_limits<int64_t>::max(), 151 estimator.NotifyDataReceived(*request, std::numeric_limits<int64_t>::max(),
115 std::numeric_limits<int64_t>::max()); 152 std::numeric_limits<int64_t>::max());
116 { 153 {
117 NetworkQuality network_quality = estimator.GetPeakEstimate(); 154 NetworkQuality network_quality = estimator.GetPeakEstimate();
118 EXPECT_EQ(std::numeric_limits<int32_t>::max() - 1, 155 EXPECT_EQ(std::numeric_limits<int32_t>::max() - 1,
119 network_quality.downstream_throughput_kbps()); 156 network_quality.downstream_throughput_kbps());
120 } 157 }
121 } 158 }
122 159
160 // Test if the network estimates are cached when network change notification
161 // is invoked.
162 TEST(NetworkQualityEstimatorTest, TestCaching) {
163 TestNetworkQualityEstimator estimator;
164 size_t expected_cache_size = 0;
165 EXPECT_EQ(expected_cache_size,
166 estimator.GetNetworkQualityCacheSizeForTests());
167
168 // Cache entry will not be added for (NONE, "").
169 estimator.SimulateNetworkChangeTo(
170 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-1");
171 EXPECT_EQ(expected_cache_size,
172 estimator.GetNetworkQualityCacheSizeForTests());
173
174 // Entry will be added for (2G, "test1").
175 // Also, set the network quality for (2G, "test1") so that it is stored in
176 // the cache.
177 estimator.peak_kbps_since_last_connection_change_ = 1;
178 estimator.fastest_rtt_since_last_connection_change_ =
179 base::TimeDelta::FromMilliseconds(1000);
180 estimator.SimulateNetworkChangeTo(
181 NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-1");
182 EXPECT_EQ(++expected_cache_size,
183 estimator.GetNetworkQualityCacheSizeForTests());
184
185 // Entry will be added for (3G, "test1").
186 // Also, set the network quality for (3G, "test1") so that it is stored in
187 // the
188 // cache.
189 estimator.peak_kbps_since_last_connection_change_ = 2;
190 estimator.fastest_rtt_since_last_connection_change_ =
191 base::TimeDelta::FromMilliseconds(500);
192 estimator.SimulateNetworkChangeTo(
193 NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-2");
194 EXPECT_EQ(++expected_cache_size,
195 estimator.GetNetworkQualityCacheSizeForTests());
196
197 // Entry will be added for (3G, "test2").
198 estimator.SimulateNetworkChangeTo(
199 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-1");
200 EXPECT_EQ(++expected_cache_size,
201 estimator.GetNetworkQualityCacheSizeForTests());
202
203 // Read the network quality for (2G, "test-1").
204 EXPECT_TRUE(estimator.ReadCachedNetworkQualityEstimate());
205 EXPECT_EQ(1, estimator.peak_kbps_since_last_connection_change_);
206 EXPECT_EQ(base::TimeDelta::FromMilliseconds(1000),
207 estimator.fastest_rtt_since_last_connection_change_);
208 // No new entry should be added for (2G, "test1") since it already exists
209 // in the cache.
210 estimator.SimulateNetworkChangeTo(
211 NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-1");
212 EXPECT_EQ(expected_cache_size,
213 estimator.GetNetworkQualityCacheSizeForTests());
214
215 // Read the network quality for (3G, "test1").
216 EXPECT_TRUE(estimator.ReadCachedNetworkQualityEstimate());
217 EXPECT_EQ(2, estimator.peak_kbps_since_last_connection_change_);
218 EXPECT_EQ(base::TimeDelta::FromMilliseconds(500),
219 estimator.fastest_rtt_since_last_connection_change_);
220 // No new entry should be added for (3G, "test1") since it already exists
221 // in the cache.
222 estimator.SimulateNetworkChangeTo(
223 NetworkChangeNotifier::ConnectionType::CONNECTION_3G, "test-2");
224 EXPECT_EQ(expected_cache_size,
225 estimator.GetNetworkQualityCacheSizeForTests());
226
227 // Reading quality of (3G, "test2") should return true.
228 EXPECT_TRUE(estimator.ReadCachedNetworkQualityEstimate());
229 EXPECT_EQ(0, estimator.peak_kbps_since_last_connection_change_);
230 EXPECT_EQ(base::TimeDelta::Max(),
231 estimator.fastest_rtt_since_last_connection_change_);
232
233 // Reading quality of (2G, "test-3") should return false.
234 estimator.SimulateNetworkChangeTo(
235 NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test-3");
236 EXPECT_FALSE(estimator.ReadCachedNetworkQualityEstimate());
237 }
238
239 // Tests if the cache size remains bounded. Also, ensure that the cache is
240 // LRU.
241 TEST(NetworkQualityEstimatorTest, TestLRUCacheMaximumSize) {
242 TestNetworkQualityEstimator estimator;
243 estimator.SimulateNetworkChangeTo(
244 net::NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI,
245 std::string());
246 EXPECT_EQ(0U, estimator.GetNetworkQualityCacheSizeForTests());
247
248 char network_name[20];
249 // Add 100 more networks than the maximum size of the cache.
250 size_t network_count =
251 NetworkQualityEstimator::kMaximumNetworkQualityCacheSize + 100;
252
253 for (size_t i = 0; i < network_count; ++i) {
254 base::strings::SafeSPrintf(network_name, "%d", i);
255 estimator.SimulateNetworkChangeTo(
256 net::NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI,
257 network_name);
258 EXPECT_LE(estimator.GetNetworkQualityCacheSizeForTests(),
259 NetworkQualityEstimator::kMaximumNetworkQualityCacheSize)
260 << i;
261 }
262 // One more call so that the last network is also written to cache.
263 estimator.SimulateNetworkChangeTo(
264 net::NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI,
265 network_name);
266
267 EXPECT_EQ(NetworkQualityEstimator::kMaximumNetworkQualityCacheSize,
268 estimator.GetNetworkQualityCacheSizeForTests());
269
270 // Test that the cache is LRU by examining its contents.
271 for (size_t i = 0; i < network_count; ++i) {
272 // The first 100 networks should not be present in the cache.
273 bool expect_present_in_cache = i >= 100;
274 base::strings::SafeSPrintf(network_name, "%d", i);
275
276 NetworkQualityEstimator::NetworkID network_id(
277 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI, network_name);
278
279 bool found = estimator.cached_network_qualities_.find(network_id) !=
280 estimator.cached_network_qualities_.end();
281 EXPECT_EQ(expect_present_in_cache, found) << i;
282 }
283 }
284
123 } // namespace net 285 } // namespace net
OLDNEW
« net/base/network_quality_estimator.cc ('K') | « net/base/network_quality_estimator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698