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