1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/http/http_server_properties_manager.h"
6
7 #include <utility>
8
9 #include "base/feature_list.h"
10 #include "base/functional/bind.h"
11 #include "base/functional/callback.h"
12 #include "base/json/json_writer.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/memory/raw_ptr.h"
15 #include "base/run_loop.h"
16 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/stringprintf.h"
18 #include "base/task/single_thread_task_runner.h"
19 #include "base/test/bind.h"
20 #include "base/test/scoped_feature_list.h"
21 #include "base/test/values_test_util.h"
22 #include "base/time/default_tick_clock.h"
23 #include "base/time/time.h"
24 #include "base/values.h"
25 #include "net/base/features.h"
26 #include "net/base/ip_address.h"
27 #include "net/base/schemeful_site.h"
28 #include "net/http/http_network_session.h"
29 #include "net/http/http_server_properties.h"
30 #include "net/quic/quic_context.h"
31 #include "net/test/test_with_task_environment.h"
32 #include "testing/gmock/include/gmock/gmock.h"
33 #include "testing/gtest/include/gtest/gtest.h"
34 #include "url/gurl.h"
35
36 namespace net {
37
38 namespace {
39
40 using base::StringPrintf;
41 using ::testing::_;
42 using ::testing::AtLeast;
43 using ::testing::Invoke;
44 using ::testing::Mock;
45 using ::testing::StrictMock;
46
47 enum class NetworkAnonymizationKeyMode {
48 kDisabled,
49 kEnabled,
50 };
51
52 const NetworkAnonymizationKeyMode kNetworkAnonymizationKeyModes[] = {
53 NetworkAnonymizationKeyMode::kDisabled,
54 NetworkAnonymizationKeyMode::kEnabled,
55 };
56
SetNetworkAnonymizationKeyMode(NetworkAnonymizationKeyMode mode)57 std::unique_ptr<base::test::ScopedFeatureList> SetNetworkAnonymizationKeyMode(
58 NetworkAnonymizationKeyMode mode) {
59 auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
60 switch (mode) {
61 case NetworkAnonymizationKeyMode::kDisabled:
62 feature_list->InitAndDisableFeature(
63 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
64 break;
65 case NetworkAnonymizationKeyMode::kEnabled:
66 feature_list->InitAndEnableFeature(
67 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
68 break;
69 }
70 return feature_list;
71 }
72
73 class MockPrefDelegate : public net::HttpServerProperties::PrefDelegate {
74 public:
75 MockPrefDelegate() = default;
76
77 MockPrefDelegate(const MockPrefDelegate&) = delete;
78 MockPrefDelegate& operator=(const MockPrefDelegate&) = delete;
79
80 ~MockPrefDelegate() override = default;
81
82 // HttpServerProperties::PrefDelegate implementation.
GetServerProperties() const83 const base::Value::Dict& GetServerProperties() const override {
84 return prefs_;
85 }
86
SetServerProperties(base::Value::Dict dict,base::OnceClosure callback)87 void SetServerProperties(base::Value::Dict dict,
88 base::OnceClosure callback) override {
89 prefs_.clear();
90 prefs_.Merge(std::move(dict));
91 ++num_pref_updates_;
92 if (!prefs_changed_callback_.is_null())
93 std::move(prefs_changed_callback_).Run();
94 if (!extra_prefs_changed_callback_.is_null())
95 std::move(extra_prefs_changed_callback_).Run();
96 set_properties_callback_ = std::move(callback);
97 }
98
WaitForPrefLoad(base::OnceClosure callback)99 void WaitForPrefLoad(base::OnceClosure callback) override {
100 CHECK(prefs_changed_callback_.is_null());
101 prefs_changed_callback_ = std::move(callback);
102 }
103
InitializePrefs(base::Value::Dict dict)104 void InitializePrefs(base::Value::Dict dict) {
105 ASSERT_FALSE(prefs_changed_callback_.is_null());
106 prefs_ = std::move(dict);
107 std::move(prefs_changed_callback_).Run();
108 }
109
GetAndClearNumPrefUpdates()110 int GetAndClearNumPrefUpdates() {
111 int out = num_pref_updates_;
112 num_pref_updates_ = 0;
113 return out;
114 }
115
116 // Additional callback to call when prefs are updated, used to check prefs are
117 // updated on destruction.
set_extra_update_prefs_callback(base::OnceClosure callback)118 void set_extra_update_prefs_callback(base::OnceClosure callback) {
119 extra_prefs_changed_callback_ = std::move(callback);
120 }
121
122 // Returns the base::OnceCallback, if any, passed to the last call to
123 // SetServerProperties().
GetSetPropertiesCallback()124 base::OnceClosure GetSetPropertiesCallback() {
125 return std::move(set_properties_callback_);
126 }
127
128 private:
129 base::Value::Dict prefs_;
130 base::OnceClosure prefs_changed_callback_;
131 base::OnceClosure extra_prefs_changed_callback_;
132 int num_pref_updates_ = 0;
133
134 base::OnceClosure set_properties_callback_;
135 };
136
137 // Converts |server_info_map| to a base::Value::Dict by running it through an
138 // HttpServerPropertiesManager. Other fields are left empty.
ServerInfoMapToDict(const HttpServerProperties::ServerInfoMap & server_info_map)139 base::Value::Dict ServerInfoMapToDict(
140 const HttpServerProperties::ServerInfoMap& server_info_map) {
141 std::unique_ptr<MockPrefDelegate> pref_delegate =
142 std::make_unique<MockPrefDelegate>();
143 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
144 // Callback that shouldn't be invoked - this method short-circuits loading
145 // prefs by calling HttpServerPropertiesManager::WriteToPrefs() before prefs
146 // are loaded.
147 HttpServerPropertiesManager::OnPrefsLoadedCallback on_prefs_loaded_callback =
148 base::BindOnce(
149 [](std::unique_ptr<HttpServerProperties::ServerInfoMap>
150 server_info_map,
151 const IPAddress& last_quic_address,
152 std::unique_ptr<HttpServerProperties::QuicServerInfoMap>
153 quic_server_info_map,
154 std::unique_ptr<BrokenAlternativeServiceList>
155 broken_alternative_service_list,
156 std::unique_ptr<RecentlyBrokenAlternativeServices>
157 recently_broken_alternative_services) { ADD_FAILURE(); });
158 HttpServerPropertiesManager manager(
159 std::move(pref_delegate), std::move(on_prefs_loaded_callback),
160 10 /* max_server_configs_stored_in_properties */, nullptr /* net_log */,
161 base::DefaultTickClock::GetInstance());
162 manager.WriteToPrefs(
163 server_info_map, HttpServerPropertiesManager::GetCannonicalSuffix(),
164 IPAddress() /* last_quic_address */,
165 HttpServerProperties::QuicServerInfoMap(10),
166 BrokenAlternativeServiceList(), RecentlyBrokenAlternativeServices(10),
167 base::OnceClosure());
168
169 return unowned_pref_delegate->GetServerProperties().Clone();
170 }
171
172 // Does the inverse of ServerInfoMapToDict(). Ignores fields other than the
173 // ServerInfoMap.
DictToServerInfoMap(base::Value::Dict dict)174 std::unique_ptr<HttpServerProperties::ServerInfoMap> DictToServerInfoMap(
175 base::Value::Dict dict) {
176 std::unique_ptr<MockPrefDelegate> pref_delegate =
177 std::make_unique<MockPrefDelegate>();
178 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
179
180 std::unique_ptr<HttpServerProperties::ServerInfoMap> out;
181 bool callback_invoked = false;
182 HttpServerPropertiesManager::OnPrefsLoadedCallback on_prefs_loaded_callback =
183 base::BindLambdaForTesting(
184 [&](std::unique_ptr<HttpServerProperties::ServerInfoMap>
185 server_info_map,
186 const IPAddress& last_quic_address,
187 std::unique_ptr<HttpServerProperties::QuicServerInfoMap>
188 quic_server_info_map,
189 std::unique_ptr<BrokenAlternativeServiceList>
190 broken_alternative_service_list,
191 std::unique_ptr<RecentlyBrokenAlternativeServices>
192 recently_broken_alternative_services) {
193 ASSERT_FALSE(callback_invoked);
194 callback_invoked = true;
195 out = std::move(server_info_map);
196 });
197
198 HttpServerPropertiesManager manager(
199 std::move(pref_delegate), std::move(on_prefs_loaded_callback),
200 10 /* max_server_configs_stored_in_properties */, nullptr /* net_log */,
201 base::DefaultTickClock::GetInstance());
202
203 unowned_pref_delegate->InitializePrefs(std::move(dict));
204 EXPECT_TRUE(callback_invoked);
205 return out;
206 }
207
208 } // namespace
209
210 class HttpServerPropertiesManagerTest : public testing::Test,
211 public WithTaskEnvironment {
212 public:
213 HttpServerPropertiesManagerTest(const HttpServerPropertiesManagerTest&) =
214 delete;
215 HttpServerPropertiesManagerTest& operator=(
216 const HttpServerPropertiesManagerTest&) = delete;
217
218 protected:
HttpServerPropertiesManagerTest()219 HttpServerPropertiesManagerTest()
220 : WithTaskEnvironment(
221 base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
222
SetUp()223 void SetUp() override {
224 one_day_from_now_ = base::Time::Now() + base::Days(1);
225 advertised_versions_ = DefaultSupportedQuicVersions();
226 auto pref_delegate = std::make_unique<MockPrefDelegate>();
227 pref_delegate_ = pref_delegate.get();
228
229 http_server_props_ = std::make_unique<HttpServerProperties>(
230 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
231
232 EXPECT_FALSE(http_server_props_->IsInitialized());
233 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
234 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
235 }
236
237 // Wrapper around |pref_delegate_|'s InitializePrefs() method that has a
238 // couple extra expectations about whether any tasks are posted, and if a pref
239 // update is queued.
240 //
241 // |expect_pref_update| should be true if a pref update is expected to be
242 // queued in response to the load.
InitializePrefs(base::Value::Dict dict=base::Value::Dict (),bool expect_pref_update=false)243 void InitializePrefs(base::Value::Dict dict = base::Value::Dict(),
244 bool expect_pref_update = false) {
245 EXPECT_FALSE(http_server_props_->IsInitialized());
246 pref_delegate_->InitializePrefs(std::move(dict));
247 EXPECT_TRUE(http_server_props_->IsInitialized());
248 if (!expect_pref_update) {
249 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
250 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
251 } else {
252 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
253 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
254 FastForwardUntilNoTasksRemain();
255 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
256 }
257 }
258
TearDown()259 void TearDown() override {
260 // Run pending non-delayed tasks but don't FastForwardUntilNoTasksRemain()
261 // as some delayed tasks may forever repost (e.g. because impl doesn't use a
262 // mock clock and doesn't see timings as having expired, ref.
263 // HttpServerProperties::
264 // ScheduleBrokenAlternateProtocolMappingsExpiration()).
265 base::RunLoop().RunUntilIdle();
266 http_server_props_.reset();
267 }
268
HasAlternativeService(const url::SchemeHostPort & server,const NetworkAnonymizationKey & network_anonymization_key)269 bool HasAlternativeService(
270 const url::SchemeHostPort& server,
271 const NetworkAnonymizationKey& network_anonymization_key) {
272 const AlternativeServiceInfoVector alternative_service_info_vector =
273 http_server_props_->GetAlternativeServiceInfos(
274 server, network_anonymization_key);
275 return !alternative_service_info_vector.empty();
276 }
277
278 // Returns a dictionary with only the version field populated.
DictWithVersion()279 static base::Value::Dict DictWithVersion() {
280 base::Value::Dict http_server_properties_dict;
281 http_server_properties_dict.Set("version", 5);
282 return http_server_properties_dict;
283 }
284
285 raw_ptr<MockPrefDelegate>
286 pref_delegate_; // Owned by HttpServerPropertiesManager.
287 std::unique_ptr<HttpServerProperties> http_server_props_;
288 base::Time one_day_from_now_;
289 quic::ParsedQuicVersionVector advertised_versions_;
290 };
291
TEST_F(HttpServerPropertiesManagerTest,BadCachedHostPortPair)292 TEST_F(HttpServerPropertiesManagerTest, BadCachedHostPortPair) {
293 base::Value::Dict server_pref_dict;
294
295 // Set supports_spdy for www.google.com:65536.
296 server_pref_dict.Set("supports_spdy", true);
297
298 // Set up alternative_service for www.google.com:65536.
299 base::Value::Dict alternative_service_dict;
300 alternative_service_dict.Set("protocol_str", "h2");
301 alternative_service_dict.Set("port", 80);
302 base::Value::List alternative_service_list;
303 alternative_service_list.Append(std::move(alternative_service_dict));
304 server_pref_dict.Set("alternative_service",
305 std::move(alternative_service_list));
306
307 // Set up ServerNetworkStats for www.google.com:65536.
308 base::Value::Dict stats;
309 stats.Set("srtt", 10);
310 server_pref_dict.Set("network_stats", std::move(stats));
311
312 // Set the server preference for www.google.com:65536.
313 base::Value::Dict servers_dict;
314 servers_dict.Set("www.google.com:65536", std::move(server_pref_dict));
315 base::Value::List servers_list;
316 servers_list.Append(std::move(servers_dict));
317 base::Value::Dict http_server_properties_dict = DictWithVersion();
318 http_server_properties_dict.Set("servers", std::move(servers_list));
319
320 // Set quic_server_info for www.google.com:65536.
321 base::Value::Dict quic_servers_dict;
322 base::Value::Dict quic_server_pref_dict1;
323 quic_server_pref_dict1.Set("server_info", "quic_server_info1");
324 quic_servers_dict.Set("http://mail.google.com:65536",
325 std::move(quic_server_pref_dict1));
326
327 http_server_properties_dict.Set("quic_servers", std::move(quic_servers_dict));
328
329 // Set up the pref.
330 InitializePrefs(std::move(http_server_properties_dict));
331
332 // Verify that nothing is set.
333 HostPortPair google_host_port_pair =
334 HostPortPair::FromString("www.google.com:65536");
335 url::SchemeHostPort gooler_server("http", google_host_port_pair.host(),
336 google_host_port_pair.port());
337
338 EXPECT_FALSE(http_server_props_->SupportsRequestPriority(
339 gooler_server, NetworkAnonymizationKey()));
340 EXPECT_FALSE(HasAlternativeService(gooler_server, NetworkAnonymizationKey()));
341 const ServerNetworkStats* stats1 = http_server_props_->GetServerNetworkStats(
342 gooler_server, NetworkAnonymizationKey());
343 EXPECT_EQ(nullptr, stats1);
344 EXPECT_EQ(0u, http_server_props_->quic_server_info_map().size());
345 }
346
TEST_F(HttpServerPropertiesManagerTest,BadCachedAltProtocolPort)347 TEST_F(HttpServerPropertiesManagerTest, BadCachedAltProtocolPort) {
348 base::Value::Dict server_pref_dict;
349
350 // Set supports_spdy for www.google.com:80.
351 server_pref_dict.Set("supports_spdy", true);
352
353 // Set up alternative_service for www.google.com:80.
354 base::Value::Dict alternative_service_dict;
355 alternative_service_dict.Set("protocol_str", "h2");
356 alternative_service_dict.Set("port", 65536);
357 base::Value::List alternative_service_list;
358 alternative_service_list.Append(std::move(alternative_service_dict));
359 server_pref_dict.Set("alternative_service",
360 std::move(alternative_service_list));
361
362 // Set the server preference for www.google.com:80.
363 base::Value::Dict servers_dict;
364 servers_dict.Set("www.google.com:80", std::move(server_pref_dict));
365 base::Value::List servers_list;
366 servers_list.Append(std::move(servers_dict));
367 base::Value::Dict http_server_properties_dict = DictWithVersion();
368 http_server_properties_dict.Set("servers", std::move(servers_list));
369
370 // Set up the pref.
371 InitializePrefs(std::move(http_server_properties_dict));
372
373 // Verify alternative service is not set.
374 EXPECT_FALSE(
375 HasAlternativeService(url::SchemeHostPort("http", "www.google.com", 80),
376 NetworkAnonymizationKey()));
377 }
378
TEST_F(HttpServerPropertiesManagerTest,SupportsSpdy)379 TEST_F(HttpServerPropertiesManagerTest, SupportsSpdy) {
380 InitializePrefs();
381
382 // Add mail.google.com:443 as a supporting spdy server.
383 url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
384 EXPECT_FALSE(http_server_props_->SupportsRequestPriority(
385 spdy_server, NetworkAnonymizationKey()));
386 http_server_props_->SetSupportsSpdy(spdy_server, NetworkAnonymizationKey(),
387 true);
388 // Setting the value to the same thing again should not trigger another pref
389 // update.
390 http_server_props_->SetSupportsSpdy(spdy_server, NetworkAnonymizationKey(),
391 true);
392
393 // Run the task.
394 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
395 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
396 FastForwardUntilNoTasksRemain();
397 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
398
399 // Setting the value to the same thing again should not trigger another pref
400 // update.
401 http_server_props_->SetSupportsSpdy(spdy_server, NetworkAnonymizationKey(),
402 true);
403 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
404 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
405
406 EXPECT_TRUE(http_server_props_->SupportsRequestPriority(
407 spdy_server, NetworkAnonymizationKey()));
408 }
409
410 // Regression test for crbug.com/670519. Test that there is only one pref update
411 // scheduled if multiple updates happen in a given time period. Subsequent pref
412 // update could also be scheduled once the previous scheduled update is
413 // completed.
TEST_F(HttpServerPropertiesManagerTest,SinglePrefUpdateForTwoSpdyServerCacheChanges)414 TEST_F(HttpServerPropertiesManagerTest,
415 SinglePrefUpdateForTwoSpdyServerCacheChanges) {
416 InitializePrefs();
417
418 // Post an update task. SetSupportsSpdy calls ScheduleUpdatePrefs with a delay
419 // of 60ms.
420 url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
421 EXPECT_FALSE(http_server_props_->SupportsRequestPriority(
422 spdy_server, NetworkAnonymizationKey()));
423 http_server_props_->SetSupportsSpdy(spdy_server, NetworkAnonymizationKey(),
424 true);
425 // The pref update task should be scheduled.
426 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
427
428 // Move forward the task runner short by 20ms.
429 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting() -
430 base::Milliseconds(20));
431
432 // Set another spdy server to trigger another call to
433 // ScheduleUpdatePrefs. There should be no new update posted.
434 url::SchemeHostPort spdy_server2("https", "drive.google.com", 443);
435 http_server_props_->SetSupportsSpdy(spdy_server2, NetworkAnonymizationKey(),
436 true);
437 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
438
439 // Move forward the extra 20ms. The pref update should be executed.
440 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
441 FastForwardBy(base::Milliseconds(20));
442 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
443 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
444
445 EXPECT_TRUE(http_server_props_->SupportsRequestPriority(
446 spdy_server, NetworkAnonymizationKey()));
447 EXPECT_TRUE(http_server_props_->SupportsRequestPriority(
448 spdy_server2, NetworkAnonymizationKey()));
449 // Set the third spdy server to trigger one more call to
450 // ScheduleUpdatePrefs. A new update task should be posted now since the
451 // previous one is completed.
452 url::SchemeHostPort spdy_server3("https", "maps.google.com", 443);
453 http_server_props_->SetSupportsSpdy(spdy_server3, NetworkAnonymizationKey(),
454 true);
455 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
456
457 // Run the task.
458 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
459 FastForwardUntilNoTasksRemain();
460 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
461 }
462
TEST_F(HttpServerPropertiesManagerTest,GetAlternativeServiceInfos)463 TEST_F(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) {
464 InitializePrefs();
465
466 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
467 EXPECT_FALSE(
468 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
469 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
470 443);
471 http_server_props_->SetHttp2AlternativeService(
472 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
473 one_day_from_now_);
474 // ExpectScheduleUpdatePrefs() should be called only once.
475 http_server_props_->SetHttp2AlternativeService(
476 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
477 one_day_from_now_);
478
479 // Run the task.
480 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
481 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
482 FastForwardUntilNoTasksRemain();
483 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
484
485 AlternativeServiceInfoVector alternative_service_info_vector =
486 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
487 NetworkAnonymizationKey());
488 ASSERT_EQ(1u, alternative_service_info_vector.size());
489 EXPECT_EQ(alternative_service,
490 alternative_service_info_vector[0].alternative_service());
491 }
492
TEST_F(HttpServerPropertiesManagerTest,SetAlternativeServices)493 TEST_F(HttpServerPropertiesManagerTest, SetAlternativeServices) {
494 InitializePrefs();
495
496 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
497 EXPECT_FALSE(
498 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
499 AlternativeServiceInfoVector alternative_service_info_vector;
500 const AlternativeService alternative_service1(kProtoHTTP2, "mail.google.com",
501 443);
502 alternative_service_info_vector.push_back(
503 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
504 alternative_service1, one_day_from_now_));
505 const AlternativeService alternative_service2(kProtoQUIC, "mail.google.com",
506 1234);
507 alternative_service_info_vector.push_back(
508 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
509 alternative_service2, one_day_from_now_, advertised_versions_));
510 http_server_props_->SetAlternativeServices(spdy_server_mail,
511 NetworkAnonymizationKey(),
512 alternative_service_info_vector);
513 // ExpectScheduleUpdatePrefs() should be called only once.
514 http_server_props_->SetAlternativeServices(spdy_server_mail,
515 NetworkAnonymizationKey(),
516 alternative_service_info_vector);
517
518 // Run the task.
519 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
520 FastForwardUntilNoTasksRemain();
521 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
522
523 AlternativeServiceInfoVector alternative_service_info_vector2 =
524 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
525 NetworkAnonymizationKey());
526 ASSERT_EQ(2u, alternative_service_info_vector2.size());
527 EXPECT_EQ(alternative_service1,
528 alternative_service_info_vector2[0].alternative_service());
529 EXPECT_EQ(alternative_service2,
530 alternative_service_info_vector2[1].alternative_service());
531 }
532
TEST_F(HttpServerPropertiesManagerTest,SetAlternativeServicesEmpty)533 TEST_F(HttpServerPropertiesManagerTest, SetAlternativeServicesEmpty) {
534 InitializePrefs();
535
536 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
537 EXPECT_FALSE(
538 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
539 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
540 443);
541 http_server_props_->SetAlternativeServices(spdy_server_mail,
542 NetworkAnonymizationKey(),
543 AlternativeServiceInfoVector());
544
545 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
546 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
547
548 EXPECT_FALSE(
549 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
550 }
551
TEST_F(HttpServerPropertiesManagerTest,ConfirmAlternativeService)552 TEST_F(HttpServerPropertiesManagerTest, ConfirmAlternativeService) {
553 InitializePrefs();
554
555 url::SchemeHostPort spdy_server_mail;
556 AlternativeService alternative_service;
557
558 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
559 EXPECT_FALSE(
560 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
561 alternative_service = AlternativeService(kProtoHTTP2, "mail.google.com", 443);
562
563 http_server_props_->SetHttp2AlternativeService(
564 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
565 one_day_from_now_);
566 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
567 alternative_service, NetworkAnonymizationKey()));
568 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
569 alternative_service, NetworkAnonymizationKey()));
570
571 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
572
573 http_server_props_->MarkAlternativeServiceBroken(alternative_service,
574 NetworkAnonymizationKey());
575 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
576 alternative_service, NetworkAnonymizationKey()));
577 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
578 alternative_service, NetworkAnonymizationKey()));
579
580 // In addition to the pref update task, there's now a task to mark the
581 // alternative service as no longer broken.
582 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
583
584 http_server_props_->ConfirmAlternativeService(alternative_service,
585 NetworkAnonymizationKey());
586 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
587 alternative_service, NetworkAnonymizationKey()));
588 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
589 alternative_service, NetworkAnonymizationKey()));
590
591 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
592
593 // Run the task.
594 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
595 FastForwardUntilNoTasksRemain();
596 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
597
598 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
599 alternative_service, NetworkAnonymizationKey()));
600 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
601 alternative_service, NetworkAnonymizationKey()));
602 }
603
604 // Check the case that prefs are loaded only after setting alternative service
605 // info. Prefs should not be written until after the load happens.
TEST_F(HttpServerPropertiesManagerTest,LateLoadAlternativeServiceInfo)606 TEST_F(HttpServerPropertiesManagerTest, LateLoadAlternativeServiceInfo) {
607 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
608 EXPECT_FALSE(
609 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
610 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
611 443);
612 http_server_props_->SetHttp2AlternativeService(
613 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
614 one_day_from_now_);
615
616 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
617 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
618 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
619
620 AlternativeServiceInfoVector alternative_service_info_vector =
621 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
622 NetworkAnonymizationKey());
623 ASSERT_EQ(1u, alternative_service_info_vector.size());
624 EXPECT_EQ(alternative_service,
625 alternative_service_info_vector[0].alternative_service());
626
627 // Initializing prefs does not result in a task to write the prefs.
628 InitializePrefs(base::Value::Dict(),
629 /*expect_pref_update=*/true);
630 alternative_service_info_vector =
631 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
632 NetworkAnonymizationKey());
633 EXPECT_EQ(1u, alternative_service_info_vector.size());
634
635 // Updating the entry should result in a task to save prefs. Have to at least
636 // double (or half) the lifetime, to ensure the change triggers a save to
637 // prefs.
638 http_server_props_->SetHttp2AlternativeService(
639 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
640 one_day_from_now_ + base::Days(2));
641 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
642 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
643 FastForwardUntilNoTasksRemain();
644 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
645 alternative_service_info_vector =
646 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
647 NetworkAnonymizationKey());
648 EXPECT_EQ(1u, alternative_service_info_vector.size());
649 }
650
651 // Check the case that prefs are cleared before they're loaded.
TEST_F(HttpServerPropertiesManagerTest,ClearPrefsBeforeLoadAlternativeServiceInfo)652 TEST_F(HttpServerPropertiesManagerTest,
653 ClearPrefsBeforeLoadAlternativeServiceInfo) {
654 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
655 EXPECT_FALSE(
656 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
657 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
658 443);
659 http_server_props_->SetHttp2AlternativeService(
660 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
661 one_day_from_now_);
662
663 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
664 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
665 FastForwardUntilNoTasksRemain();
666 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
667
668 AlternativeServiceInfoVector alternative_service_info_vector =
669 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
670 NetworkAnonymizationKey());
671 ASSERT_EQ(1u, alternative_service_info_vector.size());
672 EXPECT_EQ(alternative_service,
673 alternative_service_info_vector[0].alternative_service());
674
675 // Clearing prefs should result in a task to write the prefs.
676 bool callback_invoked_ = false;
677 http_server_props_->Clear(base::BindOnce(
678 [](bool* callback_invoked) {
679 EXPECT_FALSE(*callback_invoked);
680 *callback_invoked = true;
681 },
682 &callback_invoked_));
683 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
684 EXPECT_FALSE(callback_invoked_);
685 std::move(pref_delegate_->GetSetPropertiesCallback()).Run();
686 EXPECT_TRUE(callback_invoked_);
687 alternative_service_info_vector =
688 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
689 NetworkAnonymizationKey());
690 EXPECT_EQ(0u, alternative_service_info_vector.size());
691
692 // Re-creating the entry should result in a task to save prefs.
693 http_server_props_->SetHttp2AlternativeService(
694 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
695 one_day_from_now_);
696 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
697 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
698 FastForwardUntilNoTasksRemain();
699 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
700 alternative_service_info_vector =
701 http_server_props_->GetAlternativeServiceInfos(spdy_server_mail,
702 NetworkAnonymizationKey());
703 EXPECT_EQ(1u, alternative_service_info_vector.size());
704 }
705
TEST_F(HttpServerPropertiesManagerTest,ConfirmBrokenUntilDefaultNetworkChanges)706 TEST_F(HttpServerPropertiesManagerTest,
707 ConfirmBrokenUntilDefaultNetworkChanges) {
708 InitializePrefs();
709
710 url::SchemeHostPort spdy_server_mail;
711 AlternativeService alternative_service;
712
713 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
714 EXPECT_FALSE(
715 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
716 alternative_service = AlternativeService(kProtoHTTP2, "mail.google.com", 443);
717
718 http_server_props_->SetHttp2AlternativeService(
719 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
720 one_day_from_now_);
721 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
722 alternative_service, NetworkAnonymizationKey()));
723 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
724 alternative_service, NetworkAnonymizationKey()));
725
726 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
727
728 http_server_props_->MarkAlternativeServiceBrokenUntilDefaultNetworkChanges(
729 alternative_service, NetworkAnonymizationKey());
730 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
731 alternative_service, NetworkAnonymizationKey()));
732 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
733 alternative_service, NetworkAnonymizationKey()));
734
735 // In addition to the pref update task, there's now a task to mark the
736 // alternative service as no longer broken.
737 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
738
739 http_server_props_->ConfirmAlternativeService(alternative_service,
740 NetworkAnonymizationKey());
741 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
742 alternative_service, NetworkAnonymizationKey()));
743 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
744 alternative_service, NetworkAnonymizationKey()));
745
746 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
747
748 // Run the task.
749 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
750 FastForwardUntilNoTasksRemain();
751 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
752
753 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
754 alternative_service, NetworkAnonymizationKey()));
755 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
756 alternative_service, NetworkAnonymizationKey()));
757 }
758
TEST_F(HttpServerPropertiesManagerTest,OnDefaultNetworkChangedWithBrokenUntilDefaultNetworkChanges)759 TEST_F(HttpServerPropertiesManagerTest,
760 OnDefaultNetworkChangedWithBrokenUntilDefaultNetworkChanges) {
761 InitializePrefs();
762
763 url::SchemeHostPort spdy_server_mail;
764 AlternativeService alternative_service;
765
766 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
767 EXPECT_FALSE(
768 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
769 alternative_service = AlternativeService(kProtoHTTP2, "mail.google.com", 443);
770
771 http_server_props_->SetHttp2AlternativeService(
772 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
773 one_day_from_now_);
774 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
775 alternative_service, NetworkAnonymizationKey()));
776 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
777 alternative_service, NetworkAnonymizationKey()));
778
779 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
780
781 http_server_props_->MarkAlternativeServiceBrokenUntilDefaultNetworkChanges(
782 alternative_service, NetworkAnonymizationKey());
783 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
784 alternative_service, NetworkAnonymizationKey()));
785 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
786 alternative_service, NetworkAnonymizationKey()));
787
788 // In addition to the pref update task, there's now a task to mark the
789 // alternative service as no longer broken.
790 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
791
792 http_server_props_->OnDefaultNetworkChanged();
793 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
794 alternative_service, NetworkAnonymizationKey()));
795 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
796 alternative_service, NetworkAnonymizationKey()));
797
798 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
799
800 // Run the task.
801 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
802 FastForwardUntilNoTasksRemain();
803 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
804
805 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
806 alternative_service, NetworkAnonymizationKey()));
807 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
808 alternative_service, NetworkAnonymizationKey()));
809 }
810
TEST_F(HttpServerPropertiesManagerTest,OnDefaultNetworkChangedWithBrokenOnly)811 TEST_F(HttpServerPropertiesManagerTest, OnDefaultNetworkChangedWithBrokenOnly) {
812 InitializePrefs();
813
814 url::SchemeHostPort spdy_server_mail;
815 AlternativeService alternative_service;
816
817 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
818 EXPECT_FALSE(
819 HasAlternativeService(spdy_server_mail, NetworkAnonymizationKey()));
820 alternative_service = AlternativeService(kProtoHTTP2, "mail.google.com", 443);
821
822 http_server_props_->SetHttp2AlternativeService(
823 spdy_server_mail, NetworkAnonymizationKey(), alternative_service,
824 one_day_from_now_);
825 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
826 alternative_service, NetworkAnonymizationKey()));
827 EXPECT_FALSE(http_server_props_->WasAlternativeServiceRecentlyBroken(
828 alternative_service, NetworkAnonymizationKey()));
829
830 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
831
832 http_server_props_->MarkAlternativeServiceBroken(alternative_service,
833 NetworkAnonymizationKey());
834 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
835 alternative_service, NetworkAnonymizationKey()));
836 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
837 alternative_service, NetworkAnonymizationKey()));
838
839 // In addition to the pref update task, there's now a task to mark the
840 // alternative service as no longer broken.
841 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
842
843 http_server_props_->OnDefaultNetworkChanged();
844 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
845 alternative_service, NetworkAnonymizationKey()));
846 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
847 alternative_service, NetworkAnonymizationKey()));
848
849 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
850
851 // Run the task.
852 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
853 FastForwardUntilNoTasksRemain();
854 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
855
856 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
857 alternative_service, NetworkAnonymizationKey()));
858 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
859 alternative_service, NetworkAnonymizationKey()));
860 }
861
TEST_F(HttpServerPropertiesManagerTest,LastLocalAddressWhenQuicWorked)862 TEST_F(HttpServerPropertiesManagerTest, LastLocalAddressWhenQuicWorked) {
863 InitializePrefs();
864
865 IPAddress actual_address(127, 0, 0, 1);
866 EXPECT_FALSE(http_server_props_->HasLastLocalAddressWhenQuicWorked());
867 EXPECT_FALSE(
868 http_server_props_->WasLastLocalAddressWhenQuicWorked(actual_address));
869 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
870 // Another task should not be scheduled.
871 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
872
873 // Run the task.
874 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
875 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
876 FastForwardUntilNoTasksRemain();
877 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
878
879 EXPECT_TRUE(
880 http_server_props_->WasLastLocalAddressWhenQuicWorked(actual_address));
881
882 // Another task should not be scheduled.
883 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
884 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
885 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
886 }
887
TEST_F(HttpServerPropertiesManagerTest,ServerNetworkStats)888 TEST_F(HttpServerPropertiesManagerTest, ServerNetworkStats) {
889 InitializePrefs();
890
891 url::SchemeHostPort mail_server("http", "mail.google.com", 80);
892 const ServerNetworkStats* stats = http_server_props_->GetServerNetworkStats(
893 mail_server, NetworkAnonymizationKey());
894 EXPECT_EQ(nullptr, stats);
895 ServerNetworkStats stats1;
896 stats1.srtt = base::Microseconds(10);
897 http_server_props_->SetServerNetworkStats(mail_server,
898 NetworkAnonymizationKey(), stats1);
899 // Another task should not be scheduled.
900 http_server_props_->SetServerNetworkStats(mail_server,
901 NetworkAnonymizationKey(), stats1);
902
903 // Run the task.
904 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
905 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
906 FastForwardUntilNoTasksRemain();
907 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
908
909 // Another task should not be scheduled.
910 http_server_props_->SetServerNetworkStats(mail_server,
911 NetworkAnonymizationKey(), stats1);
912 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
913 EXPECT_EQ(GetPendingMainThreadTaskCount(), 0u);
914
915 const ServerNetworkStats* stats2 = http_server_props_->GetServerNetworkStats(
916 mail_server, NetworkAnonymizationKey());
917 EXPECT_EQ(10, stats2->srtt.ToInternalValue());
918
919 http_server_props_->ClearServerNetworkStats(mail_server,
920 NetworkAnonymizationKey());
921
922 // Run the task.
923 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
924 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
925 FastForwardUntilNoTasksRemain();
926 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
927
928 EXPECT_EQ(nullptr, http_server_props_->GetServerNetworkStats(
929 mail_server, NetworkAnonymizationKey()));
930 }
931
TEST_F(HttpServerPropertiesManagerTest,QuicServerInfo)932 TEST_F(HttpServerPropertiesManagerTest, QuicServerInfo) {
933 InitializePrefs();
934
935 quic::QuicServerId mail_quic_server_id("mail.google.com", 80, false);
936 EXPECT_EQ(nullptr, http_server_props_->GetQuicServerInfo(
937 mail_quic_server_id, NetworkAnonymizationKey()));
938 std::string quic_server_info1("quic_server_info1");
939 http_server_props_->SetQuicServerInfo(
940 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
941 // Another task should not be scheduled.
942 http_server_props_->SetQuicServerInfo(
943 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
944
945 // Run the task.
946 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
947 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
948 FastForwardUntilNoTasksRemain();
949 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
950
951 EXPECT_EQ(quic_server_info1,
952 *http_server_props_->GetQuicServerInfo(mail_quic_server_id,
953 NetworkAnonymizationKey()));
954
955 // Another task should not be scheduled.
956 http_server_props_->SetQuicServerInfo(
957 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
958 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
959 EXPECT_EQ(0u, GetPendingMainThreadTaskCount());
960 }
961
TEST_F(HttpServerPropertiesManagerTest,Clear)962 TEST_F(HttpServerPropertiesManagerTest, Clear) {
963 InitializePrefs();
964
965 const url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
966 const IPAddress actual_address(127, 0, 0, 1);
967 const quic::QuicServerId mail_quic_server_id("mail.google.com", 80, false);
968 const std::string quic_server_info1("quic_server_info1");
969 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
970 1234);
971 const AlternativeService broken_alternative_service(
972 kProtoHTTP2, "broken.google.com", 1234);
973
974 AlternativeServiceInfoVector alt_svc_info_vector;
975 alt_svc_info_vector.push_back(
976 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
977 alternative_service, one_day_from_now_));
978 alt_svc_info_vector.push_back(
979 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
980 broken_alternative_service, one_day_from_now_));
981 http_server_props_->SetAlternativeServices(
982 spdy_server, NetworkAnonymizationKey(), alt_svc_info_vector);
983
984 http_server_props_->MarkAlternativeServiceBroken(broken_alternative_service,
985 NetworkAnonymizationKey());
986 http_server_props_->SetSupportsSpdy(spdy_server, NetworkAnonymizationKey(),
987 true);
988 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
989 ServerNetworkStats stats;
990 stats.srtt = base::Microseconds(10);
991 http_server_props_->SetServerNetworkStats(spdy_server,
992 NetworkAnonymizationKey(), stats);
993
994 http_server_props_->SetQuicServerInfo(
995 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
996
997 // Advance time by just enough so that the prefs update task is executed but
998 // not the task to expire the brokenness of |broken_alternative_service|.
999 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
1000 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1001 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1002
1003 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1004 broken_alternative_service, NetworkAnonymizationKey()));
1005 EXPECT_TRUE(http_server_props_->SupportsRequestPriority(
1006 spdy_server, NetworkAnonymizationKey()));
1007 EXPECT_TRUE(HasAlternativeService(spdy_server, NetworkAnonymizationKey()));
1008 EXPECT_TRUE(
1009 http_server_props_->WasLastLocalAddressWhenQuicWorked(actual_address));
1010 const ServerNetworkStats* stats1 = http_server_props_->GetServerNetworkStats(
1011 spdy_server, NetworkAnonymizationKey());
1012 EXPECT_EQ(10, stats1->srtt.ToInternalValue());
1013 EXPECT_EQ(quic_server_info1,
1014 *http_server_props_->GetQuicServerInfo(mail_quic_server_id,
1015 NetworkAnonymizationKey()));
1016
1017 // Clear http server data, which should instantly update prefs.
1018 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1019 bool callback_invoked_ = false;
1020 http_server_props_->Clear(base::BindOnce(
1021 [](bool* callback_invoked) {
1022 EXPECT_FALSE(*callback_invoked);
1023 *callback_invoked = true;
1024 },
1025 &callback_invoked_));
1026 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1027 EXPECT_FALSE(callback_invoked_);
1028 std::move(pref_delegate_->GetSetPropertiesCallback()).Run();
1029 EXPECT_TRUE(callback_invoked_);
1030
1031 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1032 broken_alternative_service, NetworkAnonymizationKey()));
1033 EXPECT_FALSE(http_server_props_->SupportsRequestPriority(
1034 spdy_server, NetworkAnonymizationKey()));
1035 EXPECT_FALSE(HasAlternativeService(spdy_server, NetworkAnonymizationKey()));
1036 EXPECT_FALSE(http_server_props_->HasLastLocalAddressWhenQuicWorked());
1037 const ServerNetworkStats* stats2 = http_server_props_->GetServerNetworkStats(
1038 spdy_server, NetworkAnonymizationKey());
1039 EXPECT_EQ(nullptr, stats2);
1040 EXPECT_EQ(nullptr, http_server_props_->GetQuicServerInfo(
1041 mail_quic_server_id, NetworkAnonymizationKey()));
1042 }
1043
1044 // https://crbug.com/444956: Add 200 alternative_service servers followed by
1045 // supports_quic and verify we have read supports_quic from prefs.
TEST_F(HttpServerPropertiesManagerTest,BadLastLocalAddressWhenQuicWorked)1046 TEST_F(HttpServerPropertiesManagerTest, BadLastLocalAddressWhenQuicWorked) {
1047 base::Value::List servers_list;
1048
1049 for (int i = 1; i <= 200; ++i) {
1050 // Set up alternative_service for www.google.com:i.
1051 base::Value::Dict server_dict;
1052 base::Value::Dict alternative_service_dict;
1053 alternative_service_dict.Set("protocol_str", "quic");
1054 alternative_service_dict.Set("port", i);
1055 base::Value::List alternative_service_list;
1056 alternative_service_list.Append(std::move(alternative_service_dict));
1057 server_dict.Set("alternative_service", std::move(alternative_service_list));
1058 server_dict.Set("server", StringPrintf("https://www.google.com:%d", i));
1059 server_dict.Set("anonymization", base::Value(base::Value::Type::LIST));
1060 servers_list.Append(std::move(server_dict));
1061 }
1062
1063 // Set the server preference for http://mail.google.com server.
1064 base::Value::Dict server_dict2;
1065 server_dict2.Set("server", "https://mail.google.com");
1066 server_dict2.Set("anonymization", base::Value(base::Value::Type::LIST));
1067 servers_list.Append(std::move(server_dict2));
1068
1069 base::Value::Dict http_server_properties_dict = DictWithVersion();
1070 http_server_properties_dict.Set("servers", std::move(servers_list));
1071
1072 // Set up SupportsQuic for 127.0.0.1
1073 base::Value::Dict supports_quic;
1074 supports_quic.Set("used_quic", true);
1075 supports_quic.Set("address", "127.0.0.1");
1076 http_server_properties_dict.Set("supports_quic", std::move(supports_quic));
1077
1078 // Set up the pref.
1079 InitializePrefs(std::move(http_server_properties_dict));
1080
1081 // Verify alternative service.
1082 for (int i = 1; i <= 200; ++i) {
1083 GURL server_gurl;
1084 server_gurl = GURL(StringPrintf("https://www.google.com:%d", i));
1085 url::SchemeHostPort server(server_gurl);
1086 AlternativeServiceInfoVector alternative_service_info_vector =
1087 http_server_props_->GetAlternativeServiceInfos(
1088 server, NetworkAnonymizationKey());
1089 ASSERT_EQ(1u, alternative_service_info_vector.size());
1090 EXPECT_EQ(
1091 kProtoQUIC,
1092 alternative_service_info_vector[0].alternative_service().protocol);
1093 EXPECT_EQ(i, alternative_service_info_vector[0].alternative_service().port);
1094 }
1095
1096 // Verify WasLastLocalAddressWhenQuicWorked.
1097 ASSERT_TRUE(http_server_props_->WasLastLocalAddressWhenQuicWorked(
1098 IPAddress::IPv4Localhost()));
1099 }
1100
TEST_F(HttpServerPropertiesManagerTest,UpdatePrefsWithCache)1101 TEST_F(HttpServerPropertiesManagerTest, UpdatePrefsWithCache) {
1102 InitializePrefs();
1103
1104 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1105 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1106
1107 // #1 & #2: Set alternate protocol.
1108 AlternativeServiceInfoVector alternative_service_info_vector;
1109 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443);
1110 base::Time expiration1;
1111 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1112 alternative_service_info_vector.push_back(
1113 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1114 www_alternative_service1, expiration1));
1115
1116 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com",
1117 1234);
1118 base::Time expiration2;
1119 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1120 alternative_service_info_vector.push_back(
1121 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1122 www_alternative_service2, expiration2));
1123 http_server_props_->SetAlternativeServices(
1124 server_www, NetworkAnonymizationKey(), alternative_service_info_vector);
1125
1126 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com",
1127 444);
1128 base::Time expiration3 = base::Time::Max();
1129 http_server_props_->SetHttp2AlternativeService(
1130 server_mail, NetworkAnonymizationKey(), mail_alternative_service,
1131 expiration3);
1132
1133 http_server_props_->MarkAlternativeServiceBroken(www_alternative_service2,
1134 NetworkAnonymizationKey());
1135 http_server_props_->MarkAlternativeServiceRecentlyBroken(
1136 mail_alternative_service, NetworkAnonymizationKey());
1137
1138 // #3: Set SPDY server map
1139 http_server_props_->SetSupportsSpdy(server_www, NetworkAnonymizationKey(),
1140 false);
1141 http_server_props_->SetSupportsSpdy(server_mail, NetworkAnonymizationKey(),
1142 true);
1143 http_server_props_->SetSupportsSpdy(
1144 url::SchemeHostPort("http", "not_persisted.com", 80),
1145 NetworkAnonymizationKey(), false);
1146
1147 // #4: Set ServerNetworkStats.
1148 ServerNetworkStats stats;
1149 stats.srtt = base::TimeDelta::FromInternalValue(42);
1150 http_server_props_->SetServerNetworkStats(server_mail,
1151 NetworkAnonymizationKey(), stats);
1152
1153 // #5: Set quic_server_info string.
1154 quic::QuicServerId mail_quic_server_id("mail.google.com", 80, false);
1155 std::string quic_server_info1("quic_server_info1");
1156 http_server_props_->SetQuicServerInfo(
1157 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
1158
1159 // #6: Set SupportsQuic.
1160 IPAddress actual_address(127, 0, 0, 1);
1161 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
1162
1163 base::Time time_before_prefs_update = base::Time::Now();
1164
1165 // Update Prefs.
1166 // The task runner has a remaining pending task to expire
1167 // |www_alternative_service2| in 5 minutes. Fast forward enough such
1168 // that the prefs update task is executed but not the task to expire
1169 // |broken_alternative_service|.
1170 EXPECT_EQ(2u, GetPendingMainThreadTaskCount());
1171 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1172 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
1173 EXPECT_EQ(1u, GetPendingMainThreadTaskCount());
1174 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1175
1176 base::Time time_after_prefs_update = base::Time::Now();
1177
1178 // Verify |pref_delegate_|'s server dict.
1179 // In HttpServerPropertiesManager, broken alternative services' expiration
1180 // times are converted from TimeTicks to Time before being written to JSON by
1181 // using the difference between Time::Now() and TimeTicks::Now().
1182 // To verify these expiration times, |time_before_prefs_update| and
1183 // |time_after_prefs_update| provide lower and upper bounds for the
1184 // Time::Now() value used by the manager for this conversion.
1185 //
1186 // A copy of |pref_delegate_|'s server dict will be created, and the broken
1187 // alternative service's "broken_until" field is removed and verified
1188 // separately. The rest of the server dict copy is verified afterwards.
1189 base::Value::Dict server_dict = pref_delegate_->GetServerProperties().Clone();
1190
1191 // Extract and remove the "broken_until" string for "www.google.com:1234".
1192 base::Value::List* broken_alt_svc_list =
1193 server_dict.FindList("broken_alternative_services");
1194 ASSERT_TRUE(broken_alt_svc_list);
1195 ASSERT_EQ(2u, broken_alt_svc_list->size());
1196 base::Value& broken_alt_svcs_list_entry = (*broken_alt_svc_list)[0];
1197 const std::string* broken_until_str =
1198 broken_alt_svcs_list_entry.GetDict().FindString("broken_until");
1199 ASSERT_TRUE(broken_until_str);
1200 const std::string expiration_string = *broken_until_str;
1201 broken_alt_svcs_list_entry.GetDict().Remove("broken_until");
1202
1203 // Expiration time of "www.google.com:1234" should be 5 minutes minus the
1204 // update-prefs-delay from when the prefs were written.
1205 int64_t expiration_int64;
1206 ASSERT_TRUE(base::StringToInt64(expiration_string, &expiration_int64));
1207 base::TimeDelta expiration_delta =
1208 base::Minutes(5) - HttpServerProperties::GetUpdatePrefsDelayForTesting();
1209 time_t time_t_of_prefs_update = static_cast<time_t>(expiration_int64);
1210 EXPECT_LE((time_before_prefs_update + expiration_delta).ToTimeT(),
1211 time_t_of_prefs_update);
1212 EXPECT_GE((time_after_prefs_update + expiration_delta).ToTimeT(),
1213 time_t_of_prefs_update);
1214
1215 // Verify all other preferences.
1216 const char expected_json[] =
1217 "{"
1218 "\"broken_alternative_services\":"
1219 "[{\"anonymization\":[],\"broken_count\":1,\"host\":\"www.google.com\","
1220 "\"port\":1234,\"protocol_str\":\"h2\"},"
1221 "{\"anonymization\":[],\"broken_count\":1,\"host\":\"foo.google.com\","
1222 "\"port\":444,\"protocol_str\":\"h2\"}],"
1223 "\"quic_servers\":"
1224 "[{\"anonymization\":[],"
1225 "\"server_id\":\"https://mail.google.com:80\","
1226 "\"server_info\":\"quic_server_info1\"}],"
1227 "\"servers\":["
1228 "{\"alternative_service\":[{\"advertised_alpns\":[],"
1229 "\"expiration\":\"13756212000000000\",\"port\":443,"
1230 "\"protocol_str\":\"h2\"},"
1231 "{\"advertised_alpns\":[],\"expiration\":\"13758804000000000\","
1232 "\"host\":\"www.google.com\",\"port\":1234,\"protocol_str\":\"h2\"}],"
1233 "\"anonymization\":[],"
1234 "\"server\":\"https://www.google.com:80\"},"
1235 "{\"alternative_service\":[{\"advertised_alpns\":[],"
1236 "\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\","
1237 "\"port\":444,\"protocol_str\":\"h2\"}],"
1238 "\"anonymization\":[],"
1239 "\"network_stats\":{\"srtt\":42},"
1240 "\"server\":\"https://mail.google.com:80\","
1241 "\"supports_spdy\":true}],"
1242 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true},"
1243 "\"version\":5}";
1244
1245 std::string preferences_json;
1246 EXPECT_TRUE(base::JSONWriter::Write(server_dict, &preferences_json));
1247 EXPECT_EQ(expected_json, preferences_json);
1248 }
1249
TEST_F(HttpServerPropertiesManagerTest,ParseAlternativeServiceInfo)1250 TEST_F(HttpServerPropertiesManagerTest, ParseAlternativeServiceInfo) {
1251 InitializePrefs();
1252
1253 base::Value::Dict server_dict = base::test::ParseJsonDict(
1254 "{\"alternative_service\":[{\"port\":443,\"protocol_str\":\"h2\"},"
1255 "{\"port\":123,\"protocol_str\":\"quic\","
1256 "\"expiration\":\"9223372036854775807\"},{\"host\":\"example.org\","
1257 "\"port\":1234,\"protocol_str\":\"h2\","
1258 "\"expiration\":\"13758804000000000\"}]}");
1259
1260 const url::SchemeHostPort server("https", "example.com", 443);
1261 HttpServerProperties::ServerInfo server_info;
1262 EXPECT_TRUE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
1263 server, server_dict, &server_info));
1264
1265 ASSERT_TRUE(server_info.alternative_services.has_value());
1266 AlternativeServiceInfoVector alternative_service_info_vector =
1267 server_info.alternative_services.value();
1268 ASSERT_EQ(3u, alternative_service_info_vector.size());
1269
1270 EXPECT_EQ(kProtoHTTP2,
1271 alternative_service_info_vector[0].alternative_service().protocol);
1272 EXPECT_EQ("", alternative_service_info_vector[0].alternative_service().host);
1273 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1274 // Expiration defaults to one day from now, testing with tolerance.
1275 const base::Time now = base::Time::Now();
1276 const base::Time expiration = alternative_service_info_vector[0].expiration();
1277 EXPECT_LE(now + base::Hours(23), expiration);
1278 EXPECT_GE(now + base::Days(1), expiration);
1279
1280 EXPECT_EQ(kProtoQUIC,
1281 alternative_service_info_vector[1].alternative_service().protocol);
1282 EXPECT_EQ("", alternative_service_info_vector[1].alternative_service().host);
1283 EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service().port);
1284 // numeric_limits<int64_t>::max() represents base::Time::Max().
1285 EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration());
1286
1287 EXPECT_EQ(kProtoHTTP2,
1288 alternative_service_info_vector[2].alternative_service().protocol);
1289 EXPECT_EQ("example.org",
1290 alternative_service_info_vector[2].alternative_service().host);
1291 EXPECT_EQ(1234,
1292 alternative_service_info_vector[2].alternative_service().port);
1293 base::Time expected_expiration;
1294 ASSERT_TRUE(
1295 base::Time::FromUTCString("2036-12-31 10:00:00", &expected_expiration));
1296 EXPECT_EQ(expected_expiration,
1297 alternative_service_info_vector[2].expiration());
1298
1299 // No other fields should have been populated.
1300 server_info.alternative_services.reset();
1301 EXPECT_TRUE(server_info.empty());
1302 }
1303
1304 // Regression test for https://crbug.com/615497.
TEST_F(HttpServerPropertiesManagerTest,DoNotLoadAltSvcForInsecureOrigins)1305 TEST_F(HttpServerPropertiesManagerTest, DoNotLoadAltSvcForInsecureOrigins) {
1306 InitializePrefs();
1307
1308 base::Value::Dict server_dict = base::test::ParseJsonDict(
1309 "{\"alternative_service\":[{\"port\":443,\"protocol_str\":\"h2\","
1310 "\"expiration\":\"9223372036854775807\"}]}");
1311
1312 const url::SchemeHostPort server("http", "example.com", 80);
1313 HttpServerProperties::ServerInfo server_info;
1314 EXPECT_FALSE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
1315 server, server_dict, &server_info));
1316 EXPECT_TRUE(server_info.empty());
1317 }
1318
1319 // Do not persist expired alternative service entries to disk.
TEST_F(HttpServerPropertiesManagerTest,DoNotPersistExpiredAlternativeService)1320 TEST_F(HttpServerPropertiesManagerTest, DoNotPersistExpiredAlternativeService) {
1321 InitializePrefs();
1322
1323 AlternativeServiceInfoVector alternative_service_info_vector;
1324
1325 const AlternativeService broken_alternative_service(
1326 kProtoHTTP2, "broken.example.com", 443);
1327 const base::Time time_one_day_later = base::Time::Now() + base::Days(1);
1328 alternative_service_info_vector.push_back(
1329 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1330 broken_alternative_service, time_one_day_later));
1331 // #1: MarkAlternativeServiceBroken().
1332 http_server_props_->MarkAlternativeServiceBroken(broken_alternative_service,
1333 NetworkAnonymizationKey());
1334
1335 const AlternativeService expired_alternative_service(
1336 kProtoHTTP2, "expired.example.com", 443);
1337 const base::Time time_one_day_ago = base::Time::Now() - base::Days(1);
1338 alternative_service_info_vector.push_back(
1339 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1340 expired_alternative_service, time_one_day_ago));
1341
1342 const AlternativeService valid_alternative_service(kProtoHTTP2,
1343 "valid.example.com", 443);
1344 alternative_service_info_vector.push_back(
1345 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1346 valid_alternative_service, time_one_day_later));
1347
1348 const url::SchemeHostPort server("https", "www.example.com", 443);
1349 // #2: SetAlternativeServices().
1350 http_server_props_->SetAlternativeServices(server, NetworkAnonymizationKey(),
1351 alternative_service_info_vector);
1352
1353 // |net_test_task_runner_| has a remaining pending task to expire
1354 // |broken_alternative_service| at |time_one_day_later|. Fast forward enough
1355 // such that the prefs update task is executed but not the task to expire
1356 // |broken_alternative_service|.
1357 EXPECT_EQ(2U, GetPendingMainThreadTaskCount());
1358 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1359 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
1360 EXPECT_EQ(1U, GetPendingMainThreadTaskCount());
1361 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1362
1363 const base::Value::Dict& pref_dict = pref_delegate_->GetServerProperties();
1364
1365 const base::Value::List* servers_list = pref_dict.FindList("servers");
1366 ASSERT_TRUE(servers_list);
1367 auto it = servers_list->begin();
1368 const base::Value& server_pref_dict = *it;
1369 ASSERT_TRUE(server_pref_dict.is_dict());
1370
1371 const std::string* server_str =
1372 server_pref_dict.GetDict().FindString("server");
1373 ASSERT_TRUE(server_str);
1374 EXPECT_EQ("https://www.example.com", *server_str);
1375
1376 const base::Value* network_anonymization_key_value =
1377 server_pref_dict.GetDict().Find("anonymization");
1378 ASSERT_TRUE(network_anonymization_key_value);
1379 ASSERT_EQ(base::Value::Type::LIST, network_anonymization_key_value->type());
1380 EXPECT_TRUE(network_anonymization_key_value->GetList().empty());
1381
1382 const base::Value::List* altsvc_list =
1383 server_pref_dict.GetDict().FindList("alternative_service");
1384 ASSERT_TRUE(altsvc_list);
1385
1386 ASSERT_EQ(2u, altsvc_list->size());
1387
1388 const base::Value& altsvc_entry = (*altsvc_list)[0];
1389 ASSERT_TRUE(altsvc_entry.is_dict());
1390 const std::string* hostname = altsvc_entry.GetDict().FindString("host");
1391
1392 ASSERT_TRUE(hostname);
1393 EXPECT_EQ("broken.example.com", *hostname);
1394
1395 const base::Value& altsvc_entry2 = (*altsvc_list)[1];
1396 ASSERT_TRUE(altsvc_entry.is_dict());
1397 hostname = altsvc_entry2.GetDict().FindString("host");
1398 ASSERT_TRUE(hostname);
1399 EXPECT_EQ("valid.example.com", *hostname);
1400 }
1401
1402 // Test that expired alternative service entries on disk are ignored.
TEST_F(HttpServerPropertiesManagerTest,DoNotLoadExpiredAlternativeService)1403 TEST_F(HttpServerPropertiesManagerTest, DoNotLoadExpiredAlternativeService) {
1404 InitializePrefs();
1405
1406 base::Value::List alternative_service_list;
1407 base::Value::Dict expired_dict;
1408 expired_dict.Set("protocol_str", "h2");
1409 expired_dict.Set("host", "expired.example.com");
1410 expired_dict.Set("port", 443);
1411 base::Time time_one_day_ago = base::Time::Now() - base::Days(1);
1412 expired_dict.Set("expiration",
1413 base::NumberToString(time_one_day_ago.ToInternalValue()));
1414 alternative_service_list.Append(std::move(expired_dict));
1415
1416 base::Value::Dict valid_dict;
1417 valid_dict.Set("protocol_str", "h2");
1418 valid_dict.Set("host", "valid.example.com");
1419 valid_dict.Set("port", 443);
1420 valid_dict.Set("expiration",
1421 base::NumberToString(one_day_from_now_.ToInternalValue()));
1422 alternative_service_list.Append(std::move(valid_dict));
1423
1424 base::Value::Dict server_pref_dict;
1425 server_pref_dict.Set("alternative_service",
1426 std::move(alternative_service_list));
1427
1428 const url::SchemeHostPort server("https", "example.com", 443);
1429 HttpServerProperties::ServerInfo server_info;
1430 ASSERT_TRUE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
1431 server, server_pref_dict, &server_info));
1432
1433 ASSERT_TRUE(server_info.alternative_services.has_value());
1434 AlternativeServiceInfoVector alternative_service_info_vector =
1435 server_info.alternative_services.value();
1436 ASSERT_EQ(1u, alternative_service_info_vector.size());
1437
1438 EXPECT_EQ(kProtoHTTP2,
1439 alternative_service_info_vector[0].alternative_service().protocol);
1440 EXPECT_EQ("valid.example.com",
1441 alternative_service_info_vector[0].alternative_service().host);
1442 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1443 EXPECT_EQ(one_day_from_now_, alternative_service_info_vector[0].expiration());
1444
1445 // No other fields should have been populated.
1446 server_info.alternative_services.reset();
1447 EXPECT_TRUE(server_info.empty());
1448 }
1449
1450 // Make sure prefs are updated on destruction.
TEST_F(HttpServerPropertiesManagerTest,UpdatePrefsOnShutdown)1451 TEST_F(HttpServerPropertiesManagerTest, UpdatePrefsOnShutdown) {
1452 InitializePrefs();
1453
1454 int pref_updates = 0;
1455 pref_delegate_->set_extra_update_prefs_callback(
1456 base::BindRepeating([](int* updates) { (*updates)++; }, &pref_updates));
1457 http_server_props_.reset();
1458 EXPECT_EQ(1, pref_updates);
1459 }
1460
TEST_F(HttpServerPropertiesManagerTest,PersistAdvertisedVersionsToPref)1461 TEST_F(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
1462 InitializePrefs();
1463
1464 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1465 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1466
1467 // #1 & #2: Set alternate protocol.
1468 AlternativeServiceInfoVector alternative_service_info_vector;
1469 // Quic alternative service set with two advertised QUIC versions.
1470 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1471 base::Time expiration1;
1472 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1473 quic::ParsedQuicVersionVector advertised_versions = {
1474 quic::ParsedQuicVersion::Q046(), quic::ParsedQuicVersion::Q043()};
1475 alternative_service_info_vector.push_back(
1476 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1477 quic_alternative_service1, expiration1, advertised_versions));
1478 // HTTP/2 alternative service should not set any advertised version.
1479 AlternativeService h2_alternative_service(kProtoHTTP2, "www.google.com",
1480 1234);
1481 base::Time expiration2;
1482 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1483 alternative_service_info_vector.push_back(
1484 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1485 h2_alternative_service, expiration2));
1486 http_server_props_->SetAlternativeServices(
1487 server_www, NetworkAnonymizationKey(), alternative_service_info_vector);
1488
1489 // Set another QUIC alternative service with a single advertised QUIC version.
1490 AlternativeService mail_alternative_service(kProtoQUIC, "foo.google.com",
1491 444);
1492 base::Time expiration3 = base::Time::Max();
1493 http_server_props_->SetQuicAlternativeService(
1494 server_mail, NetworkAnonymizationKey(), mail_alternative_service,
1495 expiration3, advertised_versions_);
1496 // #3: Set ServerNetworkStats.
1497 ServerNetworkStats stats;
1498 stats.srtt = base::TimeDelta::FromInternalValue(42);
1499 http_server_props_->SetServerNetworkStats(server_mail,
1500 NetworkAnonymizationKey(), stats);
1501
1502 // #4: Set quic_server_info string.
1503 quic::QuicServerId mail_quic_server_id("mail.google.com", 80, false);
1504 std::string quic_server_info1("quic_server_info1");
1505 http_server_props_->SetQuicServerInfo(
1506 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
1507
1508 // #5: Set SupportsQuic.
1509 IPAddress actual_address(127, 0, 0, 1);
1510 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
1511
1512 // Update Prefs.
1513 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1514 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1515 FastForwardUntilNoTasksRemain();
1516 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1517
1518 // Verify preferences with correct advertised version field.
1519 const char expected_json[] =
1520 "{\"quic_servers\":["
1521 "{\"anonymization\":[],"
1522 "\"server_id\":\"https://mail.google.com:80\","
1523 "\"server_info\":\"quic_server_info1\"}],"
1524 "\"servers\":["
1525 "{\"alternative_service\":[{"
1526 "\"advertised_alpns\":[\"h3-Q046\",\"h3-Q043\"],\"expiration\":"
1527 "\"13756212000000000\","
1528 "\"port\":443,\"protocol_str\":\"quic\"},{\"advertised_alpns\":[],"
1529 "\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
1530 "\"port\":1234,\"protocol_str\":\"h2\"}],"
1531 "\"anonymization\":[],"
1532 "\"server\":\"https://www.google.com:80\"},"
1533 "{\"alternative_service\":[{"
1534 "\"advertised_alpns\":[\"h3\"],"
1535 "\"expiration\":\"9223372036854775807\","
1536 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"quic\"}],"
1537 "\"anonymization\":[],"
1538 "\"network_stats\":{\"srtt\":42},"
1539 "\"server\":\"https://mail.google.com:80\"}],"
1540 "\"supports_quic\":{"
1541 "\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1542
1543 const base::Value::Dict& http_server_properties =
1544 pref_delegate_->GetServerProperties();
1545 std::string preferences_json;
1546 EXPECT_TRUE(
1547 base::JSONWriter::Write(http_server_properties, &preferences_json));
1548 EXPECT_EQ(expected_json, preferences_json);
1549 }
1550
TEST_F(HttpServerPropertiesManagerTest,ReadAdvertisedVersionsFromPref)1551 TEST_F(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) {
1552 InitializePrefs();
1553
1554 base::Value::Dict server_dict = base::test::ParseJsonDict(
1555 "{\"alternative_service\":["
1556 "{\"port\":443,\"protocol_str\":\"quic\"},"
1557 "{\"port\":123,\"protocol_str\":\"quic\","
1558 "\"expiration\":\"9223372036854775807\","
1559 // Add 33 which we know is not supported, as regression test for
1560 // https://crbug.com/1061509
1561 "\"advertised_alpns\":[\"h3-Q033\",\"h3-Q046\",\"h3-Q043\"]}]}");
1562
1563 const url::SchemeHostPort server("https", "example.com", 443);
1564 HttpServerProperties::ServerInfo server_info;
1565 EXPECT_TRUE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
1566 server, server_dict, &server_info));
1567
1568 ASSERT_TRUE(server_info.alternative_services.has_value());
1569 AlternativeServiceInfoVector alternative_service_info_vector =
1570 server_info.alternative_services.value();
1571 ASSERT_EQ(2u, alternative_service_info_vector.size());
1572
1573 // Verify the first alternative service with no advertised version listed.
1574 EXPECT_EQ(kProtoQUIC,
1575 alternative_service_info_vector[0].alternative_service().protocol);
1576 EXPECT_EQ("", alternative_service_info_vector[0].alternative_service().host);
1577 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1578 // Expiration defaults to one day from now, testing with tolerance.
1579 const base::Time now = base::Time::Now();
1580 const base::Time expiration = alternative_service_info_vector[0].expiration();
1581 EXPECT_LE(now + base::Hours(23), expiration);
1582 EXPECT_GE(now + base::Days(1), expiration);
1583 EXPECT_TRUE(alternative_service_info_vector[0].advertised_versions().empty());
1584
1585 // Verify the second alterntaive service with two advertised versions.
1586 EXPECT_EQ(kProtoQUIC,
1587 alternative_service_info_vector[1].alternative_service().protocol);
1588 EXPECT_EQ("", alternative_service_info_vector[1].alternative_service().host);
1589 EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service().port);
1590 EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration());
1591 // Verify advertised versions.
1592 const quic::ParsedQuicVersionVector loaded_advertised_versions =
1593 alternative_service_info_vector[1].advertised_versions();
1594 ASSERT_EQ(2u, loaded_advertised_versions.size());
1595 EXPECT_EQ(quic::ParsedQuicVersion::Q043(), loaded_advertised_versions[0]);
1596 EXPECT_EQ(quic::ParsedQuicVersion::Q046(), loaded_advertised_versions[1]);
1597
1598 // No other fields should have been populated.
1599 server_info.alternative_services.reset();
1600 EXPECT_TRUE(server_info.empty());
1601 }
1602
TEST_F(HttpServerPropertiesManagerTest,UpdatePrefWhenAdvertisedVersionsChange)1603 TEST_F(HttpServerPropertiesManagerTest,
1604 UpdatePrefWhenAdvertisedVersionsChange) {
1605 InitializePrefs();
1606
1607 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1608
1609 // #1: Set alternate protocol.
1610 AlternativeServiceInfoVector alternative_service_info_vector;
1611 // Quic alternative service set with a single QUIC version: Q046.
1612 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1613 base::Time expiration1;
1614 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1615 alternative_service_info_vector.push_back(
1616 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1617 quic_alternative_service1, expiration1, advertised_versions_));
1618 http_server_props_->SetAlternativeServices(
1619 server_www, NetworkAnonymizationKey(), alternative_service_info_vector);
1620
1621 // Set quic_server_info string.
1622 quic::QuicServerId mail_quic_server_id("mail.google.com", 80, false);
1623 std::string quic_server_info1("quic_server_info1");
1624 http_server_props_->SetQuicServerInfo(
1625 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
1626
1627 // Set SupportsQuic.
1628 IPAddress actual_address(127, 0, 0, 1);
1629 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
1630
1631 // Update Prefs.
1632 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1633 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1634 FastForwardUntilNoTasksRemain();
1635 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1636
1637 // Verify preferences with correct advertised version field.
1638 const char expected_json[] =
1639 "{\"quic_servers\":"
1640 "[{\"anonymization\":[],"
1641 "\"server_id\":\"https://mail.google.com:80\","
1642 "\"server_info\":\"quic_server_info1\"}],"
1643 "\"servers\":["
1644 "{\"alternative_service\":[{"
1645 "\"advertised_alpns\":[\"h3\"],"
1646 "\"expiration\":\"13756212000000000\",\"port\":443,"
1647 "\"protocol_str\":\"quic\"}],"
1648 "\"anonymization\":[],"
1649 "\"server\":\"https://www.google.com:80\"}],"
1650 "\"supports_quic\":"
1651 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1652
1653 const base::Value::Dict& http_server_properties =
1654 pref_delegate_->GetServerProperties();
1655 std::string preferences_json;
1656 EXPECT_TRUE(
1657 base::JSONWriter::Write(http_server_properties, &preferences_json));
1658 EXPECT_EQ(expected_json, preferences_json);
1659
1660 // #2: Set AlternativeService with different advertised_versions for the same
1661 // AlternativeService.
1662 AlternativeServiceInfoVector alternative_service_info_vector_2;
1663 // Quic alternative service set with two advertised QUIC versions.
1664 quic::ParsedQuicVersionVector advertised_versions = {
1665 quic::ParsedQuicVersion::Q046(), quic::ParsedQuicVersion::Q043()};
1666 alternative_service_info_vector_2.push_back(
1667 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1668 quic_alternative_service1, expiration1, advertised_versions));
1669 http_server_props_->SetAlternativeServices(
1670 server_www, NetworkAnonymizationKey(), alternative_service_info_vector_2);
1671
1672 // Update Prefs.
1673 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1674 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1675 FastForwardUntilNoTasksRemain();
1676 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1677
1678 // Verify preferences updated with new advertised versions.
1679 const char expected_json_updated[] =
1680 "{\"quic_servers\":"
1681 "[{\"anonymization\":[],"
1682 "\"server_id\":\"https://mail.google.com:80\","
1683 "\"server_info\":\"quic_server_info1\"}],"
1684 "\"servers\":["
1685 "{\"alternative_service\":"
1686 "[{\"advertised_alpns\":[\"h3-Q046\",\"h3-Q043\"],"
1687 "\"expiration\":\"13756212000000000\",\"port\":443,"
1688 "\"protocol_str\":\"quic\"}],"
1689 "\"anonymization\":[],"
1690 "\"server\":\"https://www.google.com:80\"}],"
1691 "\"supports_quic\":"
1692 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1693 EXPECT_TRUE(
1694 base::JSONWriter::Write(http_server_properties, &preferences_json));
1695 EXPECT_EQ(expected_json_updated, preferences_json);
1696
1697 // #3: Set AlternativeService with same advertised_versions.
1698 AlternativeServiceInfoVector alternative_service_info_vector_3;
1699 // A same set of QUIC versions but listed in a different order.
1700 quic::ParsedQuicVersionVector advertised_versions_2 = {
1701 quic::ParsedQuicVersion::Q043(), quic::ParsedQuicVersion::Q046()};
1702 alternative_service_info_vector_3.push_back(
1703 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1704 quic_alternative_service1, expiration1, advertised_versions_2));
1705 http_server_props_->SetAlternativeServices(
1706 server_www, NetworkAnonymizationKey(), alternative_service_info_vector_3);
1707
1708 // Change in version ordering causes prefs update.
1709 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1710 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1711 FastForwardUntilNoTasksRemain();
1712 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1713
1714 // Verify preferences updated with new advertised versions.
1715 const char expected_json_updated2[] =
1716 "{\"quic_servers\":"
1717 "[{\"anonymization\":[],"
1718 "\"server_id\":\"https://mail.google.com:80\","
1719 "\"server_info\":\"quic_server_info1\"}],"
1720 "\"servers\":["
1721 "{\"alternative_service\":"
1722 "[{\"advertised_alpns\":[\"h3-Q043\",\"h3-Q046\"],"
1723 "\"expiration\":\"13756212000000000\",\"port\":443,"
1724 "\"protocol_str\":\"quic\"}],"
1725 "\"anonymization\":[],"
1726 "\"server\":\"https://www.google.com:80\"}],"
1727 "\"supports_quic\":"
1728 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1729 EXPECT_TRUE(
1730 base::JSONWriter::Write(http_server_properties, &preferences_json));
1731 EXPECT_EQ(expected_json_updated2, preferences_json);
1732 }
1733
TEST_F(HttpServerPropertiesManagerTest,UpdateCacheWithPrefs)1734 TEST_F(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
1735 AlternativeService cached_broken_service(kProtoQUIC, "cached_broken", 443);
1736 AlternativeService cached_broken_service2(kProtoQUIC, "cached_broken2", 443);
1737 AlternativeService cached_recently_broken_service(kProtoQUIC,
1738 "cached_rbroken", 443);
1739
1740 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service,
1741 NetworkAnonymizationKey());
1742 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service2,
1743 NetworkAnonymizationKey());
1744 http_server_props_->MarkAlternativeServiceRecentlyBroken(
1745 cached_recently_broken_service, NetworkAnonymizationKey());
1746
1747 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1748 // There should be a task to remove remove alt services from the cache of
1749 // broken alt services. There should be no task to update the prefs, since the
1750 // prefs file hasn't been loaded yet.
1751 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1752
1753 // Load the |pref_delegate_| with some JSON to verify updating the cache from
1754 // prefs. For the broken alternative services "www.google.com:1234" and
1755 // "cached_broken", the expiration time will be one day from now.
1756
1757 std::string expiration_str =
1758 base::NumberToString(static_cast<int64_t>(one_day_from_now_.ToTimeT()));
1759
1760 base::Value::Dict server_dict = base::test::ParseJsonDict(
1761 "{"
1762 "\"broken_alternative_services\":["
1763 "{\"broken_until\":\"" +
1764 expiration_str +
1765 "\","
1766 "\"host\":\"www.google.com\",\"anonymization\":[],"
1767 "\"port\":1234,\"protocol_str\":\"h2\"},"
1768 "{\"broken_count\":2,\"broken_until\":\"" +
1769 expiration_str +
1770 "\","
1771 "\"host\":\"cached_broken\",\"anonymization\":[],"
1772 "\"port\":443,\"protocol_str\":\"quic\"},"
1773 "{\"broken_count\":3,"
1774 "\"host\":\"cached_rbroken\",\"anonymization\":[],"
1775 "\"port\":443,\"protocol_str\":\"quic\"}],"
1776 "\"quic_servers\":["
1777 "{\"anonymization\":[],"
1778 "\"server_id\":\"https://mail.google.com:80\","
1779 "\"server_info\":\"quic_server_info1\"}"
1780 "],"
1781 "\"servers\":["
1782 "{\"server\":\"https://www.google.com:80\","
1783 "\"anonymization\":[],"
1784 "\"alternative_service\":["
1785 "{\"expiration\":\"13756212000000000\",\"port\":443,"
1786 "\"protocol_str\":\"h2\"},"
1787 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
1788 "\"port\":1234,\"protocol_str\":\"h2\"}"
1789 "]"
1790 "},"
1791 "{\"server\":\"https://mail.google.com:80\","
1792 "\"anonymization\":[],"
1793 "\"alternative_service\":["
1794 "{\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\","
1795 "\"port\":444,\"protocol_str\":\"h2\"}"
1796 "],"
1797 "\"network_stats\":{\"srtt\":42}"
1798 "}"
1799 "],"
1800 "\"supports_quic\":"
1801 "{\"address\":\"127.0.0.1\",\"used_quic\":true},"
1802 "\"version\":5"
1803 "}");
1804
1805 // Don't use the test fixture's InitializePrefs() method, since there are
1806 // pending tasks. Initializing prefs should queue a pref update task, since
1807 // prefs have been modified.
1808 pref_delegate_->InitializePrefs(std::move(server_dict));
1809 EXPECT_TRUE(http_server_props_->IsInitialized());
1810 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1811
1812 // Run until prefs are updated.
1813 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
1814 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1815 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1816
1817 //
1818 // Verify alternative service info for https://www.google.com
1819 //
1820 AlternativeServiceInfoVector alternative_service_info_vector =
1821 http_server_props_->GetAlternativeServiceInfos(
1822 url::SchemeHostPort("https", "www.google.com", 80),
1823 NetworkAnonymizationKey());
1824 ASSERT_EQ(2u, alternative_service_info_vector.size());
1825
1826 EXPECT_EQ(kProtoHTTP2,
1827 alternative_service_info_vector[0].alternative_service().protocol);
1828 EXPECT_EQ("www.google.com",
1829 alternative_service_info_vector[0].alternative_service().host);
1830 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1831 EXPECT_EQ(
1832 "13756212000000000",
1833 base::NumberToString(
1834 alternative_service_info_vector[0].expiration().ToInternalValue()));
1835
1836 EXPECT_EQ(kProtoHTTP2,
1837 alternative_service_info_vector[1].alternative_service().protocol);
1838 EXPECT_EQ("www.google.com",
1839 alternative_service_info_vector[1].alternative_service().host);
1840 EXPECT_EQ(1234,
1841 alternative_service_info_vector[1].alternative_service().port);
1842 EXPECT_EQ(
1843 "13758804000000000",
1844 base::NumberToString(
1845 alternative_service_info_vector[1].expiration().ToInternalValue()));
1846
1847 //
1848 // Verify alternative service info for https://mail.google.com
1849 //
1850 alternative_service_info_vector =
1851 http_server_props_->GetAlternativeServiceInfos(
1852 url::SchemeHostPort("https", "mail.google.com", 80),
1853 NetworkAnonymizationKey());
1854 ASSERT_EQ(1u, alternative_service_info_vector.size());
1855
1856 EXPECT_EQ(kProtoHTTP2,
1857 alternative_service_info_vector[0].alternative_service().protocol);
1858 EXPECT_EQ("foo.google.com",
1859 alternative_service_info_vector[0].alternative_service().host);
1860 EXPECT_EQ(444, alternative_service_info_vector[0].alternative_service().port);
1861 EXPECT_EQ(
1862 "9223372036854775807",
1863 base::NumberToString(
1864 alternative_service_info_vector[0].expiration().ToInternalValue()));
1865
1866 //
1867 // Verify broken alternative services.
1868 //
1869 AlternativeService prefs_broken_service(kProtoHTTP2, "www.google.com", 1234);
1870 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1871 cached_broken_service, NetworkAnonymizationKey()));
1872 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1873 cached_broken_service2, NetworkAnonymizationKey()));
1874 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1875 prefs_broken_service, NetworkAnonymizationKey()));
1876
1877 // Verify brokenness expiration times.
1878 // |cached_broken_service|'s expiration time should've been overwritten by the
1879 // prefs to be approximately 1 day from now. |cached_broken_service2|'s
1880 // expiration time should still be 5 minutes due to being marked broken.
1881 // |prefs_broken_service|'s expiration time should be approximately 1 day from
1882 // now which comes from the prefs.
1883 FastForwardBy(base::Minutes(5) -
1884 HttpServerProperties::GetUpdatePrefsDelayForTesting());
1885 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1886 cached_broken_service, NetworkAnonymizationKey()));
1887 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1888 cached_broken_service2, NetworkAnonymizationKey()));
1889 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1890 prefs_broken_service, NetworkAnonymizationKey()));
1891 FastForwardBy(base::Days(1));
1892 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1893 cached_broken_service, NetworkAnonymizationKey()));
1894 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1895 cached_broken_service2, NetworkAnonymizationKey()));
1896 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1897 prefs_broken_service, NetworkAnonymizationKey()));
1898
1899 // Now that |prefs_broken_service|'s brokenness has expired, it should've
1900 // been removed from the alternative services info vectors of all servers.
1901 alternative_service_info_vector =
1902 http_server_props_->GetAlternativeServiceInfos(
1903 url::SchemeHostPort("https", "www.google.com", 80),
1904 NetworkAnonymizationKey());
1905 ASSERT_EQ(1u, alternative_service_info_vector.size());
1906
1907 //
1908 // Verify recently broken alternative services.
1909 //
1910
1911 // If an entry is already in cache, the broken count in the prefs should
1912 // overwrite the one in the cache.
1913 // |prefs_broken_service| should have broken-count 1 from prefs.
1914 // |cached_recently_broken_service| should have broken-count 3 from prefs.
1915 // |cached_broken_service| should have broken-count 2 from prefs.
1916 // |cached_broken_service2| should have broken-count 1 from being marked
1917 // broken.
1918
1919 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1920 prefs_broken_service, NetworkAnonymizationKey()));
1921 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1922 cached_recently_broken_service, NetworkAnonymizationKey()));
1923 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1924 cached_broken_service, NetworkAnonymizationKey()));
1925 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1926 cached_broken_service2, NetworkAnonymizationKey()));
1927 // Make sure |prefs_broken_service| has the right expiration delay when marked
1928 // broken. Since |prefs_broken_service| had no broken_count specified in the
1929 // prefs, a broken_count value of 1 should have been assumed by
1930 // |http_server_props_|.
1931 http_server_props_->MarkAlternativeServiceBroken(prefs_broken_service,
1932 NetworkAnonymizationKey());
1933 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1934 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1935 FastForwardBy(base::Minutes(10) - base::TimeDelta::FromInternalValue(1));
1936 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1937 prefs_broken_service, NetworkAnonymizationKey()));
1938 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1939 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1940 prefs_broken_service, NetworkAnonymizationKey()));
1941 // Make sure |cached_recently_broken_service| has the right expiration delay
1942 // when marked broken.
1943 http_server_props_->MarkAlternativeServiceBroken(
1944 cached_recently_broken_service, NetworkAnonymizationKey());
1945 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1946 FastForwardBy(base::Minutes(40) - base::TimeDelta::FromInternalValue(1));
1947 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1948 cached_recently_broken_service, NetworkAnonymizationKey()));
1949 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1950 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1951 cached_recently_broken_service, NetworkAnonymizationKey()));
1952 // Make sure |cached_broken_service| has the right expiration delay when
1953 // marked broken.
1954 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service,
1955 NetworkAnonymizationKey());
1956 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1957 FastForwardBy(base::Minutes(20) - base::TimeDelta::FromInternalValue(1));
1958 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1959 cached_broken_service, NetworkAnonymizationKey()));
1960 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1961 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1962 cached_broken_service, NetworkAnonymizationKey()));
1963 // Make sure |cached_broken_service2| has the right expiration delay when
1964 // marked broken.
1965 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service2,
1966 NetworkAnonymizationKey());
1967 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1968 FastForwardBy(base::Minutes(10) - base::TimeDelta::FromInternalValue(1));
1969 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1970 cached_broken_service2, NetworkAnonymizationKey()));
1971 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1972 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1973 cached_broken_service2, NetworkAnonymizationKey()));
1974
1975 //
1976 // Verify ServerNetworkStats.
1977 //
1978 const ServerNetworkStats* server_network_stats =
1979 http_server_props_->GetServerNetworkStats(
1980 url::SchemeHostPort("https", "mail.google.com", 80),
1981 NetworkAnonymizationKey());
1982 EXPECT_TRUE(server_network_stats);
1983 EXPECT_EQ(server_network_stats->srtt, base::TimeDelta::FromInternalValue(42));
1984
1985 //
1986 // Verify QUIC server info.
1987 //
1988 const std::string* quic_server_info = http_server_props_->GetQuicServerInfo(
1989 quic::QuicServerId("mail.google.com", 80, false),
1990 NetworkAnonymizationKey());
1991 EXPECT_EQ("quic_server_info1", *quic_server_info);
1992
1993 //
1994 // Verify supports QUIC.
1995 //
1996 IPAddress actual_address(127, 0, 0, 1);
1997 EXPECT_TRUE(
1998 http_server_props_->WasLastLocalAddressWhenQuicWorked(actual_address));
1999 EXPECT_EQ(4, pref_delegate_->GetAndClearNumPrefUpdates());
2000 }
2001
2002 // Check the interaction of ForceHTTP11 with saving/restoring settings.
2003 // In particular, ForceHTTP11 is not saved, and it should not overwrite or be
2004 // overitten by loaded data.
TEST_F(HttpServerPropertiesManagerTest,ForceHTTP11)2005 TEST_F(HttpServerPropertiesManagerTest, ForceHTTP11) {
2006 const url::SchemeHostPort kServer1("https", "foo.test", 443);
2007 const url::SchemeHostPort kServer2("https", "bar.test", 443);
2008 const url::SchemeHostPort kServer3("https", "baz.test", 443);
2009
2010 // Create and initialize an HttpServerProperties with no state.
2011 std::unique_ptr<MockPrefDelegate> pref_delegate =
2012 std::make_unique<MockPrefDelegate>();
2013 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2014 std::unique_ptr<HttpServerProperties> properties =
2015 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2016 /*net_log=*/nullptr,
2017 GetMockTickClock());
2018 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2019
2020 // Set kServer1 to support H2, but require HTTP/1.1. Set kServer2 to only
2021 // require HTTP/1.1.
2022 EXPECT_FALSE(
2023 properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2024 EXPECT_FALSE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2025 EXPECT_FALSE(
2026 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2027 EXPECT_FALSE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2028 properties->SetSupportsSpdy(kServer1, NetworkAnonymizationKey(), true);
2029 properties->SetHTTP11Required(kServer1, NetworkAnonymizationKey());
2030 properties->SetHTTP11Required(kServer2, NetworkAnonymizationKey());
2031 EXPECT_TRUE(properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2032 EXPECT_TRUE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2033 EXPECT_FALSE(
2034 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2035 EXPECT_TRUE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2036
2037 // Wait until the data's been written to prefs, and then tear down the
2038 // HttpServerProperties.
2039 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2040 base::Value::Dict saved_value =
2041 unowned_pref_delegate->GetServerProperties().Clone();
2042 properties.reset();
2043
2044 // Only information on kServer1 should have been saved to prefs.
2045 std::string preferences_json;
2046 base::JSONWriter::Write(saved_value, &preferences_json);
2047 EXPECT_EQ(
2048 "{\"servers\":["
2049 "{\"anonymization\":[],"
2050 "\"server\":\"https://foo.test\","
2051 "\"supports_spdy\":true}],"
2052 "\"version\":5}",
2053 preferences_json);
2054
2055 // Create a new HttpServerProperties using the value saved to prefs above.
2056 pref_delegate = std::make_unique<MockPrefDelegate>();
2057 unowned_pref_delegate = pref_delegate.get();
2058 properties = std::make_unique<HttpServerProperties>(
2059 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2060
2061 // Before the data has loaded, set kServer1 and kServer3 as requiring
2062 // HTTP/1.1.
2063 EXPECT_FALSE(
2064 properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2065 EXPECT_FALSE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2066 properties->SetHTTP11Required(kServer1, NetworkAnonymizationKey());
2067 properties->SetHTTP11Required(kServer3, NetworkAnonymizationKey());
2068 EXPECT_FALSE(
2069 properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2070 EXPECT_TRUE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2071 EXPECT_FALSE(
2072 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2073 EXPECT_FALSE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2074 EXPECT_FALSE(
2075 properties->GetSupportsSpdy(kServer3, NetworkAnonymizationKey()));
2076 EXPECT_TRUE(properties->RequiresHTTP11(kServer3, NetworkAnonymizationKey()));
2077
2078 // The data loads.
2079 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2080
2081 // The properties should contain a combination of the old and new data.
2082 EXPECT_TRUE(properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2083 EXPECT_TRUE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2084 EXPECT_FALSE(
2085 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2086 EXPECT_FALSE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2087 EXPECT_FALSE(
2088 properties->GetSupportsSpdy(kServer3, NetworkAnonymizationKey()));
2089 EXPECT_TRUE(properties->RequiresHTTP11(kServer3, NetworkAnonymizationKey()));
2090 }
2091
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyServerInfo)2092 TEST_F(HttpServerPropertiesManagerTest, NetworkAnonymizationKeyServerInfo) {
2093 const SchemefulSite kSite1(GURL("https://foo.test/"));
2094 const SchemefulSite kSite2(GURL("https://bar.test/"));
2095 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2096 const url::SchemeHostPort kServer("https", "baz.test", 443);
2097 const url::SchemeHostPort kServer2("https", "zab.test", 443);
2098
2099 HttpServerProperties::ServerInfo server_info;
2100 server_info.supports_spdy = true;
2101
2102 for (auto save_network_anonymization_key_mode :
2103 kNetworkAnonymizationKeyModes) {
2104 SCOPED_TRACE(static_cast<int>(save_network_anonymization_key_mode));
2105
2106 // Save prefs using |save_network_anonymization_key_mode|.
2107 base::Value::Dict saved_value;
2108 {
2109 // Configure the the feature.
2110 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2111 SetNetworkAnonymizationKeyMode(save_network_anonymization_key_mode);
2112
2113 // This parameter is normally calculated by HttpServerProperties based on
2114 // the kPartitionHttpServerPropertiesByNetworkIsolationKey feature, but
2115 // this test doesn't use that class.
2116 bool use_network_anonymization_key =
2117 save_network_anonymization_key_mode !=
2118 NetworkAnonymizationKeyMode::kDisabled;
2119
2120 HttpServerProperties::ServerInfoMap server_info_map;
2121
2122 // Add server info entry using two origins with value of |server_info|.
2123 // NetworkAnonymizationKey's constructor takes the state of the
2124 // kAppendFrameOriginToNetworkAnonymizationKey feature into account, so
2125 // need to make sure to call the constructor after setting up the feature
2126 // above.
2127 HttpServerProperties::ServerInfoMapKey server_info_key(
2128 kServer, NetworkAnonymizationKey::CreateCrossSite(kSite1),
2129 use_network_anonymization_key);
2130 server_info_map.Put(server_info_key, server_info);
2131
2132 // Also add an etry with an opaque origin, if
2133 // |use_network_anonymization_key| is true. This value should not be saved
2134 // to disk, since opaque origins are only meaningful within a browsing
2135 // session.
2136 if (use_network_anonymization_key) {
2137 HttpServerProperties::ServerInfoMapKey server_info_key2(
2138 kServer2, NetworkAnonymizationKey::CreateSameSite(kOpaqueSite),
2139 use_network_anonymization_key);
2140 server_info_map.Put(server_info_key2, server_info);
2141 }
2142
2143 saved_value = ServerInfoMapToDict(server_info_map);
2144 }
2145
2146 for (auto load_network_anonymization_key_mode :
2147 kNetworkAnonymizationKeyModes) {
2148 SCOPED_TRACE(static_cast<int>(load_network_anonymization_key_mode));
2149
2150 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2151 SetNetworkAnonymizationKeyMode(load_network_anonymization_key_mode);
2152 std::unique_ptr<HttpServerProperties::ServerInfoMap> server_info_map2 =
2153 DictToServerInfoMap(saved_value.Clone());
2154 ASSERT_TRUE(server_info_map2);
2155 if (save_network_anonymization_key_mode ==
2156 NetworkAnonymizationKeyMode::kDisabled) {
2157 // If NetworkAnonymizationKey was disabled when saving, it was saved
2158 // with an empty NetworkAnonymizationKey, which should always be loaded
2159 // successfully. This is needed to continue to support consumers that
2160 // don't use NetworkAnonymizationKeys.
2161 ASSERT_EQ(1u, server_info_map2->size());
2162 const HttpServerProperties::ServerInfoMapKey& server_info_key2 =
2163 server_info_map2->begin()->first;
2164 const HttpServerProperties::ServerInfo& server_info2 =
2165 server_info_map2->begin()->second;
2166 EXPECT_EQ(kServer, server_info_key2.server);
2167 EXPECT_EQ(NetworkAnonymizationKey(),
2168 server_info_key2.network_anonymization_key);
2169 EXPECT_EQ(server_info, server_info2);
2170 } else if (save_network_anonymization_key_mode ==
2171 load_network_anonymization_key_mode) {
2172 // If the save and load modes are the same, the load should succeed, and
2173 // the network anonymization keys should match.
2174 ASSERT_EQ(1u, server_info_map2->size());
2175 const HttpServerProperties::ServerInfoMapKey& server_info_key2 =
2176 server_info_map2->begin()->first;
2177 const HttpServerProperties::ServerInfo& server_info2 =
2178 server_info_map2->begin()->second;
2179 EXPECT_EQ(kServer, server_info_key2.server);
2180 EXPECT_EQ(NetworkAnonymizationKey::CreateCrossSite(kSite1),
2181 server_info_key2.network_anonymization_key);
2182 EXPECT_EQ(server_info, server_info2);
2183 } else {
2184 // Otherwise, the NetworkAnonymizationKey doesn't make sense with the
2185 // current feature values, so the ServerInfo should be discarded.
2186 EXPECT_EQ(0u, server_info_map2->size());
2187 }
2188 }
2189 }
2190 }
2191
2192 // Tests a full round trip with a NetworkAnonymizationKey, using the
2193 // HttpServerProperties interface.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyIntegration)2194 TEST_F(HttpServerPropertiesManagerTest, NetworkAnonymizationKeyIntegration) {
2195 const SchemefulSite kSite(GURL("https://foo.test/"));
2196 const auto kNetworkAnonymizationKey =
2197 NetworkAnonymizationKey::CreateSameSite(kSite);
2198 const url::SchemeHostPort kServer("https", "baz.test", 443);
2199
2200 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2201 const auto kOpaqueSiteNetworkAnonymizationKey =
2202 NetworkAnonymizationKey::CreateSameSite(kOpaqueSite);
2203 const url::SchemeHostPort kServer2("https", "zab.test", 443);
2204
2205 base::test::ScopedFeatureList feature_list;
2206 feature_list.InitAndEnableFeature(
2207 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2208
2209 // Create and initialize an HttpServerProperties with no state.
2210 std::unique_ptr<MockPrefDelegate> pref_delegate =
2211 std::make_unique<MockPrefDelegate>();
2212 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2213 std::unique_ptr<HttpServerProperties> properties =
2214 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2215 /*net_log=*/nullptr,
2216 GetMockTickClock());
2217 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2218
2219 // Set a values using kNetworkAnonymizationKey.
2220 properties->SetSupportsSpdy(kServer, kNetworkAnonymizationKey, true);
2221 EXPECT_TRUE(properties->GetSupportsSpdy(kServer, kNetworkAnonymizationKey));
2222 EXPECT_FALSE(
2223 properties->GetSupportsSpdy(kServer, kOpaqueSiteNetworkAnonymizationKey));
2224 EXPECT_FALSE(properties->GetSupportsSpdy(kServer, NetworkAnonymizationKey()));
2225
2226 // Opaque origins should works with HttpServerProperties, but not be persisted
2227 // to disk.
2228 properties->SetSupportsSpdy(kServer2, kOpaqueSiteNetworkAnonymizationKey,
2229 true);
2230 EXPECT_FALSE(properties->GetSupportsSpdy(kServer2, kNetworkAnonymizationKey));
2231 EXPECT_TRUE(properties->GetSupportsSpdy(kServer2,
2232 kOpaqueSiteNetworkAnonymizationKey));
2233 EXPECT_FALSE(
2234 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2235
2236 // Wait until the data's been written to prefs, and then tear down the
2237 // HttpServerProperties.
2238 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2239 base::Value::Dict saved_value =
2240 unowned_pref_delegate->GetServerProperties().Clone();
2241 properties.reset();
2242
2243 // Create a new HttpServerProperties using the value saved to prefs above.
2244 pref_delegate = std::make_unique<MockPrefDelegate>();
2245 unowned_pref_delegate = pref_delegate.get();
2246 properties = std::make_unique<HttpServerProperties>(
2247 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2248 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2249
2250 // The information set using kNetworkAnonymizationKey on the original
2251 // HttpServerProperties should also be set on the restored
2252 // HttpServerProperties.
2253 EXPECT_TRUE(properties->GetSupportsSpdy(kServer, kNetworkAnonymizationKey));
2254 EXPECT_FALSE(
2255 properties->GetSupportsSpdy(kServer, kOpaqueSiteNetworkAnonymizationKey));
2256 EXPECT_FALSE(properties->GetSupportsSpdy(kServer, NetworkAnonymizationKey()));
2257
2258 // The information set using kOpaqueSiteNetworkAnonymizationKey should not
2259 // have been restored.
2260 EXPECT_FALSE(properties->GetSupportsSpdy(kServer2, kNetworkAnonymizationKey));
2261 EXPECT_FALSE(properties->GetSupportsSpdy(kServer2,
2262 kOpaqueSiteNetworkAnonymizationKey));
2263 EXPECT_FALSE(
2264 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2265 }
2266
2267 // Tests a full round trip to prefs and back in the canonical suffix case.
2268 // Enable NetworkAnonymizationKeys, as they have some interactions with the
2269 // canonical suffix logic.
TEST_F(HttpServerPropertiesManagerTest,CanonicalSuffixRoundTripWithNetworkAnonymizationKey)2270 TEST_F(HttpServerPropertiesManagerTest,
2271 CanonicalSuffixRoundTripWithNetworkAnonymizationKey) {
2272 const SchemefulSite kSite1(GURL("https://foo.test/"));
2273 const SchemefulSite kSite2(GURL("https://bar.test/"));
2274 const auto kNetworkAnonymizationKey1 =
2275 NetworkAnonymizationKey::CreateSameSite(kSite1);
2276 const auto kNetworkAnonymizationKey2 =
2277 NetworkAnonymizationKey::CreateSameSite(kSite2);
2278 // Three servers with the same canonical suffix (".c.youtube.com").
2279 const url::SchemeHostPort kServer1("https", "foo.c.youtube.com", 443);
2280 const url::SchemeHostPort kServer2("https", "bar.c.youtube.com", 443);
2281 const url::SchemeHostPort kServer3("https", "baz.c.youtube.com", 443);
2282
2283 base::test::ScopedFeatureList feature_list;
2284 feature_list.InitAndEnableFeature(
2285 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2286
2287 // Create three alt service vectors of different lengths.
2288 base::Time expiration = base::Time::Now() + base::Days(1);
2289 AlternativeServiceInfo alt_service1 =
2290 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
2291 AlternativeService(kProtoQUIC, "foopy.c.youtube.com", 1234),
2292 expiration, DefaultSupportedQuicVersions());
2293 AlternativeServiceInfo alt_service2 =
2294 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
2295 AlternativeService(kProtoHTTP2, "foopy.c.youtube.com", 443),
2296 expiration);
2297 AlternativeServiceInfo alt_service3 =
2298 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
2299 AlternativeService(kProtoHTTP2, "foopy2.c.youtube.com", 443),
2300 expiration);
2301 AlternativeServiceInfoVector alt_service_vector1 = {alt_service1};
2302 AlternativeServiceInfoVector alt_service_vector2 = {alt_service1,
2303 alt_service2};
2304 AlternativeServiceInfoVector alt_service_vector3 = {
2305 alt_service1, alt_service2, alt_service3};
2306
2307 // Create and initialize an HttpServerProperties with no state.
2308 std::unique_ptr<MockPrefDelegate> pref_delegate =
2309 std::make_unique<MockPrefDelegate>();
2310 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2311 std::unique_ptr<HttpServerProperties> properties =
2312 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2313 /*net_log=*/nullptr,
2314 GetMockTickClock());
2315 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2316
2317 // Set alternative services for kServer1 using kNetworkAnonymizationKey1. That
2318 // information should be retrieved when fetching information for any server
2319 // with the same canonical suffix, when using kNetworkAnonymizationKey1.
2320 properties->SetAlternativeServices(kServer1, kNetworkAnonymizationKey1,
2321 alt_service_vector1);
2322 EXPECT_EQ(
2323 1u, properties
2324 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2325 .size());
2326 EXPECT_EQ(
2327 1u, properties
2328 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2329 .size());
2330 EXPECT_EQ(
2331 1u, properties
2332 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2333 .size());
2334 EXPECT_EQ(
2335 0u, properties
2336 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2337 .size());
2338
2339 // Set different alternative services for kServer2 using
2340 // kNetworkAnonymizationKey1. It should not affect information retrieved for
2341 // kServer1, but should for kServer2 and kServer3.
2342 properties->SetAlternativeServices(kServer2, kNetworkAnonymizationKey1,
2343 alt_service_vector2);
2344 EXPECT_EQ(
2345 1u, properties
2346 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2347 .size());
2348 EXPECT_EQ(
2349 2u, properties
2350 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2351 .size());
2352 EXPECT_EQ(
2353 2u, properties
2354 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2355 .size());
2356 EXPECT_EQ(
2357 0u, properties
2358 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2359 .size());
2360
2361 // Set different information for kServer1 using kNetworkAnonymizationKey2. It
2362 // should not affect information stored for kNetworkAnonymizationKey1.
2363 properties->SetAlternativeServices(kServer1, kNetworkAnonymizationKey2,
2364 alt_service_vector3);
2365 EXPECT_EQ(
2366 1u, properties
2367 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2368 .size());
2369 EXPECT_EQ(
2370 2u, properties
2371 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2372 .size());
2373 EXPECT_EQ(
2374 2u, properties
2375 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2376 .size());
2377 EXPECT_EQ(
2378 3u, properties
2379 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2380 .size());
2381 EXPECT_EQ(
2382 3u, properties
2383 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey2)
2384 .size());
2385 EXPECT_EQ(
2386 3u, properties
2387 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey2)
2388 .size());
2389
2390 // Wait until the data's been written to prefs, and then tear down the
2391 // HttpServerProperties.
2392 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2393 base::Value::Dict saved_value =
2394 unowned_pref_delegate->GetServerProperties().Clone();
2395 properties.reset();
2396
2397 // Create a new HttpServerProperties using the value saved to prefs above.
2398 pref_delegate = std::make_unique<MockPrefDelegate>();
2399 unowned_pref_delegate = pref_delegate.get();
2400 properties = std::make_unique<HttpServerProperties>(
2401 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2402 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2403
2404 // Only the last of the values learned for kNetworkAnonymizationKey1 should
2405 // have been saved, and the value for kNetworkAnonymizationKey2 as well. The
2406 // canonical suffix logic should still be respected.
2407 EXPECT_EQ(
2408 2u, properties
2409 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2410 .size());
2411 EXPECT_EQ(
2412 2u, properties
2413 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2414 .size());
2415 EXPECT_EQ(
2416 2u, properties
2417 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2418 .size());
2419 EXPECT_EQ(
2420 3u, properties
2421 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2422 .size());
2423 EXPECT_EQ(
2424 3u, properties
2425 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey2)
2426 .size());
2427 EXPECT_EQ(
2428 3u, properties
2429 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey2)
2430 .size());
2431 }
2432
2433 // Tests a full round trip with a NetworkAnonymizationKey, using the
2434 // HttpServerProperties interface and setting alternative services as broken.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyBrokenAltServiceRoundTrip)2435 TEST_F(HttpServerPropertiesManagerTest,
2436 NetworkAnonymizationKeyBrokenAltServiceRoundTrip) {
2437 const SchemefulSite kSite1(GURL("https://foo1.test/"));
2438 const SchemefulSite kSite2(GURL("https://foo2.test/"));
2439 const auto kNetworkAnonymizationKey1 =
2440 NetworkAnonymizationKey::CreateSameSite(kSite1);
2441 const auto kNetworkAnonymizationKey2 =
2442 NetworkAnonymizationKey::CreateSameSite(kSite2);
2443
2444 const AlternativeService kAlternativeService1(kProtoHTTP2,
2445 "alt.service1.test", 443);
2446 const AlternativeService kAlternativeService2(kProtoHTTP2,
2447 "alt.service2.test", 443);
2448
2449 for (auto save_network_anonymization_key_mode :
2450 kNetworkAnonymizationKeyModes) {
2451 SCOPED_TRACE(static_cast<int>(save_network_anonymization_key_mode));
2452
2453 // Save prefs using |save_network_anonymization_key_mode|.
2454 base::Value::Dict saved_value;
2455 {
2456 // Configure the the feature.
2457 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2458 SetNetworkAnonymizationKeyMode(save_network_anonymization_key_mode);
2459
2460 // Create and initialize an HttpServerProperties, must be done after
2461 // setting the feature.
2462 std::unique_ptr<MockPrefDelegate> pref_delegate =
2463 std::make_unique<MockPrefDelegate>();
2464 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2465 std::unique_ptr<HttpServerProperties> properties =
2466 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2467 /*net_log=*/nullptr,
2468 GetMockTickClock());
2469 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2470
2471 // Set kAlternativeService1 as broken in the context of
2472 // kNetworkAnonymizationKey1, and kAlternativeService2 as broken in the
2473 // context of the empty NetworkAnonymizationKey2, and recently broken in
2474 // the context of the empty NetworkAnonymizationKey.
2475 properties->MarkAlternativeServiceBroken(kAlternativeService1,
2476 kNetworkAnonymizationKey1);
2477 properties->MarkAlternativeServiceRecentlyBroken(
2478 kAlternativeService2, NetworkAnonymizationKey());
2479 properties->MarkAlternativeServiceBroken(kAlternativeService2,
2480 kNetworkAnonymizationKey2);
2481
2482 // Verify values were set.
2483 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2484 kAlternativeService1, kNetworkAnonymizationKey1));
2485 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2486 kAlternativeService1, kNetworkAnonymizationKey1));
2487 // When NetworkAnonymizationKeys are disabled, kAlternativeService2 is
2488 // marked as broken regardless of the values passed to
2489 // NetworkAnonymizationKey's constructor.
2490 EXPECT_EQ(save_network_anonymization_key_mode ==
2491 NetworkAnonymizationKeyMode::kDisabled,
2492 properties->IsAlternativeServiceBroken(
2493 kAlternativeService2, NetworkAnonymizationKey()));
2494 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2495 kAlternativeService2, NetworkAnonymizationKey()));
2496 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2497 kAlternativeService2, kNetworkAnonymizationKey2));
2498 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2499 kAlternativeService2, kNetworkAnonymizationKey2));
2500
2501 // If NetworkAnonymizationKeys are enabled, there should be no
2502 // cross-contamination of the NetworkAnonymizationKeys.
2503 if (save_network_anonymization_key_mode !=
2504 NetworkAnonymizationKeyMode::kDisabled) {
2505 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2506 kAlternativeService2, kNetworkAnonymizationKey1));
2507 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2508 kAlternativeService2, kNetworkAnonymizationKey1));
2509 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2510 kAlternativeService1, NetworkAnonymizationKey()));
2511 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2512 kAlternativeService1, NetworkAnonymizationKey()));
2513 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2514 kAlternativeService1, kNetworkAnonymizationKey2));
2515 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2516 kAlternativeService1, kNetworkAnonymizationKey2));
2517 }
2518
2519 // Wait until the data's been written to prefs, and then create a copy of
2520 // the prefs data.
2521 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2522 saved_value = unowned_pref_delegate->GetServerProperties().Clone();
2523 }
2524
2525 // Now try and load the data in each of the feature modes.
2526 for (auto load_network_anonymization_key_mode :
2527 kNetworkAnonymizationKeyModes) {
2528 SCOPED_TRACE(static_cast<int>(load_network_anonymization_key_mode));
2529
2530 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2531 SetNetworkAnonymizationKeyMode(load_network_anonymization_key_mode);
2532
2533 // Create a new HttpServerProperties, loading the data from before.
2534 std::unique_ptr<MockPrefDelegate> pref_delegate =
2535 std::make_unique<MockPrefDelegate>();
2536 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2537 std::unique_ptr<HttpServerProperties> properties =
2538 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2539 /*net_log=*/nullptr,
2540 GetMockTickClock());
2541 unowned_pref_delegate->InitializePrefs(saved_value.Clone());
2542
2543 if (save_network_anonymization_key_mode ==
2544 NetworkAnonymizationKeyMode::kDisabled) {
2545 // If NetworkAnonymizationKey was disabled when saving, it was saved
2546 // with an empty NetworkAnonymizationKey, which should always be loaded
2547 // successfully. This is needed to continue to support consumers that
2548 // don't use NetworkAnonymizationKeys.
2549 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2550 kAlternativeService1, NetworkAnonymizationKey()));
2551 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2552 kAlternativeService1, NetworkAnonymizationKey()));
2553 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2554 kAlternativeService2, NetworkAnonymizationKey()));
2555 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2556 kAlternativeService2, NetworkAnonymizationKey()));
2557 } else if (save_network_anonymization_key_mode ==
2558 load_network_anonymization_key_mode) {
2559 // If the save and load modes are the same, the load should succeed, and
2560 // the network anonymization keys should match.
2561 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2562 kAlternativeService1, kNetworkAnonymizationKey1));
2563 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2564 kAlternativeService1, kNetworkAnonymizationKey1));
2565 // When NetworkAnonymizationKeys are disabled, kAlternativeService2 is
2566 // marked as broken regardless of the values passed to
2567 // NetworkAnonymizationKey's constructor.
2568 EXPECT_EQ(save_network_anonymization_key_mode ==
2569 NetworkAnonymizationKeyMode::kDisabled,
2570 properties->IsAlternativeServiceBroken(
2571 kAlternativeService2, NetworkAnonymizationKey()));
2572 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2573 kAlternativeService2, NetworkAnonymizationKey()));
2574 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2575 kAlternativeService2, kNetworkAnonymizationKey2));
2576 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2577 kAlternativeService2, kNetworkAnonymizationKey2));
2578
2579 // If NetworkAnonymizationKeys are enabled, there should be no
2580 // cross-contamination of the NetworkAnonymizationKeys.
2581 if (save_network_anonymization_key_mode !=
2582 NetworkAnonymizationKeyMode::kDisabled) {
2583 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2584 kAlternativeService2, kNetworkAnonymizationKey1));
2585 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2586 kAlternativeService2, kNetworkAnonymizationKey1));
2587 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2588 kAlternativeService1, NetworkAnonymizationKey()));
2589 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2590 kAlternativeService1, NetworkAnonymizationKey()));
2591 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2592 kAlternativeService1, kNetworkAnonymizationKey2));
2593 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2594 kAlternativeService1, kNetworkAnonymizationKey2));
2595 }
2596 } else {
2597 // Otherwise, only the values set with an empty NetworkAnonymizationKey
2598 // should have been loaded successfully.
2599 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2600 kAlternativeService1, kNetworkAnonymizationKey1));
2601 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2602 kAlternativeService1, kNetworkAnonymizationKey1));
2603 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2604 kAlternativeService2, NetworkAnonymizationKey()));
2605 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2606 kAlternativeService2, NetworkAnonymizationKey()));
2607 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2608 kAlternativeService2, kNetworkAnonymizationKey2));
2609 // If the load mode is NetworkAnonymizationKeyMode::kDisabled,
2610 // kNetworkAnonymizationKey2 is NetworkAnonymizationKey().
2611 EXPECT_EQ(load_network_anonymization_key_mode ==
2612 NetworkAnonymizationKeyMode::kDisabled,
2613 properties->WasAlternativeServiceRecentlyBroken(
2614 kAlternativeService2, kNetworkAnonymizationKey2));
2615
2616 // There should be no cross-contamination of NetworkAnonymizationKeys,
2617 // if NetworkAnonymizationKeys are enabled.
2618 if (load_network_anonymization_key_mode !=
2619 NetworkAnonymizationKeyMode::kDisabled) {
2620 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2621 kAlternativeService2, kNetworkAnonymizationKey1));
2622 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2623 kAlternativeService2, kNetworkAnonymizationKey1));
2624 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2625 kAlternativeService1, NetworkAnonymizationKey()));
2626 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2627 kAlternativeService1, NetworkAnonymizationKey()));
2628 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2629 kAlternativeService1, kNetworkAnonymizationKey2));
2630 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2631 kAlternativeService1, kNetworkAnonymizationKey2));
2632 }
2633 }
2634 }
2635 }
2636 }
2637
2638 // Make sure broken alt services with opaque origins aren't saved.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyBrokenAltServiceOpaqueOrigin)2639 TEST_F(HttpServerPropertiesManagerTest,
2640 NetworkAnonymizationKeyBrokenAltServiceOpaqueOrigin) {
2641 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2642 const auto kNetworkAnonymizationKey =
2643 NetworkAnonymizationKey::CreateSameSite(kOpaqueSite);
2644 const AlternativeService kAlternativeService(kProtoHTTP2, "alt.service1.test",
2645 443);
2646
2647 base::test::ScopedFeatureList feature_list;
2648 feature_list.InitAndEnableFeature(
2649 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2650
2651 // Create and initialize an HttpServerProperties, must be done after
2652 // setting the feature.
2653 std::unique_ptr<MockPrefDelegate> pref_delegate =
2654 std::make_unique<MockPrefDelegate>();
2655 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2656 std::unique_ptr<HttpServerProperties> properties =
2657 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2658 /*net_log=*/nullptr,
2659 GetMockTickClock());
2660 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2661
2662 properties->MarkAlternativeServiceBroken(kAlternativeService,
2663 kNetworkAnonymizationKey);
2664
2665 // Verify values were set.
2666 EXPECT_TRUE(properties->IsAlternativeServiceBroken(kAlternativeService,
2667 kNetworkAnonymizationKey));
2668 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2669 kAlternativeService, kNetworkAnonymizationKey));
2670
2671 // Wait until the data's been written to prefs, and then create a copy of
2672 // the prefs data.
2673 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2674
2675 // No information should have been saved to prefs.
2676 std::string preferences_json;
2677 base::JSONWriter::Write(unowned_pref_delegate->GetServerProperties(),
2678 &preferences_json);
2679 EXPECT_EQ("{\"servers\":[],\"version\":5}", preferences_json);
2680 }
2681
2682 // Tests a full round trip with a NetworkAnonymizationKey, using the
2683 // HttpServerProperties interface and setting QuicServerInfo.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyQuicServerInfoRoundTrip)2684 TEST_F(HttpServerPropertiesManagerTest,
2685 NetworkAnonymizationKeyQuicServerInfoRoundTrip) {
2686 const SchemefulSite kSite1(GURL("https://foo1.test/"));
2687 const SchemefulSite kSite2(GURL("https://foo2.test/"));
2688 const auto kNetworkAnonymizationKey1 =
2689 NetworkAnonymizationKey::CreateSameSite(kSite1);
2690 const auto kNetworkAnonymizationKey2 =
2691 NetworkAnonymizationKey::CreateSameSite(kSite2);
2692
2693 const quic::QuicServerId kServer1("foo", 443,
2694 false /* privacy_mode_enabled */);
2695 const quic::QuicServerId kServer2("foo", 443,
2696 true /* privacy_mode_enabled */);
2697
2698 const char kQuicServerInfo1[] = "info1";
2699 const char kQuicServerInfo2[] = "info2";
2700 const char kQuicServerInfo3[] = "info3";
2701
2702 for (auto save_network_anonymization_key_mode :
2703 kNetworkAnonymizationKeyModes) {
2704 SCOPED_TRACE(static_cast<int>(save_network_anonymization_key_mode));
2705
2706 // Save prefs using |save_network_anonymization_key_mode|.
2707 base::Value::Dict saved_value;
2708 {
2709 // Configure the the feature.
2710 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2711 SetNetworkAnonymizationKeyMode(save_network_anonymization_key_mode);
2712
2713 // Create and initialize an HttpServerProperties, must be done after
2714 // setting the feature.
2715 std::unique_ptr<MockPrefDelegate> pref_delegate =
2716 std::make_unique<MockPrefDelegate>();
2717 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2718 std::unique_ptr<HttpServerProperties> properties =
2719 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2720 /*net_log=*/nullptr,
2721 GetMockTickClock());
2722 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2723
2724 // Set kServer1 to kQuicServerInfo1 in the context of
2725 // kNetworkAnonymizationKey1, Set kServer2 to kQuicServerInfo2 in the
2726 // context of kNetworkAnonymizationKey2, and kServer1 to kQuicServerInfo3
2727 // in the context of NetworkAnonymizationKey().
2728 properties->SetQuicServerInfo(kServer1, kNetworkAnonymizationKey1,
2729 kQuicServerInfo1);
2730 properties->SetQuicServerInfo(kServer2, kNetworkAnonymizationKey2,
2731 kQuicServerInfo2);
2732 properties->SetQuicServerInfo(kServer1, NetworkAnonymizationKey(),
2733 kQuicServerInfo3);
2734
2735 // Verify values were set.
2736 if (save_network_anonymization_key_mode !=
2737 NetworkAnonymizationKeyMode::kDisabled) {
2738 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2739 kServer1, kNetworkAnonymizationKey1));
2740 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2741 kServer1, kNetworkAnonymizationKey2));
2742 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2743 kServer1, NetworkAnonymizationKey()));
2744
2745 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2746 kServer2, kNetworkAnonymizationKey1));
2747 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2748 kServer2, kNetworkAnonymizationKey2));
2749 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2750 kServer2, NetworkAnonymizationKey()));
2751 } else {
2752 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2753 kServer1, NetworkAnonymizationKey()));
2754 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2755 kServer2, NetworkAnonymizationKey()));
2756 }
2757
2758 // Wait until the data's been written to prefs, and then create a copy of
2759 // the prefs data.
2760 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2761 saved_value = unowned_pref_delegate->GetServerProperties().Clone();
2762 }
2763
2764 // Now try and load the data in each of the feature modes.
2765 for (auto load_network_anonymization_key_mode :
2766 kNetworkAnonymizationKeyModes) {
2767 SCOPED_TRACE(static_cast<int>(load_network_anonymization_key_mode));
2768
2769 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2770 SetNetworkAnonymizationKeyMode(load_network_anonymization_key_mode);
2771
2772 // Create a new HttpServerProperties, loading the data from before.
2773 std::unique_ptr<MockPrefDelegate> pref_delegate =
2774 std::make_unique<MockPrefDelegate>();
2775 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2776 std::unique_ptr<HttpServerProperties> properties =
2777 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2778 /*net_log=*/nullptr,
2779 GetMockTickClock());
2780 unowned_pref_delegate->InitializePrefs(saved_value.Clone());
2781
2782 if (save_network_anonymization_key_mode ==
2783 NetworkAnonymizationKeyMode::kDisabled) {
2784 // If NetworkAnonymizationKey was disabled when saving, entries were
2785 // saved with an empty NetworkAnonymizationKey, which should always be
2786 // loaded successfully. This is needed to continue to support consumers
2787 // that don't use NetworkAnonymizationKeys.
2788 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2789 kServer1, NetworkAnonymizationKey()));
2790 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2791 kServer2, NetworkAnonymizationKey()));
2792 if (load_network_anonymization_key_mode !=
2793 NetworkAnonymizationKeyMode::kDisabled) {
2794 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2795 kServer1, kNetworkAnonymizationKey1));
2796 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2797 kServer1, kNetworkAnonymizationKey2));
2798
2799 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2800 kServer2, kNetworkAnonymizationKey1));
2801 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2802 kServer2, kNetworkAnonymizationKey2));
2803 }
2804 } else if (save_network_anonymization_key_mode ==
2805 load_network_anonymization_key_mode) {
2806 // If the save and load modes are the same, the load should succeed, and
2807 // the network anonymization keys should match.
2808 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2809 kServer1, kNetworkAnonymizationKey1));
2810 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2811 kServer1, kNetworkAnonymizationKey2));
2812 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2813 kServer1, NetworkAnonymizationKey()));
2814
2815 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2816 kServer2, kNetworkAnonymizationKey1));
2817 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2818 kServer2, kNetworkAnonymizationKey2));
2819 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2820 kServer2, NetworkAnonymizationKey()));
2821 } else {
2822 // Otherwise, only the value set with an empty NetworkAnonymizationKey
2823 // should have been loaded successfully.
2824 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2825 kServer1, NetworkAnonymizationKey()));
2826
2827 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2828 kServer2, kNetworkAnonymizationKey1));
2829 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2830 kServer2, kNetworkAnonymizationKey2));
2831 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2832 kServer2, NetworkAnonymizationKey()));
2833
2834 // There should be no cross-contamination of NetworkAnonymizationKeys,
2835 // if NetworkAnonymizationKeys are enabled.
2836 if (load_network_anonymization_key_mode !=
2837 NetworkAnonymizationKeyMode::kDisabled) {
2838 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2839 kServer1, kNetworkAnonymizationKey1));
2840 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2841 kServer1, kNetworkAnonymizationKey2));
2842 }
2843 }
2844 }
2845 }
2846 }
2847
2848 // Tests a full round trip to prefs and back in the canonical suffix for
2849 // QuicServerInfo case. Enable NetworkAnonymizationKeys, as they have some
2850 // interactions with the canonical suffix logic.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyQuicServerInfoCanonicalSuffixRoundTrip)2851 TEST_F(HttpServerPropertiesManagerTest,
2852 NetworkAnonymizationKeyQuicServerInfoCanonicalSuffixRoundTrip) {
2853 const SchemefulSite kSite1(GURL("https://foo.test/"));
2854 const SchemefulSite kSite2(GURL("https://bar.test/"));
2855 const auto kNetworkAnonymizationKey1 =
2856 NetworkAnonymizationKey::CreateSameSite(kSite1);
2857 const auto kNetworkAnonymizationKey2 =
2858 NetworkAnonymizationKey::CreateSameSite(kSite2);
2859
2860 // Three servers with the same canonical suffix (".c.youtube.com").
2861 const quic::QuicServerId kServer1("foo.c.youtube.com", 443,
2862 false /* privacy_mode_enabled */);
2863 const quic::QuicServerId kServer2("bar.c.youtube.com", 443,
2864 false /* privacy_mode_enabled */);
2865 const quic::QuicServerId kServer3("baz.c.youtube.com", 443,
2866 false /* privacy_mode_enabled */);
2867
2868 const char kQuicServerInfo1[] = "info1";
2869 const char kQuicServerInfo2[] = "info2";
2870 const char kQuicServerInfo3[] = "info3";
2871
2872 base::test::ScopedFeatureList feature_list;
2873 feature_list.InitAndEnableFeature(
2874 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2875
2876 // Create and initialize an HttpServerProperties with no state.
2877 std::unique_ptr<MockPrefDelegate> pref_delegate =
2878 std::make_unique<MockPrefDelegate>();
2879 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2880 std::unique_ptr<HttpServerProperties> properties =
2881 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2882 /*net_log=*/nullptr,
2883 GetMockTickClock());
2884 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2885
2886 // Set kQuicServerInfo1 for kServer1 using kNetworkAnonymizationKey1. That
2887 // information should be retrieved when fetching information for any server
2888 // with the same canonical suffix, when using kNetworkAnonymizationKey1.
2889 properties->SetQuicServerInfo(kServer1, kNetworkAnonymizationKey1,
2890 kQuicServerInfo1);
2891 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2892 kServer1, kNetworkAnonymizationKey1));
2893 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2894 kServer2, kNetworkAnonymizationKey1));
2895 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2896 kServer3, kNetworkAnonymizationKey1));
2897 EXPECT_FALSE(
2898 properties->GetQuicServerInfo(kServer1, kNetworkAnonymizationKey2));
2899
2900 // Set kQuicServerInfo2 for kServer2 using kNetworkAnonymizationKey1. It
2901 // should not affect information retrieved for kServer1, but should for
2902 // kServer2 and kServer3.
2903 properties->SetQuicServerInfo(kServer2, kNetworkAnonymizationKey1,
2904 kQuicServerInfo2);
2905 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2906 kServer1, kNetworkAnonymizationKey1));
2907 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2908 kServer2, kNetworkAnonymizationKey1));
2909 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2910 kServer3, kNetworkAnonymizationKey1));
2911 EXPECT_FALSE(
2912 properties->GetQuicServerInfo(kServer1, kNetworkAnonymizationKey2));
2913
2914 // Set kQuicServerInfo3 for kServer1 using kNetworkAnonymizationKey2. It
2915 // should not affect information stored for kNetworkAnonymizationKey1.
2916 properties->SetQuicServerInfo(kServer1, kNetworkAnonymizationKey2,
2917 kQuicServerInfo3);
2918 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2919 kServer1, kNetworkAnonymizationKey1));
2920 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2921 kServer2, kNetworkAnonymizationKey1));
2922 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2923 kServer3, kNetworkAnonymizationKey1));
2924 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2925 kServer1, kNetworkAnonymizationKey2));
2926 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2927 kServer2, kNetworkAnonymizationKey2));
2928 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2929 kServer3, kNetworkAnonymizationKey2));
2930
2931 // Wait until the data's been written to prefs, and then tear down the
2932 // HttpServerProperties.
2933 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2934 base::Value::Dict saved_value =
2935 unowned_pref_delegate->GetServerProperties().Clone();
2936 properties.reset();
2937
2938 // Create a new HttpServerProperties using the value saved to prefs above.
2939 pref_delegate = std::make_unique<MockPrefDelegate>();
2940 unowned_pref_delegate = pref_delegate.get();
2941 properties = std::make_unique<HttpServerProperties>(
2942 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2943 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2944
2945 // All values should have been saved and be retrievable by suffix-matching
2946 // servers.
2947 //
2948 // TODO(mmenke): The rest of this test corresponds exactly to behavior in
2949 // CanonicalSuffixRoundTripWithNetworkAnonymizationKey. It seems like these
2950 // lines should correspond as well.
2951 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2952 kServer1, kNetworkAnonymizationKey1));
2953 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2954 kServer2, kNetworkAnonymizationKey1));
2955 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2956 kServer3, kNetworkAnonymizationKey1));
2957 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2958 kServer1, kNetworkAnonymizationKey2));
2959 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2960 kServer2, kNetworkAnonymizationKey2));
2961 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2962 kServer3, kNetworkAnonymizationKey2));
2963 }
2964
2965 // Make sure QuicServerInfo associated with NetworkAnonymizationKeys with opaque
2966 // origins aren't saved.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyQuicServerInfoOpaqueOrigin)2967 TEST_F(HttpServerPropertiesManagerTest,
2968 NetworkAnonymizationKeyQuicServerInfoOpaqueOrigin) {
2969 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2970 const auto kNetworkAnonymizationKey =
2971 NetworkAnonymizationKey::CreateSameSite(kOpaqueSite);
2972 const quic::QuicServerId kServer("foo", 443,
2973 false /* privacy_mode_enabled */);
2974
2975 base::test::ScopedFeatureList feature_list;
2976 feature_list.InitAndEnableFeature(
2977 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2978
2979 // Create and initialize an HttpServerProperties, must be done after
2980 // setting the feature.
2981 std::unique_ptr<MockPrefDelegate> pref_delegate =
2982 std::make_unique<MockPrefDelegate>();
2983 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2984 std::unique_ptr<HttpServerProperties> properties =
2985 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2986 /*net_log=*/nullptr,
2987 GetMockTickClock());
2988 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2989
2990 properties->SetQuicServerInfo(kServer, kNetworkAnonymizationKey,
2991 "QuicServerInfo");
2992 EXPECT_TRUE(properties->GetQuicServerInfo(kServer, kNetworkAnonymizationKey));
2993
2994 // Wait until the data's been written to prefs, and then create a copy of
2995 // the prefs data.
2996 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2997
2998 // No information should have been saved to prefs.
2999 std::string preferences_json;
3000 base::JSONWriter::Write(unowned_pref_delegate->GetServerProperties(),
3001 &preferences_json);
3002 EXPECT_EQ("{\"quic_servers\":[],\"servers\":[],\"version\":5}",
3003 preferences_json);
3004 }
3005
TEST_F(HttpServerPropertiesManagerTest,AdvertisedVersionsRoundTrip)3006 TEST_F(HttpServerPropertiesManagerTest, AdvertisedVersionsRoundTrip) {
3007 for (const quic::ParsedQuicVersion& version : AllSupportedQuicVersions()) {
3008 if (version.AlpnDeferToRFCv1()) {
3009 // These versions currently do not support Alt-Svc.
3010 continue;
3011 }
3012 // Reset test infrastructure.
3013 TearDown();
3014 SetUp();
3015 InitializePrefs();
3016 // Create alternate version information.
3017 const url::SchemeHostPort server("https", "quic.example.org", 443);
3018 AlternativeServiceInfoVector alternative_service_info_vector_in;
3019 AlternativeService quic_alternative_service(kProtoQUIC, "", 443);
3020 base::Time expiration;
3021 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration));
3022 quic::ParsedQuicVersionVector advertised_versions = {version};
3023 alternative_service_info_vector_in.push_back(
3024 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
3025 quic_alternative_service, expiration, advertised_versions));
3026 http_server_props_->SetAlternativeServices(
3027 server, NetworkAnonymizationKey(), alternative_service_info_vector_in);
3028 // Save to JSON.
3029 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
3030 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
3031 FastForwardUntilNoTasksRemain();
3032 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
3033 const base::Value::Dict& http_server_properties =
3034 pref_delegate_->GetServerProperties();
3035 std::string preferences_json;
3036 EXPECT_TRUE(
3037 base::JSONWriter::Write(http_server_properties, &preferences_json));
3038 // Reset test infrastructure.
3039 TearDown();
3040 SetUp();
3041 InitializePrefs();
3042 // Read from JSON.
3043 base::Value::Dict preferences_dict =
3044 base::test::ParseJsonDict(preferences_json);
3045 ASSERT_FALSE(preferences_dict.empty());
3046 const base::Value::List* servers_list =
3047 preferences_dict.FindList("servers");
3048 ASSERT_TRUE(servers_list);
3049 ASSERT_EQ(servers_list->size(), 1u);
3050 const base::Value& server_dict = (*servers_list)[0];
3051 HttpServerProperties::ServerInfo server_info;
3052 EXPECT_TRUE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
3053 server, server_dict.GetDict(), &server_info));
3054 ASSERT_TRUE(server_info.alternative_services.has_value());
3055 AlternativeServiceInfoVector alternative_service_info_vector_out =
3056 server_info.alternative_services.value();
3057 ASSERT_EQ(1u, alternative_service_info_vector_out.size());
3058 EXPECT_EQ(
3059 kProtoQUIC,
3060 alternative_service_info_vector_out[0].alternative_service().protocol);
3061 // Ensure we correctly parsed the version.
3062 EXPECT_EQ(advertised_versions,
3063 alternative_service_info_vector_out[0].advertised_versions());
3064 }
3065 }
3066
TEST_F(HttpServerPropertiesManagerTest,SameOrderAfterReload)3067 TEST_F(HttpServerPropertiesManagerTest, SameOrderAfterReload) {
3068 const SchemefulSite kSite1(GURL("https://foo.test/"));
3069 const SchemefulSite kSite2(GURL("https://bar.test/"));
3070 const auto kNetworkAnonymizationKey1 =
3071 NetworkAnonymizationKey::CreateSameSite(kSite1);
3072 const auto kNetworkAnonymizationKey2 =
3073 NetworkAnonymizationKey::CreateSameSite(kSite2);
3074
3075 base::test::ScopedFeatureList feature_list;
3076 feature_list.InitAndEnableFeature(
3077 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
3078
3079 // Create and initialize an HttpServerProperties with no state.
3080 std::unique_ptr<MockPrefDelegate> pref_delegate =
3081 std::make_unique<MockPrefDelegate>();
3082 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
3083 std::unique_ptr<HttpServerProperties> properties =
3084 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
3085 /*net_log=*/nullptr,
3086 GetMockTickClock());
3087 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
3088
3089 // Set alternative_service info.
3090 base::Time expiration = base::Time::Now() + base::Days(1);
3091 AlternativeServiceInfo alt_service1 =
3092 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
3093 AlternativeService(kProtoQUIC, "1.example", 1234), expiration,
3094 DefaultSupportedQuicVersions());
3095 AlternativeServiceInfo alt_service2 =
3096 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
3097 AlternativeService(kProtoHTTP2, "2.example", 443), expiration);
3098 AlternativeServiceInfo alt_service3 =
3099 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
3100 AlternativeService(kProtoHTTP2, "3.example", 443), expiration);
3101 const url::SchemeHostPort kServer1("https", "1.example", 443);
3102 const url::SchemeHostPort kServer2("https", "2.example", 443);
3103 const url::SchemeHostPort kServer3("https", "3.example", 443);
3104 properties->SetAlternativeServices(kServer1, kNetworkAnonymizationKey1,
3105 {alt_service1});
3106 properties->SetAlternativeServices(kServer2, kNetworkAnonymizationKey1,
3107 {alt_service2});
3108 properties->SetAlternativeServices(kServer3, kNetworkAnonymizationKey2,
3109 {alt_service3});
3110
3111 // Set quic_server_info.
3112 quic::QuicServerId quic_server_id1("quic1.example", 80, false);
3113 quic::QuicServerId quic_server_id2("quic2.example", 80, false);
3114 quic::QuicServerId quic_server_id3("quic3.example", 80, false);
3115 properties->SetQuicServerInfo(quic_server_id1, kNetworkAnonymizationKey1,
3116 "quic_server_info1");
3117 properties->SetQuicServerInfo(quic_server_id2, kNetworkAnonymizationKey1,
3118 "quic_server_info2");
3119 properties->SetQuicServerInfo(quic_server_id3, kNetworkAnonymizationKey2,
3120 "quic_server_info3");
3121
3122 // Set broken_alternative_service info.
3123 AlternativeService broken_service1(kProtoQUIC, "broken1.example", 443);
3124 AlternativeService broken_service2(kProtoQUIC, "broken2.example", 443);
3125 AlternativeService broken_service3(kProtoQUIC, "broken3.example", 443);
3126 properties->MarkAlternativeServiceBroken(broken_service1,
3127 kNetworkAnonymizationKey1);
3128 FastForwardBy(base::Milliseconds(1));
3129 properties->MarkAlternativeServiceBroken(broken_service2,
3130 kNetworkAnonymizationKey1);
3131 FastForwardBy(base::Milliseconds(1));
3132 properties->MarkAlternativeServiceBroken(broken_service3,
3133 kNetworkAnonymizationKey2);
3134
3135 // The first item of `server_info_map` must be the latest item.
3136 EXPECT_EQ(3u, properties->server_info_map_for_testing().size());
3137 EXPECT_EQ(
3138 properties->server_info_map_for_testing().begin()->first.server.host(),
3139 "3.example");
3140
3141 // The first item of `recently_broken_alternative_services` must be the latest
3142 // item.
3143 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3144 .recently_broken_alternative_services()
3145 .size());
3146 EXPECT_EQ("broken3.example",
3147 properties->broken_alternative_services_for_testing()
3148 .recently_broken_alternative_services()
3149 .begin()
3150 ->first.alternative_service.host);
3151
3152 // The first item of `quic_server_info_map` must be the latest item.
3153 EXPECT_EQ(3u, properties->quic_server_info_map_for_testing().size());
3154 EXPECT_EQ("quic3.example", properties->quic_server_info_map_for_testing()
3155 .begin()
3156 ->first.server_id.host());
3157
3158 // The first item of `broken_alternative_service_list` must be the oldest
3159 // item.
3160 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3161 .broken_alternative_service_list()
3162 .size());
3163 EXPECT_EQ("broken1.example",
3164 properties->broken_alternative_services_for_testing()
3165 .broken_alternative_service_list()
3166 .begin()
3167 ->first.alternative_service.host);
3168
3169 // Wait until the data's been written to prefs, and then tear down the
3170 // HttpServerProperties.
3171 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
3172 base::Value::Dict saved_value =
3173 unowned_pref_delegate->GetServerProperties().Clone();
3174
3175 // Create a new HttpServerProperties using the value saved to prefs above.
3176 pref_delegate = std::make_unique<MockPrefDelegate>();
3177 unowned_pref_delegate = pref_delegate.get();
3178 properties = std::make_unique<HttpServerProperties>(
3179 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
3180 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
3181
3182 // The first item of `server_info_map` must be the latest item.
3183 EXPECT_EQ(3u, properties->server_info_map_for_testing().size());
3184 EXPECT_EQ(
3185 properties->server_info_map_for_testing().begin()->first.server.host(),
3186 "3.example");
3187
3188 // The first item of `recently_broken_alternative_services` must be the latest
3189 // item.
3190 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3191 .recently_broken_alternative_services()
3192 .size());
3193 EXPECT_EQ("broken3.example",
3194 properties->broken_alternative_services_for_testing()
3195 .recently_broken_alternative_services()
3196 .begin()
3197 ->first.alternative_service.host);
3198
3199 // The first item of `quic_server_info_map` must be the latest item.
3200 EXPECT_EQ(3u, properties->quic_server_info_map_for_testing().size());
3201 EXPECT_EQ("quic3.example", properties->quic_server_info_map_for_testing()
3202 .begin()
3203 ->first.server_id.host());
3204
3205 // The first item of `broken_alternative_service_list` must be the oldest
3206 // item.
3207 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3208 .broken_alternative_service_list()
3209 .size());
3210 EXPECT_EQ("broken1.example",
3211 properties->broken_alternative_services_for_testing()
3212 .broken_alternative_service_list()
3213 .begin()
3214 ->first.alternative_service.host);
3215 }
3216
3217 } // namespace net
3218