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