Chromium Code Reviews| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 pref_update_delay_(base::TimeDelta()), |
| 89 cache_update_delay_(base::TimeDelta()) { | |
| 89 InitializeOnNetworkThread(); | 90 InitializeOnNetworkThread(); |
| 90 } | 91 } |
| 91 | 92 |
| 92 ~TestingHttpServerPropertiesManager() override {} | 93 ~TestingHttpServerPropertiesManager() override {} |
| 93 | 94 |
| 94 // Make these methods public for testing. | 95 // Make these methods public for testing. |
| 95 using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread; | 96 using HttpServerPropertiesManager::ScheduleUpdateCacheOnPrefThread; |
| 96 | 97 |
| 97 // Post tasks without a delay during tests. | 98 // Post tasks without a delay during tests. |
| 98 void StartPrefsUpdateTimerOnNetworkThread(base::TimeDelta delay) override { | 99 void StartPrefsUpdateTimerOnNetworkThread(base::TimeDelta delay) override { |
| 99 HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread( | 100 HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread( |
| 100 pref_update_delay_); | 101 pref_update_delay_); |
| 101 } | 102 } |
| 102 | 103 |
| 103 void UpdateCacheFromPrefsOnUIConcrete() { | 104 void UpdateCacheFromPrefsOnUIConcrete() { |
| 104 HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread(); | 105 HttpServerPropertiesManager::UpdateCacheFromPrefsOnPrefThread(); |
| 105 } | 106 } |
| 106 | 107 |
| 107 // Post tasks without a delay during tests. | 108 // Post tasks without a delay during tests. |
| 108 void StartCacheUpdateTimerOnPrefThread(base::TimeDelta delay) override { | 109 void StartCacheUpdateTimerOnPrefThread(base::TimeDelta delay) override { |
| 109 HttpServerPropertiesManager::StartCacheUpdateTimerOnPrefThread( | 110 HttpServerPropertiesManager::StartCacheUpdateTimerOnPrefThread( |
| 110 base::TimeDelta()); | 111 cache_update_delay_); |
| 111 } | 112 } |
| 112 | 113 |
| 113 void UpdatePrefsFromCacheOnNetworkThreadConcrete( | 114 void UpdatePrefsFromCacheOnNetworkThreadConcrete( |
| 114 const base::Closure& callback) { | 115 const base::Closure& callback) { |
| 115 HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(callback); | 116 HttpServerPropertiesManager::UpdatePrefsFromCacheOnNetworkThread(callback); |
| 116 } | 117 } |
| 117 | 118 |
| 118 void ScheduleUpdatePrefsOnNetworkThreadConcrete(Location location) { | 119 void ScheduleUpdatePrefsOnNetworkThreadConcrete(Location location) { |
| 119 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread(location); | 120 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread(location); |
| 120 } | 121 } |
| 121 | 122 |
| 122 void ScheduleUpdatePrefsOnNetworkThread() { | 123 void ScheduleUpdatePrefsOnNetworkThread() { |
| 123 // Picked a random Location as caller. | 124 // Picked a random Location as caller. |
| 124 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread( | 125 HttpServerPropertiesManager::ScheduleUpdatePrefsOnNetworkThread( |
| 125 DETECTED_CORRUPTED_PREFS); | 126 DETECTED_CORRUPTED_PREFS); |
| 126 } | 127 } |
| 127 | 128 |
| 128 void set_pref_update_delay(base::TimeDelta delay) { | 129 void set_pref_update_delay(base::TimeDelta delay) { |
| 129 pref_update_delay_ = delay; | 130 pref_update_delay_ = delay; |
| 130 } | 131 } |
| 132 void set_cache_update_delay(base::TimeDelta delay) { | |
| 133 cache_update_delay_ = delay; | |
| 134 } | |
| 131 MOCK_METHOD0(UpdateCacheFromPrefsOnPrefThread, void()); | 135 MOCK_METHOD0(UpdateCacheFromPrefsOnPrefThread, void()); |
| 132 MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkThread, void(const base::Closure&)); | 136 MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkThread, void(const base::Closure&)); |
| 133 MOCK_METHOD1(ScheduleUpdatePrefsOnNetworkThread, void(Location location)); | 137 MOCK_METHOD1(ScheduleUpdatePrefsOnNetworkThread, void(Location location)); |
| 134 MOCK_METHOD6(UpdateCacheFromPrefsOnNetworkThread, | 138 MOCK_METHOD6(UpdateCacheFromPrefsOnNetworkThread, |
| 135 void(std::vector<std::string>* spdy_servers, | 139 void(std::vector<std::string>* spdy_servers, |
| 136 AlternativeServiceMap* alternative_service_map, | 140 AlternativeServiceMap* alternative_service_map, |
| 137 IPAddress* last_quic_address, | 141 IPAddress* last_quic_address, |
| 138 ServerNetworkStatsMap* server_network_stats_map, | 142 ServerNetworkStatsMap* server_network_stats_map, |
| 139 QuicServerInfoMap* quic_server_info_map, | 143 QuicServerInfoMap* quic_server_info_map, |
| 140 bool detected_corrupted_prefs)); | 144 bool detected_corrupted_prefs)); |
| 141 MOCK_METHOD6(UpdatePrefsOnPrefThread, | 145 MOCK_METHOD6(UpdatePrefsOnPrefThread, |
| 142 void(base::ListValue* spdy_server_list, | 146 void(base::ListValue* spdy_server_list, |
| 143 AlternativeServiceMap* alternative_service_map, | 147 AlternativeServiceMap* alternative_service_map, |
| 144 IPAddress* last_quic_address, | 148 IPAddress* last_quic_address, |
| 145 ServerNetworkStatsMap* server_network_stats_map, | 149 ServerNetworkStatsMap* server_network_stats_map, |
| 146 QuicServerInfoMap* quic_server_info_map, | 150 QuicServerInfoMap* quic_server_info_map, |
| 147 const base::Closure& completion)); | 151 const base::Closure& completion)); |
| 148 | 152 |
| 149 private: | 153 private: |
| 150 // Time delays used in test for posting tasks. Default to zero. | 154 // Time delays used in test for posting tasks. Default to zero. |
| 151 base::TimeDelta pref_update_delay_; | 155 base::TimeDelta pref_update_delay_; |
| 156 base::TimeDelta cache_update_delay_; | |
| 152 DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager); | 157 DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager); |
| 153 }; | 158 }; |
| 154 | 159 |
| 155 } // namespace | 160 } // namespace |
| 156 | 161 |
| 157 // TODO(rtenneti): After we stop supporting version 3 and everyone has migrated | 162 // TODO(rtenneti): After we stop supporting version 3 and everyone has migrated |
| 158 // to version 4, delete the following code. | 163 // to version 4, delete the following code. |
| 159 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; | 164 static const int kHttpServerPropertiesVersions[] = {3, 4, 5}; |
| 160 | 165 |
| 161 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { | 166 class HttpServerPropertiesManagerTest : public testing::TestWithParam<int> { |
| (...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1193 "\"version\":5}"; | 1198 "\"version\":5}"; |
| 1194 | 1199 |
| 1195 const base::Value* http_server_properties = | 1200 const base::Value* http_server_properties = |
| 1196 &pref_delegate_->GetServerProperties(); | 1201 &pref_delegate_->GetServerProperties(); |
| 1197 std::string preferences_json; | 1202 std::string preferences_json; |
| 1198 EXPECT_TRUE( | 1203 EXPECT_TRUE( |
| 1199 base::JSONWriter::Write(*http_server_properties, &preferences_json)); | 1204 base::JSONWriter::Write(*http_server_properties, &preferences_json)); |
| 1200 EXPECT_EQ(expected_json, preferences_json); | 1205 EXPECT_EQ(expected_json, preferences_json); |
| 1201 } | 1206 } |
| 1202 | 1207 |
| 1208 TEST_P(HttpServerPropertiesManagerTest, | |
| 1209 SingleCacheUpdateForMultipleUpdatesScheduled) { | |
| 1210 http_server_props_manager_->set_cache_update_delay( | |
| 1211 base::TimeDelta::FromMilliseconds(60)); | |
| 1212 | |
| 1213 // Update cache. | |
| 1214 ExpectCacheUpdate(); | |
|
xunjieli
2016/12/20 14:00:27
I guess you are doing a follow-up to make sure tha
Zhongyi Shi
2016/12/20 20:03:38
If you take a close look on the previous CL, we ch
xunjieli
2016/12/21 02:13:09
Acknowledged.
| |
| 1215 | |
| 1216 EXPECT_EQ(0u, pref_test_task_runner_->GetPendingTaskCount()); | |
| 1217 // Update cache. | |
| 1218 http_server_props_manager_->ScheduleUpdateCacheOnPrefThread(); | |
| 1219 EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount()); | |
| 1220 | |
| 1221 // Move forward the task runner 20ms. | |
| 1222 pref_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); | |
| 1223 // Schedule a new cache update within the time window should be a no-op. | |
| 1224 http_server_props_manager_->ScheduleUpdateCacheOnPrefThread(); | |
| 1225 EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount()); | |
| 1226 | |
| 1227 // Move forward the task runner 40ms, now the cache update should be | |
| 1228 // exectured. | |
| 1229 pref_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(40)); | |
| 1230 | |
| 1231 // Since this test has no pref corruption, there shouldn't be any pref update. | |
| 1232 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | |
| 1233 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | |
| 1234 | |
| 1235 // Schedule one more cache update. The task should be successfully scheduled | |
| 1236 // on pref task runner. | |
| 1237 ExpectCacheUpdate(); | |
| 1238 http_server_props_manager_->ScheduleUpdateCacheOnPrefThread(); | |
| 1239 EXPECT_EQ(1u, pref_test_task_runner_->GetPendingTaskCount()); | |
| 1240 | |
| 1241 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | |
| 1242 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | |
| 1243 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | |
| 1244 } | |
| 1245 | |
| 1203 TEST_P(HttpServerPropertiesManagerTest, AddToAlternativeServiceMap) { | 1246 TEST_P(HttpServerPropertiesManagerTest, AddToAlternativeServiceMap) { |
| 1204 std::unique_ptr<base::Value> server_value = base::JSONReader::Read( | 1247 std::unique_ptr<base::Value> server_value = base::JSONReader::Read( |
| 1205 "{\"alternative_service\":[{\"port\":443,\"protocol_str\":\"h2\"}," | 1248 "{\"alternative_service\":[{\"port\":443,\"protocol_str\":\"h2\"}," |
| 1206 "{\"port\":123,\"protocol_str\":\"quic\"," | 1249 "{\"port\":123,\"protocol_str\":\"quic\"," |
| 1207 "\"expiration\":\"9223372036854775807\"},{\"host\":\"example.org\"," | 1250 "\"expiration\":\"9223372036854775807\"},{\"host\":\"example.org\"," |
| 1208 "\"port\":1234,\"protocol_str\":\"h2\"," | 1251 "\"port\":1234,\"protocol_str\":\"h2\"," |
| 1209 "\"expiration\":\"13758804000000000\"}]}"); | 1252 "\"expiration\":\"13758804000000000\"}]}"); |
| 1210 ASSERT_TRUE(server_value); | 1253 ASSERT_TRUE(server_value); |
| 1211 base::DictionaryValue* server_dict; | 1254 base::DictionaryValue* server_dict; |
| 1212 ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); | 1255 ASSERT_TRUE(server_value->GetAsDictionary(&server_dict)); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1478 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); | 1521 pref_test_task_runner_->FastForwardUntilNoTasksRemain(); |
| 1479 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1522 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
| 1480 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1523 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 1481 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); | 1524 Mock::VerifyAndClearExpectations(http_server_props_manager_.get()); |
| 1482 http_server_props_manager_.reset(); | 1525 http_server_props_manager_.reset(); |
| 1483 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); | 1526 EXPECT_FALSE(net_test_task_runner_->HasPendingTask()); |
| 1484 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); | 1527 EXPECT_FALSE(pref_test_task_runner_->HasPendingTask()); |
| 1485 } | 1528 } |
| 1486 | 1529 |
| 1487 } // namespace net | 1530 } // namespace net |
| OLD | NEW |