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