Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(503)

Unified Diff: components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc

Issue 2702223004: [Remote suggestions] Move all decisions to fetch to the scheduler (Closed)
Patch Set: Fixing an embarassing bug :) Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698