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

Side by Side Diff: components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc

Issue 2557363002: [NTP Snippets] Refactor background scheduling for remote suggestions (Closed)
Patch Set: Rebase Created 4 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/ntp_snippets/remote/scheduling_remote_suggestions_provider. h"
6
7 #include <memory>
8 #include <set>
9 #include <string>
10 #include <utility>
11 #include <vector>
12
13 #include "base/command_line.h"
14 #include "base/macros.h"
15 #include "base/memory/ptr_util.h"
16 #include "base/message_loop/message_loop.h"
17 #include "base/run_loop.h"
18 #include "base/threading/thread_task_runner_handle.h"
19 #include "base/time/time.h"
20 #include "components/ntp_snippets/features.h"
21 #include "components/ntp_snippets/ntp_snippets_constants.h"
22 #include "components/ntp_snippets/pref_names.h"
23 #include "components/ntp_snippets/remote/persistent_scheduler.h"
24 #include "components/ntp_snippets/remote/remote_suggestions_provider.h"
25 #include "components/ntp_snippets/remote/test_utils.h"
26 #include "components/ntp_snippets/status.h"
27 #include "components/ntp_snippets/user_classifier.h"
28 #include "components/prefs/testing_pref_service.h"
29 #include "components/variations/variations_params_manager.h"
30 #include "testing/gmock/include/gmock/gmock.h"
31 #include "testing/gtest/include/gtest/gtest.h"
32
33 using testing::ElementsAre;
34 using testing::Eq;
35 using testing::InSequence;
36 using testing::Invoke;
37 using testing::IsEmpty;
38 using testing::Mock;
39 using testing::MockFunction;
40 using testing::Not;
41 using testing::SaveArg;
42 using testing::SizeIs;
43 using testing::StartsWith;
44 using testing::StrictMock;
45 using testing::WithArgs;
46 using testing::_;
47
48 namespace ntp_snippets {
49
50 namespace {
51
52 const char* kDifferentInterval = "2";
53
54 class MockPersistentScheduler : public PersistentScheduler {
55 public:
56 MOCK_METHOD2(Schedule,
57 bool(base::TimeDelta period_wifi,
58 base::TimeDelta period_fallback));
59 MOCK_METHOD0(Unschedule, bool());
60 };
61
62 class MockRemoteSuggestionsProvider : public RemoteSuggestionsProvider {
63 public:
64 MOCK_METHOD1(SetProviderStatusCallback,
65 void(const ProviderStatusCallback& callback));
66 MOCK_METHOD1(RefetchInTheBackground,
67 void(const FetchStatusCallback& callback));
68 };
69
70 } // namespace
71
72 class SchedulingSchedulingRemoteSuggestionsProviderTest
73 : public ::testing::Test {
74 public:
75 SchedulingSchedulingRemoteSuggestionsProviderTest()
76 : user_classifier_(/*pref_service=*/nullptr) {
77 SchedulingRemoteSuggestionsProvider::RegisterProfilePrefs(
78 utils_.pref_service()->registry());
79 }
80
81 std::unique_ptr<SchedulingRemoteSuggestionsProvider>
82 MakeSchedulingProvider() {
83 auto provider =
84 base::MakeUnique<StrictMock<MockRemoteSuggestionsProvider>>();
85 provider_ = provider.get();
86
87 // Store the callback to be able to notify the scheduling provider later.
88 EXPECT_CALL(*provider_, SetProviderStatusCallback(_))
89 .SaveArg<0>(&provider_status_callback_);
90 auto scheduling_provider =
91 base::MakeUnique<SchedulingRemoteSuggestionsProvider>(
92 /*observer=*/nullptr, /*category_factory=*/nullptr,
93 std::move(provider), persistent_scheduler_, &user_classifier_,
94 utils_.pref_service());
95 return scheduler;
96 }
97
98 void ChangeStatusOfUnderlyingProvider(
99 RemoteSuggestionsProvider::ProviderStatus new_status) {
100 provider_status_callback_.Run(new_status);
101 }
102
103 protected:
104 StrictMock<MockPersistentScheduler> persistent_scheduler_;
105 StrictMock<MockRemoteSuggestionsProvider>* provider_;
106
107 private:
108 test::RemoteSuggestionsTestUtils utils_;
109 UserClassifier user_classifier_;
110 RemoteSuggestionsProvider::ProviderStatusCallback provider_status_callback_;
111
112 DISALLOW_COPY_AND_ASSIGN(SchedulingSchedulingRemoteSuggestionsProviderTest);
113 };
114
115 TEST_F(SchedulingRemoteSuggestionsProviderTest,
116 ShouldFetchOnPersistentSchedulerWakeUp) {
117 auto provider = MakeSchedulingProvider();
118
119 EXPECT_CALL(provider_, RefetchInTheBackground(_));
120 provider->OnPersistentSchedulerWakeUp();
121 }
122
123 TEST_F(SchedulingRemoteSuggestionsProviderTest,
124 ShouldRescheduleOnRescheduleFetching) {
125 auto provider = MakeSchedulingProvider();
126
127 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
128 provider->RescheduleFetching();
129 }
130
131 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) {
132 auto provider = MakeSchedulingProvider();
133
134 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
135 ChangeStatusOfUnderlyingProvider(
136 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
137 }
138
139 TEST_F(SchedulingRemoteSuggestionsProviderTest,
140 ShouldUnscheduleOnInactivation) {
141 auto provider = MakeSchedulingProvider();
142
143 EXPECT_CALL(persistent_scheduler_, Unschedule());
144 ChangeStatusOfUnderlyingProvider(
145 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
146 }
147
148 TEST_F(SchedulingRemoteSuggestionsProviderTest,
149 ShouldUnscheduleOnLaterInactivation) {
150 auto provider = MakeSchedulingProvider();
151
152 {
153 InSequence s;
154 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
155 EXPECT_CALL(persistent_scheduler_, Unschedule());
156 }
157 ChangeStatusOfUnderlyingProvider(
158 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
159 ChangeStatusOfUnderlyingProvider(
160 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
161 }
162
163 TEST_F(SchedulingRemoteSuggestionsProviderTest,
164 ShouldScheduleOnLaterActivation) {
165 auto provider = MakeSchedulingProvider();
166
167 {
168 InSequence s;
169 EXPECT_CALL(persistent_scheduler_, Unschedule(_, _));
170 EXPECT_CALL(persistent_scheduler_, Schedule());
171 }
172 ChangeStatusOfUnderlyingProvider(
173 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
174 ChangeStatusOfUnderlyingProvider(
175 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
176 }
177
178 TEST_F(SchedulingRemoteSuggestionsProviderTest,
179 ShouldRescheduleAfterSuccessfulFetch) {
180 auto provider = MakeSchedulingProvider();
181 // First reschedule on becoming active.
182 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
183 ChangeStatusOfUnderlyingProvider(
184 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
185
186 // Trigger a fetch, save the callback and notify that the fetch has succeeded.
187 FetchStatusCallback callback;
188 EXPECT_CALL(provider_, RefetchInTheBackground(_)).SaveArg<0>(&callback);
189 provider->OnPersistentSchedulerWakeUp();
190 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
191 // Second reschedule after a successful fetch.
192 callback.Run(Status::Success());
193 }
194
195 TEST_F(SchedulingRemoteSuggestionsProviderTest,
196 ShouldNotRescheduleAfterFailedFetch) {
197 auto provider = MakeSchedulingProvider();
198 // Only reschedule on becoming active.
199 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
200 ChangeStatusOfUnderlyingProvider(
201 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
202
203 // Trigger a fetch, save the callback and notify that the fetch has failed.
204 FetchStatusCallback callback;
205 EXPECT_CALL(provider_, RefetchInTheBackground(_)).SaveArg<0>(&callback);
206 provider->OnPersistentSchedulerWakeUp();
207 callback.Run(Status(StatusCode::PERMANENT_ERROR, ""));
208 // No furter reschedule after a failure.
209 }
210
211 TEST_F(RemoteSuggestionsSchedulerTest, ShouldScheduleOnlyOnce) {
212 auto provider = MakeSchedulingProvider();
213
214 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
215 ChangeStatusOfUnderlyingProvider(
216 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
217 // No further call to Schedule on a second status callback.
218 ChangeStatusOfUnderlyingProvider(
219 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
220 }
221
222 TEST_F(RemoteSuggestionsSchedulerTest, ShouldUnscheduleOnlyOnce) {
223 auto provider = MakeSchedulingProvider();
224
225 EXPECT_CALL(persistent_scheduler_, Unschedule());
226 ChangeStatusOfUnderlyingProvider(
227 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
228 // No further call to Unschedule on second status callback.
229 ChangeStatusOfUnderlyingProvider(
230 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
231 }
232
233 TEST_F(RemoteSuggestionsSchedulerTest, ReschedulesWhenWifiParamChanges) {
234 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
235 ChangeStatusOfUnderlyingProvider(
236 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
237
238 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
239 // null. Change the wifi interval for this class.
240 variations::testing::VariationParamsManager params_manager(
241 ntp_snippets::kStudyName,
242 {{"fetching_interval_hours-wifi-active_ntp_user", kDifferentInterval}},
243 {kArticleSuggestionsFeature.name});
244
245 // Schedule() should get called for the second time after params have changed.
246 ChangeStatusOfUnderlyingProvider(
247 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
248 }
249
250 TEST_F(RemoteSuggestionsSchedulerTest, ReschedulesWhenFallbackParamChanges) {
251 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
252 ChangeStatusOfUnderlyingProvider(
253 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
254
255 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
256 // null. Change the wifi interval for this class.
257 variations::testing::VariationParamsManager params_manager(
258 ntp_snippets::kStudyName,
259 {{"fetching_interval_hours-fallback-active_ntp_user",
260 kDifferentInterval}},
261 {kArticleSuggestionsFeature.name});
262
263 // Schedule() should get called for the second time after params have changed.
264 ChangeStatusOfUnderlyingProvider(
265 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
266 }
267
268 } // namespace ntp_snippets
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698