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 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(); | |
|
xunjieli
2016/12/16 15:48:08
I know in the test you asserted pref_task_runner_
Zhongyi Shi
2016/12/17 00:59:43
Thanks a lot. Since the change your proposed will
| |
| 677 ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly(); | |
|
xunjieli
2016/12/16 15:48:08
Same here. Can we assert that this called exactly
Zhongyi Shi
2016/12/17 00:59:43
This is might be hard. Some of the tests are calli
| |
| 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 |