| Index: components/offline_pages/offline_page_storage_manager_unittest.cc
|
| diff --git a/components/offline_pages/offline_page_storage_manager_unittest.cc b/components/offline_pages/offline_page_storage_manager_unittest.cc
|
| deleted file mode 100644
|
| index 372037a7e23b9a6e011d695045f7aeecf087604e..0000000000000000000000000000000000000000
|
| --- a/components/offline_pages/offline_page_storage_manager_unittest.cc
|
| +++ /dev/null
|
| @@ -1,452 +0,0 @@
|
| -// Copyright 2016 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "components/offline_pages/offline_page_storage_manager.h"
|
| -
|
| -#include <stdint.h>
|
| -#include <map>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/test/simple_test_clock.h"
|
| -#include "base/time/time.h"
|
| -#include "components/offline_pages/archive_manager.h"
|
| -#include "components/offline_pages/client_namespace_constants.h"
|
| -#include "components/offline_pages/client_policy_controller.h"
|
| -#include "components/offline_pages/offline_page_item.h"
|
| -#include "components/offline_pages/offline_page_model_impl.h"
|
| -#include "components/offline_pages/offline_page_types.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using LifetimePolicy = offline_pages::LifetimePolicy;
|
| -using ClearStorageResult =
|
| - offline_pages::OfflinePageStorageManager::ClearStorageResult;
|
| -using StorageStats = offline_pages::ArchiveManager::StorageStats;
|
| -
|
| -namespace offline_pages {
|
| -
|
| -namespace {
|
| -const GURL kTestUrl("http://example.com");
|
| -const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("/data");
|
| -const int64_t kTestFileSize = 1 << 19; // Make a page 512KB.
|
| -const int64_t kFreeSpaceNormal = 100 * (1 << 20);
|
| -
|
| -enum TestOptions {
|
| - DEFAULT = 1 << 0,
|
| - EXPIRE_FAILURE = 1 << 1,
|
| - DELETE_FAILURE = 1 << 2,
|
| - EXPIRE_AND_DELETE_FAILURES = EXPIRE_FAILURE | DELETE_FAILURE,
|
| -};
|
| -
|
| -struct PageSettings {
|
| - std::string name_space;
|
| - int fresh_pages_count;
|
| - int expired_pages_count;
|
| -};
|
| -} // namespace
|
| -
|
| -class OfflinePageTestModel : public OfflinePageModelImpl {
|
| - public:
|
| - OfflinePageTestModel(std::vector<PageSettings> page_settings,
|
| - base::SimpleTestClock* clock,
|
| - TestOptions options = TestOptions::DEFAULT)
|
| - : policy_controller_(new ClientPolicyController()),
|
| - clock_(clock),
|
| - options_(options),
|
| - next_offline_id_(0) {
|
| - for (const auto& setting : page_settings)
|
| - AddPages(setting);
|
| - }
|
| -
|
| - ~OfflinePageTestModel() override;
|
| -
|
| - void GetAllPages(const MultipleOfflinePageItemCallback& callback) override {
|
| - MultipleOfflinePageItemResult pages;
|
| - for (const auto& id_page_pair : pages_)
|
| - pages.push_back(id_page_pair.second);
|
| - callback.Run(pages);
|
| - }
|
| -
|
| - void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids,
|
| - const DeletePageCallback& callback) override;
|
| -
|
| - void ExpirePages(const std::vector<int64_t>& offline_ids,
|
| - const base::Time& expiration_time,
|
| - const base::Callback<void(bool)>& callback) override;
|
| -
|
| - void AddPages(const PageSettings& setting);
|
| -
|
| - const std::vector<OfflinePageItem>& GetRemovedPages() {
|
| - return removed_pages_;
|
| - }
|
| -
|
| - int64_t GetTotalSize() const;
|
| -
|
| - base::SimpleTestClock* clock() { return clock_; }
|
| -
|
| - private:
|
| - std::map<int64_t, OfflinePageItem> pages_;
|
| -
|
| - std::vector<OfflinePageItem> removed_pages_;
|
| -
|
| - std::unique_ptr<ClientPolicyController> policy_controller_;
|
| -
|
| - base::SimpleTestClock* clock_;
|
| -
|
| - TestOptions options_;
|
| -
|
| - int64_t next_offline_id_;
|
| -};
|
| -
|
| -void OfflinePageTestModel::ExpirePages(
|
| - const std::vector<int64_t>& offline_ids,
|
| - const base::Time& expiration_time,
|
| - const base::Callback<void(bool)>& callback) {
|
| - for (const auto id : offline_ids)
|
| - pages_.at(id).expiration_time = expiration_time;
|
| - if (options_ & TestOptions::EXPIRE_FAILURE) {
|
| - callback.Run(false);
|
| - return;
|
| - }
|
| - callback.Run(true);
|
| -}
|
| -
|
| -void OfflinePageTestModel::DeletePagesByOfflineId(
|
| - const std::vector<int64_t>& offline_ids,
|
| - const DeletePageCallback& callback) {
|
| - if (options_ & TestOptions::DELETE_FAILURE) {
|
| - callback.Run(DeletePageResult::STORE_FAILURE);
|
| - return;
|
| - }
|
| - for (const auto id : offline_ids) {
|
| - removed_pages_.push_back(pages_.at(id));
|
| - pages_.erase(id);
|
| - }
|
| - callback.Run(DeletePageResult::SUCCESS);
|
| -}
|
| -
|
| -int64_t OfflinePageTestModel::GetTotalSize() const {
|
| - int64_t res = 0;
|
| - for (const auto& id_page_pair : pages_) {
|
| - if (!id_page_pair.second.IsExpired())
|
| - res += id_page_pair.second.file_size;
|
| - }
|
| - return res;
|
| -}
|
| -
|
| -OfflinePageTestModel::~OfflinePageTestModel() {}
|
| -
|
| -void OfflinePageTestModel::AddPages(const PageSettings& setting) {
|
| - std::string name_space = setting.name_space;
|
| - int fresh_pages_count = setting.fresh_pages_count;
|
| - int expired_pages_count = setting.expired_pages_count;
|
| - base::Time now = clock()->Now();
|
| - // Fresh pages.
|
| - for (int i = 0; i < fresh_pages_count; i++) {
|
| - OfflinePageItem page =
|
| - OfflinePageItem(kTestUrl, next_offline_id_,
|
| - ClientId(name_space, std::to_string(next_offline_id_)),
|
| - base::FilePath(kFilePath), kTestFileSize);
|
| - page.last_access_time = now;
|
| - pages_[next_offline_id_] = page;
|
| - next_offline_id_++;
|
| - }
|
| - // Expired pages.
|
| - for (int i = 0; i < expired_pages_count; i++) {
|
| - OfflinePageItem page =
|
| - OfflinePageItem(kTestUrl, next_offline_id_,
|
| - ClientId(name_space, std::to_string(next_offline_id_)),
|
| - base::FilePath(kFilePath), kTestFileSize);
|
| - page.last_access_time = now -
|
| - policy_controller_->GetPolicy(name_space)
|
| - .lifetime_policy.expiration_period;
|
| - pages_[next_offline_id_] = page;
|
| - next_offline_id_++;
|
| - }
|
| -}
|
| -
|
| -class TestArchiveManager : public ArchiveManager {
|
| - public:
|
| - explicit TestArchiveManager(StorageStats stats) : stats_(stats) {}
|
| -
|
| - void GetStorageStats(const base::Callback<
|
| - void(const ArchiveManager::StorageStats& storage_stats)>&
|
| - callback) const override {
|
| - callback.Run(stats_);
|
| - }
|
| -
|
| - void SetValues(ArchiveManager::StorageStats stats) { stats_ = stats; }
|
| -
|
| - private:
|
| - StorageStats stats_;
|
| -};
|
| -
|
| -class OfflinePageStorageManagerTest : public testing::Test {
|
| - public:
|
| - OfflinePageStorageManagerTest();
|
| - OfflinePageStorageManager* manager() { return manager_.get(); }
|
| - OfflinePageTestModel* model() { return model_.get(); }
|
| - ClientPolicyController* policy_controller() {
|
| - return policy_controller_.get();
|
| - }
|
| - TestArchiveManager* test_archive_manager() { return archive_manager_.get(); }
|
| - void OnPagesCleared(size_t pages_cleared_count, ClearStorageResult result);
|
| - void Initialize(const std::vector<PageSettings>& settings,
|
| - StorageStats stats = {kFreeSpaceNormal, 0},
|
| - TestOptions options = TestOptions::DEFAULT);
|
| - void TryClearPages();
|
| -
|
| - // testing::Test
|
| - void TearDown() override;
|
| -
|
| - base::SimpleTestClock* clock() { return clock_; }
|
| - int last_cleared_page_count() const {
|
| - return static_cast<int>(last_cleared_page_count_);
|
| - }
|
| - int total_cleared_times() const { return total_cleared_times_; }
|
| - ClearStorageResult last_clear_storage_result() const {
|
| - return last_clear_storage_result_;
|
| - }
|
| -
|
| - private:
|
| - std::unique_ptr<OfflinePageStorageManager> manager_;
|
| - std::unique_ptr<OfflinePageTestModel> model_;
|
| - std::unique_ptr<ClientPolicyController> policy_controller_;
|
| - std::unique_ptr<TestArchiveManager> archive_manager_;
|
| -
|
| - base::SimpleTestClock* clock_;
|
| -
|
| - size_t last_cleared_page_count_;
|
| - int total_cleared_times_;
|
| - ClearStorageResult last_clear_storage_result_;
|
| -};
|
| -
|
| -OfflinePageStorageManagerTest::OfflinePageStorageManagerTest()
|
| - : policy_controller_(new ClientPolicyController()),
|
| - last_cleared_page_count_(0),
|
| - total_cleared_times_(0),
|
| - last_clear_storage_result_(ClearStorageResult::SUCCESS) {}
|
| -
|
| -void OfflinePageStorageManagerTest::Initialize(
|
| - const std::vector<PageSettings>& page_settings,
|
| - StorageStats stats,
|
| - TestOptions options) {
|
| - std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock());
|
| - clock_ = clock.get();
|
| - clock_->SetNow(base::Time::Now());
|
| - model_.reset(new OfflinePageTestModel(page_settings, clock_, options));
|
| -
|
| - if (stats.free_disk_space == 0)
|
| - stats.free_disk_space = kFreeSpaceNormal;
|
| - if (stats.total_archives_size == 0) {
|
| - stats.total_archives_size = model_->GetTotalSize();
|
| - }
|
| - archive_manager_.reset(new TestArchiveManager(stats));
|
| - manager_.reset(new OfflinePageStorageManager(
|
| - model_.get(), policy_controller(), archive_manager_.get()));
|
| - manager_->SetClockForTesting(std::move(clock));
|
| -}
|
| -
|
| -void OfflinePageStorageManagerTest::TryClearPages() {
|
| - manager()->ClearPagesIfNeeded(base::Bind(
|
| - &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
|
| -}
|
| -
|
| -void OfflinePageStorageManagerTest::TearDown() {
|
| - manager_.reset();
|
| - model_.reset();
|
| -}
|
| -
|
| -void OfflinePageStorageManagerTest::OnPagesCleared(size_t pages_cleared_count,
|
| - ClearStorageResult result) {
|
| - last_cleared_page_count_ = pages_cleared_count;
|
| - total_cleared_times_++;
|
| - last_clear_storage_result_ = result;
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) {
|
| - Initialize(std::vector<PageSettings>(
|
| - {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}}));
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(2, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) {
|
| - Initialize(std::vector<PageSettings>(
|
| - {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}}));
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(45, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) {
|
| - Initialize(std::vector<PageSettings>(
|
| - {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
|
| - {1000 * (1 << 20), 0});
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(1, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestDeleteAsyncPages) {
|
| - Initialize(std::vector<PageSettings>({{kAsyncNamespace, 20, 0}}));
|
| - clock()->Advance(base::TimeDelta::FromDays(367));
|
| - TryClearPages();
|
| - EXPECT_EQ(0, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestDeletionFailed) {
|
| - Initialize(std::vector<PageSettings>(
|
| - {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}),
|
| - {kFreeSpaceNormal, 0}, TestOptions::DELETE_FAILURE);
|
| - TryClearPages();
|
| - EXPECT_EQ(20, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::DELETE_FAILURE, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestRemoveFromStoreFailure) {
|
| - Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 10, 10}}), {0, 0},
|
| - TestOptions::EXPIRE_FAILURE);
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(10, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::EXPIRE_FAILURE, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestBothFailure) {
|
| - Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 10, 10}}), {0, 0},
|
| - TestOptions::EXPIRE_AND_DELETE_FAILURES);
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(ClearStorageResult::EXPIRE_AND_DELETE_FAILURES,
|
| - last_clear_storage_result());
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestStorageTimeInterval) {
|
| - Initialize(std::vector<PageSettings>(
|
| - {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}));
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(20, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -
|
| - // Advance clock so we go over the gap, but no expired pages.
|
| - clock()->Advance(constants::kClearStorageInterval +
|
| - base::TimeDelta::FromMinutes(1));
|
| - TryClearPages();
|
| - EXPECT_EQ(0, last_cleared_page_count());
|
| - EXPECT_EQ(2, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -
|
| - // Advance clock so we are still in the gap, should be unnecessary.
|
| - clock()->Advance(constants::kClearStorageInterval -
|
| - base::TimeDelta::FromMinutes(1));
|
| - TryClearPages();
|
| - EXPECT_EQ(0, last_cleared_page_count());
|
| - EXPECT_EQ(3, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestTwoStepExpiration) {
|
| - Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 10, 10}}));
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - TryClearPages();
|
| - EXPECT_EQ(10, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -
|
| - clock()->Advance(constants::kRemovePageItemInterval +
|
| - base::TimeDelta::FromDays(1));
|
| - TryClearPages();
|
| - EXPECT_EQ(10, last_cleared_page_count());
|
| - EXPECT_EQ(2, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(10, static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) {
|
| - Initialize(std::vector<PageSettings>({{kBookmarkNamespace, 30, 0},
|
| - {kLastNNamespace, 100, 1},
|
| - {kAsyncNamespace, 40, 0}}),
|
| - {1000 * (1 << 20), 0});
|
| - clock()->Advance(base::TimeDelta::FromMinutes(30));
|
| - LifetimePolicy policy =
|
| - policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy;
|
| -
|
| - TryClearPages();
|
| - EXPECT_EQ(1, last_cleared_page_count());
|
| - EXPECT_EQ(1, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -
|
| - // Advance the clock by expiration period of last_n namespace, should be
|
| - // expiring all pages left in the namespace.
|
| - clock()->Advance(policy.expiration_period);
|
| - TryClearPages();
|
| - EXPECT_EQ(100, last_cleared_page_count());
|
| - EXPECT_EQ(2, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -
|
| - // Only 1 ms passes and no changes in pages, so no need to clear page.
|
| - clock()->Advance(base::TimeDelta::FromMilliseconds(1));
|
| - TryClearPages();
|
| - EXPECT_EQ(0, last_cleared_page_count());
|
| - EXPECT_EQ(3, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| -
|
| - // Adding more fresh pages to make it go over limit.
|
| - clock()->Advance(base::TimeDelta::FromMinutes(5));
|
| - model()->AddPages({kBookmarkNamespace, 400, 0});
|
| - int64_t total_size_before = model()->GetTotalSize();
|
| - int64_t available_space = 300 * (1 << 20); // 300 MB
|
| - test_archive_manager()->SetValues({available_space, total_size_before});
|
| - EXPECT_GE(total_size_before, constants::kOfflinePageStorageLimit *
|
| - (available_space + total_size_before));
|
| - TryClearPages();
|
| - EXPECT_LE(total_size_before * constants::kOfflinePageStorageClearThreshold,
|
| - model()->GetTotalSize());
|
| - EXPECT_EQ(4, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - EXPECT_EQ(0, static_cast<int>(model()->GetRemovedPages().size()));
|
| - int expired_page_count = last_cleared_page_count();
|
| -
|
| - // After more days, all pages should be expired and .
|
| - clock()->Advance(constants::kRemovePageItemInterval +
|
| - base::TimeDelta::FromDays(1));
|
| - TryClearPages();
|
| - EXPECT_EQ(0, model()->GetTotalSize());
|
| - EXPECT_EQ(5, total_cleared_times());
|
| - EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
|
| - // Number of removed pages should be the ones expired above and all the pages
|
| - // initially created for last_n namespace.
|
| - EXPECT_EQ(expired_page_count + 101,
|
| - static_cast<int>(model()->GetRemovedPages().size()));
|
| -}
|
| -
|
| -} // namespace offline_pages
|
|
|