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