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

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

Issue 2702223004: [Remote suggestions] Move all decisions to fetch to the scheduler (Closed)
Patch Set: Tim's comments #2 Created 3 years, 10 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 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 "components/ntp_snippets/remote/scheduling_remote_suggestions_provider. h" 5 #include "components/ntp_snippets/remote/scheduling_remote_suggestions_provider. h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 base::TimeDelta period_fallback)); 62 base::TimeDelta period_fallback));
63 MOCK_METHOD0(Unschedule, bool()); 63 MOCK_METHOD0(Unschedule, bool());
64 }; 64 };
65 65
66 // TODO(jkrcal): Move into its own library to reuse in other unit-tests? 66 // TODO(jkrcal): Move into its own library to reuse in other unit-tests?
67 class MockRemoteSuggestionsProvider : public RemoteSuggestionsProvider { 67 class MockRemoteSuggestionsProvider : public RemoteSuggestionsProvider {
68 public: 68 public:
69 MockRemoteSuggestionsProvider(Observer* observer) 69 MockRemoteSuggestionsProvider(Observer* observer)
70 : RemoteSuggestionsProvider(observer) {} 70 : RemoteSuggestionsProvider(observer) {}
71 71
72 MOCK_METHOD1(SetRemoteSuggestionsScheduler,
73 void(RemoteSuggestionsScheduler*));
74
72 // Move-only params are not supported by GMock. We want to mock out 75 // Move-only params are not supported by GMock. We want to mock out
73 // RefetchInTheBackground() which takes a unique_ptr<>. Instead, we add a new 76 // RefetchInTheBackground() which takes a unique_ptr<>. Instead, we add a new
74 // mock function which takes a copy of the callback and override the 77 // mock function which takes a copy of the callback and override the
75 // RemoteSuggestionsProvider's method to forward the call into the new mock 78 // RemoteSuggestionsProvider's method to forward the call into the new mock
76 // function. 79 // function.
77 void SetProviderStatusCallback(
78 std::unique_ptr<RemoteSuggestionsProvider::ProviderStatusCallback>
79 callback) override {
80 SetProviderStatusCallback(*callback);
81 }
82 MOCK_METHOD1(SetProviderStatusCallback,
83 void(RemoteSuggestionsProvider::ProviderStatusCallback));
84
85 // Move-only params are not supported by GMock (same work-around as above).
86 void RefetchInTheBackground( 80 void RefetchInTheBackground(
87 std::unique_ptr<RemoteSuggestionsProvider::FetchStatusCallback> callback) 81 std::unique_ptr<RemoteSuggestionsProvider::FetchStatusCallback> callback)
88 override { 82 override {
89 RefetchInTheBackground(*callback); 83 RefetchInTheBackground(*callback);
90 } 84 }
91 MOCK_METHOD1(RefetchInTheBackground, 85 MOCK_METHOD1(RefetchInTheBackground,
92 void(RemoteSuggestionsProvider::FetchStatusCallback)); 86 void(RemoteSuggestionsProvider::FetchStatusCallback));
93 87
94 MOCK_CONST_METHOD0(suggestions_fetcher_for_debugging, 88 MOCK_CONST_METHOD0(suggestions_fetcher_for_debugging,
95 const RemoteSuggestionsFetcher*()); 89 const RemoteSuggestionsFetcher*());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 utils_.pref_service()->registry()); 128 utils_.pref_service()->registry());
135 ResetProvider(); 129 ResetProvider();
136 } 130 }
137 131
138 void ResetProvider() { 132 void ResetProvider() {
139 auto underlying_provider = 133 auto underlying_provider =
140 base::MakeUnique<StrictMock<MockRemoteSuggestionsProvider>>( 134 base::MakeUnique<StrictMock<MockRemoteSuggestionsProvider>>(
141 /*observer=*/nullptr); 135 /*observer=*/nullptr);
142 underlying_provider_ = underlying_provider.get(); 136 underlying_provider_ = underlying_provider.get();
143 137
144 // SchedulingRemoteSuggestionsProvider calls SetProviderStatusCallback(_) to 138 // SchedulingRemoteSuggestionsProvider calls
145 // stay in the loop of status changes. 139 // SetRemoteSuggestionsScheduler(_) to stay in the loop of status changes.
146 EXPECT_CALL(*underlying_provider_, SetProviderStatusCallback(_)) 140 EXPECT_CALL(*underlying_provider_, SetRemoteSuggestionsScheduler(_))
147 .WillOnce(SaveArg<0>(&provider_status_callback_)); 141 .WillOnce(SaveArg<0>(&remote_suggestions_scheduler_));
148 142
149 auto test_clock = base::MakeUnique<base::SimpleTestClock>(); 143 auto test_clock = base::MakeUnique<base::SimpleTestClock>();
150 test_clock_ = test_clock.get(); 144 test_clock_ = test_clock.get();
151 test_clock_->SetNow(base::Time::Now()); 145 test_clock_->SetNow(base::Time::Now());
152 146
153 scheduling_provider_ = 147 scheduling_provider_ =
154 base::MakeUnique<SchedulingRemoteSuggestionsProvider>( 148 base::MakeUnique<SchedulingRemoteSuggestionsProvider>(
155 /*observer=*/nullptr, std::move(underlying_provider), 149 /*observer=*/nullptr, std::move(underlying_provider),
156 &persistent_scheduler_, &user_classifier_, utils_.pref_service(), 150 &persistent_scheduler_, &user_classifier_, utils_.pref_service(),
157 std::move(test_clock)); 151 std::move(test_clock));
158 } 152 }
159 153
160 void SetVariationParameter(const std::string& param_name, 154 void SetVariationParameter(const std::string& param_name,
161 const std::string& param_value) { 155 const std::string& param_value) {
162 std::map<std::string, std::string> params = default_variation_params_; 156 std::map<std::string, std::string> params = default_variation_params_;
163 params[param_name] = param_value; 157 params[param_name] = param_value;
164 158
165 params_manager_.ClearAllVariationParams(); 159 params_manager_.ClearAllVariationParams();
166 params_manager_.SetVariationParamsWithFeatureAssociations( 160 params_manager_.SetVariationParamsWithFeatureAssociations(
167 ntp_snippets::kStudyName, params, 161 ntp_snippets::kStudyName, params,
168 {ntp_snippets::kArticleSuggestionsFeature.name}); 162 {ntp_snippets::kArticleSuggestionsFeature.name});
169 } 163 }
170 164
171 protected: 165 protected:
172 std::map<std::string, std::string> default_variation_params_; 166 std::map<std::string, std::string> default_variation_params_;
173 variations::testing::VariationParamsManager params_manager_; 167 variations::testing::VariationParamsManager params_manager_;
174 StrictMock<MockPersistentScheduler> persistent_scheduler_; 168 StrictMock<MockPersistentScheduler> persistent_scheduler_;
175 StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_; 169 StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_;
176 std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_; 170 std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_;
177 RemoteSuggestionsProvider::ProviderStatusCallback provider_status_callback_; 171 RemoteSuggestionsScheduler* remote_suggestions_scheduler_;
178 base::SimpleTestClock* test_clock_; 172 base::SimpleTestClock* test_clock_;
179 173
180 void ChangeStatusOfUnderlyingProvider( 174 void ActivateUnderlyingProvider() {
181 RemoteSuggestionsProvider::ProviderStatus new_status) { 175 remote_suggestions_scheduler_->OnProviderActivated();
182 provider_status_callback_.Run(new_status); 176 }
177
178 void InactivateUnderlyingProvider() {
179 remote_suggestions_scheduler_->OnProviderInactivated();
183 } 180 }
184 181
185 private: 182 private:
186 test::RemoteSuggestionsTestUtils utils_; 183 test::RemoteSuggestionsTestUtils utils_;
187 UserClassifier user_classifier_; 184 UserClassifier user_classifier_;
188 185
189 DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest); 186 DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest);
190 }; 187 };
191 188
192 TEST_F(SchedulingRemoteSuggestionsProviderTest, 189 TEST_F(SchedulingRemoteSuggestionsProviderTest,
193 ShouldIgnoreSignalsWhenNotEnabled) { 190 ShouldIgnoreSignalsWhenNotEnabled) {
194 scheduling_provider_->OnPersistentSchedulerWakeUp(); 191 scheduling_provider_->OnPersistentSchedulerWakeUp();
195 scheduling_provider_->OnNTPOpened(); 192 scheduling_provider_->OnNTPOpened();
196 scheduling_provider_->OnBrowserForegrounded(); 193 scheduling_provider_->OnBrowserForegrounded();
197 scheduling_provider_->OnBrowserColdStart(); 194 scheduling_provider_->OnBrowserColdStart();
198 } 195 }
199 196
200 TEST_F(SchedulingRemoteSuggestionsProviderTest, 197 TEST_F(SchedulingRemoteSuggestionsProviderTest,
201 ShouldIgnoreSignalsWhenDisabledByParam) { 198 ShouldIgnoreSignalsWhenDisabledByParam) {
202 // First set an empty list of allowed trigger types. 199 // First set an empty list of allowed trigger types.
203 SetVariationParameter("scheduler_trigger_types", "-"); 200 SetVariationParameter("scheduler_trigger_types", "-");
204 ResetProvider(); 201 ResetProvider();
205 202
206 // Then enable the scheduler. 203 // Then enable the scheduler.
207 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 204 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
208 ChangeStatusOfUnderlyingProvider( 205 ActivateUnderlyingProvider();
209 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
210 206
211 scheduling_provider_->OnPersistentSchedulerWakeUp(); 207 scheduling_provider_->OnPersistentSchedulerWakeUp();
212 scheduling_provider_->OnNTPOpened(); 208 scheduling_provider_->OnNTPOpened();
213 scheduling_provider_->OnBrowserForegrounded(); 209 scheduling_provider_->OnBrowserForegrounded();
214 scheduling_provider_->OnBrowserColdStart(); 210 scheduling_provider_->OnBrowserColdStart();
215 } 211 }
216 212
217 TEST_F(SchedulingRemoteSuggestionsProviderTest, 213 TEST_F(SchedulingRemoteSuggestionsProviderTest,
218 ShouldHandleEmptyParamForTriggerTypes) { 214 ShouldHandleEmptyParamForTriggerTypes) {
219 // First set an empty param for allowed trigger types -> should result in the 215 // First set an empty param for allowed trigger types -> should result in the
220 // default list. 216 // default list.
221 SetVariationParameter("scheduler_trigger_types", ""); 217 SetVariationParameter("scheduler_trigger_types", "");
222 ResetProvider(); 218 ResetProvider();
223 219
224 // Then enable the scheduler. 220 // Then enable the scheduler.
225 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 221 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
226 ChangeStatusOfUnderlyingProvider( 222 ActivateUnderlyingProvider();
227 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
228 223
229 // For instance, persistent scheduler wake up should be enabled by default. 224 // For instance, persistent scheduler wake up should be enabled by default.
230 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 225 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
231 scheduling_provider_->OnPersistentSchedulerWakeUp(); 226 scheduling_provider_->OnPersistentSchedulerWakeUp();
232 } 227 }
233 228
234 TEST_F(SchedulingRemoteSuggestionsProviderTest, 229 TEST_F(SchedulingRemoteSuggestionsProviderTest,
235 ShouldHandleIncorrentParamForTriggerTypes) { 230 ShouldHandleIncorrentParamForTriggerTypes) {
236 // First set an invalid list of allowed trigger types. 231 // First set an invalid list of allowed trigger types.
237 SetVariationParameter("scheduler_trigger_types", "ntp_opened,foo;"); 232 SetVariationParameter("scheduler_trigger_types", "ntp_opened,foo;");
238 ResetProvider(); 233 ResetProvider();
239 234
240 // Then enable the scheduler. 235 // Then enable the scheduler.
241 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 236 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
242 ChangeStatusOfUnderlyingProvider( 237 ActivateUnderlyingProvider();
243 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
244 238
245 // For instance, persistent scheduler wake up should be enabled by default. 239 // For instance, persistent scheduler wake up should be enabled by default.
246 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 240 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
247 scheduling_provider_->OnPersistentSchedulerWakeUp(); 241 scheduling_provider_->OnPersistentSchedulerWakeUp();
248 } 242 }
249 243
250 TEST_F(SchedulingRemoteSuggestionsProviderTest, 244 TEST_F(SchedulingRemoteSuggestionsProviderTest,
251 ShouldFetchOnPersistentSchedulerWakeUp) { 245 ShouldFetchOnPersistentSchedulerWakeUp) {
252 // First set only this type to be allowed. 246 // First set only this type to be allowed.
253 SetVariationParameter("scheduler_trigger_types", 247 SetVariationParameter("scheduler_trigger_types",
254 "persistent_scheduler_wake_up"); 248 "persistent_scheduler_wake_up");
255 ResetProvider(); 249 ResetProvider();
256 250
257 // Then enable the scheduler. 251 // Then enable the scheduler.
258 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 252 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
259 ChangeStatusOfUnderlyingProvider( 253 ActivateUnderlyingProvider();
260 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
261 254
262 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 255 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
263 scheduling_provider_->OnPersistentSchedulerWakeUp(); 256 scheduling_provider_->OnPersistentSchedulerWakeUp();
264 } 257 }
265 258
266 TEST_F(SchedulingRemoteSuggestionsProviderTest, 259 TEST_F(SchedulingRemoteSuggestionsProviderTest,
267 ShouldFetchOnPersistentSchedulerWakeUpRepeated) { 260 ShouldFetchOnPersistentSchedulerWakeUpRepeated) {
268 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 261 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
269 { 262 {
270 InSequence s; 263 InSequence s;
271 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 264 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
272 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 265 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
273 .WillOnce(SaveArg<0>(&signal_fetch_done)); 266 .WillOnce(SaveArg<0>(&signal_fetch_done));
274 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 267 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
275 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 268 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
276 } 269 }
277 // First enable the scheduler -- calling Schedule() for the first time. 270 // First enable the scheduler -- calling Schedule() for the first time.
278 ChangeStatusOfUnderlyingProvider( 271 ActivateUnderlyingProvider();
279 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
280 // Make the first persistent fetch successful -- calling Schedule() again. 272 // Make the first persistent fetch successful -- calling Schedule() again.
281 scheduling_provider_->OnPersistentSchedulerWakeUp(); 273 scheduling_provider_->OnPersistentSchedulerWakeUp();
282 signal_fetch_done.Run(Status::Success()); 274 signal_fetch_done.Run(Status::Success());
283 // Make the second fetch. 275 // Make the second fetch.
284 scheduling_provider_->OnPersistentSchedulerWakeUp(); 276 scheduling_provider_->OnPersistentSchedulerWakeUp();
285 } 277 }
286 278
287 TEST_F(SchedulingRemoteSuggestionsProviderTest, 279 TEST_F(SchedulingRemoteSuggestionsProviderTest,
288 ShouldNotTriggerBackgroundFetchIfAlreadyInProgess) { 280 ShouldNotTriggerBackgroundFetchIfAlreadyInProgess) {
289 { 281 {
290 InSequence s; 282 InSequence s;
291 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 283 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
292 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 284 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
293 // RefetchInTheBackground is not called after the second trigger. 285 // RefetchInTheBackground is not called after the second trigger.
294 } 286 }
295 // First enable the scheduler -- calling Schedule() for the first time. 287 // First enable the scheduler -- calling Schedule() for the first time.
296 ChangeStatusOfUnderlyingProvider( 288 ActivateUnderlyingProvider();
297 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
298 // Make the first persistent fetch never finish. 289 // Make the first persistent fetch never finish.
299 scheduling_provider_->OnPersistentSchedulerWakeUp(); 290 scheduling_provider_->OnPersistentSchedulerWakeUp();
300 // Make the second fetch. 291 // Make the second fetch.
301 scheduling_provider_->OnPersistentSchedulerWakeUp(); 292 scheduling_provider_->OnPersistentSchedulerWakeUp();
302 } 293 }
303 294
304 TEST_F(SchedulingRemoteSuggestionsProviderTest, 295 TEST_F(SchedulingRemoteSuggestionsProviderTest,
305 ShouldFetchOnNTPOpenedForTheFirstTime) { 296 ShouldFetchOnNTPOpenedForTheFirstTime) {
306 // First set only this type to be allowed. 297 // First set only this type to be allowed.
307 SetVariationParameter("scheduler_trigger_types", "ntp_opened"); 298 SetVariationParameter("scheduler_trigger_types", "ntp_opened");
308 ResetProvider(); 299 ResetProvider();
309 300
310 // Then enable the scheduler. 301 // Then enable the scheduler.
311 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 302 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
312 ChangeStatusOfUnderlyingProvider( 303 ActivateUnderlyingProvider();
313 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
314 304
315 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 305 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
316 scheduling_provider_->OnNTPOpened(); 306 scheduling_provider_->OnNTPOpened();
317 } 307 }
318 308
319 TEST_F(SchedulingRemoteSuggestionsProviderTest, 309 TEST_F(SchedulingRemoteSuggestionsProviderTest,
320 ShouldFetchOnBrowserForegroundedForTheFirstTime) { 310 ShouldFetchOnBrowserForegroundedForTheFirstTime) {
321 // First set only this type to be allowed. 311 // First set only this type to be allowed.
322 SetVariationParameter("scheduler_trigger_types", "browser_foregrounded"); 312 SetVariationParameter("scheduler_trigger_types", "browser_foregrounded");
323 ResetProvider(); 313 ResetProvider();
324 314
325 // Then enable the scheduler. 315 // Then enable the scheduler.
326 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 316 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
327 ChangeStatusOfUnderlyingProvider( 317 ActivateUnderlyingProvider();
328 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
329 318
330 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 319 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
331 scheduling_provider_->OnBrowserForegrounded(); 320 scheduling_provider_->OnBrowserForegrounded();
332 } 321 }
333 322
334 TEST_F(SchedulingRemoteSuggestionsProviderTest, 323 TEST_F(SchedulingRemoteSuggestionsProviderTest,
335 ShouldFetchOnBrowserColdStartForTheFirstTime) { 324 ShouldFetchOnBrowserColdStartForTheFirstTime) {
336 // First set only this type to be allowed. 325 // First set only this type to be allowed.
337 SetVariationParameter("scheduler_trigger_types", "browser_cold_start"); 326 SetVariationParameter("scheduler_trigger_types", "browser_cold_start");
338 ResetProvider(); 327 ResetProvider();
339 328
340 // Then enable the scheduler. 329 // Then enable the scheduler.
341 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 330 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
342 ChangeStatusOfUnderlyingProvider( 331 ActivateUnderlyingProvider();
343 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
344 332
345 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 333 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
346 scheduling_provider_->OnBrowserColdStart(); 334 scheduling_provider_->OnBrowserColdStart();
347 } 335 }
348 336
349 TEST_F(SchedulingRemoteSuggestionsProviderTest, 337 TEST_F(SchedulingRemoteSuggestionsProviderTest,
350 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { 338 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) {
351 // First enable the scheduler; the second Schedule is called after the 339 // First enable the scheduler; the second Schedule is called after the
352 // successful fetch. 340 // successful fetch.
353 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 341 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
354 ChangeStatusOfUnderlyingProvider( 342 ActivateUnderlyingProvider();
355 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
356 343
357 // Make the first soft fetch successful. 344 // Make the first soft fetch successful.
358 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 345 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
359 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 346 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
360 .WillOnce(SaveArg<0>(&signal_fetch_done)); 347 .WillOnce(SaveArg<0>(&signal_fetch_done));
361 scheduling_provider_->OnNTPOpened(); 348 scheduling_provider_->OnNTPOpened();
362 signal_fetch_done.Run(Status::Success()); 349 signal_fetch_done.Run(Status::Success());
363 // The second call is ignored if it happens right after the first one. 350 // The second call is ignored if it happens right after the first one.
364 scheduling_provider_->OnNTPOpened(); 351 scheduling_provider_->OnNTPOpened();
365 } 352 }
366 353
367 TEST_F(SchedulingRemoteSuggestionsProviderTest, 354 TEST_F(SchedulingRemoteSuggestionsProviderTest,
368 ShouldNotFetchOnNTPOpenedAfterSuccessfulPersistentFetch) { 355 ShouldNotFetchOnNTPOpenedAfterSuccessfulPersistentFetch) {
369 // First enable the scheduler; the second Schedule is called after the 356 // First enable the scheduler; the second Schedule is called after the
370 // successful fetch. 357 // successful fetch.
371 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 358 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
372 ChangeStatusOfUnderlyingProvider( 359 ActivateUnderlyingProvider();
373 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
374 360
375 // Make the first persistent fetch successful. 361 // Make the first persistent fetch successful.
376 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 362 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
377 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 363 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
378 .WillOnce(SaveArg<0>(&signal_fetch_done)); 364 .WillOnce(SaveArg<0>(&signal_fetch_done));
379 scheduling_provider_->OnPersistentSchedulerWakeUp(); 365 scheduling_provider_->OnPersistentSchedulerWakeUp();
380 signal_fetch_done.Run(Status::Success()); 366 signal_fetch_done.Run(Status::Success());
381 // The second call is ignored if it happens right after the first one. 367 // The second call is ignored if it happens right after the first one.
382 scheduling_provider_->OnNTPOpened(); 368 scheduling_provider_->OnNTPOpened();
383 } 369 }
384 370
385 TEST_F(SchedulingRemoteSuggestionsProviderTest, 371 TEST_F(SchedulingRemoteSuggestionsProviderTest,
386 ShouldNotFetchOnNTPOpenedAfterFailedSoftFetch) { 372 ShouldNotFetchOnNTPOpenedAfterFailedSoftFetch) {
387 // First enable the scheduler. 373 // First enable the scheduler.
388 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 374 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
389 ChangeStatusOfUnderlyingProvider( 375 ActivateUnderlyingProvider();
390 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
391 376
392 // Make the first soft fetch failed. 377 // Make the first soft fetch failed.
393 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 378 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
394 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 379 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
395 .WillOnce(SaveArg<0>(&signal_fetch_done)); 380 .WillOnce(SaveArg<0>(&signal_fetch_done));
396 scheduling_provider_->OnNTPOpened(); 381 scheduling_provider_->OnNTPOpened();
397 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); 382 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, ""));
398 383
399 // The second call is ignored if it happens right after the first one. 384 // The second call is ignored if it happens right after the first one.
400 scheduling_provider_->OnNTPOpened(); 385 scheduling_provider_->OnNTPOpened();
401 } 386 }
402 387
403 TEST_F(SchedulingRemoteSuggestionsProviderTest, 388 TEST_F(SchedulingRemoteSuggestionsProviderTest,
404 ShouldNotFetchOnNTPOpenedAfterFailedPersistentFetch) { 389 ShouldNotFetchOnNTPOpenedAfterFailedPersistentFetch) {
405 // First enable the scheduler. 390 // First enable the scheduler.
406 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 391 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
407 ChangeStatusOfUnderlyingProvider( 392 ActivateUnderlyingProvider();
408 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
409 393
410 // Make the first persistent fetch failed. 394 // Make the first persistent fetch failed.
411 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 395 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
412 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 396 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
413 .WillOnce(SaveArg<0>(&signal_fetch_done)); 397 .WillOnce(SaveArg<0>(&signal_fetch_done));
414 scheduling_provider_->OnPersistentSchedulerWakeUp(); 398 scheduling_provider_->OnPersistentSchedulerWakeUp();
415 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); 399 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, ""));
416 400
417 // The second call is ignored if it happens right after the first one. 401 // The second call is ignored if it happens right after the first one.
418 scheduling_provider_->OnNTPOpened(); 402 scheduling_provider_->OnNTPOpened();
419 } 403 }
420 404
421 TEST_F(SchedulingRemoteSuggestionsProviderTest, 405 TEST_F(SchedulingRemoteSuggestionsProviderTest,
422 ShouldFetchAgainOnBrowserForgroundLaterAgain) { 406 ShouldFetchAgainOnBrowserForgroundLaterAgain) {
423 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 407 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
424 { 408 {
425 InSequence s; 409 InSequence s;
426 // Initial scheduling after being enabled. 410 // Initial scheduling after being enabled.
427 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 411 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
428 // The first call to NTPOpened results in a fetch. 412 // The first call to NTPOpened results in a fetch.
429 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 413 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
430 .WillOnce(SaveArg<0>(&signal_fetch_done)); 414 .WillOnce(SaveArg<0>(&signal_fetch_done));
431 // Rescheduling after a succesful fetch. 415 // Rescheduling after a succesful fetch.
432 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 416 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
433 // The second call to NTPOpened 2hrs later again results in a fetch. 417 // The second call to NTPOpened 2hrs later again results in a fetch.
434 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 418 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
435 } 419 }
436 420
437 // First enable the scheduler. 421 // First enable the scheduler.
438 ChangeStatusOfUnderlyingProvider( 422 ActivateUnderlyingProvider();
439 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
440 // Make the first soft fetch successful. 423 // Make the first soft fetch successful.
441 scheduling_provider_->OnBrowserForegrounded(); 424 scheduling_provider_->OnBrowserForegrounded();
442 signal_fetch_done.Run(Status::Success()); 425 signal_fetch_done.Run(Status::Success());
443 // Open NTP again after 2hrs. 426 // Open NTP again after 2hrs.
444 test_clock_->Advance(base::TimeDelta::FromHours(2)); 427 test_clock_->Advance(base::TimeDelta::FromHours(2));
445 scheduling_provider_->OnBrowserForegrounded(); 428 scheduling_provider_->OnBrowserForegrounded();
446 } 429 }
447 430
448 TEST_F(SchedulingRemoteSuggestionsProviderTest, 431 TEST_F(SchedulingRemoteSuggestionsProviderTest,
449 ShouldRescheduleOnRescheduleFetching) { 432 ShouldRescheduleOnRescheduleFetching) {
450 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 433 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
451 scheduling_provider_->RescheduleFetching(); 434 scheduling_provider_->RescheduleFetching();
452 } 435 }
453 436
454 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) { 437 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) {
455 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 438 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
456 ChangeStatusOfUnderlyingProvider( 439 ActivateUnderlyingProvider();
457 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
458 } 440 }
459 441
460 TEST_F(SchedulingRemoteSuggestionsProviderTest, 442 TEST_F(SchedulingRemoteSuggestionsProviderTest,
461 ShouldUnscheduleOnLaterInactivation) { 443 ShouldUnscheduleOnLaterInactivation) {
462 { 444 {
463 InSequence s; 445 InSequence s;
464 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 446 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
465 EXPECT_CALL(persistent_scheduler_, Unschedule()); 447 EXPECT_CALL(persistent_scheduler_, Unschedule());
466 } 448 }
467 ChangeStatusOfUnderlyingProvider( 449 ActivateUnderlyingProvider();
468 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); 450 InactivateUnderlyingProvider();
469 ChangeStatusOfUnderlyingProvider(
470 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
471 } 451 }
472 452
473 TEST_F(SchedulingRemoteSuggestionsProviderTest, 453 TEST_F(SchedulingRemoteSuggestionsProviderTest,
474 ShouldScheduleOnLaterActivation) { 454 ShouldScheduleOnLaterActivation) {
475 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 455 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
476 // There is no schedule yet, so inactivation does not trigger unschedule. 456 // There is no schedule yet, so inactivation does not trigger unschedule.
477 ChangeStatusOfUnderlyingProvider( 457 InactivateUnderlyingProvider();
478 RemoteSuggestionsProvider::ProviderStatus::INACTIVE); 458 ActivateUnderlyingProvider();
479 ChangeStatusOfUnderlyingProvider(
480 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
481 } 459 }
482 460
483 TEST_F(SchedulingRemoteSuggestionsProviderTest, 461 TEST_F(SchedulingRemoteSuggestionsProviderTest,
484 ShouldRescheduleAfterSuccessfulFetch) { 462 ShouldRescheduleAfterSuccessfulFetch) {
485 // First reschedule on becoming active. 463 // First reschedule on becoming active.
486 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 464 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
487 ChangeStatusOfUnderlyingProvider( 465 ActivateUnderlyingProvider();
488 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
489 466
490 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 467 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
491 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 468 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
492 .WillOnce(SaveArg<0>(&signal_fetch_done)); 469 .WillOnce(SaveArg<0>(&signal_fetch_done));
493 470
494 // Trigger a fetch. 471 // Trigger a fetch.
495 scheduling_provider_->OnPersistentSchedulerWakeUp(); 472 scheduling_provider_->OnPersistentSchedulerWakeUp();
496 // Second reschedule after a successful fetch. 473 // Second reschedule after a successful fetch.
497 signal_fetch_done.Run(Status::Success()); 474 signal_fetch_done.Run(Status::Success());
498 } 475 }
499 476
500 TEST_F(SchedulingRemoteSuggestionsProviderTest, 477 TEST_F(SchedulingRemoteSuggestionsProviderTest,
501 ShouldNotRescheduleAfterFailedFetch) { 478 ShouldNotRescheduleAfterFailedFetch) {
502 // Only reschedule on becoming active. 479 // Only reschedule on becoming active.
503 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 480 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
504 ChangeStatusOfUnderlyingProvider( 481 ActivateUnderlyingProvider();
505 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
506 482
507 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 483 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
508 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 484 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
509 .WillOnce(SaveArg<0>(&signal_fetch_done)); 485 .WillOnce(SaveArg<0>(&signal_fetch_done));
510 486
511 // Trigger a fetch. 487 // Trigger a fetch.
512 scheduling_provider_->OnPersistentSchedulerWakeUp(); 488 scheduling_provider_->OnPersistentSchedulerWakeUp();
513 // No furter reschedule after a failure. 489 // No furter reschedule after a failure.
514 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); 490 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, ""));
515 } 491 }
516 492
517 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnlyOnce) { 493 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnlyOnce) {
518 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 494 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
519 ChangeStatusOfUnderlyingProvider( 495 ActivateUnderlyingProvider();
520 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
521 // No further call to Schedule on a second status callback. 496 // No further call to Schedule on a second status callback.
522 ChangeStatusOfUnderlyingProvider( 497 ActivateUnderlyingProvider();
523 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
524 } 498 }
525 499
526 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) { 500 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) {
527 { 501 {
528 InSequence s; 502 InSequence s;
529 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 503 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
530 EXPECT_CALL(persistent_scheduler_, Unschedule()); 504 EXPECT_CALL(persistent_scheduler_, Unschedule());
531 } 505 }
532 // First schedule so that later we really unschedule. 506 // First schedule so that later we really unschedule.
533 ChangeStatusOfUnderlyingProvider( 507 ActivateUnderlyingProvider();
534 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); 508 InactivateUnderlyingProvider();
535 ChangeStatusOfUnderlyingProvider(
536 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
537 // No further call to Unschedule on second status callback. 509 // No further call to Unschedule on second status callback.
538 ChangeStatusOfUnderlyingProvider( 510 InactivateUnderlyingProvider();
539 RemoteSuggestionsProvider::ProviderStatus::INACTIVE);
540 } 511 }
541 512
542 TEST_F(SchedulingRemoteSuggestionsProviderTest, 513 TEST_F(SchedulingRemoteSuggestionsProviderTest,
543 ReschedulesWhenWifiParamChanges) { 514 ReschedulesWhenWifiParamChanges) {
544 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 515 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
545 ChangeStatusOfUnderlyingProvider( 516 ActivateUnderlyingProvider();
546 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
547 517
548 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is 518 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
549 // null. Change the wifi interval for this class. 519 // null. Change the wifi interval for this class.
550 SetVariationParameter("fetching_interval_hours-wifi-active_ntp_user", "1.5"); 520 SetVariationParameter("fetching_interval_hours-wifi-active_ntp_user", "1.5");
551 521
552 // Schedule() should get called for the second time after params have changed. 522 // Schedule() should get called for the second time after params have changed.
553 ChangeStatusOfUnderlyingProvider( 523 ActivateUnderlyingProvider();
554 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
555 } 524 }
556 525
557 TEST_F(SchedulingRemoteSuggestionsProviderTest, 526 TEST_F(SchedulingRemoteSuggestionsProviderTest,
558 ReschedulesWhenFallbackParamChanges) { 527 ReschedulesWhenFallbackParamChanges) {
559 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 528 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
560 ChangeStatusOfUnderlyingProvider( 529 ActivateUnderlyingProvider();
561 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
562 530
563 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is 531 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
564 // null. Change the fallback interval for this class. 532 // null. Change the fallback interval for this class.
565 SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user", 533 SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user",
566 "1.5"); 534 "1.5");
567 535
568 // Schedule() should get called for the second time after params have changed. 536 // Schedule() should get called for the second time after params have changed.
569 ChangeStatusOfUnderlyingProvider( 537 ActivateUnderlyingProvider();
570 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
571 } 538 }
572 539
573 TEST_F(SchedulingRemoteSuggestionsProviderTest, 540 TEST_F(SchedulingRemoteSuggestionsProviderTest,
574 ReschedulesWhenOnUsageEventParamChanges) { 541 ReschedulesWhenOnUsageEventParamChanges) {
575 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 542 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
576 ChangeStatusOfUnderlyingProvider( 543 ActivateUnderlyingProvider();
577 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
578 544
579 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is 545 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
580 // null. Change the on usage interval for this class. 546 // null. Change the on usage interval for this class.
581 SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user", 547 SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user",
582 "1.5"); 548 "1.5");
583 549
584 // Schedule() should get called for the second time after params have changed. 550 // Schedule() should get called for the second time after params have changed.
585 ChangeStatusOfUnderlyingProvider( 551 ActivateUnderlyingProvider();
586 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
587 } 552 }
588 553
589 TEST_F(SchedulingRemoteSuggestionsProviderTest, 554 TEST_F(SchedulingRemoteSuggestionsProviderTest,
590 ReschedulesWhenOnNtpOpenedParamChanges) { 555 ReschedulesWhenOnNtpOpenedParamChanges) {
591 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); 556 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2);
592 ChangeStatusOfUnderlyingProvider( 557 ActivateUnderlyingProvider();
593 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
594 558
595 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is 559 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
596 // null. Change the fallback interval for this class. 560 // null. Change the fallback interval for this class.
597 SetVariationParameter("soft_on_ntp_opened_interval_hours-active_ntp_user", 561 SetVariationParameter("soft_on_ntp_opened_interval_hours-active_ntp_user",
598 "1.5"); 562 "1.5");
599 563
600 // Schedule() should get called for the second time after params have changed. 564 // Schedule() should get called for the second time after params have changed.
601 ChangeStatusOfUnderlyingProvider( 565 ActivateUnderlyingProvider();
602 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
603 } 566 }
604 567
605 TEST_F(SchedulingRemoteSuggestionsProviderTest, 568 TEST_F(SchedulingRemoteSuggestionsProviderTest,
606 FetchIntervalForNtpOpenedTrigger) { 569 FetchIntervalForNtpOpenedTrigger) {
607 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; 570 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
608 { 571 {
609 InSequence s; 572 InSequence s;
610 // Initial scheduling after being enabled. 573 // Initial scheduling after being enabled.
611 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 574 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
612 // The first call to NTPOpened results in a fetch. 575 // The first call to NTPOpened results in a fetch.
613 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 576 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
614 .WillOnce(SaveArg<0>(&signal_fetch_done)); 577 .WillOnce(SaveArg<0>(&signal_fetch_done));
615 // Rescheduling after a succesful fetch. 578 // Rescheduling after a succesful fetch.
616 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 579 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
617 // The third call to NTPOpened 35min later again results in a fetch. 580 // The third call to NTPOpened 35min later again results in a fetch.
618 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 581 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
619 } 582 }
620 583
621 ChangeStatusOfUnderlyingProvider( 584 ActivateUnderlyingProvider();
622 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
623 585
624 scheduling_provider_->OnNTPOpened(); 586 scheduling_provider_->OnNTPOpened();
625 signal_fetch_done.Run(Status::Success()); 587 signal_fetch_done.Run(Status::Success());
626 588
627 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER which uses a 2h time 589 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER which uses a 2h time
628 // interval by default for soft backgroudn fetches on ntp open events. 590 // interval by default for soft backgroudn fetches on ntp open events.
629 591
630 // Open NTP again after 20min. This time no fetch is executed. 592 // Open NTP again after 20min. This time no fetch is executed.
631 test_clock_->Advance(base::TimeDelta::FromMinutes(20)); 593 test_clock_->Advance(base::TimeDelta::FromMinutes(20));
632 scheduling_provider_->OnNTPOpened(); 594 scheduling_provider_->OnNTPOpened();
(...skipping 18 matching lines...) Expand all
651 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 613 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
652 // The first call to NTPOpened results in a fetch. 614 // The first call to NTPOpened results in a fetch.
653 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) 615 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
654 .WillOnce(SaveArg<0>(&signal_fetch_done)); 616 .WillOnce(SaveArg<0>(&signal_fetch_done));
655 // Rescheduling after a succesful fetch. 617 // Rescheduling after a succesful fetch.
656 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); 618 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
657 // The third call to NTPOpened 35min later again results in a fetch. 619 // The third call to NTPOpened 35min later again results in a fetch.
658 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); 620 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
659 } 621 }
660 622
661 ChangeStatusOfUnderlyingProvider( 623 ActivateUnderlyingProvider();
662 RemoteSuggestionsProvider::ProviderStatus::ACTIVE);
663 624
664 scheduling_provider_->OnNTPOpened(); 625 scheduling_provider_->OnNTPOpened();
665 signal_fetch_done.Run(Status::Success()); 626 signal_fetch_done.Run(Status::Success());
666 627
667 // Open NTP again after 20min. No fetch request is issues since the 30 min 628 // Open NTP again after 20min. No fetch request is issues since the 30 min
668 // time interval has not passed yet. 629 // time interval has not passed yet.
669 test_clock_->Advance(base::TimeDelta::FromMinutes(20)); 630 test_clock_->Advance(base::TimeDelta::FromMinutes(20));
670 scheduling_provider_->OnNTPOpened(); 631 scheduling_provider_->OnNTPOpened();
671 632
672 // Open NTP again after 15min (35min since first opened) 633 // Open NTP again after 15min (35min since first opened)
673 test_clock_->Advance(base::TimeDelta::FromMinutes(15)); 634 test_clock_->Advance(base::TimeDelta::FromMinutes(15));
674 scheduling_provider_->OnNTPOpened(); 635 scheduling_provider_->OnNTPOpened();
675 } 636 }
676 637
638 TEST_F(SchedulingRemoteSuggestionsProviderTest,
639 ShouldBlockFetchingForSomeTimeAfterHistoryCleared) {
640 {
641 InSequence s;
642 // Initial scheduling after being enabled.
643 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
tschumann 2017/02/22 20:46:04 i'd much rather setup the expectations where they
jkrcal 2017/02/23 12:20:13 Done.
644 // The first call after 15m is ignored.
645 // The second call after 31m results in a fetch.
646 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
647 }
648
649 // First enable the scheduler.
650 ActivateUnderlyingProvider();
651 // Clear the history.
652 scheduling_provider_->OnHistoryCleared();
653 // A trigger after 15 minutes is ignored.
654 test_clock_->Advance(base::TimeDelta::FromMinutes(15));
655 scheduling_provider_->OnBrowserForegrounded();
656 // A trigger after another 16 minutes is performed (more than 30m after
657 // clearing the history).
658 test_clock_->Advance(base::TimeDelta::FromMinutes(16));
659 scheduling_provider_->OnBrowserForegrounded();
660 }
661
662 TEST_F(SchedulingRemoteSuggestionsProviderTest,
663 ShouldAllowImmediateFetchingAfterSuggestionsObsoleted) {
664 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
665 {
666 InSequence s;
667 // Initial scheduling after being enabled.
668 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
tschumann 2017/02/22 20:46:04 same here. Consider moving the EXPECT_CALL stateme
jkrcal 2017/02/23 12:20:14 Done.
669 // The first trigger results in a fetch.
670 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_))
671 .WillOnce(SaveArg<0>(&signal_fetch_done));
672 // Rescheduling after a succesful fetch.
673 EXPECT_CALL(persistent_scheduler_, Schedule(_, _));
674 // The immediate trigger results in a fetch.
675 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_));
676 }
677
678 // First enable the scheduler.
679 ActivateUnderlyingProvider();
680 // Make the first soft fetch successful.
681 scheduling_provider_->OnBrowserForegrounded();
682 signal_fetch_done.Run(Status::Success());
683
684 // Obsolete the suggestions.
685 scheduling_provider_->OnSuggestionsCleared();
686 // Another trigger right after results in a fetch again.
687 scheduling_provider_->OnBrowserForegrounded();
688 }
689
677 } // namespace ntp_snippets 690 } // namespace ntp_snippets
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698