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(); |
| 198 } |
| 199 |
| 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(); |
173 } | 248 } |
174 | 249 |
175 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 250 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
176 ShouldFetchOnPersistentSchedulerWakeUp) { | 251 ShouldFetchOnPersistentSchedulerWakeUp) { |
177 // First enable the scheduler. | 252 // First set only this type to be allowed. |
| 253 SetVariationParameter("scheduler_trigger_types", |
| 254 "persistent_scheduler_wake_up"); |
| 255 ResetProvider(); |
| 256 |
| 257 // Then enable the scheduler. |
178 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 258 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
179 ChangeStatusOfUnderlyingProvider( | 259 ChangeStatusOfUnderlyingProvider( |
180 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 260 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
181 | 261 |
182 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 262 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
183 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 263 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
184 } | 264 } |
185 | 265 |
186 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 266 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
187 ShouldFetchOnPersistentSchedulerWakeUpRepeated) { | 267 ShouldFetchOnPersistentSchedulerWakeUpRepeated) { |
(...skipping 28 matching lines...) Expand all Loading... |
216 ChangeStatusOfUnderlyingProvider( | 296 ChangeStatusOfUnderlyingProvider( |
217 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 297 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
218 // Make the first persistent fetch never finish. | 298 // Make the first persistent fetch never finish. |
219 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 299 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
220 // Make the second fetch. | 300 // Make the second fetch. |
221 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 301 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
222 } | 302 } |
223 | 303 |
224 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 304 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
225 ShouldFetchOnNTPOpenedForTheFirstTime) { | 305 ShouldFetchOnNTPOpenedForTheFirstTime) { |
226 // First enable the scheduler. | 306 // First set only this type to be allowed. |
| 307 SetVariationParameter("scheduler_trigger_types", "ntp_opened"); |
| 308 ResetProvider(); |
| 309 |
| 310 // Then enable the scheduler. |
227 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 311 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
228 ChangeStatusOfUnderlyingProvider( | 312 ChangeStatusOfUnderlyingProvider( |
229 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 313 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
230 | 314 |
231 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 315 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
232 scheduling_provider_->OnNTPOpened(); | 316 scheduling_provider_->OnNTPOpened(); |
233 } | 317 } |
234 | 318 |
235 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 319 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 320 ShouldFetchOnBrowserForegroundedForTheFirstTime) { |
| 321 // First set only this type to be allowed. |
| 322 SetVariationParameter("scheduler_trigger_types", "browser_foregrounded"); |
| 323 ResetProvider(); |
| 324 |
| 325 // Then enable the scheduler. |
| 326 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 327 ChangeStatusOfUnderlyingProvider( |
| 328 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
| 329 |
| 330 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 331 scheduling_provider_->OnBrowserForegrounded(); |
| 332 } |
| 333 |
| 334 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 335 ShouldFetchOnBrowserColdStartForTheFirstTime) { |
| 336 // First set only this type to be allowed. |
| 337 SetVariationParameter("scheduler_trigger_types", "browser_cold_start"); |
| 338 ResetProvider(); |
| 339 |
| 340 // Then enable the scheduler. |
| 341 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 342 ChangeStatusOfUnderlyingProvider( |
| 343 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
| 344 |
| 345 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 346 scheduling_provider_->OnBrowserColdStart(); |
| 347 } |
| 348 |
| 349 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
236 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { | 350 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { |
237 // First enable the scheduler; the second Schedule is called after the | 351 // First enable the scheduler; the second Schedule is called after the |
238 // successful fetch. | 352 // successful fetch. |
239 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 353 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
240 ChangeStatusOfUnderlyingProvider( | 354 ChangeStatusOfUnderlyingProvider( |
241 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 355 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
242 | 356 |
243 // Make the first soft fetch successful. | 357 // Make the first soft fetch successful. |
244 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 358 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
245 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 359 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 } | 540 } |
427 | 541 |
428 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 542 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
429 ReschedulesWhenWifiParamChanges) { | 543 ReschedulesWhenWifiParamChanges) { |
430 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 544 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
431 ChangeStatusOfUnderlyingProvider( | 545 ChangeStatusOfUnderlyingProvider( |
432 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 546 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
433 | 547 |
434 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 548 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
435 // null. Change the wifi interval for this class. | 549 // null. Change the wifi interval for this class. |
436 variations::testing::VariationParamsManager params_manager( | 550 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 | 551 |
441 // Schedule() should get called for the second time after params have changed. | 552 // Schedule() should get called for the second time after params have changed. |
442 ChangeStatusOfUnderlyingProvider( | 553 ChangeStatusOfUnderlyingProvider( |
443 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 554 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
444 } | 555 } |
445 | 556 |
446 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 557 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
447 ReschedulesWhenFallbackParamChanges) { | 558 ReschedulesWhenFallbackParamChanges) { |
448 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 559 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
449 ChangeStatusOfUnderlyingProvider( | 560 ChangeStatusOfUnderlyingProvider( |
450 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 561 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
451 | 562 |
452 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 563 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
453 // null. Change the wifi interval for this class. | 564 // null. Change the fallback interval for this class. |
454 variations::testing::VariationParamsManager params_manager( | 565 SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user", |
455 ntp_snippets::kStudyName, | 566 "1.5"); |
456 {{"fetching_interval_hours-fallback-active_ntp_user", "1.5"}}, | |
457 {kArticleSuggestionsFeature.name}); | |
458 | 567 |
459 // Schedule() should get called for the second time after params have changed. | 568 // Schedule() should get called for the second time after params have changed. |
460 ChangeStatusOfUnderlyingProvider( | 569 ChangeStatusOfUnderlyingProvider( |
461 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 570 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
462 } | 571 } |
463 | 572 |
464 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 573 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
465 ReschedulesWhenOnUsageEventParamChanges) { | 574 ReschedulesWhenOnUsageEventParamChanges) { |
466 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 575 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
467 ChangeStatusOfUnderlyingProvider( | 576 ChangeStatusOfUnderlyingProvider( |
468 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 577 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
469 | 578 |
470 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 579 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
471 // null. Change the wifi interval for this class. | 580 // null. Change the on usage interval for this class. |
472 variations::testing::VariationParamsManager params_manager( | 581 SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user", |
473 ntp_snippets::kStudyName, | 582 "1.5"); |
474 {{"soft_fetching_interval_hours-active-active_ntp_user", "1.5"}}, | |
475 {kArticleSuggestionsFeature.name}); | |
476 | 583 |
477 // Schedule() should get called for the second time after params have changed. | 584 // Schedule() should get called for the second time after params have changed. |
478 ChangeStatusOfUnderlyingProvider( | 585 ChangeStatusOfUnderlyingProvider( |
479 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 586 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
480 } | 587 } |
481 | 588 |
482 } // namespace ntp_snippets | 589 } // namespace ntp_snippets |
OLD | NEW |