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

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: fixing trybots. 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/client_policy_controller.h" 13 #include "components/offline_pages/client_policy_controller.h"
14 #include "components/offline_pages/offline_page_item.h" 14 #include "components/offline_pages/offline_page_item.h"
15 #include "components/offline_pages/offline_page_storage_manager.h" 15 #include "components/offline_pages/offline_page_storage_manager.h"
16 #include "components/offline_pages/offline_page_types.h" 16 #include "components/offline_pages/offline_page_types.h"
17 #include "components/prefs/pref_registry_simple.h"
18 #include "components/prefs/pref_service.h"
19 #include "components/prefs/testing_pref_service.h"
17 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
18 21
22 using StorageClearResult =
23 offline_pages::OfflinePageStorageManager::StorageClearResult;
24 using LifetimePolicy = offline_pages::LifetimePolicy;
25
19 namespace offline_pages { 26 namespace offline_pages {
20 27
21 namespace { 28 namespace {
22 const char kBookmarkNamespace[] = "bookmark"; 29 const char kBookmarkNamespace[] = "bookmark";
23 const char kLastNNamespace[] = "last_n"; 30 const char kLastNNamespace[] = "last_n";
24 const GURL kTestUrl("http://example.com"); 31 const GURL kTestUrl("http://example.com");
25 const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("TEST_FILEPATH"); 32 const base::FilePath::CharType kFilePath[] = FILE_PATH_LITERAL("/data");
26 const int64_t kTestFileSize = 876543LL; 33 const int64_t kTestFileSize = 87654LL;
27 34
28 enum TestOptions { 35 enum TestOptions {
29 DEFAULT = 1 << 0, 36 DEFAULT = 1 << 0,
30 DELETE_FAILED = 1 << 1, 37 DELETE_FAIL = 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 void GetAllPages(const MultipleOfflinePageItemCallback& callback) override { 60 void GetAllPages(const MultipleOfflinePageItemCallback& callback) override {
54 callback.Run(pages_); 61 callback.Run(pages_);
55 } 62 }
56 63
57 void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids, 64 void DeletePagesByOfflineId(const std::vector<int64_t>& offline_ids,
58 const DeletePageCallback& callback) override { 65 const DeletePageCallback& callback) override;
59 if (options_ & TestOptions::DELETE_FAILED) { 66 void AddPages(const PageSettings& setting);
60 callback.Run(DeletePageResult::STORE_FAILURE);
61 } else {
62 callback.Run(DeletePageResult::SUCCESS);
63 }
64 }
65 67
66 base::SimpleTestClock* clock() { return clock_; } 68 base::SimpleTestClock* clock() { return clock_; }
67 69
68 private: 70 private:
69 void AddPages(const PageSettings& setting);
70 71
71 std::vector<OfflinePageItem> pages_; 72 std::vector<OfflinePageItem> pages_;
72 73
73 std::unique_ptr<ClientPolicyController> policy_controller_; 74 std::unique_ptr<ClientPolicyController> policy_controller_;
74 75
75 base::SimpleTestClock* clock_; 76 base::SimpleTestClock* clock_;
76 77
77 TestOptions options_; 78 TestOptions options_;
78 79
79 int64_t next_offline_id_; 80 int64_t next_offline_id_;
80 }; 81 };
82 void StorageManagerTestClient::DeletePagesByOfflineId(
83 const std::vector<int64_t>& offline_ids,
84 const DeletePageCallback& callback) {
85 if (options_ & TestOptions::DELETE_FAIL) {
86 callback.Run(DeletePageResult::STORE_FAILURE);
87 } else {
88 std::set<int64_t> s(offline_ids.begin(), offline_ids.end());
89 pages_.erase(std::remove_if(pages_.begin(), pages_.end(),
90 [&s](const OfflinePageItem& page) -> bool {
91 return s.count(page.offline_id) != 0;
92 }),
93 pages_.end());
94 callback.Run(DeletePageResult::SUCCESS);
95 }
96 }
81 97
82 void StorageManagerTestClient::AddPages(const PageSettings& setting) { 98 void StorageManagerTestClient::AddPages(const PageSettings& setting) {
83 std::string name_space = setting.name_space; 99 std::string name_space = setting.name_space;
84 int fresh_pages_count = setting.fresh_pages_count; 100 int fresh_pages_count = setting.fresh_pages_count;
85 int expired_pages_count = setting.expired_pages_count; 101 int expired_pages_count = setting.expired_pages_count;
86 base::Time now = clock()->Now(); 102 base::Time now = clock()->Now();
87 // Fresh pages. 103 // Fresh pages.
88 for (int i = 0; i < fresh_pages_count; i++) { 104 for (int i = 0; i < fresh_pages_count; i++) {
89 OfflinePageItem page = 105 OfflinePageItem page =
90 OfflinePageItem(kTestUrl, next_offline_id_, 106 OfflinePageItem(kTestUrl, next_offline_id_,
(...skipping 18 matching lines...) Expand all
109 } 125 }
110 126
111 class OfflinePageStorageManagerTest : public testing::Test { 127 class OfflinePageStorageManagerTest : public testing::Test {
112 public: 128 public:
113 OfflinePageStorageManagerTest(); 129 OfflinePageStorageManagerTest();
114 OfflinePageStorageManager* manager() { return manager_.get(); } 130 OfflinePageStorageManager* manager() { return manager_.get(); }
115 OfflinePageStorageManager::Client* client() { return client_.get(); } 131 OfflinePageStorageManager::Client* client() { return client_.get(); }
116 ClientPolicyController* policy_controller() { 132 ClientPolicyController* policy_controller() {
117 return policy_controller_.get(); 133 return policy_controller_.get();
118 } 134 }
119 void OnPagesCleared(int pages_cleared_count, DeletePageResult result); 135 PrefService* prefs() { return prefs_.get(); }
136 void OnPagesCleared(int pages_cleared_count, StorageClearResult result);
120 void Initialize(const std::vector<PageSettings>& settings, 137 void Initialize(const std::vector<PageSettings>& settings,
121 TestOptions options = TestOptions::DEFAULT); 138 TestOptions options = TestOptions::DEFAULT);
122 139
123 // testing::Test 140 // testing::Test
124 void TearDown() override; 141 void TearDown() override;
125 142
126 base::SimpleTestClock* clock() { return clock_; } 143 base::SimpleTestClock* clock() { return clock_; }
127 int last_cleared_page_count() const { return last_cleared_page_count_; } 144 int last_cleared_page_count() const { return last_cleared_page_count_; }
128 DeletePageResult last_delete_page_result() const { 145 int total_cleared_times() const { return total_cleared_times_; }
129 return last_delete_page_result_; 146 StorageClearResult last_storage_clear_result() const {
147 return last_storage_clear_result_;
130 } 148 }
131 149
132 private: 150 private:
133 std::unique_ptr<OfflinePageStorageManager> manager_; 151 std::unique_ptr<OfflinePageStorageManager> manager_;
134 std::unique_ptr<OfflinePageStorageManager::Client> client_; 152 std::unique_ptr<OfflinePageStorageManager::Client> client_;
135 std::unique_ptr<ClientPolicyController> policy_controller_; 153 std::unique_ptr<ClientPolicyController> policy_controller_;
154 std::unique_ptr<PrefService> prefs_;
136 155
137 base::SimpleTestClock* clock_; 156 base::SimpleTestClock* clock_;
138 157
139 int last_cleared_page_count_; 158 int last_cleared_page_count_;
140 DeletePageResult last_delete_page_result_; 159 int total_cleared_times_;
160 StorageClearResult last_storage_clear_result_;
141 }; 161 };
142 162
143 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest() 163 OfflinePageStorageManagerTest::OfflinePageStorageManagerTest()
144 : policy_controller_(new ClientPolicyController()), 164 : policy_controller_(new ClientPolicyController()),
145 last_cleared_page_count_(0), 165 last_cleared_page_count_(0),
146 last_delete_page_result_(DeletePageResult::SUCCESS) {} 166 total_cleared_times_(0),
167 last_storage_clear_result_(StorageClearResult::SUCCESS) {}
147 168
148 void OfflinePageStorageManagerTest::Initialize( 169 void OfflinePageStorageManagerTest::Initialize(
149 const std::vector<PageSettings>& page_settings, 170 const std::vector<PageSettings>& page_settings,
150 TestOptions options) { 171 TestOptions options) {
151 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); 172 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock());
152 clock_ = clock.get(); 173 clock_ = clock.get();
153 clock_->SetNow(base::Time::Now()); 174 clock_->SetNow(base::Time::Now());
175 std::unique_ptr<TestingPrefServiceSimple> prefs(
176 new TestingPrefServiceSimple());
177 prefs->registry()->RegisterInt64Pref(kOfflinePageStorageLastClearedTime, 0);
178 prefs_ = std::move(prefs);
154 client_.reset(new StorageManagerTestClient(page_settings, clock_, options)); 179 client_.reset(new StorageManagerTestClient(page_settings, clock_, options));
155 manager_.reset(new OfflinePageStorageManager(client(), policy_controller())); 180 manager_.reset(new OfflinePageStorageManager(client(), policy_controller(),
181 prefs_.get()));
156 manager_->SetClockForTesting(std::move(clock)); 182 manager_->SetClockForTesting(std::move(clock));
157 } 183 }
158 184
159 void OfflinePageStorageManagerTest::TearDown() { 185 void OfflinePageStorageManagerTest::TearDown() {
160 manager_.reset(); 186 manager_.reset();
161 client_.reset(); 187 client_.reset();
162 } 188 }
163 189
164 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count, 190 void OfflinePageStorageManagerTest::OnPagesCleared(int pages_cleared_count,
165 DeletePageResult result) { 191 StorageClearResult result) {
166 last_cleared_page_count_ = pages_cleared_count; 192 last_cleared_page_count_ = pages_cleared_count;
167 last_delete_page_result_ = result; 193 total_cleared_times_++;
194 last_storage_clear_result_ = result;
168 } 195 }
169 196
170 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) { 197 TEST_F(OfflinePageStorageManagerTest, TestClearPagesLessThanLimit) {
171 Initialize(std::vector<PageSettings>( 198 Initialize(std::vector<PageSettings>(
172 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}})); 199 {{kBookmarkNamespace, 1, 1}, {kLastNNamespace, 1, 1}}));
173 clock()->Advance(base::TimeDelta::FromMinutes(30)); 200 clock()->Advance(base::TimeDelta::FromMinutes(30));
174 manager()->ClearPagesIfNeeded(base::Bind( 201 manager()->ClearPagesIfNeeded(base::Bind(
175 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); 202 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
176 EXPECT_EQ(2, last_cleared_page_count()); 203 EXPECT_EQ(2, last_cleared_page_count());
177 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 204 EXPECT_EQ(1, total_cleared_times());
205 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
178 } 206 }
179 207
180 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) { 208 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreThanLimit) {
181 Initialize(std::vector<PageSettings>( 209 Initialize(std::vector<PageSettings>(
182 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}})); 210 {{kBookmarkNamespace, 10, 15}, {kLastNNamespace, 5, 30}}));
183 clock()->Advance(base::TimeDelta::FromMinutes(30)); 211 clock()->Advance(base::TimeDelta::FromMinutes(30));
184 manager()->ClearPagesIfNeeded(base::Bind( 212 manager()->ClearPagesIfNeeded(base::Bind(
185 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); 213 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
186 EXPECT_EQ(45, last_cleared_page_count()); 214 EXPECT_EQ(45, last_cleared_page_count());
187 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 215 EXPECT_EQ(1, total_cleared_times());
216 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
188 } 217 }
189 218
190 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) { 219 TEST_F(OfflinePageStorageManagerTest, TestClearPagesMoreFreshPages) {
191 Initialize(std::vector<PageSettings>( 220 Initialize(std::vector<PageSettings>(
192 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}})); 221 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}));
193 clock()->Advance(base::TimeDelta::FromMinutes(30)); 222 clock()->Advance(base::TimeDelta::FromMinutes(30));
194 manager()->ClearPagesIfNeeded(base::Bind( 223 manager()->ClearPagesIfNeeded(base::Bind(
195 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this))); 224 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
196 int last_n_page_limit = policy_controller() 225 int last_n_page_limit = policy_controller()
197 ->GetPolicy(kLastNNamespace) 226 ->GetPolicy(kLastNNamespace)
198 .lifetime_policy.page_limit; 227 .lifetime_policy.page_limit;
199 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count()); 228 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
200 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_page_result()); 229 EXPECT_EQ(1, total_cleared_times());
230 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
201 } 231 }
232
233 TEST_F(OfflinePageStorageManagerTest, TestDeletionFailed) {
234 Initialize(std::vector<PageSettings>(
235 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}),
236 TestOptions::DELETE_FAIL);
237 manager()->ClearPagesIfNeeded(base::Bind(
238 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
239 EXPECT_EQ(20, last_cleared_page_count());
240 EXPECT_EQ(1, total_cleared_times());
241 EXPECT_EQ(StorageClearResult::DELETE_FAIL, last_storage_clear_result());
242 }
243
244 TEST_F(OfflinePageStorageManagerTest, TestStorageTimeGap) {
245 Initialize(std::vector<PageSettings>(
246 {{kBookmarkNamespace, 10, 10}, {kLastNNamespace, 10, 10}}));
247 clock()->Advance(base::TimeDelta::FromMinutes(30));
248 manager()->ClearPagesIfNeeded(base::Bind(
249 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
250 EXPECT_EQ(20, last_cleared_page_count());
251 EXPECT_EQ(1, total_cleared_times());
252 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
253
254 // Advance clock so we go over the gap, but no expired pages.
255 clock()->Advance(kClearStorageTimeGap + base::TimeDelta::FromHours(1));
256 manager()->ClearPagesIfNeeded(base::Bind(
257 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
258 EXPECT_EQ(0, last_cleared_page_count());
259 EXPECT_EQ(2, total_cleared_times());
260 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
261
262 // Advance clock so we are still in the gap, should be unnecessary.
263 clock()->Advance(kClearStorageTimeGap - base::TimeDelta::FromHours(1));
264 manager()->ClearPagesIfNeeded(base::Bind(
265 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
266 EXPECT_EQ(0, last_cleared_page_count());
267 EXPECT_EQ(3, total_cleared_times());
268 EXPECT_EQ(StorageClearResult::UNNECESSARY, last_storage_clear_result());
269 }
270
271 TEST_F(OfflinePageStorageManagerTest, TestClearMultipleTimes) {
272 Initialize(std::vector<PageSettings>(
273 {{kBookmarkNamespace, 30, 0}, {kLastNNamespace, 100, 1}}));
274 clock()->Advance(base::TimeDelta::FromMinutes(30));
275 LifetimePolicy policy =
276 policy_controller()->GetPolicy(kLastNNamespace).lifetime_policy;
277 int last_n_page_limit = policy.page_limit;
278
279 manager()->ClearPagesIfNeeded(base::Bind(
280 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
281 EXPECT_EQ(1 + (100 - last_n_page_limit), last_cleared_page_count());
282 EXPECT_EQ(1, total_cleared_times());
283 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
284
285 // Advance the clock by expiration period of last_n namespace, should be
286 // deleting all pages left in the namespace.
287 clock()->Advance(policy.expiration_period);
288 manager()->ClearPagesIfNeeded(base::Bind(
289 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
290 EXPECT_EQ(last_n_page_limit, last_cleared_page_count());
291 EXPECT_EQ(2, total_cleared_times());
292 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
293
294 // Only 1 ms passes and no changes in pages, so no need to clear page.
295 clock()->Advance(base::TimeDelta::FromMilliseconds(1));
296 manager()->ClearPagesIfNeeded(base::Bind(
297 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
298 EXPECT_EQ(0, last_cleared_page_count());
299 EXPECT_EQ(3, total_cleared_times());
300 EXPECT_EQ(StorageClearResult::UNNECESSARY, last_storage_clear_result());
301
302 // After more days, all pages should be cleared.
303 clock()->Advance(base::TimeDelta::FromDays(30));
304 manager()->ClearPagesIfNeeded(base::Bind(
305 &OfflinePageStorageManagerTest::OnPagesCleared, base::Unretained(this)));
306 EXPECT_EQ(30, last_cleared_page_count());
307 EXPECT_EQ(4, total_cleared_times());
308 EXPECT_EQ(StorageClearResult::SUCCESS, last_storage_clear_result());
309 }
310
202 } // namespace offline_pages 311 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698