diff options
Diffstat (limited to 'components/offline_pages')
-rw-r--r-- | components/offline_pages/offline_page_model.cc | 5 | ||||
-rw-r--r-- | components/offline_pages/offline_page_model.h | 3 | ||||
-rw-r--r-- | components/offline_pages/offline_page_model_unittest.cc | 95 | ||||
-rw-r--r-- | components/offline_pages/offline_page_test_store.cc | 28 | ||||
-rw-r--r-- | components/offline_pages/offline_page_test_store.h | 10 |
5 files changed, 116 insertions, 25 deletions
diff --git a/components/offline_pages/offline_page_model.cc b/components/offline_pages/offline_page_model.cc index d0c536a..71102f7 100644 --- a/components/offline_pages/offline_page_model.cc +++ b/components/offline_pages/offline_page_model.cc @@ -108,6 +108,11 @@ bool OfflinePageModel::CanSavePage(const GURL& url) { return url.SchemeIsHTTPOrHTTPS(); } +// static +base::TimeDelta OfflinePageModel::GetFinalDeletionDelayForTesting() { + return kFinalDeletionDelay; +} + OfflinePageModel::OfflinePageModel( scoped_ptr<OfflinePageMetadataStore> store, const base::FilePath& archives_dir, diff --git a/components/offline_pages/offline_page_model.h b/components/offline_pages/offline_page_model.h index 631d522..48763f2 100644 --- a/components/offline_pages/offline_page_model.h +++ b/components/offline_pages/offline_page_model.h @@ -27,6 +27,7 @@ class GURL; namespace base { class SequencedTaskRunner; class Time; +class TimeDelta; } namespace bookmarks { class BookmarkModel; @@ -124,6 +125,8 @@ class OfflinePageModel : public KeyedService, // Returns true if an offline copy can be saved for the given URL. static bool CanSavePage(const GURL& url); + static base::TimeDelta GetFinalDeletionDelayForTesting(); + // All blocking calls/disk access will happen on the provided |task_runner|. OfflinePageModel(scoped_ptr<OfflinePageMetadataStore> store, const base::FilePath& archives_dir, diff --git a/components/offline_pages/offline_page_model_unittest.cc b/components/offline_pages/offline_page_model_unittest.cc index f1f817b..24d9bce 100644 --- a/components/offline_pages/offline_page_model_unittest.cc +++ b/components/offline_pages/offline_page_model_unittest.cc @@ -78,6 +78,9 @@ class OfflinePageModelTest // Runs until all of the tasks that are not delayed are gone from the task // queue. void PumpLoop(); + // Fast-forwards virtual time by |delta|, causing tasks with a remaining + // delay less than or equal to |delta| to be executed. + void FastForwardBy(base::TimeDelta delta); void ResetResults(); OfflinePageModel* model() { return model_.get(); } @@ -198,6 +201,10 @@ void OfflinePageModelTest::PumpLoop() { task_runner_->RunUntilIdle(); } +void OfflinePageModelTest::FastForwardBy(base::TimeDelta delta) { + task_runner_->FastForwardBy(delta); +} + void OfflinePageModelTest::ResetResults() { last_save_result_ = SavePageResult::CANCELLED; last_delete_result_ = DeletePageResult::CANCELLED; @@ -450,6 +457,30 @@ TEST_F(OfflinePageModelTest, MarkPageForDeletion) { EXPECT_EQ(1UL, offline_pages_after_undo.size()); } +TEST_F(OfflinePageModelTest, FinalizePageDeletion) { + scoped_ptr<OfflinePageTestArchiver> archiver( + BuildArchiver(kTestUrl, + OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED) + .Pass()); + model()->SavePage( + kTestUrl, kTestPageBookmarkId1, archiver.Pass(), + base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); + PumpLoop(); + + // Mark the page for deletion. + model()->MarkPageForDeletion( + kTestPageBookmarkId1, + base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); + PumpLoop(); + + EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); + + // Fast forward to trigger the page deletion. + FastForwardBy(OfflinePageModel::GetFinalDeletionDelayForTesting()); + + EXPECT_EQ(0UL, GetStore()->GetAllPages().size()); +} + TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) { const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); @@ -478,7 +509,7 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) { PumpLoop(); EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); - EXPECT_EQ(1u, store->offline_pages().size()); + EXPECT_EQ(1u, store->GetAllPages().size()); ResetResults(); @@ -493,7 +524,7 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) { PumpLoop(); EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); - EXPECT_EQ(2u, store->offline_pages().size()); + EXPECT_EQ(2u, store->GetAllPages().size()); ResetResults(); @@ -506,8 +537,8 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) { EXPECT_EQ(last_deleted_bookmark_id(), kTestPageBookmarkId1); EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); - ASSERT_EQ(1u, store->offline_pages().size()); - EXPECT_EQ(kTestUrl2, store->offline_pages()[0].url); + ASSERT_EQ(1u, store->GetAllPages().size()); + EXPECT_EQ(kTestUrl2, store->GetAllPages()[0].url); // Delete another page. model()->DeletePageByBookmarkId( @@ -520,7 +551,7 @@ TEST_F(OfflinePageModelTest, DeletePageSuccessful) { EXPECT_EQ(last_deleted_bookmark_id(), kTestPageBookmarkId2); EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); - EXPECT_EQ(0u, store->offline_pages().size()); + EXPECT_EQ(0u, store->GetAllPages().size()); } TEST_F(OfflinePageModelTest, DeletePageNotFound) { @@ -602,6 +633,54 @@ TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissingAfterLoad) { EXPECT_EQ(0UL, model()->GetAllPages().size()); } +TEST_F(OfflinePageModelTest, DeleteMultiplePages) { + OfflinePageTestStore* store = GetStore(); + + // Save 3 pages. + scoped_ptr<OfflinePageTestArchiver> archiver( + BuildArchiver(kTestUrl, + OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED) + .Pass()); + model()->SavePage( + kTestUrl, kTestPageBookmarkId1, archiver.Pass(), + base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); + PumpLoop(); + + scoped_ptr<OfflinePageTestArchiver> archiver2( + BuildArchiver(kTestUrl2, + OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED) + .Pass()); + model()->SavePage( + kTestUrl2, kTestPageBookmarkId2, archiver2.Pass(), + base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); + PumpLoop(); + + scoped_ptr<OfflinePageTestArchiver> archiver3( + BuildArchiver(kTestUrl3, + OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED) + .Pass()); + model()->SavePage( + kTestUrl3, kTestPageBookmarkId3, archiver3.Pass(), + base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); + PumpLoop(); + + EXPECT_EQ(3u, store->GetAllPages().size()); + + // Delete multiple pages. + std::vector<int64> ids_to_delete; + ids_to_delete.push_back(kTestPageBookmarkId2); + ids_to_delete.push_back(kTestPageBookmarkId1); + ids_to_delete.push_back(23434LL); // Non-existent ID. + model()->DeletePagesByBookmarkId( + ids_to_delete, base::Bind(&OfflinePageModelTest::OnDeletePageDone, + AsWeakPtr())); + PumpLoop(); + + // Success is expected if at least one page is deleted successfully. + EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); + EXPECT_EQ(1u, store->GetAllPages().size()); +} + TEST_F(OfflinePageModelTest, GetPageByBookmarkId) { scoped_ptr<OfflinePageTestArchiver> archiver( BuildArchiver(kTestUrl, @@ -790,7 +869,7 @@ TEST_F(OfflinePageModelTest, ClearAll) { const std::vector<OfflinePageItem>& offline_pages = model()->GetAllPages(); EXPECT_EQ(2UL, offline_pages.size()); - EXPECT_EQ(2UL, GetStore()->offline_pages().size()); + EXPECT_EQ(2UL, GetStore()->GetAllPages().size()); base::FilePath archiver_path = offline_pages[0].file_path; EXPECT_TRUE(base::PathExists(archiver_path)); @@ -799,7 +878,7 @@ TEST_F(OfflinePageModelTest, ClearAll) { base::Bind(&OfflinePageModelTest::OnClearAllDone, AsWeakPtr())); PumpLoop(); EXPECT_EQ(0UL, model()->GetAllPages().size()); - EXPECT_EQ(0UL, GetStore()->offline_pages().size()); + EXPECT_EQ(0UL, GetStore()->GetAllPages().size()); EXPECT_FALSE(base::PathExists(archiver_path)); // The model should reload the store after the reset. All model operations @@ -813,7 +892,7 @@ TEST_F(OfflinePageModelTest, ClearAll) { base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); PumpLoop(); EXPECT_EQ(1UL, model()->GetAllPages().size()); - EXPECT_EQ(1UL, GetStore()->offline_pages().size()); + EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); } TEST_F(OfflinePageModelTest, BookmarkNodeChangesUrl) { diff --git a/components/offline_pages/offline_page_test_store.cc b/components/offline_pages/offline_page_test_store.cc index 3a5b256..755191c 100644 --- a/components/offline_pages/offline_page_test_store.cc +++ b/components/offline_pages/offline_page_test_store.cc @@ -31,7 +31,7 @@ void OfflinePageTestStore::Load(const LoadCallback& callback) { load_status = OfflinePageMetadataStore::LOAD_SUCCEEDED; } task_runner_->PostTask(FROM_HERE, - base::Bind(callback, load_status, offline_pages_)); + base::Bind(callback, load_status, GetAllPages())); } void OfflinePageTestStore::AddOrUpdateOfflinePage( @@ -40,7 +40,7 @@ void OfflinePageTestStore::AddOrUpdateOfflinePage( last_saved_page_ = offline_page; bool result = scenario_ != TestScenario::WRITE_FAILED; if (result) - offline_pages_.push_back(offline_page); + offline_pages_[offline_page.bookmark_id] = offline_page; task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); } @@ -50,12 +50,11 @@ void OfflinePageTestStore::RemoveOfflinePages( ASSERT_FALSE(bookmark_ids.empty()); bool result = false; if (scenario_ != TestScenario::REMOVE_FAILED) { - for (auto iter = offline_pages_.begin(); iter != offline_pages_.end(); - ++iter) { - if (iter->bookmark_id == bookmark_ids[0]) { + for (const auto& bookmark_id : bookmark_ids) { + auto iter = offline_pages_.find(bookmark_id); + if (iter != offline_pages_.end()) { offline_pages_.erase(iter); result = true; - break; } } } @@ -71,12 +70,17 @@ void OfflinePageTestStore::Reset(const ResetCallback& callback) { void OfflinePageTestStore::UpdateLastAccessTime( int64 bookmark_id, const base::Time& last_access_time) { - for (auto& offline_page : offline_pages_) { - if (offline_page.bookmark_id == bookmark_id) { - offline_page.last_access_time = last_access_time; - return; - } - } + auto iter = offline_pages_.find(bookmark_id); + if (iter == offline_pages_.end()) + return; + iter->second.last_access_time = last_access_time; +} + +std::vector<OfflinePageItem> OfflinePageTestStore::GetAllPages() const { + std::vector<OfflinePageItem> offline_pages; + for (const auto& id_page_pair : offline_pages_) + offline_pages.push_back(id_page_pair.second); + return offline_pages; } } // namespace offline_pages diff --git a/components/offline_pages/offline_page_test_store.h b/components/offline_pages/offline_page_test_store.h index f24ac3c..84a0eea 100644 --- a/components/offline_pages/offline_page_test_store.h +++ b/components/offline_pages/offline_page_test_store.h @@ -5,6 +5,7 @@ #ifndef COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_TEST_STORE_H_ #define COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_TEST_STORE_H_ +#include <map> #include <vector> #include "base/macros.h" @@ -43,20 +44,19 @@ class OfflinePageTestStore : public OfflinePageMetadataStore { void UpdateLastAccessTime(int64 bookmark_id, const base::Time& last_access_time); + // Returns all pages, regardless their states. + std::vector<OfflinePageItem> GetAllPages() const; + const OfflinePageItem& last_saved_page() const { return last_saved_page_; } void set_test_scenario(TestScenario scenario) { scenario_ = scenario; }; - const std::vector<OfflinePageItem>& offline_pages() const { - return offline_pages_; - } - private: OfflinePageItem last_saved_page_; scoped_refptr<base::SingleThreadTaskRunner> task_runner_; TestScenario scenario_; - std::vector<OfflinePageItem> offline_pages_; + std::map<int64, OfflinePageItem> offline_pages_; DISALLOW_ASSIGN(OfflinePageTestStore); }; |