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 <stdint.h> | 7 #include <stdint.h> |
8 | |
8 #include <limits> | 9 #include <limits> |
9 #include <map> | 10 #include <map> |
11 #include <string> | |
10 #include <utility> | 12 #include <utility> |
11 #include <vector> | 13 #include <vector> |
12 | 14 |
13 #include "base/files/file_path.h" | 15 #include "base/files/file_path.h" |
14 #include "base/logging.h" | 16 #include "base/logging.h" |
15 #include "base/macros.h" | 17 #include "base/macros.h" |
16 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
17 #include "base/metrics/histogram_samples.h" | 19 #include "base/metrics/histogram_samples.h" |
18 #include "base/run_loop.h" | 20 #include "base/run_loop.h" |
19 #include "base/strings/string_number_conversions.h" | 21 #include "base/strings/string_number_conversions.h" |
20 #include "base/test/histogram_tester.h" | 22 #include "base/test/histogram_tester.h" |
21 #include "base/time/time.h" | 23 #include "base/time/time.h" |
22 #include "build/build_config.h" | 24 #include "build/build_config.h" |
23 #include "net/base/external_estimate_provider.h" | 25 #include "net/base/external_estimate_provider.h" |
24 #include "net/base/load_flags.h" | 26 #include "net/base/load_flags.h" |
25 #include "net/base/network_change_notifier.h" | 27 #include "net/base/network_change_notifier.h" |
28 #include "net/http/http_network_session.h" | |
26 #include "net/http/http_status_code.h" | 29 #include "net/http/http_status_code.h" |
27 #include "net/test/embedded_test_server/embedded_test_server.h" | 30 #include "net/test/embedded_test_server/embedded_test_server.h" |
28 #include "net/test/embedded_test_server/http_request.h" | 31 #include "net/test/embedded_test_server/http_request.h" |
29 #include "net/test/embedded_test_server/http_response.h" | 32 #include "net/test/embedded_test_server/http_response.h" |
33 #include "net/url_request/url_request.h" | |
30 #include "net/url_request/url_request_test_util.h" | 34 #include "net/url_request/url_request_test_util.h" |
31 #include "testing/gtest/include/gtest/gtest.h" | 35 #include "testing/gtest/include/gtest/gtest.h" |
32 #include "url/gurl.h" | 36 #include "url/gurl.h" |
33 | 37 |
34 namespace { | 38 namespace { |
35 | 39 |
36 // Helps in setting the current network type and id. | 40 // Helps in setting the current network type and id. |
37 class TestNetworkQualityEstimator : public net::NetworkQualityEstimator { | 41 class TestNetworkQualityEstimator : public net::NetworkQualityEstimator { |
38 public: | 42 public: |
39 TestNetworkQualityEstimator( | 43 TestNetworkQualityEstimator( |
40 const std::map<std::string, std::string>& variation_params, | 44 const std::map<std::string, std::string>& variation_params, |
41 scoped_ptr<net::ExternalEstimateProvider> external_estimate_provider) | 45 scoped_ptr<net::ExternalEstimateProvider> external_estimate_provider) |
42 : NetworkQualityEstimator(std::move(external_estimate_provider), | 46 : NetworkQualityEstimator(std::move(external_estimate_provider), |
43 variation_params, | 47 variation_params, |
44 true, | 48 true, |
45 true) { | 49 true), |
50 watcher_reset_notification_received_(false) { | |
46 // Set up embedded test server. | 51 // Set up embedded test server. |
47 embedded_test_server_.ServeFilesFromDirectory( | 52 embedded_test_server_.ServeFilesFromDirectory( |
48 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); | 53 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest"))); |
49 EXPECT_TRUE(embedded_test_server_.Start()); | 54 EXPECT_TRUE(embedded_test_server_.Start()); |
50 embedded_test_server_.RegisterRequestHandler(base::Bind( | 55 embedded_test_server_.RegisterRequestHandler(base::Bind( |
51 &TestNetworkQualityEstimator::HandleRequest, base::Unretained(this))); | 56 &TestNetworkQualityEstimator::HandleRequest, base::Unretained(this))); |
52 } | 57 } |
53 | 58 |
54 explicit TestNetworkQualityEstimator( | 59 explicit TestNetworkQualityEstimator( |
55 const std::map<std::string, std::string>& variation_params) | 60 const std::map<std::string, std::string>& variation_params) |
(...skipping 21 matching lines...) Expand all Loading... | |
77 http_response->set_content("hello"); | 82 http_response->set_content("hello"); |
78 http_response->set_content_type("text/plain"); | 83 http_response->set_content_type("text/plain"); |
79 return std::move(http_response); | 84 return std::move(http_response); |
80 } | 85 } |
81 | 86 |
82 // Returns a GURL hosted at embedded test server. | 87 // Returns a GURL hosted at embedded test server. |
83 const GURL GetEchoURL() const { | 88 const GURL GetEchoURL() const { |
84 return embedded_test_server_.GetURL("/echo.html"); | 89 return embedded_test_server_.GetURL("/echo.html"); |
85 } | 90 } |
86 | 91 |
92 void OnWatcherReset() override { | |
93 watcher_reset_notification_received_ = true; | |
94 } | |
95 | |
96 bool watcher_reset_notification_received() const { | |
97 return watcher_reset_notification_received_; | |
98 } | |
99 | |
87 using NetworkQualityEstimator::ReadCachedNetworkQualityEstimate; | 100 using NetworkQualityEstimator::ReadCachedNetworkQualityEstimate; |
88 using NetworkQualityEstimator::OnConnectionTypeChanged; | 101 using NetworkQualityEstimator::OnConnectionTypeChanged; |
89 | 102 |
90 private: | 103 private: |
91 // NetworkQualityEstimator implementation that returns the overridden network | 104 // NetworkQualityEstimator implementation that returns the overridden network |
92 // id (instead of invoking platform APIs). | 105 // id (instead of invoking platform APIs). |
93 NetworkQualityEstimator::NetworkID GetCurrentNetworkID() const override { | 106 NetworkQualityEstimator::NetworkID GetCurrentNetworkID() const override { |
94 return NetworkQualityEstimator::NetworkID(current_network_type_, | 107 return NetworkQualityEstimator::NetworkID(current_network_type_, |
95 current_network_id_); | 108 current_network_id_); |
96 } | 109 } |
97 | 110 |
98 net::NetworkChangeNotifier::ConnectionType current_network_type_; | 111 net::NetworkChangeNotifier::ConnectionType current_network_type_; |
99 std::string current_network_id_; | 112 std::string current_network_id_; |
100 | 113 |
101 // Embedded server used for testing. | 114 // Embedded server used for testing. |
102 net::EmbeddedTestServer embedded_test_server_; | 115 net::EmbeddedTestServer embedded_test_server_; |
103 | 116 |
117 bool watcher_reset_notification_received_; | |
118 | |
104 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator); | 119 DISALLOW_COPY_AND_ASSIGN(TestNetworkQualityEstimator); |
105 }; | 120 }; |
106 | 121 |
107 class TestRTTObserver : public net::NetworkQualityEstimator::RTTObserver { | 122 class TestRTTObserver : public net::NetworkQualityEstimator::RTTObserver { |
108 public: | 123 public: |
109 struct Observation { | 124 struct Observation { |
110 Observation(int32_t ms, | 125 Observation(int32_t ms, |
111 const base::TimeTicks& ts, | 126 const base::TimeTicks& ts, |
112 net::NetworkQualityEstimator::ObservationSource src) | 127 net::NetworkQualityEstimator::ObservationSource src) |
113 : rtt_ms(ms), timestamp(ts), source(src) {} | 128 : rtt_ms(ms), timestamp(ts), source(src) {} |
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1086 quic_watcher->OnUpdatedRTTAvailable(quic_rtt); | 1101 quic_watcher->OnUpdatedRTTAvailable(quic_rtt); |
1087 | 1102 |
1088 EXPECT_EQ(4U, rtt_observer.observations().size()); | 1103 EXPECT_EQ(4U, rtt_observer.observations().size()); |
1089 EXPECT_EQ(2U, throughput_observer.observations().size()); | 1104 EXPECT_EQ(2U, throughput_observer.observations().size()); |
1090 | 1105 |
1091 EXPECT_EQ(tcp_rtt.InMilliseconds(), rtt_observer.observations().at(2).rtt_ms); | 1106 EXPECT_EQ(tcp_rtt.InMilliseconds(), rtt_observer.observations().at(2).rtt_ms); |
1092 EXPECT_EQ(quic_rtt.InMilliseconds(), | 1107 EXPECT_EQ(quic_rtt.InMilliseconds(), |
1093 rtt_observer.observations().at(3).rtt_ms); | 1108 rtt_observer.observations().at(3).rtt_ms); |
1094 } | 1109 } |
1095 | 1110 |
1111 // TestTCPSocketRTT requires kernel support for tcp_info struct, and so it is | |
1112 // enabled only on the Linux platform. | |
1113 #if defined(OS_LINUX) | |
1114 #define MAYBE_TestTCPSocketRTT TestTCPSocketRTT | |
1115 #else | |
1116 #define MAYBE_TestTCPSocketRTT DISABLED_TestTCPSocketRTT | |
1117 #endif | |
1118 // Tests that TCP RTTs are notified by the TCP socket to the Network Quality | |
bengr
2016/02/16 16:41:17
// Tests that the TCP socket notifies the Network
tbansal1
2016/02/17 02:53:33
Done.
| |
1119 // Estimator, which in turn notifies to the registered RTT observers. | |
1120 TEST(NetworkQualityEstimatorTest, MAYBE_TestTCPSocketRTT) { | |
1121 TestRTTObserver rtt_observer; | |
1122 std::map<std::string, std::string> variation_params; | |
1123 TestNetworkQualityEstimator estimator(variation_params); | |
1124 estimator.AddRTTObserver(&rtt_observer); | |
1125 | |
1126 TestDelegate test_delegate; | |
1127 TestURLRequestContext context(true); | |
1128 context.set_network_quality_estimator(&estimator); | |
1129 | |
1130 scoped_ptr<HttpNetworkSession::Params> params(new HttpNetworkSession::Params); | |
1131 // |estimator| should be notified of TCP RTT observations. | |
1132 params->socket_performance_watcher_factory = &estimator; | |
1133 context.set_http_network_session_params(std::move(params)); | |
1134 context.Init(); | |
1135 | |
1136 EXPECT_EQ(0U, rtt_observer.observations().size()); | |
1137 EXPECT_FALSE(estimator.watcher_reset_notification_received()); | |
1138 | |
1139 // Send two requests. Verify that the completion of each request generates at | |
1140 // least one TCP RTT observation. | |
1141 for (size_t i = 0; i < 2; ++i) { | |
1142 size_t before_count_tcp_rtt_observations = 0; | |
1143 for (auto observation : rtt_observer.observations()) { | |
1144 if (observation.source == NetworkQualityEstimator::TCP) | |
1145 ++before_count_tcp_rtt_observations; | |
1146 } | |
1147 | |
1148 scoped_ptr<URLRequest> request(context.CreateRequest( | |
1149 estimator.GetEchoURL(), DEFAULT_PRIORITY, &test_delegate)); | |
1150 request->Start(); | |
1151 base::RunLoop().Run(); | |
1152 | |
1153 size_t after_count_tcp_rtt_observations = 0; | |
1154 for (auto observation : rtt_observer.observations()) { | |
1155 if (observation.source == NetworkQualityEstimator::TCP) | |
1156 ++after_count_tcp_rtt_observations; | |
1157 } | |
1158 EXPECT_LT(before_count_tcp_rtt_observations, | |
1159 after_count_tcp_rtt_observations) | |
1160 << i; | |
1161 } | |
1162 | |
1163 EXPECT_TRUE(estimator.watcher_reset_notification_received()); | |
1164 } | |
1165 | |
1096 } // namespace net | 1166 } // namespace net |
OLD | NEW |