Chromium Code Reviews| 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 |