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

Side by Side Diff: net/http/http_server_properties_manager_unittest.cc

Issue 2932953002: Persist broken and recently-broken alt-svcs to prefs in HttpServerPropertiesManager (Closed)
Patch Set: Removed BrokenAlternativeServices::Clear() so it can be added in a separate CL Created 3 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 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
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
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
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
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
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
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
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
OLDNEW
« net/http/http_server_properties_manager.cc ('K') | « net/http/http_server_properties_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698