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

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

Issue 2901093004: Add and persist a new field in AlternativeServiceInfo to list QUIC verisons advertised (Closed)
Patch Set: Self review Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_server_properties_manager.h" 5 #include "net/http/http_server_properties_manager.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/json/json_reader.h" 11 #include "base/json/json_reader.h"
12 #include "base/json/json_writer.h" 12 #include "base/json/json_writer.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/memory/ref_counted.h" 15 #include "base/memory/ref_counted.h"
16 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
19 #include "base/test/scoped_mock_time_message_loop_task_runner.h" 19 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
20 #include "base/test/test_mock_time_task_runner.h" 20 #include "base/test/test_mock_time_task_runner.h"
21 #include "base/test/test_simple_task_runner.h" 21 #include "base/test/test_simple_task_runner.h"
22 #include "base/threading/thread_task_runner_handle.h" 22 #include "base/threading/thread_task_runner_handle.h"
23 #include "base/values.h" 23 #include "base/values.h"
24 #include "net/base/ip_address.h" 24 #include "net/base/ip_address.h"
25 #include "net/http/http_network_session.h"
25 #include "testing/gmock/include/gmock/gmock.h" 26 #include "testing/gmock/include/gmock/gmock.h"
26 #include "testing/gtest/include/gtest/gtest.h" 27 #include "testing/gtest/include/gtest/gtest.h"
27 #include "url/gurl.h" 28 #include "url/gurl.h"
28 29
29 namespace net { 30 namespace net {
30 31
31 namespace { 32 namespace {
32 33
33 using base::StringPrintf; 34 using base::StringPrintf;
34 using base::TestMockTimeTaskRunner; 35 using base::TestMockTimeTaskRunner;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 // TODO(rtenneti): After we stop supporting version 3 and everyone has migrated 155 // TODO(rtenneti): After we stop supporting version 3 and everyone has migrated
155 // to version 4, delete the following code. 156 // to version 4, delete the following code.
156 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; 157 static const int kHttpServerPropertiesVersions[] = {3, 4, 5};
157 158
158 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { 159 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> {
159 protected: 160 protected:
160 HttpServerPropertiesManagerTest() = default; 161 HttpServerPropertiesManagerTest() = default;
161 162
162 void SetUp() override { 163 void SetUp() override {
163 one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1); 164 one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1);
165 advertised_versions_ = HttpNetworkSession::Params().quic_supported_versions;
164 pref_delegate_ = new MockPrefDelegate; 166 pref_delegate_ = new MockPrefDelegate;
165 http_server_props_manager_.reset( 167 http_server_props_manager_.reset(
166 new StrictMock<TestingHttpServerPropertiesManager>( 168 new StrictMock<TestingHttpServerPropertiesManager>(
167 pref_delegate_, pref_test_task_runner_.task_runner(), 169 pref_delegate_, pref_test_task_runner_.task_runner(),
168 net_test_task_runner_)); 170 net_test_task_runner_));
169 171
170 EXPECT_FALSE(http_server_props_manager_->IsInitialized()); 172 EXPECT_FALSE(http_server_props_manager_->IsInitialized());
171 ExpectCacheUpdate(); 173 ExpectCacheUpdate();
172 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 174 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
173 pref_test_task_runner_->RunUntilIdle(); 175 pref_test_task_runner_->RunUntilIdle();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 bool HasAlternativeService(const url::SchemeHostPort& server) { 229 bool HasAlternativeService(const url::SchemeHostPort& server) {
228 const AlternativeServiceInfoVector alternative_service_info_vector = 230 const AlternativeServiceInfoVector alternative_service_info_vector =
229 http_server_props_manager_->GetAlternativeServiceInfos(server); 231 http_server_props_manager_->GetAlternativeServiceInfos(server);
230 return !alternative_service_info_vector.empty(); 232 return !alternative_service_info_vector.empty();
231 } 233 }
232 234
233 MockPrefDelegate* pref_delegate_; // Owned by HttpServerPropertiesManager. 235 MockPrefDelegate* pref_delegate_; // Owned by HttpServerPropertiesManager.
234 std::unique_ptr<TestingHttpServerPropertiesManager> 236 std::unique_ptr<TestingHttpServerPropertiesManager>
235 http_server_props_manager_; 237 http_server_props_manager_;
236 base::Time one_day_from_now_; 238 base::Time one_day_from_now_;
239 QuicVersionVector advertised_versions_;
237 240
238 // Overrides the main thread's message loop with a mock tick clock. Making the 241 // Overrides the main thread's message loop with a mock tick clock. Making the
239 // main thread the |pref_test_task_runner_| matches expectations better than 242 // main thread the |pref_test_task_runner_| matches expectations better than
240 // having an independent TestMockTimeTaskRunner and makes tests easier to 243 // having an independent TestMockTimeTaskRunner and makes tests easier to
241 // write. 244 // write.
242 base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_; 245 base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_;
243 246
244 // Mock the net task runner as well. 247 // Mock the net task runner as well.
245 scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ = 248 scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ =
246 new TestMockTimeTaskRunner; 249 new TestMockTimeTaskRunner;
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 721
719 TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) { 722 TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) {
720 ExpectPrefsUpdate(1); 723 ExpectPrefsUpdate(1);
721 ExpectScheduleUpdatePrefsOnNetworkThread(); 724 ExpectScheduleUpdatePrefsOnNetworkThread();
722 725
723 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); 726 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
724 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); 727 EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
725 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 728 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
726 443); 729 443);
727 http_server_props_manager_->SetAlternativeService( 730 http_server_props_manager_->SetAlternativeService(
728 spdy_server_mail, alternative_service, one_day_from_now_); 731 spdy_server_mail, alternative_service, one_day_from_now_,
732 advertised_versions_);
729 // ExpectScheduleUpdatePrefsOnNetworkThread() should be called only once. 733 // ExpectScheduleUpdatePrefsOnNetworkThread() should be called only once.
730 http_server_props_manager_->SetAlternativeService( 734 http_server_props_manager_->SetAlternativeService(
731 spdy_server_mail, alternative_service, one_day_from_now_); 735 spdy_server_mail, alternative_service, one_day_from_now_,
736 advertised_versions_);
732 737
733 // Run the task. 738 // Run the task.
734 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 739 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
735 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 740 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
736 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 741 net_test_task_runner_->FastForwardUntilNoTasksRemain();
737 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 742 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
738 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 743 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
739 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 744 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
740 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 745 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
741 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 746 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 { 819 {
815 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 820 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
816 821
817 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80); 822 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
818 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); 823 EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
819 alternative_service = 824 alternative_service =
820 AlternativeService(kProtoHTTP2, "mail.google.com", 443); 825 AlternativeService(kProtoHTTP2, "mail.google.com", 443);
821 826
822 ExpectScheduleUpdatePrefsOnNetworkThread(); 827 ExpectScheduleUpdatePrefsOnNetworkThread();
823 http_server_props_manager_->SetAlternativeService( 828 http_server_props_manager_->SetAlternativeService(
824 spdy_server_mail, alternative_service, one_day_from_now_); 829 spdy_server_mail, alternative_service, one_day_from_now_,
830 advertised_versions_);
825 831
826 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( 832 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
827 alternative_service)); 833 alternative_service));
828 EXPECT_FALSE( 834 EXPECT_FALSE(
829 http_server_props_manager_->WasAlternativeServiceRecentlyBroken( 835 http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
830 alternative_service)); 836 alternative_service));
831 837
832 ExpectScheduleUpdatePrefsOnNetworkThread(); 838 ExpectScheduleUpdatePrefsOnNetworkThread();
833 http_server_props_manager_->MarkAlternativeServiceBroken( 839 http_server_props_manager_->MarkAlternativeServiceBroken(
834 alternative_service); 840 alternative_service);
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 const QuicServerId mail_quic_server_id("mail.google.com", 80); 993 const QuicServerId mail_quic_server_id("mail.google.com", 80);
988 const std::string quic_server_info1("quic_server_info1"); 994 const std::string quic_server_info1("quic_server_info1");
989 995
990 { 996 {
991 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 997 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
992 998
993 http_server_props_manager_->SetSupportsSpdy(spdy_server, true); 999 http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
994 AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 1000 AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
995 1234); 1001 1234);
996 http_server_props_manager_->SetAlternativeService( 1002 http_server_props_manager_->SetAlternativeService(
997 spdy_server, alternative_service, one_day_from_now_); 1003 spdy_server, alternative_service, one_day_from_now_,
1004 advertised_versions_);
998 http_server_props_manager_->SetSupportsQuic(true, actual_address); 1005 http_server_props_manager_->SetSupportsQuic(true, actual_address);
999 ServerNetworkStats stats; 1006 ServerNetworkStats stats;
1000 stats.srtt = base::TimeDelta::FromMicroseconds(10); 1007 stats.srtt = base::TimeDelta::FromMicroseconds(10);
1001 http_server_props_manager_->SetServerNetworkStats(spdy_server, stats); 1008 http_server_props_manager_->SetServerNetworkStats(spdy_server, stats);
1002 1009
1003 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, 1010 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1004 quic_server_info1); 1011 quic_server_info1);
1005 } 1012 }
1006 1013
1007 // Run the task. 1014 // Run the task.
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 const url::SchemeHostPort server_www("https", "www.google.com", 80); 1165 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1159 const url::SchemeHostPort server_mail("https", "mail.google.com", 80); 1166 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1160 1167
1161 // #1 & #2: Set alternate protocol. 1168 // #1 & #2: Set alternate protocol.
1162 AlternativeServiceInfoVector alternative_service_info_vector; 1169 AlternativeServiceInfoVector alternative_service_info_vector;
1163 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443); 1170 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443);
1164 base::Time expiration1; 1171 base::Time expiration1;
1165 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1)); 1172 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1166 alternative_service_info_vector.push_back( 1173 alternative_service_info_vector.push_back(
1167 AlternativeServiceInfo(www_alternative_service1, expiration1)); 1174 AlternativeServiceInfo(www_alternative_service1, expiration1));
1175
1168 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com", 1176 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com",
1169 1234); 1177 1234);
1170 base::Time expiration2; 1178 base::Time expiration2;
1171 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2)); 1179 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1172 alternative_service_info_vector.push_back( 1180 alternative_service_info_vector.push_back(
1173 AlternativeServiceInfo(www_alternative_service2, expiration2)); 1181 AlternativeServiceInfo(www_alternative_service2, expiration2));
1174 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( 1182 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1175 server_www, alternative_service_info_vector)); 1183 server_www, alternative_service_info_vector));
1176 1184
1177 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com", 1185 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com",
1178 444); 1186 444);
1179 base::Time expiration3 = base::Time::Max(); 1187 base::Time expiration3 = base::Time::Max();
1180 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService( 1188 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService(
1181 server_mail, mail_alternative_service, expiration3)); 1189 server_mail, mail_alternative_service, expiration3,
1190 advertised_versions_));
1182 1191
1183 // #3: Set ServerNetworkStats. 1192 // #3: Set ServerNetworkStats.
1184 ServerNetworkStats stats; 1193 ServerNetworkStats stats;
1185 stats.srtt = base::TimeDelta::FromInternalValue(42); 1194 stats.srtt = base::TimeDelta::FromInternalValue(42);
1186 http_server_props_manager_->SetServerNetworkStats(server_mail, stats); 1195 http_server_props_manager_->SetServerNetworkStats(server_mail, stats);
1187 1196
1188 // #4: Set quic_server_info string. 1197 // #4: Set quic_server_info string.
1189 QuicServerId mail_quic_server_id("mail.google.com", 80); 1198 QuicServerId mail_quic_server_id("mail.google.com", 80);
1190 std::string quic_server_info1("quic_server_info1"); 1199 std::string quic_server_info1("quic_server_info1");
1191 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, 1200 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
(...skipping 10 matching lines...) Expand all
1202 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 1211 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1203 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 1212 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1204 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 1213 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1205 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1214 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1206 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1215 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1207 1216
1208 // Verify preferences. 1217 // Verify preferences.
1209 const char expected_json[] = 1218 const char expected_json[] =
1210 "{\"quic_servers\":{\"https://" 1219 "{\"quic_servers\":{\"https://"
1211 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}}," 1220 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}},"
1212 "\"servers\":[" 1221 "\"servers\":[{\"https://www.google.com:80\":{"
1213 "{\"https://www.google.com:80\":{" 1222 "\"alternative_service\":[{\"advertised_versions\":[],\"expiration\":"
1214 "\"alternative_service\":[{\"expiration\":\"13756212000000000\"," 1223 "\"13756212000000000\",\"port\":443,\"protocol_str\":\"h2\"},"
1215 "\"port\":443,\"protocol_str\":\"h2\"}," 1224 "{\"advertised_versions\":[],\"expiration\":\"13758804000000000\","
1216 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\"," 1225 "\"host\":\"www.google.com\",\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1217 "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1218 "{\"https://mail.google.com:80\":{\"alternative_service\":[{" 1226 "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
1219 "\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\"," 1227 "\"advertised_versions\":[],\"expiration\":\"9223372036854775807\","
1220 "\"port\":444,\"protocol_str\":\"h2\"}]," 1228 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"h2\"}],"
1221 "\"network_stats\":{\"srtt\":42}}}" 1229 "\"network_stats\":{\"srtt\":42}}}],"
1222 "],"
1223 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true}," 1230 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true},"
1224 "\"version\":5}"; 1231 "\"version\":5}";
1225 1232
1226 const base::Value* http_server_properties = 1233 const base::Value* http_server_properties =
1227 &pref_delegate_->GetServerProperties(); 1234 &pref_delegate_->GetServerProperties();
1228 std::string preferences_json; 1235 std::string preferences_json;
1229 EXPECT_TRUE( 1236 EXPECT_TRUE(
1230 base::JSONWriter::Write(*http_server_properties, &preferences_json)); 1237 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1231 EXPECT_EQ(expected_json, preferences_json); 1238 EXPECT_EQ(expected_json, preferences_json);
1232 } 1239 }
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1556 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 1563 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1557 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 1564 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1558 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1565 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1559 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1566 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1560 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); 1567 Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
1561 http_server_props_manager_.reset(); 1568 http_server_props_manager_.reset();
1562 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1569 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1563 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1570 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1564 } 1571 }
1565 1572
1573 TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
1574 ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(5);
1575
1576 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1577 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1578
1579 // #1 & #2: Set alternate protocol.
1580 AlternativeServiceInfoVector alternative_service_info_vector;
1581 // Quic alternative service set with two advertised QUIC versions.
1582 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1583 base::Time expiration1;
1584 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1585 QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
1586 alternative_service_info_vector.push_back(AlternativeServiceInfo(
1587 quic_alternative_service1, expiration1, advertised_versions));
1588 // HTTP/2 alternative service should not set any advertised version.
1589 AlternativeService h2_alternative_service(kProtoHTTP2, "www.google.com",
1590 1234);
1591 base::Time expiration2;
1592 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1593 alternative_service_info_vector.push_back(
1594 AlternativeServiceInfo(h2_alternative_service, expiration2));
1595 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1596 server_www, alternative_service_info_vector));
1597
1598 // Set another QUIC alternative service with a single advertised QUIC version.
1599 AlternativeService mail_alternative_service(kProtoQUIC, "foo.google.com",
1600 444);
1601 base::Time expiration3 = base::Time::Max();
1602 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService(
1603 server_mail, mail_alternative_service, expiration3,
1604 advertised_versions_));
1605 // #3: Set ServerNetworkStats.
1606 ServerNetworkStats stats;
1607 stats.srtt = base::TimeDelta::FromInternalValue(42);
1608 http_server_props_manager_->SetServerNetworkStats(server_mail, stats);
1609
1610 // #4: Set quic_server_info string.
1611 QuicServerId mail_quic_server_id("mail.google.com", 80);
1612 std::string quic_server_info1("quic_server_info1");
1613 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1614 quic_server_info1);
1615
1616 // #5: Set SupportsQuic.
1617 IPAddress actual_address(127, 0, 0, 1);
1618 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1619
1620 // Update Prefs.
1621 ExpectPrefsUpdate(1);
1622 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1623 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1624 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1625 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1626 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1627 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1628 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1629
1630 // Verify preferences with correct advertised version field.
1631 const char expected_json[] =
1632 "{\"quic_servers\":{\"https://mail.google.com:80\":{"
1633 "\"server_info\":\"quic_server_info1\"}},\"servers\":["
1634 "{\"https://www.google.com:80\":{\"alternative_service\":[{"
1635 "\"advertised_versions\":[35,37],\"expiration\":\"13756212000000000\","
1636 "\"port\":443,\"protocol_str\":\"quic\"},{\"advertised_versions\":[],"
1637 "\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
1638 "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1639 "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
1640 "\"advertised_versions\":[37],\"expiration\":\"9223372036854775807\","
1641 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"quic\"}],"
1642 "\"network_stats\":{\"srtt\":42}}}],\"supports_quic\":{"
1643 "\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1644
1645 const base::Value* http_server_properties =
1646 &pref_delegate_->GetServerProperties();
1647 std::string preferences_json;
1648 EXPECT_TRUE(
1649 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1650 EXPECT_EQ(expected_json, preferences_json);
1651 }
1652
1653 TEST_P(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) {
1654 std::unique_ptr<base::Value> server_value = base::JSONReader::Read(
1655 "{\"alternative_service\":["
1656 "{\"port\":443,\"protocol_str\":\"quic\"},"
1657 "{\"port\":123,\"protocol_str\":\"quic\","
1658 "\"expiration\":\"9223372036854775807\","
1659 "\"advertised_versions\":[37,35]}]}");
1660 ASSERT_TRUE(server_value);
1661 base::DictionaryValue* server_dict;
1662 ASSERT_TRUE(server_value->GetAsDictionary(&server_dict));
1663
1664 const url::SchemeHostPort server("https", "example.com", 443);
1665 AlternativeServiceMap alternative_service_map(/*max_size=*/5);
1666 EXPECT_TRUE(http_server_props_manager_->AddToAlternativeServiceMap(
1667 server, *server_dict, &alternative_service_map));
1668
1669 AlternativeServiceMap::iterator it = alternative_service_map.Get(server);
1670 ASSERT_NE(alternative_service_map.end(), it);
1671 AlternativeServiceInfoVector alternative_service_info_vector = it->second;
1672 ASSERT_EQ(2u, alternative_service_info_vector.size());
1673
1674 // Verify the first alternative service with no advertised version listed.
1675 EXPECT_EQ(kProtoQUIC,
1676 alternative_service_info_vector[0].alternative_service.protocol);
1677 EXPECT_EQ("", alternative_service_info_vector[0].alternative_service.host);
1678 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service.port);
1679 // Expiration defaults to one day from now, testing with tolerance.
1680 const base::Time now = base::Time::Now();
1681 const base::Time expiration = alternative_service_info_vector[0].expiration;
1682 EXPECT_LE(now + base::TimeDelta::FromHours(23), expiration);
1683 EXPECT_GE(now + base::TimeDelta::FromDays(1), expiration);
1684 EXPECT_TRUE(alternative_service_info_vector[0].advertised_versions().empty());
1685
1686 // Verify the second alterntaive service with two advertised versions.
1687 EXPECT_EQ(kProtoQUIC,
1688 alternative_service_info_vector[1].alternative_service.protocol);
1689 EXPECT_EQ("", alternative_service_info_vector[1].alternative_service.host);
1690 EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service.port);
1691 EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration);
1692 // Verify advertised versions.
1693 const QuicVersionVector loaded_advertised_versions =
1694 alternative_service_info_vector[1].advertised_versions();
1695 EXPECT_EQ(2u, loaded_advertised_versions.size());
1696 EXPECT_EQ(QUIC_VERSION_35, loaded_advertised_versions[0]);
1697 EXPECT_EQ(QUIC_VERSION_37, loaded_advertised_versions[1]);
1698 }
1699
1700 TEST_P(HttpServerPropertiesManagerTest,
1701 UpdatePrefWhenAdvertisedVersionsChange) {
1702 ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(4);
1703
1704 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1705
1706 // #1: Set alternate protocol.
1707 AlternativeServiceInfoVector alternative_service_info_vector;
1708 // Quic alternative service set with a single QUIC version: QUIC_VERSION_37.
1709 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1710 base::Time expiration1;
1711 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1712 alternative_service_info_vector.push_back(AlternativeServiceInfo(
1713 quic_alternative_service1, expiration1, advertised_versions_));
1714 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1715 server_www, alternative_service_info_vector));
1716
1717 // Set quic_server_info string.
1718 QuicServerId mail_quic_server_id("mail.google.com", 80);
1719 std::string quic_server_info1("quic_server_info1");
1720 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1721 quic_server_info1);
1722
1723 // Set SupportsQuic.
1724 IPAddress actual_address(127, 0, 0, 1);
1725 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1726
1727 // Update Prefs.
1728 ExpectPrefsUpdate(1);
1729 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1730 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1731 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1732 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1733 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1734 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1735 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1736
1737 // Verify preferences with correct advertised version field.
1738 const char expected_json[] =
1739 "{\"quic_servers\":{\"https://mail.google.com:80\":"
1740 "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
1741 "{\"https://www.google.com:80\":"
1742 "{\"alternative_service\":[{\"advertised_versions\":[37],"
1743 "\"expiration\":\"13756212000000000\",\"port\":443,"
1744 "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
1745 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1746
1747 const base::Value* http_server_properties =
1748 &pref_delegate_->GetServerProperties();
1749 std::string preferences_json;
1750 EXPECT_TRUE(
1751 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1752 EXPECT_EQ(expected_json, preferences_json);
1753
1754 // #2: Set AlternativeService with different advertised_versions for the same
1755 // AlternativeService.
1756 AlternativeServiceInfoVector alternative_service_info_vector_2;
1757 // Quic alternative service set with two advertised QUIC versions.
1758 QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
1759 alternative_service_info_vector_2.push_back(AlternativeServiceInfo(
1760 quic_alternative_service1, expiration1, advertised_versions));
1761 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1762 server_www, alternative_service_info_vector_2));
1763
1764 // Update Prefs.
1765 ExpectPrefsUpdate(1);
1766 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1767 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1768 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1769 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1770 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1771 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1772 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1773
1774 // Verify preferences updated with new advertised versions.
1775 const char expected_json_updated[] =
1776 "{\"quic_servers\":{\"https://mail.google.com:80\":"
1777 "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
1778 "{\"https://www.google.com:80\":"
1779 "{\"alternative_service\":[{\"advertised_versions\":[35,37],"
1780 "\"expiration\":\"13756212000000000\",\"port\":443,"
1781 "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
1782 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1783 EXPECT_TRUE(
1784 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1785 EXPECT_EQ(expected_json_updated, preferences_json);
1786
1787 // #3: Set AlternativeService with same advertised_versions.
1788 AlternativeServiceInfoVector alternative_service_info_vector_3;
1789 // A same set of QUIC versions but listed in a different order.
1790 QuicVersionVector advertised_versions_2 = {QUIC_VERSION_35, QUIC_VERSION_37};
1791 alternative_service_info_vector_3.push_back(AlternativeServiceInfo(
1792 quic_alternative_service1, expiration1, advertised_versions_2));
1793 ASSERT_FALSE(http_server_props_manager_->SetAlternativeServices(
1794 server_www, alternative_service_info_vector_3));
1795
1796 // No Prefs update.
1797 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1798 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1799 }
1800
1566 } // namespace net 1801 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698