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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « components/offline_pages/offline_page_storage_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/offline_pages/offline_page_storage_manager.h" 5 #include "components/offline_pages/offline_page_storage_manager.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/test/simple_test_clock.h" 11 #include "base/test/simple_test_clock.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "components/offline_pages/archive_manager.h"
13 #include "components/offline_pages/client_policy_controller.h" 14 #include "components/offline_pages/client_policy_controller.h"
14 #include "components/offline_pages/offline_page_item.h" 15 #include "components/offline_pages/offline_page_item.h"
15 #include "components/offline_pages/offline_page_storage_manager.h" 16 #include "components/offline_pages/offline_page_storage_manager.h"
16 #include "components/offline_pages/offline_page_types.h" 17 #include "components/offline_pages/offline_page_types.h"
17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
18 19
20 using LifetimePolicy = offline_pages::LifetimePolicy;
21 using ClearStorageResult =
22 offline_pages::OfflinePageStorageManager::ClearStorageResult;
23 using StorageStats = offline_pages::ArchiveManager::StorageStats;
24
19 namespace offline_pages { 25 namespace offline_pages {
20 26
21 namespace { 27 namespace {
22 const char kBookmarkNamespace[] = "bookmark"; 28 const char kBookmarkNamespace[] = "bookmark";
23 const char kLastNNamespace[] = "last_n"; 29 const char kLastNNamespace[] = "last_n";
24 const GURL kTestUrl("http://example.com"); 30 const GURL kTestUrl("http://example.com");
25 const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("TEST_FILEPATH"); 31 const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("/data");
26 const int64_t kTestFileSize = 876543LL; 32 const int64_t kTestFileSize = 500 * (1 << 10);
33 const int64_t kFreeSpaceNormal = 100 * (1 << 20);
27 34
28 enum TestOptions { 35 enum TestOptions {
29 DEFAULT = 1 << 0, 36 DEFAULT = 1 << 0,
30 DELETE_FAILED = 1 << 1, 37 DELETE_FAILURE = 1 << 1,
31 }; 38 };
32 39
33 struct PageSettings { 40 struct PageSettings {
34 std::string name_space; 41 std::string name_space;
35 int fresh_pages_count; 42 int fresh_pages_count;
36 int expired_pages_count; 43 int expired_pages_count;
37 }; 44 };
38 } // namespace 45 } // namespace
39 46
40 class StorageManagerTestClient : public OfflinePageStorageManager::Client { 47 class StorageManagerTestClient : public OfflinePageStorageManager::Client {
41 public: 48 public:
42 StorageManagerTestClient(std::vector<PageSettings> page_settings, 49 StorageManagerTestClient(std::vector<PageSettings> page_settings,
43 base::SimpleTestClock* clock, 50 base::SimpleTestClock* clock,
44 TestOptions options = TestOptions::DEFAULT) 51 TestOptions options = TestOptions::DEFAULT)
45 : policy_controller_(new ClientPolicyController()), 52 : policy_controller_(new ClientPolicyController()),
46 clock_(clock), 53 clock_(clock),
47 options_(options), 54 options_(options),
48 next_offline_id_(0) { 55 next_offline_id_(0) {
49 for (const auto& setting : page_settings) 56 for (const auto& setting : page_settings)
50 AddPages(setting); 57 AddPages(setting);
51 } 58 }
52 59
53 ~StorageManagerTestClient() override; 60 ~StorageManagerTestClient() override;
54 61
55 void GetAllPages(const MultipleOfflinePageItemCallback& callback) override { 62 void GetAllPages(const MultipleOfflinePageItemCallback& callback) override {
56 callback.Run(pages_); 63 callback.Run(pages_);
57 } 64 }
58 65
59 void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids, 66 void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids,
60 const DeletePageCallback& callback) override { 67 const DeletePageCallback& callback) override;
61 if (options_ & TestOptions::DELETE_FAILED) { 68 void AddPages(const PageSettings& setting);
62 callback.Run(DeletePageResult::STORE_FAILURE); 69
63 } else { 70 int64_t GetTotalSize() const;
64 callback.Run(DeletePageResult::SUCCESS);
65 }
66 }
67 71
68 base::SimpleTestClock* clock() { return clock_; } 72 base::SimpleTestClock* clock() { return clock_; }
69 73
70 private: 74 private:
71 void AddPages(const PageSettings& setting);
72 75
73 std::vector<OfflinePageItem> pages_; 76 std::vector<OfflinePageItem> pages_;
74 77
75 std::unique_ptr<ClientPolicyController> policy_controller_; 78 std::unique_ptr<ClientPolicyController> policy_controller_;
76 79
77 base::SimpleTestClock* clock_; 80 base::SimpleTestClock* clock_;
78 81
79 TestOptions options_; 82 TestOptions options_;
80 83
81 int64_t next_offline_id_; 84 int64_t next_offline_id_;
82 }; 85 };
83 86
87 void StorageManagerTestClient::DeletePagesByOfflineId(
88 const std::vector<int64_t>& offline_ids,
89 const DeletePageCallback& callback) {
90 if (options_ & TestOptions::DELETE_FAILURE) {
91 callback.Run(DeletePageResult::STORE_FAILURE);
92 return;
93 }
94 std::set<int64_t> s(offline_ids.begin(), offline_ids.end());
95 pages_.erase(std::remove_if(pages_.begin(), pages_.end(),
96 [&s](const OfflinePageItem& page) -> bool {
97 return s.count(page.offline_id) != 0;
98 }),
99 pages_.end());
100 callback.Run(DeletePageResult::SUCCESS);
101 }
102
103 int64_t StorageManagerTestClient::GetTotalSize() const {
104 int64_t res = 0;
105 for (const auto& page : pages_)
106 res += page.file_size;
107 return res;
108 }
109
84 StorageManagerTestClient::~StorageManagerTestClient() {} 110 StorageManagerTestClient::~StorageManagerTestClient() {}
85 111
86 void StorageManagerTestClient::AddPages(const PageSettings& setting) { 112 void StorageManagerTestClient::AddPages(const PageSettings& setting) {
87 std::string name_space = setting.name_space; 113 std::string name_space = setting.name_space;
88 int fresh_pages_count = setting.fresh_pages_count; 114 int fresh_pages_count = setting.fresh_pages_count;
89 int expired_pages_count = setting.expired_pages_count; 115 int expired_pages_count = setting.expired_pages_count;
90 base::Time now = clock()->Now(); 116 base::Time now = clock()->Now();
91 // Fresh pages. 117 // Fresh pages.
92 for (int i = 0; i < fresh_pages_count; i++) { 118 for (int i = 0; i < fresh_pages_count; i++) {
93 OfflinePageItem page = 119 OfflinePageItem page =
(...skipping 11 matching lines...) Expand all
105 ClientId(name_space, std::to_string(next_offline_id_)), 131 ClientId(name_space, std::to_string(next_offline_id_)),
106 base::FilePath(kFilePath), kTestFileSize); 132 base::FilePath(kFilePath), kTestFileSize);
107 next_offline_id_++; 133 next_offline_id_++;
108 page.last_access_time = now - 134 page.last_access_time = now -
109 policy_controller_->GetPolicy(name_space) 135 policy_controller_->GetPolicy(name_space)
110 .lifetime_policy.expiration_period; 136 .lifetime_policy.expiration_period;
111 pages_.push_back(page); 137 pages_.push_back(page);
112 } 138 }
113 } 139 }
114 140
141 class TestArchiveManager : public ArchiveManager {
142 public:
143 explicit TestArchiveManager(StorageStats stats) : stats_(stats) {}
144
145 void GetStorageStats(const base::Callback<
146 void(const ArchiveManager::StorageStats& storage_stats)>&
147 callback) const override {
148 callback.Run(stats_);
149 }
150
151 void SetValues(ArchiveManager::StorageStats stats) { stats_ = stats; }
152
153 private:
154 StorageStats stats_;
155 };
156
115 class OfflinePageStorageManagerTest : public testing::Test { 157 class OfflinePageStorageManagerTest : public testing::Test {
116 public: 158 public:
117 OfflinePageStorageManagerTest(); 159 OfflinePageStorageManagerTest();
118 OfflinePageStorageManager* manager() { return manager_.get(); } 160 OfflinePageStorageManager* manager() { return manager_.get(); }
119 OfflinePageStorageManager::Client* client() { return client_.get(); } 161 StorageManagerTestClient* test_client() { return client_.get(); }
120 ClientPolicyController* policy_controller() { 162 ClientPolicyController* policy_controller() {
121 return policy_controller_.get(); 163 return policy_controller_.get();
122 } 164 }
123 void OnPagesCleared(int pages_cleared_count, DeletePageResult result); 165 TestArchiveManager* test_archive_manager() { return archive_manager_.get(); }
166 void OnPagesCleared(int pages_cleared_count, ClearStorageResult result);
124 void Initialize(const std::vector<PageSettings>& settings, 167 void Initialize(const std::vector<PageSettings>& settings,
168 StorageStats stats = {kFreeSpaceNormal, 0},
125 TestOptions options = TestOptions::DEFAULT); 169 TestOptions options = TestOptions::DEFAULT);
170 void TryClearPages();
126 171
127 // testing::Test 172 // testing::Test
128 void TearDown() override; 173 void TearDown() override;
129 174
130 base::SimpleTestClock* clock() { return clock_; } 175 base::SimpleTestClock* clock() { return clock_; }
131 int last_cleared_page_count() const { return last_cleared_page_count_; } 176 int last_cleared_page_count() const { return last_cleared_page_count_; }
132 DeletePageResult last_delete_page_result() const { 177 int total_cleared_times() const { return total_cleared_times_; }
133 return last_delete_page_result_; 178 ClearStorageResult last_clear_storage_result() const {
179 return last_clear_storage_result_;
134 } 180 }
135 181
136 private: 182 private:
137 std::unique_ptr<OfflinePageStorageManager> manager_; 183 std::unique_ptr<OfflinePageStorageManager> manager_;
138 std::unique_ptr<OfflinePageStorageManager::Client> client_; 184 std::unique_ptr<StorageManagerTestClient> client_;
139 std::unique_ptr<ClientPolicyController> policy_controller_; 185 std::unique_ptr<ClientPolicyController> policy_controller_;
186 std::unique_ptr<TestArchiveManager> archive_manager_;
140 187
141 base::SimpleTestClock* clock_; 188 base::SimpleTestClock* clock_;
142 189
143 int last_cleared_page_count_; 190 int last_cleared_page_count_;
144 DeletePageResult last_delete_page_result_; 191 int total_cleared_times_;
192 ClearStorageResult last_clear_storage_result_;
145 }; 193 };
146 194
147 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest() 195 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest()
148 : policy_controller_(new ClientPolicyController()), 196 : policy_controller_(new ClientPolicyController()),
149 last_cleared_page_count_(0), 197 last_cleared_page_count_(0),
150 last_delete_page_result_(DeletePageResult::SUCCESS) {} 198 total_cleared_times_(0),
199 last_clear_storage_result_(ClearStorageResult::SUCCESS) {}
151 200
152 void OfflinePageStorageManagerTest::Initialize( 201 void OfflinePageStorageManagerTest::Initialize(
153 const std::vector<PageSettings>& page_settings, 202 const std::vector<PageSettings>& page_settings,
203 StorageStats stats,
154 TestOptions options) { 204 TestOptions options) {
155 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); 205 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock());
156 clock_ = clock.get(); 206 clock_ = clock.get();
157 clock_->SetNow(base::Time::Now()); 207 clock_->SetNow(base::Time::Now());
158 client_.reset(new StorageManagerTestClient(page_settings, clock_, options)); 208 client_.reset(new StorageManagerTestClient(page_settings, clock_, options));
159 manager_.reset(new OfflinePageStorageManager(client(), policy_controller())); 209
210 if (stats.free_disk_space == 0)
211 stats.free_disk_space = kFreeSpaceNormal;
212 if (stats.total_archives_size == 0) {
213 stats.total_archives_size = client_->GetTotalSize();
214 }
215 archive_manager_.reset(new TestArchiveManager(stats));
216 manager_.reset(new OfflinePageStorageManager(
217 client_.get(), policy_controller(), archive_manager_.get()));
160 manager_->SetClockForTesting(std::move(clock)); 218 manager_->SetClockForTesting(std::move(clock));
161 } 219 }
162 220
221 void OfflinePageStorageManagerTest::TryClearPages() {
222 manager()->ClearPagesIfNeeded(base::Bind(
223 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
224 }
225
163 void OfflinePageStorageManagerTest::TearDown() { 226 void OfflinePageStorageManagerTest::TearDown() {
164 manager_.reset(); 227 manager_.reset();
165 client_.reset(); 228 client_.reset();
166 } 229 }
167 230
168 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count, 231 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count,
169 DeletePageResult result) { 232 ClearStorageResult result) {
170 last_cleared_page_count_ = pages_cleared_count; 233 last_cleared_page_count_ = pages_cleared_count;
171 last_delete_page_result_ = result; 234 total_cleared_times_++;
235 last_clear_storage_result_ = result;
172 } 236 }
173 237
174 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) { 238 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) {
175 Initialize(std::vector<PageSettings>( 239 Initialize(std::vector<PageSettings>(
176 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}})); 240 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}}));
177 clock()->Advance(base::TimeDelta::FromMinutes(30)); 241 clock()->Advance(base::TimeDelta::FromMinutes(30));
178 manager()->ClearPagesIfNeeded(base::Bind( 242 TryClearPages();
179 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
180 EXPECT_EQ(2, last_cleared_page_count()); 243 EXPECT_EQ(2, last_cleared_page_count());
181 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 244 EXPECT_EQ(1, total_cleared_times());
245 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
182 } 246 }
183 247
184 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) { 248 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) {
185 Initialize(std::vector<PageSettings>( 249 Initialize(std::vector<PageSettings>(
186 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}})); 250 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}}));
187 clock()->Advance(base::TimeDelta::FromMinutes(30)); 251 clock()->Advance(base::TimeDelta::FromMinutes(30));
188 manager()->ClearPagesIfNeeded(base::Bind( 252 TryClearPages();
189 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
190 EXPECT_EQ(45, last_cleared_page_count()); 253 EXPECT_EQ(45, last_cleared_page_count());
191 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 254 EXPECT_EQ(1, total_cleared_times());
255 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
192 } 256 }
193 257
194 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) { 258 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) {
195 Initialize(std::vector<PageSettings>( 259 Initialize(std::vector<PageSettings>(
196 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}})); 260 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
197 clock()->Advance(base::TimeDelta::FromMinutes(30)); 261 {500 * (1 << 20), 0});
198 manager()->ClearPagesIfNeeded(base::Bind( 262 clock()->Advance(base::TimeDelta::FromMinutes(30));
199 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); 263 TryClearPages();
200 int last_n_page_limit = policy_controller() 264 int last_n_page_limit = policy_controller()
201 ->GetPolicy(kLastNNamespace) 265 ->GetPolicy(kLastNNamespace)
202 .lifetime_policy.page_limit; 266 .lifetime_policy.page_limit;
203 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); 267 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
204 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 268 EXPECT_EQ(1, total_cleared_times());
205 } 269 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
270 }
271
272 TEST_F(OfflinePageStorageManagerTest, TestDeletionFailed) {
273 Initialize(std::vector<PageSettings>(
274 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}),
275 {kFreeSpaceNormal, 0}, TestOptions::DELETE_FAILURE);
276 TryClearPages();
277 EXPECT_EQ(20, last_cleared_page_count());
278 EXPECT_EQ(1, total_cleared_times());
279 EXPECT_EQ(ClearStorageResult::DELETE_FAILURE, last_clear_storage_result());
280 }
281
282 TEST_F(OfflinePageStorageManagerTest, TestStorageTimeInterval) {
283 Initialize(std::vector<PageSettings>(
284 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}));
285 clock()->Advance(base::TimeDelta::FromMinutes(30));
286 TryClearPages();
287 EXPECT_EQ(20, last_cleared_page_count());
288 EXPECT_EQ(1, total_cleared_times());
289 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
290
291 // Advance clock so we go over the gap, but no expired pages.
292 clock()->Advance(kClearStorageInterval + base::TimeDelta::FromHours(1));
293 TryClearPages();
294 EXPECT_EQ(0, last_cleared_page_count());
295 EXPECT_EQ(2, total_cleared_times());
296 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
297
298 // Advance clock so we are still in the gap, should be unnecessary.
299 clock()->Advance(kClearStorageInterval - base::TimeDelta::FromHours(1));
300 TryClearPages();
301 EXPECT_EQ(0, last_cleared_page_count());
302 EXPECT_EQ(3, total_cleared_times());
303 EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result());
304 }
305
306 TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) {
307 Initialize(std::vector<PageSettings>(
308 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
309 {500 * (1 << 20), 0});
310 clock()->Advance(base::TimeDelta::FromMinutes(30));
311 LifetimePolicy policy =
312 policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy;
313 int last_n_page_limit = policy.page_limit;
314
315 TryClearPages();
316 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
317 EXPECT_EQ(1, total_cleared_times());
318 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
319
320 // Advance the clock by expiration period of last_n namespace, should be
321 // deleting all pages left in the namespace.
322 clock()->Advance(policy.expiration_period);
323 TryClearPages();
324 EXPECT_EQ(last_n_page_limit, last_cleared_page_count());
325 EXPECT_EQ(2, total_cleared_times());
326 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
327
328 // Only 1 ms passes and no changes in pages, so no need to clear page.
329 clock()->Advance(base::TimeDelta::FromMilliseconds(1));
330 TryClearPages();
331 EXPECT_EQ(0, last_cleared_page_count());
332 EXPECT_EQ(3, total_cleared_times());
333 EXPECT_EQ(ClearStorageResult::UNNECESSARY, last_clear_storage_result());
334
335 // Adding more fresh pages to make it go over limit.
336 clock()->Advance(base::TimeDelta::FromMinutes(5));
337 test_client()->AddPages({kBookmarkNamespace, 400, 0});
338 int64_t total_size_before = test_client()->GetTotalSize();
339 test_archive_manager()->SetValues({300 * (1 << 20), total_size_before});
340 TryClearPages();
341 EXPECT_LE(total_size_before * kOfflinePageStorageClearThreshold,
342 test_client()->GetTotalSize());
343 EXPECT_EQ(4, total_cleared_times());
344 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
345
346 // After more days, all pages should be expired and deleted.
347 clock()->Advance(base::TimeDelta::FromDays(30));
348 TryClearPages();
349 EXPECT_EQ(0, test_client()->GetTotalSize());
350 EXPECT_EQ(5, total_cleared_times());
351 EXPECT_EQ(ClearStorageResult::SUCCESS, last_clear_storage_result());
352 }
353
206 } // namespace offline_pages 354 } // namespace offline_pages
OLDNEW
« 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