| OLD | NEW |
| 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 "chrome/browser/android/offline_pages/recent_tab_helper.h" | 5 #include "chrome/browser/android/offline_pages/recent_tab_helper.h" |
| 6 | 6 |
| 7 #include "base/run_loop.h" |
| 8 #include "base/test/test_mock_time_task_runner.h" |
| 9 #include "base/thread_task_runner_handle.h" |
| 10 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h" |
| 11 #include "chrome/browser/android/offline_pages/test_offline_page_model_builder.h
" |
| 7 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 12 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 13 #include "components/offline_pages/offline_page_item.h" |
| 14 #include "components/offline_pages/offline_page_model.h" |
| 15 #include "components/offline_pages/offline_page_test_archiver.h" |
| 16 #include "content/public/browser/navigation_entry.h" |
| 17 #include "content/public/browser/navigation_handle.h" |
| 18 #include "content/public/browser/web_contents.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 20 |
| 10 namespace offline_pages { | 21 namespace offline_pages { |
| 11 | 22 |
| 12 class RecentTabHelperTest : public ChromeRenderViewHostTestHarness { | 23 class TestArchiveFactoryImpl : public RecentTabHelper::TestArchiveFactory { |
| 13 public: | 24 public: |
| 14 RecentTabHelperTest() {} | 25 explicit TestArchiveFactoryImpl(OfflinePageTestArchiver::Observer* observer); |
| 26 ~TestArchiveFactoryImpl() override {} |
| 27 |
| 28 std::unique_ptr<OfflinePageArchiver> CreateArchiver( |
| 29 content::WebContents* web_contents) override; |
| 30 private: |
| 31 OfflinePageTestArchiver::Observer* observer_; // observer owns this. |
| 32 }; |
| 33 |
| 34 class RecentTabHelperTest |
| 35 : public ChromeRenderViewHostTestHarness, |
| 36 public OfflinePageModel::Observer, |
| 37 public OfflinePageTestArchiver::Observer { |
| 38 public: |
| 39 RecentTabHelperTest(); |
| 15 ~RecentTabHelperTest() override {} | 40 ~RecentTabHelperTest() override {} |
| 16 | 41 |
| 17 void SetUp() override; | 42 void SetUp() override; |
| 43 void SetUpTestArchiver(const GURL& url); |
| 44 void SetUpMockTaskRunner(); |
| 45 const std::vector<OfflinePageItem>& GetAllPages(); |
| 18 | 46 |
| 19 RecentTabHelper* recent_tab_helper() const { | 47 // Runs default thread. |
| 20 return recent_tab_helper_; | 48 void RunUntilIdle(); |
| 49 // Moves forward the snapshot controller's task runner. |
| 50 void FastForwardSnapshotController(); |
| 51 |
| 52 RecentTabHelper* recent_tab_helper() const { return recent_tab_helper_; } |
| 53 OfflinePageModel* model() const { return model_; } |
| 54 const std::vector<OfflinePageItem>& all_pages() { return all_pages_; } |
| 55 size_t model_changed_count() { return model_changed_count_; } |
| 56 size_t model_removed_count() { return model_removed_count_; } |
| 57 |
| 58 // OfflinePageModel::Observer |
| 59 void OfflinePageModelLoaded(OfflinePageModel* model) override { } |
| 60 void OfflinePageModelChanged(OfflinePageModel* model) override { |
| 61 model_changed_count_++; |
| 62 } |
| 63 void OfflinePageDeleted(int64_t, const offline_pages::ClientId&) override { |
| 64 model_removed_count_++; |
| 21 } | 65 } |
| 22 | 66 |
| 67 // OfflinePageTestArchiver::Observer |
| 68 void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override {} |
| 69 |
| 23 private: | 70 private: |
| 71 void OnGetAllPagesDone(const std::vector<OfflinePageItem>& result); |
| 72 |
| 24 RecentTabHelper* recent_tab_helper_; // Owned by WebContents. | 73 RecentTabHelper* recent_tab_helper_; // Owned by WebContents. |
| 74 OfflinePageModel* model_; // Keyed service |
| 75 size_t model_changed_count_; |
| 76 size_t model_removed_count_; |
| 77 std::vector<OfflinePageItem> all_pages_; |
| 78 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
| 79 |
| 80 base::WeakPtrFactory<RecentTabHelperTest> weak_ptr_factory_; |
| 25 | 81 |
| 26 DISALLOW_COPY_AND_ASSIGN(RecentTabHelperTest); | 82 DISALLOW_COPY_AND_ASSIGN(RecentTabHelperTest); |
| 27 }; | 83 }; |
| 28 | 84 |
| 85 TestArchiveFactoryImpl::TestArchiveFactoryImpl( |
| 86 OfflinePageTestArchiver::Observer* observer) |
| 87 : observer_(observer) { |
| 88 } |
| 89 |
| 90 std::unique_ptr<OfflinePageArchiver> TestArchiveFactoryImpl::CreateArchiver( |
| 91 content::WebContents* web_contents) { |
| 92 const size_t kArchiveSizeToReport = 1234; |
| 93 std::unique_ptr<OfflinePageTestArchiver> archiver(new OfflinePageTestArchiver( |
| 94 observer_, |
| 95 web_contents->GetLastCommittedURL(), |
| 96 offline_pages::OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED, |
| 97 kArchiveSizeToReport, |
| 98 base::ThreadTaskRunnerHandle::Get())); |
| 99 return std::move(archiver); |
| 100 } |
| 101 |
| 102 RecentTabHelperTest::RecentTabHelperTest() |
| 103 : recent_tab_helper_(nullptr), |
| 104 model_(nullptr), |
| 105 model_changed_count_(0), |
| 106 model_removed_count_(0), |
| 107 task_runner_(new base::TestMockTimeTaskRunner), |
| 108 weak_ptr_factory_(this) { |
| 109 } |
| 110 |
| 29 void RecentTabHelperTest::SetUp() { | 111 void RecentTabHelperTest::SetUp() { |
| 30 content::RenderViewHostTestHarness::SetUp(); | 112 content::RenderViewHostTestHarness::SetUp(); |
| 113 // Sets up the factory for testing. |
| 114 OfflinePageModelFactory::GetInstance()->SetTestingFactoryAndUse( |
| 115 browser_context(), BuildTestOfflinePageModel); |
| 116 RunUntilIdle(); |
| 117 |
| 31 RecentTabHelper::CreateForWebContents(web_contents()); | 118 RecentTabHelper::CreateForWebContents(web_contents()); |
| 32 recent_tab_helper_ = | 119 recent_tab_helper_ = |
| 33 RecentTabHelper::FromWebContents(web_contents()); | 120 RecentTabHelper::FromWebContents(web_contents()); |
| 121 recent_tab_helper_->SetTaskRunnerForTest(task_runner_); |
| 122 |
| 123 std::unique_ptr<RecentTabHelper::TestArchiveFactory> test_archive_factory( |
| 124 new TestArchiveFactoryImpl(this)); |
| 125 recent_tab_helper_->SetArchiveFactoryForTest(std::move(test_archive_factory)); |
| 126 |
| 127 |
| 128 model_ = OfflinePageModelFactory::GetForBrowserContext(browser_context()); |
| 129 model_->AddObserver(this); |
| 130 } |
| 131 |
| 132 const std::vector<OfflinePageItem>& RecentTabHelperTest::GetAllPages() { |
| 133 model()->GetAllPages( |
| 134 base::Bind(&RecentTabHelperTest::OnGetAllPagesDone, |
| 135 weak_ptr_factory_.GetWeakPtr())); |
| 136 RunUntilIdle(); |
| 137 return all_pages_; |
| 138 } |
| 139 |
| 140 void RecentTabHelperTest::OnGetAllPagesDone( |
| 141 const std::vector<OfflinePageItem>& result) { |
| 142 all_pages_ = result; |
| 143 } |
| 144 |
| 145 void RecentTabHelperTest::RunUntilIdle() { |
| 146 base::RunLoop().RunUntilIdle(); |
| 147 } |
| 148 |
| 149 void RecentTabHelperTest::FastForwardSnapshotController() { |
| 150 const size_t kLongDelayMs = 100*1000; |
| 151 task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(kLongDelayMs)); |
| 34 } | 152 } |
| 35 | 153 |
| 36 TEST_F(RecentTabHelperTest, Basic) { | 154 TEST_F(RecentTabHelperTest, Basic) { |
| 37 EXPECT_NE(nullptr, recent_tab_helper()); | 155 EXPECT_NE(nullptr, recent_tab_helper()); |
| 38 } | 156 } |
| 39 | 157 |
| 158 TEST_F(RecentTabHelperTest, SimpleCapture) { |
| 159 const GURL url("http://mystery.site/foo.html"); |
| 160 NavigateAndCommit(url); |
| 161 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); |
| 162 RunUntilIdle(); |
| 163 EXPECT_TRUE(model()->is_loaded()); |
| 164 GetAllPages(); |
| 165 EXPECT_EQ(1U, all_pages().size()); |
| 166 EXPECT_EQ(url, all_pages()[0].url); |
| 167 } |
| 168 |
| 169 TEST_F(RecentTabHelperTest, TwoCaptures) { |
| 170 const GURL url("http://mystery.site/foo.html"); |
| 171 NavigateAndCommit(url); |
| 172 // Triggers snapshot after a time delay. |
| 173 recent_tab_helper()->DocumentAvailableInMainFrame(); |
| 174 RunUntilIdle(); |
| 175 EXPECT_TRUE(model()->is_loaded()); |
| 176 EXPECT_EQ(0U, model_changed_count()); |
| 177 // Move the snapshot controller's time forward so it gets past timeouts. |
| 178 FastForwardSnapshotController(); |
| 179 RunUntilIdle(); |
| 180 EXPECT_EQ(1U, model_changed_count()); |
| 181 EXPECT_EQ(0U, model_removed_count()); |
| 182 GetAllPages(); |
| 183 EXPECT_EQ(1U, all_pages().size()); |
| 184 EXPECT_EQ(url, all_pages()[0].url); |
| 185 |
| 186 // Triggers snapshot immediately; |
| 187 recent_tab_helper()->DocumentOnLoadCompletedInMainFrame(); |
| 188 RunUntilIdle(); |
| 189 EXPECT_EQ(2U, model_changed_count()); |
| 190 EXPECT_EQ(1U, model_removed_count()); |
| 191 // the same page should be simply overridden. |
| 192 GetAllPages(); |
| 193 EXPECT_EQ(1U, all_pages().size()); |
| 194 EXPECT_EQ(url, all_pages()[0].url); |
| 195 } |
| 196 |
| 40 } // namespace offline_pages | 197 } // namespace offline_pages |
| OLD | NEW |