| 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 | |
| 145 // stay in the loop of status changes. | |
| 146 EXPECT_CALL(*underlying_provider_, SetProviderStatusCallback(_)) | |
| 147 .WillOnce(SaveArg<0>(&provider_status_callback_)); | |
| 148 | |
| 149 auto test_clock = base::MakeUnique<base::SimpleTestClock>(); | 138 auto test_clock = base::MakeUnique<base::SimpleTestClock>(); |
| 150 test_clock_ = test_clock.get(); | 139 test_clock_ = test_clock.get(); |
| 151 test_clock_->SetNow(base::Time::Now()); | 140 test_clock_->SetNow(base::Time::Now()); |
| 152 | 141 |
| 153 scheduling_provider_ = | 142 scheduling_provider_ = |
| 154 base::MakeUnique<SchedulingRemoteSuggestionsProvider>( | 143 base::MakeUnique<SchedulingRemoteSuggestionsProvider>( |
| 155 /*observer=*/nullptr, std::move(underlying_provider), | 144 /*observer=*/nullptr, std::move(underlying_provider), |
| 156 &persistent_scheduler_, &user_classifier_, utils_.pref_service(), | 145 &persistent_scheduler_, &user_classifier_, utils_.pref_service(), |
| 157 std::move(test_clock)); | 146 std::move(test_clock)); |
| 158 } | 147 } |
| 159 | 148 |
| 160 void SetVariationParameter(const std::string& param_name, | 149 void SetVariationParameter(const std::string& param_name, |
| 161 const std::string& param_value) { | 150 const std::string& param_value) { |
| 162 std::map<std::string, std::string> params = default_variation_params_; | 151 std::map<std::string, std::string> params = default_variation_params_; |
| 163 params[param_name] = param_value; | 152 params[param_name] = param_value; |
| 164 | 153 |
| 165 params_manager_.ClearAllVariationParams(); | 154 params_manager_.ClearAllVariationParams(); |
| 166 params_manager_.SetVariationParamsWithFeatureAssociations( | 155 params_manager_.SetVariationParamsWithFeatureAssociations( |
| 167 ntp_snippets::kStudyName, params, | 156 ntp_snippets::kStudyName, params, |
| 168 {ntp_snippets::kArticleSuggestionsFeature.name}); | 157 {ntp_snippets::kArticleSuggestionsFeature.name}); |
| 169 } | 158 } |
| 170 | 159 |
| 171 protected: | 160 protected: |
| 172 std::map<std::string, std::string> default_variation_params_; | 161 std::map<std::string, std::string> default_variation_params_; |
| 173 variations::testing::VariationParamsManager params_manager_; | 162 variations::testing::VariationParamsManager params_manager_; |
| 174 StrictMock<MockPersistentScheduler> persistent_scheduler_; | 163 StrictMock<MockPersistentScheduler> persistent_scheduler_; |
| 175 StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_; | 164 StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_; |
| 176 std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_; | 165 std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_; |
| 177 RemoteSuggestionsProvider::ProviderStatusCallback provider_status_callback_; | |
| 178 base::SimpleTestClock* test_clock_; | 166 base::SimpleTestClock* test_clock_; |
| 179 | 167 |
| 180 void ChangeStatusOfUnderlyingProvider( | 168 void ActivateUnderlyingProvider() { |
| 181 RemoteSuggestionsProvider::ProviderStatus new_status) { | 169 scheduling_provider_->OnProviderActivated(); |
| 182 provider_status_callback_.Run(new_status); | 170 } |
| 171 |
| 172 void InactivateUnderlyingProvider() { |
| 173 scheduling_provider_->OnProviderDeactivated(); |
| 183 } | 174 } |
| 184 | 175 |
| 185 private: | 176 private: |
| 186 test::RemoteSuggestionsTestUtils utils_; | 177 test::RemoteSuggestionsTestUtils utils_; |
| 187 UserClassifier user_classifier_; | 178 UserClassifier user_classifier_; |
| 188 | 179 |
| 189 DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest); | 180 DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest); |
| 190 }; | 181 }; |
| 191 | 182 |
| 192 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 183 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 193 ShouldIgnoreSignalsWhenNotEnabled) { | 184 ShouldIgnoreSignalsWhenNotEnabled) { |
| 194 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 185 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 195 scheduling_provider_->OnNTPOpened(); | 186 scheduling_provider_->OnNTPOpened(); |
| 196 scheduling_provider_->OnBrowserForegrounded(); | 187 scheduling_provider_->OnBrowserForegrounded(); |
| 197 scheduling_provider_->OnBrowserColdStart(); | 188 scheduling_provider_->OnBrowserColdStart(); |
| 198 } | 189 } |
| 199 | 190 |
| 200 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 191 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 201 ShouldIgnoreSignalsWhenDisabledByParam) { | 192 ShouldIgnoreSignalsWhenDisabledByParam) { |
| 202 // First set an empty list of allowed trigger types. | 193 // First set an empty list of allowed trigger types. |
| 203 SetVariationParameter("scheduler_trigger_types", "-"); | 194 SetVariationParameter("scheduler_trigger_types", "-"); |
| 204 ResetProvider(); | 195 ResetProvider(); |
| 205 | 196 |
| 206 // Then enable the scheduler. | 197 // Then enable the scheduler. |
| 207 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 198 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 208 ChangeStatusOfUnderlyingProvider( | 199 ActivateUnderlyingProvider(); |
| 209 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 210 | 200 |
| 211 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 201 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 212 scheduling_provider_->OnNTPOpened(); | 202 scheduling_provider_->OnNTPOpened(); |
| 213 scheduling_provider_->OnBrowserForegrounded(); | 203 scheduling_provider_->OnBrowserForegrounded(); |
| 214 scheduling_provider_->OnBrowserColdStart(); | 204 scheduling_provider_->OnBrowserColdStart(); |
| 215 } | 205 } |
| 216 | 206 |
| 217 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 207 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 218 ShouldHandleEmptyParamForTriggerTypes) { | 208 ShouldHandleEmptyParamForTriggerTypes) { |
| 219 // First set an empty param for allowed trigger types -> should result in the | 209 // First set an empty param for allowed trigger types -> should result in the |
| 220 // default list. | 210 // default list. |
| 221 SetVariationParameter("scheduler_trigger_types", ""); | 211 SetVariationParameter("scheduler_trigger_types", ""); |
| 222 ResetProvider(); | 212 ResetProvider(); |
| 223 | 213 |
| 224 // Then enable the scheduler. | 214 // Then enable the scheduler. |
| 225 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 215 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 226 ChangeStatusOfUnderlyingProvider( | 216 ActivateUnderlyingProvider(); |
| 227 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 228 | 217 |
| 229 // For instance, persistent scheduler wake up should be enabled by default. | 218 // For instance, persistent scheduler wake up should be enabled by default. |
| 230 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 219 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 231 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 220 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 232 } | 221 } |
| 233 | 222 |
| 234 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 223 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 235 ShouldHandleIncorrentParamForTriggerTypes) { | 224 ShouldHandleIncorrentParamForTriggerTypes) { |
| 236 // First set an invalid list of allowed trigger types. | 225 // First set an invalid list of allowed trigger types. |
| 237 SetVariationParameter("scheduler_trigger_types", "ntp_opened,foo;"); | 226 SetVariationParameter("scheduler_trigger_types", "ntp_opened,foo;"); |
| 238 ResetProvider(); | 227 ResetProvider(); |
| 239 | 228 |
| 240 // Then enable the scheduler. | 229 // Then enable the scheduler. |
| 241 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 230 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 242 ChangeStatusOfUnderlyingProvider( | 231 ActivateUnderlyingProvider(); |
| 243 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 244 | 232 |
| 245 // For instance, persistent scheduler wake up should be enabled by default. | 233 // For instance, persistent scheduler wake up should be enabled by default. |
| 246 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 234 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 247 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 235 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 248 } | 236 } |
| 249 | 237 |
| 250 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 238 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 251 ShouldFetchOnPersistentSchedulerWakeUp) { | 239 ShouldFetchOnPersistentSchedulerWakeUp) { |
| 252 // First set only this type to be allowed. | 240 // First set only this type to be allowed. |
| 253 SetVariationParameter("scheduler_trigger_types", | 241 SetVariationParameter("scheduler_trigger_types", |
| 254 "persistent_scheduler_wake_up"); | 242 "persistent_scheduler_wake_up"); |
| 255 ResetProvider(); | 243 ResetProvider(); |
| 256 | 244 |
| 257 // Then enable the scheduler. | 245 // Then enable the scheduler. |
| 258 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 246 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 259 ChangeStatusOfUnderlyingProvider( | 247 ActivateUnderlyingProvider(); |
| 260 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 261 | 248 |
| 262 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 249 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 263 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 250 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 264 } | 251 } |
| 265 | 252 |
| 266 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 253 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 267 ShouldFetchOnPersistentSchedulerWakeUpRepeated) { | 254 ShouldFetchOnPersistentSchedulerWakeUpRepeated) { |
| 268 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 255 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 269 { | 256 { |
| 270 InSequence s; | 257 InSequence s; |
| 271 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 258 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 272 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 259 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 273 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 260 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 274 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 261 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 275 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 262 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 276 } | 263 } |
| 277 // First enable the scheduler -- calling Schedule() for the first time. | 264 // First enable the scheduler -- calling Schedule() for the first time. |
| 278 ChangeStatusOfUnderlyingProvider( | 265 ActivateUnderlyingProvider(); |
| 279 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 280 // Make the first persistent fetch successful -- calling Schedule() again. | 266 // Make the first persistent fetch successful -- calling Schedule() again. |
| 281 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 267 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 282 signal_fetch_done.Run(Status::Success()); | 268 signal_fetch_done.Run(Status::Success()); |
| 283 // Make the second fetch. | 269 // Make the second fetch. |
| 284 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 270 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 285 } | 271 } |
| 286 | 272 |
| 287 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 273 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 288 ShouldNotTriggerBackgroundFetchIfAlreadyInProgess) { | 274 ShouldNotTriggerBackgroundFetchIfAlreadyInProgess) { |
| 289 { | 275 { |
| 290 InSequence s; | 276 InSequence s; |
| 291 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 277 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 292 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 278 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 293 // RefetchInTheBackground is not called after the second trigger. | 279 // RefetchInTheBackground is not called after the second trigger. |
| 294 } | 280 } |
| 295 // First enable the scheduler -- calling Schedule() for the first time. | 281 // First enable the scheduler -- calling Schedule() for the first time. |
| 296 ChangeStatusOfUnderlyingProvider( | 282 ActivateUnderlyingProvider(); |
| 297 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 298 // Make the first persistent fetch never finish. | 283 // Make the first persistent fetch never finish. |
| 299 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 284 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 300 // Make the second fetch. | 285 // Make the second fetch. |
| 301 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 286 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 302 } | 287 } |
| 303 | 288 |
| 304 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 289 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 305 ShouldFetchOnNTPOpenedForTheFirstTime) { | 290 ShouldFetchOnNTPOpenedForTheFirstTime) { |
| 306 // First set only this type to be allowed. | 291 // First set only this type to be allowed. |
| 307 SetVariationParameter("scheduler_trigger_types", "ntp_opened"); | 292 SetVariationParameter("scheduler_trigger_types", "ntp_opened"); |
| 308 ResetProvider(); | 293 ResetProvider(); |
| 309 | 294 |
| 310 // Then enable the scheduler. | 295 // Then enable the scheduler. |
| 311 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 296 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 312 ChangeStatusOfUnderlyingProvider( | 297 ActivateUnderlyingProvider(); |
| 313 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 314 | 298 |
| 315 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 299 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 316 scheduling_provider_->OnNTPOpened(); | 300 scheduling_provider_->OnNTPOpened(); |
| 317 } | 301 } |
| 318 | 302 |
| 319 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 303 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 320 ShouldFetchOnBrowserForegroundedForTheFirstTime) { | 304 ShouldFetchOnBrowserForegroundedForTheFirstTime) { |
| 321 // First set only this type to be allowed. | 305 // First set only this type to be allowed. |
| 322 SetVariationParameter("scheduler_trigger_types", "browser_foregrounded"); | 306 SetVariationParameter("scheduler_trigger_types", "browser_foregrounded"); |
| 323 ResetProvider(); | 307 ResetProvider(); |
| 324 | 308 |
| 325 // Then enable the scheduler. | 309 // Then enable the scheduler. |
| 326 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 310 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 327 ChangeStatusOfUnderlyingProvider( | 311 ActivateUnderlyingProvider(); |
| 328 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 329 | 312 |
| 330 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 313 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 331 scheduling_provider_->OnBrowserForegrounded(); | 314 scheduling_provider_->OnBrowserForegrounded(); |
| 332 } | 315 } |
| 333 | 316 |
| 334 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 317 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 335 ShouldFetchOnBrowserColdStartForTheFirstTime) { | 318 ShouldFetchOnBrowserColdStartForTheFirstTime) { |
| 336 // First set only this type to be allowed. | 319 // First set only this type to be allowed. |
| 337 SetVariationParameter("scheduler_trigger_types", "browser_cold_start"); | 320 SetVariationParameter("scheduler_trigger_types", "browser_cold_start"); |
| 338 ResetProvider(); | 321 ResetProvider(); |
| 339 | 322 |
| 340 // Then enable the scheduler. | 323 // Then enable the scheduler. |
| 341 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 324 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 342 ChangeStatusOfUnderlyingProvider( | 325 ActivateUnderlyingProvider(); |
| 343 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 344 | 326 |
| 345 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 327 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 346 scheduling_provider_->OnBrowserColdStart(); | 328 scheduling_provider_->OnBrowserColdStart(); |
| 347 } | 329 } |
| 348 | 330 |
| 349 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 331 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 350 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { | 332 ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) { |
| 351 // First enable the scheduler; the second Schedule is called after the | 333 // First enable the scheduler; the second Schedule is called after the |
| 352 // successful fetch. | 334 // successful fetch. |
| 353 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 335 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 354 ChangeStatusOfUnderlyingProvider( | 336 ActivateUnderlyingProvider(); |
| 355 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 356 | 337 |
| 357 // Make the first soft fetch successful. | 338 // Make the first soft fetch successful. |
| 358 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 339 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 359 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 340 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 360 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 341 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 361 scheduling_provider_->OnNTPOpened(); | 342 scheduling_provider_->OnNTPOpened(); |
| 362 signal_fetch_done.Run(Status::Success()); | 343 signal_fetch_done.Run(Status::Success()); |
| 363 // The second call is ignored if it happens right after the first one. | 344 // The second call is ignored if it happens right after the first one. |
| 364 scheduling_provider_->OnNTPOpened(); | 345 scheduling_provider_->OnNTPOpened(); |
| 365 } | 346 } |
| 366 | 347 |
| 367 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 348 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 368 ShouldNotFetchOnNTPOpenedAfterSuccessfulPersistentFetch) { | 349 ShouldNotFetchOnNTPOpenedAfterSuccessfulPersistentFetch) { |
| 369 // First enable the scheduler; the second Schedule is called after the | 350 // First enable the scheduler; the second Schedule is called after the |
| 370 // successful fetch. | 351 // successful fetch. |
| 371 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 352 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 372 ChangeStatusOfUnderlyingProvider( | 353 ActivateUnderlyingProvider(); |
| 373 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 374 | 354 |
| 375 // Make the first persistent fetch successful. | 355 // Make the first persistent fetch successful. |
| 376 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 356 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 377 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 357 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 378 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 358 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 379 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 359 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 380 signal_fetch_done.Run(Status::Success()); | 360 signal_fetch_done.Run(Status::Success()); |
| 381 // The second call is ignored if it happens right after the first one. | 361 // The second call is ignored if it happens right after the first one. |
| 382 scheduling_provider_->OnNTPOpened(); | 362 scheduling_provider_->OnNTPOpened(); |
| 383 } | 363 } |
| 384 | 364 |
| 385 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 365 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 386 ShouldNotFetchOnNTPOpenedAfterFailedSoftFetch) { | 366 ShouldNotFetchOnNTPOpenedAfterFailedSoftFetch) { |
| 387 // First enable the scheduler. | 367 // First enable the scheduler. |
| 388 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 368 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 389 ChangeStatusOfUnderlyingProvider( | 369 ActivateUnderlyingProvider(); |
| 390 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 391 | 370 |
| 392 // Make the first soft fetch failed. | 371 // Make the first soft fetch failed. |
| 393 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 372 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 394 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 373 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 395 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 374 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 396 scheduling_provider_->OnNTPOpened(); | 375 scheduling_provider_->OnNTPOpened(); |
| 397 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); | 376 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); |
| 398 | 377 |
| 399 // The second call is ignored if it happens right after the first one. | 378 // The second call is ignored if it happens right after the first one. |
| 400 scheduling_provider_->OnNTPOpened(); | 379 scheduling_provider_->OnNTPOpened(); |
| 401 } | 380 } |
| 402 | 381 |
| 403 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 382 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 404 ShouldNotFetchOnNTPOpenedAfterFailedPersistentFetch) { | 383 ShouldNotFetchOnNTPOpenedAfterFailedPersistentFetch) { |
| 405 // First enable the scheduler. | 384 // First enable the scheduler. |
| 406 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 385 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 407 ChangeStatusOfUnderlyingProvider( | 386 ActivateUnderlyingProvider(); |
| 408 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 409 | 387 |
| 410 // Make the first persistent fetch failed. | 388 // Make the first persistent fetch failed. |
| 411 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 389 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 412 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 390 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 413 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 391 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 414 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 392 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 415 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); | 393 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); |
| 416 | 394 |
| 417 // The second call is ignored if it happens right after the first one. | 395 // The second call is ignored if it happens right after the first one. |
| 418 scheduling_provider_->OnNTPOpened(); | 396 scheduling_provider_->OnNTPOpened(); |
| 419 } | 397 } |
| 420 | 398 |
| 421 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 399 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 422 ShouldFetchAgainOnBrowserForgroundLaterAgain) { | 400 ShouldFetchAgainOnBrowserForgroundLaterAgain) { |
| 423 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 401 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 424 { | 402 { |
| 425 InSequence s; | 403 InSequence s; |
| 426 // Initial scheduling after being enabled. | 404 // Initial scheduling after being enabled. |
| 427 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 405 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 428 // The first call to NTPOpened results in a fetch. | 406 // The first call to NTPOpened results in a fetch. |
| 429 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 407 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 430 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 408 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 431 // Rescheduling after a succesful fetch. | 409 // Rescheduling after a succesful fetch. |
| 432 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 410 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 433 // The second call to NTPOpened 2hrs later again results in a fetch. | 411 // The second call to NTPOpened 2hrs later again results in a fetch. |
| 434 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 412 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 435 } | 413 } |
| 436 | 414 |
| 437 // First enable the scheduler. | 415 // First enable the scheduler. |
| 438 ChangeStatusOfUnderlyingProvider( | 416 ActivateUnderlyingProvider(); |
| 439 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 440 // Make the first soft fetch successful. | 417 // Make the first soft fetch successful. |
| 441 scheduling_provider_->OnBrowserForegrounded(); | 418 scheduling_provider_->OnBrowserForegrounded(); |
| 442 signal_fetch_done.Run(Status::Success()); | 419 signal_fetch_done.Run(Status::Success()); |
| 443 // Open NTP again after 2hrs. | 420 // Open NTP again after 2hrs. |
| 444 test_clock_->Advance(base::TimeDelta::FromHours(2)); | 421 test_clock_->Advance(base::TimeDelta::FromHours(2)); |
| 445 scheduling_provider_->OnBrowserForegrounded(); | 422 scheduling_provider_->OnBrowserForegrounded(); |
| 446 } | 423 } |
| 447 | 424 |
| 448 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 425 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 449 ShouldRescheduleOnRescheduleFetching) { | 426 ShouldRescheduleOnRescheduleFetching) { |
| 450 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 427 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 451 scheduling_provider_->RescheduleFetching(); | 428 scheduling_provider_->RescheduleFetching(); |
| 452 } | 429 } |
| 453 | 430 |
| 454 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) { | 431 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) { |
| 455 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 432 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 456 ChangeStatusOfUnderlyingProvider( | 433 ActivateUnderlyingProvider(); |
| 457 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 458 } | 434 } |
| 459 | 435 |
| 460 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 436 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 461 ShouldUnscheduleOnLaterInactivation) { | 437 ShouldUnscheduleOnLaterInactivation) { |
| 462 { | 438 { |
| 463 InSequence s; | 439 InSequence s; |
| 464 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 440 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 465 EXPECT_CALL(persistent_scheduler_, Unschedule()); | 441 EXPECT_CALL(persistent_scheduler_, Unschedule()); |
| 466 } | 442 } |
| 467 ChangeStatusOfUnderlyingProvider( | 443 ActivateUnderlyingProvider(); |
| 468 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 444 InactivateUnderlyingProvider(); |
| 469 ChangeStatusOfUnderlyingProvider( | |
| 470 RemoteSuggestionsProvider::ProviderStatus::INACTIVE); | |
| 471 } | 445 } |
| 472 | 446 |
| 473 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 447 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 474 ShouldScheduleOnLaterActivation) { | 448 ShouldScheduleOnLaterActivation) { |
| 475 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 449 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 476 // There is no schedule yet, so inactivation does not trigger unschedule. | 450 // There is no schedule yet, so inactivation does not trigger unschedule. |
| 477 ChangeStatusOfUnderlyingProvider( | 451 InactivateUnderlyingProvider(); |
| 478 RemoteSuggestionsProvider::ProviderStatus::INACTIVE); | 452 ActivateUnderlyingProvider(); |
| 479 ChangeStatusOfUnderlyingProvider( | |
| 480 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 481 } | 453 } |
| 482 | 454 |
| 483 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 455 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 484 ShouldRescheduleAfterSuccessfulFetch) { | 456 ShouldRescheduleAfterSuccessfulFetch) { |
| 485 // First reschedule on becoming active. | 457 // First reschedule on becoming active. |
| 486 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 458 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 487 ChangeStatusOfUnderlyingProvider( | 459 ActivateUnderlyingProvider(); |
| 488 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 489 | 460 |
| 490 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 461 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 491 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 462 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 492 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 463 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 493 | 464 |
| 494 // Trigger a fetch. | 465 // Trigger a fetch. |
| 495 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 466 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 496 // Second reschedule after a successful fetch. | 467 // Second reschedule after a successful fetch. |
| 497 signal_fetch_done.Run(Status::Success()); | 468 signal_fetch_done.Run(Status::Success()); |
| 498 } | 469 } |
| 499 | 470 |
| 500 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 471 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 501 ShouldNotRescheduleAfterFailedFetch) { | 472 ShouldNotRescheduleAfterFailedFetch) { |
| 502 // Only reschedule on becoming active. | 473 // Only reschedule on becoming active. |
| 503 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 474 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 504 ChangeStatusOfUnderlyingProvider( | 475 ActivateUnderlyingProvider(); |
| 505 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 506 | 476 |
| 507 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 477 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 508 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 478 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 509 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 479 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 510 | 480 |
| 511 // Trigger a fetch. | 481 // Trigger a fetch. |
| 512 scheduling_provider_->OnPersistentSchedulerWakeUp(); | 482 scheduling_provider_->OnPersistentSchedulerWakeUp(); |
| 513 // No furter reschedule after a failure. | 483 // No furter reschedule after a failure. |
| 514 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); | 484 signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, "")); |
| 515 } | 485 } |
| 516 | 486 |
| 517 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnlyOnce) { | 487 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnlyOnce) { |
| 518 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 488 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 519 ChangeStatusOfUnderlyingProvider( | 489 ActivateUnderlyingProvider(); |
| 520 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 521 // No further call to Schedule on a second status callback. | 490 // No further call to Schedule on a second status callback. |
| 522 ChangeStatusOfUnderlyingProvider( | 491 ActivateUnderlyingProvider(); |
| 523 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 524 } | 492 } |
| 525 | 493 |
| 526 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) { | 494 TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) { |
| 527 { | 495 { |
| 528 InSequence s; | 496 InSequence s; |
| 529 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 497 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 530 EXPECT_CALL(persistent_scheduler_, Unschedule()); | 498 EXPECT_CALL(persistent_scheduler_, Unschedule()); |
| 531 } | 499 } |
| 532 // First schedule so that later we really unschedule. | 500 // First schedule so that later we really unschedule. |
| 533 ChangeStatusOfUnderlyingProvider( | 501 ActivateUnderlyingProvider(); |
| 534 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | 502 InactivateUnderlyingProvider(); |
| 535 ChangeStatusOfUnderlyingProvider( | |
| 536 RemoteSuggestionsProvider::ProviderStatus::INACTIVE); | |
| 537 // No further call to Unschedule on second status callback. | 503 // No further call to Unschedule on second status callback. |
| 538 ChangeStatusOfUnderlyingProvider( | 504 InactivateUnderlyingProvider(); |
| 539 RemoteSuggestionsProvider::ProviderStatus::INACTIVE); | |
| 540 } | 505 } |
| 541 | 506 |
| 542 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 507 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 543 ReschedulesWhenWifiParamChanges) { | 508 ReschedulesWhenWifiParamChanges) { |
| 544 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 509 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 545 ChangeStatusOfUnderlyingProvider( | 510 ActivateUnderlyingProvider(); |
| 546 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 547 | 511 |
| 548 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 512 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
| 549 // null. Change the wifi interval for this class. | 513 // null. Change the wifi interval for this class. |
| 550 SetVariationParameter("fetching_interval_hours-wifi-active_ntp_user", "1.5"); | 514 SetVariationParameter("fetching_interval_hours-wifi-active_ntp_user", "1.5"); |
| 551 | 515 |
| 552 // Schedule() should get called for the second time after params have changed. | 516 // Schedule() should get called for the second time after params have changed. |
| 553 ChangeStatusOfUnderlyingProvider( | 517 ActivateUnderlyingProvider(); |
| 554 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 555 } | 518 } |
| 556 | 519 |
| 557 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 520 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 558 ReschedulesWhenFallbackParamChanges) { | 521 ReschedulesWhenFallbackParamChanges) { |
| 559 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 522 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 560 ChangeStatusOfUnderlyingProvider( | 523 ActivateUnderlyingProvider(); |
| 561 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 562 | 524 |
| 563 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 525 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
| 564 // null. Change the fallback interval for this class. | 526 // null. Change the fallback interval for this class. |
| 565 SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user", | 527 SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user", |
| 566 "1.5"); | 528 "1.5"); |
| 567 | 529 |
| 568 // Schedule() should get called for the second time after params have changed. | 530 // Schedule() should get called for the second time after params have changed. |
| 569 ChangeStatusOfUnderlyingProvider( | 531 ActivateUnderlyingProvider(); |
| 570 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 571 } | 532 } |
| 572 | 533 |
| 573 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 534 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 574 ReschedulesWhenOnUsageEventParamChanges) { | 535 ReschedulesWhenOnUsageEventParamChanges) { |
| 575 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 536 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 576 ChangeStatusOfUnderlyingProvider( | 537 ActivateUnderlyingProvider(); |
| 577 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 578 | 538 |
| 579 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 539 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
| 580 // null. Change the on usage interval for this class. | 540 // null. Change the on usage interval for this class. |
| 581 SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user", | 541 SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user", |
| 582 "1.5"); | 542 "1.5"); |
| 583 | 543 |
| 584 // Schedule() should get called for the second time after params have changed. | 544 // Schedule() should get called for the second time after params have changed. |
| 585 ChangeStatusOfUnderlyingProvider( | 545 ActivateUnderlyingProvider(); |
| 586 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 587 } | 546 } |
| 588 | 547 |
| 589 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 548 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 590 ReschedulesWhenOnNtpOpenedParamChanges) { | 549 ReschedulesWhenOnNtpOpenedParamChanges) { |
| 591 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); | 550 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
| 592 ChangeStatusOfUnderlyingProvider( | 551 ActivateUnderlyingProvider(); |
| 593 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 594 | 552 |
| 595 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is | 553 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
| 596 // null. Change the fallback interval for this class. | 554 // null. Change the fallback interval for this class. |
| 597 SetVariationParameter("soft_on_ntp_opened_interval_hours-active_ntp_user", | 555 SetVariationParameter("soft_on_ntp_opened_interval_hours-active_ntp_user", |
| 598 "1.5"); | 556 "1.5"); |
| 599 | 557 |
| 600 // Schedule() should get called for the second time after params have changed. | 558 // Schedule() should get called for the second time after params have changed. |
| 601 ChangeStatusOfUnderlyingProvider( | 559 ActivateUnderlyingProvider(); |
| 602 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 603 } | 560 } |
| 604 | 561 |
| 605 TEST_F(SchedulingRemoteSuggestionsProviderTest, | 562 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 606 FetchIntervalForNtpOpenedTrigger) { | 563 FetchIntervalForNtpOpenedTrigger) { |
| 607 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; | 564 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 608 { | 565 { |
| 609 InSequence s; | 566 InSequence s; |
| 610 // Initial scheduling after being enabled. | 567 // Initial scheduling after being enabled. |
| 611 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 568 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 612 // The first call to NTPOpened results in a fetch. | 569 // The first call to NTPOpened results in a fetch. |
| 613 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 570 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 614 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 571 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 615 // Rescheduling after a succesful fetch. | 572 // Rescheduling after a succesful fetch. |
| 616 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 573 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 617 // The third call to NTPOpened 35min later again results in a fetch. | 574 // The third call to NTPOpened 35min later again results in a fetch. |
| 618 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 575 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 619 } | 576 } |
| 620 | 577 |
| 621 ChangeStatusOfUnderlyingProvider( | 578 ActivateUnderlyingProvider(); |
| 622 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 623 | 579 |
| 624 scheduling_provider_->OnNTPOpened(); | 580 scheduling_provider_->OnNTPOpened(); |
| 625 signal_fetch_done.Run(Status::Success()); | 581 signal_fetch_done.Run(Status::Success()); |
| 626 | 582 |
| 627 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER which uses a 2h time | 583 // UserClassifier defaults to UserClass::ACTIVE_NTP_USER which uses a 2h time |
| 628 // interval by default for soft backgroudn fetches on ntp open events. | 584 // interval by default for soft backgroudn fetches on ntp open events. |
| 629 | 585 |
| 630 // Open NTP again after 20min. This time no fetch is executed. | 586 // Open NTP again after 20min. This time no fetch is executed. |
| 631 test_clock_->Advance(base::TimeDelta::FromMinutes(20)); | 587 test_clock_->Advance(base::TimeDelta::FromMinutes(20)); |
| 632 scheduling_provider_->OnNTPOpened(); | 588 scheduling_provider_->OnNTPOpened(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 651 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 607 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 652 // The first call to NTPOpened results in a fetch. | 608 // The first call to NTPOpened results in a fetch. |
| 653 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) | 609 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 654 .WillOnce(SaveArg<0>(&signal_fetch_done)); | 610 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 655 // Rescheduling after a succesful fetch. | 611 // Rescheduling after a succesful fetch. |
| 656 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); | 612 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 657 // The third call to NTPOpened 35min later again results in a fetch. | 613 // The third call to NTPOpened 35min later again results in a fetch. |
| 658 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); | 614 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 659 } | 615 } |
| 660 | 616 |
| 661 ChangeStatusOfUnderlyingProvider( | 617 ActivateUnderlyingProvider(); |
| 662 RemoteSuggestionsProvider::ProviderStatus::ACTIVE); | |
| 663 | 618 |
| 664 scheduling_provider_->OnNTPOpened(); | 619 scheduling_provider_->OnNTPOpened(); |
| 665 signal_fetch_done.Run(Status::Success()); | 620 signal_fetch_done.Run(Status::Success()); |
| 666 | 621 |
| 667 // Open NTP again after 20min. No fetch request is issues since the 30 min | 622 // Open NTP again after 20min. No fetch request is issues since the 30 min |
| 668 // time interval has not passed yet. | 623 // time interval has not passed yet. |
| 669 test_clock_->Advance(base::TimeDelta::FromMinutes(20)); | 624 test_clock_->Advance(base::TimeDelta::FromMinutes(20)); |
| 670 scheduling_provider_->OnNTPOpened(); | 625 scheduling_provider_->OnNTPOpened(); |
| 671 | 626 |
| 672 // Open NTP again after 15min (35min since first opened) | 627 // Open NTP again after 15min (35min since first opened) |
| 673 test_clock_->Advance(base::TimeDelta::FromMinutes(15)); | 628 test_clock_->Advance(base::TimeDelta::FromMinutes(15)); |
| 674 scheduling_provider_->OnNTPOpened(); | 629 scheduling_provider_->OnNTPOpened(); |
| 675 } | 630 } |
| 676 | 631 |
| 632 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 633 ShouldBlockFetchingForSomeTimeAfterHistoryCleared) { |
| 634 // First enable the scheduler -- this will trigger the persistent scheduling. |
| 635 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 636 ActivateUnderlyingProvider(); |
| 637 // Clear the history. |
| 638 scheduling_provider_->OnHistoryCleared(); |
| 639 |
| 640 // A trigger after 15 minutes is ignored. |
| 641 test_clock_->Advance(base::TimeDelta::FromMinutes(15)); |
| 642 scheduling_provider_->OnBrowserForegrounded(); |
| 643 |
| 644 // A trigger after another 16 minutes is performed (more than 30m after |
| 645 // clearing the history). |
| 646 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 647 test_clock_->Advance(base::TimeDelta::FromMinutes(16)); |
| 648 scheduling_provider_->OnBrowserForegrounded(); |
| 649 } |
| 650 |
| 651 TEST_F(SchedulingRemoteSuggestionsProviderTest, |
| 652 ShouldAllowImmediateFetchingAfterSuggestionsCleared) { |
| 653 RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
| 654 |
| 655 // First enable the scheduler -- this will trigger the persistent scheduling. |
| 656 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 657 ActivateUnderlyingProvider(); |
| 658 |
| 659 // The first trigger results in a fetch. |
| 660 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
| 661 .WillOnce(SaveArg<0>(&signal_fetch_done)); |
| 662 scheduling_provider_->OnBrowserForegrounded(); |
| 663 // Make the fetch successful -- this results in rescheduling. |
| 664 EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
| 665 signal_fetch_done.Run(Status::Success()); |
| 666 |
| 667 // Clear the suggestions. |
| 668 scheduling_provider_->OnSuggestionsCleared(); |
| 669 // Another trigger right after results in a fetch again. |
| 670 EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
| 671 scheduling_provider_->OnBrowserForegrounded(); |
| 672 } |
| 673 |
| 677 } // namespace ntp_snippets | 674 } // namespace ntp_snippets |
| OLD | NEW |