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