Index: chrome/browser/policy/cloud/external_policy_data_updater_unittest.cc |
diff --git a/chrome/browser/policy/cloud/external_policy_data_updater_unittest.cc b/chrome/browser/policy/cloud/external_policy_data_updater_unittest.cc |
deleted file mode 100644 |
index 7ce8e17d75171e7b6b0b8d8a4a8c1f7e131f12c5..0000000000000000000000000000000000000000 |
--- a/chrome/browser/policy/cloud/external_policy_data_updater_unittest.cc |
+++ /dev/null |
@@ -1,962 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/policy/cloud/external_policy_data_updater.h" |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/callback.h" |
-#include "base/compiler_specific.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/sha1.h" |
-#include "base/test/test_pending_task.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "base/time/time.h" |
-#include "chrome/browser/policy/cloud/external_policy_data_fetcher.h" |
-#include "net/base/net_errors.h" |
-#include "net/url_request/test_url_fetcher_factory.h" |
-#include "net/url_request/url_fetcher_delegate.h" |
-#include "net/url_request/url_request_context_getter.h" |
-#include "net/url_request/url_request_status.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/gurl.h" |
- |
-using testing::Mock; |
-using testing::Return; |
- |
-namespace policy { |
- |
-namespace { |
- |
-const char* kExternalPolicyDataKeys[] = {"external_policy_data_1", |
- "external_policy_data_2", |
- "external_policy_data_3"}; |
-const char* kExternalPolicyDataURLs[] = {"http://example.com/data_1", |
- "http://example.com/data_2", |
- "http://example.com/data_3"}; |
-const char* kExternalPolicyDataPayload = "External policy data"; |
- |
-const int64 kExternalPolicyDataMaxSize = 5 * 1024 * 1024; // 5 MB. |
- |
-class MockFetchSuccessCallbackListener { |
- public: |
- MOCK_METHOD2(OnFetchSuccess, bool(const std::string&, const std::string&)); |
- |
- ExternalPolicyDataUpdater::FetchSuccessCallback CreateCallback( |
- const std::string& key); |
-}; |
- |
-ExternalPolicyDataUpdater::FetchSuccessCallback |
- MockFetchSuccessCallbackListener::CreateCallback(const std::string& key) { |
- return base::Bind(&MockFetchSuccessCallbackListener::OnFetchSuccess, |
- base::Unretained(this), |
- key); |
-} |
- |
-} // namespace |
- |
-class ExternalPolicyDataUpdaterTest : public testing::Test { |
- protected: |
- virtual void SetUp() OVERRIDE; |
- |
- void CreateUpdater(size_t max_parallel_fetches); |
- ExternalPolicyDataUpdater::Request CreateRequest( |
- const std::string& url) const; |
- void RequestExternalDataFetch(int key_index, int url_index); |
- void RequestExternalDataFetch(int index); |
- |
- net::TestURLFetcherFactory fetcher_factory_; |
- MockFetchSuccessCallbackListener callback_listener_; |
- scoped_refptr<base::TestSimpleTaskRunner> backend_task_runner_; |
- scoped_refptr<base::TestSimpleTaskRunner> io_task_runner_; |
- scoped_ptr<ExternalPolicyDataFetcherBackend> fetcher_backend_; |
- scoped_ptr<ExternalPolicyDataUpdater> updater_; |
-}; |
- |
-void ExternalPolicyDataUpdaterTest::SetUp() { |
- fetcher_factory_.set_remove_fetcher_on_delete(true); |
- backend_task_runner_ = new base::TestSimpleTaskRunner(); |
- io_task_runner_ = new base::TestSimpleTaskRunner(); |
-} |
- |
-void ExternalPolicyDataUpdaterTest::CreateUpdater(size_t max_parallel_fetches) { |
- fetcher_backend_.reset(new ExternalPolicyDataFetcherBackend( |
- io_task_runner_, |
- scoped_refptr<net::URLRequestContextGetter>())); |
- updater_.reset(new ExternalPolicyDataUpdater( |
- backend_task_runner_, |
- fetcher_backend_->CreateFrontend(backend_task_runner_), |
- max_parallel_fetches)); |
-} |
- |
-void ExternalPolicyDataUpdaterTest::RequestExternalDataFetch(int key_index, |
- int url_index) { |
- updater_->FetchExternalData( |
- kExternalPolicyDataKeys[key_index], |
- CreateRequest(kExternalPolicyDataURLs[url_index]), |
- callback_listener_.CreateCallback(kExternalPolicyDataKeys[key_index])); |
- io_task_runner_->RunUntilIdle(); |
- backend_task_runner_->RunPendingTasks(); |
-} |
- |
-void ExternalPolicyDataUpdaterTest::RequestExternalDataFetch(int index) { |
- RequestExternalDataFetch(index, index); |
-} |
- |
-ExternalPolicyDataUpdater::Request |
- ExternalPolicyDataUpdaterTest::CreateRequest(const std::string& url) const { |
- return ExternalPolicyDataUpdater::Request( |
- url, |
- base::SHA1HashString(kExternalPolicyDataPayload), |
- kExternalPolicyDataMaxSize); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, FetchSuccess) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the second fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Complete the first fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[0], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, PayloadSizeExceedsLimit) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the second fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Indicate that the payload size will exceed allowed maximum. |
- fetcher->delegate()->OnURLFetchDownloadProgress( |
- fetcher, |
- kExternalPolicyDataMaxSize + 1, |
- -1); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that a retry has been scheduled for the first fetch. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, FetchFailure) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the second fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the first fetch fail due to an interrupted connection. |
- fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, |
- net::ERR_NETWORK_CHANGED)); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that a retry has been scheduled for the first fetch. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, ServerFailure) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the second fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the first fetch fail with a server error. |
- fetcher->set_response_code(500); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that a retry has been scheduled for the first fetch. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, RetryLimit) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make a fetch request. |
- RequestExternalDataFetch(0); |
- |
- int fetcher_id = 0; |
- |
- // Verify that client failures cause the fetch to be retried three times. |
- for (int i = 0; i < 3; ++i) { |
- // Verify that the fetch has been (re)started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(fetcher_id); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the fetch fail with a client error. |
- fetcher->set_response_code(400); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id)); |
- |
- // Verify that a retry has been scheduled. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
- |
- // Fast-forward time to the scheduled retry. |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
- ++fetcher_id; |
- } |
- |
- // Verify that the fetch has been restarted. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(fetcher_id); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the fetch fail once more. |
- fetcher->set_response_code(400); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- ++fetcher_id; |
- |
- // Verify that the fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id)); |
- |
- // Verify that no further retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, RetryWithBackoff) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make a fetch request. |
- RequestExternalDataFetch(0); |
- |
- base::TimeDelta expected_delay = base::TimeDelta::FromSeconds(60); |
- const base::TimeDelta delay_cap = base::TimeDelta::FromHours(12); |
- |
- int fetcher_id = 0; |
- |
- // The backoff delay is capped at 12 hours, which is reached after 10 retries: |
- // 60 * 2^10 == 61440 > 43200 == 12 * 60 * 60 |
- for (int i = 0; i < 20; ++i) { |
- // Verify that the fetch has been (re)started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(fetcher_id); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the fetch fail with a server error. |
- fetcher->set_response_code(500); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(fetcher_id)); |
- |
- // Verify that a retry has been scheduled. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
- |
- // Verify that the retry delay has been doubled, with random jitter from 80% |
- // to 100%. |
- const base::TestPendingTask& task = |
- backend_task_runner_->GetPendingTasks().front(); |
- EXPECT_GT(task.delay, |
- base::TimeDelta::FromMilliseconds( |
- 0.799 * expected_delay.InMilliseconds())); |
- EXPECT_LE(task.delay, expected_delay); |
- |
- if (i < 10) { |
- // The delay cap has not been reached yet. |
- EXPECT_LT(expected_delay, delay_cap); |
- expected_delay *= 2; |
- |
- if (i == 9) { |
- // The last doubling reached the cap. |
- EXPECT_GT(expected_delay, delay_cap); |
- expected_delay = delay_cap; |
- } |
- } |
- |
- // Fast-forward time to the scheduled retry. |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
- ++fetcher_id; |
- } |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, HashInvalid) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the second fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the first fetch retrieve data whose hash does not match the expected |
- // value. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString("Invalid external policy data"); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that a retry has been scheduled for the first fetch. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, DataRejectedByCallback) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make a fetch request. |
- RequestExternalDataFetch(0); |
- |
- // Verify that the fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Complete the fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Reject the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[0], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(false)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that a retry has been scheduled. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
- |
- // Fast-forward time to the scheduled retry. |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
- |
- // Verify that the fetch has been restarted. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Complete the fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked this time. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[0], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, URLChanged) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make a fetch request. |
- RequestExternalDataFetch(0); |
- |
- // Verify that the fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make another fetch request with the same key but an updated URL. |
- RequestExternalDataFetch(0, 1); |
- |
- // Verify that the original fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that a new fetch has been started with the updated URL. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, JobInvalidated) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the second fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make another fetch request with the same key as the second request but an |
- // updated URL. |
- RequestExternalDataFetch(1, 2); |
- |
- // Verify that the first fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Verify that the second fetch has still not been started. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Make the first fetch fail with a server error. |
- fetcher->set_response_code(500); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the second fetch was invalidated and the third fetch has been |
- // started instead. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, FetchCanceled) { |
- // Create an updater that runs one fetch at a time. |
- CreateUpdater(1); |
- |
- // Make a fetch request. |
- RequestExternalDataFetch(0); |
- |
- // Verify that the fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Cancel the fetch request. |
- updater_->CancelExternalDataFetch(kExternalPolicyDataKeys[0]); |
- io_task_runner_->RunUntilIdle(); |
- backend_task_runner_->RunPendingTasks(); |
- |
- // Verify that the fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobs) { |
- // Create an updater that runs up to two fetches in parallel. |
- CreateUpdater(2); |
- |
- // Make three fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- RequestExternalDataFetch(2); |
- |
- // Verify that the third fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that the second fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that the first fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Complete the first fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[0], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the third fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Verify that the second fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Complete the second fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[1], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the second fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the third fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Complete the third fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[2], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the third fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsFinishingOutOfOrder) { |
- // Create an updater that runs up to two fetches in parallel. |
- CreateUpdater(2); |
- |
- // Make three fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- RequestExternalDataFetch(2); |
- |
- // Verify that the third fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Complete the second fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[1], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the second fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the third fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Verify that the first fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Complete the first fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[0], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the third fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Complete the third fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[2], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the third fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithRetry) { |
- // Create an updater that runs up to two fetches in parallel. |
- CreateUpdater(2); |
- |
- // Make three fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- RequestExternalDataFetch(2); |
- |
- // Verify that the third fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that the second fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that the first fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Make the first fetch fail with a client error. |
- fetcher->set_response_code(400); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the first fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the third fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Verify that a retry has been scheduled for the first fetch. |
- EXPECT_EQ(1u, backend_task_runner_->GetPendingTasks().size()); |
- |
- // Fast-forward time to the scheduled retry. |
- backend_task_runner_->RunPendingTasks(); |
- io_task_runner_->RunUntilIdle(); |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
- |
- // Verify that the first fetch has not been restarted yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(3)); |
- |
- // Complete the third fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[2], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the third fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that the second fetch is still running |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that the first fetch has been restarted. |
- fetcher = fetcher_factory_.GetFetcherByID(3); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Verify that no further retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithCancel) { |
- // Create an updater that runs up to two fetches in parallel. |
- CreateUpdater(2); |
- |
- // Make three fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- RequestExternalDataFetch(2); |
- |
- // Verify that the third fetch has not been started yet. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that the second fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Verify that the first fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Cancel the fetch request. |
- updater_->CancelExternalDataFetch(kExternalPolicyDataKeys[0]); |
- io_task_runner_->RunUntilIdle(); |
- backend_task_runner_->RunPendingTasks(); |
- |
- // Verify that the fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); |
- |
- // Verify that the third fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Verify that the second fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Complete the second fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[1], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the second fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the third fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
- |
- // Complete the third fetch. |
- fetcher->set_response_code(200); |
- fetcher->SetResponseString(kExternalPolicyDataPayload); |
- fetcher->delegate()->OnURLFetchComplete(fetcher); |
- |
- // Accept the data when the callback is invoked. |
- EXPECT_CALL(callback_listener_, |
- OnFetchSuccess(kExternalPolicyDataKeys[2], |
- kExternalPolicyDataPayload)) |
- .Times(1) |
- .WillOnce(Return(true)); |
- backend_task_runner_->RunPendingTasks(); |
- Mock::VerifyAndClearExpectations(&callback_listener_); |
- io_task_runner_->RunUntilIdle(); |
- |
- // Verify that the third fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(2)); |
- |
- // Verify that no retries have been scheduled. |
- EXPECT_TRUE(backend_task_runner_->GetPendingTasks().empty()); |
-} |
- |
-TEST_F(ExternalPolicyDataUpdaterTest, ParallelJobsWithInvalidatedJob) { |
- // Create an updater that runs up to two fetches in parallel. |
- CreateUpdater(2); |
- |
- // Make two fetch requests. |
- RequestExternalDataFetch(0); |
- RequestExternalDataFetch(1); |
- |
- // Verify that the first fetch has been started. |
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Verify that the second fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(1); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); |
- |
- // Make another fetch request with the same key as the second request but an |
- // updated URL. |
- RequestExternalDataFetch(1, 2); |
- |
- // Verify that the first fetch is still running. |
- fetcher = fetcher_factory_.GetFetcherByID(0); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); |
- |
- // Verify that the second fetch is no longer running. |
- EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); |
- |
- // Verify that the third fetch has been started. |
- fetcher = fetcher_factory_.GetFetcherByID(2); |
- ASSERT_TRUE(fetcher); |
- EXPECT_EQ(GURL(kExternalPolicyDataURLs[2]), fetcher->GetOriginalURL()); |
-} |
- |
-} // namespace policy |