158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/external_policy_data_fetcher.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind_helpers.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/compiler_specific.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/sequenced_task_runner.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/test/test_simple_task_runner.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/base/net_errors.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_fetcher.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/url_request/url_request_status.h" 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace policy { 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char* kExternalPolicyDataURLs[] = { 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "http://localhost/data_1", 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) "http://localhost/data_2" 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const int64 kExternalPolicyDataMaxSize = 5 * 1024 * 1024; // 5 MB. 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char* kExternalPolicyDataPayload = "External policy data"; 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class ExternalPolicyDataFetcherTest : public testing::Test { 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExternalPolicyDataFetcherTest(); 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~ExternalPolicyDataFetcherTest(); 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // testing::Test: 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetUp() OVERRIDE; 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartJob(int index); 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void CancelJob(int index); 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void OnJobFinished(int job_index, 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExternalPolicyDataFetcher::Result result, 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<std::string> data); 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int GetAndResetCallbackCount(); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcherFactory fetcher_factory_; 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> owner_task_runner_; 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> io_task_runner_; 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExternalPolicyDataFetcherBackend> fetcher_backend_; 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<ExternalPolicyDataFetcher> fetcher_; 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::map<int, ExternalPolicyDataFetcher::Job*> jobs_; // Not owned. 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int callback_count_; 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int callback_job_index_; 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExternalPolicyDataFetcher::Result callback_result_; 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<std::string> callback_data_; 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExternalPolicyDataFetcherTest); 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ExternalPolicyDataFetcherTest::ExternalPolicyDataFetcherTest() 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : callback_count_(0) { 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ExternalPolicyDataFetcherTest::~ExternalPolicyDataFetcherTest() { 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExternalPolicyDataFetcherTest::SetUp() { 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_factory_.set_remove_fetcher_on_delete(true); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) io_task_runner_ = new base::TestSimpleTaskRunner(); 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_ = new base::TestSimpleTaskRunner(); 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_backend_.reset(new ExternalPolicyDataFetcherBackend( 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) io_task_runner_, 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<net::URLRequestContextGetter>())); 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_.reset( 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_backend_->CreateFrontend(owner_task_runner_).release()); 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExternalPolicyDataFetcherTest::StartJob(int index) { 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) jobs_[index] = fetcher_->StartJob( 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL(kExternalPolicyDataURLs[index]), 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kExternalPolicyDataMaxSize, 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&ExternalPolicyDataFetcherTest::OnJobFinished, 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this), index)); 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) io_task_runner_->RunUntilIdle(); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExternalPolicyDataFetcherTest::CancelJob(int index) { 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::map<int, ExternalPolicyDataFetcher::Job*>::iterator it = 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) jobs_.find(index); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(it != jobs_.end()); 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExternalPolicyDataFetcher::Job* job = it->second; 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) jobs_.erase(it); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher_->CancelJob(job); 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void ExternalPolicyDataFetcherTest::OnJobFinished( 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int job_index, 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ExternalPolicyDataFetcher::Result result, 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<std::string> data) { 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++callback_count_; 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback_job_index_ = job_index; 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback_result_ = result; 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback_data_.reset(data.release()); 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) jobs_.erase(job_index); 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int ExternalPolicyDataFetcherTest::GetAndResetCallbackCount() { 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const int callback_count = callback_count_; 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback_count_ = 0; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return callback_count; 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, Success) { 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the fetch. 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the retrieved data. 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SUCCESS, callback_result_); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(callback_data_); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kExternalPolicyDataPayload, *callback_data_); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, MaxSizeExceeded) { 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Indicate that the data size will exceed maximum allowed. 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchDownloadProgress( 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher, 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kExternalPolicyDataMaxSize + 1, 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) -1); 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the correct error code. 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::MAX_SIZE_EXCEEDED, callback_result_); 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(callback_data_); 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, ConnectionInterrupted) { 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the fetch fail due to an interrupted connection. 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::ERR_CONNECTION_RESET)); 18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the correct error code. 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::CONNECTION_INTERRUPTED, 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) callback_result_); 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(callback_data_); 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, NetworkError) { 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the fetch fail due to a network error. 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, 20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::ERR_NETWORK_CHANGED)); 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the correct error code. 21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::NETWORK_ERROR, callback_result_); 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(callback_data_); 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, ServerError) { 22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the fetch fail with a server error. 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(500); 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the correct error code. 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SERVER_ERROR, callback_result_); 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(callback_data_); 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, ClientError) { 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the fetch fail with a client error. 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(400); 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the correct error code. 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::CLIENT_ERROR, callback_result_); 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(callback_data_); 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, HTTPError) { 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make the fetch fail with an HTTP error. 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(300); 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the correct error code. 28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::HTTP_ERROR, callback_result_); 29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(callback_data_); 29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, Canceled) { 29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Cancel the fetch job. 30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CancelJob(0); 30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) io_task_runner_->RunUntilIdle(); 30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is not invoked. 31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, GetAndResetCallbackCount()); 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, SuccessfulCanceled) { 31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start a fetch job. 31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch has been started. 32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the fetch. 32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the fetch is no longer running. 33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Cancel the fetch job before the successful fetch result has arrived from 33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the backend. 33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CancelJob(0); 33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is not invoked. 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, GetAndResetCallbackCount()); 34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, ParallelJobs) { 34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start two fetch jobs. 34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(1); 34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch has been started. 34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); 34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); 35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch has been started. 35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(0); 35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the first fetch. 35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch is no longer running. 36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the retrieved data. 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SUCCESS, callback_result_); 37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(callback_data_); 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kExternalPolicyDataPayload, *callback_data_); 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch is still running. 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the second fetch. 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch is no longer running. 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the retrieved data. 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, callback_job_index_); 39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SUCCESS, callback_result_); 39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(callback_data_); 39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kExternalPolicyDataPayload, *callback_data_); 39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 39458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, ParallelJobsFinishingOutOfOrder) { 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start two fetch jobs. 39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(1); 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch has been started. 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch has been started. 40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the second fetch. 41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch is no longer running. 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); 41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the retrieved data. 41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, callback_job_index_); 42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SUCCESS, callback_result_); 42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(callback_data_); 42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kExternalPolicyDataPayload, *callback_data_); 42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch is still running. 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(0); 42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the first fetch. 43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch is no longer running. 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the retrieved data. 44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, callback_job_index_); 44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SUCCESS, callback_result_); 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(callback_data_); 44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kExternalPolicyDataPayload, *callback_data_); 44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ExternalPolicyDataFetcherTest, ParallelJobsWithCancel) { 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Start two fetch jobs. 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(0); 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartJob(1); 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch has been started. 45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(1); 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch has been started. 45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(0); 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[0]), fetcher->GetOriginalURL()); 46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Cancel the first fetch job. 46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CancelJob(0); 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) io_task_runner_->RunUntilIdle(); 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the first fetch is no longer running. 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(0)); 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is not invoked. 47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0, GetAndResetCallbackCount()); 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch is still running. 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher = fetcher_factory_.GetFetcherByID(1); 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(fetcher); 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(GURL(kExternalPolicyDataURLs[1]), fetcher->GetOriginalURL()); 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Complete the second fetch. 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->set_response_code(200); 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->SetResponseString(kExternalPolicyDataPayload); 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) fetcher->delegate()->OnURLFetchComplete(fetcher); 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the second fetch is no longer running. 48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(fetcher_factory_.GetFetcherByID(1)); 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Verify that the callback is invoked with the retrieved data. 48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) owner_task_runner_->RunUntilIdle(); 48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, GetAndResetCallbackCount()); 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1, callback_job_index_); 49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(ExternalPolicyDataFetcher::SUCCESS, callback_result_); 49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(callback_data_); 49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kExternalPolicyDataPayload, *callback_data_); 49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace policy 497