| 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 |