| Index: net/http/http_server_properties_manager_unittest.cc
|
| diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
|
| index 822d053a394a370938ca14214d249ffd5083dbd3..b2f11528bdb6a81c88f45554792ea29b474bff37 100644
|
| --- a/net/http/http_server_properties_manager_unittest.cc
|
| +++ b/net/http/http_server_properties_manager_unittest.cc
|
| @@ -84,7 +84,8 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager {
|
| scoped_refptr<base::SingleThreadTaskRunner> net_task_runner)
|
| : HttpServerPropertiesManager(pref_delegate,
|
| pref_task_runner,
|
| - net_task_runner) {
|
| + net_task_runner),
|
| + pref_update_delay_(base::TimeDelta()) {
|
| InitializeOnNetworkThread();
|
| }
|
|
|
| @@ -96,7 +97,7 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager {
|
| // Post tasks without a delay during tests.
|
| void StartPrefsUpdateTimerOnNetworkThread(base::TimeDelta delay) override {
|
| HttpServerPropertiesManager::StartPrefsUpdateTimerOnNetworkThread(
|
| - base::TimeDelta());
|
| + pref_update_delay_);
|
| }
|
|
|
| void UpdateCacheFromPrefsOnUIConcrete() {
|
| @@ -124,6 +125,9 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager {
|
| DETECTED_CORRUPTED_PREFS);
|
| }
|
|
|
| + void set_pref_update_delay(base::TimeDelta delay) {
|
| + pref_update_delay_ = delay;
|
| + }
|
| MOCK_METHOD0(UpdateCacheFromPrefsOnPrefThread, void());
|
| MOCK_METHOD1(UpdatePrefsFromCacheOnNetworkThread, void(const base::Closure&));
|
| MOCK_METHOD1(ScheduleUpdatePrefsOnNetworkThread, void(Location location));
|
| @@ -143,6 +147,8 @@ class TestingHttpServerPropertiesManager : public HttpServerPropertiesManager {
|
| const base::Closure& completion));
|
|
|
| private:
|
| + // Time delays used in test for posting tasks. Default to zero.
|
| + base::TimeDelta pref_update_delay_;
|
| DISALLOW_COPY_AND_ASSIGN(TestingHttpServerPropertiesManager);
|
| };
|
|
|
| @@ -659,6 +665,68 @@ TEST_P(HttpServerPropertiesManagerTest, SupportsSpdy) {
|
| Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
|
| }
|
|
|
| +// Regression test for crbug.com/670519. Test that there is only one pref update
|
| +// scheduled if multiple updates happen in a given time period. Subsequent pref
|
| +// update could also be scheduled once the previous scheduled update is
|
| +// completed.
|
| +TEST_P(HttpServerPropertiesManagerTest,
|
| + SinglePrefUpdateForTwoSpdyServerCacheChangese) {
|
| + http_server_props_manager_->set_pref_update_delay(
|
| + base::TimeDelta::FromMilliseconds(60));
|
| + ExpectPrefsUpdateRepeatedly();
|
| + ExpectScheduleUpdatePrefsOnNetworkThreadRepeatedly();
|
| +
|
| + // Post an update task to the network thread. SetSupportsSpdy calls
|
| + // ScheduleUpdatePrefsOnNetworkThread with a delay of 60ms.
|
| + url::SchemeHostPort spdy_server("https", "mail.google.com", 443);
|
| + EXPECT_FALSE(
|
| + http_server_props_manager_->SupportsRequestPriority(spdy_server));
|
| + http_server_props_manager_->SetSupportsSpdy(spdy_server, true);
|
| + // The pref update task should be scheduled to network thread.
|
| + EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
|
| +
|
| + // Move forward the task runner with 20ms.
|
| + net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(20));
|
| +
|
| + // Set another spdy server to trigger another call to
|
| + // ScheduleUpdatePrefsOnNetworkThread. There should be no new update posted to
|
| + // the network thread.
|
| + url::SchemeHostPort spdy_server2("https", "drive.google.com", 443);
|
| + http_server_props_manager_->SetSupportsSpdy(spdy_server2, true);
|
| + EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
|
| + EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
|
| +
|
| + // Move forward another 40ms. The pref update should be executed.
|
| + net_test_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(40));
|
| + EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
|
| + EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
|
| + pref_test_task_runner_->FastForwardUntilNoTasksRemain();
|
| + EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
|
| + EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
|
| +
|
| + EXPECT_TRUE(http_server_props_manager_->SupportsRequestPriority(spdy_server));
|
| + EXPECT_TRUE(
|
| + http_server_props_manager_->SupportsRequestPriority(spdy_server2));
|
| + // Set the third spdy server to trigger one more call to
|
| + // ScheduleUpdatePrefsOnNetworkThread. A new update task should be posted to
|
| + // network thread now since the previous one is completed.
|
| + url::SchemeHostPort spdy_server3("https", "maps.google.com", 443);
|
| + http_server_props_manager_->SetSupportsSpdy(spdy_server3, true);
|
| + EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
|
| + EXPECT_EQ(1u, net_test_task_runner_->GetPendingTaskCount());
|
| +
|
| + // Run the task.
|
| + EXPECT_TRUE(net_test_task_runner_->HasPendingTask());
|
| + EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
|
| + net_test_task_runner_->FastForwardUntilNoTasksRemain();
|
| + EXPECT_TRUE(pref_test_task_runner_->HasPendingTask());
|
| + pref_test_task_runner_->FastForwardUntilNoTasksRemain();
|
| + EXPECT_FALSE(net_test_task_runner_->HasPendingTask());
|
| + EXPECT_FALSE(pref_test_task_runner_->HasPendingTask());
|
| +
|
| + Mock::VerifyAndClearExpectations(http_server_props_manager_.get());
|
| +}
|
| +
|
| TEST_P(HttpServerPropertiesManagerTest, GetAlternativeServices) {
|
| ExpectPrefsUpdate();
|
| ExpectScheduleUpdatePrefsOnNetworkThread();
|
|
|