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

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 Canonical test Created 3 years, 5 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
« no previous file with comments | « net/http/http_server_properties_manager.cc ('k') | net/http/http_stream_factory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 // TODO(rtenneti): After we stop supporting version 3 and everyone has migrated 158 // TODO(rtenneti): After we stop supporting version 3 and everyone has migrated
158 // to version 4, delete the following code. 159 // to version 4, delete the following code.
159 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; 160 static const int kHttpServerPropertiesVersions[] = {3, 4, 5};
160 161
161 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { 162 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> {
162 protected: 163 protected:
163 HttpServerPropertiesManagerTest() = default; 164 HttpServerPropertiesManagerTest() = default;
164 165
165 void SetUp() override { 166 void SetUp() override {
166 one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1); 167 one_day_from_now_ = base::Time::Now() + base::TimeDelta::FromDays(1);
168 advertised_versions_ = HttpNetworkSession::Params().quic_supported_versions;
167 pref_delegate_ = new MockPrefDelegate; 169 pref_delegate_ = new MockPrefDelegate;
168 http_server_props_manager_.reset( 170 http_server_props_manager_.reset(
169 new StrictMock<TestingHttpServerPropertiesManager>( 171 new StrictMock<TestingHttpServerPropertiesManager>(
170 pref_delegate_, pref_test_task_runner_.task_runner(), 172 pref_delegate_, pref_test_task_runner_.task_runner(),
171 net_test_task_runner_)); 173 net_test_task_runner_));
172 174
173 EXPECT_FALSE(http_server_props_manager_->IsInitialized()); 175 EXPECT_FALSE(http_server_props_manager_->IsInitialized());
174 ExpectCacheUpdate(); 176 ExpectCacheUpdate();
175 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 177 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
176 pref_test_task_runner_->RunUntilIdle(); 178 pref_test_task_runner_->RunUntilIdle();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 bool HasAlternativeService(const url::SchemeHostPort& server) { 234 bool HasAlternativeService(const url::SchemeHostPort& server) {
233 const AlternativeServiceInfoVector alternative_service_info_vector = 235 const AlternativeServiceInfoVector alternative_service_info_vector =
234 http_server_props_manager_->GetAlternativeServiceInfos(server); 236 http_server_props_manager_->GetAlternativeServiceInfos(server);
235 return !alternative_service_info_vector.empty(); 237 return !alternative_service_info_vector.empty();
236 } 238 }
237 239
238 MockPrefDelegate* pref_delegate_; // Owned by HttpServerPropertiesManager. 240 MockPrefDelegate* pref_delegate_; // Owned by HttpServerPropertiesManager.
239 std::unique_ptr<TestingHttpServerPropertiesManager> 241 std::unique_ptr<TestingHttpServerPropertiesManager>
240 http_server_props_manager_; 242 http_server_props_manager_;
241 base::Time one_day_from_now_; 243 base::Time one_day_from_now_;
244 QuicVersionVector advertised_versions_;
242 245
243 // Overrides the main thread's message loop with a mock tick clock. Making the 246 // Overrides the main thread's message loop with a mock tick clock. Making the
244 // main thread the |pref_test_task_runner_| matches expectations better than 247 // main thread the |pref_test_task_runner_| matches expectations better than
245 // having an independent TestMockTimeTaskRunner and makes tests easier to 248 // having an independent TestMockTimeTaskRunner and makes tests easier to
246 // write. 249 // write.
247 base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_; 250 base::ScopedMockTimeMessageLoopTaskRunner pref_test_task_runner_;
248 251
249 // Mock the net task runner as well. 252 // Mock the net task runner as well.
250 scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ = 253 scoped_refptr<TestMockTimeTaskRunner> net_test_task_runner_ =
251 new TestMockTimeTaskRunner; 254 new TestMockTimeTaskRunner;
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 } 704 }
702 705
703 TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) { 706 TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServiceInfos) {
704 ExpectPrefsUpdate(1); 707 ExpectPrefsUpdate(1);
705 ExpectScheduleUpdatePrefsOnNetworkSequence(); 708 ExpectScheduleUpdatePrefsOnNetworkSequence();
706 709
707 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); 710 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
708 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); 711 EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
709 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 712 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
710 443); 713 443);
711 http_server_props_manager_->SetAlternativeService( 714 http_server_props_manager_->SetHttp2AlternativeService(
712 spdy_server_mail, alternative_service, one_day_from_now_); 715 spdy_server_mail, alternative_service, one_day_from_now_);
713 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once. 716 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
714 http_server_props_manager_->SetAlternativeService( 717 http_server_props_manager_->SetHttp2AlternativeService(
715 spdy_server_mail, alternative_service, one_day_from_now_); 718 spdy_server_mail, alternative_service, one_day_from_now_);
716 719
717 // Run the task. 720 // Run the task.
718 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 721 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
719 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 722 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
720 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 723 net_test_task_runner_->FastForwardUntilNoTasksRemain();
721 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 724 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
722 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 725 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
723 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 726 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
724 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 727 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
(...skipping 10 matching lines...) Expand all
735 TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServices) { 738 TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServices) {
736 ExpectPrefsUpdate(1); 739 ExpectPrefsUpdate(1);
737 ExpectScheduleUpdatePrefsOnNetworkSequence(); 740 ExpectScheduleUpdatePrefsOnNetworkSequence();
738 741
739 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); 742 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
740 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); 743 EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
741 AlternativeServiceInfoVector alternative_service_info_vector; 744 AlternativeServiceInfoVector alternative_service_info_vector;
742 const AlternativeService alternative_service1(kProtoHTTP2, "mail.google.com", 745 const AlternativeService alternative_service1(kProtoHTTP2, "mail.google.com",
743 443); 746 443);
744 alternative_service_info_vector.push_back( 747 alternative_service_info_vector.push_back(
745 AlternativeServiceInfo(alternative_service1, one_day_from_now_)); 748 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
749 alternative_service1, one_day_from_now_));
746 const AlternativeService alternative_service2(kProtoQUIC, "mail.google.com", 750 const AlternativeService alternative_service2(kProtoQUIC, "mail.google.com",
747 1234); 751 1234);
748 alternative_service_info_vector.push_back( 752 alternative_service_info_vector.push_back(
749 AlternativeServiceInfo(alternative_service2, one_day_from_now_)); 753 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
754 alternative_service2, one_day_from_now_, advertised_versions_));
750 http_server_props_manager_->SetAlternativeServices( 755 http_server_props_manager_->SetAlternativeServices(
751 spdy_server_mail, alternative_service_info_vector); 756 spdy_server_mail, alternative_service_info_vector);
752 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once. 757 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
753 http_server_props_manager_->SetAlternativeServices( 758 http_server_props_manager_->SetAlternativeServices(
754 spdy_server_mail, alternative_service_info_vector); 759 spdy_server_mail, alternative_service_info_vector);
755 760
756 // Run the task. 761 // Run the task.
757 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 762 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
758 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 763 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
759 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 764 net_test_task_runner_->FastForwardUntilNoTasksRemain();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 802
798 { 803 {
799 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 804 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
800 805
801 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80); 806 spdy_server_mail = url::SchemeHostPort("http", "mail.google.com", 80);
802 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); 807 EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
803 alternative_service = 808 alternative_service =
804 AlternativeService(kProtoHTTP2, "mail.google.com", 443); 809 AlternativeService(kProtoHTTP2, "mail.google.com", 443);
805 810
806 ExpectScheduleUpdatePrefsOnNetworkSequence(); 811 ExpectScheduleUpdatePrefsOnNetworkSequence();
807 http_server_props_manager_->SetAlternativeService( 812 http_server_props_manager_->SetHttp2AlternativeService(
808 spdy_server_mail, alternative_service, one_day_from_now_); 813 spdy_server_mail, alternative_service, one_day_from_now_);
809 814
810 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( 815 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
811 alternative_service)); 816 alternative_service));
812 EXPECT_FALSE( 817 EXPECT_FALSE(
813 http_server_props_manager_->WasAlternativeServiceRecentlyBroken( 818 http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
814 alternative_service)); 819 alternative_service));
815 820
816 ExpectScheduleUpdatePrefsOnNetworkSequence(); 821 ExpectScheduleUpdatePrefsOnNetworkSequence();
817 http_server_props_manager_->MarkAlternativeServiceBroken( 822 http_server_props_manager_->MarkAlternativeServiceBroken(
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 const IPAddress actual_address(127, 0, 0, 1); 975 const IPAddress actual_address(127, 0, 0, 1);
971 const QuicServerId mail_quic_server_id("mail.google.com", 80); 976 const QuicServerId mail_quic_server_id("mail.google.com", 80);
972 const std::string quic_server_info1("quic_server_info1"); 977 const std::string quic_server_info1("quic_server_info1");
973 978
974 { 979 {
975 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 980 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
976 981
977 http_server_props_manager_->SetSupportsSpdy(spdy_server, true); 982 http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
978 AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 983 AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
979 1234); 984 1234);
980 http_server_props_manager_->SetAlternativeService( 985 http_server_props_manager_->SetHttp2AlternativeService(
981 spdy_server, alternative_service, one_day_from_now_); 986 spdy_server, alternative_service, one_day_from_now_);
982 http_server_props_manager_->SetSupportsQuic(true, actual_address); 987 http_server_props_manager_->SetSupportsQuic(true, actual_address);
983 ServerNetworkStats stats; 988 ServerNetworkStats stats;
984 stats.srtt = base::TimeDelta::FromMicroseconds(10); 989 stats.srtt = base::TimeDelta::FromMicroseconds(10);
985 http_server_props_manager_->SetServerNetworkStats(spdy_server, stats); 990 http_server_props_manager_->SetServerNetworkStats(spdy_server, stats);
986 991
987 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, 992 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
988 quic_server_info1); 993 quic_server_info1);
989 } 994 }
990 995
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 1147
1143 const url::SchemeHostPort server_www("https", "www.google.com", 80); 1148 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1144 const url::SchemeHostPort server_mail("https", "mail.google.com", 80); 1149 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1145 1150
1146 // #1 & #2: Set alternate protocol. 1151 // #1 & #2: Set alternate protocol.
1147 AlternativeServiceInfoVector alternative_service_info_vector; 1152 AlternativeServiceInfoVector alternative_service_info_vector;
1148 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443); 1153 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443);
1149 base::Time expiration1; 1154 base::Time expiration1;
1150 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1)); 1155 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1151 alternative_service_info_vector.push_back( 1156 alternative_service_info_vector.push_back(
1152 AlternativeServiceInfo(www_alternative_service1, expiration1)); 1157 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1158 www_alternative_service1, expiration1));
1159
1153 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com", 1160 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com",
1154 1234); 1161 1234);
1155 base::Time expiration2; 1162 base::Time expiration2;
1156 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2)); 1163 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1157 alternative_service_info_vector.push_back( 1164 alternative_service_info_vector.push_back(
1158 AlternativeServiceInfo(www_alternative_service2, expiration2)); 1165 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1166 www_alternative_service2, expiration2));
1159 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( 1167 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1160 server_www, alternative_service_info_vector)); 1168 server_www, alternative_service_info_vector));
1161 1169
1162 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com", 1170 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com",
1163 444); 1171 444);
1164 base::Time expiration3 = base::Time::Max(); 1172 base::Time expiration3 = base::Time::Max();
1165 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService( 1173 ASSERT_TRUE(http_server_props_manager_->SetHttp2AlternativeService(
1166 server_mail, mail_alternative_service, expiration3)); 1174 server_mail, mail_alternative_service, expiration3));
1167 1175
1168 // #3: Set ServerNetworkStats. 1176 // #3: Set ServerNetworkStats.
1169 ServerNetworkStats stats; 1177 ServerNetworkStats stats;
1170 stats.srtt = base::TimeDelta::FromInternalValue(42); 1178 stats.srtt = base::TimeDelta::FromInternalValue(42);
1171 http_server_props_manager_->SetServerNetworkStats(server_mail, stats); 1179 http_server_props_manager_->SetServerNetworkStats(server_mail, stats);
1172 1180
1173 // #4: Set quic_server_info string. 1181 // #4: Set quic_server_info string.
1174 QuicServerId mail_quic_server_id("mail.google.com", 80); 1182 QuicServerId mail_quic_server_id("mail.google.com", 80);
1175 std::string quic_server_info1("quic_server_info1"); 1183 std::string quic_server_info1("quic_server_info1");
(...skipping 11 matching lines...) Expand all
1187 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 1195 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1188 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 1196 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1189 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 1197 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1190 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1198 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1191 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1199 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1192 1200
1193 // Verify preferences. 1201 // Verify preferences.
1194 const char expected_json[] = 1202 const char expected_json[] =
1195 "{\"quic_servers\":{\"https://" 1203 "{\"quic_servers\":{\"https://"
1196 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}}," 1204 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}},"
1197 "\"servers\":[" 1205 "\"servers\":[{\"https://www.google.com:80\":{"
1198 "{\"https://www.google.com:80\":{" 1206 "\"alternative_service\":[{\"advertised_versions\":[],\"expiration\":"
1199 "\"alternative_service\":[{\"expiration\":\"13756212000000000\"," 1207 "\"13756212000000000\",\"port\":443,\"protocol_str\":\"h2\"},"
1200 "\"port\":443,\"protocol_str\":\"h2\"}," 1208 "{\"advertised_versions\":[],\"expiration\":\"13758804000000000\","
1201 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\"," 1209 "\"host\":\"www.google.com\",\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1202 "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1203 "{\"https://mail.google.com:80\":{\"alternative_service\":[{" 1210 "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
1204 "\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\"," 1211 "\"advertised_versions\":[],\"expiration\":\"9223372036854775807\","
1205 "\"port\":444,\"protocol_str\":\"h2\"}]," 1212 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"h2\"}],"
1206 "\"network_stats\":{\"srtt\":42}}}" 1213 "\"network_stats\":{\"srtt\":42}}}],"
1207 "],"
1208 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true}," 1214 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true},"
1209 "\"version\":5}"; 1215 "\"version\":5}";
1210 1216
1211 const base::Value* http_server_properties = 1217 const base::Value* http_server_properties =
1212 &pref_delegate_->GetServerProperties(); 1218 &pref_delegate_->GetServerProperties();
1213 std::string preferences_json; 1219 std::string preferences_json;
1214 EXPECT_TRUE( 1220 EXPECT_TRUE(
1215 base::JSONWriter::Write(*http_server_properties, &preferences_json)); 1221 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1216 EXPECT_EQ(expected_json, preferences_json); 1222 EXPECT_EQ(expected_json, preferences_json);
1217 } 1223 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 { 1336 {
1331 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 1337 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
1332 1338
1333 AlternativeServiceInfoVector alternative_service_info_vector; 1339 AlternativeServiceInfoVector alternative_service_info_vector;
1334 1340
1335 const AlternativeService broken_alternative_service( 1341 const AlternativeService broken_alternative_service(
1336 kProtoHTTP2, "broken.example.com", 443); 1342 kProtoHTTP2, "broken.example.com", 443);
1337 const base::Time time_one_day_later = 1343 const base::Time time_one_day_later =
1338 base::Time::Now() + base::TimeDelta::FromDays(1); 1344 base::Time::Now() + base::TimeDelta::FromDays(1);
1339 alternative_service_info_vector.push_back( 1345 alternative_service_info_vector.push_back(
1340 AlternativeServiceInfo(broken_alternative_service, time_one_day_later)); 1346 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1347 broken_alternative_service, time_one_day_later));
1341 // #1: MarkAlternativeServiceBroken(). 1348 // #1: MarkAlternativeServiceBroken().
1342 http_server_props_manager_->MarkAlternativeServiceBroken( 1349 http_server_props_manager_->MarkAlternativeServiceBroken(
1343 broken_alternative_service); 1350 broken_alternative_service);
1344 1351
1345 const AlternativeService expired_alternative_service( 1352 const AlternativeService expired_alternative_service(
1346 kProtoHTTP2, "expired.example.com", 443); 1353 kProtoHTTP2, "expired.example.com", 443);
1347 const base::Time time_one_day_ago = 1354 const base::Time time_one_day_ago =
1348 base::Time::Now() - base::TimeDelta::FromDays(1); 1355 base::Time::Now() - base::TimeDelta::FromDays(1);
1349 alternative_service_info_vector.push_back( 1356 alternative_service_info_vector.push_back(
1350 AlternativeServiceInfo(expired_alternative_service, time_one_day_ago)); 1357 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1358 expired_alternative_service, time_one_day_ago));
1351 1359
1352 const AlternativeService valid_alternative_service( 1360 const AlternativeService valid_alternative_service(
1353 kProtoHTTP2, "valid.example.com", 443); 1361 kProtoHTTP2, "valid.example.com", 443);
1354 alternative_service_info_vector.push_back( 1362 alternative_service_info_vector.push_back(
1355 AlternativeServiceInfo(valid_alternative_service, time_one_day_later)); 1363 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1364 valid_alternative_service, time_one_day_later));
1356 1365
1357 const url::SchemeHostPort server("https", "www.example.com", 443); 1366 const url::SchemeHostPort server("https", "www.example.com", 443);
1358 // #2: SetAlternativeService(). 1367 // #2: SetAlternativeServices().
1359 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( 1368 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1360 server, alternative_service_info_vector)); 1369 server, alternative_service_info_vector));
1361 } 1370 }
1362 1371
1363 // Update cache. 1372 // Update cache.
1364 ExpectPrefsUpdate(1); 1373 ExpectPrefsUpdate(1);
1365 1374
1366 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 1375 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1367 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1376 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1368 1377
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1543 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 1552 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1544 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 1553 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1545 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1554 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1546 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1555 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1547 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); 1556 Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
1548 http_server_props_manager_.reset(); 1557 http_server_props_manager_.reset();
1549 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1558 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1550 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1559 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1551 } 1560 }
1552 1561
1562 TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
1563 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(5);
1564
1565 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1566 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1567
1568 // #1 & #2: Set alternate protocol.
1569 AlternativeServiceInfoVector alternative_service_info_vector;
1570 // Quic alternative service set with two advertised QUIC versions.
1571 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1572 base::Time expiration1;
1573 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1574 QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
1575 alternative_service_info_vector.push_back(
1576 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1577 quic_alternative_service1, expiration1, advertised_versions));
1578 // HTTP/2 alternative service should not set any advertised version.
1579 AlternativeService h2_alternative_service(kProtoHTTP2, "www.google.com",
1580 1234);
1581 base::Time expiration2;
1582 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1583 alternative_service_info_vector.push_back(
1584 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1585 h2_alternative_service, expiration2));
1586 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1587 server_www, alternative_service_info_vector));
1588
1589 // Set another QUIC alternative service with a single advertised QUIC version.
1590 AlternativeService mail_alternative_service(kProtoQUIC, "foo.google.com",
1591 444);
1592 base::Time expiration3 = base::Time::Max();
1593 ASSERT_TRUE(http_server_props_manager_->SetQuicAlternativeService(
1594 server_mail, mail_alternative_service, expiration3,
1595 advertised_versions_));
1596 // #3: Set ServerNetworkStats.
1597 ServerNetworkStats stats;
1598 stats.srtt = base::TimeDelta::FromInternalValue(42);
1599 http_server_props_manager_->SetServerNetworkStats(server_mail, stats);
1600
1601 // #4: Set quic_server_info string.
1602 QuicServerId mail_quic_server_id("mail.google.com", 80);
1603 std::string quic_server_info1("quic_server_info1");
1604 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1605 quic_server_info1);
1606
1607 // #5: Set SupportsQuic.
1608 IPAddress actual_address(127, 0, 0, 1);
1609 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1610
1611 // Update Prefs.
1612 ExpectPrefsUpdate(1);
1613 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1614 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1615 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1616 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1617 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1618 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1619 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1620
1621 // Verify preferences with correct advertised version field.
1622 const char expected_json[] =
1623 "{\"quic_servers\":{\"https://mail.google.com:80\":{"
1624 "\"server_info\":\"quic_server_info1\"}},\"servers\":["
1625 "{\"https://www.google.com:80\":{\"alternative_service\":[{"
1626 "\"advertised_versions\":[35,37],\"expiration\":\"13756212000000000\","
1627 "\"port\":443,\"protocol_str\":\"quic\"},{\"advertised_versions\":[],"
1628 "\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
1629 "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1630 "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
1631 "\"advertised_versions\":[37],\"expiration\":\"9223372036854775807\","
1632 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"quic\"}],"
1633 "\"network_stats\":{\"srtt\":42}}}],\"supports_quic\":{"
1634 "\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1635
1636 const base::Value* http_server_properties =
1637 &pref_delegate_->GetServerProperties();
1638 std::string preferences_json;
1639 EXPECT_TRUE(
1640 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1641 EXPECT_EQ(expected_json, preferences_json);
1642 }
1643
1644 TEST_P(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) {
1645 std::unique_ptr<base::Value> server_value = base::JSONReader::Read(
1646 "{\"alternative_service\":["
1647 "{\"port\":443,\"protocol_str\":\"quic\"},"
1648 "{\"port\":123,\"protocol_str\":\"quic\","
1649 "\"expiration\":\"9223372036854775807\","
1650 "\"advertised_versions\":[37,35]}]}");
1651 ASSERT_TRUE(server_value);
1652 base::DictionaryValue* server_dict;
1653 ASSERT_TRUE(server_value->GetAsDictionary(&server_dict));
1654
1655 const url::SchemeHostPort server("https", "example.com", 443);
1656 AlternativeServiceMap alternative_service_map(/*max_size=*/5);
1657 EXPECT_TRUE(http_server_props_manager_->AddToAlternativeServiceMap(
1658 server, *server_dict, &alternative_service_map));
1659
1660 AlternativeServiceMap::iterator it = alternative_service_map.Get(server);
1661 ASSERT_NE(alternative_service_map.end(), it);
1662 AlternativeServiceInfoVector alternative_service_info_vector = it->second;
1663 ASSERT_EQ(2u, alternative_service_info_vector.size());
1664
1665 // Verify the first alternative service with no advertised version listed.
1666 EXPECT_EQ(kProtoQUIC,
1667 alternative_service_info_vector[0].alternative_service().protocol);
1668 EXPECT_EQ("", alternative_service_info_vector[0].alternative_service().host);
1669 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1670 // Expiration defaults to one day from now, testing with tolerance.
1671 const base::Time now = base::Time::Now();
1672 const base::Time expiration = alternative_service_info_vector[0].expiration();
1673 EXPECT_LE(now + base::TimeDelta::FromHours(23), expiration);
1674 EXPECT_GE(now + base::TimeDelta::FromDays(1), expiration);
1675 EXPECT_TRUE(alternative_service_info_vector[0].advertised_versions().empty());
1676
1677 // Verify the second alterntaive service with two advertised versions.
1678 EXPECT_EQ(kProtoQUIC,
1679 alternative_service_info_vector[1].alternative_service().protocol);
1680 EXPECT_EQ("", alternative_service_info_vector[1].alternative_service().host);
1681 EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service().port);
1682 EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration());
1683 // Verify advertised versions.
1684 const QuicVersionVector loaded_advertised_versions =
1685 alternative_service_info_vector[1].advertised_versions();
1686 EXPECT_EQ(2u, loaded_advertised_versions.size());
1687 EXPECT_EQ(QUIC_VERSION_35, loaded_advertised_versions[0]);
1688 EXPECT_EQ(QUIC_VERSION_37, loaded_advertised_versions[1]);
1689 }
1690
1691 TEST_P(HttpServerPropertiesManagerTest,
1692 UpdatePrefWhenAdvertisedVersionsChange) {
1693 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(4);
1694
1695 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1696
1697 // #1: Set alternate protocol.
1698 AlternativeServiceInfoVector alternative_service_info_vector;
1699 // Quic alternative service set with a single QUIC version: QUIC_VERSION_37.
1700 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1701 base::Time expiration1;
1702 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1703 alternative_service_info_vector.push_back(
1704 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1705 quic_alternative_service1, expiration1, advertised_versions_));
1706 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1707 server_www, alternative_service_info_vector));
1708
1709 // Set quic_server_info string.
1710 QuicServerId mail_quic_server_id("mail.google.com", 80);
1711 std::string quic_server_info1("quic_server_info1");
1712 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1713 quic_server_info1);
1714
1715 // Set SupportsQuic.
1716 IPAddress actual_address(127, 0, 0, 1);
1717 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1718
1719 // Update Prefs.
1720 ExpectPrefsUpdate(1);
1721 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1722 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1723 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1724 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1725 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1726 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1727 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1728
1729 // Verify preferences with correct advertised version field.
1730 const char expected_json[] =
1731 "{\"quic_servers\":{\"https://mail.google.com:80\":"
1732 "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
1733 "{\"https://www.google.com:80\":"
1734 "{\"alternative_service\":[{\"advertised_versions\":[37],"
1735 "\"expiration\":\"13756212000000000\",\"port\":443,"
1736 "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
1737 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1738
1739 const base::Value* http_server_properties =
1740 &pref_delegate_->GetServerProperties();
1741 std::string preferences_json;
1742 EXPECT_TRUE(
1743 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1744 EXPECT_EQ(expected_json, preferences_json);
1745
1746 // #2: Set AlternativeService with different advertised_versions for the same
1747 // AlternativeService.
1748 AlternativeServiceInfoVector alternative_service_info_vector_2;
1749 // Quic alternative service set with two advertised QUIC versions.
1750 QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
1751 alternative_service_info_vector_2.push_back(
1752 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1753 quic_alternative_service1, expiration1, advertised_versions));
1754 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1755 server_www, alternative_service_info_vector_2));
1756
1757 // Update Prefs.
1758 ExpectPrefsUpdate(1);
1759 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1760 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1761 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1762 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1763 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1764 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1765 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1766
1767 // Verify preferences updated with new advertised versions.
1768 const char expected_json_updated[] =
1769 "{\"quic_servers\":{\"https://mail.google.com:80\":"
1770 "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
1771 "{\"https://www.google.com:80\":"
1772 "{\"alternative_service\":[{\"advertised_versions\":[35,37],"
1773 "\"expiration\":\"13756212000000000\",\"port\":443,"
1774 "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
1775 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1776 EXPECT_TRUE(
1777 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1778 EXPECT_EQ(expected_json_updated, preferences_json);
1779
1780 // #3: Set AlternativeService with same advertised_versions.
1781 AlternativeServiceInfoVector alternative_service_info_vector_3;
1782 // A same set of QUIC versions but listed in a different order.
1783 QuicVersionVector advertised_versions_2 = {QUIC_VERSION_35, QUIC_VERSION_37};
1784 alternative_service_info_vector_3.push_back(
1785 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1786 quic_alternative_service1, expiration1, advertised_versions_2));
1787 ASSERT_FALSE(http_server_props_manager_->SetAlternativeServices(
1788 server_www, alternative_service_info_vector_3));
1789
1790 // No Prefs update.
1791 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1792 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1793 }
1794
1553 } // namespace net 1795 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_server_properties_manager.cc ('k') | net/http/http_stream_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698