Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(214)

Side by Side Diff: components/offline_pages/core/prefetch/prefetch_dispatcher_impl_unittest.cc

Issue 2920083002: Prefetching: Introduce store commands abstractions to be used by tasks. (Closed)
Patch Set: Added TODO for NWake Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
16 #include "components/offline_pages/core/prefetch/store/prefetch_store_command_fa ctory.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "url/gurl.h"
18 19
19 namespace offline_pages { 20 namespace offline_pages {
20 21
21 class TestScopedBackgroundTask 22 class TestScopedBackgroundTask
22 : public PrefetchDispatcher::ScopedBackgroundTask { 23 : public PrefetchDispatcher::ScopedBackgroundTask {
23 public: 24 public:
24 TestScopedBackgroundTask() = default; 25 TestScopedBackgroundTask() = default;
25 ~TestScopedBackgroundTask() override = default; 26 ~TestScopedBackgroundTask() override = default;
26 27
27 void SetNeedsReschedule(bool reschedule, bool backoff) override { 28 void SetNeedsReschedule(bool reschedule, bool backoff) override {
28 needs_reschedule_called = true; 29 needs_reschedule_called = true;
29 } 30 }
30 31
31 bool needs_reschedule_called = false; 32 bool needs_reschedule_called = false;
32 }; 33 };
33 34
35 namespace {
36 class TestPrefetchStoreCommandFactory;
37
38 class TestAddUrlsStoreCommand : public AddUrlsStoreCommand {
39 public:
40 TestAddUrlsStoreCommand(TestPrefetchStoreCommandFactory* factory)
41 : factory_(factory){};
42 ~TestAddUrlsStoreCommand() override{};
43 void Execute(const std::string& name_space,
44 const std::vector<PrefetchURL>& prefetch_urls,
45 UrlsAddedCallback callback) override;
46
47 private:
48 TestPrefetchStoreCommandFactory* factory_;
49 };
50
51 class TestCleanupZombiesStoreCommand : public CleanupZombiesStoreCommand {
52 public:
53 TestCleanupZombiesStoreCommand(TestPrefetchStoreCommandFactory* factory)
54 : factory_(factory){};
55 ~TestCleanupZombiesStoreCommand() override{};
56 void Execute(const std::string& name_space,
57 const std::vector<GURL>& urls_to_keep,
58 base::OnceCallback<void()> callback) override;
59
60 private:
61 TestPrefetchStoreCommandFactory* factory_;
62 };
63
64 class TestPrefetchStoreCommandFactory : public PrefetchStoreCommandFactory {
65 public:
66 std::unique_ptr<AddUrlsStoreCommand> createAddUrls() override {
67 return base::MakeUnique<TestAddUrlsStoreCommand>(this);
68 }
69
70 std::unique_ptr<CleanupZombiesStoreCommand> createCleanupZombies() override {
71 return base::MakeUnique<TestCleanupZombiesStoreCommand>(this);
72 }
73
74 int add_url_execute_calls_ = 0;
75 bool add_url_succeeds = true;
76 int zombies_execute_calls_ = 0;
77 };
78
79 void TestAddUrlsStoreCommand::Execute(
80 const std::string& name_space,
81 const std::vector<PrefetchURL>& prefetch_urls,
82 UrlsAddedCallback callback) {
83 ++factory_->add_url_execute_calls_;
84 std::move(callback).Run(factory_->add_url_succeeds);
85 }
86
87 void TestCleanupZombiesStoreCommand::Execute(
88 const std::string& name_space,
89 const std::vector<GURL>& urls_to_keep,
90 base::OnceCallback<void()> callback) {
91 ++factory_->zombies_execute_calls_;
92 std::move(callback).Run();
93 }
94
95 } // namespace
96
34 class PrefetchDispatcherTest : public testing::Test, public PrefetchService { 97 class PrefetchDispatcherTest : public testing::Test, public PrefetchService {
35 public: 98 public:
99 const std::string TEST_NAMESPACE = "TestPrefetchClientNamespace";
100
36 PrefetchDispatcherTest(); 101 PrefetchDispatcherTest();
37 102
38 // Test implementation. 103 // Test implementation.
39 void SetUp() override; 104 void SetUp() override;
40 void TearDown() override; 105 void TearDown() override;
41 106
42 // PrefetchService implementation: 107 // PrefetchService implementation:
43 OfflineEventLogger* GetLogger() override; 108 OfflineEventLogger* GetLogger() override;
44 OfflineMetricsCollector* GetOfflineMetricsCollector() override; 109 OfflineMetricsCollector* GetOfflineMetricsCollector() override;
45 PrefetchDispatcher* GetPrefetchDispatcher() override; 110 PrefetchDispatcher* GetPrefetchDispatcher() override;
46 PrefetchGCMHandler* GetPrefetchGCMHandler() override; 111 PrefetchGCMHandler* GetPrefetchGCMHandler() override;
47 PrefetchStore* GetPrefetchStore() override; 112 PrefetchStoreCommandFactory* GetPrefetchStoreCommandFactory() override;
48 SuggestedArticlesObserver* GetSuggestedArticlesObserver() override; 113 SuggestedArticlesObserver* GetSuggestedArticlesObserver() override;
49 114
50 // KeyedService implementation. 115 // KeyedService implementation.
51 void Shutdown() override {} 116 void Shutdown() override {}
52 117
53 void PumpLoop(); 118 void PumpLoop();
54 PrefetchDispatcher::ScopedBackgroundTask* GetBackgroundTask() { 119 PrefetchDispatcher::ScopedBackgroundTask* GetBackgroundTask() {
55 return dispatcher_impl_->task_.get(); 120 return dispatcher_impl_->task_.get();
56 } 121 }
57 122
58 TaskQueue* dispatcher_task_queue() { return &dispatcher_impl_->task_queue_; } 123 TaskQueue* dispatcher_task_queue() { return &dispatcher_impl_->task_queue_; }
59 124
125 protected:
126 std::unique_ptr<TestPrefetchStoreCommandFactory> test_command_factory_;
127 std::vector<PrefetchURL> test_urls_;
128
60 private: 129 private:
130 std::unique_ptr<PrefetchDispatcherImpl> dispatcher_impl_;
61 OfflineEventLogger logger_; 131 OfflineEventLogger logger_;
62 base::test::ScopedFeatureList feature_list_; 132 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_; 133 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
68 base::ThreadTaskRunnerHandle task_runner_handle_; 134 base::ThreadTaskRunnerHandle task_runner_handle_;
69 }; 135 };
70 136
71 PrefetchDispatcherTest::PrefetchDispatcherTest() 137 PrefetchDispatcherTest::PrefetchDispatcherTest()
72 : task_runner_(new base::TestSimpleTaskRunner), 138 : task_runner_(new base::TestSimpleTaskRunner),
73 task_runner_handle_(task_runner_) { 139 task_runner_handle_(task_runner_) {
74 feature_list_.InitAndEnableFeature(kPrefetchingOfflinePagesFeature); 140 feature_list_.InitAndEnableFeature(kPrefetchingOfflinePagesFeature);
75 } 141 }
76 142
77 void PrefetchDispatcherTest::SetUp() { 143 void PrefetchDispatcherTest::SetUp() {
78 ASSERT_EQ(base::ThreadTaskRunnerHandle::Get(), task_runner_); 144 ASSERT_EQ(base::ThreadTaskRunnerHandle::Get(), task_runner_);
79 ASSERT_FALSE(task_runner_->HasPendingTask()); 145 ASSERT_FALSE(task_runner_->HasPendingTask());
80 in_memory_store_ = base::MakeUnique<PrefetchInMemoryStore>(); 146 test_command_factory_ = base::MakeUnique<TestPrefetchStoreCommandFactory>();
81 dispatcher_impl_ = base::MakeUnique<PrefetchDispatcherImpl>(); 147 dispatcher_impl_ = base::MakeUnique<PrefetchDispatcherImpl>();
82 dispatcher_impl_->SetService(this); 148 dispatcher_impl_->SetService(this);
149
150 ASSERT_TRUE(test_urls_.empty());
151 test_urls_.push_back({"1", GURL("http://testurl.com/foo")});
152 test_urls_.push_back({"2", GURL("https://testurl.com/bar")});
83 } 153 }
84 154
85 void PrefetchDispatcherTest::TearDown() { 155 void PrefetchDispatcherTest::TearDown() {
86 task_runner_->ClearPendingTasks(); 156 task_runner_->ClearPendingTasks();
87 } 157 }
88 158
89 OfflineEventLogger* PrefetchDispatcherTest::GetLogger() { 159 OfflineEventLogger* PrefetchDispatcherTest::GetLogger() {
90 return &logger_; 160 return &logger_;
91 } 161 }
92 162
93 OfflineMetricsCollector* PrefetchDispatcherTest::GetOfflineMetricsCollector() { 163 OfflineMetricsCollector* PrefetchDispatcherTest::GetOfflineMetricsCollector() {
94 NOTREACHED(); 164 NOTREACHED();
95 return nullptr; 165 return nullptr;
96 } 166 }
97 167
98 PrefetchDispatcher* PrefetchDispatcherTest::GetPrefetchDispatcher() { 168 PrefetchDispatcher* PrefetchDispatcherTest::GetPrefetchDispatcher() {
99 return dispatcher_impl_.get(); 169 return dispatcher_impl_.get();
100 } 170 }
101 171
102 PrefetchGCMHandler* PrefetchDispatcherTest::GetPrefetchGCMHandler() { 172 PrefetchGCMHandler* PrefetchDispatcherTest::GetPrefetchGCMHandler() {
103 NOTREACHED(); 173 NOTREACHED();
104 return nullptr; 174 return nullptr;
105 } 175 }
106 176
107 PrefetchStore* PrefetchDispatcherTest::GetPrefetchStore() { 177 PrefetchStoreCommandFactory*
108 return in_memory_store_.get(); 178 PrefetchDispatcherTest::GetPrefetchStoreCommandFactory() {
179 return test_command_factory_.get();
109 } 180 }
110 181
111 SuggestedArticlesObserver* 182 SuggestedArticlesObserver*
112 PrefetchDispatcherTest::GetSuggestedArticlesObserver() { 183 PrefetchDispatcherTest::GetSuggestedArticlesObserver() {
113 NOTREACHED(); 184 NOTREACHED();
114 return nullptr; 185 return nullptr;
115 } 186 }
116 187
117 void PrefetchDispatcherTest::PumpLoop() { 188 void PrefetchDispatcherTest::PumpLoop() {
118 task_runner_->RunUntilIdle(); 189 task_runner_->RunUntilIdle();
119 } 190 }
120 191
121 TEST_F(PrefetchDispatcherTest, DispatcherDoesNotCrash) { 192 TEST_F(PrefetchDispatcherTest, DispatcherDoesNotCrash) {
122 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(std::vector<PrefetchURL>()); 193 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_);
123 GetPrefetchDispatcher()->RemoveAllUnprocessedPrefetchURLs( 194 GetPrefetchDispatcher()->RemoveAllUnprocessedPrefetchURLs(
124 kSuggestedArticlesNamespace); 195 kSuggestedArticlesNamespace);
125 GetPrefetchDispatcher()->RemovePrefetchURLsByClientId( 196 GetPrefetchDispatcher()->RemovePrefetchURLsByClientId(
126 {kSuggestedArticlesNamespace, "123"}); 197 {kSuggestedArticlesNamespace, "123"});
127 } 198 }
128 199
129 TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTask) { 200 TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTask) {
130 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(std::vector<PrefetchURL>()); 201 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_);
131 EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks()); 202 EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks());
132 EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask()); 203 EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask());
133 PumpLoop(); 204 PumpLoop();
134 EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks()); 205 EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks());
135 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); 206 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask());
207 EXPECT_EQ(1, test_command_factory_->add_url_execute_calls_);
208 EXPECT_EQ(1, test_command_factory_->zombies_execute_calls_);
209 }
210
211 TEST_F(PrefetchDispatcherTest, AddCandidatePrefetchURLsTaskFailsAdding) {
212 test_command_factory_->add_url_succeeds = false;
213 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(TEST_NAMESPACE, test_urls_);
214 EXPECT_TRUE(dispatcher_task_queue()->HasPendingTasks());
215 EXPECT_TRUE(dispatcher_task_queue()->HasRunningTask());
216 PumpLoop();
217 EXPECT_FALSE(dispatcher_task_queue()->HasPendingTasks());
218 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask());
219 EXPECT_EQ(1, test_command_factory_->add_url_execute_calls_);
220 EXPECT_EQ(0, test_command_factory_->zombies_execute_calls_);
136 } 221 }
137 222
138 TEST_F(PrefetchDispatcherTest, DispatcherDoesNothingIfFeatureNotEnabled) { 223 TEST_F(PrefetchDispatcherTest, DispatcherDoesNothingIfFeatureNotEnabled) {
139 base::test::ScopedFeatureList disabled_feature_list; 224 base::test::ScopedFeatureList disabled_feature_list;
140 disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature); 225 disabled_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature);
141 226
142 // Don't add a task for new prefetch URLs. 227 // Don't add a task for new prefetch URLs.
143 ClientId client_id("namespace", "id"); 228 PrefetchURL prefetch_url("id", GURL("https://www.chromium.org"));
144 PrefetchURL prefetch_url(client_id, GURL("https://www.chromium.org"));
145 GetPrefetchDispatcher()->AddCandidatePrefetchURLs( 229 GetPrefetchDispatcher()->AddCandidatePrefetchURLs(
146 std::vector<PrefetchURL>(1, prefetch_url)); 230 TEST_NAMESPACE, std::vector<PrefetchURL>(1, prefetch_url));
147 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask()); 231 EXPECT_FALSE(dispatcher_task_queue()->HasRunningTask());
148 232
149 // Do nothing with a new background task. 233 // Do nothing with a new background task.
150 GetPrefetchDispatcher()->BeginBackgroundTask( 234 GetPrefetchDispatcher()->BeginBackgroundTask(
151 base::MakeUnique<TestScopedBackgroundTask>()); 235 base::MakeUnique<TestScopedBackgroundTask>());
152 EXPECT_EQ(nullptr, GetBackgroundTask()); 236 EXPECT_EQ(nullptr, GetBackgroundTask());
153 237
154 // Everything else is unimplemented. 238 // Everything else is unimplemented.
155 } 239 }
156 240
157 } // namespace offline_pages 241 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698