xref: /aosp_15_r20/external/cronet/net/http/http_server_properties_manager_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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