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

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: Refactored to short circuit earlier if no need to clear. 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
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 StorageClearResult =
22 offline_pages::OfflinePageStorageManager::StorageClearResult;
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 };
fgorski 2016/05/19 04:14:22 nit: empty line
romax 2016/05/19 18:34:43 Done.
86 void StorageManagerTestClient::DeletePagesByOfflineId(
87 const std::vector<int64_t>& offline_ids,
88 const DeletePageCallback& callback) {
89 if (options_ & TestOptions::DELETE_FAILURE) {
90 callback.Run(DeletePageResult::STORE_FAILURE);
fgorski 2016/05/19 04:14:23 consider putting return; here, skipping else
romax 2016/05/19 18:34:42 Done.
91 } else {
92 std::set<int64_t> s(offline_ids.begin(), offline_ids.end());
93 pages_.erase(std::remove_if(pages_.begin(), pages_.end(),
94 [&s](const OfflinePageItem& page) -> bool {
95 return s.count(page.offline_id) != 0;
96 }),
97 pages_.end());
98 callback.Run(DeletePageResult::SUCCESS);
99 }
100 }
fgorski 2016/05/19 04:14:22 nit: empty line
romax 2016/05/19 18:34:42 Done.
101 int64_t StorageManagerTestClient::GetTotalSize() const {
102 int64_t res = 0;
103 for (const auto& page : pages_)
104 res += page.file_size;
105 return res;
106 }
83 107
84 StorageManagerTestClient::~StorageManagerTestClient() {} 108 StorageManagerTestClient::~StorageManagerTestClient() {}
85 109
86 void StorageManagerTestClient::AddPages(const PageSettings& setting) { 110 void StorageManagerTestClient::AddPages(const PageSettings& setting) {
87 std::string name_space = setting.name_space; 111 std::string name_space = setting.name_space;
88 int fresh_pages_count = setting.fresh_pages_count; 112 int fresh_pages_count = setting.fresh_pages_count;
89 int expired_pages_count = setting.expired_pages_count; 113 int expired_pages_count = setting.expired_pages_count;
90 base::Time now = clock()->Now(); 114 base::Time now = clock()->Now();
91 // Fresh pages. 115 // Fresh pages.
92 for (int i = 0; i < fresh_pages_count; i++) { 116 for (int i = 0; i < fresh_pages_count; i++) {
(...skipping 12 matching lines...) Expand all
105 ClientId(name_space, std::to_string(next_offline_id_)), 129 ClientId(name_space, std::to_string(next_offline_id_)),
106 base::FilePath(kFilePath), kTestFileSize); 130 base::FilePath(kFilePath), kTestFileSize);
107 next_offline_id_++; 131 next_offline_id_++;
108 page.last_access_time = now - 132 page.last_access_time = now -
109 policy_controller_->GetPolicy(name_space) 133 policy_controller_->GetPolicy(name_space)
110 .lifetime_policy.expiration_period; 134 .lifetime_policy.expiration_period;
111 pages_.push_back(page); 135 pages_.push_back(page);
112 } 136 }
113 } 137 }
114 138
139 class TestArchiveManager : public ArchiveManager {
140 public:
141 TestArchiveManager(StorageStats stats)
fgorski 2016/05/19 04:14:22 mark explicit
romax 2016/05/19 18:34:42 Done.
142 : free_space_(stats.free_disk_space),
143 total_size_(stats.total_archives_size) {}
144
145 void GetStorageStats(const base::Callback<
146 void(const ArchiveManager::StorageStats& storage_stats)>&
147 callback) const override {
148 callback.Run({free_space_, total_size_});
149 }
150
151 void SetValues(ArchiveManager::StorageStats stats) {
152 free_space_ = stats.free_disk_space;
153 total_size_ = stats.total_archives_size;
154 }
155
156 private:
157 int64_t free_space_;
fgorski 2016/05/19 04:14:22 Simply Stats stats_; ?
romax 2016/05/19 18:34:43 Done.
158 int64_t total_size_;
159 };
160
115 class OfflinePageStorageManagerTest : public testing::Test { 161 class OfflinePageStorageManagerTest : public testing::Test {
116 public: 162 public:
117 OfflinePageStorageManagerTest(); 163 OfflinePageStorageManagerTest();
118 OfflinePageStorageManager* manager() { return manager_.get(); } 164 OfflinePageStorageManager* manager() { return manager_.get(); }
119 OfflinePageStorageManager::Client* client() { return client_.get(); } 165 StorageManagerTestClient* test_client() { return client_.get(); }
120 ClientPolicyController* policy_controller() { 166 ClientPolicyController* policy_controller() {
121 return policy_controller_.get(); 167 return policy_controller_.get();
122 } 168 }
123 void OnPagesCleared(int pages_cleared_count, DeletePageResult result); 169 TestArchiveManager* test_archive_manager() { return archive_manager_.get(); }
170 void OnPagesCleared(int pages_cleared_count, StorageClearResult result);
124 void Initialize(const std::vector<PageSettings>& settings, 171 void Initialize(const std::vector<PageSettings>& settings,
172 StorageStats stats = {kFreeSpaceNormal, 0},
125 TestOptions options = TestOptions::DEFAULT); 173 TestOptions options = TestOptions::DEFAULT);
174 void TryClearPages();
126 175
127 // testing::Test 176 // testing::Test
128 void TearDown() override; 177 void TearDown() override;
129 178
130 base::SimpleTestClock* clock() { return clock_; } 179 base::SimpleTestClock* clock() { return clock_; }
131 int last_cleared_page_count() const { return last_cleared_page_count_; } 180 int last_cleared_page_count() const { return last_cleared_page_count_; }
132 DeletePageResult last_delete_page_result() const { 181 int total_cleared_times() const { return total_cleared_times_; }
133 return last_delete_page_result_; 182 StorageClearResult last_storage_clear_result() const {
183 return last_storage_clear_result_;
134 } 184 }
135 185
136 private: 186 private:
137 std::unique_ptr<OfflinePageStorageManager> manager_; 187 std::unique_ptr<OfflinePageStorageManager> manager_;
138 std::unique_ptr<OfflinePageStorageManager::Client> client_; 188 std::unique_ptr<StorageManagerTestClient> client_;
139 std::unique_ptr<ClientPolicyController> policy_controller_; 189 std::unique_ptr<ClientPolicyController> policy_controller_;
190 std::unique_ptr<TestArchiveManager> archive_manager_;
140 191
141 base::SimpleTestClock* clock_; 192 base::SimpleTestClock* clock_;
142 193
143 int last_cleared_page_count_; 194 int last_cleared_page_count_;
144 DeletePageResult last_delete_page_result_; 195 int total_cleared_times_;
196 StorageClearResult last_storage_clear_result_;
145 }; 197 };
146 198
147 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest() 199 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest()
148 : policy_controller_(new ClientPolicyController()), 200 : policy_controller_(new ClientPolicyController()),
149 last_cleared_page_count_(0), 201 last_cleared_page_count_(0),
150 last_delete_page_result_(DeletePageResult::SUCCESS) {} 202 total_cleared_times_(0),
203 last_storage_clear_result_(StorageClearResult::SUCCESS) {}
151 204
152 void OfflinePageStorageManagerTest::Initialize( 205 void OfflinePageStorageManagerTest::Initialize(
153 const std::vector<PageSettings>& page_settings, 206 const std::vector<PageSettings>& page_settings,
207 StorageStats stats,
154 TestOptions options) { 208 TestOptions options) {
155 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); 209 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock());
156 clock_ = clock.get(); 210 clock_ = clock.get();
157 clock_->SetNow(base::Time::Now()); 211 clock_->SetNow(base::Time::Now());
158 client_.reset(new StorageManagerTestClient(page_settings, clock_, options)); 212 client_.reset(new StorageManagerTestClient(page_settings, clock_, options));
159 manager_.reset(new OfflinePageStorageManager(client(), policy_controller())); 213
214 if (stats.free_disk_space == 0)
215 stats.free_disk_space = kFreeSpaceNormal;
216 if (stats.total_archives_size == 0) {
217 stats.total_archives_size = client_->GetTotalSize();
218 }
219 archive_manager_.reset(new TestArchiveManager(stats));
220 manager_.reset(new OfflinePageStorageManager(
221 client_.get(), policy_controller(), archive_manager_.get()));
160 manager_->SetClockForTesting(std::move(clock)); 222 manager_->SetClockForTesting(std::move(clock));
161 } 223 }
162 224
225 void OfflinePageStorageManagerTest::TryClearPages() {
226 manager()->ClearPagesIfNeeded(base::Bind(
227 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
228 }
229
163 void OfflinePageStorageManagerTest::TearDown() { 230 void OfflinePageStorageManagerTest::TearDown() {
164 manager_.reset(); 231 manager_.reset();
165 client_.reset(); 232 client_.reset();
166 } 233 }
167 234
168 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count, 235 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count,
169 DeletePageResult result) { 236 StorageClearResult result) {
170 last_cleared_page_count_ = pages_cleared_count; 237 last_cleared_page_count_ = pages_cleared_count;
171 last_delete_page_result_ = result; 238 total_cleared_times_++;
239 last_storage_clear_result_ = result;
172 } 240 }
173 241
174 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) { 242 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) {
175 Initialize(std::vector<PageSettings>( 243 Initialize(std::vector<PageSettings>(
176 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}})); 244 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}}));
177 clock()->Advance(base::TimeDelta::FromMinutes(30)); 245 clock()->Advance(base::TimeDelta::FromMinutes(30));
178 manager()->ClearPagesIfNeeded(base::Bind( 246 TryClearPages();
179 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
180 EXPECT_EQ(2, last_cleared_page_count()); 247 EXPECT_EQ(2, last_cleared_page_count());
181 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 248 EXPECT_EQ(1, total_cleared_times());
249 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
182 } 250 }
183 251
184 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) { 252 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) {
185 Initialize(std::vector<PageSettings>( 253 Initialize(std::vector<PageSettings>(
186 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}})); 254 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}}));
187 clock()->Advance(base::TimeDelta::FromMinutes(30)); 255 clock()->Advance(base::TimeDelta::FromMinutes(30));
188 manager()->ClearPagesIfNeeded(base::Bind( 256 TryClearPages();
189 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
190 EXPECT_EQ(45, last_cleared_page_count()); 257 EXPECT_EQ(45, last_cleared_page_count());
191 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 258 EXPECT_EQ(1, total_cleared_times());
259 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
192 } 260 }
193 261
194 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) { 262 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) {
195 Initialize(std::vector<PageSettings>( 263 Initialize(std::vector<PageSettings>(
196 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}})); 264 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
197 clock()->Advance(base::TimeDelta::FromMinutes(30)); 265 {500 * (1 << 20), 0});
198 manager()->ClearPagesIfNeeded(base::Bind( 266 clock()->Advance(base::TimeDelta::FromMinutes(30));
199 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); 267 TryClearPages();
200 int last_n_page_limit = policy_controller() 268 int last_n_page_limit = policy_controller()
201 ->GetPolicy(kLastNNamespace) 269 ->GetPolicy(kLastNNamespace)
202 .lifetime_policy.page_limit; 270 .lifetime_policy.page_limit;
203 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); 271 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
204 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 272 EXPECT_EQ(1, total_cleared_times());
205 } 273 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
274 }
275
276 TEST_F(OfflinePageStorageManagerTest, TestDeletionFailed) {
277 Initialize(std::vector<PageSettings>(
278 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}),
279 {kFreeSpaceNormal, 0}, TestOptions::DELETE_FAILURE);
280 TryClearPages();
281 EXPECT_EQ(20, last_cleared_page_count());
282 EXPECT_EQ(1, total_cleared_times());
283 EXPECT_EQ(StorageClearResult::DELETE_FAILURE, last_storage_clear_result());
284 }
285
286 TEST_F(OfflinePageStorageManagerTest, TestStorageTimeInterval) {
287 Initialize(std::vector<PageSettings>(
288 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}));
289 clock()->Advance(base::TimeDelta::FromMinutes(30));
290 TryClearPages();
291 EXPECT_EQ(20, last_cleared_page_count());
292 EXPECT_EQ(1, total_cleared_times());
293 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
294
295 // Advance clock so we go over the gap, but no expired pages.
296 clock()->Advance(kClearStorageInterval + base::TimeDelta::FromHours(1));
297 TryClearPages();
298 EXPECT_EQ(0, last_cleared_page_count());
299 EXPECT_EQ(2, total_cleared_times());
300 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
301
302 // Advance clock so we are still in the gap, should be unnecessary.
303 clock()->Advance(kClearStorageInterval - base::TimeDelta::FromHours(1));
304 TryClearPages();
305 EXPECT_EQ(0, last_cleared_page_count());
306 EXPECT_EQ(3, total_cleared_times());
307 EXPECT_EQ(StorageClearResult::UNNECESSARY, last_storage_clear_result());
308 }
309
310 TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) {
311 Initialize(std::vector<PageSettings>(
312 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}),
313 {500 * (1 << 20), 0});
314 clock()->Advance(base::TimeDelta::FromMinutes(30));
315 LifetimePolicy policy =
316 policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy;
317 int last_n_page_limit = policy.page_limit;
318
319 TryClearPages();
320 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
321 EXPECT_EQ(1, total_cleared_times());
322 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
323
324 // Advance the clock by expiration period of last_n namespace, should be
325 // deleting all pages left in the namespace.
326 clock()->Advance(policy.expiration_period);
327 TryClearPages();
328 EXPECT_EQ(last_n_page_limit, last_cleared_page_count());
329 EXPECT_EQ(2, total_cleared_times());
330 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
331
332 // Only 1 ms passes and no changes in pages, so no need to clear page.
333 clock()->Advance(base::TimeDelta::FromMilliseconds(1));
334 TryClearPages();
335 EXPECT_EQ(0, last_cleared_page_count());
336 EXPECT_EQ(3, total_cleared_times());
337 EXPECT_EQ(StorageClearResult::UNNECESSARY, last_storage_clear_result());
338
339 // Adding more fresh pages to make it go over limit.
340 clock()->Advance(base::TimeDelta::FromMinutes(5));
341 test_client()->AddPages({kBookmarkNamespace, 400, 0});
342 int64_t total_size_before = test_client()->GetTotalSize();
343 test_archive_manager()->SetValues({300 * (1 << 20), total_size_before});
344 TryClearPages();
345 EXPECT_LE(total_size_before * kOfflinePageStorageClearThreshold,
346 test_client()->GetTotalSize());
347 EXPECT_EQ(4, total_cleared_times());
348 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
349
350 // After more days, all pages should be expired and deleted.
351 clock()->Advance(base::TimeDelta::FromDays(30));
352 TryClearPages();
353 EXPECT_EQ(0, test_client()->GetTotalSize());
354 EXPECT_EQ(5, total_cleared_times());
355 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
356 }
357
206 } // namespace offline_pages 358 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698