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/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 }; | 77 }; |
78 | 78 |
79 class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { | 79 class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager { |
80 public: | 80 public: |
81 TestingHttpServerPropertiesManager( | 81 TestingHttpServerPropertiesManager( |
82 HttpServerPropertiesManager::PrefDelegate* pref_delegate, | 82 HttpServerPropertiesManager::PrefDelegate* pref_delegate, |
83 scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner, | 83 scoped_refptr<base::SingleThreadTaskRunner> pref_task_runner, |
84 scoped_refptr<base::SingleThreadTaskRunner> net_task_runner) | 84 scoped_refptr<base::SingleThreadTaskRunner> net_task_runner) |
85 : HttpServerPropertiesManager(pref_delegate, | 85 : HttpServerPropertiesManager(pref_delegate, |
86 pref_task_runner, | 86 pref_task_runner, |
87 net_task_runner) { | 87 net_task_runner), |
| 88 pref_update_delay_(base::TimeDelta()) { |
88 InitializeOnNetworkThread(); | 89 InitializeOnNetworkThread(); |
89 } | 90 } |
90 | 91 |
91 ~TestingHttpServerPropertiesManager() override {} | 92 ~TestingHttpServerPropertiesManager() override {} |
92 | 93 |
93 // Make these methods public for testing. | 94 // Make these methods public for testing. |
94 using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread; | 95 using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread; |
95 | 96 |
96 // Post tasks without a delay during tests. | 97 // Post tasks without a delay during tests. |
97 void StartPrefsUpdateTimerOnNetworkThread(base::TimeDelta delay) override { | 98 void StartPrefsUpdateTimerOnNetworkThread(base::TimeDelta delay) override { |
98 HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread( | 99 HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread( |
99 base::TimeDelta()); | 100 pref_update_delay_); |
100 } | 101 } |
101 | 102 |
102 void UpdateCacheFromPrefsOnUIConcrete() { | 103 void UpdateCacheFromPrefsOnUIConcrete() { |
103 HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread(); | 104 HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread(); |
104 } | 105 } |
105 | 106 |
106 // Post tasks without a delay during tests. | 107 // Post tasks without a delay during tests. |
107 void StartCacheUpdateTimerOnPrefThread(base::TimeDelta delay) override { | 108 void StartCacheUpdateTimerOnPrefThread(base::TimeDelta delay) override { |
108 HttpServerPropertiesManager::StartCacheUpdateTimerOnPrefThread( | 109 HttpServerPropertiesManager::StartCacheUpdateTimerOnPrefThread( |
109 base::TimeDelta()); | 110 base::TimeDelta()); |
110 } | 111 } |
111 | 112 |
112 void UpdatePrefsFromCacheOnNetworkThreadConcrete( | 113 void UpdatePrefsFromCacheOnNetworkThreadConcrete( |
113 const base::Closure& callback) { | 114 const base::Closure& callback) { |
114 HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(callback); | 115 HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(callback); |
115 } | 116 } |
116 | 117 |
117 void ScheduleUpdatePrefsOnNetworkThreadConcrete(Location location) { | 118 void ScheduleUpdatePrefsOnNetworkThreadConcrete(Location location) { |
118 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread(location); | 119 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread(location); |
119 } | 120 } |
120 | 121 |
121 void ScheduleUpdatePrefsOnNetworkThread() { | 122 void ScheduleUpdatePrefsOnNetworkThread() { |
122 // Picked a random Location as caller. | 123 // Picked a random Location as caller. |
123 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread( | 124 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread( |
124 DETECTED_CORRUPTED_PREFS); | 125 DETECTED_CORRUPTED_PREFS); |
125 } | 126 } |
126 | 127 |
| 128 void set_pref_update_delay(base::TimeDelta delay) { |
| 129 pref_update_delay_ = delay; |
| 130 } |
127 MOCK_METHOD0(UpdateCacheFromPrefsOnPrefThread, void()); | 131 MOCK_METHOD0(UpdateCacheFromPrefsOnPrefThread, void()); |
128 MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkThread, void(const base::Closure&)); | 132 MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkThread, void(const base::Closure&)); |
129 MOCK_METHOD1(ScheduleUpdatePrefsOnNetworkThread, void(Location location)); | 133 MOCK_METHOD1(ScheduleUpdatePrefsOnNetworkThread, void(Location location)); |
130 MOCK_METHOD6(UpdateCacheFromPrefsOnNetworkThread, | 134 MOCK_METHOD6(UpdateCacheFromPrefsOnNetworkThread, |
131 void(std::vector<std::string>* spdy_servers, | 135 void(std::vector<std::string>* spdy_servers, |
132 AlternativeServiceMap* alternative_service_map, | 136 AlternativeServiceMap* alternative_service_map, |
133 IPAddress* last_quic_address, | 137 IPAddress* last_quic_address, |
134 ServerNetworkStatsMap* server_network_stats_map, | 138 ServerNetworkStatsMap* server_network_stats_map, |
135 QuicServerInfoMap* quic_server_info_map, | 139 QuicServerInfoMap* quic_server_info_map, |
136 bool detected_corrupted_prefs)); | 140 bool detected_corrupted_prefs)); |
137 MOCK_METHOD6(UpdatePrefsOnPrefThread, | 141 MOCK_METHOD6(UpdatePrefsOnPrefThread, |
138 void(base::ListValue* spdy_server_list, | 142 void(base::ListValue* spdy_server_list, |
139 AlternativeServiceMap* alternative_service_map, | 143 AlternativeServiceMap* alternative_service_map, |
140 IPAddress* last_quic_address, | 144 IPAddress* last_quic_address, |
141 ServerNetworkStatsMap* server_network_stats_map, | 145 ServerNetworkStatsMap* server_network_stats_map, |
142 QuicServerInfoMap* quic_server_info_map, | 146 QuicServerInfoMap* quic_server_info_map, |
143 const base::Closure& completion)); | 147 const base::Closure& completion)); |
144 | 148 |
145 private: | 149 private: |
| 150 // Time delays used in test for posting tasks. Default to zero. |
| 151 base::TimeDelta pref_update_delay_; |
146 DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager); | 152 DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager); |
147 }; | 153 }; |
148 | 154 |
149 } // namespace | 155 } // namespace |
150 | 156 |
151 // 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 |
152 // to version 4, delete the following code. | 158 // to version 4, delete the following code. |
153 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; | 159 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; |
154 | 160 |
155 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { | 161 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 net_test_task_runner_->FastForwardUntilNoTasksRemain(); | 658 net_test_task_runner_->FastForwardUntilNoTasksRemain(); |
653 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); | 659 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
654 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | 660 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
655 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 661 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
656 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 662 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
657 | 663 |
658 EXPECT_TRUE(http_server_props_manager_->SupportsRequestPriority(spdy_server)); | 664 EXPECT_TRUE(http_server_props_manager_->SupportsRequestPriority(spdy_server)); |
659 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); | 665 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
660 } | 666 } |
661 | 667 |
| 668 // Regression test for crbug.com/670519. Test that there is only one pref update |
| 669 // scheduled if multiple updates happen in a given time period. Subsequent pref |
| 670 // update could also be scheduled once the previous scheduled update is |
| 671 // completed. |
| 672 TEST_P(HttpServerPropertiesManagerTest, |
| 673 SinglePrefUpdateForTwoSpdyServerCacheChangese) { |
| 674 http_server_props_manager_->set_pref_update_delay( |
| 675 base::TimeDelta::FromMilliseconds(60)); |
| 676 ExpectPrefsUpdateRepeatedly(); |
| 677 ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(); |
| 678 |
| 679 // Post an update task to the network thread. SetSupportsSpdy calls |
| 680 // ScheduleUpdatePrefsOnNetworkThread with a delay of 60ms. |
| 681 url::SchemeHostPort spdy_server("https", "mail.google.com", 443); |
| 682 EXPECT_FALSE( |
| 683 http_server_props_manager_->SupportsRequestPriority(spdy_server)); |
| 684 http_server_props_manager_->SetSupportsSpdy(spdy_server, true); |
| 685 // The pref update task should be scheduled to network thread. |
| 686 EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
| 687 |
| 688 // Move forward the task runner with 20ms. |
| 689 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); |
| 690 |
| 691 // Set another spdy server to trigger another call to |
| 692 // ScheduleUpdatePrefsOnNetworkThread. There should be no new update posted to |
| 693 // the network thread. |
| 694 url::SchemeHostPort spdy_server2("https", "drive.google.com", 443); |
| 695 http_server_props_manager_->SetSupportsSpdy(spdy_server2, true); |
| 696 EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
| 697 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 698 |
| 699 // Move forward another 40ms. The pref update should be executed. |
| 700 net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(40)); |
| 701 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
| 702 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
| 703 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
| 704 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
| 705 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 706 |
| 707 EXPECT_TRUE(http_server_props_manager_->SupportsRequestPriority(spdy_server)); |
| 708 EXPECT_TRUE( |
| 709 http_server_props_manager_->SupportsRequestPriority(spdy_server2)); |
| 710 // Set the third spdy server to trigger one more call to |
| 711 // ScheduleUpdatePrefsOnNetworkThread. A new update task should be posted to |
| 712 // network thread now since the previous one is completed. |
| 713 url::SchemeHostPort spdy_server3("https", "maps.google.com", 443); |
| 714 http_server_props_manager_->SetSupportsSpdy(spdy_server3, true); |
| 715 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 716 EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount()); |
| 717 |
| 718 // Run the task. |
| 719 EXPECT_TRUE(net_test_task_runner_->HasPendingTask()); |
| 720 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 721 net_test_task_runner_->FastForwardUntilNoTasksRemain(); |
| 722 EXPECT_TRUE(pref_test_task_runner_->HasPendingTask()); |
| 723 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
| 724 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
| 725 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 726 |
| 727 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
| 728 } |
| 729 |
662 TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServices) { | 730 TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServices) { |
663 ExpectPrefsUpdate(); | 731 ExpectPrefsUpdate(); |
664 ExpectScheduleUpdatePrefsOnNetworkThread(); | 732 ExpectScheduleUpdatePrefsOnNetworkThread(); |
665 | 733 |
666 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); | 734 url::SchemeHostPort spdy_server_mail("http", "mail.google.com", 80); |
667 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); | 735 EXPECT_FALSE(HasAlternativeService(spdy_server_mail)); |
668 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", | 736 const AlternativeService alternative_service(kProtoHTTP2, "mail.google.com", |
669 443); | 737 443); |
670 http_server_props_manager_->SetAlternativeService( | 738 http_server_props_manager_->SetAlternativeService( |
671 spdy_server_mail, alternative_service, one_day_from_now_); | 739 spdy_server_mail, alternative_service, one_day_from_now_); |
(...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1410 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | 1478 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
1411 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1479 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
1412 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1480 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1413 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); | 1481 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
1414 http_server_props_manager_.reset(); | 1482 http_server_props_manager_.reset(); |
1415 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1483 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
1416 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1484 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
1417 } | 1485 } |
1418 | 1486 |
1419 } // namespace net | 1487 } // namespace net |
OLD | NEW |