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/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/test/histogram_tester.h" | 13 #include "base/test/histogram_tester.h" |
14 #include "base/threading/platform_thread.h" | |
15 #include "base/time/time.h" | 14 #include "base/time/time.h" |
16 #include "build/build_config.h" | 15 #include "build/build_config.h" |
17 #include "net/base/network_change_notifier.h" | 16 #include "net/base/network_change_notifier.h" |
18 #include "net/base/network_quality.h" | 17 #include "net/base/network_quality.h" |
19 #include "net/test/embedded_test_server/embedded_test_server.h" | 18 #include "net/test/embedded_test_server/embedded_test_server.h" |
20 #include "net/url_request/url_request_test_util.h" | 19 #include "net/url_request/url_request_test_util.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
22 #include "url/gurl.h" | 21 #include "url/gurl.h" |
23 | 22 |
24 namespace net { | 23 namespace net { |
25 | 24 |
26 TEST(NetworkQualityEstimatorTest, TestPeakKbpsFastestRTTUpdates) { | 25 TEST(NetworkQualityEstimatorTest, TestPeakKbpsFastestRTTUpdates) { |
27 net::test_server::EmbeddedTestServer embedded_test_server; | 26 net::test_server::EmbeddedTestServer embedded_test_server; |
28 embedded_test_server.ServeFilesFromDirectory( | 27 embedded_test_server.ServeFilesFromDirectory( |
29 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); | 28 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); |
30 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady()); | 29 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady()); |
31 | 30 |
32 // Enable requests to local host to be used for network quality estimation. | 31 // Enable requests to local host to be used for network quality estimation. |
33 NetworkQualityEstimator estimator(true); | 32 NetworkQualityEstimator estimator(true, true); |
34 { | 33 { |
35 NetworkQuality network_quality = estimator.GetPeakEstimate(); | 34 NetworkQuality network_quality = estimator.GetPeakEstimate(); |
36 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max()); | 35 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max()); |
37 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); | 36 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); |
38 } | 37 } |
39 | 38 |
40 TestDelegate test_delegate; | 39 TestDelegate test_delegate; |
41 TestURLRequestContext context(false); | 40 TestURLRequestContext context(false); |
42 | 41 |
43 uint64_t min_transfer_size_in_bytes = | |
44 NetworkQualityEstimator::kMinTransferSizeInBytes; | |
45 base::TimeDelta request_duration = base::TimeDelta::FromMicroseconds( | |
46 NetworkQualityEstimator::kMinRequestDurationMicroseconds); | |
47 | |
48 scoped_ptr<URLRequest> request( | 42 scoped_ptr<URLRequest> request( |
49 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), | 43 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), |
50 DEFAULT_PRIORITY, &test_delegate)); | 44 DEFAULT_PRIORITY, &test_delegate)); |
51 request->Start(); | 45 request->Start(); |
52 | 46 |
53 base::RunLoop().Run(); | 47 base::RunLoop().Run(); |
54 | 48 |
55 base::PlatformThread::Sleep(request_duration); | 49 // Both RTT and downstream throughput should be updated. |
56 | 50 estimator.NotifyDataReceived(*request, 1000, 1000); |
57 // With smaller transfer, RTT will be updated but not the downstream | |
58 // throughput. | |
59 estimator.NotifyDataReceived(*request, min_transfer_size_in_bytes - 1, | |
60 min_transfer_size_in_bytes - 1); | |
61 { | 51 { |
62 NetworkQuality network_quality = estimator.GetPeakEstimate(); | 52 NetworkQuality network_quality = estimator.GetPeakEstimate(); |
63 EXPECT_GT(network_quality.rtt(), base::TimeDelta()); | 53 EXPECT_GT(network_quality.rtt(), base::TimeDelta()); |
64 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); | 54 EXPECT_LT(network_quality.rtt(), base::TimeDelta::Max()); |
| 55 EXPECT_GE(network_quality.downstream_throughput_kbps(), 1); |
65 } | 56 } |
66 | 57 |
67 // With large transfer, both RTT and downlink throughput will be updated. | |
68 estimator.NotifyDataReceived(*request, min_transfer_size_in_bytes, | |
69 min_transfer_size_in_bytes); | |
70 { | |
71 NetworkQuality network_quality = estimator.GetPeakEstimate(); | |
72 EXPECT_GE(network_quality.rtt(), request_duration); | |
73 EXPECT_GT(network_quality.downstream_throughput_kbps(), 0); | |
74 EXPECT_LE( | |
75 network_quality.downstream_throughput_kbps(), | |
76 min_transfer_size_in_bytes * 8.0 / request_duration.InMilliseconds()); | |
77 } | |
78 EXPECT_LT(estimator.fastest_rtt_since_last_connection_change_, | |
79 base::TimeDelta::Max()); | |
80 | |
81 // Check UMA histograms. | 58 // Check UMA histograms. |
82 base::HistogramTester histogram_tester; | 59 base::HistogramTester histogram_tester; |
83 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 0); | 60 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 0); |
84 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 0); | 61 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 0); |
85 | 62 |
86 estimator.OnConnectionTypeChanged( | 63 estimator.OnConnectionTypeChanged( |
87 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); | 64 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); |
88 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 1); | 65 histogram_tester.ExpectTotalCount("NQE.PeakKbps.Unknown", 1); |
89 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 1); | 66 histogram_tester.ExpectTotalCount("NQE.FastestRTT.Unknown", 1); |
90 { | 67 { |
91 NetworkQuality network_quality = estimator.GetPeakEstimate(); | 68 NetworkQuality network_quality = estimator.GetPeakEstimate(); |
92 EXPECT_EQ(estimator.current_connection_type_, | 69 EXPECT_EQ(estimator.current_connection_type_, |
93 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); | 70 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); |
94 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max()); | 71 EXPECT_EQ(network_quality.rtt(), base::TimeDelta::Max()); |
95 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); | 72 EXPECT_EQ(network_quality.downstream_throughput_kbps(), 0); |
96 } | 73 } |
97 } | 74 } |
98 | 75 |
99 TEST(NetworkQualityEstimatorTest, StoreObservations) { | 76 TEST(NetworkQualityEstimatorTest, StoreObservations) { |
100 net::test_server::EmbeddedTestServer embedded_test_server; | 77 net::test_server::EmbeddedTestServer embedded_test_server; |
101 embedded_test_server.ServeFilesFromDirectory( | 78 embedded_test_server.ServeFilesFromDirectory( |
102 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); | 79 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); |
103 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady()); | 80 ASSERT_TRUE(embedded_test_server.InitializeAndWaitUntilReady()); |
104 | 81 |
105 NetworkQualityEstimator estimator(true); | 82 NetworkQualityEstimator estimator(true, true); |
106 TestDelegate test_delegate; | 83 TestDelegate test_delegate; |
107 TestURLRequestContext context(false); | 84 TestURLRequestContext context(false); |
108 | 85 |
109 uint64 min_transfer_size_in_bytes = | |
110 NetworkQualityEstimator::kMinTransferSizeInBytes; | |
111 base::TimeDelta request_duration = base::TimeDelta::FromMicroseconds( | |
112 NetworkQualityEstimator::kMinRequestDurationMicroseconds); | |
113 | |
114 // Push 10 more observations than the maximum buffer size. | 86 // Push 10 more observations than the maximum buffer size. |
115 for (size_t i = 0; | 87 for (size_t i = 0; |
116 i < estimator.GetMaximumObservationBufferSizeForTests() + 10U; ++i) { | 88 i < estimator.GetMaximumObservationBufferSizeForTests() + 10U; ++i) { |
117 scoped_ptr<URLRequest> request( | 89 scoped_ptr<URLRequest> request( |
118 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), | 90 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), |
119 DEFAULT_PRIORITY, &test_delegate)); | 91 DEFAULT_PRIORITY, &test_delegate)); |
120 request->Start(); | 92 request->Start(); |
121 base::RunLoop().Run(); | 93 base::RunLoop().Run(); |
122 base::PlatformThread::Sleep(request_duration); | |
123 | 94 |
124 estimator.NotifyDataReceived(*request, min_transfer_size_in_bytes, | 95 estimator.NotifyDataReceived(*request, 1000, 1000); |
125 min_transfer_size_in_bytes); | |
126 } | 96 } |
127 | 97 |
128 EXPECT_TRUE(estimator.VerifyBufferSizeForTests( | 98 EXPECT_TRUE(estimator.VerifyBufferSizeForTests( |
129 estimator.GetMaximumObservationBufferSizeForTests())); | 99 estimator.GetMaximumObservationBufferSizeForTests())); |
130 | 100 |
131 // Verify that the stored observations are cleared on network change. | 101 // Verify that the stored observations are cleared on network change. |
132 estimator.OnConnectionTypeChanged( | 102 estimator.OnConnectionTypeChanged( |
133 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); | 103 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI); |
134 EXPECT_TRUE(estimator.VerifyBufferSizeForTests(0U)); | 104 EXPECT_TRUE(estimator.VerifyBufferSizeForTests(0U)); |
135 | 105 |
136 scoped_ptr<URLRequest> request( | 106 scoped_ptr<URLRequest> request( |
137 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), | 107 context.CreateRequest(embedded_test_server.GetURL("/echo.html"), |
138 DEFAULT_PRIORITY, &test_delegate)); | 108 DEFAULT_PRIORITY, &test_delegate)); |
139 | 109 |
140 // Verify that overflow protection works. | 110 // Verify that overflow protection works. |
141 request->Start(); | 111 request->Start(); |
142 base::RunLoop().Run(); | 112 base::RunLoop().Run(); |
143 base::PlatformThread::Sleep(request_duration); | |
144 estimator.NotifyDataReceived(*request, std::numeric_limits<int64_t>::max(), | 113 estimator.NotifyDataReceived(*request, std::numeric_limits<int64_t>::max(), |
145 std::numeric_limits<int64_t>::max()); | 114 std::numeric_limits<int64_t>::max()); |
146 { | 115 { |
147 NetworkQuality network_quality = estimator.GetPeakEstimate(); | 116 NetworkQuality network_quality = estimator.GetPeakEstimate(); |
148 EXPECT_EQ(std::numeric_limits<int32_t>::max() - 1, | 117 EXPECT_EQ(std::numeric_limits<int32_t>::max() - 1, |
149 network_quality.downstream_throughput_kbps()); | 118 network_quality.downstream_throughput_kbps()); |
150 } | 119 } |
151 } | 120 } |
152 | 121 |
153 } // namespace net | 122 } // namespace net |
OLD | NEW |