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

Unified Diff: components/ntp_snippets/remote/remote_suggestions_provider_impl_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/remote_suggestions_provider_impl_unittest.cc
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
index 84349c862695b8acc838a367cc09420ede36a22a..b30ba6e041e06faee0a5e23181c213a188c91053 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
@@ -39,6 +39,7 @@
#include "components/ntp_snippets/remote/remote_suggestion.h"
#include "components/ntp_snippets/remote/remote_suggestions_database.h"
#include "components/ntp_snippets/remote/remote_suggestions_fetcher.h"
+#include "components/ntp_snippets/remote/remote_suggestions_scheduler.h"
#include "components/ntp_snippets/remote/test_utils.h"
#include "components/ntp_snippets/user_classifier.h"
#include "components/prefs/testing_pref_service.h"
@@ -362,6 +363,19 @@ class FakeImageDecoder : public image_fetcher::ImageDecoder {
gfx::Image decoded_image_;
};
+class MockScheduler : public RemoteSuggestionsScheduler {
+ public:
+ MOCK_METHOD0(OnProviderActivated, void());
+ MOCK_METHOD0(OnProviderDeactivated, void());
+ MOCK_METHOD0(OnSuggestionsCleared, void());
+ MOCK_METHOD0(OnHistoryCleared, void());
+ MOCK_METHOD0(OnBrowserForegrounded, void());
+ MOCK_METHOD0(OnBrowserColdStart, void());
+ MOCK_METHOD0(OnNTPOpened, void());
+ MOCK_METHOD0(OnPersistentSchedulerWakeUp, void());
+ MOCK_METHOD0(RescheduleFetching, void());
+};
+
} // namespace
class RemoteSuggestionsProviderImplTest : public ::testing::Test {
@@ -691,7 +705,6 @@ TEST_F(RemoteSuggestionsProviderImplTest, AddRemoteCategoriesToCategoryRanker) {
.AddCategory({GetSuggestionN(1)}, /*remote_category_id=*/13)
.AddCategory({GetSuggestionN(2)}, /*remote_category_id=*/12)
.Build();
- SetUpFetchResponse(json_str);
{
// The order of categories is determined by the order in which they are
// added. Thus, the latter is tested here.
@@ -704,6 +717,7 @@ TEST_F(RemoteSuggestionsProviderImplTest, AddRemoteCategoriesToCategoryRanker) {
AppendCategoryIfNecessary(Category::FromRemoteCategory(12)));
}
auto service = MakeSuggestionsProvider(/*set_empty_response=*/false);
+ LoadFromJSONString(service.get(), json_str);
}
TEST_F(RemoteSuggestionsProviderImplTest, PersistCategoryInfos) {
@@ -759,8 +773,8 @@ TEST_F(RemoteSuggestionsProviderImplTest, PersistRemoteCategoryOrder) {
.AddCategory({GetSuggestionN(1)}, /*remote_category_id=*/13)
.AddCategory({GetSuggestionN(2)}, /*remote_category_id=*/12)
.Build();
- SetUpFetchResponse(json_str);
auto service = MakeSuggestionsProvider(/*set_empty_response=*/false);
+ LoadFromJSONString(service.get(), json_str);
// We manually recreate the service to simulate Chrome restart and enforce a
// mock ranker. The response is cleared to ensure that the order is not
@@ -1466,26 +1480,6 @@ TEST_F(RemoteSuggestionsProviderImplTest, LogNumArticlesHistogram) {
EXPECT_THAT(
tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"),
ElementsAre(base::Bucket(/*min=*/1, /*count=*/1)));
-
- // There is only a single, dismissed suggestion in the database, so recreating
- // the service will require us to re-fetch.
- tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 4);
- ResetSuggestionsProvider(&service, /*set_empty_response=*/true);
- EXPECT_EQ(observer().StatusForCategory(articles_category()),
- CategoryStatus::AVAILABLE);
- tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 5);
- EXPECT_THAT(
- tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"),
- ElementsAre(base::Bucket(/*min=*/1, /*count=*/2)));
-
- // But if there's a non-dismissed suggestion in the database, recreating it
- // shouldn't trigger a fetch.
- LoadFromJSONString(
- service.get(),
- GetTestJson({GetSuggestionWithUrl("http://not-dismissed.com")}));
- tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 6);
- ResetSuggestionsProvider(&service, /*set_empty_response=*/true);
- tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 6);
}
TEST_F(RemoteSuggestionsProviderImplTest, DismissShouldRespectAllKnownUrls) {
@@ -1633,31 +1627,6 @@ TEST_F(RemoteSuggestionsProviderImplTest,
Eq(CategoryStatus::AVAILABLE));
}
-TEST_F(RemoteSuggestionsProviderImplTest,
- SuggestionsFetchedOnSignInAndSignOut) {
- auto service = MakeSuggestionsProvider();
- EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()),
- IsEmpty());
-
- // |MakeSuggestionsProvider()| creates a service where user is signed in
- // already,
- // so we start by signing out.
- SetUpFetchResponse(GetTestJson({GetSuggestionN(1)}));
- service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN,
- RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT);
- base::RunLoop().RunUntilIdle();
- EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()),
- SizeIs(1));
-
- // Sign in to check a transition from signed out to signed in.
- SetUpFetchResponse(GetTestJson({GetSuggestionN(1), GetSuggestionN(2)}));
- service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT,
- RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN);
- base::RunLoop().RunUntilIdle();
- EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()),
- SizeIs(2));
-}
-
TEST_F(RemoteSuggestionsProviderImplTest, ShouldClearOrphanedImagesOnRestart) {
auto service = MakeSuggestionsProvider();
@@ -1738,86 +1707,97 @@ TEST_F(RemoteSuggestionsProviderImplTest,
// scheduler refactoring is done (crbug.com/672434).
}
-TEST_F(RemoteSuggestionsProviderImplTest, CallsProviderStatusCallbackIfReady) {
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerIfInited) {
// Initiate the service so that it is already READY.
auto service = MakeSuggestionsProvider();
-
- StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>>
- status_callback;
- // The callback should be called on registering.
- EXPECT_CALL(status_callback,
- Call(RemoteSuggestionsProvider::ProviderStatus::ACTIVE));
- service->SetProviderStatusCallback(
- base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>(
- base::Bind(&MockFunction<void(
- RemoteSuggestionsProvider::ProviderStatus)>::Call,
- base::Unretained(&status_callback))));
+ StrictMock<MockScheduler> scheduler;
+ // The scheduler should be notified of activation of the provider.
+ EXPECT_CALL(scheduler, OnProviderActivated());
+ service->SetRemoteSuggestionsScheduler(&scheduler);
}
-TEST_F(RemoteSuggestionsProviderImplTest,
- DoesNotCallProviderStatusCallbackIfNotInited) {
+TEST_F(RemoteSuggestionsProviderImplTest, DoesNotCallSchedulerIfNotInited) {
auto service = MakeSuggestionsProviderWithoutInitialization();
-
- StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>>
- status_callback;
+ StrictMock<MockScheduler> scheduler;
// The provider is not initialized yet, no callback should be called on
// registering.
- service->SetProviderStatusCallback(
- base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>(
- base::Bind(&MockFunction<void(
- RemoteSuggestionsProvider::ProviderStatus)>::Call,
- base::Unretained(&status_callback))));
+ service->SetRemoteSuggestionsScheduler(&scheduler);
}
-TEST_F(RemoteSuggestionsProviderImplTest,
- CallsProviderStatusCallbackWhenReady) {
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenReady) {
auto service = MakeSuggestionsProviderWithoutInitialization();
- StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>>
- status_callback;
- service->SetProviderStatusCallback(
- base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>(
- base::Bind(&MockFunction<void(
- RemoteSuggestionsProvider::ProviderStatus)>::Call,
- base::Unretained(&status_callback))));
+ StrictMock<MockScheduler> scheduler;
+ // The provider is not initialized yet, no callback should be called yet.
+ service->SetRemoteSuggestionsScheduler(&scheduler);
// Should be called when becoming ready.
- EXPECT_CALL(status_callback,
- Call(RemoteSuggestionsProvider::ProviderStatus::ACTIVE));
+ EXPECT_CALL(scheduler, OnProviderActivated());
WaitForSuggestionsProviderInitialization(service.get(),
/*set_empty_response=*/true);
}
-TEST_F(RemoteSuggestionsProviderImplTest, CallsProviderStatusCallbackOnError) {
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerOnError) {
auto service = MakeSuggestionsProviderWithoutInitialization();
- StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>>
- status_callback;
- service->SetProviderStatusCallback(
- base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>(
- base::Bind(&MockFunction<void(
- RemoteSuggestionsProvider::ProviderStatus)>::Call,
- base::Unretained(&status_callback))));
+ StrictMock<MockScheduler> scheduler;
+ // The provider is not initialized yet, no callback should be called yet.
+ service->SetRemoteSuggestionsScheduler(&scheduler);
// Should be called on error.
- EXPECT_CALL(status_callback,
- Call(RemoteSuggestionsProvider::ProviderStatus::INACTIVE));
+ EXPECT_CALL(scheduler, OnProviderDeactivated());
service->EnterState(RemoteSuggestionsProviderImpl::State::ERROR_OCCURRED);
}
-TEST_F(RemoteSuggestionsProviderImplTest,
- CallsProviderStatusCallbackWhenDisabled) {
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenDisabled) {
auto service = MakeSuggestionsProviderWithoutInitialization();
- StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>>
- status_callback;
- service->SetProviderStatusCallback(
- base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>(
- base::Bind(&MockFunction<void(
- RemoteSuggestionsProvider::ProviderStatus)>::Call,
- base::Unretained(&status_callback))));
+ StrictMock<MockScheduler> scheduler;
+ // The provider is not initialized yet, no callback should be called yet.
+ service->SetRemoteSuggestionsScheduler(&scheduler);
// Should be called when becoming disabled.
- EXPECT_CALL(status_callback,
- Call(RemoteSuggestionsProvider::ProviderStatus::INACTIVE));
+ EXPECT_CALL(scheduler, OnProviderDeactivated());
+ EXPECT_CALL(scheduler, OnSuggestionsCleared());
service->EnterState(RemoteSuggestionsProviderImpl::State::DISABLED);
}
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenHistoryCleared) {
+ // Initiate the service so that it is already READY.
+ auto service = MakeSuggestionsProvider();
+ StrictMock<MockScheduler> scheduler;
+ // The scheduler should be notified of activation of the provider.
+ EXPECT_CALL(scheduler, OnProviderActivated());
+ // The scheduler should be notified of clearing the history.
+ EXPECT_CALL(scheduler, OnHistoryCleared());
+ service->SetRemoteSuggestionsScheduler(&scheduler);
+ service->ClearHistory(GetDefaultCreationTime(), GetDefaultExpirationTime(),
+ base::Callback<bool(const GURL& url)>());
+}
+
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenSignedIn) {
+ // Initiate the service so that it is already READY.
+ auto service = MakeSuggestionsProvider();
+ StrictMock<MockScheduler> scheduler;
+ // The scheduler should be notified of activation of the provider.
+ EXPECT_CALL(scheduler, OnProviderActivated());
+ // The scheduler should be notified of clearing the history.
+ EXPECT_CALL(scheduler, OnSuggestionsCleared());
+
+ service->SetRemoteSuggestionsScheduler(&scheduler);
+ service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN,
+ RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT);
+}
+
+TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenSignedOut) {
+ // Initiate the service so that it is already READY.
+ auto service = MakeSuggestionsProvider();
+ StrictMock<MockScheduler> scheduler;
+ // The scheduler should be notified of activation of the provider.
+ EXPECT_CALL(scheduler, OnProviderActivated());
+ // The scheduler should be notified of clearing the history.
+ EXPECT_CALL(scheduler, OnSuggestionsCleared());
+
+ service->SetRemoteSuggestionsScheduler(&scheduler);
+ service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT,
+ RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN);
+}
+
} // namespace ntp_snippets

Powered by Google App Engine
This is Rietveld 408576698