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 | 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 Loading... | |
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 |
OLD | NEW |