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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
113 void(Category, const DismissedSuggestionsCallback&)); | 113 void(Category, const DismissedSuggestionsCallback&)); |
114 MOCK_METHOD0(OnSignInStateChanged, void()); | 114 MOCK_METHOD0(OnSignInStateChanged, void()); |
115 }; | 115 }; |
116 | 116 |
117 } // namespace | 117 } // namespace |
118 | 118 |
119 class SchedulingRemoteSuggestionsProviderTest | 119 class SchedulingRemoteSuggestionsProviderTest |
120 : public ::testing::Test { | 120 : public ::testing::Test { |
121 public: | 121 public: |
122 SchedulingRemoteSuggestionsProviderTest() | 122 SchedulingRemoteSuggestionsProviderTest() |
123 : underlying_provider_(nullptr), | 123 : // For the test we enabled all trigger types. |
124 default_variation_params_{{"scheduler_trigger_types", | |
125 "persistent_scheduler_wake_up,ntp_opened," | |
126 "browser_foregrounded,browser_cold_start"}}, | |
127 params_manager_(ntp_snippets::kStudyName, | |
128 default_variation_params_, | |
129 {kArticleSuggestionsFeature.name}), | |
130 underlying_provider_(nullptr), | |
124 scheduling_provider_(nullptr), | 131 scheduling_provider_(nullptr), |
125 user_classifier_(/*pref_service=*/nullptr) { | 132 user_classifier_(/*pref_service=*/nullptr) { |
126 SchedulingRemoteSuggestionsProvider::RegisterProfilePrefs( | 133 SchedulingRemoteSuggestionsProvider::RegisterProfilePrefs( |
127 utils_.pref_service()->registry()); | 134 utils_.pref_service()->registry()); |
135 ResetProvider(); | |
136 } | |
128 | 137 |
138 void ResetProvider() { | |
129 auto underlying_provider = | 139 auto underlying_provider = |
130 base::MakeUnique<StrictMock<MockRemoteSuggestionsProvider>>( | 140 base::MakeUnique<StrictMock<MockRemoteSuggestionsProvider>>( |
131 /*observer=*/nullptr); | 141 /*observer=*/nullptr); |
132 underlying_provider_ = underlying_provider.get(); | 142 underlying_provider_ = underlying_provider.get(); |
133 | 143 |
134 // SchedulingRemoteSuggestionsProvider calls SetProviderStatusCallback(_) to | 144 // SchedulingRemoteSuggestionsProvider calls SetProviderStatusCallback(_) to |
135 // stay in the loop of status changes. | 145 // stay in the loop of status changes. |
136 EXPECT_CALL(*underlying_provider_, SetProviderStatusCallback(_)) | 146 EXPECT_CALL(*underlying_provider_, SetProviderStatusCallback(_)) |
137 .WillOnce(SaveArg<0>(&provider_status_callback_)); | 147 .WillOnce(SaveArg<0>(&provider_status_callback_)); |
138 | 148 |
139 auto test_clock = base::MakeUnique<base::SimpleTestClock>(); | 149 auto test_clock = base::MakeUnique<base::SimpleTestClock>(); |
140 test_clock_ = test_clock.get(); | 150 test_clock_ = test_clock.get(); |
141 test_clock_->SetNow(base::Time::Now()); | 151 test_clock_->SetNow(base::Time::Now()); |
142 | 152 |
143 scheduling_provider_ = | 153 scheduling_provider_ = |
144 base::MakeUnique<SchedulingRemoteSuggestionsProvider>( | 154 base::MakeUnique<SchedulingRemoteSuggestionsProvider>( |
145 /*observer=*/nullptr, std::move(underlying_provider), | 155 /*observer=*/nullptr, std::move(underlying_provider), |
146 &persistent_scheduler_, &user_classifier_, utils_.pref_service(), | 156 &persistent_scheduler_, &user_classifier_, utils_.pref_service(), |
147 std::move(test_clock)); | 157 std::move(test_clock)); |
148 } | 158 } |
149 | 159 |
160 void SetVariationParameter(const std::string& param_name, | |
161 const std::string& param_value) { | |
162 std::map<std::string, std::string> params = default_variation_params_; | |
163 params[param_name] = param_value; | |
164 | |
165 params_manager_.ClearAllVariationParams(); | |
166 params_manager_.SetVariationParamsWithFeatureAssociations( | |
167 ntp_snippets::kStudyName, params, | |
168 {ntp_snippets::kArticleSuggestionsFeature.name}); | |
169 } | |
170 | |
150 protected: | 171 protected: |
172 std::map<std::string, std::string> default_variation_params_; | |
173 variations::testing::VariationParamsManager params_manager_; | |
151 StrictMock<MockPersistentScheduler> persistent_scheduler_; | 174 StrictMock<MockPersistentScheduler> persistent_scheduler_; |
152 StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_; | 175 StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_; |
153 std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_; | 176 std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_; |
154 RemoteSuggestionsProvider::ProviderStatusCallback provider_status_callback_; | 177 RemoteSuggestionsProvider::ProviderStatusCallback provider_status_callback_; |
155 base::SimpleTestClock* test_clock_; | 178 base::SimpleTestClock* test_clock_; |
156 | 179 |
157 void ChangeStatusOfUnderlyingProvider( | 180 void ChangeStatusOfUnderlyingProvider( |
158 RemoteSuggestionsProvider::ProviderStatus new_status) { | 181 RemoteSuggestionsProvider::ProviderStatus new_status) { |
159 provider_status_callback_.Run(new_status); | 182 provider_status_callback_.Run(new_status); |
160 } | 183 } |
161 | 184 |
162 private: | 185 private: |
163 test::RemoteSuggestionsTestUtils utils_; | 186 test::RemoteSuggestionsTestUtils utils_; |
164 UserClassifier user_classifier_; | 187 UserClassifier user_classifier_; |
165 | 188 |
166 DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest); | 189 DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest); |
167 }; | 190 }; |
168 | 191 |
169 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 192 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
170 ShouldIgnoreSignalsWhenNotEnabled) { | 193 ShouldIgnoreSignalsWhenNotEnabled) { |
171 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 194 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
172 scheduling_provider_->OnNTPOpened(); | 195 scheduling_provider_->OnNTPOpened(); |
196 scheduling_provider_->OnBrowserForegrounded(); | |
197 scheduling_provider_->OnBrowserColdStart(); | |
173 } | 198 } |
174 | 199 |
175 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 200 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
201 ShouldIgnoreSignalsWhenDisabledByParam) { | |
202 // First set an empty list of allowed trigger types. | |
203 SetVariationParameter("scheduler_trigger_types", "-"); | |
204 ResetProvider(); | |
205 | |
206 // Then enable the scheduler. | |
207 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | |
208 ChangeStatusOfUnderlyingProvider( | |
209 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
210 | |
211 scheduling_provider_->OnPersistentSchedulerWakeUp(); | |
212 scheduling_provider_->OnNTPOpened(); | |
213 scheduling_provider_->OnBrowserForegrounded(); | |
214 scheduling_provider_->OnBrowserColdStart(); | |
215 } | |
216 | |
217 TEST_F(SchedulingRemoteSuggestionsProviderTest, | |
218 ShouldHandleEmptyParamForTriggerTypes) { | |
219 // First set an empty param for allowed trigger types -> should result in the | |
220 // default list. | |
221 SetVariationParameter("scheduler_trigger_types", ""); | |
222 ResetProvider(); | |
223 | |
224 // Then enable the scheduler. | |
225 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | |
226 ChangeStatusOfUnderlyingProvider( | |
227 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
228 | |
229 // For instance, persistent scheduler wake up should be enabled by default. | |
230 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | |
231 scheduling_provider_->OnPersistentSchedulerWakeUp(); | |
232 } | |
233 | |
234 TEST_F(SchedulingRemoteSuggestionsProviderTest, | |
235 ShouldHandleIncorrentParamForTriggerTypes) { | |
236 // First set an invalid list of allowed trigger types. | |
237 SetVariationParameter("scheduler_trigger_types", "ntp_opened,foo;"); | |
238 ResetProvider(); | |
239 | |
240 // Then enable the scheduler. | |
241 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | |
242 ChangeStatusOfUnderlyingProvider( | |
243 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
244 | |
245 // For instance, persistent scheduler wake up should be enabled by default. | |
246 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | |
247 scheduling_provider_->OnPersistentSchedulerWakeUp(); | |
248 } | |
249 | |
250 TEST_F(SchedulingRemoteSuggestionsProviderTest, | |
176 ShouldFetchOnPersistentSchedulerWakeUp) { | 251 ShouldFetchOnPersistentSchedulerWakeUp) { |
177 // First enable the scheduler. | 252 // First enable the scheduler. |
178 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 253 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
179 ChangeStatusOfUnderlyingProvider( | 254 ChangeStatusOfUnderlyingProvider( |
180 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 255 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
181 | 256 |
182 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 257 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
183 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 258 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
184 } | 259 } |
185 | 260 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
226 // First enable the scheduler. | 301 // First enable the scheduler. |
227 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 302 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
228 ChangeStatusOfUnderlyingProvider( | 303 ChangeStatusOfUnderlyingProvider( |
229 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 304 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
230 | 305 |
231 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 306 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
232 scheduling_provider_->OnNTPOpened(); | 307 scheduling_provider_->OnNTPOpened(); |
233 } | 308 } |
234 | 309 |
235 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 310 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
311 ShouldFetchOnBrowserForegroundedForTheFirstTime) { | |
312 // First enable the scheduler. | |
tschumann
2017/01/12 12:44:20
would it make sense to only enable that trigger ma
| |
313 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | |
314 ChangeStatusOfUnderlyingProvider( | |
315 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
316 | |
317 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | |
318 scheduling_provider_->OnBrowserForegrounded(); | |
319 } | |
320 | |
321 TEST_F(SchedulingRemoteSuggestionsProviderTest, | |
322 ShouldFetchOnBrowserColdStartForTheFirstTime) { | |
323 // First enable the scheduler. | |
324 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | |
325 ChangeStatusOfUnderlyingProvider( | |
326 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
327 | |
328 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | |
329 scheduling_provider_->OnBrowserColdStart(); | |
330 } | |
331 | |
332 TEST_F(SchedulingRemoteSuggestionsProviderTest, | |
236 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { | 333 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { |
237 // First enable the scheduler; the second Schedule is called after the | 334 // First enable the scheduler; the second Schedule is called after the |
238 // successful fetch. | 335 // successful fetch. |
239 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 336 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
240 ChangeStatusOfUnderlyingProvider( | 337 ChangeStatusOfUnderlyingProvider( |
241 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 338 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
242 | 339 |
243 // Make the first soft fetch successful. | 340 // Make the first soft fetch successful. |
244 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 341 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
245 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 342 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 } | 523 } |
427 | 524 |
428 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 525 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
429 ReschedulesWhenWifiParamChanges) { | 526 ReschedulesWhenWifiParamChanges) { |
430 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 527 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
431 ChangeStatusOfUnderlyingProvider( | 528 ChangeStatusOfUnderlyingProvider( |
432 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 529 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
433 | 530 |
434 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 531 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
435 // null. Change the wifi interval for this class. | 532 // null. Change the wifi interval for this class. |
436 variations::testing::VariationParamsManager params_manager( | 533 SetVariationParameter("fetching_interval_hours-wifi-active_ntp_user", "1.5"); |
437 ntp_snippets::kStudyName, | |
438 {{"fetching_interval_hours-wifi-active_ntp_user", "1.5"}}, | |
439 {kArticleSuggestionsFeature.name}); | |
440 | 534 |
441 // Schedule() should get called for the second time after params have changed. | 535 // Schedule() should get called for the second time after params have changed. |
442 ChangeStatusOfUnderlyingProvider( | 536 ChangeStatusOfUnderlyingProvider( |
443 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 537 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
444 } | 538 } |
445 | 539 |
446 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 540 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
447 ReschedulesWhenFallbackParamChanges) { | 541 ReschedulesWhenFallbackParamChanges) { |
448 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 542 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
449 ChangeStatusOfUnderlyingProvider( | 543 ChangeStatusOfUnderlyingProvider( |
450 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 544 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
451 | 545 |
452 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 546 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
453 // null. Change the wifi interval for this class. | 547 // null. Change the fallback interval for this class. |
454 variations::testing::VariationParamsManager params_manager( | 548 SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user", |
455 ntp_snippets::kStudyName, | 549 "1.5"); |
456 {{"fetching_interval_hours-fallback-active_ntp_user", "1.5"}}, | |
457 {kArticleSuggestionsFeature.name}); | |
458 | 550 |
459 // Schedule() should get called for the second time after params have changed. | 551 // Schedule() should get called for the second time after params have changed. |
460 ChangeStatusOfUnderlyingProvider( | 552 ChangeStatusOfUnderlyingProvider( |
461 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 553 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
462 } | 554 } |
463 | 555 |
464 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 556 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
465 ReschedulesWhenOnUsageEventParamChanges) { | 557 ReschedulesWhenOnUsageEventParamChanges) { |
466 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 558 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
467 ChangeStatusOfUnderlyingProvider( | 559 ChangeStatusOfUnderlyingProvider( |
468 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 560 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
469 | 561 |
470 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 562 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
471 // null. Change the wifi interval for this class. | 563 // null. Change the on usage interval for this class. |
472 variations::testing::VariationParamsManager params_manager( | 564 SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user", |
473 ntp_snippets::kStudyName, | 565 "1.5"); |
474 {{"soft_fetching_interval_hours-active-active_ntp_user", "1.5"}}, | |
475 {kArticleSuggestionsFeature.name}); | |
476 | 566 |
477 // Schedule() should get called for the second time after params have changed. | 567 // Schedule() should get called for the second time after params have changed. |
478 ChangeStatusOfUnderlyingProvider( | 568 ChangeStatusOfUnderlyingProvider( |
479 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 569 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
480 } | 570 } |
481 | 571 |
482 } // namespace ntp_snippets | 572 } // namespace ntp_snippets |
OLD | NEW |