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