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 |