| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/core/prefetch/prefetch_dispatcher_impl.h" | 5 #include "components/offline_pages/core/prefetch/prefetch_dispatcher_impl.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/test/scoped_feature_list.h" | 9 #include "base/test/scoped_feature_list.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| 11 #include "base/threading/thread_task_runner_handle.h" | 11 #include "base/threading/thread_task_runner_handle.h" |
| 12 #include "components/offline_pages/core/client_namespace_constants.h" | 12 #include "components/offline_pages/core/client_namespace_constants.h" |
| 13 #include "components/offline_pages/core/offline_event_logger.h" | 13 #include "components/offline_pages/core/offline_event_logger.h" |
| 14 #include "components/offline_pages/core/offline_page_feature.h" | 14 #include "components/offline_pages/core/offline_page_feature.h" |
| 15 #include "components/offline_pages/core/prefetch/prefetch_in_memory_store.h" | |
| 16 #include "components/offline_pages/core/prefetch/prefetch_service.h" | 15 #include "components/offline_pages/core/prefetch/prefetch_service.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 #include "url/gurl.h" |
| 18 | 18 |
| 19 namespace offline_pages { | 19 namespace offline_pages { |
| 20 | 20 |
| 21 namespace { |
| 22 |
| 21 class TestScopedBackgroundTask | 23 class TestScopedBackgroundTask |
| 22 : public PrefetchDispatcher::ScopedBackgroundTask { | 24 : public PrefetchDispatcher::ScopedBackgroundTask { |
| 23 public: | 25 public: |
| 24 TestScopedBackgroundTask() = default; | 26 TestScopedBackgroundTask() = default; |
| 25 ~TestScopedBackgroundTask() override = default; | 27 ~TestScopedBackgroundTask() override = default; |
| 26 | 28 |
| 27 void SetNeedsReschedule(bool reschedule, bool backoff) override { | 29 void SetNeedsReschedule(bool reschedule, bool backoff) override { |
| 28 needs_reschedule_called = true; | 30 needs_reschedule_called = true; |
| 29 } | 31 } |
| 30 | 32 |
| 31 bool needs_reschedule_called = false; | 33 bool needs_reschedule_called = false; |
| 32 }; | 34 }; |
| 33 | 35 |
| 36 } // namespace |
| 37 |
| 34 class PrefetchDispatcherTest : public testing::Test, public PrefetchService { | 38 class PrefetchDispatcherTest : public testing::Test, public PrefetchService { |
| 35 public: | 39 public: |
| 40 const std::string TEST_NAMESPACE = "TestPrefetchClientNamespace"; |
| 41 |
| 36 PrefetchDispatcherTest(); | 42 PrefetchDispatcherTest(); |
| 37 | 43 |
| 38 // Test implementation. | 44 // Test implementation. |
| 39 void SetUp() override; | 45 void SetUp() override; |
| 40 void TearDown() override; | 46 void TearDown() override; |
| 41 | 47 |
| 42 // PrefetchService implementation: | 48 // PrefetchService implementation: |
| 43 OfflineEventLogger* GetLogger() override; | 49 OfflineEventLogger* GetLogger() override; |
| 44 OfflineMetricsCollector* GetOfflineMetricsCollector() override; | 50 OfflineMetricsCollector* GetOfflineMetricsCollector() override; |
| 45 PrefetchDispatcher* GetPrefetchDispatcher() override; | 51 PrefetchDispatcher* GetPrefetchDispatcher() override; |
| 46 PrefetchGCMHandler* GetPrefetchGCMHandler() override; | 52 PrefetchGCMHandler* GetPrefetchGCMHandler() override; |
| 47 PrefetchStore* GetPrefetchStore() override; | |
| 48 SuggestedArticlesObserver* GetSuggestedArticlesObserver() override; | 53 SuggestedArticlesObserver* GetSuggestedArticlesObserver() override; |
| 49 | 54 |
| 50 // KeyedService implementation. | 55 // KeyedService implementation. |
| 51 void Shutdown() override {} | 56 void Shutdown() override {} |
| 52 | 57 |
| 53 void PumpLoop(); | 58 void PumpLoop(); |
| 54 PrefetchDispatcher::ScopedBackgroundTask* GetBackgroundTask() { | 59 PrefetchDispatcher::ScopedBackgroundTask* GetBackgroundTask() { |
| 55 return dispatcher_impl_->task_.get(); | 60 return dispatcher_impl_->task_.get(); |
| 56 } | 61 } |
| 57 | 62 |
| 58 TaskQueue* dispatcher_task_queue() { return &dispatcher_impl_->task_queue_; } | 63 TaskQueue* dispatcher_task_queue() { return &dispatcher_impl_->task_queue_; } |
| 59 | 64 |
| 65 protected: |
| 66 std::vector<PrefetchURL> test_urls_; |
| 67 |
| 60 private: | 68 private: |
| 69 std::unique_ptr<PrefetchDispatcherImpl> dispatcher_impl_; |
| 61 OfflineEventLogger logger_; | 70 OfflineEventLogger logger_; |
| 62 base::test::ScopedFeatureList feature_list_; | 71 base::test::ScopedFeatureList feature_list_; |
| 63 | |
| 64 std::unique_ptr<PrefetchInMemoryStore> in_memory_store_; | |
| 65 std::unique_ptr<PrefetchDispatcherImpl> dispatcher_impl_; | |
| 66 | |
| 67 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 72 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 68 base::ThreadTaskRunnerHandle task_runner_handle_; | 73 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 69 }; | 74 }; |
| 70 | 75 |
| 71 PrefetchDispatcherTest::PrefetchDispatcherTest() | 76 PrefetchDispatcherTest::PrefetchDispatcherTest() |
| 72 : task_runner_(new base::TestSimpleTaskRunner), | 77 : task_runner_(new base::TestSimpleTaskRunner), |
| 73 task_runner_handle_(task_runner_) { | 78 task_runner_handle_(task_runner_) { |
| 74 feature_list_.InitAndEnableFeature(kPrefetchingOfflinePagesFeature); | 79 feature_list_.InitAndEnableFeature(kPrefetchingOfflinePagesFeature); |
| 75 } | 80 } |
| 76 | 81 |
| 77 void PrefetchDispatcherTest::SetUp() { | 82 void PrefetchDispatcherTest::SetUp() { |
| 78 ASSERT_EQ(base::ThreadTaskRunnerHandle::Get(), task_runner_); | 83 ASSERT_EQ(base::ThreadTaskRunnerHandle::Get(), task_runner_); |
| 79 ASSERT_FALSE(task_runner_->HasPendingTask()); | 84 ASSERT_FALSE(task_runner_->HasPendingTask()); |
| 80 in_memory_store_ = base::MakeUnique<PrefetchInMemoryStore>(); | |
| 81 dispatcher_impl_ = base::MakeUnique<PrefetchDispatcherImpl>(); | 85 dispatcher_impl_ = base::MakeUnique<PrefetchDispatcherImpl>(); |
| 82 dispatcher_impl_->SetService(this); | 86 dispatcher_impl_->SetService(this); |
| 87 |
| 88 ASSERT_TRUE(test_urls_.empty()); |
| 89 test_urls_.push_back({"1", GURL("http://testurl.com/foo")}); |
| 90 test_urls_.push_back({"2", GURL("https://testurl.com/bar")}); |
| 83 } | 91 } |
| 84 | 92 |
| 85 void PrefetchDispatcherTest::TearDown() { | 93 void PrefetchDispatcherTest::TearDown() { |
| 86 task_runner_->ClearPendingTasks(); | 94 task_runner_->ClearPendingTasks(); |
| 87 } | 95 } |
| 88 | 96 |
| 89 OfflineEventLogger* PrefetchDispatcherTest::GetLogger() { | 97 OfflineEventLogger* PrefetchDispatcherTest::GetLogger() { |
| 90 return &logger_; | 98 return &logger_; |
| 91 } | 99 } |
| 92 | 100 |
| 93 OfflineMetricsCollector* PrefetchDispatcherTest::GetOfflineMetricsCollector() { | 101 OfflineMetricsCollector* PrefetchDispatcherTest::GetOfflineMetricsCollector() { |
| 94 NOTREACHED(); | 102 NOTREACHED(); |
| 95 return nullptr; | 103 return nullptr; |
| 96 } | 104 } |
| 97 | 105 |
| 98 PrefetchDispatcher* PrefetchDispatcherTest::GetPrefetchDispatcher() { | 106 PrefetchDispatcher* PrefetchDispatcherTest::GetPrefetchDispatcher() { |
| 99 return dispatcher_impl_.get(); | 107 return dispatcher_impl_.get(); |
| 100 } | 108 } |
| 101 | 109 |
| 102 PrefetchGCMHandler* PrefetchDispatcherTest::GetPrefetchGCMHandler() { | 110 PrefetchGCMHandler* PrefetchDispatcherTest::GetPrefetchGCMHandler() { |
| 103 NOTREACHED(); | 111 NOTREACHED(); |
| 104 return nullptr; | 112 return nullptr; |
| 105 } | 113 } |
| 106 | 114 |
| 107 PrefetchStore* PrefetchDispatcherTest::GetPrefetchStore() { | |
| 108 return in_memory_store_.get(); | |
| 109 } | |
| 110 | |
| 111 SuggestedArticlesObserver* | 115 SuggestedArticlesObserver* |
| 112 PrefetchDispatcherTest::GetSuggestedArticlesObserver() { | 116 PrefetchDispatcherTest::GetSuggestedArticlesObserver() { |
| 113 NOTREACHED(); | 117 NOTREACHED(); |
| 114 return nullptr; | 118 return nullptr; |
| 115 } | 119 } |
| 116 | 120 |
| 117 void PrefetchDispatcherTest::PumpLoop() { | 121 void PrefetchDispatcherTest::PumpLoop() { |
| 118 task_runner_->RunUntilIdle(); | 122 task_runner_->RunUntilIdle(); |
| 119 } | 123 } |
| 120 | 124 |
| 121 TEST_F(PrefetchDispatcherTest, DispatcherDoesNotCrash) { | 125 TEST_F(PrefetchDispatcherTest, DispatcherDoesNotCrash) { |
| 122 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(std::vector<PrefetchURL>()); | 126 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_); |
| 123 GetPrefetchDispatcher()->RemoveAllUnprocessedPrefetchURLs( | 127 GetPrefetchDispatcher()->RemoveAllUnprocessedPrefetchURLs( |
| 124 kSuggestedArticlesNamespace); | 128 kSuggestedArticlesNamespace); |
| 125 GetPrefetchDispatcher()->RemovePrefetchURLsByClientId( | 129 GetPrefetchDispatcher()->RemovePrefetchURLsByClientId( |
| 126 {kSuggestedArticlesNamespace, "123"}); | 130 {kSuggestedArticlesNamespace, "123"}); |
| 127 } | 131 } |
| 128 | 132 |
| 129 TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTask) { | 133 TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTask) { |
| 130 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(std::vector<PrefetchURL>()); | 134 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_); |
| 131 EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks()); | 135 EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks()); |
| 132 EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask()); | 136 EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask()); |
| 133 PumpLoop(); | 137 PumpLoop(); |
| 134 EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks()); | 138 EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks()); |
| 135 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); | 139 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); |
| 136 } | 140 } |
| 137 | 141 |
| 138 TEST_F(PrefetchDispatcherTest, DispatcherDoesNothingIfFeatureNotEnabled) { | 142 TEST_F(PrefetchDispatcherTest, DispatcherDoesNothingIfFeatureNotEnabled) { |
| 139 base::test::ScopedFeatureList disabled_feature_list; | 143 base::test::ScopedFeatureList disabled_feature_list; |
| 140 disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature); | 144 disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature); |
| 141 | 145 |
| 142 // Don't add a task for new prefetch URLs. | 146 // Don't add a task for new prefetch URLs. |
| 143 ClientId client_id("namespace", "id"); | 147 PrefetchURL prefetch_url("id", GURL("https://www.chromium.org")); |
| 144 PrefetchURL prefetch_url(client_id, GURL("https://www.chromium.org")); | |
| 145 GetPrefetchDispatcher()->AddCandidatePrefetchURLs( | 148 GetPrefetchDispatcher()->AddCandidatePrefetchURLs( |
| 146 std::vector<PrefetchURL>(1, prefetch_url)); | 149 TEST_NAMESPACE, std::vector<PrefetchURL>(1, prefetch_url)); |
| 147 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); | 150 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); |
| 148 | 151 |
| 149 // Do nothing with a new background task. | 152 // Do nothing with a new background task. |
| 150 GetPrefetchDispatcher()->BeginBackgroundTask( | 153 GetPrefetchDispatcher()->BeginBackgroundTask( |
| 151 base::MakeUnique<TestScopedBackgroundTask>()); | 154 base::MakeUnique<TestScopedBackgroundTask>()); |
| 152 EXPECT_EQ(nullptr, GetBackgroundTask()); | 155 EXPECT_EQ(nullptr, GetBackgroundTask()); |
| 153 | 156 |
| 154 // Everything else is unimplemented. | 157 // Everything else is unimplemented. |
| 155 } | 158 } |
| 156 | 159 |
| 157 } // namespace offline_pages | 160 } // namespace offline_pages |
| OLD | NEW |