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, DanglingUntriaged>
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()};
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\"],\"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-Q050\",\"h3-Q046\"]}]}");
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(1u, loaded_advertised_versions.size());
1595 EXPECT_EQ(quic::ParsedQuicVersion::Q046(), loaded_advertised_versions[0]);
1596
1597 // No other fields should have been populated.
1598 server_info.alternative_services.reset();
1599 EXPECT_TRUE(server_info.empty());
1600 }
1601
TEST_F(HttpServerPropertiesManagerTest,UpdatePrefWhenAdvertisedVersionsChange)1602 TEST_F(HttpServerPropertiesManagerTest,
1603 UpdatePrefWhenAdvertisedVersionsChange) {
1604 InitializePrefs();
1605
1606 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1607
1608 // #1: Set alternate protocol.
1609 AlternativeServiceInfoVector alternative_service_info_vector;
1610 // Quic alternative service set with a single QUIC version: Q046.
1611 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1612 base::Time expiration1;
1613 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1614 alternative_service_info_vector.push_back(
1615 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1616 quic_alternative_service1, expiration1, advertised_versions_));
1617 http_server_props_->SetAlternativeServices(
1618 server_www, NetworkAnonymizationKey(), alternative_service_info_vector);
1619
1620 // Set quic_server_info string.
1621 quic::QuicServerId mail_quic_server_id("mail.google.com", 80, false);
1622 std::string quic_server_info1("quic_server_info1");
1623 http_server_props_->SetQuicServerInfo(
1624 mail_quic_server_id, NetworkAnonymizationKey(), quic_server_info1);
1625
1626 // Set SupportsQuic.
1627 IPAddress actual_address(127, 0, 0, 1);
1628 http_server_props_->SetLastLocalAddressWhenQuicWorked(actual_address);
1629
1630 // Update Prefs.
1631 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1632 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1633 FastForwardUntilNoTasksRemain();
1634 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1635
1636 // Verify preferences with correct advertised version field.
1637 const char expected_json[] =
1638 "{\"quic_servers\":"
1639 "[{\"anonymization\":[],"
1640 "\"server_id\":\"https://mail.google.com:80\","
1641 "\"server_info\":\"quic_server_info1\"}],"
1642 "\"servers\":["
1643 "{\"alternative_service\":[{"
1644 "\"advertised_alpns\":[\"h3\"],"
1645 "\"expiration\":\"13756212000000000\",\"port\":443,"
1646 "\"protocol_str\":\"quic\"}],"
1647 "\"anonymization\":[],"
1648 "\"server\":\"https://www.google.com:80\"}],"
1649 "\"supports_quic\":"
1650 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1651
1652 const base::Value::Dict& http_server_properties =
1653 pref_delegate_->GetServerProperties();
1654 std::string preferences_json;
1655 EXPECT_TRUE(
1656 base::JSONWriter::Write(http_server_properties, &preferences_json));
1657 EXPECT_EQ(expected_json, preferences_json);
1658
1659 // #2: Set AlternativeService with different advertised_versions for the same
1660 // AlternativeService.
1661 AlternativeServiceInfoVector alternative_service_info_vector_2;
1662 // Quic alternative service set with two advertised QUIC versions.
1663 quic::ParsedQuicVersionVector advertised_versions = {
1664 quic::ParsedQuicVersion::Q046(), quic::ParsedQuicVersion::Draft29()};
1665 alternative_service_info_vector_2.push_back(
1666 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1667 quic_alternative_service1, expiration1, advertised_versions));
1668 http_server_props_->SetAlternativeServices(
1669 server_www, NetworkAnonymizationKey(), alternative_service_info_vector_2);
1670
1671 // Update Prefs.
1672 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1673 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1674 FastForwardUntilNoTasksRemain();
1675 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1676
1677 // Verify preferences updated with new advertised versions.
1678 const char expected_json_updated[] =
1679 "{\"quic_servers\":"
1680 "[{\"anonymization\":[],"
1681 "\"server_id\":\"https://mail.google.com:80\","
1682 "\"server_info\":\"quic_server_info1\"}],"
1683 "\"servers\":["
1684 "{\"alternative_service\":"
1685 "[{\"advertised_alpns\":[\"h3-Q046\",\"h3-29\"],"
1686 "\"expiration\":\"13756212000000000\",\"port\":443,"
1687 "\"protocol_str\":\"quic\"}],"
1688 "\"anonymization\":[],"
1689 "\"server\":\"https://www.google.com:80\"}],"
1690 "\"supports_quic\":"
1691 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1692 EXPECT_TRUE(
1693 base::JSONWriter::Write(http_server_properties, &preferences_json));
1694 EXPECT_EQ(expected_json_updated, preferences_json);
1695
1696 // #3: Set AlternativeService with same advertised_versions.
1697 AlternativeServiceInfoVector alternative_service_info_vector_3;
1698 // A same set of QUIC versions but listed in a different order.
1699 quic::ParsedQuicVersionVector advertised_versions_2 = {
1700 quic::ParsedQuicVersion::Draft29(), quic::ParsedQuicVersion::Q046()};
1701 alternative_service_info_vector_3.push_back(
1702 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1703 quic_alternative_service1, expiration1, advertised_versions_2));
1704 http_server_props_->SetAlternativeServices(
1705 server_www, NetworkAnonymizationKey(), alternative_service_info_vector_3);
1706
1707 // Change in version ordering causes prefs update.
1708 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1709 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1710 FastForwardUntilNoTasksRemain();
1711 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1712
1713 // Verify preferences updated with new advertised versions.
1714 const char expected_json_updated2[] =
1715 "{\"quic_servers\":"
1716 "[{\"anonymization\":[],"
1717 "\"server_id\":\"https://mail.google.com:80\","
1718 "\"server_info\":\"quic_server_info1\"}],"
1719 "\"servers\":["
1720 "{\"alternative_service\":"
1721 "[{\"advertised_alpns\":[\"h3-29\",\"h3-Q046\"],"
1722 "\"expiration\":\"13756212000000000\",\"port\":443,"
1723 "\"protocol_str\":\"quic\"}],"
1724 "\"anonymization\":[],"
1725 "\"server\":\"https://www.google.com:80\"}],"
1726 "\"supports_quic\":"
1727 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1728 EXPECT_TRUE(
1729 base::JSONWriter::Write(http_server_properties, &preferences_json));
1730 EXPECT_EQ(expected_json_updated2, preferences_json);
1731 }
1732
TEST_F(HttpServerPropertiesManagerTest,UpdateCacheWithPrefs)1733 TEST_F(HttpServerPropertiesManagerTest, UpdateCacheWithPrefs) {
1734 AlternativeService cached_broken_service(kProtoQUIC, "cached_broken", 443);
1735 AlternativeService cached_broken_service2(kProtoQUIC, "cached_broken2", 443);
1736 AlternativeService cached_recently_broken_service(kProtoQUIC,
1737 "cached_rbroken", 443);
1738
1739 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service,
1740 NetworkAnonymizationKey());
1741 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service2,
1742 NetworkAnonymizationKey());
1743 http_server_props_->MarkAlternativeServiceRecentlyBroken(
1744 cached_recently_broken_service, NetworkAnonymizationKey());
1745
1746 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1747 // There should be a task to remove remove alt services from the cache of
1748 // broken alt services. There should be no task to update the prefs, since the
1749 // prefs file hasn't been loaded yet.
1750 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1751
1752 // Load the |pref_delegate_| with some JSON to verify updating the cache from
1753 // prefs. For the broken alternative services "www.google.com:1234" and
1754 // "cached_broken", the expiration time will be one day from now.
1755
1756 std::string expiration_str =
1757 base::NumberToString(static_cast<int64_t>(one_day_from_now_.ToTimeT()));
1758
1759 base::Value::Dict server_dict = base::test::ParseJsonDict(
1760 "{"
1761 "\"broken_alternative_services\":["
1762 "{\"broken_until\":\"" +
1763 expiration_str +
1764 "\","
1765 "\"host\":\"www.google.com\",\"anonymization\":[],"
1766 "\"port\":1234,\"protocol_str\":\"h2\"},"
1767 "{\"broken_count\":2,\"broken_until\":\"" +
1768 expiration_str +
1769 "\","
1770 "\"host\":\"cached_broken\",\"anonymization\":[],"
1771 "\"port\":443,\"protocol_str\":\"quic\"},"
1772 "{\"broken_count\":3,"
1773 "\"host\":\"cached_rbroken\",\"anonymization\":[],"
1774 "\"port\":443,\"protocol_str\":\"quic\"}],"
1775 "\"quic_servers\":["
1776 "{\"anonymization\":[],"
1777 "\"server_id\":\"https://mail.google.com:80\","
1778 "\"server_info\":\"quic_server_info1\"}"
1779 "],"
1780 "\"servers\":["
1781 "{\"server\":\"https://www.google.com:80\","
1782 "\"anonymization\":[],"
1783 "\"alternative_service\":["
1784 "{\"expiration\":\"13756212000000000\",\"port\":443,"
1785 "\"protocol_str\":\"h2\"},"
1786 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
1787 "\"port\":1234,\"protocol_str\":\"h2\"}"
1788 "]"
1789 "},"
1790 "{\"server\":\"https://mail.google.com:80\","
1791 "\"anonymization\":[],"
1792 "\"alternative_service\":["
1793 "{\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\","
1794 "\"port\":444,\"protocol_str\":\"h2\"}"
1795 "],"
1796 "\"network_stats\":{\"srtt\":42}"
1797 "}"
1798 "],"
1799 "\"supports_quic\":"
1800 "{\"address\":\"127.0.0.1\",\"used_quic\":true},"
1801 "\"version\":5"
1802 "}");
1803
1804 // Don't use the test fixture's InitializePrefs() method, since there are
1805 // pending tasks. Initializing prefs should queue a pref update task, since
1806 // prefs have been modified.
1807 pref_delegate_->InitializePrefs(std::move(server_dict));
1808 EXPECT_TRUE(http_server_props_->IsInitialized());
1809 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1810
1811 // Run until prefs are updated.
1812 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
1813 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
1814 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1815
1816 //
1817 // Verify alternative service info for https://www.google.com
1818 //
1819 AlternativeServiceInfoVector alternative_service_info_vector =
1820 http_server_props_->GetAlternativeServiceInfos(
1821 url::SchemeHostPort("https", "www.google.com", 80),
1822 NetworkAnonymizationKey());
1823 ASSERT_EQ(2u, alternative_service_info_vector.size());
1824
1825 EXPECT_EQ(kProtoHTTP2,
1826 alternative_service_info_vector[0].alternative_service().protocol);
1827 EXPECT_EQ("www.google.com",
1828 alternative_service_info_vector[0].alternative_service().host);
1829 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1830 EXPECT_EQ(
1831 "13756212000000000",
1832 base::NumberToString(
1833 alternative_service_info_vector[0].expiration().ToInternalValue()));
1834
1835 EXPECT_EQ(kProtoHTTP2,
1836 alternative_service_info_vector[1].alternative_service().protocol);
1837 EXPECT_EQ("www.google.com",
1838 alternative_service_info_vector[1].alternative_service().host);
1839 EXPECT_EQ(1234,
1840 alternative_service_info_vector[1].alternative_service().port);
1841 EXPECT_EQ(
1842 "13758804000000000",
1843 base::NumberToString(
1844 alternative_service_info_vector[1].expiration().ToInternalValue()));
1845
1846 //
1847 // Verify alternative service info for https://mail.google.com
1848 //
1849 alternative_service_info_vector =
1850 http_server_props_->GetAlternativeServiceInfos(
1851 url::SchemeHostPort("https", "mail.google.com", 80),
1852 NetworkAnonymizationKey());
1853 ASSERT_EQ(1u, alternative_service_info_vector.size());
1854
1855 EXPECT_EQ(kProtoHTTP2,
1856 alternative_service_info_vector[0].alternative_service().protocol);
1857 EXPECT_EQ("foo.google.com",
1858 alternative_service_info_vector[0].alternative_service().host);
1859 EXPECT_EQ(444, alternative_service_info_vector[0].alternative_service().port);
1860 EXPECT_EQ(
1861 "9223372036854775807",
1862 base::NumberToString(
1863 alternative_service_info_vector[0].expiration().ToInternalValue()));
1864
1865 //
1866 // Verify broken alternative services.
1867 //
1868 AlternativeService prefs_broken_service(kProtoHTTP2, "www.google.com", 1234);
1869 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1870 cached_broken_service, NetworkAnonymizationKey()));
1871 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1872 cached_broken_service2, NetworkAnonymizationKey()));
1873 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1874 prefs_broken_service, NetworkAnonymizationKey()));
1875
1876 // Verify brokenness expiration times.
1877 // |cached_broken_service|'s expiration time should've been overwritten by the
1878 // prefs to be approximately 1 day from now. |cached_broken_service2|'s
1879 // expiration time should still be 5 minutes due to being marked broken.
1880 // |prefs_broken_service|'s expiration time should be approximately 1 day from
1881 // now which comes from the prefs.
1882 FastForwardBy(base::Minutes(5) -
1883 HttpServerProperties::GetUpdatePrefsDelayForTesting());
1884 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1885 cached_broken_service, NetworkAnonymizationKey()));
1886 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1887 cached_broken_service2, NetworkAnonymizationKey()));
1888 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1889 prefs_broken_service, NetworkAnonymizationKey()));
1890 FastForwardBy(base::Days(1));
1891 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1892 cached_broken_service, NetworkAnonymizationKey()));
1893 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1894 cached_broken_service2, NetworkAnonymizationKey()));
1895 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1896 prefs_broken_service, NetworkAnonymizationKey()));
1897
1898 // Now that |prefs_broken_service|'s brokenness has expired, it should've
1899 // been removed from the alternative services info vectors of all servers.
1900 alternative_service_info_vector =
1901 http_server_props_->GetAlternativeServiceInfos(
1902 url::SchemeHostPort("https", "www.google.com", 80),
1903 NetworkAnonymizationKey());
1904 ASSERT_EQ(1u, alternative_service_info_vector.size());
1905
1906 //
1907 // Verify recently broken alternative services.
1908 //
1909
1910 // If an entry is already in cache, the broken count in the prefs should
1911 // overwrite the one in the cache.
1912 // |prefs_broken_service| should have broken-count 1 from prefs.
1913 // |cached_recently_broken_service| should have broken-count 3 from prefs.
1914 // |cached_broken_service| should have broken-count 2 from prefs.
1915 // |cached_broken_service2| should have broken-count 1 from being marked
1916 // broken.
1917
1918 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1919 prefs_broken_service, NetworkAnonymizationKey()));
1920 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1921 cached_recently_broken_service, NetworkAnonymizationKey()));
1922 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1923 cached_broken_service, NetworkAnonymizationKey()));
1924 EXPECT_TRUE(http_server_props_->WasAlternativeServiceRecentlyBroken(
1925 cached_broken_service2, NetworkAnonymizationKey()));
1926 // Make sure |prefs_broken_service| has the right expiration delay when marked
1927 // broken. Since |prefs_broken_service| had no broken_count specified in the
1928 // prefs, a broken_count value of 1 should have been assumed by
1929 // |http_server_props_|.
1930 http_server_props_->MarkAlternativeServiceBroken(prefs_broken_service,
1931 NetworkAnonymizationKey());
1932 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
1933 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1934 FastForwardBy(base::Minutes(10) - base::TimeDelta::FromInternalValue(1));
1935 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1936 prefs_broken_service, NetworkAnonymizationKey()));
1937 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1938 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1939 prefs_broken_service, NetworkAnonymizationKey()));
1940 // Make sure |cached_recently_broken_service| has the right expiration delay
1941 // when marked broken.
1942 http_server_props_->MarkAlternativeServiceBroken(
1943 cached_recently_broken_service, NetworkAnonymizationKey());
1944 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1945 FastForwardBy(base::Minutes(40) - base::TimeDelta::FromInternalValue(1));
1946 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1947 cached_recently_broken_service, NetworkAnonymizationKey()));
1948 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1949 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1950 cached_recently_broken_service, NetworkAnonymizationKey()));
1951 // Make sure |cached_broken_service| has the right expiration delay when
1952 // marked broken.
1953 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service,
1954 NetworkAnonymizationKey());
1955 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1956 FastForwardBy(base::Minutes(20) - base::TimeDelta::FromInternalValue(1));
1957 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1958 cached_broken_service, NetworkAnonymizationKey()));
1959 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1960 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1961 cached_broken_service, NetworkAnonymizationKey()));
1962 // Make sure |cached_broken_service2| has the right expiration delay when
1963 // marked broken.
1964 http_server_props_->MarkAlternativeServiceBroken(cached_broken_service2,
1965 NetworkAnonymizationKey());
1966 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
1967 FastForwardBy(base::Minutes(10) - base::TimeDelta::FromInternalValue(1));
1968 EXPECT_TRUE(http_server_props_->IsAlternativeServiceBroken(
1969 cached_broken_service2, NetworkAnonymizationKey()));
1970 FastForwardBy(base::TimeDelta::FromInternalValue(1));
1971 EXPECT_FALSE(http_server_props_->IsAlternativeServiceBroken(
1972 cached_broken_service2, NetworkAnonymizationKey()));
1973
1974 //
1975 // Verify ServerNetworkStats.
1976 //
1977 const ServerNetworkStats* server_network_stats =
1978 http_server_props_->GetServerNetworkStats(
1979 url::SchemeHostPort("https", "mail.google.com", 80),
1980 NetworkAnonymizationKey());
1981 EXPECT_TRUE(server_network_stats);
1982 EXPECT_EQ(server_network_stats->srtt, base::TimeDelta::FromInternalValue(42));
1983
1984 //
1985 // Verify QUIC server info.
1986 //
1987 const std::string* quic_server_info = http_server_props_->GetQuicServerInfo(
1988 quic::QuicServerId("mail.google.com", 80, false),
1989 NetworkAnonymizationKey());
1990 EXPECT_EQ("quic_server_info1", *quic_server_info);
1991
1992 //
1993 // Verify supports QUIC.
1994 //
1995 IPAddress actual_address(127, 0, 0, 1);
1996 EXPECT_TRUE(
1997 http_server_props_->WasLastLocalAddressWhenQuicWorked(actual_address));
1998 EXPECT_EQ(4, pref_delegate_->GetAndClearNumPrefUpdates());
1999 }
2000
2001 // Check the interaction of ForceHTTP11 with saving/restoring settings.
2002 // In particular, ForceHTTP11 is not saved, and it should not overwrite or be
2003 // overitten by loaded data.
TEST_F(HttpServerPropertiesManagerTest,ForceHTTP11)2004 TEST_F(HttpServerPropertiesManagerTest, ForceHTTP11) {
2005 const url::SchemeHostPort kServer1("https", "foo.test", 443);
2006 const url::SchemeHostPort kServer2("https", "bar.test", 443);
2007 const url::SchemeHostPort kServer3("https", "baz.test", 443);
2008
2009 // Create and initialize an HttpServerProperties with no state.
2010 std::unique_ptr<MockPrefDelegate> pref_delegate =
2011 std::make_unique<MockPrefDelegate>();
2012 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2013 std::unique_ptr<HttpServerProperties> properties =
2014 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2015 /*net_log=*/nullptr,
2016 GetMockTickClock());
2017 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2018
2019 // Set kServer1 to support H2, but require HTTP/1.1. Set kServer2 to only
2020 // require HTTP/1.1.
2021 EXPECT_FALSE(
2022 properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2023 EXPECT_FALSE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2024 EXPECT_FALSE(
2025 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2026 EXPECT_FALSE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2027 properties->SetSupportsSpdy(kServer1, NetworkAnonymizationKey(), true);
2028 properties->SetHTTP11Required(kServer1, NetworkAnonymizationKey());
2029 properties->SetHTTP11Required(kServer2, NetworkAnonymizationKey());
2030 EXPECT_TRUE(properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2031 EXPECT_TRUE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2032 EXPECT_FALSE(
2033 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2034 EXPECT_TRUE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2035
2036 // Wait until the data's been written to prefs, and then tear down the
2037 // HttpServerProperties.
2038 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2039 base::Value::Dict saved_value =
2040 unowned_pref_delegate->GetServerProperties().Clone();
2041 properties.reset();
2042
2043 // Only information on kServer1 should have been saved to prefs.
2044 std::string preferences_json;
2045 base::JSONWriter::Write(saved_value, &preferences_json);
2046 EXPECT_EQ(
2047 "{\"servers\":["
2048 "{\"anonymization\":[],"
2049 "\"server\":\"https://foo.test\","
2050 "\"supports_spdy\":true}],"
2051 "\"version\":5}",
2052 preferences_json);
2053
2054 // Create a new HttpServerProperties using the value saved to prefs above.
2055 pref_delegate = std::make_unique<MockPrefDelegate>();
2056 unowned_pref_delegate = pref_delegate.get();
2057 properties = std::make_unique<HttpServerProperties>(
2058 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2059
2060 // Before the data has loaded, set kServer1 and kServer3 as requiring
2061 // HTTP/1.1.
2062 EXPECT_FALSE(
2063 properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2064 EXPECT_FALSE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2065 properties->SetHTTP11Required(kServer1, NetworkAnonymizationKey());
2066 properties->SetHTTP11Required(kServer3, NetworkAnonymizationKey());
2067 EXPECT_FALSE(
2068 properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2069 EXPECT_TRUE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2070 EXPECT_FALSE(
2071 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2072 EXPECT_FALSE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2073 EXPECT_FALSE(
2074 properties->GetSupportsSpdy(kServer3, NetworkAnonymizationKey()));
2075 EXPECT_TRUE(properties->RequiresHTTP11(kServer3, NetworkAnonymizationKey()));
2076
2077 // The data loads.
2078 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2079
2080 // The properties should contain a combination of the old and new data.
2081 EXPECT_TRUE(properties->GetSupportsSpdy(kServer1, NetworkAnonymizationKey()));
2082 EXPECT_TRUE(properties->RequiresHTTP11(kServer1, NetworkAnonymizationKey()));
2083 EXPECT_FALSE(
2084 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2085 EXPECT_FALSE(properties->RequiresHTTP11(kServer2, NetworkAnonymizationKey()));
2086 EXPECT_FALSE(
2087 properties->GetSupportsSpdy(kServer3, NetworkAnonymizationKey()));
2088 EXPECT_TRUE(properties->RequiresHTTP11(kServer3, NetworkAnonymizationKey()));
2089 }
2090
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyServerInfo)2091 TEST_F(HttpServerPropertiesManagerTest, NetworkAnonymizationKeyServerInfo) {
2092 const SchemefulSite kSite1(GURL("https://foo.test/"));
2093 const SchemefulSite kSite2(GURL("https://bar.test/"));
2094 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2095 const url::SchemeHostPort kServer("https", "baz.test", 443);
2096 const url::SchemeHostPort kServer2("https", "zab.test", 443);
2097
2098 HttpServerProperties::ServerInfo server_info;
2099 server_info.supports_spdy = true;
2100
2101 for (auto save_network_anonymization_key_mode :
2102 kNetworkAnonymizationKeyModes) {
2103 SCOPED_TRACE(static_cast<int>(save_network_anonymization_key_mode));
2104
2105 // Save prefs using |save_network_anonymization_key_mode|.
2106 base::Value::Dict saved_value;
2107 {
2108 // Configure the the feature.
2109 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2110 SetNetworkAnonymizationKeyMode(save_network_anonymization_key_mode);
2111
2112 // This parameter is normally calculated by HttpServerProperties based on
2113 // the kPartitionHttpServerPropertiesByNetworkIsolationKey feature, but
2114 // this test doesn't use that class.
2115 bool use_network_anonymization_key =
2116 save_network_anonymization_key_mode !=
2117 NetworkAnonymizationKeyMode::kDisabled;
2118
2119 HttpServerProperties::ServerInfoMap server_info_map;
2120
2121 // Add server info entry using two origins with value of |server_info|.
2122 // NetworkAnonymizationKey's constructor takes the state of the
2123 // kAppendFrameOriginToNetworkAnonymizationKey feature into account, so
2124 // need to make sure to call the constructor after setting up the feature
2125 // above.
2126 HttpServerProperties::ServerInfoMapKey server_info_key(
2127 kServer, NetworkAnonymizationKey::CreateCrossSite(kSite1),
2128 use_network_anonymization_key);
2129 server_info_map.Put(server_info_key, server_info);
2130
2131 // Also add an etry with an opaque origin, if
2132 // |use_network_anonymization_key| is true. This value should not be saved
2133 // to disk, since opaque origins are only meaningful within a browsing
2134 // session.
2135 if (use_network_anonymization_key) {
2136 HttpServerProperties::ServerInfoMapKey server_info_key2(
2137 kServer2, NetworkAnonymizationKey::CreateSameSite(kOpaqueSite),
2138 use_network_anonymization_key);
2139 server_info_map.Put(server_info_key2, server_info);
2140 }
2141
2142 saved_value = ServerInfoMapToDict(server_info_map);
2143 }
2144
2145 for (auto load_network_anonymization_key_mode :
2146 kNetworkAnonymizationKeyModes) {
2147 SCOPED_TRACE(static_cast<int>(load_network_anonymization_key_mode));
2148
2149 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2150 SetNetworkAnonymizationKeyMode(load_network_anonymization_key_mode);
2151 std::unique_ptr<HttpServerProperties::ServerInfoMap> server_info_map2 =
2152 DictToServerInfoMap(saved_value.Clone());
2153 ASSERT_TRUE(server_info_map2);
2154 if (save_network_anonymization_key_mode ==
2155 NetworkAnonymizationKeyMode::kDisabled) {
2156 // If NetworkAnonymizationKey was disabled when saving, it was saved
2157 // with an empty NetworkAnonymizationKey, which should always be loaded
2158 // successfully. This is needed to continue to support consumers that
2159 // don't use NetworkAnonymizationKeys.
2160 ASSERT_EQ(1u, server_info_map2->size());
2161 const HttpServerProperties::ServerInfoMapKey& server_info_key2 =
2162 server_info_map2->begin()->first;
2163 const HttpServerProperties::ServerInfo& server_info2 =
2164 server_info_map2->begin()->second;
2165 EXPECT_EQ(kServer, server_info_key2.server);
2166 EXPECT_EQ(NetworkAnonymizationKey(),
2167 server_info_key2.network_anonymization_key);
2168 EXPECT_EQ(server_info, server_info2);
2169 } else if (save_network_anonymization_key_mode ==
2170 load_network_anonymization_key_mode) {
2171 // If the save and load modes are the same, the load should succeed, and
2172 // the network anonymization keys should match.
2173 ASSERT_EQ(1u, server_info_map2->size());
2174 const HttpServerProperties::ServerInfoMapKey& server_info_key2 =
2175 server_info_map2->begin()->first;
2176 const HttpServerProperties::ServerInfo& server_info2 =
2177 server_info_map2->begin()->second;
2178 EXPECT_EQ(kServer, server_info_key2.server);
2179 EXPECT_EQ(NetworkAnonymizationKey::CreateCrossSite(kSite1),
2180 server_info_key2.network_anonymization_key);
2181 EXPECT_EQ(server_info, server_info2);
2182 } else {
2183 // Otherwise, the NetworkAnonymizationKey doesn't make sense with the
2184 // current feature values, so the ServerInfo should be discarded.
2185 EXPECT_EQ(0u, server_info_map2->size());
2186 }
2187 }
2188 }
2189 }
2190
2191 // Tests a full round trip with a NetworkAnonymizationKey, using the
2192 // HttpServerProperties interface.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyIntegration)2193 TEST_F(HttpServerPropertiesManagerTest, NetworkAnonymizationKeyIntegration) {
2194 const SchemefulSite kSite(GURL("https://foo.test/"));
2195 const auto kNetworkAnonymizationKey =
2196 NetworkAnonymizationKey::CreateSameSite(kSite);
2197 const url::SchemeHostPort kServer("https", "baz.test", 443);
2198
2199 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2200 const auto kOpaqueSiteNetworkAnonymizationKey =
2201 NetworkAnonymizationKey::CreateSameSite(kOpaqueSite);
2202 const url::SchemeHostPort kServer2("https", "zab.test", 443);
2203
2204 base::test::ScopedFeatureList feature_list;
2205 feature_list.InitAndEnableFeature(
2206 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2207
2208 // Create and initialize an HttpServerProperties with no state.
2209 std::unique_ptr<MockPrefDelegate> pref_delegate =
2210 std::make_unique<MockPrefDelegate>();
2211 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2212 std::unique_ptr<HttpServerProperties> properties =
2213 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2214 /*net_log=*/nullptr,
2215 GetMockTickClock());
2216 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2217
2218 // Set a values using kNetworkAnonymizationKey.
2219 properties->SetSupportsSpdy(kServer, kNetworkAnonymizationKey, true);
2220 EXPECT_TRUE(properties->GetSupportsSpdy(kServer, kNetworkAnonymizationKey));
2221 EXPECT_FALSE(
2222 properties->GetSupportsSpdy(kServer, kOpaqueSiteNetworkAnonymizationKey));
2223 EXPECT_FALSE(properties->GetSupportsSpdy(kServer, NetworkAnonymizationKey()));
2224
2225 // Opaque origins should works with HttpServerProperties, but not be persisted
2226 // to disk.
2227 properties->SetSupportsSpdy(kServer2, kOpaqueSiteNetworkAnonymizationKey,
2228 true);
2229 EXPECT_FALSE(properties->GetSupportsSpdy(kServer2, kNetworkAnonymizationKey));
2230 EXPECT_TRUE(properties->GetSupportsSpdy(kServer2,
2231 kOpaqueSiteNetworkAnonymizationKey));
2232 EXPECT_FALSE(
2233 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2234
2235 // Wait until the data's been written to prefs, and then tear down the
2236 // HttpServerProperties.
2237 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2238 base::Value::Dict saved_value =
2239 unowned_pref_delegate->GetServerProperties().Clone();
2240 properties.reset();
2241
2242 // Create a new HttpServerProperties using the value saved to prefs above.
2243 pref_delegate = std::make_unique<MockPrefDelegate>();
2244 unowned_pref_delegate = pref_delegate.get();
2245 properties = std::make_unique<HttpServerProperties>(
2246 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2247 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2248
2249 // The information set using kNetworkAnonymizationKey on the original
2250 // HttpServerProperties should also be set on the restored
2251 // HttpServerProperties.
2252 EXPECT_TRUE(properties->GetSupportsSpdy(kServer, kNetworkAnonymizationKey));
2253 EXPECT_FALSE(
2254 properties->GetSupportsSpdy(kServer, kOpaqueSiteNetworkAnonymizationKey));
2255 EXPECT_FALSE(properties->GetSupportsSpdy(kServer, NetworkAnonymizationKey()));
2256
2257 // The information set using kOpaqueSiteNetworkAnonymizationKey should not
2258 // have been restored.
2259 EXPECT_FALSE(properties->GetSupportsSpdy(kServer2, kNetworkAnonymizationKey));
2260 EXPECT_FALSE(properties->GetSupportsSpdy(kServer2,
2261 kOpaqueSiteNetworkAnonymizationKey));
2262 EXPECT_FALSE(
2263 properties->GetSupportsSpdy(kServer2, NetworkAnonymizationKey()));
2264 }
2265
2266 // Tests a full round trip to prefs and back in the canonical suffix case.
2267 // Enable NetworkAnonymizationKeys, as they have some interactions with the
2268 // canonical suffix logic.
TEST_F(HttpServerPropertiesManagerTest,CanonicalSuffixRoundTripWithNetworkAnonymizationKey)2269 TEST_F(HttpServerPropertiesManagerTest,
2270 CanonicalSuffixRoundTripWithNetworkAnonymizationKey) {
2271 const SchemefulSite kSite1(GURL("https://foo.test/"));
2272 const SchemefulSite kSite2(GURL("https://bar.test/"));
2273 const auto kNetworkAnonymizationKey1 =
2274 NetworkAnonymizationKey::CreateSameSite(kSite1);
2275 const auto kNetworkAnonymizationKey2 =
2276 NetworkAnonymizationKey::CreateSameSite(kSite2);
2277 // Three servers with the same canonical suffix (".c.youtube.com").
2278 const url::SchemeHostPort kServer1("https", "foo.c.youtube.com", 443);
2279 const url::SchemeHostPort kServer2("https", "bar.c.youtube.com", 443);
2280 const url::SchemeHostPort kServer3("https", "baz.c.youtube.com", 443);
2281
2282 base::test::ScopedFeatureList feature_list;
2283 feature_list.InitAndEnableFeature(
2284 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2285
2286 // Create three alt service vectors of different lengths.
2287 base::Time expiration = base::Time::Now() + base::Days(1);
2288 AlternativeServiceInfo alt_service1 =
2289 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
2290 AlternativeService(kProtoQUIC, "foopy.c.youtube.com", 1234),
2291 expiration, DefaultSupportedQuicVersions());
2292 AlternativeServiceInfo alt_service2 =
2293 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
2294 AlternativeService(kProtoHTTP2, "foopy.c.youtube.com", 443),
2295 expiration);
2296 AlternativeServiceInfo alt_service3 =
2297 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
2298 AlternativeService(kProtoHTTP2, "foopy2.c.youtube.com", 443),
2299 expiration);
2300 AlternativeServiceInfoVector alt_service_vector1 = {alt_service1};
2301 AlternativeServiceInfoVector alt_service_vector2 = {alt_service1,
2302 alt_service2};
2303 AlternativeServiceInfoVector alt_service_vector3 = {
2304 alt_service1, alt_service2, alt_service3};
2305
2306 // Create and initialize an HttpServerProperties with no state.
2307 std::unique_ptr<MockPrefDelegate> pref_delegate =
2308 std::make_unique<MockPrefDelegate>();
2309 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2310 std::unique_ptr<HttpServerProperties> properties =
2311 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2312 /*net_log=*/nullptr,
2313 GetMockTickClock());
2314 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2315
2316 // Set alternative services for kServer1 using kNetworkAnonymizationKey1. That
2317 // information should be retrieved when fetching information for any server
2318 // with the same canonical suffix, when using kNetworkAnonymizationKey1.
2319 properties->SetAlternativeServices(kServer1, kNetworkAnonymizationKey1,
2320 alt_service_vector1);
2321 EXPECT_EQ(
2322 1u, properties
2323 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2324 .size());
2325 EXPECT_EQ(
2326 1u, properties
2327 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2328 .size());
2329 EXPECT_EQ(
2330 1u, properties
2331 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2332 .size());
2333 EXPECT_EQ(
2334 0u, properties
2335 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2336 .size());
2337
2338 // Set different alternative services for kServer2 using
2339 // kNetworkAnonymizationKey1. It should not affect information retrieved for
2340 // kServer1, but should for kServer2 and kServer3.
2341 properties->SetAlternativeServices(kServer2, kNetworkAnonymizationKey1,
2342 alt_service_vector2);
2343 EXPECT_EQ(
2344 1u, properties
2345 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2346 .size());
2347 EXPECT_EQ(
2348 2u, properties
2349 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2350 .size());
2351 EXPECT_EQ(
2352 2u, properties
2353 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2354 .size());
2355 EXPECT_EQ(
2356 0u, properties
2357 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2358 .size());
2359
2360 // Set different information for kServer1 using kNetworkAnonymizationKey2. It
2361 // should not affect information stored for kNetworkAnonymizationKey1.
2362 properties->SetAlternativeServices(kServer1, kNetworkAnonymizationKey2,
2363 alt_service_vector3);
2364 EXPECT_EQ(
2365 1u, properties
2366 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2367 .size());
2368 EXPECT_EQ(
2369 2u, properties
2370 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2371 .size());
2372 EXPECT_EQ(
2373 2u, properties
2374 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2375 .size());
2376 EXPECT_EQ(
2377 3u, properties
2378 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2379 .size());
2380 EXPECT_EQ(
2381 3u, properties
2382 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey2)
2383 .size());
2384 EXPECT_EQ(
2385 3u, properties
2386 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey2)
2387 .size());
2388
2389 // Wait until the data's been written to prefs, and then tear down the
2390 // HttpServerProperties.
2391 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2392 base::Value::Dict saved_value =
2393 unowned_pref_delegate->GetServerProperties().Clone();
2394 properties.reset();
2395
2396 // Create a new HttpServerProperties using the value saved to prefs above.
2397 pref_delegate = std::make_unique<MockPrefDelegate>();
2398 unowned_pref_delegate = pref_delegate.get();
2399 properties = std::make_unique<HttpServerProperties>(
2400 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2401 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2402
2403 // Only the last of the values learned for kNetworkAnonymizationKey1 should
2404 // have been saved, and the value for kNetworkAnonymizationKey2 as well. The
2405 // canonical suffix logic should still be respected.
2406 EXPECT_EQ(
2407 2u, properties
2408 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey1)
2409 .size());
2410 EXPECT_EQ(
2411 2u, properties
2412 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey1)
2413 .size());
2414 EXPECT_EQ(
2415 2u, properties
2416 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey1)
2417 .size());
2418 EXPECT_EQ(
2419 3u, properties
2420 ->GetAlternativeServiceInfos(kServer1, kNetworkAnonymizationKey2)
2421 .size());
2422 EXPECT_EQ(
2423 3u, properties
2424 ->GetAlternativeServiceInfos(kServer2, kNetworkAnonymizationKey2)
2425 .size());
2426 EXPECT_EQ(
2427 3u, properties
2428 ->GetAlternativeServiceInfos(kServer3, kNetworkAnonymizationKey2)
2429 .size());
2430 }
2431
2432 // Tests a full round trip with a NetworkAnonymizationKey, using the
2433 // HttpServerProperties interface and setting alternative services as broken.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyBrokenAltServiceRoundTrip)2434 TEST_F(HttpServerPropertiesManagerTest,
2435 NetworkAnonymizationKeyBrokenAltServiceRoundTrip) {
2436 const SchemefulSite kSite1(GURL("https://foo1.test/"));
2437 const SchemefulSite kSite2(GURL("https://foo2.test/"));
2438 const auto kNetworkAnonymizationKey1 =
2439 NetworkAnonymizationKey::CreateSameSite(kSite1);
2440 const auto kNetworkAnonymizationKey2 =
2441 NetworkAnonymizationKey::CreateSameSite(kSite2);
2442
2443 const AlternativeService kAlternativeService1(kProtoHTTP2,
2444 "alt.service1.test", 443);
2445 const AlternativeService kAlternativeService2(kProtoHTTP2,
2446 "alt.service2.test", 443);
2447
2448 for (auto save_network_anonymization_key_mode :
2449 kNetworkAnonymizationKeyModes) {
2450 SCOPED_TRACE(static_cast<int>(save_network_anonymization_key_mode));
2451
2452 // Save prefs using |save_network_anonymization_key_mode|.
2453 base::Value::Dict saved_value;
2454 {
2455 // Configure the the feature.
2456 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2457 SetNetworkAnonymizationKeyMode(save_network_anonymization_key_mode);
2458
2459 // Create and initialize an HttpServerProperties, must be done after
2460 // setting the feature.
2461 std::unique_ptr<MockPrefDelegate> pref_delegate =
2462 std::make_unique<MockPrefDelegate>();
2463 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2464 std::unique_ptr<HttpServerProperties> properties =
2465 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2466 /*net_log=*/nullptr,
2467 GetMockTickClock());
2468 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2469
2470 // Set kAlternativeService1 as broken in the context of
2471 // kNetworkAnonymizationKey1, and kAlternativeService2 as broken in the
2472 // context of the empty NetworkAnonymizationKey2, and recently broken in
2473 // the context of the empty NetworkAnonymizationKey.
2474 properties->MarkAlternativeServiceBroken(kAlternativeService1,
2475 kNetworkAnonymizationKey1);
2476 properties->MarkAlternativeServiceRecentlyBroken(
2477 kAlternativeService2, NetworkAnonymizationKey());
2478 properties->MarkAlternativeServiceBroken(kAlternativeService2,
2479 kNetworkAnonymizationKey2);
2480
2481 // Verify values were set.
2482 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2483 kAlternativeService1, kNetworkAnonymizationKey1));
2484 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2485 kAlternativeService1, kNetworkAnonymizationKey1));
2486 // When NetworkAnonymizationKeys are disabled, kAlternativeService2 is
2487 // marked as broken regardless of the values passed to
2488 // NetworkAnonymizationKey's constructor.
2489 EXPECT_EQ(save_network_anonymization_key_mode ==
2490 NetworkAnonymizationKeyMode::kDisabled,
2491 properties->IsAlternativeServiceBroken(
2492 kAlternativeService2, NetworkAnonymizationKey()));
2493 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2494 kAlternativeService2, NetworkAnonymizationKey()));
2495 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2496 kAlternativeService2, kNetworkAnonymizationKey2));
2497 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2498 kAlternativeService2, kNetworkAnonymizationKey2));
2499
2500 // If NetworkAnonymizationKeys are enabled, there should be no
2501 // cross-contamination of the NetworkAnonymizationKeys.
2502 if (save_network_anonymization_key_mode !=
2503 NetworkAnonymizationKeyMode::kDisabled) {
2504 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2505 kAlternativeService2, kNetworkAnonymizationKey1));
2506 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2507 kAlternativeService2, kNetworkAnonymizationKey1));
2508 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2509 kAlternativeService1, NetworkAnonymizationKey()));
2510 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2511 kAlternativeService1, NetworkAnonymizationKey()));
2512 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2513 kAlternativeService1, kNetworkAnonymizationKey2));
2514 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2515 kAlternativeService1, kNetworkAnonymizationKey2));
2516 }
2517
2518 // Wait until the data's been written to prefs, and then create a copy of
2519 // the prefs data.
2520 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2521 saved_value = unowned_pref_delegate->GetServerProperties().Clone();
2522 }
2523
2524 // Now try and load the data in each of the feature modes.
2525 for (auto load_network_anonymization_key_mode :
2526 kNetworkAnonymizationKeyModes) {
2527 SCOPED_TRACE(static_cast<int>(load_network_anonymization_key_mode));
2528
2529 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2530 SetNetworkAnonymizationKeyMode(load_network_anonymization_key_mode);
2531
2532 // Create a new HttpServerProperties, loading the data from before.
2533 std::unique_ptr<MockPrefDelegate> pref_delegate =
2534 std::make_unique<MockPrefDelegate>();
2535 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2536 std::unique_ptr<HttpServerProperties> properties =
2537 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2538 /*net_log=*/nullptr,
2539 GetMockTickClock());
2540 unowned_pref_delegate->InitializePrefs(saved_value.Clone());
2541
2542 if (save_network_anonymization_key_mode ==
2543 NetworkAnonymizationKeyMode::kDisabled) {
2544 // If NetworkAnonymizationKey was disabled when saving, it was saved
2545 // with an empty NetworkAnonymizationKey, which should always be loaded
2546 // successfully. This is needed to continue to support consumers that
2547 // don't use NetworkAnonymizationKeys.
2548 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2549 kAlternativeService1, NetworkAnonymizationKey()));
2550 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2551 kAlternativeService1, NetworkAnonymizationKey()));
2552 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2553 kAlternativeService2, NetworkAnonymizationKey()));
2554 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2555 kAlternativeService2, NetworkAnonymizationKey()));
2556 } else if (save_network_anonymization_key_mode ==
2557 load_network_anonymization_key_mode) {
2558 // If the save and load modes are the same, the load should succeed, and
2559 // the network anonymization keys should match.
2560 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2561 kAlternativeService1, kNetworkAnonymizationKey1));
2562 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2563 kAlternativeService1, kNetworkAnonymizationKey1));
2564 // When NetworkAnonymizationKeys are disabled, kAlternativeService2 is
2565 // marked as broken regardless of the values passed to
2566 // NetworkAnonymizationKey's constructor.
2567 EXPECT_EQ(save_network_anonymization_key_mode ==
2568 NetworkAnonymizationKeyMode::kDisabled,
2569 properties->IsAlternativeServiceBroken(
2570 kAlternativeService2, NetworkAnonymizationKey()));
2571 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2572 kAlternativeService2, NetworkAnonymizationKey()));
2573 EXPECT_TRUE(properties->IsAlternativeServiceBroken(
2574 kAlternativeService2, kNetworkAnonymizationKey2));
2575 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2576 kAlternativeService2, kNetworkAnonymizationKey2));
2577
2578 // If NetworkAnonymizationKeys are enabled, there should be no
2579 // cross-contamination of the NetworkAnonymizationKeys.
2580 if (save_network_anonymization_key_mode !=
2581 NetworkAnonymizationKeyMode::kDisabled) {
2582 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2583 kAlternativeService2, kNetworkAnonymizationKey1));
2584 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2585 kAlternativeService2, kNetworkAnonymizationKey1));
2586 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2587 kAlternativeService1, NetworkAnonymizationKey()));
2588 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2589 kAlternativeService1, NetworkAnonymizationKey()));
2590 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2591 kAlternativeService1, kNetworkAnonymizationKey2));
2592 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2593 kAlternativeService1, kNetworkAnonymizationKey2));
2594 }
2595 } else {
2596 // Otherwise, only the values set with an empty NetworkAnonymizationKey
2597 // should have been loaded successfully.
2598 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2599 kAlternativeService1, kNetworkAnonymizationKey1));
2600 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2601 kAlternativeService1, kNetworkAnonymizationKey1));
2602 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2603 kAlternativeService2, NetworkAnonymizationKey()));
2604 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2605 kAlternativeService2, NetworkAnonymizationKey()));
2606 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2607 kAlternativeService2, kNetworkAnonymizationKey2));
2608 // If the load mode is NetworkAnonymizationKeyMode::kDisabled,
2609 // kNetworkAnonymizationKey2 is NetworkAnonymizationKey().
2610 EXPECT_EQ(load_network_anonymization_key_mode ==
2611 NetworkAnonymizationKeyMode::kDisabled,
2612 properties->WasAlternativeServiceRecentlyBroken(
2613 kAlternativeService2, kNetworkAnonymizationKey2));
2614
2615 // There should be no cross-contamination of NetworkAnonymizationKeys,
2616 // if NetworkAnonymizationKeys are enabled.
2617 if (load_network_anonymization_key_mode !=
2618 NetworkAnonymizationKeyMode::kDisabled) {
2619 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2620 kAlternativeService2, kNetworkAnonymizationKey1));
2621 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2622 kAlternativeService2, kNetworkAnonymizationKey1));
2623 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2624 kAlternativeService1, NetworkAnonymizationKey()));
2625 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2626 kAlternativeService1, NetworkAnonymizationKey()));
2627 EXPECT_FALSE(properties->IsAlternativeServiceBroken(
2628 kAlternativeService1, kNetworkAnonymizationKey2));
2629 EXPECT_FALSE(properties->WasAlternativeServiceRecentlyBroken(
2630 kAlternativeService1, kNetworkAnonymizationKey2));
2631 }
2632 }
2633 }
2634 }
2635 }
2636
2637 // Make sure broken alt services with opaque origins aren't saved.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyBrokenAltServiceOpaqueOrigin)2638 TEST_F(HttpServerPropertiesManagerTest,
2639 NetworkAnonymizationKeyBrokenAltServiceOpaqueOrigin) {
2640 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2641 const auto kNetworkAnonymizationKey =
2642 NetworkAnonymizationKey::CreateSameSite(kOpaqueSite);
2643 const AlternativeService kAlternativeService(kProtoHTTP2, "alt.service1.test",
2644 443);
2645
2646 base::test::ScopedFeatureList feature_list;
2647 feature_list.InitAndEnableFeature(
2648 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2649
2650 // Create and initialize an HttpServerProperties, must be done after
2651 // setting the feature.
2652 std::unique_ptr<MockPrefDelegate> pref_delegate =
2653 std::make_unique<MockPrefDelegate>();
2654 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2655 std::unique_ptr<HttpServerProperties> properties =
2656 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2657 /*net_log=*/nullptr,
2658 GetMockTickClock());
2659 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2660
2661 properties->MarkAlternativeServiceBroken(kAlternativeService,
2662 kNetworkAnonymizationKey);
2663
2664 // Verify values were set.
2665 EXPECT_TRUE(properties->IsAlternativeServiceBroken(kAlternativeService,
2666 kNetworkAnonymizationKey));
2667 EXPECT_TRUE(properties->WasAlternativeServiceRecentlyBroken(
2668 kAlternativeService, kNetworkAnonymizationKey));
2669
2670 // Wait until the data's been written to prefs, and then create a copy of
2671 // the prefs data.
2672 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2673
2674 // No information should have been saved to prefs.
2675 std::string preferences_json;
2676 base::JSONWriter::Write(unowned_pref_delegate->GetServerProperties(),
2677 &preferences_json);
2678 EXPECT_EQ("{\"servers\":[],\"version\":5}", preferences_json);
2679 }
2680
2681 // Tests a full round trip with a NetworkAnonymizationKey, using the
2682 // HttpServerProperties interface and setting QuicServerInfo.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyQuicServerInfoRoundTrip)2683 TEST_F(HttpServerPropertiesManagerTest,
2684 NetworkAnonymizationKeyQuicServerInfoRoundTrip) {
2685 const SchemefulSite kSite1(GURL("https://foo1.test/"));
2686 const SchemefulSite kSite2(GURL("https://foo2.test/"));
2687 const auto kNetworkAnonymizationKey1 =
2688 NetworkAnonymizationKey::CreateSameSite(kSite1);
2689 const auto kNetworkAnonymizationKey2 =
2690 NetworkAnonymizationKey::CreateSameSite(kSite2);
2691
2692 const quic::QuicServerId kServer1("foo", 443,
2693 false /* privacy_mode_enabled */);
2694 const quic::QuicServerId kServer2("foo", 443,
2695 true /* privacy_mode_enabled */);
2696
2697 const char kQuicServerInfo1[] = "info1";
2698 const char kQuicServerInfo2[] = "info2";
2699 const char kQuicServerInfo3[] = "info3";
2700
2701 for (auto save_network_anonymization_key_mode :
2702 kNetworkAnonymizationKeyModes) {
2703 SCOPED_TRACE(static_cast<int>(save_network_anonymization_key_mode));
2704
2705 // Save prefs using |save_network_anonymization_key_mode|.
2706 base::Value::Dict saved_value;
2707 {
2708 // Configure the the feature.
2709 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2710 SetNetworkAnonymizationKeyMode(save_network_anonymization_key_mode);
2711
2712 // Create and initialize an HttpServerProperties, must be done after
2713 // setting the feature.
2714 std::unique_ptr<MockPrefDelegate> pref_delegate =
2715 std::make_unique<MockPrefDelegate>();
2716 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2717 std::unique_ptr<HttpServerProperties> properties =
2718 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2719 /*net_log=*/nullptr,
2720 GetMockTickClock());
2721 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2722
2723 // Set kServer1 to kQuicServerInfo1 in the context of
2724 // kNetworkAnonymizationKey1, Set kServer2 to kQuicServerInfo2 in the
2725 // context of kNetworkAnonymizationKey2, and kServer1 to kQuicServerInfo3
2726 // in the context of NetworkAnonymizationKey().
2727 properties->SetQuicServerInfo(kServer1, kNetworkAnonymizationKey1,
2728 kQuicServerInfo1);
2729 properties->SetQuicServerInfo(kServer2, kNetworkAnonymizationKey2,
2730 kQuicServerInfo2);
2731 properties->SetQuicServerInfo(kServer1, NetworkAnonymizationKey(),
2732 kQuicServerInfo3);
2733
2734 // Verify values were set.
2735 if (save_network_anonymization_key_mode !=
2736 NetworkAnonymizationKeyMode::kDisabled) {
2737 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2738 kServer1, kNetworkAnonymizationKey1));
2739 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2740 kServer1, kNetworkAnonymizationKey2));
2741 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2742 kServer1, NetworkAnonymizationKey()));
2743
2744 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2745 kServer2, kNetworkAnonymizationKey1));
2746 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2747 kServer2, kNetworkAnonymizationKey2));
2748 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2749 kServer2, NetworkAnonymizationKey()));
2750 } else {
2751 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2752 kServer1, NetworkAnonymizationKey()));
2753 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2754 kServer2, NetworkAnonymizationKey()));
2755 }
2756
2757 // Wait until the data's been written to prefs, and then create a copy of
2758 // the prefs data.
2759 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2760 saved_value = unowned_pref_delegate->GetServerProperties().Clone();
2761 }
2762
2763 // Now try and load the data in each of the feature modes.
2764 for (auto load_network_anonymization_key_mode :
2765 kNetworkAnonymizationKeyModes) {
2766 SCOPED_TRACE(static_cast<int>(load_network_anonymization_key_mode));
2767
2768 std::unique_ptr<base::test::ScopedFeatureList> feature_list =
2769 SetNetworkAnonymizationKeyMode(load_network_anonymization_key_mode);
2770
2771 // Create a new HttpServerProperties, loading the data from before.
2772 std::unique_ptr<MockPrefDelegate> pref_delegate =
2773 std::make_unique<MockPrefDelegate>();
2774 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2775 std::unique_ptr<HttpServerProperties> properties =
2776 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2777 /*net_log=*/nullptr,
2778 GetMockTickClock());
2779 unowned_pref_delegate->InitializePrefs(saved_value.Clone());
2780
2781 if (save_network_anonymization_key_mode ==
2782 NetworkAnonymizationKeyMode::kDisabled) {
2783 // If NetworkAnonymizationKey was disabled when saving, entries were
2784 // saved with an empty NetworkAnonymizationKey, which should always be
2785 // loaded successfully. This is needed to continue to support consumers
2786 // that don't use NetworkAnonymizationKeys.
2787 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2788 kServer1, NetworkAnonymizationKey()));
2789 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2790 kServer2, NetworkAnonymizationKey()));
2791 if (load_network_anonymization_key_mode !=
2792 NetworkAnonymizationKeyMode::kDisabled) {
2793 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2794 kServer1, kNetworkAnonymizationKey1));
2795 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2796 kServer1, kNetworkAnonymizationKey2));
2797
2798 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2799 kServer2, kNetworkAnonymizationKey1));
2800 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2801 kServer2, kNetworkAnonymizationKey2));
2802 }
2803 } else if (save_network_anonymization_key_mode ==
2804 load_network_anonymization_key_mode) {
2805 // If the save and load modes are the same, the load should succeed, and
2806 // the network anonymization keys should match.
2807 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2808 kServer1, kNetworkAnonymizationKey1));
2809 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2810 kServer1, kNetworkAnonymizationKey2));
2811 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2812 kServer1, NetworkAnonymizationKey()));
2813
2814 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2815 kServer2, kNetworkAnonymizationKey1));
2816 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2817 kServer2, kNetworkAnonymizationKey2));
2818 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2819 kServer2, NetworkAnonymizationKey()));
2820 } else {
2821 // Otherwise, only the value set with an empty NetworkAnonymizationKey
2822 // should have been loaded successfully.
2823 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2824 kServer1, NetworkAnonymizationKey()));
2825
2826 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2827 kServer2, kNetworkAnonymizationKey1));
2828 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2829 kServer2, kNetworkAnonymizationKey2));
2830 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2831 kServer2, NetworkAnonymizationKey()));
2832
2833 // There should be no cross-contamination of NetworkAnonymizationKeys,
2834 // if NetworkAnonymizationKeys are enabled.
2835 if (load_network_anonymization_key_mode !=
2836 NetworkAnonymizationKeyMode::kDisabled) {
2837 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2838 kServer1, kNetworkAnonymizationKey1));
2839 EXPECT_EQ(nullptr, properties->GetQuicServerInfo(
2840 kServer1, kNetworkAnonymizationKey2));
2841 }
2842 }
2843 }
2844 }
2845 }
2846
2847 // Tests a full round trip to prefs and back in the canonical suffix for
2848 // QuicServerInfo case. Enable NetworkAnonymizationKeys, as they have some
2849 // interactions with the canonical suffix logic.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyQuicServerInfoCanonicalSuffixRoundTrip)2850 TEST_F(HttpServerPropertiesManagerTest,
2851 NetworkAnonymizationKeyQuicServerInfoCanonicalSuffixRoundTrip) {
2852 const SchemefulSite kSite1(GURL("https://foo.test/"));
2853 const SchemefulSite kSite2(GURL("https://bar.test/"));
2854 const auto kNetworkAnonymizationKey1 =
2855 NetworkAnonymizationKey::CreateSameSite(kSite1);
2856 const auto kNetworkAnonymizationKey2 =
2857 NetworkAnonymizationKey::CreateSameSite(kSite2);
2858
2859 // Three servers with the same canonical suffix (".c.youtube.com").
2860 const quic::QuicServerId kServer1("foo.c.youtube.com", 443,
2861 false /* privacy_mode_enabled */);
2862 const quic::QuicServerId kServer2("bar.c.youtube.com", 443,
2863 false /* privacy_mode_enabled */);
2864 const quic::QuicServerId kServer3("baz.c.youtube.com", 443,
2865 false /* privacy_mode_enabled */);
2866
2867 const char kQuicServerInfo1[] = "info1";
2868 const char kQuicServerInfo2[] = "info2";
2869 const char kQuicServerInfo3[] = "info3";
2870
2871 base::test::ScopedFeatureList feature_list;
2872 feature_list.InitAndEnableFeature(
2873 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2874
2875 // Create and initialize an HttpServerProperties with no state.
2876 std::unique_ptr<MockPrefDelegate> pref_delegate =
2877 std::make_unique<MockPrefDelegate>();
2878 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2879 std::unique_ptr<HttpServerProperties> properties =
2880 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2881 /*net_log=*/nullptr,
2882 GetMockTickClock());
2883 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2884
2885 // Set kQuicServerInfo1 for kServer1 using kNetworkAnonymizationKey1. That
2886 // information should be retrieved when fetching information for any server
2887 // with the same canonical suffix, when using kNetworkAnonymizationKey1.
2888 properties->SetQuicServerInfo(kServer1, kNetworkAnonymizationKey1,
2889 kQuicServerInfo1);
2890 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2891 kServer1, kNetworkAnonymizationKey1));
2892 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2893 kServer2, kNetworkAnonymizationKey1));
2894 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2895 kServer3, kNetworkAnonymizationKey1));
2896 EXPECT_FALSE(
2897 properties->GetQuicServerInfo(kServer1, kNetworkAnonymizationKey2));
2898
2899 // Set kQuicServerInfo2 for kServer2 using kNetworkAnonymizationKey1. It
2900 // should not affect information retrieved for kServer1, but should for
2901 // kServer2 and kServer3.
2902 properties->SetQuicServerInfo(kServer2, kNetworkAnonymizationKey1,
2903 kQuicServerInfo2);
2904 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2905 kServer1, kNetworkAnonymizationKey1));
2906 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2907 kServer2, kNetworkAnonymizationKey1));
2908 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2909 kServer3, kNetworkAnonymizationKey1));
2910 EXPECT_FALSE(
2911 properties->GetQuicServerInfo(kServer1, kNetworkAnonymizationKey2));
2912
2913 // Set kQuicServerInfo3 for kServer1 using kNetworkAnonymizationKey2. It
2914 // should not affect information stored for kNetworkAnonymizationKey1.
2915 properties->SetQuicServerInfo(kServer1, kNetworkAnonymizationKey2,
2916 kQuicServerInfo3);
2917 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2918 kServer1, kNetworkAnonymizationKey1));
2919 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2920 kServer2, kNetworkAnonymizationKey1));
2921 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2922 kServer3, kNetworkAnonymizationKey1));
2923 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2924 kServer1, kNetworkAnonymizationKey2));
2925 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2926 kServer2, kNetworkAnonymizationKey2));
2927 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2928 kServer3, kNetworkAnonymizationKey2));
2929
2930 // Wait until the data's been written to prefs, and then tear down the
2931 // HttpServerProperties.
2932 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2933 base::Value::Dict saved_value =
2934 unowned_pref_delegate->GetServerProperties().Clone();
2935 properties.reset();
2936
2937 // Create a new HttpServerProperties using the value saved to prefs above.
2938 pref_delegate = std::make_unique<MockPrefDelegate>();
2939 unowned_pref_delegate = pref_delegate.get();
2940 properties = std::make_unique<HttpServerProperties>(
2941 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
2942 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
2943
2944 // All values should have been saved and be retrievable by suffix-matching
2945 // servers.
2946 //
2947 // TODO(mmenke): The rest of this test corresponds exactly to behavior in
2948 // CanonicalSuffixRoundTripWithNetworkAnonymizationKey. It seems like these
2949 // lines should correspond as well.
2950 EXPECT_EQ(kQuicServerInfo1, *properties->GetQuicServerInfo(
2951 kServer1, kNetworkAnonymizationKey1));
2952 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2953 kServer2, kNetworkAnonymizationKey1));
2954 EXPECT_EQ(kQuicServerInfo2, *properties->GetQuicServerInfo(
2955 kServer3, kNetworkAnonymizationKey1));
2956 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2957 kServer1, kNetworkAnonymizationKey2));
2958 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2959 kServer2, kNetworkAnonymizationKey2));
2960 EXPECT_EQ(kQuicServerInfo3, *properties->GetQuicServerInfo(
2961 kServer3, kNetworkAnonymizationKey2));
2962 }
2963
2964 // Make sure QuicServerInfo associated with NetworkAnonymizationKeys with opaque
2965 // origins aren't saved.
TEST_F(HttpServerPropertiesManagerTest,NetworkAnonymizationKeyQuicServerInfoOpaqueOrigin)2966 TEST_F(HttpServerPropertiesManagerTest,
2967 NetworkAnonymizationKeyQuicServerInfoOpaqueOrigin) {
2968 const SchemefulSite kOpaqueSite(GURL("data:text/plain,Hello World"));
2969 const auto kNetworkAnonymizationKey =
2970 NetworkAnonymizationKey::CreateSameSite(kOpaqueSite);
2971 const quic::QuicServerId kServer("foo", 443,
2972 false /* privacy_mode_enabled */);
2973
2974 base::test::ScopedFeatureList feature_list;
2975 feature_list.InitAndEnableFeature(
2976 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
2977
2978 // Create and initialize an HttpServerProperties, must be done after
2979 // setting the feature.
2980 std::unique_ptr<MockPrefDelegate> pref_delegate =
2981 std::make_unique<MockPrefDelegate>();
2982 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
2983 std::unique_ptr<HttpServerProperties> properties =
2984 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
2985 /*net_log=*/nullptr,
2986 GetMockTickClock());
2987 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
2988
2989 properties->SetQuicServerInfo(kServer, kNetworkAnonymizationKey,
2990 "QuicServerInfo");
2991 EXPECT_TRUE(properties->GetQuicServerInfo(kServer, kNetworkAnonymizationKey));
2992
2993 // Wait until the data's been written to prefs, and then create a copy of
2994 // the prefs data.
2995 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
2996
2997 // No information should have been saved to prefs.
2998 std::string preferences_json;
2999 base::JSONWriter::Write(unowned_pref_delegate->GetServerProperties(),
3000 &preferences_json);
3001 EXPECT_EQ("{\"quic_servers\":[],\"servers\":[],\"version\":5}",
3002 preferences_json);
3003 }
3004
TEST_F(HttpServerPropertiesManagerTest,AdvertisedVersionsRoundTrip)3005 TEST_F(HttpServerPropertiesManagerTest, AdvertisedVersionsRoundTrip) {
3006 for (const quic::ParsedQuicVersion& version : AllSupportedQuicVersions()) {
3007 if (version.AlpnDeferToRFCv1()) {
3008 // These versions currently do not support Alt-Svc.
3009 continue;
3010 }
3011 // Reset test infrastructure.
3012 TearDown();
3013 SetUp();
3014 InitializePrefs();
3015 // Create alternate version information.
3016 const url::SchemeHostPort server("https", "quic.example.org", 443);
3017 AlternativeServiceInfoVector alternative_service_info_vector_in;
3018 AlternativeService quic_alternative_service(kProtoQUIC, "", 443);
3019 base::Time expiration;
3020 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration));
3021 quic::ParsedQuicVersionVector advertised_versions = {version};
3022 alternative_service_info_vector_in.push_back(
3023 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
3024 quic_alternative_service, expiration, advertised_versions));
3025 http_server_props_->SetAlternativeServices(
3026 server, NetworkAnonymizationKey(), alternative_service_info_vector_in);
3027 // Save to JSON.
3028 EXPECT_EQ(0, pref_delegate_->GetAndClearNumPrefUpdates());
3029 EXPECT_NE(0u, GetPendingMainThreadTaskCount());
3030 FastForwardUntilNoTasksRemain();
3031 EXPECT_EQ(1, pref_delegate_->GetAndClearNumPrefUpdates());
3032 const base::Value::Dict& http_server_properties =
3033 pref_delegate_->GetServerProperties();
3034 std::string preferences_json;
3035 EXPECT_TRUE(
3036 base::JSONWriter::Write(http_server_properties, &preferences_json));
3037 // Reset test infrastructure.
3038 TearDown();
3039 SetUp();
3040 InitializePrefs();
3041 // Read from JSON.
3042 base::Value::Dict preferences_dict =
3043 base::test::ParseJsonDict(preferences_json);
3044 ASSERT_FALSE(preferences_dict.empty());
3045 const base::Value::List* servers_list =
3046 preferences_dict.FindList("servers");
3047 ASSERT_TRUE(servers_list);
3048 ASSERT_EQ(servers_list->size(), 1u);
3049 const base::Value& server_dict = (*servers_list)[0];
3050 HttpServerProperties::ServerInfo server_info;
3051 EXPECT_TRUE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
3052 server, server_dict.GetDict(), &server_info));
3053 ASSERT_TRUE(server_info.alternative_services.has_value());
3054 AlternativeServiceInfoVector alternative_service_info_vector_out =
3055 server_info.alternative_services.value();
3056 ASSERT_EQ(1u, alternative_service_info_vector_out.size());
3057 EXPECT_EQ(
3058 kProtoQUIC,
3059 alternative_service_info_vector_out[0].alternative_service().protocol);
3060 // Ensure we correctly parsed the version.
3061 EXPECT_EQ(advertised_versions,
3062 alternative_service_info_vector_out[0].advertised_versions());
3063 }
3064 }
3065
TEST_F(HttpServerPropertiesManagerTest,SameOrderAfterReload)3066 TEST_F(HttpServerPropertiesManagerTest, SameOrderAfterReload) {
3067 const SchemefulSite kSite1(GURL("https://foo.test/"));
3068 const SchemefulSite kSite2(GURL("https://bar.test/"));
3069 const auto kNetworkAnonymizationKey1 =
3070 NetworkAnonymizationKey::CreateSameSite(kSite1);
3071 const auto kNetworkAnonymizationKey2 =
3072 NetworkAnonymizationKey::CreateSameSite(kSite2);
3073
3074 base::test::ScopedFeatureList feature_list;
3075 feature_list.InitAndEnableFeature(
3076 features::kPartitionHttpServerPropertiesByNetworkIsolationKey);
3077
3078 // Create and initialize an HttpServerProperties with no state.
3079 std::unique_ptr<MockPrefDelegate> pref_delegate =
3080 std::make_unique<MockPrefDelegate>();
3081 MockPrefDelegate* unowned_pref_delegate = pref_delegate.get();
3082 std::unique_ptr<HttpServerProperties> properties =
3083 std::make_unique<HttpServerProperties>(std::move(pref_delegate),
3084 /*net_log=*/nullptr,
3085 GetMockTickClock());
3086 unowned_pref_delegate->InitializePrefs(base::Value::Dict());
3087
3088 // Set alternative_service info.
3089 base::Time expiration = base::Time::Now() + base::Days(1);
3090 AlternativeServiceInfo alt_service1 =
3091 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
3092 AlternativeService(kProtoQUIC, "1.example", 1234), expiration,
3093 DefaultSupportedQuicVersions());
3094 AlternativeServiceInfo alt_service2 =
3095 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
3096 AlternativeService(kProtoHTTP2, "2.example", 443), expiration);
3097 AlternativeServiceInfo alt_service3 =
3098 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
3099 AlternativeService(kProtoHTTP2, "3.example", 443), expiration);
3100 const url::SchemeHostPort kServer1("https", "1.example", 443);
3101 const url::SchemeHostPort kServer2("https", "2.example", 443);
3102 const url::SchemeHostPort kServer3("https", "3.example", 443);
3103 properties->SetAlternativeServices(kServer1, kNetworkAnonymizationKey1,
3104 {alt_service1});
3105 properties->SetAlternativeServices(kServer2, kNetworkAnonymizationKey1,
3106 {alt_service2});
3107 properties->SetAlternativeServices(kServer3, kNetworkAnonymizationKey2,
3108 {alt_service3});
3109
3110 // Set quic_server_info.
3111 quic::QuicServerId quic_server_id1("quic1.example", 80, false);
3112 quic::QuicServerId quic_server_id2("quic2.example", 80, false);
3113 quic::QuicServerId quic_server_id3("quic3.example", 80, false);
3114 properties->SetQuicServerInfo(quic_server_id1, kNetworkAnonymizationKey1,
3115 "quic_server_info1");
3116 properties->SetQuicServerInfo(quic_server_id2, kNetworkAnonymizationKey1,
3117 "quic_server_info2");
3118 properties->SetQuicServerInfo(quic_server_id3, kNetworkAnonymizationKey2,
3119 "quic_server_info3");
3120
3121 // Set broken_alternative_service info.
3122 AlternativeService broken_service1(kProtoQUIC, "broken1.example", 443);
3123 AlternativeService broken_service2(kProtoQUIC, "broken2.example", 443);
3124 AlternativeService broken_service3(kProtoQUIC, "broken3.example", 443);
3125 properties->MarkAlternativeServiceBroken(broken_service1,
3126 kNetworkAnonymizationKey1);
3127 FastForwardBy(base::Milliseconds(1));
3128 properties->MarkAlternativeServiceBroken(broken_service2,
3129 kNetworkAnonymizationKey1);
3130 FastForwardBy(base::Milliseconds(1));
3131 properties->MarkAlternativeServiceBroken(broken_service3,
3132 kNetworkAnonymizationKey2);
3133
3134 // The first item of `server_info_map` must be the latest item.
3135 EXPECT_EQ(3u, properties->server_info_map_for_testing().size());
3136 EXPECT_EQ(
3137 properties->server_info_map_for_testing().begin()->first.server.host(),
3138 "3.example");
3139
3140 // The first item of `recently_broken_alternative_services` must be the latest
3141 // item.
3142 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3143 .recently_broken_alternative_services()
3144 .size());
3145 EXPECT_EQ("broken3.example",
3146 properties->broken_alternative_services_for_testing()
3147 .recently_broken_alternative_services()
3148 .begin()
3149 ->first.alternative_service.host);
3150
3151 // The first item of `quic_server_info_map` must be the latest item.
3152 EXPECT_EQ(3u, properties->quic_server_info_map_for_testing().size());
3153 EXPECT_EQ("quic3.example", properties->quic_server_info_map_for_testing()
3154 .begin()
3155 ->first.server_id.host());
3156
3157 // The first item of `broken_alternative_service_list` must be the oldest
3158 // item.
3159 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3160 .broken_alternative_service_list()
3161 .size());
3162 EXPECT_EQ("broken1.example",
3163 properties->broken_alternative_services_for_testing()
3164 .broken_alternative_service_list()
3165 .begin()
3166 ->first.alternative_service.host);
3167
3168 // Wait until the data's been written to prefs, and then tear down the
3169 // HttpServerProperties.
3170 FastForwardBy(HttpServerProperties::GetUpdatePrefsDelayForTesting());
3171 base::Value::Dict saved_value =
3172 unowned_pref_delegate->GetServerProperties().Clone();
3173
3174 // Create a new HttpServerProperties using the value saved to prefs above.
3175 pref_delegate = std::make_unique<MockPrefDelegate>();
3176 unowned_pref_delegate = pref_delegate.get();
3177 properties = std::make_unique<HttpServerProperties>(
3178 std::move(pref_delegate), /*net_log=*/nullptr, GetMockTickClock());
3179 unowned_pref_delegate->InitializePrefs(std::move(saved_value));
3180
3181 // The first item of `server_info_map` must be the latest item.
3182 EXPECT_EQ(3u, properties->server_info_map_for_testing().size());
3183 EXPECT_EQ(
3184 properties->server_info_map_for_testing().begin()->first.server.host(),
3185 "3.example");
3186
3187 // The first item of `recently_broken_alternative_services` must be the latest
3188 // item.
3189 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3190 .recently_broken_alternative_services()
3191 .size());
3192 EXPECT_EQ("broken3.example",
3193 properties->broken_alternative_services_for_testing()
3194 .recently_broken_alternative_services()
3195 .begin()
3196 ->first.alternative_service.host);
3197
3198 // The first item of `quic_server_info_map` must be the latest item.
3199 EXPECT_EQ(3u, properties->quic_server_info_map_for_testing().size());
3200 EXPECT_EQ("quic3.example", properties->quic_server_info_map_for_testing()
3201 .begin()
3202 ->first.server_id.host());
3203
3204 // The first item of `broken_alternative_service_list` must be the oldest
3205 // item.
3206 EXPECT_EQ(3u, properties->broken_alternative_services_for_testing()
3207 .broken_alternative_service_list()
3208 .size());
3209 EXPECT_EQ("broken1.example",
3210 properties->broken_alternative_services_for_testing()
3211 .broken_alternative_service_list()
3212 .begin()
3213 ->first.alternative_service.host);
3214 }
3215
3216 } // namespace net
3217