Index: components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc |
diff --git a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc |
index 0acb45cd640d47245145ae045a1a632d4fd392ad..bad71569fb693ce62a5ddae880c70fa15656eef6 100644 |
--- a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc |
+++ b/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc |
@@ -69,20 +69,14 @@ class MockRemoteSuggestionsProvider : public RemoteSuggestionsProvider { |
MockRemoteSuggestionsProvider(Observer* observer) |
: RemoteSuggestionsProvider(observer) {} |
+ MOCK_METHOD1(SetRemoteSuggestionsScheduler, |
+ void(RemoteSuggestionsScheduler*)); |
+ |
// Move-only params are not supported by GMock. We want to mock out |
// RefetchInTheBackground() which takes a unique_ptr<>. Instead, we add a new |
// mock function which takes a copy of the callback and override the |
// RemoteSuggestionsProvider's method to forward the call into the new mock |
// function. |
- void SetProviderStatusCallback( |
- std::unique_ptr<RemoteSuggestionsProvider::ProviderStatusCallback> |
- callback) override { |
- SetProviderStatusCallback(*callback); |
- } |
- MOCK_METHOD1(SetProviderStatusCallback, |
- void(RemoteSuggestionsProvider::ProviderStatusCallback)); |
- |
- // Move-only params are not supported by GMock (same work-around as above). |
void RefetchInTheBackground( |
std::unique_ptr<RemoteSuggestionsProvider::FetchStatusCallback> callback) |
override { |
@@ -141,11 +135,6 @@ class SchedulingRemoteSuggestionsProviderTest |
/*observer=*/nullptr); |
underlying_provider_ = underlying_provider.get(); |
- // SchedulingRemoteSuggestionsProvider calls SetProviderStatusCallback(_) to |
- // stay in the loop of status changes. |
- EXPECT_CALL(*underlying_provider_, SetProviderStatusCallback(_)) |
- .WillOnce(SaveArg<0>(&provider_status_callback_)); |
- |
auto test_clock = base::MakeUnique<base::SimpleTestClock>(); |
test_clock_ = test_clock.get(); |
test_clock_->SetNow(base::Time::Now()); |
@@ -174,12 +163,14 @@ class SchedulingRemoteSuggestionsProviderTest |
StrictMock<MockPersistentScheduler> persistent_scheduler_; |
StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_; |
std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_; |
- RemoteSuggestionsProvider::ProviderStatusCallback provider_status_callback_; |
base::SimpleTestClock* test_clock_; |
- void ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus new_status) { |
- provider_status_callback_.Run(new_status); |
+ void ActivateUnderlyingProvider() { |
+ scheduling_provider_->OnProviderActivated(); |
+ } |
+ |
+ void InactivateUnderlyingProvider() { |
+ scheduling_provider_->OnProviderDeactivated(); |
} |
private: |
@@ -205,8 +196,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
scheduling_provider_->OnPersistentSchedulerWakeUp(); |
scheduling_provider_->OnNTPOpened(); |
@@ -223,8 +213,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// For instance, persistent scheduler wake up should be enabled by default. |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
@@ -239,8 +228,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// For instance, persistent scheduler wake up should be enabled by default. |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
@@ -256,8 +244,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
scheduling_provider_->OnPersistentSchedulerWakeUp(); |
@@ -275,8 +262,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
} |
// First enable the scheduler -- calling Schedule() for the first time. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first persistent fetch successful -- calling Schedule() again. |
scheduling_provider_->OnPersistentSchedulerWakeUp(); |
signal_fetch_done.Run(Status::Success()); |
@@ -293,8 +279,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// RefetchInTheBackground is not called after the second trigger. |
} |
// First enable the scheduler -- calling Schedule() for the first time. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first persistent fetch never finish. |
scheduling_provider_->OnPersistentSchedulerWakeUp(); |
// Make the second fetch. |
@@ -309,8 +294,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
scheduling_provider_->OnNTPOpened(); |
@@ -324,8 +308,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
scheduling_provider_->OnBrowserForegrounded(); |
@@ -339,8 +322,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// Then enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
scheduling_provider_->OnBrowserColdStart(); |
@@ -351,8 +333,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// First enable the scheduler; the second Schedule is called after the |
// successful fetch. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first soft fetch successful. |
RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
@@ -369,8 +350,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
// First enable the scheduler; the second Schedule is called after the |
// successful fetch. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first persistent fetch successful. |
RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
@@ -386,8 +366,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ShouldNotFetchOnNTPOpenedAfterFailedSoftFetch) { |
// First enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first soft fetch failed. |
RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
@@ -404,8 +383,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ShouldNotFetchOnNTPOpenedAfterFailedPersistentFetch) { |
// First enable the scheduler. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first persistent fetch failed. |
RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
@@ -435,8 +413,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
} |
// First enable the scheduler. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// Make the first soft fetch successful. |
scheduling_provider_->OnBrowserForegrounded(); |
signal_fetch_done.Run(Status::Success()); |
@@ -453,8 +430,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
@@ -464,28 +440,23 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
EXPECT_CALL(persistent_scheduler_, Unschedule()); |
} |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::INACTIVE); |
+ ActivateUnderlyingProvider(); |
+ InactivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ShouldScheduleOnLaterActivation) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
// There is no schedule yet, so inactivation does not trigger unschedule. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::INACTIVE); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ InactivateUnderlyingProvider(); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ShouldRescheduleAfterSuccessfulFetch) { |
// First reschedule on becoming active. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
@@ -501,8 +472,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ShouldNotRescheduleAfterFailedFetch) { |
// Only reschedule on becoming active. |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
@@ -516,11 +486,9 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnlyOnce) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// No further call to Schedule on a second status callback. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) { |
@@ -530,35 +498,29 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) { |
EXPECT_CALL(persistent_scheduler_, Unschedule()); |
} |
// First schedule so that later we really unschedule. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::INACTIVE); |
+ ActivateUnderlyingProvider(); |
+ InactivateUnderlyingProvider(); |
// No further call to Unschedule on second status callback. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::INACTIVE); |
+ InactivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ReschedulesWhenWifiParamChanges) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
// null. Change the wifi interval for this class. |
SetVariationParameter("fetching_interval_hours-wifi-active_ntp_user", "1.5"); |
// Schedule() should get called for the second time after params have changed. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ReschedulesWhenFallbackParamChanges) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
// null. Change the fallback interval for this class. |
@@ -566,15 +528,13 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
"1.5"); |
// Schedule() should get called for the second time after params have changed. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ReschedulesWhenOnUsageEventParamChanges) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
// null. Change the on usage interval for this class. |
@@ -582,15 +542,13 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
"1.5"); |
// Schedule() should get called for the second time after params have changed. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
ReschedulesWhenOnNtpOpenedParamChanges) { |
EXPECT_CALL(persistent_scheduler_, Schedule(_, _)).Times(2); |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
// UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is |
// null. Change the fallback interval for this class. |
@@ -598,8 +556,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
"1.5"); |
// Schedule() should get called for the second time after params have changed. |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
} |
TEST_F(SchedulingRemoteSuggestionsProviderTest, |
@@ -618,8 +575,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
} |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
scheduling_provider_->OnNTPOpened(); |
signal_fetch_done.Run(Status::Success()); |
@@ -658,8 +614,7 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
} |
- ChangeStatusOfUnderlyingProvider( |
- RemoteSuggestionsProvider::ProviderStatus::ACTIVE); |
+ ActivateUnderlyingProvider(); |
scheduling_provider_->OnNTPOpened(); |
signal_fetch_done.Run(Status::Success()); |
@@ -674,4 +629,46 @@ TEST_F(SchedulingRemoteSuggestionsProviderTest, |
scheduling_provider_->OnNTPOpened(); |
} |
+TEST_F(SchedulingRemoteSuggestionsProviderTest, |
+ ShouldBlockFetchingForSomeTimeAfterHistoryCleared) { |
+ // First enable the scheduler -- this will trigger the persistent scheduling. |
+ EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
+ ActivateUnderlyingProvider(); |
+ // Clear the history. |
+ scheduling_provider_->OnHistoryCleared(); |
+ |
+ // A trigger after 15 minutes is ignored. |
+ test_clock_->Advance(base::TimeDelta::FromMinutes(15)); |
+ scheduling_provider_->OnBrowserForegrounded(); |
+ |
+ // A trigger after another 16 minutes is performed (more than 30m after |
+ // clearing the history). |
+ EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
+ test_clock_->Advance(base::TimeDelta::FromMinutes(16)); |
+ scheduling_provider_->OnBrowserForegrounded(); |
+} |
+ |
+TEST_F(SchedulingRemoteSuggestionsProviderTest, |
+ ShouldAllowImmediateFetchingAfterSuggestionsCleared) { |
+ RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done; |
+ |
+ // First enable the scheduler -- this will trigger the persistent scheduling. |
+ EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
+ ActivateUnderlyingProvider(); |
+ |
+ // The first trigger results in a fetch. |
+ EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)) |
+ .WillOnce(SaveArg<0>(&signal_fetch_done)); |
+ scheduling_provider_->OnBrowserForegrounded(); |
+ // Make the fetch successful -- this results in rescheduling. |
+ EXPECT_CALL(persistent_scheduler_, Schedule(_, _)); |
+ signal_fetch_done.Run(Status::Success()); |
+ |
+ // Clear the suggestions. |
+ scheduling_provider_->OnSuggestionsCleared(); |
+ // Another trigger right after results in a fetch again. |
+ EXPECT_CALL(*underlying_provider_, RefetchInTheBackground(_)); |
+ scheduling_provider_->OnBrowserForegrounded(); |
+} |
+ |
} // namespace ntp_snippets |