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

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

Powered by Google App Engine
This is Rietveld 408576698