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

Side by Side Diff: components/offline_pages/offline_page_model_unittest.cc

Issue 2011763005: Splits the OfflinePageModel into and interface and and implementation class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix to take ExpirePages defn out of model i/f as StorageManager defines it currently Created 4 years, 6 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_model_impl_unittest.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
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/offline_pages/offline_page_model.h"
6
7 #include <stdint.h>
8 #include <algorithm>
9 #include <utility>
10
11 #include "base/bind.h"
12 #include "base/command_line.h"
13 #include "base/feature_list.h"
14 #include "base/files/file_util.h"
15 #include "base/files/scoped_temp_dir.h"
16 #include "base/optional.h"
17 #include "base/run_loop.h"
18 #include "base/single_thread_task_runner.h"
19 #include "base/strings/string_number_conversions.h"
20 #include "base/strings/utf_string_conversions.h"
21 #include "base/test/test_mock_time_task_runner.h"
22 #include "base/threading/thread_task_runner_handle.h"
23 #include "base/time/time.h"
24 #include "components/offline_pages/client_policy_controller.h"
25 #include "components/offline_pages/offline_page_client_policy.h"
26 #include "components/offline_pages/offline_page_feature.h"
27 #include "components/offline_pages/offline_page_item.h"
28 #include "components/offline_pages/offline_page_storage_manager.h"
29 #include "components/offline_pages/offline_page_test_archiver.h"
30 #include "components/offline_pages/offline_page_test_store.h"
31 #include "components/offline_pages/offline_page_types.h"
32 #include "testing/gtest/include/gtest/gtest.h"
33 #include "url/gurl.h"
34
35 namespace offline_pages {
36
37 namespace {
38 const char kTestClientNamespace[] = "CLIENT_NAMESPACE";
39 const GURL kTestUrl("http://example.com");
40 const GURL kTestUrl2("http://other.page.com");
41 const GURL kTestUrl3("http://test.xyz");
42 const GURL kFileUrl("file:///foo");
43 const ClientId kTestClientId1(kTestClientNamespace, "1234");
44 const ClientId kTestClientId2(kTestClientNamespace, "5678");
45 const ClientId kTestClientId3(kTestClientNamespace, "42");
46 const int64_t kTestFileSize = 876543LL;
47
48 bool URLSpecContains(std::string contains_value, const GURL& url) {
49 std::string spec = url.spec();
50 return spec.find(contains_value) != std::string::npos;
51 }
52
53 } // namespace
54
55 class OfflinePageModelTest
56 : public testing::Test,
57 public OfflinePageModel::Observer,
58 public OfflinePageTestArchiver::Observer,
59 public base::SupportsWeakPtr<OfflinePageModelTest> {
60 public:
61 OfflinePageModelTest();
62 ~OfflinePageModelTest() override;
63
64 void SetUp() override;
65 void TearDown() override;
66
67 // OfflinePageModel::Observer implementation.
68 void OfflinePageModelLoaded(OfflinePageModel* model) override;
69 void OfflinePageModelChanged(OfflinePageModel* model) override;
70 void OfflinePageDeleted(int64_t offline_id,
71 const ClientId& client_id) override;
72
73 // OfflinePageTestArchiver::Observer implementation.
74 void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override;
75
76 // OfflinePageModel callbacks.
77 void OnSavePageDone(SavePageResult result, int64_t offline_id);
78 void OnDeletePageDone(DeletePageResult result);
79 void OnHasPagesDone(bool result);
80 void OnCheckPagesExistOfflineDone(const CheckPagesExistOfflineResult& result);
81 void OnClearAllDone();
82 void OnGetOfflineIdsForClientIdDone(MultipleOfflineIdResult* storage,
83 const MultipleOfflineIdResult& result);
84 void OnGetSingleOfflinePageItemResult(
85 SingleOfflinePageItemResult* storage,
86 const SingleOfflinePageItemResult& result);
87 void OnGetMultipleOfflinePageItemsResult(
88 MultipleOfflinePageItemResult* storage,
89 const MultipleOfflinePageItemResult& result);
90 void OnPagesExpired(bool result);
91
92 // OfflinePageMetadataStore callbacks.
93 void OnStoreUpdateDone(bool /* success */);
94
95 std::unique_ptr<OfflinePageTestArchiver> BuildArchiver(
96 const GURL& url,
97 OfflinePageArchiver::ArchiverResult result);
98 std::unique_ptr<OfflinePageMetadataStore> BuildStore();
99 std::unique_ptr<OfflinePageModel> BuildModel(
100 std::unique_ptr<OfflinePageMetadataStore> store);
101 void ResetModel();
102
103 // Utility methods.
104 // Runs until all of the tasks that are not delayed are gone from the task
105 // queue.
106 void PumpLoop();
107 // Fast-forwards virtual time by |delta|, causing tasks with a remaining
108 // delay less than or equal to |delta| to be executed.
109 void FastForwardBy(base::TimeDelta delta);
110 void ResetResults();
111
112 OfflinePageTestStore* GetStore();
113
114 MultipleOfflinePageItemResult GetAllPages();
115
116 // Returns the offline ID of the saved page.
117 std::pair<SavePageResult, int64_t> SavePage(const GURL& url,
118 ClientId client_id);
119
120 void SavePageWithArchiverResult(const GURL& url,
121 ClientId client_id,
122 OfflinePageArchiver::ArchiverResult result);
123
124 void DeletePage(int64_t offline_id,
125 const DeletePageCallback& callback) {
126 std::vector<int64_t> offline_ids;
127 offline_ids.push_back(offline_id);
128 model()->DeletePagesByOfflineId(offline_ids, callback);
129 }
130
131 bool HasPages(std::string name_space);
132
133 CheckPagesExistOfflineResult CheckPagesExistOffline(std::set<GURL>);
134
135 MultipleOfflineIdResult GetOfflineIdsForClientId(const ClientId& client_id);
136
137 SingleOfflinePageItemResult GetPageByOfflineId(int64_t offline_id);
138
139 base::Optional<OfflinePageItem> GetPagesByOnlineURL(const GURL& offline_url);
140
141 SingleOfflinePageItemResult GetPageByOfflineURL(const GURL& offline_url);
142
143 OfflinePageModel* model() { return model_.get(); }
144
145 int64_t last_save_offline_id() const { return last_save_offline_id_; }
146
147 SavePageResult last_save_result() const {
148 return last_save_result_;
149 }
150
151 DeletePageResult last_delete_result() const {
152 return last_delete_result_;
153 }
154
155 int64_t last_deleted_offline_id() const { return last_deleted_offline_id_; }
156
157 ClientId last_deleted_client_id() const { return last_deleted_client_id_; }
158
159 const base::FilePath& last_archiver_path() { return last_archiver_path_; }
160
161 int last_cleared_pages_count() const { return last_cleared_pages_count_; }
162
163 DeletePageResult last_clear_page_result() const {
164 return last_clear_page_result_;
165 }
166
167 bool last_expire_page_result() const { return last_expire_page_result_; }
168
169 private:
170 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
171 base::ThreadTaskRunnerHandle task_runner_handle_;
172 base::ScopedTempDir temp_dir_;
173
174 std::unique_ptr<OfflinePageModel> model_;
175 SavePageResult last_save_result_;
176 int64_t last_save_offline_id_;
177 DeletePageResult last_delete_result_;
178 base::FilePath last_archiver_path_;
179 int64_t last_deleted_offline_id_;
180 ClientId last_deleted_client_id_;
181 bool last_has_pages_result_;
182 CheckPagesExistOfflineResult last_pages_exist_result_;
183 int last_cleared_pages_count_;
184 DeletePageResult last_clear_page_result_;
185 bool last_expire_page_result_;
186 };
187
188 OfflinePageModelTest::OfflinePageModelTest()
189 : task_runner_(new base::TestMockTimeTaskRunner),
190 task_runner_handle_(task_runner_),
191 last_save_result_(SavePageResult::CANCELLED),
192 last_save_offline_id_(-1),
193 last_delete_result_(DeletePageResult::CANCELLED),
194 last_deleted_offline_id_(-1) {}
195
196 OfflinePageModelTest::~OfflinePageModelTest() {
197 }
198
199 void OfflinePageModelTest::SetUp() {
200 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
201 model_ = BuildModel(BuildStore());
202 model_->AddObserver(this);
203 PumpLoop();
204 }
205
206 void OfflinePageModelTest::TearDown() {
207 model_->RemoveObserver(this);
208 model_.reset();
209 PumpLoop();
210 }
211
212 void OfflinePageModelTest::OfflinePageModelLoaded(OfflinePageModel* model) {
213 ASSERT_EQ(model_.get(), model);
214 }
215
216 void OfflinePageModelTest::OfflinePageModelChanged(OfflinePageModel* model) {
217 ASSERT_EQ(model_.get(), model);
218 }
219
220 void OfflinePageModelTest::OfflinePageDeleted(int64_t offline_id,
221 const ClientId& client_id) {
222 last_deleted_offline_id_ = offline_id;
223 last_deleted_client_id_ = client_id;
224 }
225
226 void OfflinePageModelTest::SetLastPathCreatedByArchiver(
227 const base::FilePath& file_path) {
228 last_archiver_path_ = file_path;
229 }
230
231 void OfflinePageModelTest::OnSavePageDone(SavePageResult result,
232 int64_t offline_id) {
233 last_save_result_ = result;
234 last_save_offline_id_ = offline_id;
235 }
236
237 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) {
238 last_delete_result_ = result;
239 }
240
241 void OfflinePageModelTest::OnHasPagesDone(bool result) {
242 last_has_pages_result_ = result;
243 }
244
245 void OfflinePageModelTest::OnCheckPagesExistOfflineDone(
246 const CheckPagesExistOfflineResult& result) {
247 last_pages_exist_result_ = result;
248 }
249
250 void OfflinePageModelTest::OnClearAllDone() {
251 PumpLoop();
252 }
253
254 void OfflinePageModelTest::OnStoreUpdateDone(bool /* success - ignored */) {
255 }
256
257 std::unique_ptr<OfflinePageTestArchiver> OfflinePageModelTest::BuildArchiver(
258 const GURL& url,
259 OfflinePageArchiver::ArchiverResult result) {
260 return std::unique_ptr<OfflinePageTestArchiver>(new OfflinePageTestArchiver(
261 this, url, result, kTestFileSize, base::ThreadTaskRunnerHandle::Get()));
262 }
263
264 std::unique_ptr<OfflinePageMetadataStore> OfflinePageModelTest::BuildStore() {
265 return std::unique_ptr<OfflinePageMetadataStore>(
266 new OfflinePageTestStore(base::ThreadTaskRunnerHandle::Get()));
267 }
268
269 std::unique_ptr<OfflinePageModel> OfflinePageModelTest::BuildModel(
270 std::unique_ptr<OfflinePageMetadataStore> store) {
271 return std::unique_ptr<OfflinePageModel>(new OfflinePageModel(
272 std::move(store), temp_dir_.path(), base::ThreadTaskRunnerHandle::Get()));
273 }
274
275 void OfflinePageModelTest::ResetModel() {
276 model_->RemoveObserver(this);
277 OfflinePageTestStore* old_store = GetStore();
278 std::unique_ptr<OfflinePageMetadataStore> new_store(
279 new OfflinePageTestStore(*old_store));
280 model_ = BuildModel(std::move(new_store));
281 model_->AddObserver(this);
282 PumpLoop();
283 }
284
285 void OfflinePageModelTest::PumpLoop() {
286 task_runner_->RunUntilIdle();
287 }
288
289 void OfflinePageModelTest::FastForwardBy(base::TimeDelta delta) {
290 task_runner_->FastForwardBy(delta);
291 }
292
293 void OfflinePageModelTest::ResetResults() {
294 last_save_result_ = SavePageResult::CANCELLED;
295 last_delete_result_ = DeletePageResult::CANCELLED;
296 last_archiver_path_.clear();
297 last_pages_exist_result_.clear();
298 last_cleared_pages_count_ = 0;
299 }
300
301 OfflinePageTestStore* OfflinePageModelTest::GetStore() {
302 return static_cast<OfflinePageTestStore*>(model()->GetStoreForTesting());
303 }
304
305 std::pair<SavePageResult, int64_t> OfflinePageModelTest::SavePage(
306 const GURL& url,
307 ClientId client_id) {
308 SavePageWithArchiverResult(
309 url, client_id,
310 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED);
311 return std::make_pair(last_save_result_, last_save_offline_id_);
312 }
313
314 void OfflinePageModelTest::SavePageWithArchiverResult(
315 const GURL& url,
316 ClientId client_id,
317 OfflinePageArchiver::ArchiverResult result) {
318 std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver(url, result));
319 model()->SavePage(
320 url, client_id, std::move(archiver),
321 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
322 PumpLoop();
323 }
324
325 MultipleOfflinePageItemResult OfflinePageModelTest::GetAllPages() {
326 MultipleOfflinePageItemResult result;
327 model()->GetAllPages(
328 base::Bind(&OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult,
329 AsWeakPtr(), base::Unretained(&result)));
330 PumpLoop();
331 return result;
332 }
333
334 CheckPagesExistOfflineResult OfflinePageModelTest::CheckPagesExistOffline(
335 std::set<GURL> pages) {
336 model()->CheckPagesExistOffline(
337 pages, base::Bind(&OfflinePageModelTest::OnCheckPagesExistOfflineDone,
338 AsWeakPtr()));
339 PumpLoop();
340 return last_pages_exist_result_;
341 }
342
343 MultipleOfflineIdResult OfflinePageModelTest::GetOfflineIdsForClientId(
344 const ClientId& client_id) {
345 MultipleOfflineIdResult result;
346 model()->GetOfflineIdsForClientId(
347 client_id,
348 base::Bind(&OfflinePageModelTest::OnGetOfflineIdsForClientIdDone,
349 AsWeakPtr(), base::Unretained(&result)));
350 PumpLoop();
351 return result;
352 }
353
354 void OfflinePageModelTest::OnGetOfflineIdsForClientIdDone(
355 MultipleOfflineIdResult* storage,
356 const MultipleOfflineIdResult& result) {
357 *storage = result;
358 }
359
360 SingleOfflinePageItemResult OfflinePageModelTest::GetPageByOfflineId(
361 int64_t offline_id) {
362 SingleOfflinePageItemResult result;
363 model()->GetPageByOfflineId(
364 offline_id,
365 base::Bind(&OfflinePageModelTest::OnGetSingleOfflinePageItemResult,
366 AsWeakPtr(), base::Unretained(&result)));
367 PumpLoop();
368 return result;
369 }
370
371 SingleOfflinePageItemResult OfflinePageModelTest::GetPageByOfflineURL(
372 const GURL& offline_url) {
373 SingleOfflinePageItemResult result;
374 model()->GetPageByOfflineURL(
375 offline_url,
376 base::Bind(&OfflinePageModelTest::OnGetSingleOfflinePageItemResult,
377 AsWeakPtr(), base::Unretained(&result)));
378 PumpLoop();
379 return result;
380 }
381
382 void OfflinePageModelTest::OnGetSingleOfflinePageItemResult(
383 SingleOfflinePageItemResult* storage,
384 const SingleOfflinePageItemResult& result) {
385 *storage = result;
386 }
387
388 void OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult(
389 MultipleOfflinePageItemResult* storage,
390 const MultipleOfflinePageItemResult& result) {
391 *storage = result;
392 }
393
394 void OfflinePageModelTest::OnPagesExpired(bool result) {
395 last_expire_page_result_ = result;
396 }
397
398 base::Optional<OfflinePageItem> OfflinePageModelTest::GetPagesByOnlineURL(
399 const GURL& online_url) {
400 MultipleOfflinePageItemResult result;
401 model()->GetPagesByOnlineURL(
402 online_url,
403 base::Bind(&OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult,
404 AsWeakPtr(), base::Unretained(&result)));
405 PumpLoop();
406 if (result.size() > 0)
407 return base::make_optional(result[0]);
408 return base::nullopt;
409 }
410
411 bool OfflinePageModelTest::HasPages(std::string name_space) {
412 model()->HasPages(
413 name_space,
414 base::Bind(&OfflinePageModelTest::OnHasPagesDone, AsWeakPtr()));
415 PumpLoop();
416 return last_has_pages_result_;
417 }
418
419 TEST_F(OfflinePageModelTest, SavePageSuccessful) {
420 EXPECT_FALSE(HasPages(kTestClientNamespace));
421 SavePage(kTestUrl, kTestClientId1);
422 EXPECT_TRUE(HasPages(kTestClientNamespace));
423
424 OfflinePageTestStore* store = GetStore();
425 EXPECT_EQ(kTestUrl, store->last_saved_page().url);
426 EXPECT_EQ(kTestClientId1.id, store->last_saved_page().client_id.id);
427 EXPECT_EQ(kTestClientId1.name_space,
428 store->last_saved_page().client_id.name_space);
429 // Save last_archiver_path since it will be referred to later.
430 base::FilePath archiver_path = last_archiver_path();
431 EXPECT_EQ(archiver_path, store->last_saved_page().file_path);
432 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size);
433 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
434 ResetResults();
435
436 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
437
438 EXPECT_EQ(1UL, offline_pages.size());
439 EXPECT_EQ(kTestUrl, offline_pages[0].url);
440 EXPECT_EQ(kTestClientId1.id, offline_pages[0].client_id.id);
441 EXPECT_EQ(kTestClientId1.name_space, offline_pages[0].client_id.name_space);
442 EXPECT_EQ(archiver_path, offline_pages[0].file_path);
443 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size);
444 EXPECT_EQ(0, offline_pages[0].access_count);
445 EXPECT_EQ(0, offline_pages[0].flags);
446 }
447
448 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverCancelled) {
449 SavePageWithArchiverResult(
450 kTestUrl, kTestClientId1,
451 OfflinePageArchiver::ArchiverResult::ERROR_CANCELED);
452 EXPECT_EQ(SavePageResult::CANCELLED, last_save_result());
453 }
454
455 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverDeviceFull) {
456 SavePageWithArchiverResult(
457 kTestUrl, kTestClientId1,
458 OfflinePageArchiver::ArchiverResult::ERROR_DEVICE_FULL);
459 EXPECT_EQ(SavePageResult::DEVICE_FULL, last_save_result());
460 }
461
462 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverContentUnavailable) {
463 SavePageWithArchiverResult(
464 kTestUrl, kTestClientId1,
465 OfflinePageArchiver::ArchiverResult::ERROR_CONTENT_UNAVAILABLE);
466 EXPECT_EQ(SavePageResult::CONTENT_UNAVAILABLE, last_save_result());
467 }
468
469 TEST_F(OfflinePageModelTest, SavePageOfflineCreationFailed) {
470 SavePageWithArchiverResult(
471 kTestUrl, kTestClientId1,
472 OfflinePageArchiver::ArchiverResult::ERROR_ARCHIVE_CREATION_FAILED);
473 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result());
474 }
475
476 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverReturnedWrongUrl) {
477 std::unique_ptr<OfflinePageTestArchiver> archiver(
478 BuildArchiver(GURL("http://other.random.url.com"),
479 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
480 model()->SavePage(
481 kTestUrl, kTestClientId1, std::move(archiver),
482 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
483 PumpLoop();
484 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result());
485 }
486
487 TEST_F(OfflinePageModelTest, SavePageOfflineCreationStoreWriteFailure) {
488 GetStore()->set_test_scenario(
489 OfflinePageTestStore::TestScenario::WRITE_FAILED);
490 SavePage(kTestUrl, kTestClientId1);
491 EXPECT_EQ(SavePageResult::STORE_FAILURE, last_save_result());
492 }
493
494 TEST_F(OfflinePageModelTest, SavePageLocalFileFailed) {
495 // Don't create archiver since it will not be needed for pages that are not
496 // going to be saved.
497 model()->SavePage(
498 kFileUrl, kTestClientId1, std::unique_ptr<OfflinePageTestArchiver>(),
499 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
500 PumpLoop();
501 EXPECT_EQ(SavePageResult::SKIPPED, last_save_result());
502 }
503
504 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverTwoPages) {
505 std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver(
506 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
507 // archiver_ptr will be valid until after first PumpLoop() call after
508 // CompleteCreateArchive() is called.
509 OfflinePageTestArchiver* archiver_ptr = archiver.get();
510 archiver_ptr->set_delayed(true);
511 model()->SavePage(
512 kTestUrl, kTestClientId1, std::move(archiver),
513 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
514 EXPECT_TRUE(archiver_ptr->create_archive_called());
515
516 // Request to save another page.
517 SavePage(kTestUrl2, kTestClientId2);
518
519 OfflinePageTestStore* store = GetStore();
520
521 EXPECT_EQ(kTestUrl2, store->last_saved_page().url);
522 EXPECT_EQ(kTestClientId2, store->last_saved_page().client_id);
523 base::FilePath archiver_path2 = last_archiver_path();
524 EXPECT_EQ(archiver_path2, store->last_saved_page().file_path);
525 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size);
526 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
527
528 ResetResults();
529
530 archiver_ptr->CompleteCreateArchive();
531 // After this pump loop archiver_ptr is invalid.
532 PumpLoop();
533
534 EXPECT_EQ(kTestUrl, store->last_saved_page().url);
535 EXPECT_EQ(kTestClientId1, store->last_saved_page().client_id);
536 base::FilePath archiver_path = last_archiver_path();
537 EXPECT_EQ(archiver_path, store->last_saved_page().file_path);
538 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size);
539 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
540
541 ResetResults();
542
543 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
544
545 EXPECT_EQ(2UL, offline_pages.size());
546 // Offline IDs are random, so the order of the pages is also random
547 // So load in the right page for the validation below.
548 const OfflinePageItem* page1;
549 const OfflinePageItem* page2;
550 if (offline_pages[0].client_id == kTestClientId1) {
551 page1 = &offline_pages[0];
552 page2 = &offline_pages[1];
553 } else {
554 page1 = &offline_pages[1];
555 page2 = &offline_pages[0];
556 }
557
558 EXPECT_EQ(kTestUrl, page1->url);
559 EXPECT_EQ(kTestClientId1, page1->client_id);
560 EXPECT_EQ(archiver_path, page1->file_path);
561 EXPECT_EQ(kTestFileSize, page1->file_size);
562 EXPECT_EQ(0, page1->access_count);
563 EXPECT_EQ(0, page1->flags);
564 EXPECT_EQ(kTestUrl2, page2->url);
565 EXPECT_EQ(kTestClientId2, page2->client_id);
566 EXPECT_EQ(archiver_path2, page2->file_path);
567 EXPECT_EQ(kTestFileSize, page2->file_size);
568 EXPECT_EQ(0, page2->access_count);
569 EXPECT_EQ(0, page2->flags);
570 }
571
572 TEST_F(OfflinePageModelTest, MarkPageAccessed) {
573 SavePage(kTestUrl, kTestClientId1);
574
575 // This will increase access_count by one.
576 model()->MarkPageAccessed(last_save_offline_id());
577 PumpLoop();
578
579 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
580
581 EXPECT_EQ(1UL, offline_pages.size());
582 EXPECT_EQ(kTestUrl, offline_pages[0].url);
583 EXPECT_EQ(kTestClientId1, offline_pages[0].client_id);
584 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size);
585 EXPECT_EQ(1, offline_pages[0].access_count);
586 }
587
588 TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) {
589 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
590
591 EXPECT_EQ(0UL, offline_pages.size());
592 }
593
594 TEST_F(OfflinePageModelTest, GetAllPagesStoreFailure) {
595 GetStore()->set_test_scenario(
596 OfflinePageTestStore::TestScenario::LOAD_FAILED);
597 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
598
599 EXPECT_EQ(0UL, offline_pages.size());
600 }
601
602 TEST_F(OfflinePageModelTest, DeletePageSuccessful) {
603 OfflinePageTestStore* store = GetStore();
604
605 // Save one page.
606 SavePage(kTestUrl, kTestClientId1);
607 int64_t offline1 = last_save_offline_id();
608 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
609 EXPECT_EQ(1u, store->GetAllPages().size());
610
611 ResetResults();
612
613 // Save another page.
614 SavePage(kTestUrl2, kTestClientId2);
615 int64_t offline2 = last_save_offline_id();
616 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
617 EXPECT_EQ(2u, store->GetAllPages().size());
618
619 ResetResults();
620
621 // Delete one page.
622 DeletePage(offline1,
623 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
624
625 PumpLoop();
626
627 EXPECT_EQ(last_deleted_offline_id(), offline1);
628 EXPECT_EQ(last_deleted_client_id(), kTestClientId1);
629 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
630 ASSERT_EQ(1u, store->GetAllPages().size());
631 EXPECT_EQ(kTestUrl2, store->GetAllPages()[0].url);
632
633 // Delete another page.
634 DeletePage(offline2,
635 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
636
637 ResetResults();
638
639 PumpLoop();
640
641 EXPECT_EQ(last_deleted_offline_id(), offline2);
642 EXPECT_EQ(last_deleted_client_id(), kTestClientId2);
643 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
644 EXPECT_EQ(0u, store->GetAllPages().size());
645 }
646
647 TEST_F(OfflinePageModelTest, DeletePageByPredicate) {
648 OfflinePageTestStore* store = GetStore();
649
650 // Save one page.
651 SavePage(kTestUrl, kTestClientId1);
652 int64_t offline1 = last_save_offline_id();
653 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
654 EXPECT_EQ(1u, store->GetAllPages().size());
655
656 ResetResults();
657
658 // Save another page.
659 SavePage(kTestUrl2, kTestClientId2);
660 int64_t offline2 = last_save_offline_id();
661 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
662 EXPECT_EQ(2u, store->GetAllPages().size());
663
664 ResetResults();
665
666 // Delete the second page.
667 model()->DeletePagesByURLPredicate(
668 base::Bind(&URLSpecContains, "page.com"),
669 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
670
671 PumpLoop();
672
673 EXPECT_EQ(last_deleted_offline_id(), offline2);
674 EXPECT_EQ(last_deleted_client_id(), kTestClientId2);
675 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
676 ASSERT_EQ(1u, store->GetAllPages().size());
677 EXPECT_EQ(kTestUrl, store->GetAllPages()[0].url);
678
679 ResetResults();
680
681 // Delete the first page.
682 model()->DeletePagesByURLPredicate(
683 base::Bind(&URLSpecContains, "example.com"),
684 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
685
686 PumpLoop();
687
688 EXPECT_EQ(last_deleted_offline_id(), offline1);
689 EXPECT_EQ(last_deleted_client_id(), kTestClientId1);
690 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
691 EXPECT_EQ(0u, store->GetAllPages().size());
692 }
693
694 TEST_F(OfflinePageModelTest, DeletePageNotFound) {
695 DeletePage(1234LL,
696 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
697 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result());
698
699 ResetResults();
700
701 model()->DeletePagesByURLPredicate(
702 base::Bind(&URLSpecContains, "page.com"),
703 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
704 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result());
705 }
706
707 TEST_F(OfflinePageModelTest, DeletePageStoreFailureOnRemove) {
708 // Save a page.
709 SavePage(kTestUrl, kTestClientId1);
710 int64_t offline_id = last_save_offline_id();
711 ResetResults();
712
713 // Try to delete this page.
714 GetStore()->set_test_scenario(
715 OfflinePageTestStore::TestScenario::REMOVE_FAILED);
716 DeletePage(offline_id,
717 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
718 PumpLoop();
719 EXPECT_EQ(DeletePageResult::STORE_FAILURE, last_delete_result());
720 }
721
722 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissing) {
723 // Save a page.
724 SavePage(kTestUrl, kTestClientId1);
725 int64_t offline_id = last_save_offline_id();
726
727 ResetResults();
728
729 base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline_id);
730
731 // Delete the offline copy of the page and check the metadata.
732 base::DeleteFile(page->file_path, false);
733 model()->CheckForExternalFileDeletion();
734 PumpLoop();
735
736 EXPECT_EQ(last_deleted_offline_id(), offline_id);
737 EXPECT_EQ(0UL, GetAllPages().size());
738 }
739
740 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissingAfterLoad) {
741 // Save a page.
742 SavePage(kTestUrl, kTestClientId1);
743 PumpLoop();
744 int64_t offline_id = last_save_offline_id();
745
746 ResetResults();
747
748 base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline_id);
749 // Delete the offline copy of the page and check the metadata.
750 base::DeleteFile(page->file_path, false);
751 // Reseting the model should trigger the metadata consistency check as well.
752 ResetModel();
753 PumpLoop();
754
755 EXPECT_EQ(last_deleted_offline_id(), offline_id);
756 EXPECT_EQ(0UL, GetAllPages().size());
757 }
758
759 TEST_F(OfflinePageModelTest, DeleteMultiplePages) {
760 OfflinePageTestStore* store = GetStore();
761
762 // Save 3 pages.
763 std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver(
764 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
765 model()->SavePage(
766 kTestUrl, kTestClientId1, std::move(archiver),
767 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
768 PumpLoop();
769 int64_t offline1 = last_save_offline_id();
770
771 std::unique_ptr<OfflinePageTestArchiver> archiver2(BuildArchiver(
772 kTestUrl2, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
773 model()->SavePage(
774 kTestUrl2, kTestClientId2, std::move(archiver2),
775 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
776 PumpLoop();
777 int64_t offline2 = last_save_offline_id();
778
779 std::unique_ptr<OfflinePageTestArchiver> archiver3(BuildArchiver(
780 kTestUrl3, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
781 model()->SavePage(
782 kTestUrl3, kTestClientId3, std::move(archiver3),
783 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
784 PumpLoop();
785
786 EXPECT_EQ(3u, store->GetAllPages().size());
787
788 // Delete multiple pages.
789 std::vector<int64_t> ids_to_delete;
790 ids_to_delete.push_back(offline2);
791 ids_to_delete.push_back(offline1);
792 ids_to_delete.push_back(23434LL); // Non-existent ID.
793 model()->DeletePagesByOfflineId(
794 ids_to_delete,
795 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
796 PumpLoop();
797
798 // Success is expected if at least one page is deleted successfully.
799 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
800 EXPECT_EQ(1u, store->GetAllPages().size());
801 }
802
803 TEST_F(OfflinePageModelTest, GetPageByOfflineId) {
804 SavePage(kTestUrl, kTestClientId1);
805 int64_t offline1 = last_save_offline_id();
806 SavePage(kTestUrl2, kTestClientId2);
807 int64_t offline2 = last_save_offline_id();
808
809 base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline1);
810 bool page_exists = page != base::nullopt;
811 EXPECT_TRUE(page_exists);
812 EXPECT_EQ(kTestUrl, page->url);
813 EXPECT_EQ(kTestClientId1, page->client_id);
814 EXPECT_EQ(kTestFileSize, page->file_size);
815
816 page = GetPageByOfflineId(offline2);
817 page_exists = page != base::nullopt;
818 EXPECT_TRUE(page_exists);
819 EXPECT_EQ(kTestUrl2, page->url);
820 EXPECT_EQ(kTestClientId2, page->client_id);
821 EXPECT_EQ(kTestFileSize, page->file_size);
822
823 page = GetPageByOfflineId(-42);
824 page_exists = page != base::nullopt;
825 EXPECT_FALSE(page_exists);
826 }
827
828 TEST_F(OfflinePageModelTest, GetPageByOfflineURL) {
829 SavePage(kTestUrl, kTestClientId1);
830 int64_t offline1 = last_save_offline_id();
831
832 OfflinePageTestStore* store = GetStore();
833 GURL offline_url = store->last_saved_page().GetOfflineURL();
834
835 SavePage(kTestUrl2, kTestClientId2);
836
837 GURL offline_url2 = store->last_saved_page().GetOfflineURL();
838 int64_t offline2 = last_save_offline_id();
839
840 SingleOfflinePageItemResult page = GetPageByOfflineURL(offline_url2);
841 EXPECT_TRUE(page != base::nullopt);
842 EXPECT_EQ(kTestUrl2, page->url);
843 EXPECT_EQ(kTestClientId2, page->client_id);
844 EXPECT_EQ(offline2, page->offline_id);
845
846 page = GetPageByOfflineURL(offline_url);
847 EXPECT_TRUE(page != base::nullopt);
848 EXPECT_EQ(kTestUrl, page->url);
849 EXPECT_EQ(kTestClientId1, page->client_id);
850 EXPECT_EQ(offline1, page->offline_id);
851
852 page = GetPageByOfflineURL(GURL("http://foo"));
853 EXPECT_TRUE(page == base::nullopt);
854 }
855
856 TEST_F(OfflinePageModelTest, GetPagesByOnlineURL) {
857 SavePage(kTestUrl, kTestClientId1);
858 SavePage(kTestUrl2, kTestClientId2);
859
860 base::Optional<OfflinePageItem> page = GetPagesByOnlineURL(kTestUrl2);
861 EXPECT_EQ(kTestUrl2, page->url);
862 EXPECT_EQ(kTestClientId2, page->client_id);
863
864 page = GetPagesByOnlineURL(kTestUrl);
865 EXPECT_EQ(kTestUrl, page->url);
866 EXPECT_EQ(kTestClientId1, page->client_id);
867
868 page = GetPagesByOnlineURL(GURL("http://foo"));
869 EXPECT_TRUE(base::nullopt == page);
870 }
871
872 TEST_F(OfflinePageModelTest, CheckPagesExistOffline) {
873 SavePage(kTestUrl, kTestClientId1);
874 SavePage(kTestUrl2, kTestClientId2);
875
876 std::set<GURL> input;
877 input.insert(kTestUrl);
878 input.insert(kTestUrl2);
879 input.insert(kTestUrl3);
880
881 CheckPagesExistOfflineResult existing_pages = CheckPagesExistOffline(input);
882 EXPECT_EQ(2U, existing_pages.size());
883 EXPECT_NE(existing_pages.end(), existing_pages.find(kTestUrl));
884 EXPECT_NE(existing_pages.end(), existing_pages.find(kTestUrl2));
885 EXPECT_EQ(existing_pages.end(), existing_pages.find(kTestUrl3));
886 }
887
888 TEST_F(OfflinePageModelTest, CanSavePage) {
889 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("http://foo")));
890 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("https://foo")));
891 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("file:///foo")));
892 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("data:image/png;base64,ab")));
893 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome://version")));
894 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome-native://newtab/")));
895 }
896
897 TEST_F(OfflinePageModelTest, ClearAll) {
898 SavePage(kTestUrl, kTestClientId1);
899 SavePage(kTestUrl2, kTestClientId2);
900
901 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
902 EXPECT_EQ(2UL, offline_pages.size());
903 EXPECT_EQ(2UL, GetStore()->GetAllPages().size());
904 base::FilePath archiver_path = offline_pages[0].file_path;
905 EXPECT_TRUE(base::PathExists(archiver_path));
906
907 // ClearAll should delete all the files and wipe out both cache and store.
908 model()->ClearAll(
909 base::Bind(&OfflinePageModelTest::OnClearAllDone, AsWeakPtr()));
910 PumpLoop();
911 EXPECT_EQ(0UL, GetAllPages().size());
912 EXPECT_EQ(0UL, GetStore()->GetAllPages().size());
913 EXPECT_FALSE(base::PathExists(archiver_path));
914
915 // The model should reload the store after the reset. All model operations
916 // should continue to work.
917 SavePage(kTestUrl2, kTestClientId2);
918 EXPECT_EQ(1UL, GetAllPages().size());
919 EXPECT_EQ(1UL, GetStore()->GetAllPages().size());
920 }
921
922 TEST_F(OfflinePageModelTest, SaveRetrieveMultipleClientIds) {
923 EXPECT_FALSE(HasPages(kTestClientNamespace));
924 SavePage(kTestUrl, kTestClientId1);
925 int64_t offline1 = last_save_offline_id();
926 EXPECT_TRUE(HasPages(kTestClientNamespace));
927
928 SavePage(kTestUrl, kTestClientId1);
929 int64_t offline2 = last_save_offline_id();
930
931 EXPECT_NE(offline1, offline2);
932
933 const std::vector<int64_t> ids = GetOfflineIdsForClientId(kTestClientId1);
934
935 EXPECT_EQ(2UL, ids.size());
936
937 std::set<int64_t> id_set;
938 for (size_t i = 0; i < ids.size(); i++) {
939 id_set.insert(ids[i]);
940 }
941
942 EXPECT_TRUE(id_set.find(offline1) != id_set.end());
943 EXPECT_TRUE(id_set.find(offline2) != id_set.end());
944 }
945
946 TEST_F(OfflinePageModelTest, GetBestPage) {
947 // We will save 3 pages - two for the same URL, and one for a different URL.
948 // Correct behavior will pick the most recently saved page for the correct
949 // URL.
950 std::pair<SavePageResult, int64_t> saved_pages[3];
951 saved_pages[0] = SavePage(kTestUrl, kTestClientId1);
952 saved_pages[1] = SavePage(kTestUrl, kTestClientId1);
953 saved_pages[2] = SavePage(kTestUrl2, kTestClientId2);
954
955 for (const auto& save_result : saved_pages) {
956 ASSERT_EQ(OfflinePageModel::SavePageResult::SUCCESS,
957 std::get<0>(save_result));
958 }
959
960 const OfflinePageItem* offline_page =
961 model()->MaybeGetBestPageForOnlineURL(kTestUrl);
962 ASSERT_TRUE(nullptr != offline_page);
963
964 EXPECT_EQ(std::get<1>(saved_pages[1]), offline_page->offline_id);
965 }
966
967 TEST_F(OfflinePageModelTest, ExpirePages) {
968 // We will save 3 pages and then expire 2 of them.
969 std::pair<SavePageResult, int64_t> saved_pages[3];
970 saved_pages[0] = SavePage(kTestUrl, kTestClientId1);
971 saved_pages[1] = SavePage(kTestUrl2, kTestClientId2);
972 saved_pages[2] = SavePage(kTestUrl3, kTestClientId3);
973
974 for (const auto& save_result : saved_pages) {
975 ASSERT_EQ(OfflinePageModel::SavePageResult::SUCCESS,
976 std::get<0>(save_result));
977 }
978
979 // First two pages will be expired.
980 std::vector<int64_t> pages_to_expire = {std::get<1>(saved_pages[0]),
981 std::get<1>(saved_pages[1])};
982 // Pages are marked as expired if they have an expiration_time set.
983 base::Time expiration_time =
984 base::Time::Now() + base::TimeDelta::FromMinutes(5);
985
986 model()->ExpirePages(
987 pages_to_expire, expiration_time,
988 base::Bind(&OfflinePageModelTest::OnPagesExpired, AsWeakPtr()));
989 PumpLoop();
990
991 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
992 for (const auto& offline_page : offline_pages) {
993 if (std::find(pages_to_expire.begin(), pages_to_expire.end(),
994 offline_page.offline_id) != pages_to_expire.end()) {
995 EXPECT_EQ(expiration_time, offline_page.expiration_time);
996 EXPECT_TRUE(offline_page.IsExpired());
997 } else {
998 EXPECT_EQ(base::Time(), offline_page.expiration_time);
999 EXPECT_FALSE(offline_page.IsExpired());
1000 }
1001 }
1002 EXPECT_TRUE(last_expire_page_result());
1003 }
1004
1005 TEST(CommandLineFlagsTest, OfflineBookmarks) {
1006 // Disabled by default.
1007 EXPECT_FALSE(offline_pages::IsOfflineBookmarksEnabled());
1008
1009 // Check if feature is correctly enabled by command-line flag.
1010 base::FeatureList::ClearInstanceForTesting();
1011 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
1012 feature_list->InitializeFromCommandLine(
1013 offline_pages::kOfflineBookmarksFeature.name, "");
1014 base::FeatureList::SetInstance(std::move(feature_list));
1015 EXPECT_TRUE(offline_pages::IsOfflineBookmarksEnabled());
1016 }
1017
1018 TEST(CommandLineFlagsTest, OffliningRecentPages) {
1019 // Enable offline bookmarks feature first.
1020 // TODO(dimich): once offline pages are enabled by default, remove this.
1021 base::FeatureList::ClearInstanceForTesting();
1022 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
1023 feature_list->InitializeFromCommandLine(
1024 offline_pages::kOfflineBookmarksFeature.name, "");
1025 base::FeatureList::SetInstance(std::move(feature_list));
1026
1027 // This feature is still disabled by default.
1028 EXPECT_FALSE(offline_pages::IsOffliningRecentPagesEnabled());
1029
1030 // Check if feature is correctly enabled by command-line flag.
1031 base::FeatureList::ClearInstanceForTesting();
1032 std::unique_ptr<base::FeatureList> feature_list2(new base::FeatureList);
1033 feature_list2->InitializeFromCommandLine(
1034 std::string(offline_pages::kOfflineBookmarksFeature.name) + "," +
1035 offline_pages::kOffliningRecentPagesFeature.name,
1036 "");
1037 base::FeatureList::SetInstance(std::move(feature_list2));
1038 EXPECT_TRUE(offline_pages::IsOffliningRecentPagesEnabled());
1039 }
1040
1041 TEST(CommandLineFlagsTest, OfflinePagesBackgroundLoading) {
1042 // Enable offline bookmarks feature first.
1043 // TODO(dimich): once offline pages are enabled by default, remove this.
1044 base::FeatureList::ClearInstanceForTesting();
1045 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
1046 feature_list->InitializeFromCommandLine(
1047 offline_pages::kOfflineBookmarksFeature.name, "");
1048 base::FeatureList::SetInstance(std::move(feature_list));
1049
1050 // This feature is still disabled by default.
1051 EXPECT_FALSE(offline_pages::IsOfflinePagesBackgroundLoadingEnabled());
1052
1053 // Check if feature is correctly enabled by command-line flag.
1054 base::FeatureList::ClearInstanceForTesting();
1055 std::unique_ptr<base::FeatureList> feature_list2(new base::FeatureList);
1056 feature_list2->InitializeFromCommandLine(
1057 std::string(offline_pages::kOfflineBookmarksFeature.name) + "," +
1058 offline_pages::kOfflinePagesBackgroundLoadingFeature.name,
1059 "");
1060 base::FeatureList::SetInstance(std::move(feature_list2));
1061 EXPECT_TRUE(offline_pages::IsOfflinePagesBackgroundLoadingEnabled());
1062 }
1063
1064 } // namespace offline_pages
OLDNEW
« no previous file with comments | « components/offline_pages/offline_page_model_impl_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698