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

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 cronet/grpc 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 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 } 724 }
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_->SetHttp2AlternativeService(
732 spdy_server_mail, alternative_service, one_day_from_now_); 735 spdy_server_mail, alternative_service, one_day_from_now_);
733 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once. 736 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
734 http_server_props_manager_->SetAlternativeService( 737 http_server_props_manager_->SetHttp2AlternativeService(
735 spdy_server_mail, alternative_service, one_day_from_now_); 738 spdy_server_mail, alternative_service, one_day_from_now_);
736 739
737 // Run the task. 740 // Run the task.
738 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 741 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
739 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 742 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
740 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 743 net_test_task_runner_->FastForwardUntilNoTasksRemain();
741 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 744 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
742 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 745 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
743 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 746 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
744 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 747 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
(...skipping 10 matching lines...) Expand all
755 TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServices) { 758 TEST_P(HttpServerPropertiesManagerTest, SetAlternativeServices) {
756 ExpectPrefsUpdate(1); 759 ExpectPrefsUpdate(1);
757 ExpectScheduleUpdatePrefsOnNetworkSequence(); 760 ExpectScheduleUpdatePrefsOnNetworkSequence();
758 761
759 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); 762 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80);
760 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); 763 EXPECT_FALSE(HasAlternativeService(spdy_server_mail));
761 AlternativeServiceInfoVector alternative_service_info_vector; 764 AlternativeServiceInfoVector alternative_service_info_vector;
762 const AlternativeService alternative_service1(kProtoHTTP2, "mail.google.com", 765 const AlternativeService alternative_service1(kProtoHTTP2, "mail.google.com",
763 443); 766 443);
764 alternative_service_info_vector.push_back( 767 alternative_service_info_vector.push_back(
765 AlternativeServiceInfo(alternative_service1, one_day_from_now_)); 768 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
769 alternative_service1, one_day_from_now_));
766 const AlternativeService alternative_service2(kProtoQUIC, "mail.google.com", 770 const AlternativeService alternative_service2(kProtoQUIC, "mail.google.com",
767 1234); 771 1234);
768 alternative_service_info_vector.push_back( 772 alternative_service_info_vector.push_back(
769 AlternativeServiceInfo(alternative_service2, one_day_from_now_)); 773 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
774 alternative_service2, one_day_from_now_, advertised_versions_));
770 http_server_props_manager_->SetAlternativeServices( 775 http_server_props_manager_->SetAlternativeServices(
771 spdy_server_mail, alternative_service_info_vector); 776 spdy_server_mail, alternative_service_info_vector);
772 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once. 777 // ExpectScheduleUpdatePrefsOnNetworkSequence() should be called only once.
773 http_server_props_manager_->SetAlternativeServices( 778 http_server_props_manager_->SetAlternativeServices(
774 spdy_server_mail, alternative_service_info_vector); 779 spdy_server_mail, alternative_service_info_vector);
775 780
776 // Run the task. 781 // Run the task.
777 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 782 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
778 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 783 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
779 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 784 net_test_task_runner_->FastForwardUntilNoTasksRemain();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 822
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_->SetHttp2AlternativeService(
828 spdy_server_mail, alternative_service, one_day_from_now_); 833 spdy_server_mail, alternative_service, one_day_from_now_);
829 834
830 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken( 835 EXPECT_FALSE(http_server_props_manager_->IsAlternativeServiceBroken(
831 alternative_service)); 836 alternative_service));
832 EXPECT_FALSE( 837 EXPECT_FALSE(
833 http_server_props_manager_->WasAlternativeServiceRecentlyBroken( 838 http_server_props_manager_->WasAlternativeServiceRecentlyBroken(
834 alternative_service)); 839 alternative_service));
835 840
836 ExpectScheduleUpdatePrefsOnNetworkSequence(); 841 ExpectScheduleUpdatePrefsOnNetworkSequence();
837 http_server_props_manager_->MarkAlternativeServiceBroken( 842 http_server_props_manager_->MarkAlternativeServiceBroken(
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 const IPAddress actual_address(127, 0, 0, 1); 995 const IPAddress actual_address(127, 0, 0, 1);
991 const QuicServerId mail_quic_server_id("mail.google.com", 80); 996 const QuicServerId mail_quic_server_id("mail.google.com", 80);
992 const std::string quic_server_info1("quic_server_info1"); 997 const std::string quic_server_info1("quic_server_info1");
993 998
994 { 999 {
995 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 1000 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
996 1001
997 http_server_props_manager_->SetSupportsSpdy(spdy_server, true); 1002 http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
998 AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", 1003 AlternativeService alternative_service(kProtoHTTP2, "mail.google.com",
999 1234); 1004 1234);
1000 http_server_props_manager_->SetAlternativeService( 1005 http_server_props_manager_->SetHttp2AlternativeService(
1001 spdy_server, alternative_service, one_day_from_now_); 1006 spdy_server, alternative_service, one_day_from_now_);
1002 http_server_props_manager_->SetSupportsQuic(true, actual_address); 1007 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1003 ServerNetworkStats stats; 1008 ServerNetworkStats stats;
1004 stats.srtt = base::TimeDelta::FromMicroseconds(10); 1009 stats.srtt = base::TimeDelta::FromMicroseconds(10);
1005 http_server_props_manager_->SetServerNetworkStats(spdy_server, stats); 1010 http_server_props_manager_->SetServerNetworkStats(spdy_server, stats);
1006 1011
1007 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id, 1012 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1008 quic_server_info1); 1013 quic_server_info1);
1009 } 1014 }
1010 1015
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 1167
1163 const url::SchemeHostPort server_www("https", "www.google.com", 80); 1168 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1164 const url::SchemeHostPort server_mail("https", "mail.google.com", 80); 1169 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1165 1170
1166 // #1 & #2: Set alternate protocol. 1171 // #1 & #2: Set alternate protocol.
1167 AlternativeServiceInfoVector alternative_service_info_vector; 1172 AlternativeServiceInfoVector alternative_service_info_vector;
1168 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443); 1173 AlternativeService www_alternative_service1(kProtoHTTP2, "", 443);
1169 base::Time expiration1; 1174 base::Time expiration1;
1170 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1)); 1175 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1171 alternative_service_info_vector.push_back( 1176 alternative_service_info_vector.push_back(
1172 AlternativeServiceInfo(www_alternative_service1, expiration1)); 1177 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1178 www_alternative_service1, expiration1));
1179
1173 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com", 1180 AlternativeService www_alternative_service2(kProtoHTTP2, "www.google.com",
1174 1234); 1181 1234);
1175 base::Time expiration2; 1182 base::Time expiration2;
1176 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));
1177 alternative_service_info_vector.push_back( 1184 alternative_service_info_vector.push_back(
1178 AlternativeServiceInfo(www_alternative_service2, expiration2)); 1185 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1186 www_alternative_service2, expiration2));
1179 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( 1187 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1180 server_www, alternative_service_info_vector)); 1188 server_www, alternative_service_info_vector));
1181 1189
1182 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com", 1190 AlternativeService mail_alternative_service(kProtoHTTP2, "foo.google.com",
1183 444); 1191 444);
1184 base::Time expiration3 = base::Time::Max(); 1192 base::Time expiration3 = base::Time::Max();
1185 ASSERT_TRUE(http_server_props_manager_->SetAlternativeService( 1193 ASSERT_TRUE(http_server_props_manager_->SetHttp2AlternativeService(
1186 server_mail, mail_alternative_service, expiration3)); 1194 server_mail, mail_alternative_service, expiration3));
1187 1195
1188 // #3: Set ServerNetworkStats. 1196 // #3: Set ServerNetworkStats.
1189 ServerNetworkStats stats; 1197 ServerNetworkStats stats;
1190 stats.srtt = base::TimeDelta::FromInternalValue(42); 1198 stats.srtt = base::TimeDelta::FromInternalValue(42);
1191 http_server_props_manager_->SetServerNetworkStats(server_mail, stats); 1199 http_server_props_manager_->SetServerNetworkStats(server_mail, stats);
1192 1200
1193 // #4: Set quic_server_info string. 1201 // #4: Set quic_server_info string.
1194 QuicServerId mail_quic_server_id("mail.google.com", 80); 1202 QuicServerId mail_quic_server_id("mail.google.com", 80);
1195 std::string quic_server_info1("quic_server_info1"); 1203 std::string quic_server_info1("quic_server_info1");
(...skipping 11 matching lines...) Expand all
1207 net_test_task_runner_->FastForwardUntilNoTasksRemain(); 1215 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1208 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 1216 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1209 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 1217 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1210 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1218 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1211 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1219 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1212 1220
1213 // Verify preferences. 1221 // Verify preferences.
1214 const char expected_json[] = 1222 const char expected_json[] =
1215 "{\"quic_servers\":{\"https://" 1223 "{\"quic_servers\":{\"https://"
1216 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}}," 1224 "mail.google.com:80\":{\"server_info\":\"quic_server_info1\"}},"
1217 "\"servers\":[" 1225 "\"servers\":[{\"https://www.google.com:80\":{"
1218 "{\"https://www.google.com:80\":{" 1226 "\"alternative_service\":[{\"advertised_versions\":[],\"expiration\":"
1219 "\"alternative_service\":[{\"expiration\":\"13756212000000000\"," 1227 "\"13756212000000000\",\"port\":443,\"protocol_str\":\"h2\"},"
1220 "\"port\":443,\"protocol_str\":\"h2\"}," 1228 "{\"advertised_versions\":[],\"expiration\":\"13758804000000000\","
1221 "{\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\"," 1229 "\"host\":\"www.google.com\",\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1222 "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1223 "{\"https://mail.google.com:80\":{\"alternative_service\":[{" 1230 "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
1224 "\"expiration\":\"9223372036854775807\",\"host\":\"foo.google.com\"," 1231 "\"advertised_versions\":[],\"expiration\":\"9223372036854775807\","
1225 "\"port\":444,\"protocol_str\":\"h2\"}]," 1232 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"h2\"}],"
1226 "\"network_stats\":{\"srtt\":42}}}" 1233 "\"network_stats\":{\"srtt\":42}}}],"
1227 "],"
1228 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true}," 1234 "\"supports_quic\":{\"address\":\"127.0.0.1\",\"used_quic\":true},"
1229 "\"version\":5}"; 1235 "\"version\":5}";
1230 1236
1231 const base::Value* http_server_properties = 1237 const base::Value* http_server_properties =
1232 &pref_delegate_->GetServerProperties(); 1238 &pref_delegate_->GetServerProperties();
1233 std::string preferences_json; 1239 std::string preferences_json;
1234 EXPECT_TRUE( 1240 EXPECT_TRUE(
1235 base::JSONWriter::Write(*http_server_properties, &preferences_json)); 1241 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1236 EXPECT_EQ(expected_json, preferences_json); 1242 EXPECT_EQ(expected_json, preferences_json);
1237 } 1243 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 { 1356 {
1351 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_); 1357 TestMockTimeTaskRunner::ScopedContext scoped_context(net_test_task_runner_);
1352 1358
1353 AlternativeServiceInfoVector alternative_service_info_vector; 1359 AlternativeServiceInfoVector alternative_service_info_vector;
1354 1360
1355 const AlternativeService broken_alternative_service( 1361 const AlternativeService broken_alternative_service(
1356 kProtoHTTP2, "broken.example.com", 443); 1362 kProtoHTTP2, "broken.example.com", 443);
1357 const base::Time time_one_day_later = 1363 const base::Time time_one_day_later =
1358 base::Time::Now() + base::TimeDelta::FromDays(1); 1364 base::Time::Now() + base::TimeDelta::FromDays(1);
1359 alternative_service_info_vector.push_back( 1365 alternative_service_info_vector.push_back(
1360 AlternativeServiceInfo(broken_alternative_service, time_one_day_later)); 1366 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1367 broken_alternative_service, time_one_day_later));
1361 // #1: MarkAlternativeServiceBroken(). 1368 // #1: MarkAlternativeServiceBroken().
1362 http_server_props_manager_->MarkAlternativeServiceBroken( 1369 http_server_props_manager_->MarkAlternativeServiceBroken(
1363 broken_alternative_service); 1370 broken_alternative_service);
1364 1371
1365 const AlternativeService expired_alternative_service( 1372 const AlternativeService expired_alternative_service(
1366 kProtoHTTP2, "expired.example.com", 443); 1373 kProtoHTTP2, "expired.example.com", 443);
1367 const base::Time time_one_day_ago = 1374 const base::Time time_one_day_ago =
1368 base::Time::Now() - base::TimeDelta::FromDays(1); 1375 base::Time::Now() - base::TimeDelta::FromDays(1);
1369 alternative_service_info_vector.push_back( 1376 alternative_service_info_vector.push_back(
1370 AlternativeServiceInfo(expired_alternative_service, time_one_day_ago)); 1377 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1378 expired_alternative_service, time_one_day_ago));
1371 1379
1372 const AlternativeService valid_alternative_service( 1380 const AlternativeService valid_alternative_service(
1373 kProtoHTTP2, "valid.example.com", 443); 1381 kProtoHTTP2, "valid.example.com", 443);
1374 alternative_service_info_vector.push_back( 1382 alternative_service_info_vector.push_back(
1375 AlternativeServiceInfo(valid_alternative_service, time_one_day_later)); 1383 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1384 valid_alternative_service, time_one_day_later));
1376 1385
1377 const url::SchemeHostPort server("https", "www.example.com", 443); 1386 const url::SchemeHostPort server("https", "www.example.com", 443);
1378 // #2: SetAlternativeService(). 1387 // #2: SetAlternativeServices().
1379 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices( 1388 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1380 server, alternative_service_info_vector)); 1389 server, alternative_service_info_vector));
1381 } 1390 }
1382 1391
1383 // Update cache. 1392 // Update cache.
1384 ExpectPrefsUpdate(1); 1393 ExpectPrefsUpdate(1);
1385 1394
1386 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); 1395 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1387 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1396 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1388 1397
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); 1572 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1564 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); 1573 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1565 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1574 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1566 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1575 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1567 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); 1576 Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
1568 http_server_props_manager_.reset(); 1577 http_server_props_manager_.reset();
1569 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); 1578 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1570 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); 1579 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1571 } 1580 }
1572 1581
1582 TEST_P(HttpServerPropertiesManagerTest, PersistAdvertisedVersionsToPref) {
1583 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(5);
1584
1585 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1586 const url::SchemeHostPort server_mail("https", "mail.google.com", 80);
1587
1588 // #1 & #2: Set alternate protocol.
1589 AlternativeServiceInfoVector alternative_service_info_vector;
1590 // Quic alternative service set with two advertised QUIC versions.
1591 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1592 base::Time expiration1;
1593 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1594 QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
1595 alternative_service_info_vector.push_back(
1596 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1597 quic_alternative_service1, expiration1, advertised_versions));
1598 // HTTP/2 alternative service should not set any advertised version.
1599 AlternativeService h2_alternative_service(kProtoHTTP2, "www.google.com",
1600 1234);
1601 base::Time expiration2;
1602 ASSERT_TRUE(base::Time::FromUTCString("2036-12-31 10:00:00", &expiration2));
1603 alternative_service_info_vector.push_back(
1604 AlternativeServiceInfo::CreateHttp2AlternativeServiceInfo(
1605 h2_alternative_service, expiration2));
1606 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1607 server_www, alternative_service_info_vector));
1608
1609 // Set another QUIC alternative service with a single advertised QUIC version.
1610 AlternativeService mail_alternative_service(kProtoQUIC, "foo.google.com",
1611 444);
1612 base::Time expiration3 = base::Time::Max();
1613 ASSERT_TRUE(http_server_props_manager_->SetQuicAlternativeService(
1614 server_mail, mail_alternative_service, expiration3,
1615 advertised_versions_));
1616 // #3: Set ServerNetworkStats.
1617 ServerNetworkStats stats;
1618 stats.srtt = base::TimeDelta::FromInternalValue(42);
1619 http_server_props_manager_->SetServerNetworkStats(server_mail, stats);
1620
1621 // #4: Set quic_server_info string.
1622 QuicServerId mail_quic_server_id("mail.google.com", 80);
1623 std::string quic_server_info1("quic_server_info1");
1624 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1625 quic_server_info1);
1626
1627 // #5: Set SupportsQuic.
1628 IPAddress actual_address(127, 0, 0, 1);
1629 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1630
1631 // Update Prefs.
1632 ExpectPrefsUpdate(1);
1633 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1634 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1635 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1636 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1637 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1638 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1639 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1640
1641 // Verify preferences with correct advertised version field.
1642 const char expected_json[] =
1643 "{\"quic_servers\":{\"https://mail.google.com:80\":{"
1644 "\"server_info\":\"quic_server_info1\"}},\"servers\":["
1645 "{\"https://www.google.com:80\":{\"alternative_service\":[{"
1646 "\"advertised_versions\":[35,37],\"expiration\":\"13756212000000000\","
1647 "\"port\":443,\"protocol_str\":\"quic\"},{\"advertised_versions\":[],"
1648 "\"expiration\":\"13758804000000000\",\"host\":\"www.google.com\","
1649 "\"port\":1234,\"protocol_str\":\"h2\"}]}},"
1650 "{\"https://mail.google.com:80\":{\"alternative_service\":[{"
1651 "\"advertised_versions\":[37],\"expiration\":\"9223372036854775807\","
1652 "\"host\":\"foo.google.com\",\"port\":444,\"protocol_str\":\"quic\"}],"
1653 "\"network_stats\":{\"srtt\":42}}}],\"supports_quic\":{"
1654 "\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1655
1656 const base::Value* http_server_properties =
1657 &pref_delegate_->GetServerProperties();
1658 std::string preferences_json;
1659 EXPECT_TRUE(
1660 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1661 EXPECT_EQ(expected_json, preferences_json);
1662 }
1663
1664 TEST_P(HttpServerPropertiesManagerTest, ReadAdvertisedVersionsFromPref) {
1665 std::unique_ptr<base::Value> server_value = base::JSONReader::Read(
1666 "{\"alternative_service\":["
1667 "{\"port\":443,\"protocol_str\":\"quic\"},"
1668 "{\"port\":123,\"protocol_str\":\"quic\","
1669 "\"expiration\":\"9223372036854775807\","
1670 "\"advertised_versions\":[37,35]}]}");
1671 ASSERT_TRUE(server_value);
1672 base::DictionaryValue* server_dict;
1673 ASSERT_TRUE(server_value->GetAsDictionary(&server_dict));
1674
1675 const url::SchemeHostPort server("https", "example.com", 443);
1676 AlternativeServiceMap alternative_service_map(/*max_size=*/5);
1677 EXPECT_TRUE(http_server_props_manager_->AddToAlternativeServiceMap(
1678 server, *server_dict, &alternative_service_map));
1679
1680 AlternativeServiceMap::iterator it = alternative_service_map.Get(server);
1681 ASSERT_NE(alternative_service_map.end(), it);
1682 AlternativeServiceInfoVector alternative_service_info_vector = it->second;
1683 ASSERT_EQ(2u, alternative_service_info_vector.size());
1684
1685 // Verify the first alternative service with no advertised version listed.
1686 EXPECT_EQ(kProtoQUIC,
1687 alternative_service_info_vector[0].alternative_service().protocol);
1688 EXPECT_EQ("", alternative_service_info_vector[0].alternative_service().host);
1689 EXPECT_EQ(443, alternative_service_info_vector[0].alternative_service().port);
1690 // Expiration defaults to one day from now, testing with tolerance.
1691 const base::Time now = base::Time::Now();
1692 const base::Time expiration = alternative_service_info_vector[0].expiration();
1693 EXPECT_LE(now + base::TimeDelta::FromHours(23), expiration);
1694 EXPECT_GE(now + base::TimeDelta::FromDays(1), expiration);
1695 EXPECT_TRUE(alternative_service_info_vector[0].advertised_versions().empty());
1696
1697 // Verify the second alterntaive service with two advertised versions.
1698 EXPECT_EQ(kProtoQUIC,
1699 alternative_service_info_vector[1].alternative_service().protocol);
1700 EXPECT_EQ("", alternative_service_info_vector[1].alternative_service().host);
1701 EXPECT_EQ(123, alternative_service_info_vector[1].alternative_service().port);
1702 EXPECT_EQ(base::Time::Max(), alternative_service_info_vector[1].expiration());
1703 // Verify advertised versions.
1704 const QuicVersionVector loaded_advertised_versions =
1705 alternative_service_info_vector[1].advertised_versions();
1706 EXPECT_EQ(2u, loaded_advertised_versions.size());
1707 EXPECT_EQ(QUIC_VERSION_35, loaded_advertised_versions[0]);
1708 EXPECT_EQ(QUIC_VERSION_37, loaded_advertised_versions[1]);
1709 }
1710
1711 TEST_P(HttpServerPropertiesManagerTest,
1712 UpdatePrefWhenAdvertisedVersionsChange) {
1713 ExpectScheduleUpdatePrefsOnNetworkSequenceRepeatedly(4);
1714
1715 const url::SchemeHostPort server_www("https", "www.google.com", 80);
1716
1717 // #1: Set alternate protocol.
1718 AlternativeServiceInfoVector alternative_service_info_vector;
1719 // Quic alternative service set with a single QUIC version: QUIC_VERSION_37.
1720 AlternativeService quic_alternative_service1(kProtoQUIC, "", 443);
1721 base::Time expiration1;
1722 ASSERT_TRUE(base::Time::FromUTCString("2036-12-01 10:00:00", &expiration1));
1723 alternative_service_info_vector.push_back(
1724 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1725 quic_alternative_service1, expiration1, advertised_versions_));
1726 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1727 server_www, alternative_service_info_vector));
1728
1729 // Set quic_server_info string.
1730 QuicServerId mail_quic_server_id("mail.google.com", 80);
1731 std::string quic_server_info1("quic_server_info1");
1732 http_server_props_manager_->SetQuicServerInfo(mail_quic_server_id,
1733 quic_server_info1);
1734
1735 // Set SupportsQuic.
1736 IPAddress actual_address(127, 0, 0, 1);
1737 http_server_props_manager_->SetSupportsQuic(true, actual_address);
1738
1739 // Update Prefs.
1740 ExpectPrefsUpdate(1);
1741 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1742 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1743 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1744 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1745 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1746 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1747 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1748
1749 // Verify preferences with correct advertised version field.
1750 const char expected_json[] =
1751 "{\"quic_servers\":{\"https://mail.google.com:80\":"
1752 "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
1753 "{\"https://www.google.com:80\":"
1754 "{\"alternative_service\":[{\"advertised_versions\":[37],"
1755 "\"expiration\":\"13756212000000000\",\"port\":443,"
1756 "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
1757 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1758
1759 const base::Value* http_server_properties =
1760 &pref_delegate_->GetServerProperties();
1761 std::string preferences_json;
1762 EXPECT_TRUE(
1763 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1764 EXPECT_EQ(expected_json, preferences_json);
1765
1766 // #2: Set AlternativeService with different advertised_versions for the same
1767 // AlternativeService.
1768 AlternativeServiceInfoVector alternative_service_info_vector_2;
1769 // Quic alternative service set with two advertised QUIC versions.
1770 QuicVersionVector advertised_versions = {QUIC_VERSION_37, QUIC_VERSION_35};
1771 alternative_service_info_vector_2.push_back(
1772 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1773 quic_alternative_service1, expiration1, advertised_versions));
1774 ASSERT_TRUE(http_server_props_manager_->SetAlternativeServices(
1775 server_www, alternative_service_info_vector_2));
1776
1777 // Update Prefs.
1778 ExpectPrefsUpdate(1);
1779 EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
1780 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1781 net_test_task_runner_->FastForwardUntilNoTasksRemain();
1782 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
1783 pref_test_task_runner_->FastForwardUntilNoTasksRemain();
1784 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1785 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1786
1787 // Verify preferences updated with new advertised versions.
1788 const char expected_json_updated[] =
1789 "{\"quic_servers\":{\"https://mail.google.com:80\":"
1790 "{\"server_info\":\"quic_server_info1\"}},\"servers\":["
1791 "{\"https://www.google.com:80\":"
1792 "{\"alternative_service\":[{\"advertised_versions\":[35,37],"
1793 "\"expiration\":\"13756212000000000\",\"port\":443,"
1794 "\"protocol_str\":\"quic\"}]}}],\"supports_quic\":"
1795 "{\"address\":\"127.0.0.1\",\"used_quic\":true},\"version\":5}";
1796 EXPECT_TRUE(
1797 base::JSONWriter::Write(*http_server_properties, &preferences_json));
1798 EXPECT_EQ(expected_json_updated, preferences_json);
1799
1800 // #3: Set AlternativeService with same advertised_versions.
1801 AlternativeServiceInfoVector alternative_service_info_vector_3;
1802 // A same set of QUIC versions but listed in a different order.
1803 QuicVersionVector advertised_versions_2 = {QUIC_VERSION_35, QUIC_VERSION_37};
1804 alternative_service_info_vector_3.push_back(
1805 AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
1806 quic_alternative_service1, expiration1, advertised_versions_2));
1807 ASSERT_FALSE(http_server_props_manager_->SetAlternativeServices(
1808 server_www, alternative_service_info_vector_3));
1809
1810 // No Prefs update.
1811 EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
1812 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
1813 }
1814
1573 } // namespace net 1815 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698