OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/http/http_server_properties_manager.h" | 5 #include "net/http/http_server_properties_manager.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 base::Closure prefs_changed_callback_; | 76 base::Closure prefs_changed_callback_; |
77 | 77 |
78 DISALLOW_COPY_AND_ASSIGN(MockPrefDelegate); | 78 DISALLOW_COPY_AND_ASSIGN(MockPrefDelegate); |
79 }; | 79 }; |
80 | 80 |
81 class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { | 81 class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { |
82 public: | 82 public: |
83 TestingHttpServerPropertiesManager( | 83 TestingHttpServerPropertiesManager( |
84 HttpServerPropertiesManager::PrefDelegate* pref_delegate, | 84 HttpServerPropertiesManager::PrefDelegate* pref_delegate, |
85 scoped_refptr<TestMockTimeTaskRunner> pref_task_runner, | 85 scoped_refptr<TestMockTimeTaskRunner> pref_task_runner, |
86 scoped_refptr<TestMockTimeTaskRunner> net_task_runner) | 86 scoped_refptr<TestMockTimeTaskRunner> net_task_runner, |
| 87 base::TickClock* clock) |
87 : HttpServerPropertiesManager(pref_delegate, | 88 : HttpServerPropertiesManager(pref_delegate, |
88 pref_task_runner, | 89 pref_task_runner, |
89 net_task_runner), | 90 net_task_runner, |
| 91 clock), |
90 pref_task_runner_(std::move(pref_task_runner)), | 92 pref_task_runner_(std::move(pref_task_runner)), |
91 net_task_runner_(std::move(net_task_runner)) { | 93 net_task_runner_(std::move(net_task_runner)) { |
92 // This call must run in the context of |net_task_runner_|. | 94 // This call must run in the context of |net_task_runner_|. |
93 TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_); | 95 TestMockTimeTaskRunner::ScopedContext scoped_context(net_task_runner_); |
94 HttpServerPropertiesManager::InitializeOnNetworkSequence(); | 96 HttpServerPropertiesManager::InitializeOnNetworkSequence(); |
95 } | 97 } |
96 | 98 |
97 ~TestingHttpServerPropertiesManager() override {} | 99 ~TestingHttpServerPropertiesManager() override {} |
98 | 100 |
99 // Make these methods public for testing. | 101 // Make these methods public for testing. |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 // to version 4, delete the following code. | 159 // to version 4, delete the following code. |
158 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; | 160 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; |
159 | 161 |
160 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { | 162 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { |
161 protected: | 163 protected: |
162 HttpServerPropertiesManagerTest() = default; | 164 HttpServerPropertiesManagerTest() = default; |
163 | 165 |
164 void SetUp() override { | 166 void SetUp() override { |
165 one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1); | 167 one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1); |
166 pref_delegate_ = new MockPrefDelegate; | 168 pref_delegate_ = new MockPrefDelegate; |
| 169 net_test_task_runner_clock_ = net_test_task_runner_->GetMockTickClock(); |
167 http_server_props_manager_.reset( | 170 http_server_props_manager_.reset( |
168 new StrictMock<TestingHttpServerPropertiesManager>( | 171 new StrictMock<TestingHttpServerPropertiesManager>( |
169 pref_delegate_, pref_test_task_runner_.task_runner(), | 172 pref_delegate_, pref_test_task_runner_.task_runner(), |
170 net_test_task_runner_)); | 173 net_test_task_runner_, net_test_task_runner_clock_.get())); |
171 | 174 |
172 EXPECT_FALSE(http_server_props_manager_->IsInitialized()); | 175 EXPECT_FALSE(http_server_props_manager_->IsInitialized()); |
173 ExpectCacheUpdate(); | 176 ExpectCacheUpdate(); |
174 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 177 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
175 pref_test_task_runner_->RunUntilIdle(); | 178 pref_test_task_runner_->RunUntilIdle(); |
176 net_test_task_runner_->RunUntilIdle(); | 179 net_test_task_runner_->RunUntilIdle(); |
177 EXPECT_TRUE(http_server_props_manager_->IsInitialized()); | 180 EXPECT_TRUE(http_server_props_manager_->IsInitialized()); |
178 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 181 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
179 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 182 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
180 } | 183 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 // Overrides the main thread's message loop with a mock tick clock. Making the | 245 // Overrides the main thread's message loop with a mock tick clock. Making the |
243 // main thread the |pref_test_task_runner_| matches expectations better than | 246 // main thread the |pref_test_task_runner_| matches expectations better than |
244 // having an independent TestMockTimeTaskRunner and makes tests easier to | 247 // having an independent TestMockTimeTaskRunner and makes tests easier to |
245 // write. | 248 // write. |
246 base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_; | 249 base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_; |
247 | 250 |
248 // Mock the net task runner as well. | 251 // Mock the net task runner as well. |
249 scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ = | 252 scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ = |
250 new TestMockTimeTaskRunner; | 253 new TestMockTimeTaskRunner; |
251 | 254 |
| 255 std::unique_ptr<base::TickClock> net_test_task_runner_clock_; |
| 256 |
252 private: | 257 private: |
253 DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManagerTest); | 258 DISALLOW_COPY_AND_ASSIGN(HttpServerPropertiesManagerTest); |
254 }; | 259 }; |
255 | 260 |
256 INSTANTIATE_TEST_CASE_P(/* no prefix */, | 261 INSTANTIATE_TEST_CASE_P(/* no prefix */, |
257 HttpServerPropertiesManagerTest, | 262 HttpServerPropertiesManagerTest, |
258 ::testing::ValuesIn(kHttpServerPropertiesVersions)); | 263 ::testing::ValuesIn(kHttpServerPropertiesVersions)); |
259 | 264 |
260 TEST_P(HttpServerPropertiesManagerTest, | 265 TEST_P(HttpServerPropertiesManagerTest, |
261 SingleUpdateForTwoSpdyServerPrefChanges) { | 266 SingleUpdateForTwoSpdyServerPrefChanges) { |
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1151 EXPECT_EQ(i, alternative_service_info_vector[0].alternative_service().port); | 1156 EXPECT_EQ(i, alternative_service_info_vector[0].alternative_service().port); |
1152 } | 1157 } |
1153 | 1158 |
1154 // Verify SupportsQuic. | 1159 // Verify SupportsQuic. |
1155 IPAddress address; | 1160 IPAddress address; |
1156 ASSERT_TRUE(http_server_props_manager_->GetSupportsQuic(&address)); | 1161 ASSERT_TRUE(http_server_props_manager_->GetSupportsQuic(&address)); |
1157 EXPECT_EQ("127.0.0.1", address.ToString()); | 1162 EXPECT_EQ("127.0.0.1", address.ToString()); |
1158 } | 1163 } |
1159 | 1164 |
1160 TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) { | 1165 TEST_P(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) { |
1161 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(5); | 1166 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(7); |
1162 | 1167 |
1163 const url::SchemeHostPort server_www("https", "www.google.com", 80); | 1168 const url::SchemeHostPort server_www("https", "www.google.com", 80); |
1164 const url::SchemeHostPort server_mail("https", "mail.google.com", 80); | 1169 const url::SchemeHostPort server_mail("https", "mail.google.com", 80); |
1165 | 1170 |
1166 // #1 & #2: Set alternate protocol. | 1171 // #1 & #2: Set alternate protocol. |
1167 AlternativeServiceInfoVector alternative_service_info_vector; | 1172 AlternativeServiceInfoVector alternative_service_info_vector; |
1168 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443); | 1173 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443); |
1169 base::Time expiration1; | 1174 base::Time expiration1; |
1170 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1)); | 1175 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1)); |
1171 alternative_service_info_vector.push_back( | 1176 alternative_service_info_vector.push_back( |
1172 AlternativeServiceInfo(www_alternative_service1, expiration1)); | 1177 AlternativeServiceInfo(www_alternative_service1, expiration1)); |
1173 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com", | 1178 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com", |
1174 1234); | 1179 1234); |
1175 base::Time expiration2; | 1180 base::Time expiration2; |
1176 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2)); | 1181 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2)); |
1177 alternative_service_info_vector.push_back( | 1182 alternative_service_info_vector.push_back( |
1178 AlternativeServiceInfo(www_alternative_service2, expiration2)); | 1183 AlternativeServiceInfo(www_alternative_service2, expiration2)); |
1179 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( | 1184 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( |
1180 server_www, alternative_service_info_vector)); | 1185 server_www, alternative_service_info_vector)); |
1181 | 1186 |
1182 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com", | 1187 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com", |
1183 444); | 1188 444); |
1184 base::Time expiration3 = base::Time::Max(); | 1189 base::Time expiration3 = base::Time::Max(); |
1185 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService( | 1190 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService( |
1186 server_mail, mail_alternative_service, expiration3)); | 1191 server_mail, mail_alternative_service, expiration3)); |
1187 | 1192 |
1188 // #3: Set ServerNetworkStats. | 1193 // #3 & #4: Mark alternate protocol broken/recently broken. |
| 1194 { |
| 1195 base::TestMockTimeTaskRunner::ScopedContext net_test_task_runner_context( |
| 1196 net_test_task_runner_); |
| 1197 |
| 1198 http_server_props_manager_->MarkAlternativeServiceBroken( |
| 1199 www_alternative_service2); |
| 1200 http_server_props_manager_->MarkAlternativeServiceRecentlyBroken( |
| 1201 mail_alternative_service); |
| 1202 } |
| 1203 |
| 1204 // #5: Set ServerNetworkStats. |
1189 ServerNetworkStats stats; | 1205 ServerNetworkStats stats; |
1190 stats.srtt = base::TimeDelta::FromInternalValue(42); | 1206 stats.srtt = base::TimeDelta::FromInternalValue(42); |
1191 http_server_props_manager_->SetServerNetworkStats(server_mail, stats); | 1207 http_server_props_manager_->SetServerNetworkStats(server_mail, stats); |
1192 | 1208 |
1193 // #4: Set quic_server_info string. | 1209 // #6: Set quic_server_info string. |
1194 QuicServerId mail_quic_server_id("mail.google.com", 80); | 1210 QuicServerId mail_quic_server_id("mail.google.com", 80); |
1195 std::string quic_server_info1("quic_server_info1"); | 1211 std::string quic_server_info1("quic_server_info1"); |
1196 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, | 1212 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, |
1197 quic_server_info1); | 1213 quic_server_info1); |
1198 | 1214 |
1199 // #5: Set SupportsQuic. | 1215 // #7: Set SupportsQuic. |
1200 IPAddress actual_address(127, 0, 0, 1); | 1216 IPAddress actual_address(127, 0, 0, 1); |
1201 http_server_props_manager_->SetSupportsQuic(true, actual_address); | 1217 http_server_props_manager_->SetSupportsQuic(true, actual_address); |
1202 | 1218 |
1203 // Update Prefs. | 1219 // Update Prefs. |
| 1220 // |net_test_task_runner_| has a remaining pending task to expire |
| 1221 // |www_alternative_service2| in 5 minutes. Fast forward enough such |
| 1222 // that the prefs update task is executed but not the task to expire |
| 1223 // |broken_alternative_service|. |
1204 ExpectPrefsUpdate(1); | 1224 ExpectPrefsUpdate(1); |
1205 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); | 1225 EXPECT_EQ(2u, net_test_task_runner_->GetPendingTaskCount()); |
1206 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1226 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1207 net_test_task_runner_->FastForwardUntilNoTasksRemain(); | 1227 net_test_task_runner_->FastForwardBy( |
| 1228 HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting()); |
| 1229 EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
1208 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); | 1230 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
1209 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | 1231 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
1210 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1232 EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
1211 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1233 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1212 | 1234 |
| 1235 // Verify |pref_delegate_|'s server dict. |
| 1236 // Broken alternative services' expiration times are converted from TimeTicks |
| 1237 // to Time before being written to JSON by using the difference between |
| 1238 // Time::Now() and TimeTicks::Now(). Since there's currently no dependency |
| 1239 // injection for Time::Now(), there's no straightforward way of figuring out |
| 1240 // what the expiration time should be in JSON. Because of this, the brokenness |
| 1241 // expiration time of alternative services will not be verified. A copy of |
| 1242 // |pref_delegate_|'s server dict will be created, and the broken alternative |
| 1243 // service's expiration time will be replaced with a placeholder string before |
| 1244 // comparison. |
| 1245 |
| 1246 base::Value server_value_copy(pref_delegate_->GetServerProperties()); |
| 1247 |
| 1248 base::DictionaryValue* server_dict; |
| 1249 ASSERT_TRUE(server_value_copy.GetAsDictionary(&server_dict)); |
| 1250 base::ListValue* broken_alt_svc_list; |
| 1251 ASSERT_TRUE(server_dict->GetList("broken_alternative_services", |
| 1252 &broken_alt_svc_list)); |
| 1253 EXPECT_EQ(1u, broken_alt_svc_list->GetSize()); |
| 1254 base::DictionaryValue* broken_alt_svcs_list_entry; |
| 1255 ASSERT_TRUE( |
| 1256 broken_alt_svc_list->GetDictionary(0, &broken_alt_svcs_list_entry)); |
| 1257 EXPECT_EQ(1u, broken_alt_svcs_list_entry->size()); |
| 1258 std::string broken_alt_svcs_list_entry_expiration_str; |
| 1259 EXPECT_TRUE(broken_alt_svcs_list_entry->GetStringWithoutPathExpansion( |
| 1260 "h2 www.google.com:1234", &broken_alt_svcs_list_entry_expiration_str)); |
| 1261 broken_alt_svcs_list_entry->SetStringWithoutPathExpansion( |
| 1262 "h2 www.google.com:1234", "NOT CHECKED"); |
| 1263 |
1213 // Verify preferences. | 1264 // Verify preferences. |
1214 const char expected_json[] = | 1265 const char expected_json[] = |
1215 "{\"quic_servers\":{\"https://" | 1266 "{" |
1216 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}}," | 1267 "\"broken_alternative_services\":" |
| 1268 "[{\"h2 www.google.com:1234\":\"NOT CHECKED\"}]," |
| 1269 "\"quic_servers\":" |
| 1270 "{\"https://mail.google.com:80\":" |
| 1271 "{\"server_info\":\"quic_server_info1\"}}," |
| 1272 "\"recently_broken_alternative_services\":" |
| 1273 "[{\"h2 www.google.com:1234\":1},{\"h2 foo.google.com:444\":1}]," |
1217 "\"servers\":[" | 1274 "\"servers\":[" |
1218 "{\"https://www.google.com:80\":{" | 1275 "{\"https://www.google.com:80\":{" |
1219 "\"alternative_service\":[{\"expiration\":\"13756212000000000\"," | 1276 "\"alternative_service\":[{\"expiration\":\"13756212000000000\"," |
1220 "\"port\":443,\"protocol_str\":\"h2\"}," | 1277 "\"port\":443,\"protocol_str\":\"h2\"}," |
1221 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\"," | 1278 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\"," |
1222 "\"port\":1234,\"protocol_str\":\"h2\"}]}}," | 1279 "\"port\":1234,\"protocol_str\":\"h2\"}]}}," |
1223 "{\"https://mail.google.com:80\":{\"alternative_service\":[{" | 1280 "{\"https://mail.google.com:80\":{\"alternative_service\":[{" |
1224 "\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\"," | 1281 "\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\"," |
1225 "\"port\":444,\"protocol_str\":\"h2\"}]," | 1282 "\"port\":444,\"protocol_str\":\"h2\"}]," |
1226 "\"network_stats\":{\"srtt\":42}}}" | 1283 "\"network_stats\":{\"srtt\":42}}}" |
1227 "]," | 1284 "]," |
1228 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true}," | 1285 "\"supports_quic\":" |
1229 "\"version\":5}"; | 1286 "{\"address\":\"127.0.0.1\",\"used_quic\":true}," |
| 1287 "\"version\":5" |
| 1288 "}"; |
1230 | 1289 |
1231 const base::Value* http_server_properties = | |
1232 &pref_delegate_->GetServerProperties(); | |
1233 std::string preferences_json; | 1290 std::string preferences_json; |
1234 EXPECT_TRUE( | 1291 EXPECT_TRUE(base::JSONWriter::Write(server_value_copy, &preferences_json)); |
1235 base::JSONWriter::Write(*http_server_properties, &preferences_json)); | |
1236 EXPECT_EQ(expected_json, preferences_json); | 1292 EXPECT_EQ(expected_json, preferences_json); |
1237 } | 1293 } |
1238 | 1294 |
1239 TEST_P(HttpServerPropertiesManagerTest, | 1295 TEST_P(HttpServerPropertiesManagerTest, |
1240 SingleCacheUpdateForMultipleUpdatesScheduled) { | 1296 SingleCacheUpdateForMultipleUpdatesScheduled) { |
1241 // Update cache. | 1297 // Update cache. |
1242 ExpectCacheUpdate(); | 1298 ExpectCacheUpdate(); |
1243 | 1299 |
1244 EXPECT_EQ(0u, pref_test_task_runner_->GetPendingTaskCount()); | 1300 EXPECT_EQ(0u, pref_test_task_runner_->GetPendingTaskCount()); |
1245 // Update cache. | 1301 // Update cache. |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1335 | 1391 |
1336 const url::SchemeHostPort server("http", "example.com", 80); | 1392 const url::SchemeHostPort server("http", "example.com", 80); |
1337 AlternativeServiceMap alternative_service_map(/*max_size=*/5); | 1393 AlternativeServiceMap alternative_service_map(/*max_size=*/5); |
1338 EXPECT_FALSE(http_server_props_manager_->AddToAlternativeServiceMap( | 1394 EXPECT_FALSE(http_server_props_manager_->AddToAlternativeServiceMap( |
1339 server, *server_dict, &alternative_service_map)); | 1395 server, *server_dict, &alternative_service_map)); |
1340 | 1396 |
1341 AlternativeServiceMap::iterator it = alternative_service_map.Get(server); | 1397 AlternativeServiceMap::iterator it = alternative_service_map.Get(server); |
1342 EXPECT_EQ(alternative_service_map.end(), it); | 1398 EXPECT_EQ(alternative_service_map.end(), it); |
1343 } | 1399 } |
1344 | 1400 |
1345 // Do not persist expired or broken alternative service entries to disk. | 1401 // Do not persist expired alternative service entries to disk. |
1346 TEST_P(HttpServerPropertiesManagerTest, | 1402 TEST_P(HttpServerPropertiesManagerTest, DoNotPersistExpiredAlternativeService) { |
1347 DoNotPersistExpiredOrBrokenAlternativeService) { | |
1348 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(2); | 1403 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(2); |
1349 | 1404 |
1350 { | 1405 { |
1351 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); | 1406 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
1352 | 1407 |
1353 AlternativeServiceInfoVector alternative_service_info_vector; | 1408 AlternativeServiceInfoVector alternative_service_info_vector; |
1354 | 1409 |
1355 const AlternativeService broken_alternative_service( | 1410 const AlternativeService broken_alternative_service( |
1356 kProtoHTTP2, "broken.example.com", 443); | 1411 kProtoHTTP2, "broken.example.com", 443); |
1357 const base::Time time_one_day_later = | 1412 const base::Time time_one_day_later = |
(...skipping 22 matching lines...) Expand all Loading... |
1380 server, alternative_service_info_vector)); | 1435 server, alternative_service_info_vector)); |
1381 } | 1436 } |
1382 | 1437 |
1383 // Update cache. | 1438 // Update cache. |
1384 ExpectPrefsUpdate(1); | 1439 ExpectPrefsUpdate(1); |
1385 | 1440 |
1386 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); | 1441 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
1387 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1442 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1388 | 1443 |
1389 // |net_test_task_runner_| has a remaining pending task to expire | 1444 // |net_test_task_runner_| has a remaining pending task to expire |
1390 // |broken_alternative_service| |time_one_day_later| (and the impl uses | 1445 // |broken_alternative_service| |time_one_day_later|. Fast forward enough such |
1391 // TimeTicks::Now() without a mock clock so FastForwardUntilNoTasksRemain() | 1446 // that the prefs update task is executed but not the task to expire |
1392 // would result in an infinite loop). | 1447 // |broken_alternative_service|. |
| 1448 EXPECT_EQ(2U, net_test_task_runner_->GetPendingTaskCount()); |
1393 net_test_task_runner_->FastForwardBy( | 1449 net_test_task_runner_->FastForwardBy( |
1394 HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting()); | 1450 HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting()); |
1395 EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount()); | 1451 EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount()); |
1396 | 1452 |
1397 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); | 1453 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
1398 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | 1454 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
1399 EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount()); | 1455 EXPECT_EQ(1U, net_test_task_runner_->GetPendingTaskCount()); |
1400 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1456 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1401 | 1457 |
1402 const base::DictionaryValue& pref_dict = | 1458 const base::DictionaryValue& pref_dict = |
1403 pref_delegate_->GetServerProperties(); | 1459 pref_delegate_->GetServerProperties(); |
1404 | 1460 |
1405 const base::ListValue* servers_list = nullptr; | 1461 const base::ListValue* servers_list = nullptr; |
1406 ASSERT_TRUE(pref_dict.GetListWithoutPathExpansion("servers", &servers_list)); | 1462 ASSERT_TRUE(pref_dict.GetListWithoutPathExpansion("servers", &servers_list)); |
1407 base::ListValue::const_iterator it = servers_list->begin(); | 1463 base::ListValue::const_iterator it = servers_list->begin(); |
1408 const base::DictionaryValue* server_pref_dict; | 1464 const base::DictionaryValue* server_pref_dict; |
1409 ASSERT_TRUE(it->GetAsDictionary(&server_pref_dict)); | 1465 ASSERT_TRUE(it->GetAsDictionary(&server_pref_dict)); |
1410 | 1466 |
1411 const base::DictionaryValue* example_pref_dict; | 1467 const base::DictionaryValue* example_pref_dict; |
1412 | 1468 |
1413 ASSERT_TRUE(server_pref_dict->GetDictionaryWithoutPathExpansion( | 1469 ASSERT_TRUE(server_pref_dict->GetDictionaryWithoutPathExpansion( |
1414 "https://www.example.com", &example_pref_dict)); | 1470 "https://www.example.com", &example_pref_dict)); |
1415 | 1471 |
1416 const base::ListValue* altsvc_list; | 1472 const base::ListValue* altsvc_list; |
1417 ASSERT_TRUE(example_pref_dict->GetList("alternative_service", &altsvc_list)); | 1473 ASSERT_TRUE(example_pref_dict->GetList("alternative_service", &altsvc_list)); |
1418 | 1474 |
1419 ASSERT_EQ(1u, altsvc_list->GetSize()); | 1475 ASSERT_EQ(2u, altsvc_list->GetSize()); |
1420 | 1476 |
1421 const base::DictionaryValue* altsvc_entry; | 1477 const base::DictionaryValue* altsvc_entry; |
| 1478 std::string hostname; |
| 1479 |
1422 ASSERT_TRUE(altsvc_list->GetDictionary(0, &altsvc_entry)); | 1480 ASSERT_TRUE(altsvc_list->GetDictionary(0, &altsvc_entry)); |
| 1481 ASSERT_TRUE(altsvc_entry->GetString("host", &hostname)); |
| 1482 EXPECT_EQ("broken.example.com", hostname); |
1423 | 1483 |
1424 std::string hostname; | 1484 ASSERT_TRUE(altsvc_list->GetDictionary(1, &altsvc_entry)); |
1425 ASSERT_TRUE(altsvc_entry->GetString("host", &hostname)); | 1485 ASSERT_TRUE(altsvc_entry->GetString("host", &hostname)); |
1426 EXPECT_EQ("valid.example.com", hostname); | 1486 EXPECT_EQ("valid.example.com", hostname); |
1427 } | 1487 } |
1428 | 1488 |
1429 // Test that expired alternative service entries on disk are ignored. | 1489 // Test that expired alternative service entries on disk are ignored. |
1430 TEST_P(HttpServerPropertiesManagerTest, DoNotLoadExpiredAlternativeService) { | 1490 TEST_P(HttpServerPropertiesManagerTest, DoNotLoadExpiredAlternativeService) { |
1431 auto alternative_service_list = base::MakeUnique<base::ListValue>(); | 1491 auto alternative_service_list = base::MakeUnique<base::ListValue>(); |
1432 auto expired_dict = base::MakeUnique<base::DictionaryValue>(); | 1492 auto expired_dict = base::MakeUnique<base::DictionaryValue>(); |
1433 expired_dict->SetString("protocol_str", "h2"); | 1493 expired_dict->SetString("protocol_str", "h2"); |
1434 expired_dict->SetString("host", "expired.example.com"); | 1494 expired_dict->SetString("host", "expired.example.com"); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1563 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); | 1623 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
1564 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | 1624 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
1565 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1625 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
1566 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1626 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1567 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); | 1627 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
1568 http_server_props_manager_.reset(); | 1628 http_server_props_manager_.reset(); |
1569 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1629 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
1570 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1630 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1571 } | 1631 } |
1572 | 1632 |
| 1633 TEST_P(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) { |
| 1634 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(3); |
| 1635 |
| 1636 AlternativeService broken_service(kProtoQUIC, "cached_broken", 443); |
| 1637 AlternativeService broken_service2(kProtoQUIC, "cached_broken2", 443); |
| 1638 AlternativeService recently_broken_service(kProtoQUIC, "cached_rbroken", 443); |
| 1639 |
| 1640 { |
| 1641 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
| 1642 |
| 1643 http_server_props_manager_->MarkAlternativeServiceBroken(broken_service); |
| 1644 http_server_props_manager_->MarkAlternativeServiceBroken(broken_service2); |
| 1645 http_server_props_manager_->MarkAlternativeServiceRecentlyBroken( |
| 1646 recently_broken_service); |
| 1647 } |
| 1648 ExpectPrefsUpdate(1); |
| 1649 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1650 // Run the prefs update task but not the expiration task for |broken_service|. |
| 1651 net_test_task_runner_->FastForwardBy( |
| 1652 HttpServerPropertiesManager::GetUpdatePrefsDelayForTesting()); |
| 1653 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
| 1654 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
| 1655 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 1656 |
| 1657 // Load the |pref_delegate_| with some JSON to verify updating the cache from |
| 1658 // prefs. For the broken alternative service "www.google.com:1234", the |
| 1659 // expiration time will be computed to be |
| 1660 |
| 1661 std::string expiration_str = |
| 1662 base::Int64ToString(static_cast<int64_t>(one_day_from_now_.ToTimeT())); |
| 1663 |
| 1664 std::unique_ptr<base::Value> server_value = base::JSONReader::Read( |
| 1665 "{" |
| 1666 "\"broken_alternative_services\":[" |
| 1667 "{\"h2 www.google.com:1234\":\"" + |
| 1668 expiration_str + |
| 1669 "\"}," |
| 1670 "{\"quic cached_broken:443\":\"" + |
| 1671 expiration_str + |
| 1672 "\"}]," |
| 1673 "\"quic_servers\":{" |
| 1674 "\"https://mail.google.com:80\":{" |
| 1675 "\"server_info\":\"quic_server_info1\"" |
| 1676 "}" |
| 1677 "}," |
| 1678 "\"recently_broken_alternative_services\":[" |
| 1679 "{\"h2 www.google.com:1234\":1}," |
| 1680 "{\"quic cached_broken:443\":2}," |
| 1681 "{\"quic cached_rbroken:443\":3}]," |
| 1682 "\"servers\":[" |
| 1683 "{\"https://www.google.com:80\":{" |
| 1684 "\"alternative_service\":[" |
| 1685 "{\"expiration\":\"13756212000000000\",\"port\":443," |
| 1686 "\"protocol_str\":\"h2\"}," |
| 1687 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\"," |
| 1688 "\"port\":1234,\"protocol_str\":\"h2\"}" |
| 1689 "]" |
| 1690 "}}," |
| 1691 "{\"https://mail.google.com:80\":{" |
| 1692 "\"alternative_service\":[" |
| 1693 "{\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\"," |
| 1694 "\"port\":444,\"protocol_str\":\"h2\"}" |
| 1695 "]," |
| 1696 "\"network_stats\":{\"srtt\":42}" |
| 1697 "}}" |
| 1698 "]," |
| 1699 "\"supports_quic\":" |
| 1700 "{\"address\":\"127.0.0.1\",\"used_quic\":true}," |
| 1701 "\"version\":5" |
| 1702 "}"); |
| 1703 ASSERT_TRUE(server_value); |
| 1704 base::DictionaryValue* server_dict; |
| 1705 ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); |
| 1706 |
| 1707 pref_delegate_->SetPrefs(*server_dict); |
| 1708 |
| 1709 ExpectCacheUpdate(); |
| 1710 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
| 1711 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
| 1712 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1713 // Run the cache update task but not the expiration task for |broken_service|. |
| 1714 net_test_task_runner_->FastForwardBy( |
| 1715 net_test_task_runner_->NextPendingTaskDelay()); |
| 1716 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1717 |
| 1718 // |
| 1719 // Verify alternative service info for https://www.google.com |
| 1720 // |
| 1721 AlternativeServiceInfoVector alternative_service_info_vector = |
| 1722 http_server_props_manager_->GetAlternativeServiceInfos( |
| 1723 url::SchemeHostPort("https", "www.google.com", 80)); |
| 1724 ASSERT_EQ(2u, alternative_service_info_vector.size()); |
| 1725 |
| 1726 EXPECT_EQ(kProtoHTTP2, |
| 1727 alternative_service_info_vector[0].alternative_service().protocol); |
| 1728 EXPECT_EQ("www.google.com", |
| 1729 alternative_service_info_vector[0].alternative_service().host); |
| 1730 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port); |
| 1731 EXPECT_EQ( |
| 1732 "13756212000000000", |
| 1733 base::Int64ToString( |
| 1734 alternative_service_info_vector[0].expiration().ToInternalValue())); |
| 1735 |
| 1736 EXPECT_EQ(kProtoHTTP2, |
| 1737 alternative_service_info_vector[1].alternative_service().protocol); |
| 1738 EXPECT_EQ("www.google.com", |
| 1739 alternative_service_info_vector[1].alternative_service().host); |
| 1740 EXPECT_EQ(1234, |
| 1741 alternative_service_info_vector[1].alternative_service().port); |
| 1742 EXPECT_EQ( |
| 1743 "13758804000000000", |
| 1744 base::Int64ToString( |
| 1745 alternative_service_info_vector[1].expiration().ToInternalValue())); |
| 1746 |
| 1747 // |
| 1748 // Verify alternative service info for https://mail.google.com |
| 1749 // |
| 1750 alternative_service_info_vector = |
| 1751 http_server_props_manager_->GetAlternativeServiceInfos( |
| 1752 url::SchemeHostPort("https", "mail.google.com", 80)); |
| 1753 ASSERT_EQ(1u, alternative_service_info_vector.size()); |
| 1754 |
| 1755 EXPECT_EQ(kProtoHTTP2, |
| 1756 alternative_service_info_vector[0].alternative_service().protocol); |
| 1757 EXPECT_EQ("foo.google.com", |
| 1758 alternative_service_info_vector[0].alternative_service().host); |
| 1759 EXPECT_EQ(444, alternative_service_info_vector[0].alternative_service().port); |
| 1760 EXPECT_EQ( |
| 1761 "9223372036854775807", |
| 1762 base::Int64ToString( |
| 1763 alternative_service_info_vector[0].expiration().ToInternalValue())); |
| 1764 |
| 1765 // |
| 1766 // Verify broken alternative services. |
| 1767 // |
| 1768 AlternativeService prefs_broken_service(kProtoHTTP2, "www.google.com", 1234); |
| 1769 EXPECT_TRUE( |
| 1770 http_server_props_manager_->IsAlternativeServiceBroken(broken_service)); |
| 1771 EXPECT_TRUE( |
| 1772 http_server_props_manager_->IsAlternativeServiceBroken(broken_service2)); |
| 1773 EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1774 prefs_broken_service)); |
| 1775 // Verify brokenness expiration times. |
| 1776 // |broken_service|'s expiration time should've been overwritten by the prefs |
| 1777 // to be approximately 1 day from now. |
| 1778 // |broken_service2|'s expiration time should still be 5 minutes due to being |
| 1779 // marked broken. |
| 1780 // |prefs_broken_service|'s expiration time should be approximately 1 day from |
| 1781 // now which comes from the prefs. |
| 1782 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(4)); |
| 1783 EXPECT_TRUE( |
| 1784 http_server_props_manager_->IsAlternativeServiceBroken(broken_service)); |
| 1785 EXPECT_FALSE( |
| 1786 http_server_props_manager_->IsAlternativeServiceBroken(broken_service2)); |
| 1787 EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1788 prefs_broken_service)); |
| 1789 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromDays(1)); |
| 1790 EXPECT_FALSE( |
| 1791 http_server_props_manager_->IsAlternativeServiceBroken(broken_service)); |
| 1792 EXPECT_FALSE( |
| 1793 http_server_props_manager_->IsAlternativeServiceBroken(broken_service2)); |
| 1794 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1795 prefs_broken_service)); |
| 1796 |
| 1797 // Now that |prefs_broken_service|'s brokenness has expired, it should've |
| 1798 // been removed from the alternative services info vectors of all servers. |
| 1799 alternative_service_info_vector = |
| 1800 http_server_props_manager_->GetAlternativeServiceInfos( |
| 1801 url::SchemeHostPort("https", "www.google.com", 80)); |
| 1802 ASSERT_EQ(1u, alternative_service_info_vector.size()); |
| 1803 |
| 1804 // |
| 1805 // Verify recently broken alternative services. |
| 1806 // |
| 1807 |
| 1808 // If an entry is already in cache, the broken count in the prefs should |
| 1809 // overwrite the one in the cache. |
| 1810 // The entries already in the cache should remain at the front of the recency |
| 1811 // list. |
| 1812 // |pref_broken_service| should have broken-count 1 from prefs. |
| 1813 // |recently_broken_service| should have broken-count 3 from prefs. |
| 1814 // |broken_service| should have broken-count 2 from prefs. |
| 1815 // |broken_service2| should have broken-count 1 from being marked broken. |
| 1816 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(4); |
| 1817 ExpectPrefsUpdate(4); |
| 1818 |
| 1819 EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
| 1820 prefs_broken_service)); |
| 1821 EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
| 1822 recently_broken_service)); |
| 1823 EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
| 1824 broken_service)); |
| 1825 EXPECT_TRUE(http_server_props_manager_->WasAlternativeServiceRecentlyBroken( |
| 1826 broken_service2)); |
| 1827 // Make sure |pref_broken_service| has the right expiration delay if marked |
| 1828 // broken. |
| 1829 { |
| 1830 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
| 1831 http_server_props_manager_->MarkAlternativeServiceBroken( |
| 1832 prefs_broken_service); |
| 1833 } |
| 1834 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1835 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) - |
| 1836 base::TimeDelta::FromInternalValue(1)); |
| 1837 EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1838 prefs_broken_service)); |
| 1839 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 1840 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1841 prefs_broken_service)); |
| 1842 // Make sure |recently_broken_service| has the right expiration delay if |
| 1843 // marked broken. |
| 1844 { |
| 1845 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
| 1846 http_server_props_manager_->MarkAlternativeServiceBroken( |
| 1847 recently_broken_service); |
| 1848 } |
| 1849 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1850 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(40) - |
| 1851 base::TimeDelta::FromInternalValue(1)); |
| 1852 EXPECT_TRUE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1853 recently_broken_service)); |
| 1854 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 1855 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( |
| 1856 recently_broken_service)); |
| 1857 // Make sure |broken_service| has the right expiration delay if marked |
| 1858 // broken. |
| 1859 { |
| 1860 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
| 1861 http_server_props_manager_->MarkAlternativeServiceBroken(broken_service); |
| 1862 } |
| 1863 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1864 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(20) - |
| 1865 base::TimeDelta::FromInternalValue(1)); |
| 1866 EXPECT_TRUE( |
| 1867 http_server_props_manager_->IsAlternativeServiceBroken(broken_service)); |
| 1868 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 1869 EXPECT_FALSE( |
| 1870 http_server_props_manager_->IsAlternativeServiceBroken(broken_service)); |
| 1871 // Make sure |broken_service2| has the right expiration delay if marked |
| 1872 // broken. |
| 1873 { |
| 1874 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); |
| 1875 http_server_props_manager_->MarkAlternativeServiceBroken(broken_service2); |
| 1876 } |
| 1877 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 1878 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10) - |
| 1879 base::TimeDelta::FromInternalValue(1)); |
| 1880 EXPECT_TRUE( |
| 1881 http_server_props_manager_->IsAlternativeServiceBroken(broken_service2)); |
| 1882 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromInternalValue(1)); |
| 1883 EXPECT_FALSE( |
| 1884 http_server_props_manager_->IsAlternativeServiceBroken(broken_service2)); |
| 1885 |
| 1886 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
| 1887 |
| 1888 // |
| 1889 // Verify ServerNetworkStats. |
| 1890 // |
| 1891 const ServerNetworkStats* server_network_stats = |
| 1892 http_server_props_manager_->GetServerNetworkStats( |
| 1893 url::SchemeHostPort("https", "mail.google.com", 80)); |
| 1894 EXPECT_TRUE(server_network_stats); |
| 1895 EXPECT_EQ(server_network_stats->srtt, base::TimeDelta::FromInternalValue(42)); |
| 1896 |
| 1897 // |
| 1898 // Verify QUIC server info. |
| 1899 // |
| 1900 const std::string* quic_server_info = |
| 1901 http_server_props_manager_->GetQuicServerInfo( |
| 1902 QuicServerId("mail.google.com", 80)); |
| 1903 EXPECT_EQ("quic_server_info1", *quic_server_info); |
| 1904 |
| 1905 // |
| 1906 // Verify supports QUIC. |
| 1907 // |
| 1908 IPAddress actual_address(127, 0, 0, 1); |
| 1909 EXPECT_TRUE(http_server_props_manager_->GetSupportsQuic(&actual_address)); |
| 1910 } |
| 1911 |
1573 } // namespace net | 1912 } // namespace net |
OLD | NEW |