| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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_model.h" | 5 #include "components/offline_pages/offline_page_model.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 REMOVE_FAILED, | 41 REMOVE_FAILED, |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 explicit OfflinePageTestStore( | 44 explicit OfflinePageTestStore( |
| 45 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); | 45 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); |
| 46 explicit OfflinePageTestStore(const OfflinePageTestStore& other_store); | 46 explicit OfflinePageTestStore(const OfflinePageTestStore& other_store); |
| 47 ~OfflinePageTestStore() override; | 47 ~OfflinePageTestStore() override; |
| 48 | 48 |
| 49 // OfflinePageMetadataStore overrides: | 49 // OfflinePageMetadataStore overrides: |
| 50 void Load(const LoadCallback& callback) override; | 50 void Load(const LoadCallback& callback) override; |
| 51 void AddOfflinePage(const OfflinePageItem& offline_page, | 51 void AddOrUpdateOfflinePage(const OfflinePageItem& offline_page, |
| 52 const UpdateCallback& callback) override; | 52 const UpdateCallback& callback) override; |
| 53 void RemoveOfflinePages(const std::vector<int64>& bookmark_ids, | 53 void RemoveOfflinePages(const std::vector<int64>& bookmark_ids, |
| 54 const UpdateCallback& callback) override; | 54 const UpdateCallback& callback) override; |
| 55 const OfflinePageItem& last_saved_page() const { return last_saved_page_; } | 55 const OfflinePageItem& last_saved_page() const { return last_saved_page_; } |
| 56 | 56 |
| 57 void set_test_scenario(TestScenario scenario) { scenario_ = scenario; }; | 57 void set_test_scenario(TestScenario scenario) { scenario_ = scenario; }; |
| 58 | 58 |
| 59 const std::vector<OfflinePageItem>& offline_pages() const { | 59 const std::vector<OfflinePageItem>& offline_pages() const { |
| 60 return offline_pages_; | 60 return offline_pages_; |
| 61 } | 61 } |
| 62 | 62 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 88 void OfflinePageTestStore::Load(const LoadCallback& callback) { | 88 void OfflinePageTestStore::Load(const LoadCallback& callback) { |
| 89 if (scenario_ != TestScenario::LOAD_FAILED) { | 89 if (scenario_ != TestScenario::LOAD_FAILED) { |
| 90 task_runner_->PostTask( | 90 task_runner_->PostTask( |
| 91 FROM_HERE, base::Bind(callback, true, offline_pages_)); | 91 FROM_HERE, base::Bind(callback, true, offline_pages_)); |
| 92 } else { | 92 } else { |
| 93 task_runner_->PostTask( | 93 task_runner_->PostTask( |
| 94 FROM_HERE, base::Bind(callback, false, std::vector<OfflinePageItem>())); | 94 FROM_HERE, base::Bind(callback, false, std::vector<OfflinePageItem>())); |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 void OfflinePageTestStore::AddOfflinePage(const OfflinePageItem& offline_page, | 98 void OfflinePageTestStore::AddOrUpdateOfflinePage( |
| 99 const UpdateCallback& callback) { | 99 const OfflinePageItem& offline_page, const UpdateCallback& callback) { |
| 100 last_saved_page_ = offline_page; | 100 last_saved_page_ = offline_page; |
| 101 bool result = scenario_ != TestScenario::WRITE_FAILED; | 101 bool result = scenario_ != TestScenario::WRITE_FAILED; |
| 102 if (result) { | 102 if (result) { |
| 103 offline_pages_.push_back(offline_page); | 103 offline_pages_.push_back(offline_page); |
| 104 } | 104 } |
| 105 task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); | 105 task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); |
| 106 } | 106 } |
| 107 | 107 |
| 108 void OfflinePageTestStore::RemoveOfflinePages( | 108 void OfflinePageTestStore::RemoveOfflinePages( |
| 109 const std::vector<int64>& bookmark_ids, | 109 const std::vector<int64>& bookmark_ids, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 ~OfflinePageModelTest() override; | 168 ~OfflinePageModelTest() override; |
| 169 | 169 |
| 170 void SetUp() override; | 170 void SetUp() override; |
| 171 void TearDown() override; | 171 void TearDown() override; |
| 172 | 172 |
| 173 // OfflinePageModel::Observer implementation. | 173 // OfflinePageModel::Observer implementation. |
| 174 void OfflinePageModelLoaded(OfflinePageModel* model) override; | 174 void OfflinePageModelLoaded(OfflinePageModel* model) override; |
| 175 | 175 |
| 176 // OfflinePageModel callbacks. | 176 // OfflinePageModel callbacks. |
| 177 void OnSavePageDone(SavePageResult result); | 177 void OnSavePageDone(SavePageResult result); |
| 178 void OnMarkPageAccessedDone(bool success); |
| 178 void OnDeletePageDone(DeletePageResult result); | 179 void OnDeletePageDone(DeletePageResult result); |
| 179 | 180 |
| 180 // OfflinePageMetadataStore callbacks. | 181 // OfflinePageMetadataStore callbacks. |
| 181 void OnStoreUpdateDone(bool /* success */); | 182 void OnStoreUpdateDone(bool /* success */); |
| 182 | 183 |
| 183 scoped_ptr<OfflinePageTestArchiver> BuildArchiver( | 184 scoped_ptr<OfflinePageTestArchiver> BuildArchiver( |
| 184 const GURL& url, | 185 const GURL& url, |
| 185 OfflinePageArchiver::ArchiverResult result); | 186 OfflinePageArchiver::ArchiverResult result); |
| 186 scoped_ptr<OfflinePageMetadataStore> BuildStore(); | 187 scoped_ptr<OfflinePageMetadataStore> BuildStore(); |
| 187 scoped_ptr<OfflinePageModel> BuildModel( | 188 scoped_ptr<OfflinePageModel> BuildModel( |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 ASSERT_EQ(model_.get(), model); | 284 ASSERT_EQ(model_.get(), model); |
| 284 run_loop_->Quit(); | 285 run_loop_->Quit(); |
| 285 } | 286 } |
| 286 | 287 |
| 287 void OfflinePageModelTest::OnSavePageDone( | 288 void OfflinePageModelTest::OnSavePageDone( |
| 288 OfflinePageModel::SavePageResult result) { | 289 OfflinePageModel::SavePageResult result) { |
| 289 run_loop_->Quit(); | 290 run_loop_->Quit(); |
| 290 last_save_result_ = result; | 291 last_save_result_ = result; |
| 291 } | 292 } |
| 292 | 293 |
| 294 void OfflinePageModelTest::OnMarkPageAccessedDone(bool success) { |
| 295 run_loop_->Quit(); |
| 296 } |
| 297 |
| 293 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) { | 298 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) { |
| 294 run_loop_->Quit(); | 299 run_loop_->Quit(); |
| 295 last_delete_result_ = result; | 300 last_delete_result_ = result; |
| 296 } | 301 } |
| 297 | 302 |
| 298 void OfflinePageModelTest::OnStoreUpdateDone(bool /* success - ignored */) { | 303 void OfflinePageModelTest::OnStoreUpdateDone(bool /* success - ignored */) { |
| 299 run_loop_->Quit(); | 304 run_loop_->Quit(); |
| 300 } | 305 } |
| 301 | 306 |
| 302 scoped_ptr<OfflinePageTestArchiver> OfflinePageModelTest::BuildArchiver( | 307 scoped_ptr<OfflinePageTestArchiver> OfflinePageModelTest::BuildArchiver( |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 | 368 |
| 364 ResetResults(); | 369 ResetResults(); |
| 365 | 370 |
| 366 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); | 371 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); |
| 367 | 372 |
| 368 EXPECT_EQ(1UL, offline_pages.size()); | 373 EXPECT_EQ(1UL, offline_pages.size()); |
| 369 EXPECT_EQ(kTestUrl, offline_pages[0].url); | 374 EXPECT_EQ(kTestUrl, offline_pages[0].url); |
| 370 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].bookmark_id); | 375 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].bookmark_id); |
| 371 EXPECT_EQ(archiver_path, offline_pages[0].file_path); | 376 EXPECT_EQ(archiver_path, offline_pages[0].file_path); |
| 372 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); | 377 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); |
| 378 EXPECT_EQ(0, offline_pages[0].access_count); |
| 373 } | 379 } |
| 374 | 380 |
| 375 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverCancelled) { | 381 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverCancelled) { |
| 376 scoped_ptr<OfflinePageTestArchiver> archiver( | 382 scoped_ptr<OfflinePageTestArchiver> archiver( |
| 377 BuildArchiver(kTestUrl, | 383 BuildArchiver(kTestUrl, |
| 378 OfflinePageArchiver::ArchiverResult::ERROR_CANCELED) | 384 OfflinePageArchiver::ArchiverResult::ERROR_CANCELED) |
| 379 .Pass()); | 385 .Pass()); |
| 380 model()->SavePage( | 386 model()->SavePage( |
| 381 kTestUrl, kTestPageBookmarkId1, archiver.Pass(), | 387 kTestUrl, kTestPageBookmarkId1, archiver.Pass(), |
| 382 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 388 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 | 502 |
| 497 ResetResults(); | 503 ResetResults(); |
| 498 | 504 |
| 499 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); | 505 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); |
| 500 | 506 |
| 501 EXPECT_EQ(2UL, offline_pages.size()); | 507 EXPECT_EQ(2UL, offline_pages.size()); |
| 502 EXPECT_EQ(kTestUrl, offline_pages[0].url); | 508 EXPECT_EQ(kTestUrl, offline_pages[0].url); |
| 503 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].bookmark_id); | 509 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].bookmark_id); |
| 504 EXPECT_EQ(archiver_path, offline_pages[0].file_path); | 510 EXPECT_EQ(archiver_path, offline_pages[0].file_path); |
| 505 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); | 511 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); |
| 512 EXPECT_EQ(0, offline_pages[0].access_count); |
| 506 EXPECT_EQ(kTestUrl2, offline_pages[1].url); | 513 EXPECT_EQ(kTestUrl2, offline_pages[1].url); |
| 507 EXPECT_EQ(kTestPageBookmarkId2, offline_pages[1].bookmark_id); | 514 EXPECT_EQ(kTestPageBookmarkId2, offline_pages[1].bookmark_id); |
| 508 EXPECT_EQ(archiver_path2, offline_pages[1].file_path); | 515 EXPECT_EQ(archiver_path2, offline_pages[1].file_path); |
| 509 EXPECT_EQ(kTestFileSize, offline_pages[1].file_size); | 516 EXPECT_EQ(kTestFileSize, offline_pages[1].file_size); |
| 517 EXPECT_EQ(0, offline_pages[1].access_count); |
| 518 } |
| 519 |
| 520 TEST_F(OfflinePageModelTest, MarkPageAccessed) { |
| 521 scoped_ptr<OfflinePageTestArchiver> archiver( |
| 522 BuildArchiver(kTestUrl, |
| 523 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED) |
| 524 .Pass()); |
| 525 model()->SavePage( |
| 526 kTestUrl, kTestPageBookmarkId1, archiver.Pass(), |
| 527 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 528 PumpLoop(); |
| 529 |
| 530 // This will increase access_count by one. |
| 531 model()->MarkPageAccessed( |
| 532 kTestPageBookmarkId1, |
| 533 base::Bind(&OfflinePageModelTest::OnMarkPageAccessedDone, AsWeakPtr())); |
| 534 PumpLoop(); |
| 535 |
| 536 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); |
| 537 |
| 538 EXPECT_EQ(1UL, offline_pages.size()); |
| 539 EXPECT_EQ(kTestUrl, offline_pages[0].url); |
| 540 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].bookmark_id); |
| 541 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); |
| 542 EXPECT_EQ(1, offline_pages[0].access_count); |
| 510 } | 543 } |
| 511 | 544 |
| 512 TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) { | 545 TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) { |
| 513 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); | 546 const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); |
| 514 | 547 |
| 515 EXPECT_EQ(0UL, offline_pages.size()); | 548 EXPECT_EQ(0UL, offline_pages.size()); |
| 516 } | 549 } |
| 517 | 550 |
| 518 TEST_F(OfflinePageModelTest, GetAllPagesStoreFailure) { | 551 TEST_F(OfflinePageModelTest, GetAllPagesStoreFailure) { |
| 519 GetStore()->set_test_scenario( | 552 GetStore()->set_test_scenario( |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 } | 718 } |
| 686 | 719 |
| 687 // Test that model returns pages that are older than 30 days as candidates for | 720 // Test that model returns pages that are older than 30 days as candidates for |
| 688 // clean up, hence the numbers in time delta. | 721 // clean up, hence the numbers in time delta. |
| 689 TEST_F(OfflinePageModelTest, GetPagesToCleanUp) { | 722 TEST_F(OfflinePageModelTest, GetPagesToCleanUp) { |
| 690 base::Time now = base::Time::Now(); | 723 base::Time now = base::Time::Now(); |
| 691 OfflinePageItem page_1( | 724 OfflinePageItem page_1( |
| 692 GURL(kTestUrl), kTestPageBookmarkId1, | 725 GURL(kTestUrl), kTestPageBookmarkId1, |
| 693 base::FilePath(FILE_PATH_LITERAL("/test/location/page1.mhtml")), | 726 base::FilePath(FILE_PATH_LITERAL("/test/location/page1.mhtml")), |
| 694 kTestFileSize, now - base::TimeDelta::FromDays(40)); | 727 kTestFileSize, now - base::TimeDelta::FromDays(40)); |
| 695 GetStore()->AddOfflinePage( | 728 GetStore()->AddOrUpdateOfflinePage( |
| 696 page_1, | 729 page_1, |
| 697 base::Bind(&OfflinePageModelTest::OnStoreUpdateDone, AsWeakPtr())); | 730 base::Bind(&OfflinePageModelTest::OnStoreUpdateDone, AsWeakPtr())); |
| 698 PumpLoop(); | 731 PumpLoop(); |
| 699 | 732 |
| 700 OfflinePageItem page_2( | 733 OfflinePageItem page_2( |
| 701 GURL(kTestUrl2), kTestPageBookmarkId2, | 734 GURL(kTestUrl2), kTestPageBookmarkId2, |
| 702 base::FilePath(FILE_PATH_LITERAL("/test/location/page2.mhtml")), | 735 base::FilePath(FILE_PATH_LITERAL("/test/location/page2.mhtml")), |
| 703 kTestFileSize, now - base::TimeDelta::FromDays(31)); | 736 kTestFileSize, now - base::TimeDelta::FromDays(31)); |
| 704 GetStore()->AddOfflinePage( | 737 GetStore()->AddOrUpdateOfflinePage( |
| 705 page_2, | 738 page_2, |
| 706 base::Bind(&OfflinePageModelTest::OnStoreUpdateDone, AsWeakPtr())); | 739 base::Bind(&OfflinePageModelTest::OnStoreUpdateDone, AsWeakPtr())); |
| 707 PumpLoop(); | 740 PumpLoop(); |
| 708 | 741 |
| 709 OfflinePageItem page_3( | 742 OfflinePageItem page_3( |
| 710 GURL("http://test.xyz"), 42, | 743 GURL("http://test.xyz"), 42, |
| 711 base::FilePath(FILE_PATH_LITERAL("/test/location/page3.mhtml")), | 744 base::FilePath(FILE_PATH_LITERAL("/test/location/page3.mhtml")), |
| 712 kTestFileSize, now - base::TimeDelta::FromDays(29)); | 745 kTestFileSize, now - base::TimeDelta::FromDays(29)); |
| 713 GetStore()->AddOfflinePage( | 746 GetStore()->AddOrUpdateOfflinePage( |
| 714 page_3, | 747 page_3, |
| 715 base::Bind(&OfflinePageModelTest::OnStoreUpdateDone, AsWeakPtr())); | 748 base::Bind(&OfflinePageModelTest::OnStoreUpdateDone, AsWeakPtr())); |
| 716 PumpLoop(); | 749 PumpLoop(); |
| 717 | 750 |
| 718 ResetModel(); | 751 ResetModel(); |
| 719 | 752 |
| 720 // Only page_1 and page_2 are expected to be picked up by the model as page_3 | 753 // Only page_1 and page_2 are expected to be picked up by the model as page_3 |
| 721 // has not been in the store long enough. | 754 // has not been in the store long enough. |
| 722 std::vector<OfflinePageItem> pages_to_clean_up = model()->GetPagesToCleanUp(); | 755 std::vector<OfflinePageItem> pages_to_clean_up = model()->GetPagesToCleanUp(); |
| 723 EXPECT_EQ(2UL, pages_to_clean_up.size()); | 756 EXPECT_EQ(2UL, pages_to_clean_up.size()); |
| 724 EXPECT_EQ(kTestUrl, pages_to_clean_up[0].url); | 757 EXPECT_EQ(kTestUrl, pages_to_clean_up[0].url); |
| 725 EXPECT_EQ(kTestPageBookmarkId1, pages_to_clean_up[0].bookmark_id); | 758 EXPECT_EQ(kTestPageBookmarkId1, pages_to_clean_up[0].bookmark_id); |
| 726 EXPECT_EQ(kTestUrl2, pages_to_clean_up[1].url); | 759 EXPECT_EQ(kTestUrl2, pages_to_clean_up[1].url); |
| 727 EXPECT_EQ(kTestPageBookmarkId2, pages_to_clean_up[1].bookmark_id); | 760 EXPECT_EQ(kTestPageBookmarkId2, pages_to_clean_up[1].bookmark_id); |
| 728 } | 761 } |
| 729 | 762 |
| 730 } // namespace offline_pages | 763 } // namespace offline_pages |
| OLD | NEW |