Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: components/offline_pages/offline_page_storage_manager_unittest.cc

Issue 1986673002: [Offline Pages] Updated clearing logic in storage manager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more comments. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/offline_pages/offline_page_storage_manager.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
index 65c2bc60cfc22af190529750882fdb9ca6836770..1d1465b466a6758bcb3e75a6e57b79392c4832c2 100644
--- a/components/offline_pages/offline_page_storage_manager_unittest.cc
+++ b/components/offline_pages/offline_page_storage_manager_unittest.cc
@@ -10,24 +10,31 @@
#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_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"
+using LifetimePolicy = offline_pages::LifetimePolicy;
+using ClearStorageResult =
+ offline_pages::OfflinePageStorageManager::ClearStorageResult;
+using StorageStats = offline_pages::ArchiveManager::StorageStats;
+
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;
+const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("/data");
+const int64_t kTestFileSize = 500 * (1 << 10);
+const int64_t kFreeSpaceNormal = 100 * (1 << 20);
enum TestOptions {
DEFAULT = 1 << 0,
- DELETE_FAILED = 1 << 1,
+ DELETE_FAILURE = 1 << 1,
};
struct PageSettings {
@@ -57,18 +64,14 @@ class StorageManagerTestClient : public OfflinePageStorageManager::Client {
}
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);
- }
- }
+ const DeletePageCallback& callback) override;
+ void AddPages(const PageSettings& setting);
+
+ int64_t GetTotalSize() const;
base::SimpleTestClock* clock() { return clock_; }
private:
- void AddPages(const PageSettings& setting);
std::vector<OfflinePageItem> pages_;
@@ -81,6 +84,29 @@ class StorageManagerTestClient : public OfflinePageStorageManager::Client {
int64_t next_offline_id_;
};
+void StorageManagerTestClient::DeletePagesByOfflineId(
+ const std::vector<int64_t>& offline_ids,
+ const DeletePageCallback& callback) {
+ if (options_ & TestOptions::DELETE_FAILURE) {
+ callback.Run(DeletePageResult::STORE_FAILURE);
+ return;
+ }
+ std::set<int64_t> s(offline_ids.begin(), offline_ids.end());
+ pages_.erase(std::remove_if(pages_.begin(), pages_.end(),
+ [&s](const OfflinePageItem& page) -> bool {
+ return s.count(page.offline_id) != 0;
+ }),
+ pages_.end());
+ callback.Run(DeletePageResult::SUCCESS);
+}
+
+int64_t StorageManagerTestClient::GetTotalSize() const {
+ int64_t res = 0;
+ for (const auto& page : pages_)
+ res += page.file_size;
+ return res;
+}
+
StorageManagerTestClient::~StorageManagerTestClient() {}
void StorageManagerTestClient::AddPages(const PageSettings& setting) {
@@ -112,95 +138,217 @@ void StorageManagerTestClient::AddPages(const PageSettings& setting) {
}
}
+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(); }
- OfflinePageStorageManager::Client* client() { return client_.get(); }
+ StorageManagerTestClient* test_client() { return client_.get(); }
ClientPolicyController* policy_controller() {
return policy_controller_.get();
}
- void OnPagesCleared(int pages_cleared_count, DeletePageResult result);
+ TestArchiveManager* test_archive_manager() { return archive_manager_.get(); }
+ void OnPagesCleared(int 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 last_cleared_page_count_; }
- DeletePageResult last_delete_page_result() const {
- return last_delete_page_result_;
+ 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<OfflinePageStorageManager::Client> client_;
+ std::unique_ptr<StorageManagerTestClient> client_;
std::unique_ptr<ClientPolicyController> policy_controller_;
+ std::unique_ptr<TestArchiveManager> archive_manager_;
base::SimpleTestClock* clock_;
int last_cleared_page_count_;
- DeletePageResult last_delete_page_result_;
+ int total_cleared_times_;
+ ClearStorageResult last_clear_storage_result_;
};
OfflinePageStorageManagerTest::OfflinePageStorageManagerTest()
: policy_controller_(new ClientPolicyController()),
last_cleared_page_count_(0),
- last_delete_page_result_(DeletePageResult::SUCCESS) {}
+ 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());
client_.reset(new StorageManagerTestClient(page_settings, clock_, options));
- manager_.reset(new OfflinePageStorageManager(client(), policy_controller()));
+
+ if (stats.free_disk_space == 0)
+ stats.free_disk_space = kFreeSpaceNormal;
+ if (stats.total_archives_size == 0) {
+ stats.total_archives_size = client_->GetTotalSize();
+ }
+ archive_manager_.reset(new TestArchiveManager(stats));
+ manager_.reset(new OfflinePageStorageManager(
+ client_.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();
client_.reset();
}
void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count,
- DeletePageResult result) {
+ ClearStorageResult result) {
last_cleared_page_count_ = pages_cleared_count;
- last_delete_page_result_ = result;
+ 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));
- manager()->ClearPagesIfNeeded(base::Bind(
- &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
+ TryClearPages();
EXPECT_EQ(2, last_cleared_page_count());
- EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result());
+ EXPECT_EQ(1, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_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)));
+ TryClearPages();
EXPECT_EQ(45, last_cleared_page_count());
- EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result());
+ EXPECT_EQ(1, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
}
TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) {
Initialize(std::vector<PageSettings>(
- {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}));
+ {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
+ {500 * (1 << 20), 0});
clock()->Advance(base::TimeDelta::FromMinutes(30));
- manager()->ClearPagesIfNeeded(base::Bind(
- &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
+ TryClearPages();
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());
+ EXPECT_EQ(1, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
+}
+
+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());
+}
+
+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());
+
+ // Advance clock so we go over the gap, but no expired pages.
+ clock()->Advance(kClearStorageInterval + base::TimeDelta::FromHours(1));
+ TryClearPages();
+ EXPECT_EQ(0, last_cleared_page_count());
+ EXPECT_EQ(2, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
+
+ // Advance clock so we are still in the gap, should be unnecessary.
+ clock()->Advance(kClearStorageInterval - base::TimeDelta::FromHours(1));
+ TryClearPages();
+ EXPECT_EQ(0, last_cleared_page_count());
+ EXPECT_EQ(3, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result());
+}
+
+TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) {
+ Initialize(std::vector<PageSettings>(
+ {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
+ {500 * (1 << 20), 0});
+ clock()->Advance(base::TimeDelta::FromMinutes(30));
+ LifetimePolicy policy =
+ policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy;
+ int last_n_page_limit = policy.page_limit;
+
+ TryClearPages();
+ EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
+ EXPECT_EQ(1, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
+
+ // Advance the clock by expiration period of last_n namespace, should be
+ // deleting all pages left in the namespace.
+ clock()->Advance(policy.expiration_period);
+ TryClearPages();
+ EXPECT_EQ(last_n_page_limit, last_cleared_page_count());
+ EXPECT_EQ(2, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
+
+ // 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());
+
+ // Adding more fresh pages to make it go over limit.
+ clock()->Advance(base::TimeDelta::FromMinutes(5));
+ test_client()->AddPages({kBookmarkNamespace, 400, 0});
+ int64_t total_size_before = test_client()->GetTotalSize();
+ test_archive_manager()->SetValues({300 * (1 << 20), total_size_before});
+ TryClearPages();
+ EXPECT_LE(total_size_before * kOfflinePageStorageClearThreshold,
+ test_client()->GetTotalSize());
+ EXPECT_EQ(4, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
+
+ // After more days, all pages should be expired and deleted.
+ clock()->Advance(base::TimeDelta::FromDays(30));
+ TryClearPages();
+ EXPECT_EQ(0, test_client()->GetTotalSize());
+ EXPECT_EQ(5, total_cleared_times());
+ EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
}
+
} // namespace offline_pages
« no previous file with comments | « components/offline_pages/offline_page_storage_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698