| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |