| Index: content/browser/background_fetch/background_fetch_job_controller_unittest.cc
|
| diff --git a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
|
| index 9478fe824d5474da4a1f086ed3a10a9dc41b9cf8..22959816189334849c265623cc715a0492d0bbf5 100644
|
| --- a/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
|
| +++ b/content/browser/background_fetch/background_fetch_job_controller_unittest.cc
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "base/bind_helpers.h"
|
| #include "base/callback_helpers.h"
|
| +#include "base/files/file_path.h"
|
| #include "base/guid.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/run_loop.h"
|
| @@ -23,6 +24,8 @@
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +namespace content {
|
| +
|
| namespace {
|
|
|
| const char kOrigin[] = "https://example.com/";
|
| @@ -30,11 +33,10 @@ const char kJobGuid[] = "TestRequestGuid";
|
| constexpr int64_t kServiceWorkerRegistrationId = 9001;
|
| const char kTestUrl[] = "http://www.example.com/example.html";
|
| const char kTag[] = "testTag";
|
| +const base::FilePath::CharType kFileName[] = FILE_PATH_LITERAL("path/file.txt");
|
|
|
| } // namespace
|
|
|
| -namespace content {
|
| -
|
| // Use the basic MockDownloadManager, but override it so that it implements the
|
| // functionality that the JobController requires.
|
| class MockDownloadManagerWithCallback : public MockDownloadManager {
|
| @@ -73,10 +75,72 @@ class MockDownloadManagerWithCallback : public MockDownloadManager {
|
| std::vector<std::unique_ptr<FakeDownloadItem>> download_items_;
|
| };
|
|
|
| +class FakeBackgroundFetchDataManager : public BackgroundFetchDataManager {
|
| + public:
|
| + FakeBackgroundFetchDataManager(BrowserContext* browser_context)
|
| + : BackgroundFetchDataManager(browser_context) {}
|
| + ~FakeBackgroundFetchDataManager() = default;
|
| +
|
| + void set_is_complete(bool is_complete) { is_complete_ = is_complete; }
|
| +
|
| + void set_next_request(BackgroundFetchRequestInfo* request) {
|
| + next_request_ = request;
|
| + }
|
| +
|
| + bool UpdateRequestState(const std::string& job_guid,
|
| + const std::string& request_guid,
|
| + DownloadItem::DownloadState state,
|
| + DownloadInterruptReason interrupt_reason) override {
|
| + if (state == DownloadItem::DownloadState::COMPLETE ||
|
| + state == DownloadItem::DownloadState::CANCELLED) {
|
| + if (!next_request_)
|
| + is_complete_ = true;
|
| + }
|
| + current_request_->set_state(state);
|
| + current_request_->set_interrupt_reason(interrupt_reason);
|
| + return next_request_;
|
| + }
|
| +
|
| + void UpdateRequestDownloadGuid(const std::string& job_guid,
|
| + const std::string& request_guid,
|
| + const std::string& download_guid) override {
|
| + current_request_->set_download_guid(download_guid);
|
| + }
|
| +
|
| + void UpdateRequestStorageState(const std::string& job_guid,
|
| + const std::string& request_guid,
|
| + const base::FilePath& file_path,
|
| + int64_t received_bytes) override {
|
| + current_request_->set_file_path(file_path);
|
| + current_request_->set_received_bytes(received_bytes);
|
| + }
|
| +
|
| + const BackgroundFetchRequestInfo& GetNextBackgroundFetchRequestInfo(
|
| + const std::string& job_guid) override {
|
| + current_request_ = next_request_;
|
| + next_request_ = nullptr;
|
| + return *current_request_;
|
| + }
|
| +
|
| + bool HasRequestsRemaining(const std::string& job_guid) const override {
|
| + return next_request_;
|
| + }
|
| + bool IsComplete(const std::string& job_guid) const override {
|
| + return is_complete_;
|
| + }
|
| +
|
| + private:
|
| + bool is_complete_ = false;
|
| + BackgroundFetchRequestInfo* current_request_ = nullptr;
|
| + BackgroundFetchRequestInfo* next_request_ = nullptr;
|
| +};
|
| +
|
| class BackgroundFetchJobControllerTest : public ::testing::Test {
|
| public:
|
| BackgroundFetchJobControllerTest()
|
| - : download_manager_(new MockDownloadManagerWithCallback()) {}
|
| + : data_manager_(base::MakeUnique<FakeBackgroundFetchDataManager>(
|
| + &browser_context_)),
|
| + download_manager_(new MockDownloadManagerWithCallback()) {}
|
| ~BackgroundFetchJobControllerTest() override = default;
|
|
|
| void SetUp() override {
|
| @@ -88,12 +152,11 @@ class BackgroundFetchJobControllerTest : public ::testing::Test {
|
|
|
| void TearDown() override { job_controller_->Shutdown(); }
|
|
|
| - void InitializeJobController(
|
| - std::unique_ptr<BackgroundFetchJobData> job_data) {
|
| + void InitializeJobController() {
|
| job_controller_ = base::MakeUnique<BackgroundFetchJobController>(
|
| kJobGuid, &browser_context_,
|
| BrowserContext::GetDefaultStoragePartition(&browser_context_),
|
| - std::move(job_data),
|
| + data_manager_.get(),
|
| base::BindOnce(&BackgroundFetchJobControllerTest::DidCompleteJob,
|
| base::Unretained(this)));
|
| }
|
| @@ -125,10 +188,15 @@ class BackgroundFetchJobControllerTest : public ::testing::Test {
|
|
|
| bool did_complete_job() const { return did_complete_job_; }
|
|
|
| + FakeBackgroundFetchDataManager* data_manager() const {
|
| + return data_manager_.get();
|
| + }
|
| +
|
| private:
|
| bool did_complete_job_ = false;
|
| TestBrowserThreadBundle thread_bundle_;
|
| TestBrowserContext browser_context_;
|
| + std::unique_ptr<FakeBackgroundFetchDataManager> data_manager_;
|
| std::unique_ptr<BackgroundFetchJobController> job_controller_;
|
| MockDownloadManagerWithCallback* download_manager_;
|
| };
|
| @@ -137,14 +205,9 @@ TEST_F(BackgroundFetchJobControllerTest, SingleRequestJob) {
|
| BackgroundFetchJobInfo job_info(kTag, url::Origin(GURL(kOrigin)),
|
| kServiceWorkerRegistrationId);
|
| BackgroundFetchRequestInfo request_info(GURL(kTestUrl), kJobGuid);
|
| - std::vector<BackgroundFetchRequestInfo> request_infos{request_info};
|
| -
|
| - // Get a JobData to give to the JobController. The JobController then gets
|
| - // the BackgroundFetchRequestInfos from the JobData.
|
| - std::unique_ptr<BackgroundFetchJobData> owned_job_data =
|
| - base::MakeUnique<BackgroundFetchJobData>(request_infos);
|
| - BackgroundFetchJobData* job_data = owned_job_data.get();
|
| - InitializeJobController(std::move(owned_job_data));
|
| + request_info.set_state(DownloadItem::DownloadState::IN_PROGRESS);
|
| + data_manager()->set_next_request(&request_info);
|
| + InitializeJobController();
|
|
|
| EXPECT_CALL(*(download_manager()),
|
| DownloadUrlMock(::testing::Pointee(::testing::Property(
|
| @@ -153,22 +216,22 @@ TEST_F(BackgroundFetchJobControllerTest, SingleRequestJob) {
|
|
|
| StartProcessing();
|
|
|
| - // Get one of the pending downloads from the download manager.
|
| + // Get the pending download from the download manager.
|
| auto& download_items = download_manager()->download_items();
|
| ASSERT_EQ(1U, download_items.size());
|
| FakeDownloadItem* item = download_items[0].get();
|
|
|
| // Update the observer with no actual change.
|
| ItemObserver()->OnDownloadUpdated(item);
|
| - EXPECT_FALSE(job_data->IsComplete());
|
| + EXPECT_EQ(DownloadItem::DownloadState::IN_PROGRESS, request_info.state());
|
| EXPECT_FALSE(did_complete_job());
|
|
|
| // Update the item to be completed then update the observer. The JobController
|
| // should update the JobData that the request is complete.
|
| item->SetState(DownloadItem::DownloadState::COMPLETE);
|
| ItemObserver()->OnDownloadUpdated(item);
|
| - EXPECT_TRUE(job_data->IsComplete());
|
|
|
| + EXPECT_EQ(DownloadItem::DownloadState::COMPLETE, request_info.state());
|
| EXPECT_TRUE(did_complete_job());
|
| }
|
|
|
| @@ -179,13 +242,8 @@ TEST_F(BackgroundFetchJobControllerTest, MultipleRequestJob) {
|
| for (int i = 0; i < 10; i++) {
|
| request_infos.emplace_back(GURL(kTestUrl), base::IntToString(i));
|
| }
|
| -
|
| - // Get a JobData to give to the JobController. The JobController then gets
|
| - // the BackgroundFetchRequestInfos from the JobData.
|
| - std::unique_ptr<BackgroundFetchJobData> owned_job_data =
|
| - base::MakeUnique<BackgroundFetchJobData>(request_infos);
|
| - BackgroundFetchJobData* job_data = owned_job_data.get();
|
| - InitializeJobController(std::move(owned_job_data));
|
| + data_manager()->set_next_request(&request_infos[0]);
|
| + InitializeJobController();
|
|
|
| EXPECT_CALL(*(download_manager()),
|
| DownloadUrlMock(::testing::Pointee(::testing::Property(
|
| @@ -201,18 +259,21 @@ TEST_F(BackgroundFetchJobControllerTest, MultipleRequestJob) {
|
|
|
| // Update the observer with no actual change.
|
| ItemObserver()->OnDownloadUpdated(item);
|
| - EXPECT_FALSE(job_data->IsComplete());
|
| + EXPECT_EQ(DownloadItem::DownloadState::IN_PROGRESS, request_infos[0].state());
|
| ASSERT_EQ(1U, download_items.size());
|
|
|
| for (size_t i = 0; i < 9; i++) {
|
| + // Update the FakeDataManager with the results we expect.
|
| + if (i < 9)
|
| + data_manager()->set_next_request(&request_infos[i + 1]);
|
| +
|
| // Update the next item to be completed then update the observer.
|
| ASSERT_EQ(i + 1, download_items.size());
|
| item = download_items[i].get();
|
| item->SetState(DownloadItem::DownloadState::COMPLETE);
|
| ItemObserver()->OnDownloadUpdated(item);
|
| - EXPECT_FALSE(job_data->IsComplete());
|
| + EXPECT_EQ(DownloadItem::DownloadState::COMPLETE, request_infos[i].state());
|
| }
|
| - EXPECT_FALSE(job_data->HasRequestsRemaining());
|
| EXPECT_FALSE(did_complete_job());
|
|
|
| // Finally, update the last request to be complete. The JobController should
|
| @@ -221,9 +282,41 @@ TEST_F(BackgroundFetchJobControllerTest, MultipleRequestJob) {
|
| item = download_items[9].get();
|
| item->SetState(DownloadItem::DownloadState::COMPLETE);
|
| ItemObserver()->OnDownloadUpdated(item);
|
| - EXPECT_TRUE(job_data->IsComplete());
|
|
|
| EXPECT_TRUE(did_complete_job());
|
| }
|
|
|
| +TEST_F(BackgroundFetchJobControllerTest, UpdateStorageState) {
|
| + BackgroundFetchJobInfo job_info(kTag, url::Origin(GURL(kOrigin)),
|
| + kServiceWorkerRegistrationId);
|
| + BackgroundFetchRequestInfo request_info(GURL(kTestUrl), kJobGuid);
|
| + request_info.set_state(DownloadItem::DownloadState::IN_PROGRESS);
|
| + data_manager()->set_next_request(&request_info);
|
| + InitializeJobController();
|
| +
|
| + EXPECT_CALL(*(download_manager()),
|
| + DownloadUrlMock(::testing::Pointee(::testing::Property(
|
| + &DownloadUrlParameters::url, GURL(kTestUrl)))))
|
| + .Times(1);
|
| +
|
| + StartProcessing();
|
| +
|
| + // Get the pending download from the download manager.
|
| + auto& download_items = download_manager()->download_items();
|
| + ASSERT_EQ(1U, download_items.size());
|
| + FakeDownloadItem* item = download_items[0].get();
|
| +
|
| + item->SetTargetFilePath(base::FilePath(kFileName));
|
| + item->SetReceivedBytes(123);
|
| + item->SetState(DownloadItem::DownloadState::COMPLETE);
|
| +
|
| + // Trigger the observer. The JobController should update the JobData that the
|
| + // request is complete and should fill in storage state.
|
| + ItemObserver()->OnDownloadUpdated(item);
|
| +
|
| + EXPECT_EQ(123, request_info.received_bytes());
|
| + EXPECT_TRUE(data_manager()->IsComplete(kJobGuid));
|
| + EXPECT_TRUE(did_complete_job());
|
| +}
|
| +
|
| } // namespace content
|
|
|