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

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

Issue 2774663002: [Remote suggestions] Refactor the scheduler (Closed)
Patch Set: Marc's nits #2 Created 3 years, 9 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
deleted file mode 100644
index cd5500d24926c402d5bc7e7a18b155c41e1e8047..0000000000000000000000000000000000000000
--- a/components/ntp_snippets/remote/scheduling_remote_suggestions_provider_unittest.cc
+++ /dev/null
@@ -1,846 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/ntp_snippets/remote/scheduling_remote_suggestions_provider.h"
-
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/test/simple_test_clock.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/clock.h"
-#include "base/time/default_clock.h"
-#include "base/time/time.h"
-#include "components/ntp_snippets/features.h"
-#include "components/ntp_snippets/ntp_snippets_constants.h"
-#include "components/ntp_snippets/pref_names.h"
-#include "components/ntp_snippets/remote/persistent_scheduler.h"
-#include "components/ntp_snippets/remote/remote_suggestions_provider.h"
-#include "components/ntp_snippets/remote/test_utils.h"
-#include "components/ntp_snippets/status.h"
-#include "components/ntp_snippets/user_classifier.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/testing_pref_service.h"
-#include "components/variations/variations_params_manager.h"
-#include "components/web_resource/web_resource_pref_names.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::ElementsAre;
-using testing::Eq;
-using testing::Field;
-using testing::InSequence;
-using testing::Invoke;
-using testing::IsEmpty;
-using testing::Mock;
-using testing::MockFunction;
-using testing::Not;
-using testing::Return;
-using testing::SaveArg;
-using testing::SaveArgPointee;
-using testing::SizeIs;
-using testing::StartsWith;
-using testing::StrictMock;
-using testing::WithArgs;
-using testing::_;
-
-namespace ntp_snippets {
-
-class RemoteSuggestionsFetcher;
-
-namespace {
-
-class MockPersistentScheduler : public PersistentScheduler {
- public:
- MOCK_METHOD2(Schedule,
- bool(base::TimeDelta period_wifi,
- base::TimeDelta period_fallback));
- MOCK_METHOD0(Unschedule, bool());
-};
-
-// TODO(jkrcal): Move into its own library to reuse in other unit-tests?
-class MockRemoteSuggestionsProvider : public RemoteSuggestionsProvider {
- public:
- 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 RefetchInTheBackground(
- std::unique_ptr<RemoteSuggestionsProvider::FetchStatusCallback> callback)
- override {
- RefetchInTheBackground(*callback);
- }
- MOCK_METHOD1(RefetchInTheBackground,
- void(RemoteSuggestionsProvider::FetchStatusCallback));
-
- MOCK_CONST_METHOD0(suggestions_fetcher_for_debugging,
- const RemoteSuggestionsFetcher*());
-
- MOCK_METHOD1(GetCategoryStatus, CategoryStatus(Category));
- MOCK_METHOD1(GetCategoryInfo, CategoryInfo(Category));
- MOCK_METHOD3(ClearHistory,
- void(base::Time begin,
- base::Time end,
- const base::Callback<bool(const GURL& url)>& filter));
- MOCK_METHOD3(Fetch,
- void(const Category&,
- const std::set<std::string>&,
- const FetchDoneCallback&));
- MOCK_METHOD0(ReloadSuggestions, void());
- MOCK_METHOD1(ClearCachedSuggestions, void(Category));
- MOCK_METHOD1(ClearDismissedSuggestionsForDebugging, void(Category));
- MOCK_METHOD1(DismissSuggestion, void(const ContentSuggestion::ID&));
- MOCK_METHOD2(FetchSuggestionImage,
- void(const ContentSuggestion::ID&, const ImageFetchedCallback&));
- MOCK_METHOD2(GetDismissedSuggestionsForDebugging,
- void(Category, const DismissedSuggestionsCallback&));
- MOCK_METHOD0(OnSignInStateChanged, void());
-};
-
-} // namespace
-
-class SchedulingRemoteSuggestionsProviderTest : public ::testing::Test {
- public:
- SchedulingRemoteSuggestionsProviderTest()
- : // For the test we enabled all trigger types.
- default_variation_params_{{"scheduler_trigger_types",
- "persistent_scheduler_wake_up,ntp_opened,"
- "browser_foregrounded,browser_cold_start"}},
- params_manager_(ntp_snippets::kStudyName,
- default_variation_params_,
- {kArticleSuggestionsFeature.name}),
- user_classifier_(/*pref_service=*/nullptr,
- base::MakeUnique<base::DefaultClock>()) {
- SchedulingRemoteSuggestionsProvider::RegisterProfilePrefs(
- utils_.pref_service()->registry());
- RequestThrottler::RegisterProfilePrefs(utils_.pref_service()->registry());
- // TODO(jkrcal) Create a static function in EulaAcceptedNotifier that
- // registers this pref and replace the call in browser_process_impl.cc & in
- // eula_accepted_notifier_unittest.cc with the new static function.
- local_state_.registry()->RegisterBooleanPref(::prefs::kEulaAccepted, false);
- ResetProvider();
- }
-
- void ResetProvider() {
- auto underlying_provider =
- base::MakeUnique<StrictMock<MockRemoteSuggestionsProvider>>(
- /*observer=*/nullptr);
- underlying_provider_ = underlying_provider.get();
-
- auto test_clock = base::MakeUnique<base::SimpleTestClock>();
- test_clock_ = test_clock.get();
- test_clock_->SetNow(base::Time::Now());
-
- scheduling_provider_ =
- base::MakeUnique<SchedulingRemoteSuggestionsProvider>(
- /*observer=*/nullptr, std::move(underlying_provider),
- &persistent_scheduler_, &user_classifier_, utils_.pref_service(),
- &local_state_, std::move(test_clock));
- }
-
- void SetVariationParameter(const std::string& param_name,
- const std::string& param_value) {
- std::map<std::string, std::string> params = default_variation_params_;
- params[param_name] = param_value;
-
- params_manager_.ClearAllVariationParams();
- params_manager_.SetVariationParamsWithFeatureAssociations(
- ntp_snippets::kStudyName, params,
- {ntp_snippets::kArticleSuggestionsFeature.name});
- }
-
- bool IsEulaNotifierAvailable() {
- // Create() returns a unique_ptr, so this is no leak.
- return web_resource::EulaAcceptedNotifier::Create(&local_state_) != nullptr;
- }
-
- void SetEulaAcceptedPref() {
- local_state_.SetBoolean(::prefs::kEulaAccepted, true);
- }
-
- // GMock cannot deal with move-only types. We need to pass the vector to the
- // mock function as const ref using this wrapper callback.
- void FetchDoneWrapper(
- MockFunction<void(Status status_code,
- const std::vector<ContentSuggestion>& suggestions)>*
- fetch_done,
- Status status_code,
- std::vector<ContentSuggestion> suggestions) {
- fetch_done->Call(status_code, suggestions);
- }
-
- protected:
- std::map<std::string, std::string> default_variation_params_;
- variations::testing::VariationParamsManager params_manager_;
-
- void ActivateUnderlyingProvider() {
- SetEulaAcceptedPref();
- scheduling_provider()->OnProviderActivated();
- }
-
- void InactivateUnderlyingProvider() {
- scheduling_provider()->OnProviderDeactivated();
- }
-
- MockPersistentScheduler* persistent_scheduler() {
- return &persistent_scheduler_;
- }
- base::SimpleTestClock* test_clock() { return test_clock_; }
- MockRemoteSuggestionsProvider* underlying_provider() {
- return underlying_provider_;
- }
- SchedulingRemoteSuggestionsProvider* scheduling_provider() {
- return scheduling_provider_.get();
- }
-
- private:
- test::RemoteSuggestionsTestUtils utils_;
- UserClassifier user_classifier_;
- TestingPrefServiceSimple local_state_;
- StrictMock<MockPersistentScheduler> persistent_scheduler_;
- base::SimpleTestClock* test_clock_;
- StrictMock<MockRemoteSuggestionsProvider>* underlying_provider_;
- std::unique_ptr<SchedulingRemoteSuggestionsProvider> scheduling_provider_;
-
- DISALLOW_COPY_AND_ASSIGN(SchedulingRemoteSuggestionsProviderTest);
-};
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldIgnoreSignalsWhenNotEnabled) {
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- scheduling_provider()->OnNTPOpened();
- scheduling_provider()->OnBrowserForegrounded();
- scheduling_provider()->OnBrowserColdStart();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldIgnoreEulaStateOnPlatformsWhereNotAvaiable) {
- // Only run this tests on platforms that don't support Eula.
- if (IsEulaNotifierAvailable()) {
- return;
- }
-
- // Activating the provider should schedule the persistent background fetches.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- scheduling_provider()->OnProviderActivated();
-
- // Verify fetches get triggered.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldIgnoreSignalsWhenEulaNotAccepted) {
- // Only run this tests on platforms supporting Eula.
- if (!IsEulaNotifierAvailable()) {
- return;
- }
- // Activating the provider should schedule the persistent background fetches.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- scheduling_provider()->OnProviderActivated();
-
- // All signals are ignored because of Eula not being accepted.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- scheduling_provider()->OnNTPOpened();
- scheduling_provider()->OnBrowserForegrounded();
- scheduling_provider()->OnBrowserColdStart();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchWhenEulaGetsAccepted) {
- // Only run this tests on platforms supporting Eula.
- if (!IsEulaNotifierAvailable()) {
- return;
- }
- // Activating the provider should schedule the persistent background fetches.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- scheduling_provider()->OnProviderActivated();
-
- // Make one (ignored) call to make sure we are interested in eula state.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-
- // Accepting Eula afterwards results in a background fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- SetEulaAcceptedPref();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldIgnoreSignalsWhenDisabledByParam) {
- // First set an empty list of allowed trigger types.
- SetVariationParameter("scheduler_trigger_types", "-");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- scheduling_provider()->OnNTPOpened();
- scheduling_provider()->OnBrowserForegrounded();
- scheduling_provider()->OnBrowserColdStart();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldHandleEmptyParamForTriggerTypes) {
- // First set an empty param for allowed trigger types -> should result in the
- // default list.
- SetVariationParameter("scheduler_trigger_types", "");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- // For instance, persistent scheduler wake up should be enabled by default.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldHandleIncorrentParamForTriggerTypes) {
- // First set an invalid list of allowed trigger types.
- SetVariationParameter("scheduler_trigger_types", "ntp_opened,foo;");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- // For instance, persistent scheduler wake up should be enabled by default.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchOnPersistentSchedulerWakeUp) {
- // First set only this type to be allowed.
- SetVariationParameter("scheduler_trigger_types",
- "*persistent_scheduler()wake_up");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchOnPersistentSchedulerWakeUpRepeated) {
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- {
- InSequence s;
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- }
- // First enable the scheduler -- calling Schedule() for the first time.
- ActivateUnderlyingProvider();
- // Make the first persistent fetch successful -- calling Schedule() again.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- signal_fetch_done.Run(Status::Success());
- // Make the second fetch.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldNotTriggerBackgroundFetchIfAlreadyInProgess) {
- {
- InSequence s;
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- // RefetchInTheBackground is not called after the second trigger.
- }
- // First enable the scheduler -- calling Schedule() for the first time.
- ActivateUnderlyingProvider();
- // Make the first persistent fetch never finish.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- // Make the second fetch.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchOnNTPOpenedForTheFirstTime) {
- // First set only this type to be allowed.
- SetVariationParameter("scheduler_trigger_types", "ntp_opened");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnNTPOpened();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchOnBrowserForegroundedForTheFirstTime) {
- // First set only this type to be allowed.
- SetVariationParameter("scheduler_trigger_types", "browser_foregrounded");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnBrowserForegrounded();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchOnBrowserColdStartForTheFirstTime) {
- // First set only this type to be allowed.
- SetVariationParameter("scheduler_trigger_types", "browser_cold_start");
- ResetProvider();
-
- // Then enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- scheduling_provider()->OnBrowserColdStart();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldNotFetchOnNTPOpenedAfterSuccessfulSoftFetch) {
- // First enable the scheduler; the second Schedule is called after the
- // successful fetch.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- ActivateUnderlyingProvider();
-
- // Make the first soft fetch successful.
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- scheduling_provider()->OnNTPOpened();
- signal_fetch_done.Run(Status::Success());
- // The second call is ignored if it happens right after the first one.
- scheduling_provider()->OnNTPOpened();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldNotFetchOnNTPOpenedAfterSuccessfulPersistentFetch) {
- // First enable the scheduler; the second Schedule is called after the
- // successful fetch.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- ActivateUnderlyingProvider();
-
- // Make the first persistent fetch successful.
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- signal_fetch_done.Run(Status::Success());
- // The second call is ignored if it happens right after the first one.
- scheduling_provider()->OnNTPOpened();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldNotFetchOnNTPOpenedAfterFailedSoftFetch) {
- // First enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- // Make the first soft fetch failed.
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- scheduling_provider()->OnNTPOpened();
- signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, ""));
-
- // The second call is ignored if it happens right after the first one.
- scheduling_provider()->OnNTPOpened();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldNotFetchOnNTPOpenedAfterFailedPersistentFetch) {
- // First enable the scheduler.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- // Make the first persistent fetch failed.
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, ""));
-
- // The second call is ignored if it happens right after the first one.
- scheduling_provider()->OnNTPOpened();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldFetchAgainOnBrowserForgroundLaterAgain) {
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- {
- InSequence s;
- // Initial scheduling after being enabled.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // The first call to NTPOpened results in a fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- // Rescheduling after a succesful fetch.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // The second call to NTPOpened 2hrs later again results in a fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- }
-
- // First enable the scheduler.
- ActivateUnderlyingProvider();
- // Make the first soft fetch successful.
- scheduling_provider()->OnBrowserForegrounded();
- signal_fetch_done.Run(Status::Success());
- // Open NTP again after 2hrs.
- test_clock()->Advance(base::TimeDelta::FromHours(2));
- scheduling_provider()->OnBrowserForegrounded();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldRescheduleOnRescheduleFetching) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- scheduling_provider()->RescheduleFetching();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnActivation) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldUnscheduleOnLaterInactivation) {
- {
- InSequence s;
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- EXPECT_CALL(*persistent_scheduler(), Unschedule());
- }
- ActivateUnderlyingProvider();
- InactivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldScheduleOnLaterActivation) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // There is no schedule yet, so inactivation does not trigger unschedule.
- InactivateUnderlyingProvider();
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldRescheduleAfterSuccessfulFetch) {
- // First reschedule on becoming active.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- ActivateUnderlyingProvider();
-
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
-
- // Trigger a fetch.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- // Second reschedule after a successful fetch.
- signal_fetch_done.Run(Status::Success());
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldNotRescheduleAfterFailedFetch) {
- // Only reschedule on becoming active.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
-
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
-
- // Trigger a fetch.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- // No furter reschedule after a failure.
- signal_fetch_done.Run(Status(StatusCode::PERMANENT_ERROR, ""));
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldScheduleOnlyOnce) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- ActivateUnderlyingProvider();
- // No further call to Schedule on a second status callback.
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest, ShouldUnscheduleOnlyOnce) {
- {
- InSequence s;
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- EXPECT_CALL(*persistent_scheduler(), Unschedule());
- }
- // First schedule so that later we really unschedule.
- ActivateUnderlyingProvider();
- InactivateUnderlyingProvider();
- // No further call to Unschedule on second status callback.
- InactivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ReschedulesWhenWifiParamChanges) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- 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.
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ReschedulesWhenFallbackParamChanges) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- ActivateUnderlyingProvider();
-
- // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
- // null. Change the fallback interval for this class.
- SetVariationParameter("fetching_interval_hours-fallback-active_ntp_user",
- "1.5");
-
- // Schedule() should get called for the second time after params have changed.
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ReschedulesWhenOnUsageEventParamChanges) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- ActivateUnderlyingProvider();
-
- // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
- // null. Change the on usage interval for this class.
- SetVariationParameter("soft_fetching_interval_hours-active-active_ntp_user",
- "1.5");
-
- // Schedule() should get called for the second time after params have changed.
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ReschedulesWhenOnNtpOpenedParamChanges) {
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(2);
- ActivateUnderlyingProvider();
-
- // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
- // null. Change the fallback interval for this class.
- SetVariationParameter("soft_on_ntp_opened_interval_hours-active_ntp_user",
- "1.5");
-
- // Schedule() should get called for the second time after params have changed.
- ActivateUnderlyingProvider();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- FetchIntervalForNtpOpenedTrigger) {
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- {
- InSequence s;
- // Initial scheduling after being enabled.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // The first call to NTPOpened results in a fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- // Rescheduling after a succesful fetch.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // The third call to NTPOpened 35min later again results in a fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- }
-
- ActivateUnderlyingProvider();
-
- scheduling_provider()->OnNTPOpened();
- signal_fetch_done.Run(Status::Success());
-
- // UserClassifier defaults to UserClass::ACTIVE_NTP_USER which uses a 2h time
- // interval by default for soft backgroudn fetches on ntp open events.
-
- // Open NTP again after 20min. This time no fetch is executed.
- test_clock()->Advance(base::TimeDelta::FromMinutes(20));
- scheduling_provider()->OnNTPOpened();
-
- // Open NTP again after 101min (121min since first opened). Since the default
- // time interval has passed refetch again.
- test_clock()->Advance(base::TimeDelta::FromMinutes(101));
- scheduling_provider()->OnNTPOpened();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- OverrideFetchIntervalForNtpOpenedTrigger) {
- // UserClassifier defaults to UserClass::ACTIVE_NTP_USER if PrefService is
- // null. Change the on usage interval for this class from 2h to 30min.
- SetVariationParameter("soft_on_ntp_opened_interval_hours-active_ntp_user",
- "0.5");
-
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- {
- InSequence s;
- // Initial scheduling after being enabled.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // The first call to NTPOpened results in a fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .WillOnce(SaveArg<0>(&signal_fetch_done));
- // Rescheduling after a succesful fetch.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _));
- // The third call to NTPOpened 35min later again results in a fetch.
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_));
- }
-
- ActivateUnderlyingProvider();
-
- scheduling_provider()->OnNTPOpened();
- signal_fetch_done.Run(Status::Success());
-
- // Open NTP again after 20min. No fetch request is issues since the 30 min
- // time interval has not passed yet.
- test_clock()->Advance(base::TimeDelta::FromMinutes(20));
- scheduling_provider()->OnNTPOpened();
-
- // Open NTP again after 15min (35min since first opened)
- test_clock()->Advance(base::TimeDelta::FromMinutes(15));
- 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,
- ShouldImmediatelyFetchAfterSuggestionsCleared) {
- 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 - results in an immediate fetch.
- EXPECT_CALL(*underlying_provider(), ReloadSuggestions());
- scheduling_provider()->OnSuggestionsCleared();
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldThrottleInteractiveRequests) {
- // Change the quota for interactive requests ("active NTP user" is the default
- // class in tests).
- SetVariationParameter("interactive_quota_SuggestionFetcherActiveNTPUser",
- "10");
- ResetProvider();
-
- Category category = Category::FromKnownCategory(KnownCategories::ARTICLES);
- std::set<std::string> known_suggestions;
-
- // Both Fetch(..) and ReloadSuggestions() consume the same quota. As long as
- // the quota suffices, the call gets through.
- EXPECT_CALL(*underlying_provider(), ReloadSuggestions()).Times(5);
- for (int x = 0; x < 5; ++x) {
- scheduling_provider()->ReloadSuggestions();
- }
-
- // Expect underlying provider being called and store the callback to inform
- // scheduling provider.
- FetchDoneCallback signal_fetch_done_from_underlying_provider;
- EXPECT_CALL(*underlying_provider(), Fetch(_, _, _))
- .Times(5)
- .WillRepeatedly(SaveArg<2>(&signal_fetch_done_from_underlying_provider));
- // Expect scheduling provider to pass the information through.
- MockFunction<void(Status status_code,
- const std::vector<ContentSuggestion>& suggestions)>
- fetch_done_from_scheduling_provider;
- EXPECT_CALL(fetch_done_from_scheduling_provider,
- Call(Field(&Status::code, StatusCode::SUCCESS), _))
- .Times(5);
- // Scheduling is not activated, each successful fetch results in Unschedule().
- EXPECT_CALL(*persistent_scheduler(), Unschedule()).Times(5);
- for (int x = 0; x < 5; ++x) {
- scheduling_provider()->Fetch(
- category, known_suggestions,
- base::Bind(&SchedulingRemoteSuggestionsProviderTest::FetchDoneWrapper,
- base::Unretained(this),
- &fetch_done_from_scheduling_provider));
- // Inform scheduling provider the fetc is successful (with no suggestions).
- signal_fetch_done_from_underlying_provider.Run(
- Status::Success(), std::vector<ContentSuggestion>{});
- }
-
- // When the quota expires, it is blocked by the scheduling provider, directly
- // calling the callback.
- EXPECT_CALL(fetch_done_from_scheduling_provider,
- Call(Field(&Status::code, StatusCode::TEMPORARY_ERROR), _));
- scheduling_provider()->ReloadSuggestions();
- scheduling_provider()->Fetch(
- category, known_suggestions,
- base::Bind(&SchedulingRemoteSuggestionsProviderTest::FetchDoneWrapper,
- base::Unretained(this), &fetch_done_from_scheduling_provider));
-}
-
-TEST_F(SchedulingRemoteSuggestionsProviderTest,
- ShouldThrottleNonInteractiveRequests) {
- // Change the quota for interactive requests ("active NTP user" is the default
- // class in tests).
- SetVariationParameter("quota_SuggestionFetcherActiveNTPUser", "5");
- ResetProvider();
-
- // One scheduling on start, 5 times after successful fetches.
- EXPECT_CALL(*persistent_scheduler(), Schedule(_, _)).Times(6);
-
- // First enable the scheduler -- this will trigger the persistent scheduling.
- ActivateUnderlyingProvider();
-
- // As long as the quota suffices, the call gets through.
- RemoteSuggestionsProvider::FetchStatusCallback signal_fetch_done;
- EXPECT_CALL(*underlying_provider(), RefetchInTheBackground(_))
- .Times(5)
- .WillRepeatedly(SaveArg<0>(&signal_fetch_done));
- for (int x = 0; x < 5; ++x) {
- scheduling_provider()->OnPersistentSchedulerWakeUp();
- signal_fetch_done.Run(Status::Success());
- }
-
- // For the 6th time, it is blocked by the scheduling provider.
- scheduling_provider()->OnPersistentSchedulerWakeUp();
-}
-
-} // namespace ntp_snippets

Powered by Google App Engine
This is Rietveld 408576698