blob: 65c2bc60cfc22af190529750882fdb9ca6836770 [file] [log] [blame]
// 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 "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/client_policy_controller.h"
#include "components/offline_pages/offline_page_item.h"
#include "components/offline_pages/offline_page_storage_manager.h"
#include "components/offline_pages/offline_page_types.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace offline_pages {
namespace {
const char kBookmarkNamespace[] = "bookmark";
const char kLastNNamespace[] = "last_n";
const GURL kTestUrl("http://example.com");
const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("TEST_FILEPATH");
const int64_t kTestFileSize = 876543LL;
enum TestOptions {
DEFAULT = 1 << 0,
DELETE_FAILED = 1 << 1,
};
struct PageSettings {
std::string name_space;
int fresh_pages_count;
int expired_pages_count;
};
} // namespace
class StorageManagerTestClient : public OfflinePageStorageManager::Client {
public:
StorageManagerTestClient(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);
}
~StorageManagerTestClient() override;
void GetAllPages(const MultipleOfflinePageItemCallback& callback) override {
callback.Run(pages_);
}
void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids,
const DeletePageCallback& callback) override {
if (options_ & TestOptions::DELETE_FAILED) {
callback.Run(DeletePageResult::STORE_FAILURE);
} else {
callback.Run(DeletePageResult::SUCCESS);
}
}
base::SimpleTestClock* clock() { return clock_; }
private:
void AddPages(const PageSettings& setting);
std::vector<OfflinePageItem> pages_;
std::unique_ptr<ClientPolicyController> policy_controller_;
base::SimpleTestClock* clock_;
TestOptions options_;
int64_t next_offline_id_;
};
StorageManagerTestClient::~StorageManagerTestClient() {}
void StorageManagerTestClient::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);
next_offline_id_++;
page.last_access_time = now;
pages_.push_back(page);
}
// 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);
next_offline_id_++;
page.last_access_time = now -
policy_controller_->GetPolicy(name_space)
.lifetime_policy.expiration_period;
pages_.push_back(page);
}
}
class OfflinePageStorageManagerTest : public testing::Test {
public:
OfflinePageStorageManagerTest();
OfflinePageStorageManager* manager() { return manager_.get(); }
OfflinePageStorageManager::Client* client() { return client_.get(); }
ClientPolicyController* policy_controller() {
return policy_controller_.get();
}
void OnPagesCleared(int pages_cleared_count, DeletePageResult result);
void Initialize(const std::vector<PageSettings>& settings,
TestOptions options = TestOptions::DEFAULT);
// testing::Test
void TearDown() override;
base::SimpleTestClock* clock() { return clock_; }
int last_cleared_page_count() const { return last_cleared_page_count_; }
DeletePageResult last_delete_page_result() const {
return last_delete_page_result_;
}
private:
std::unique_ptr<OfflinePageStorageManager> manager_;
std::unique_ptr<OfflinePageStorageManager::Client> client_;
std::unique_ptr<ClientPolicyController> policy_controller_;
base::SimpleTestClock* clock_;
int last_cleared_page_count_;
DeletePageResult last_delete_page_result_;
};
OfflinePageStorageManagerTest::OfflinePageStorageManagerTest()
: policy_controller_(new ClientPolicyController()),
last_cleared_page_count_(0),
last_delete_page_result_(DeletePageResult::SUCCESS) {}
void OfflinePageStorageManagerTest::Initialize(
const std::vector<PageSettings>& page_settings,
TestOptions options) {
std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock());
clock_ = clock.get();
clock_->SetNow(base::Time::Now());
client_.reset(new StorageManagerTestClient(page_settings, clock_, options));
manager_.reset(new OfflinePageStorageManager(client(), policy_controller()));
manager_->SetClockForTesting(std::move(clock));
}
void OfflinePageStorageManagerTest::TearDown() {
manager_.reset();
client_.reset();
}
void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count,
DeletePageResult result) {
last_cleared_page_count_ = pages_cleared_count;
last_delete_page_result_ = result;
}
TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) {
Initialize(std::vector<PageSettings>(
{{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}}));
clock()->Advance(base::TimeDelta::FromMinutes(30));
manager()->ClearPagesIfNeeded(base::Bind(
&OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
EXPECT_EQ(2, last_cleared_page_count());
EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result());
}
TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) {
Initialize(std::vector<PageSettings>(
{{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}}));
clock()->Advance(base::TimeDelta::FromMinutes(30));
manager()->ClearPagesIfNeeded(base::Bind(
&OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
EXPECT_EQ(45, last_cleared_page_count());
EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result());
}
TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) {
Initialize(std::vector<PageSettings>(
{{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}));
clock()->Advance(base::TimeDelta::FromMinutes(30));
manager()->ClearPagesIfNeeded(base::Bind(
&OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
int last_n_page_limit = policy_controller()
->GetPolicy(kLastNNamespace)
.lifetime_policy.page_limit;
EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result());
}
} // namespace offline_pages