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 |