| 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" | 
| 11 #include "base/files/scoped_temp_dir.h" | 11 #include "base/files/scoped_temp_dir.h" | 
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" | 
| 13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" | 
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" | 
| 15 #include "base/strings/string16.h" |  | 
| 16 #include "base/strings/utf_string_conversions.h" |  | 
| 17 #include "base/time/time.h" | 15 #include "base/time/time.h" | 
| 18 #include "components/bookmarks/browser/bookmark_node.h" | 16 #include "components/bookmarks/browser/bookmark_node.h" | 
| 19 #include "components/offline_pages/offline_page_item.h" | 17 #include "components/offline_pages/offline_page_item.h" | 
| 20 #include "components/offline_pages/offline_page_metadata_store.h" | 18 #include "components/offline_pages/offline_page_test_archiver.h" | 
|  | 19 #include "components/offline_pages/offline_page_test_store.h" | 
| 21 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" | 
| 22 #include "url/gurl.h" | 21 #include "url/gurl.h" | 
| 23 | 22 | 
| 24 using SavePageResult = offline_pages::OfflinePageModel::SavePageResult; | 23 using SavePageResult = offline_pages::OfflinePageModel::SavePageResult; | 
| 25 using DeletePageResult = offline_pages::OfflinePageModel::DeletePageResult; | 24 using DeletePageResult = offline_pages::OfflinePageModel::DeletePageResult; | 
| 26 | 25 | 
| 27 namespace offline_pages { | 26 namespace offline_pages { | 
| 28 | 27 | 
| 29 namespace { | 28 namespace { | 
| 30 const GURL kTestUrl("http://example.com"); | 29 const GURL kTestUrl("http://example.com"); | 
| 31 const int64 kTestPageBookmarkId1 = 1234LL; | 30 const int64 kTestPageBookmarkId1 = 1234LL; | 
| 32 const GURL kTestUrl2("http://other.page.com"); | 31 const GURL kTestUrl2("http://other.page.com"); | 
| 33 const GURL kTestUrl3("http://test.xyz"); | 32 const GURL kTestUrl3("http://test.xyz"); | 
| 34 const GURL kFileUrl("file:///foo"); | 33 const GURL kFileUrl("file:///foo"); | 
| 35 const int64 kTestPageBookmarkId2 = 5678LL; | 34 const int64 kTestPageBookmarkId2 = 5678LL; | 
| 36 const int64 kTestPageBookmarkId3 = 42LL; | 35 const int64 kTestPageBookmarkId3 = 42LL; | 
| 37 const int64 kTestFileSize = 876543LL; | 36 const int64 kTestFileSize = 876543LL; | 
| 38 | 37 | 
| 39 class OfflinePageTestStore : public OfflinePageMetadataStore { |  | 
| 40  public: |  | 
| 41   enum class TestScenario { |  | 
| 42     SUCCESSFUL, |  | 
| 43     WRITE_FAILED, |  | 
| 44     LOAD_FAILED, |  | 
| 45     REMOVE_FAILED, |  | 
| 46   }; |  | 
| 47 |  | 
| 48   explicit OfflinePageTestStore( |  | 
| 49       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); |  | 
| 50   explicit OfflinePageTestStore(const OfflinePageTestStore& other_store); |  | 
| 51   ~OfflinePageTestStore() override; |  | 
| 52 |  | 
| 53   // OfflinePageMetadataStore overrides: |  | 
| 54   void Load(const LoadCallback& callback) override; |  | 
| 55   void AddOrUpdateOfflinePage(const OfflinePageItem& offline_page, |  | 
| 56                               const UpdateCallback& callback) override; |  | 
| 57   void RemoveOfflinePages(const std::vector<int64>& bookmark_ids, |  | 
| 58                           const UpdateCallback& callback) override; |  | 
| 59   void Reset(const ResetCallback& callback) override; |  | 
| 60 |  | 
| 61   void UpdateLastAccessTime(int64 bookmark_id, |  | 
| 62                             const base::Time& last_access_time); |  | 
| 63 |  | 
| 64   const OfflinePageItem& last_saved_page() const { return last_saved_page_; } |  | 
| 65 |  | 
| 66   void set_test_scenario(TestScenario scenario) { scenario_ = scenario; }; |  | 
| 67 |  | 
| 68   const std::vector<OfflinePageItem>& offline_pages() const { |  | 
| 69     return offline_pages_; |  | 
| 70   } |  | 
| 71 |  | 
| 72  private: |  | 
| 73   OfflinePageItem last_saved_page_; |  | 
| 74   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |  | 
| 75   TestScenario scenario_; |  | 
| 76 |  | 
| 77   std::vector<OfflinePageItem> offline_pages_; |  | 
| 78 |  | 
| 79   DISALLOW_ASSIGN(OfflinePageTestStore); |  | 
| 80 }; |  | 
| 81 |  | 
| 82 OfflinePageTestStore::OfflinePageTestStore( |  | 
| 83     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) |  | 
| 84     : task_runner_(task_runner), |  | 
| 85       scenario_(TestScenario::SUCCESSFUL) { |  | 
| 86 } |  | 
| 87 |  | 
| 88 OfflinePageTestStore::OfflinePageTestStore( |  | 
| 89     const OfflinePageTestStore& other_store) |  | 
| 90     : task_runner_(other_store.task_runner_), |  | 
| 91       scenario_(other_store.scenario_), |  | 
| 92       offline_pages_(other_store.offline_pages_) {} |  | 
| 93 |  | 
| 94 OfflinePageTestStore::~OfflinePageTestStore() { |  | 
| 95 } |  | 
| 96 |  | 
| 97 void OfflinePageTestStore::Load(const LoadCallback& callback) { |  | 
| 98   OfflinePageMetadataStore::LoadStatus load_status; |  | 
| 99   if (scenario_ != TestScenario::LOAD_FAILED) { |  | 
| 100     load_status = OfflinePageMetadataStore::LOAD_SUCCEEDED; |  | 
| 101   } else { |  | 
| 102     load_status = OfflinePageMetadataStore::STORE_LOAD_FAILED; |  | 
| 103     offline_pages_.clear(); |  | 
| 104   } |  | 
| 105   task_runner_->PostTask( |  | 
| 106       FROM_HERE, base::Bind(callback, load_status, offline_pages_)); |  | 
| 107 } |  | 
| 108 |  | 
| 109 void OfflinePageTestStore::AddOrUpdateOfflinePage( |  | 
| 110     const OfflinePageItem& offline_page, const UpdateCallback& callback) { |  | 
| 111   last_saved_page_ = offline_page; |  | 
| 112   bool result = scenario_ != TestScenario::WRITE_FAILED; |  | 
| 113   if (result) { |  | 
| 114     offline_pages_.push_back(offline_page); |  | 
| 115   } |  | 
| 116   task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); |  | 
| 117 } |  | 
| 118 |  | 
| 119 void OfflinePageTestStore::RemoveOfflinePages( |  | 
| 120     const std::vector<int64>& bookmark_ids, |  | 
| 121     const UpdateCallback& callback) { |  | 
| 122   ASSERT_FALSE(bookmark_ids.empty()); |  | 
| 123   bool result = false; |  | 
| 124   if (scenario_ != TestScenario::REMOVE_FAILED) { |  | 
| 125     for (auto iter = offline_pages_.begin(); |  | 
| 126          iter != offline_pages_.end(); ++iter) { |  | 
| 127       if (iter->bookmark_id == bookmark_ids[0]) { |  | 
| 128         offline_pages_.erase(iter); |  | 
| 129         result = true; |  | 
| 130         break; |  | 
| 131       } |  | 
| 132     } |  | 
| 133   } |  | 
| 134 |  | 
| 135   task_runner_->PostTask(FROM_HERE, base::Bind(callback, result)); |  | 
| 136 } |  | 
| 137 |  | 
| 138 void OfflinePageTestStore::Reset(const ResetCallback& callback) { |  | 
| 139   offline_pages_.clear(); |  | 
| 140   task_runner_->PostTask(FROM_HERE, base::Bind(callback, true)); |  | 
| 141 } |  | 
| 142 |  | 
| 143 void OfflinePageTestStore:: UpdateLastAccessTime( |  | 
| 144     int64 bookmark_id, const base::Time& last_access_time) { |  | 
| 145   for (auto& offline_page : offline_pages_) { |  | 
| 146     if (offline_page.bookmark_id == bookmark_id) { |  | 
| 147       offline_page.last_access_time = last_access_time; |  | 
| 148       return; |  | 
| 149     } |  | 
| 150   } |  | 
| 151 } |  | 
| 152 |  | 
| 153 }  // namespace | 38 }  // namespace | 
| 154 | 39 | 
| 155 class OfflinePageModelTest; |  | 
| 156 |  | 
| 157 class OfflinePageTestArchiver : public OfflinePageArchiver { |  | 
| 158  public: |  | 
| 159   OfflinePageTestArchiver( |  | 
| 160       OfflinePageModelTest* test, |  | 
| 161       const GURL& url, |  | 
| 162       ArchiverResult result, |  | 
| 163       const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); |  | 
| 164   ~OfflinePageTestArchiver() override; |  | 
| 165 |  | 
| 166   // OfflinePageArchiver implementation: |  | 
| 167   void CreateArchive(const base::FilePath& archives_dir, |  | 
| 168                      const CreateArchiveCallback& callback) override; |  | 
| 169 |  | 
| 170   void CompleteCreateArchive(); |  | 
| 171 |  | 
| 172   void set_delayed(bool delayed) { delayed_ = delayed; } |  | 
| 173 |  | 
| 174   bool create_archive_called() const { return create_archive_called_; } |  | 
| 175 |  | 
| 176  private: |  | 
| 177   OfflinePageModelTest* test_;  // Outlive OfflinePageTestArchiver. |  | 
| 178   GURL url_; |  | 
| 179   base::FilePath archives_dir_; |  | 
| 180   ArchiverResult result_; |  | 
| 181   bool create_archive_called_; |  | 
| 182   bool delayed_; |  | 
| 183   CreateArchiveCallback callback_; |  | 
| 184   scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |  | 
| 185   DISALLOW_COPY_AND_ASSIGN(OfflinePageTestArchiver); |  | 
| 186 }; |  | 
| 187 |  | 
| 188 class OfflinePageModelTest | 40 class OfflinePageModelTest | 
| 189     : public testing::Test, | 41     : public testing::Test, | 
| 190       public OfflinePageModel::Observer, | 42       public OfflinePageModel::Observer, | 
|  | 43       public OfflinePageTestArchiver::Observer, | 
| 191       public base::SupportsWeakPtr<OfflinePageModelTest> { | 44       public base::SupportsWeakPtr<OfflinePageModelTest> { | 
| 192  public: | 45  public: | 
| 193   OfflinePageModelTest(); | 46   OfflinePageModelTest(); | 
| 194   ~OfflinePageModelTest() override; | 47   ~OfflinePageModelTest() override; | 
| 195 | 48 | 
| 196   void SetUp() override; | 49   void SetUp() override; | 
| 197   void TearDown() override; | 50   void TearDown() override; | 
| 198 | 51 | 
| 199   // OfflinePageModel::Observer implementation. | 52   // OfflinePageModel::Observer implementation. | 
| 200   void OfflinePageModelLoaded(OfflinePageModel* model) override; | 53   void OfflinePageModelLoaded(OfflinePageModel* model) override; | 
| 201   void OfflinePageModelChanged(OfflinePageModel* model) override; | 54   void OfflinePageModelChanged(OfflinePageModel* model) override; | 
| 202   void OfflinePageDeleted(int64 bookmark_id) override; | 55   void OfflinePageDeleted(int64 bookmark_id) override; | 
| 203 | 56 | 
|  | 57   // OfflinePageTestArchiver::Observer implementation. | 
|  | 58   void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override; | 
|  | 59 | 
| 204   // OfflinePageModel callbacks. | 60   // OfflinePageModel callbacks. | 
| 205   void OnSavePageDone(SavePageResult result); | 61   void OnSavePageDone(SavePageResult result); | 
| 206   void OnDeletePageDone(DeletePageResult result); | 62   void OnDeletePageDone(DeletePageResult result); | 
| 207   void OnClearAllDone(); | 63   void OnClearAllDone(); | 
| 208 | 64 | 
| 209   // OfflinePageMetadataStore callbacks. | 65   // OfflinePageMetadataStore callbacks. | 
| 210   void OnStoreUpdateDone(bool /* success */); | 66   void OnStoreUpdateDone(bool /* success */); | 
| 211 | 67 | 
| 212   scoped_ptr<OfflinePageTestArchiver> BuildArchiver( | 68   scoped_ptr<OfflinePageTestArchiver> BuildArchiver( | 
| 213       const GURL& url, | 69       const GURL& url, | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 235 | 91 | 
| 236   DeletePageResult last_delete_result() const { | 92   DeletePageResult last_delete_result() const { | 
| 237     return last_delete_result_; | 93     return last_delete_result_; | 
| 238   } | 94   } | 
| 239 | 95 | 
| 240   int64 last_deleted_bookmark_id() const { | 96   int64 last_deleted_bookmark_id() const { | 
| 241     return last_deleted_bookmark_id_; | 97     return last_deleted_bookmark_id_; | 
| 242   } | 98   } | 
| 243 | 99 | 
| 244   const base::FilePath& last_archiver_path() { return last_archiver_path_; } | 100   const base::FilePath& last_archiver_path() { return last_archiver_path_; } | 
| 245   void set_last_archiver_path(const base::FilePath& last_archiver_path) { |  | 
| 246     last_archiver_path_ = last_archiver_path; |  | 
| 247   } |  | 
| 248 | 101 | 
| 249  private: | 102  private: | 
| 250   base::MessageLoop message_loop_; | 103   base::MessageLoop message_loop_; | 
| 251   base::ScopedTempDir temp_dir_; | 104   base::ScopedTempDir temp_dir_; | 
| 252 | 105 | 
| 253   scoped_ptr<OfflinePageModel> model_; | 106   scoped_ptr<OfflinePageModel> model_; | 
| 254   SavePageResult last_save_result_; | 107   SavePageResult last_save_result_; | 
| 255   DeletePageResult last_delete_result_; | 108   DeletePageResult last_delete_result_; | 
| 256   base::FilePath last_archiver_path_; | 109   base::FilePath last_archiver_path_; | 
| 257   int64 last_deleted_bookmark_id_; | 110   int64 last_deleted_bookmark_id_; | 
| 258 }; | 111 }; | 
| 259 | 112 | 
| 260 OfflinePageTestArchiver::OfflinePageTestArchiver( |  | 
| 261     OfflinePageModelTest* test, |  | 
| 262     const GURL& url, |  | 
| 263     ArchiverResult result, |  | 
| 264     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) |  | 
| 265     : test_(test), |  | 
| 266       url_(url), |  | 
| 267       result_(result), |  | 
| 268       create_archive_called_(false), |  | 
| 269       delayed_(false), |  | 
| 270       task_runner_(task_runner) { |  | 
| 271 } |  | 
| 272 |  | 
| 273 OfflinePageTestArchiver::~OfflinePageTestArchiver() { |  | 
| 274   EXPECT_TRUE(create_archive_called_); |  | 
| 275 } |  | 
| 276 |  | 
| 277 void OfflinePageTestArchiver::CreateArchive( |  | 
| 278     const base::FilePath& archives_dir, |  | 
| 279     const CreateArchiveCallback& callback) { |  | 
| 280   create_archive_called_ = true; |  | 
| 281   callback_ = callback; |  | 
| 282   archives_dir_ = archives_dir; |  | 
| 283   if (!delayed_) |  | 
| 284     CompleteCreateArchive(); |  | 
| 285 } |  | 
| 286 |  | 
| 287 void OfflinePageTestArchiver::CompleteCreateArchive() { |  | 
| 288   DCHECK(!callback_.is_null()); |  | 
| 289   base::FilePath archive_path; |  | 
| 290   ASSERT_TRUE(base::CreateTemporaryFileInDir(archives_dir_, &archive_path)); |  | 
| 291   test_->set_last_archiver_path(archive_path); |  | 
| 292   task_runner_->PostTask(FROM_HERE, base::Bind(callback_, this, result_, url_, |  | 
| 293                                                archive_path, kTestFileSize)); |  | 
| 294 } |  | 
| 295 |  | 
| 296 OfflinePageModelTest::OfflinePageModelTest() | 113 OfflinePageModelTest::OfflinePageModelTest() | 
| 297     : last_save_result_(SavePageResult::CANCELLED), | 114     : last_save_result_(SavePageResult::CANCELLED), | 
| 298       last_delete_result_(DeletePageResult::CANCELLED), | 115       last_delete_result_(DeletePageResult::CANCELLED), | 
| 299       last_deleted_bookmark_id_(-1) { | 116       last_deleted_bookmark_id_(-1) { | 
| 300 } | 117 } | 
| 301 | 118 | 
| 302 OfflinePageModelTest::~OfflinePageModelTest() { | 119 OfflinePageModelTest::~OfflinePageModelTest() { | 
| 303 } | 120 } | 
| 304 | 121 | 
| 305 void OfflinePageModelTest::SetUp() { | 122 void OfflinePageModelTest::SetUp() { | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 319 } | 136 } | 
| 320 | 137 | 
| 321 void OfflinePageModelTest::OfflinePageModelChanged(OfflinePageModel* model) { | 138 void OfflinePageModelTest::OfflinePageModelChanged(OfflinePageModel* model) { | 
| 322   ASSERT_EQ(model_.get(), model); | 139   ASSERT_EQ(model_.get(), model); | 
| 323 } | 140 } | 
| 324 | 141 | 
| 325 void OfflinePageModelTest::OfflinePageDeleted(int64 bookmark_id) { | 142 void OfflinePageModelTest::OfflinePageDeleted(int64 bookmark_id) { | 
| 326   last_deleted_bookmark_id_ = bookmark_id; | 143   last_deleted_bookmark_id_ = bookmark_id; | 
| 327 } | 144 } | 
| 328 | 145 | 
|  | 146 void OfflinePageModelTest::SetLastPathCreatedByArchiver( | 
|  | 147     const base::FilePath& file_path) { | 
|  | 148   last_archiver_path_ = file_path; | 
|  | 149 } | 
|  | 150 | 
| 329 void OfflinePageModelTest::OnSavePageDone( | 151 void OfflinePageModelTest::OnSavePageDone( | 
| 330     OfflinePageModel::SavePageResult result) { | 152     OfflinePageModel::SavePageResult result) { | 
| 331   last_save_result_ = result; | 153   last_save_result_ = result; | 
| 332 } | 154 } | 
| 333 | 155 | 
| 334 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) { | 156 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) { | 
| 335   last_delete_result_ = result; | 157   last_delete_result_ = result; | 
| 336 } | 158 } | 
| 337 | 159 | 
| 338 void OfflinePageModelTest::OnClearAllDone() { | 160 void OfflinePageModelTest::OnClearAllDone() { | 
| 339   base::RunLoop().RunUntilIdle(); | 161   base::RunLoop().RunUntilIdle(); | 
| 340 } | 162 } | 
| 341 | 163 | 
| 342 void OfflinePageModelTest::OnStoreUpdateDone(bool /* success - ignored */) { | 164 void OfflinePageModelTest::OnStoreUpdateDone(bool /* success - ignored */) { | 
| 343 } | 165 } | 
| 344 | 166 | 
| 345 scoped_ptr<OfflinePageTestArchiver> OfflinePageModelTest::BuildArchiver( | 167 scoped_ptr<OfflinePageTestArchiver> OfflinePageModelTest::BuildArchiver( | 
| 346     const GURL& url, | 168     const GURL& url, | 
| 347     OfflinePageArchiver::ArchiverResult result) { | 169     OfflinePageArchiver::ArchiverResult result) { | 
| 348   return scoped_ptr<OfflinePageTestArchiver>( | 170   return scoped_ptr<OfflinePageTestArchiver>(new OfflinePageTestArchiver( | 
| 349       new OfflinePageTestArchiver(this, url, result, task_runner())); | 171       this, url, result, kTestFileSize, task_runner())); | 
| 350 } | 172 } | 
| 351 | 173 | 
| 352 scoped_ptr<OfflinePageMetadataStore> OfflinePageModelTest::BuildStore() { | 174 scoped_ptr<OfflinePageMetadataStore> OfflinePageModelTest::BuildStore() { | 
| 353   return scoped_ptr<OfflinePageMetadataStore>( | 175   return scoped_ptr<OfflinePageMetadataStore>( | 
| 354       new OfflinePageTestStore(task_runner())); | 176       new OfflinePageTestStore(task_runner())); | 
| 355 } | 177 } | 
| 356 | 178 | 
| 357 scoped_ptr<OfflinePageModel> OfflinePageModelTest::BuildModel( | 179 scoped_ptr<OfflinePageModel> OfflinePageModelTest::BuildModel( | 
| 358     scoped_ptr<OfflinePageMetadataStore> store) { | 180     scoped_ptr<OfflinePageMetadataStore> store) { | 
| 359   return scoped_ptr<OfflinePageModel>( | 181   return scoped_ptr<OfflinePageModel>( | 
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1015 | 837 | 
| 1016   // Chrome should not crash when a bookmark with no offline copy is changed. | 838   // Chrome should not crash when a bookmark with no offline copy is changed. | 
| 1017   // http://crbug.com/560518 | 839   // http://crbug.com/560518 | 
| 1018   bookmark_node.set_url(kTestUrl); | 840   bookmark_node.set_url(kTestUrl); | 
| 1019   model()->BookmarkNodeChanged(nullptr, &bookmark_node); | 841   model()->BookmarkNodeChanged(nullptr, &bookmark_node); | 
| 1020   PumpLoop(); | 842   PumpLoop(); | 
| 1021   EXPECT_EQ(0UL, model()->GetAllPages().size()); | 843   EXPECT_EQ(0UL, model()->GetAllPages().size()); | 
| 1022 } | 844 } | 
| 1023 | 845 | 
| 1024 }  // namespace offline_pages | 846 }  // namespace offline_pages | 
| OLD | NEW | 
|---|