OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |