OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/ntp_snippets/remote/remote_suggestions_provider_impl.h" | 5 #include "components/ntp_snippets/remote/remote_suggestions_provider_impl.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "components/ntp_snippets/category_rankers/constant_category_ranker.h" | 32 #include "components/ntp_snippets/category_rankers/constant_category_ranker.h" |
33 #include "components/ntp_snippets/category_rankers/mock_category_ranker.h" | 33 #include "components/ntp_snippets/category_rankers/mock_category_ranker.h" |
34 #include "components/ntp_snippets/fake_content_suggestions_provider_observer.h" | 34 #include "components/ntp_snippets/fake_content_suggestions_provider_observer.h" |
35 #include "components/ntp_snippets/features.h" | 35 #include "components/ntp_snippets/features.h" |
36 #include "components/ntp_snippets/ntp_snippets_constants.h" | 36 #include "components/ntp_snippets/ntp_snippets_constants.h" |
37 #include "components/ntp_snippets/pref_names.h" | 37 #include "components/ntp_snippets/pref_names.h" |
38 #include "components/ntp_snippets/remote/persistent_scheduler.h" | 38 #include "components/ntp_snippets/remote/persistent_scheduler.h" |
39 #include "components/ntp_snippets/remote/remote_suggestion.h" | 39 #include "components/ntp_snippets/remote/remote_suggestion.h" |
40 #include "components/ntp_snippets/remote/remote_suggestions_database.h" | 40 #include "components/ntp_snippets/remote/remote_suggestions_database.h" |
41 #include "components/ntp_snippets/remote/remote_suggestions_fetcher.h" | 41 #include "components/ntp_snippets/remote/remote_suggestions_fetcher.h" |
| 42 #include "components/ntp_snippets/remote/remote_suggestions_scheduler.h" |
42 #include "components/ntp_snippets/remote/test_utils.h" | 43 #include "components/ntp_snippets/remote/test_utils.h" |
43 #include "components/ntp_snippets/user_classifier.h" | 44 #include "components/ntp_snippets/user_classifier.h" |
44 #include "components/prefs/testing_pref_service.h" | 45 #include "components/prefs/testing_pref_service.h" |
45 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" | 46 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" |
46 #include "components/signin/core/browser/fake_signin_manager.h" | 47 #include "components/signin/core/browser/fake_signin_manager.h" |
47 #include "components/variations/variations_params_manager.h" | 48 #include "components/variations/variations_params_manager.h" |
48 #include "net/url_request/test_url_fetcher_factory.h" | 49 #include "net/url_request/test_url_fetcher_factory.h" |
49 #include "net/url_request/url_request_test_util.h" | 50 #include "net/url_request/url_request_test_util.h" |
50 #include "testing/gmock/include/gmock/gmock.h" | 51 #include "testing/gmock/include/gmock/gmock.h" |
51 #include "testing/gtest/include/gtest/gtest.h" | 52 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 const image_fetcher::ImageDecodedCallback& callback) override { | 356 const image_fetcher::ImageDecodedCallback& callback) override { |
356 callback.Run(decoded_image_); | 357 callback.Run(decoded_image_); |
357 } | 358 } |
358 | 359 |
359 void SetDecodedImage(const gfx::Image& image) { decoded_image_ = image; } | 360 void SetDecodedImage(const gfx::Image& image) { decoded_image_ = image; } |
360 | 361 |
361 private: | 362 private: |
362 gfx::Image decoded_image_; | 363 gfx::Image decoded_image_; |
363 }; | 364 }; |
364 | 365 |
| 366 class MockScheduler : public RemoteSuggestionsScheduler { |
| 367 public: |
| 368 MOCK_METHOD0(OnProviderActivated, void()); |
| 369 MOCK_METHOD0(OnProviderInactivated, void()); |
| 370 MOCK_METHOD0(OnSuggestionsCleared, void()); |
| 371 MOCK_METHOD0(OnHistoryCleared, void()); |
| 372 MOCK_METHOD0(OnBrowserForegrounded, void()); |
| 373 MOCK_METHOD0(OnBrowserColdStart, void()); |
| 374 MOCK_METHOD0(OnNTPOpened, void()); |
| 375 MOCK_METHOD0(OnPersistentSchedulerWakeUp, void()); |
| 376 MOCK_METHOD0(RescheduleFetching, void()); |
| 377 }; |
| 378 |
365 } // namespace | 379 } // namespace |
366 | 380 |
367 class RemoteSuggestionsProviderImplTest : public ::testing::Test { | 381 class RemoteSuggestionsProviderImplTest : public ::testing::Test { |
368 public: | 382 public: |
369 RemoteSuggestionsProviderImplTest() | 383 RemoteSuggestionsProviderImplTest() |
370 : params_manager_(ntp_snippets::kStudyName, | 384 : params_manager_(ntp_snippets::kStudyName, |
371 {{"content_suggestions_backend", | 385 {{"content_suggestions_backend", |
372 kTestContentSuggestionsServerEndpoint}}, | 386 kTestContentSuggestionsServerEndpoint}}, |
373 {ntp_snippets::kArticleSuggestionsFeature.name}), | 387 {ntp_snippets::kArticleSuggestionsFeature.name}), |
374 fake_url_fetcher_factory_( | 388 fake_url_fetcher_factory_( |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 TEST_F(RemoteSuggestionsProviderImplTest, AddRemoteCategoriesToCategoryRanker) { | 698 TEST_F(RemoteSuggestionsProviderImplTest, AddRemoteCategoriesToCategoryRanker) { |
685 auto mock_ranker = base::MakeUnique<MockCategoryRanker>(); | 699 auto mock_ranker = base::MakeUnique<MockCategoryRanker>(); |
686 MockCategoryRanker* raw_mock_ranker = mock_ranker.get(); | 700 MockCategoryRanker* raw_mock_ranker = mock_ranker.get(); |
687 SetCategoryRanker(std::move(mock_ranker)); | 701 SetCategoryRanker(std::move(mock_ranker)); |
688 std::string json_str = | 702 std::string json_str = |
689 MultiCategoryJsonBuilder() | 703 MultiCategoryJsonBuilder() |
690 .AddCategory({GetSuggestionN(0)}, /*remote_category_id=*/11) | 704 .AddCategory({GetSuggestionN(0)}, /*remote_category_id=*/11) |
691 .AddCategory({GetSuggestionN(1)}, /*remote_category_id=*/13) | 705 .AddCategory({GetSuggestionN(1)}, /*remote_category_id=*/13) |
692 .AddCategory({GetSuggestionN(2)}, /*remote_category_id=*/12) | 706 .AddCategory({GetSuggestionN(2)}, /*remote_category_id=*/12) |
693 .Build(); | 707 .Build(); |
694 SetUpFetchResponse(json_str); | |
695 { | 708 { |
696 // The order of categories is determined by the order in which they are | 709 // The order of categories is determined by the order in which they are |
697 // added. Thus, the latter is tested here. | 710 // added. Thus, the latter is tested here. |
698 InSequence s; | 711 InSequence s; |
699 EXPECT_CALL(*raw_mock_ranker, | 712 EXPECT_CALL(*raw_mock_ranker, |
700 AppendCategoryIfNecessary(Category::FromRemoteCategory(11))); | 713 AppendCategoryIfNecessary(Category::FromRemoteCategory(11))); |
701 EXPECT_CALL(*raw_mock_ranker, | 714 EXPECT_CALL(*raw_mock_ranker, |
702 AppendCategoryIfNecessary(Category::FromRemoteCategory(13))); | 715 AppendCategoryIfNecessary(Category::FromRemoteCategory(13))); |
703 EXPECT_CALL(*raw_mock_ranker, | 716 EXPECT_CALL(*raw_mock_ranker, |
704 AppendCategoryIfNecessary(Category::FromRemoteCategory(12))); | 717 AppendCategoryIfNecessary(Category::FromRemoteCategory(12))); |
705 } | 718 } |
706 auto service = MakeSuggestionsProvider(/*set_empty_response=*/false); | 719 auto service = MakeSuggestionsProvider(/*set_empty_response=*/false); |
| 720 LoadFromJSONString(service.get(), json_str); |
707 } | 721 } |
708 | 722 |
709 TEST_F(RemoteSuggestionsProviderImplTest, PersistCategoryInfos) { | 723 TEST_F(RemoteSuggestionsProviderImplTest, PersistCategoryInfos) { |
710 auto service = MakeSuggestionsProvider(); | 724 auto service = MakeSuggestionsProvider(); |
711 // TODO(vitaliii): Use |articles_category()| instead of constant ID below. | 725 // TODO(vitaliii): Use |articles_category()| instead of constant ID below. |
712 std::string json_str = | 726 std::string json_str = |
713 MultiCategoryJsonBuilder() | 727 MultiCategoryJsonBuilder() |
714 .AddCategoryWithCustomTitle( | 728 .AddCategoryWithCustomTitle( |
715 {GetSuggestionN(0)}, /*remote_category_id=*/1, "Articles for You") | 729 {GetSuggestionN(0)}, /*remote_category_id=*/1, "Articles for You") |
716 .AddCategoryWithCustomTitle({GetSuggestionN(1)}, | 730 .AddCategoryWithCustomTitle({GetSuggestionN(1)}, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 } | 766 } |
753 | 767 |
754 TEST_F(RemoteSuggestionsProviderImplTest, PersistRemoteCategoryOrder) { | 768 TEST_F(RemoteSuggestionsProviderImplTest, PersistRemoteCategoryOrder) { |
755 // We create a service with a normal ranker to store the order. | 769 // We create a service with a normal ranker to store the order. |
756 std::string json_str = | 770 std::string json_str = |
757 MultiCategoryJsonBuilder() | 771 MultiCategoryJsonBuilder() |
758 .AddCategory({GetSuggestionN(0)}, /*remote_category_id=*/11) | 772 .AddCategory({GetSuggestionN(0)}, /*remote_category_id=*/11) |
759 .AddCategory({GetSuggestionN(1)}, /*remote_category_id=*/13) | 773 .AddCategory({GetSuggestionN(1)}, /*remote_category_id=*/13) |
760 .AddCategory({GetSuggestionN(2)}, /*remote_category_id=*/12) | 774 .AddCategory({GetSuggestionN(2)}, /*remote_category_id=*/12) |
761 .Build(); | 775 .Build(); |
762 SetUpFetchResponse(json_str); | |
763 auto service = MakeSuggestionsProvider(/*set_empty_response=*/false); | 776 auto service = MakeSuggestionsProvider(/*set_empty_response=*/false); |
| 777 LoadFromJSONString(service.get(), json_str); |
764 | 778 |
765 // We manually recreate the service to simulate Chrome restart and enforce a | 779 // We manually recreate the service to simulate Chrome restart and enforce a |
766 // mock ranker. The response is cleared to ensure that the order is not | 780 // mock ranker. The response is cleared to ensure that the order is not |
767 // fetched. | 781 // fetched. |
768 SetUpFetchResponse(""); | 782 SetUpFetchResponse(""); |
769 auto mock_ranker = base::MakeUnique<MockCategoryRanker>(); | 783 auto mock_ranker = base::MakeUnique<MockCategoryRanker>(); |
770 MockCategoryRanker* raw_mock_ranker = mock_ranker.get(); | 784 MockCategoryRanker* raw_mock_ranker = mock_ranker.get(); |
771 SetCategoryRanker(std::move(mock_ranker)); | 785 SetCategoryRanker(std::move(mock_ranker)); |
772 { | 786 { |
773 // The order of categories is determined by the order in which they are | 787 // The order of categories is determined by the order in which they are |
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1459 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"), | 1473 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticles"), |
1460 ElementsAre(base::Bucket(/*min=*/0, /*count=*/3), | 1474 ElementsAre(base::Bucket(/*min=*/0, /*count=*/3), |
1461 base::Bucket(/*min=*/1, /*count=*/2))); | 1475 base::Bucket(/*min=*/1, /*count=*/2))); |
1462 // Dismissed suggestions shouldn't influence NumArticlesFetched. | 1476 // Dismissed suggestions shouldn't influence NumArticlesFetched. |
1463 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"), | 1477 EXPECT_THAT(tester.GetAllSamples("NewTabPage.Snippets.NumArticlesFetched"), |
1464 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1), | 1478 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1), |
1465 base::Bucket(/*min=*/1, /*count=*/3))); | 1479 base::Bucket(/*min=*/1, /*count=*/3))); |
1466 EXPECT_THAT( | 1480 EXPECT_THAT( |
1467 tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"), | 1481 tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"), |
1468 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); | 1482 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); |
1469 | |
1470 // There is only a single, dismissed suggestion in the database, so recreating | |
1471 // the service will require us to re-fetch. | |
1472 tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 4); | |
1473 ResetSuggestionsProvider(&service, /*set_empty_response=*/true); | |
1474 EXPECT_EQ(observer().StatusForCategory(articles_category()), | |
1475 CategoryStatus::AVAILABLE); | |
1476 tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 5); | |
1477 EXPECT_THAT( | |
1478 tester.GetAllSamples("NewTabPage.Snippets.NumArticlesZeroDueToDiscarded"), | |
1479 ElementsAre(base::Bucket(/*min=*/1, /*count=*/2))); | |
1480 | |
1481 // But if there's a non-dismissed suggestion in the database, recreating it | |
1482 // shouldn't trigger a fetch. | |
1483 LoadFromJSONString( | |
1484 service.get(), | |
1485 GetTestJson({GetSuggestionWithUrl("http://not-dismissed.com")})); | |
1486 tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 6); | |
1487 ResetSuggestionsProvider(&service, /*set_empty_response=*/true); | |
1488 tester.ExpectTotalCount("NewTabPage.Snippets.NumArticlesFetched", 6); | |
1489 } | 1483 } |
1490 | 1484 |
1491 TEST_F(RemoteSuggestionsProviderImplTest, DismissShouldRespectAllKnownUrls) { | 1485 TEST_F(RemoteSuggestionsProviderImplTest, DismissShouldRespectAllKnownUrls) { |
1492 auto service = MakeSuggestionsProvider(); | 1486 auto service = MakeSuggestionsProvider(); |
1493 | 1487 |
1494 const base::Time creation = GetDefaultCreationTime(); | 1488 const base::Time creation = GetDefaultCreationTime(); |
1495 const base::Time expiry = GetDefaultExpirationTime(); | 1489 const base::Time expiry = GetDefaultExpirationTime(); |
1496 const std::vector<std::string> source_urls = { | 1490 const std::vector<std::string> source_urls = { |
1497 "http://mashable.com/2016/05/11/stolen", | 1491 "http://mashable.com/2016/05/11/stolen", |
1498 "http://www.aol.com/article/2016/05/stolen-doggie"}; | 1492 "http://www.aol.com/article/2016/05/stolen-doggie"}; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 | 1620 |
1627 ASSERT_THAT(observer().StatusForCategory(articles_category()), | 1621 ASSERT_THAT(observer().StatusForCategory(articles_category()), |
1628 Eq(CategoryStatus::AVAILABLE)); | 1622 Eq(CategoryStatus::AVAILABLE)); |
1629 service->ClearHistory(base::Time::UnixEpoch(), base::Time::Max(), | 1623 service->ClearHistory(base::Time::UnixEpoch(), base::Time::Max(), |
1630 base::Callback<bool(const GURL& url)>()); | 1624 base::Callback<bool(const GURL& url)>()); |
1631 | 1625 |
1632 EXPECT_THAT(observer().StatusForCategory(articles_category()), | 1626 EXPECT_THAT(observer().StatusForCategory(articles_category()), |
1633 Eq(CategoryStatus::AVAILABLE)); | 1627 Eq(CategoryStatus::AVAILABLE)); |
1634 } | 1628 } |
1635 | 1629 |
1636 TEST_F(RemoteSuggestionsProviderImplTest, | |
1637 SuggestionsFetchedOnSignInAndSignOut) { | |
1638 auto service = MakeSuggestionsProvider(); | |
1639 EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()), | |
1640 IsEmpty()); | |
1641 | |
1642 // |MakeSuggestionsProvider()| creates a service where user is signed in | |
1643 // already, | |
1644 // so we start by signing out. | |
1645 SetUpFetchResponse(GetTestJson({GetSuggestionN(1)})); | |
1646 service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN, | |
1647 RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT); | |
1648 base::RunLoop().RunUntilIdle(); | |
1649 EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()), | |
1650 SizeIs(1)); | |
1651 | |
1652 // Sign in to check a transition from signed out to signed in. | |
1653 SetUpFetchResponse(GetTestJson({GetSuggestionN(1), GetSuggestionN(2)})); | |
1654 service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, | |
1655 RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN); | |
1656 base::RunLoop().RunUntilIdle(); | |
1657 EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()), | |
1658 SizeIs(2)); | |
1659 } | |
1660 | |
1661 TEST_F(RemoteSuggestionsProviderImplTest, ShouldClearOrphanedImagesOnRestart) { | 1630 TEST_F(RemoteSuggestionsProviderImplTest, ShouldClearOrphanedImagesOnRestart) { |
1662 auto service = MakeSuggestionsProvider(); | 1631 auto service = MakeSuggestionsProvider(); |
1663 | 1632 |
1664 LoadFromJSONString(service.get(), GetTestJson({GetSuggestion()})); | 1633 LoadFromJSONString(service.get(), GetTestJson({GetSuggestion()})); |
1665 ServeImageCallback cb = | 1634 ServeImageCallback cb = |
1666 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); | 1635 base::Bind(&ServeOneByOneImage, &service->GetImageFetcherForTesting()); |
1667 | 1636 |
1668 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) | 1637 EXPECT_CALL(*image_fetcher(), StartOrQueueNetworkRequest(_, _, _)) |
1669 .WillOnce(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); | 1638 .WillOnce(WithArgs<0, 2>(Invoke(&cb, &ServeImageCallback::Run))); |
1670 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); | 1639 image_decoder()->SetDecodedImage(gfx::test::CreateImage(1, 1)); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1731 service->RefetchInTheBackground(/*callback=*/nullptr); | 1700 service->RefetchInTheBackground(/*callback=*/nullptr); |
1732 base::RunLoop().RunUntilIdle(); | 1701 base::RunLoop().RunUntilIdle(); |
1733 // TODO(jkrcal): Move together with the pref storage into the scheduler. | 1702 // TODO(jkrcal): Move together with the pref storage into the scheduler. |
1734 EXPECT_EQ( | 1703 EXPECT_EQ( |
1735 simple_test_clock_ptr->Now().ToInternalValue(), | 1704 simple_test_clock_ptr->Now().ToInternalValue(), |
1736 pref_service()->GetInt64(prefs::kLastSuccessfulBackgroundFetchTime)); | 1705 pref_service()->GetInt64(prefs::kLastSuccessfulBackgroundFetchTime)); |
1737 // TODO(markusheintz): Add a test that simulates a browser restart once the | 1706 // TODO(markusheintz): Add a test that simulates a browser restart once the |
1738 // scheduler refactoring is done (crbug.com/672434). | 1707 // scheduler refactoring is done (crbug.com/672434). |
1739 } | 1708 } |
1740 | 1709 |
1741 TEST_F(RemoteSuggestionsProviderImplTest, CallsProviderStatusCallbackIfReady) { | 1710 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerIfInited) { |
1742 // Initiate the service so that it is already READY. | 1711 // Initiate the service so that it is already READY. |
1743 auto service = MakeSuggestionsProvider(); | 1712 auto service = MakeSuggestionsProvider(); |
1744 | 1713 StrictMock<MockScheduler> scheduler; |
1745 StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>> | 1714 // The scheduler should be notified of activation of the provider. |
1746 status_callback; | 1715 EXPECT_CALL(scheduler, OnProviderActivated()); |
1747 // The callback should be called on registering. | 1716 service->SetRemoteSuggestionsScheduler(&scheduler); |
1748 EXPECT_CALL(status_callback, | |
1749 Call(RemoteSuggestionsProvider::ProviderStatus::ACTIVE)); | |
1750 service->SetProviderStatusCallback( | |
1751 base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>( | |
1752 base::Bind(&MockFunction<void( | |
1753 RemoteSuggestionsProvider::ProviderStatus)>::Call, | |
1754 base::Unretained(&status_callback)))); | |
1755 } | 1717 } |
1756 | 1718 |
1757 TEST_F(RemoteSuggestionsProviderImplTest, | 1719 TEST_F(RemoteSuggestionsProviderImplTest, DoesNotCallSchedulerIfNotInited) { |
1758 DoesNotCallProviderStatusCallbackIfNotInited) { | |
1759 auto service = MakeSuggestionsProviderWithoutInitialization(); | 1720 auto service = MakeSuggestionsProviderWithoutInitialization(); |
1760 | 1721 StrictMock<MockScheduler> scheduler; |
1761 StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>> | |
1762 status_callback; | |
1763 // The provider is not initialized yet, no callback should be called on | 1722 // The provider is not initialized yet, no callback should be called on |
1764 // registering. | 1723 // registering. |
1765 service->SetProviderStatusCallback( | 1724 service->SetRemoteSuggestionsScheduler(&scheduler); |
1766 base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>( | |
1767 base::Bind(&MockFunction<void( | |
1768 RemoteSuggestionsProvider::ProviderStatus)>::Call, | |
1769 base::Unretained(&status_callback)))); | |
1770 } | 1725 } |
1771 | 1726 |
1772 TEST_F(RemoteSuggestionsProviderImplTest, | 1727 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenReady) { |
1773 CallsProviderStatusCallbackWhenReady) { | |
1774 auto service = MakeSuggestionsProviderWithoutInitialization(); | 1728 auto service = MakeSuggestionsProviderWithoutInitialization(); |
1775 StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>> | 1729 StrictMock<MockScheduler> scheduler; |
1776 status_callback; | 1730 // The provider is not initialized yet, no callback should be called yet. |
1777 service->SetProviderStatusCallback( | 1731 service->SetRemoteSuggestionsScheduler(&scheduler); |
1778 base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>( | |
1779 base::Bind(&MockFunction<void( | |
1780 RemoteSuggestionsProvider::ProviderStatus)>::Call, | |
1781 base::Unretained(&status_callback)))); | |
1782 | 1732 |
1783 // Should be called when becoming ready. | 1733 // Should be called when becoming ready. |
1784 EXPECT_CALL(status_callback, | 1734 EXPECT_CALL(scheduler, OnProviderActivated()); |
1785 Call(RemoteSuggestionsProvider::ProviderStatus::ACTIVE)); | |
1786 WaitForSuggestionsProviderInitialization(service.get(), | 1735 WaitForSuggestionsProviderInitialization(service.get(), |
1787 /*set_empty_response=*/true); | 1736 /*set_empty_response=*/true); |
1788 } | 1737 } |
1789 | 1738 |
1790 TEST_F(RemoteSuggestionsProviderImplTest, CallsProviderStatusCallbackOnError) { | 1739 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerOnError) { |
1791 auto service = MakeSuggestionsProviderWithoutInitialization(); | 1740 auto service = MakeSuggestionsProviderWithoutInitialization(); |
1792 StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>> | 1741 StrictMock<MockScheduler> scheduler; |
1793 status_callback; | 1742 // The provider is not initialized yet, no callback should be called yet. |
1794 service->SetProviderStatusCallback( | 1743 service->SetRemoteSuggestionsScheduler(&scheduler); |
1795 base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>( | |
1796 base::Bind(&MockFunction<void( | |
1797 RemoteSuggestionsProvider::ProviderStatus)>::Call, | |
1798 base::Unretained(&status_callback)))); | |
1799 | 1744 |
1800 // Should be called on error. | 1745 // Should be called on error. |
1801 EXPECT_CALL(status_callback, | 1746 EXPECT_CALL(scheduler, OnProviderInactivated()); |
1802 Call(RemoteSuggestionsProvider::ProviderStatus::INACTIVE)); | |
1803 service->EnterState(RemoteSuggestionsProviderImpl::State::ERROR_OCCURRED); | 1747 service->EnterState(RemoteSuggestionsProviderImpl::State::ERROR_OCCURRED); |
1804 } | 1748 } |
1805 | 1749 |
1806 TEST_F(RemoteSuggestionsProviderImplTest, | 1750 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenDisabled) { |
1807 CallsProviderStatusCallbackWhenDisabled) { | |
1808 auto service = MakeSuggestionsProviderWithoutInitialization(); | 1751 auto service = MakeSuggestionsProviderWithoutInitialization(); |
1809 StrictMock<MockFunction<void(RemoteSuggestionsProvider::ProviderStatus)>> | 1752 StrictMock<MockScheduler> scheduler; |
1810 status_callback; | 1753 // The provider is not initialized yet, no callback should be called yet. |
1811 service->SetProviderStatusCallback( | 1754 service->SetRemoteSuggestionsScheduler(&scheduler); |
1812 base::MakeUnique<RemoteSuggestionsProvider::ProviderStatusCallback>( | |
1813 base::Bind(&MockFunction<void( | |
1814 RemoteSuggestionsProvider::ProviderStatus)>::Call, | |
1815 base::Unretained(&status_callback)))); | |
1816 | 1755 |
1817 // Should be called when becoming disabled. | 1756 // Should be called when becoming disabled. |
1818 EXPECT_CALL(status_callback, | 1757 EXPECT_CALL(scheduler, OnProviderInactivated()); |
1819 Call(RemoteSuggestionsProvider::ProviderStatus::INACTIVE)); | 1758 EXPECT_CALL(scheduler, OnSuggestionsCleared()); |
1820 service->EnterState(RemoteSuggestionsProviderImpl::State::DISABLED); | 1759 service->EnterState(RemoteSuggestionsProviderImpl::State::DISABLED); |
1821 } | 1760 } |
1822 | 1761 |
| 1762 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenHistoryCleared) { |
| 1763 // Initiate the service so that it is already READY. |
| 1764 auto service = MakeSuggestionsProvider(); |
| 1765 StrictMock<MockScheduler> scheduler; |
| 1766 // The scheduler should be notified of activation of the provider. |
| 1767 EXPECT_CALL(scheduler, OnProviderActivated()); |
| 1768 // The scheduler should be notified of clearing the history. |
| 1769 EXPECT_CALL(scheduler, OnHistoryCleared()); |
| 1770 service->SetRemoteSuggestionsScheduler(&scheduler); |
| 1771 service->ClearHistory(GetDefaultCreationTime(), GetDefaultExpirationTime(), |
| 1772 base::Callback<bool(const GURL& url)>()); |
| 1773 } |
| 1774 |
| 1775 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenSignedIn) { |
| 1776 // Initiate the service so that it is already READY. |
| 1777 auto service = MakeSuggestionsProvider(); |
| 1778 StrictMock<MockScheduler> scheduler; |
| 1779 // The scheduler should be notified of activation of the provider. |
| 1780 EXPECT_CALL(scheduler, OnProviderActivated()); |
| 1781 // The scheduler should be notified of clearing the history. |
| 1782 EXPECT_CALL(scheduler, OnSuggestionsCleared()); |
| 1783 |
| 1784 service->SetRemoteSuggestionsScheduler(&scheduler); |
| 1785 service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN, |
| 1786 RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT); |
| 1787 } |
| 1788 |
| 1789 TEST_F(RemoteSuggestionsProviderImplTest, CallsSchedulerWhenSignedOut) { |
| 1790 // Initiate the service so that it is already READY. |
| 1791 auto service = MakeSuggestionsProvider(); |
| 1792 StrictMock<MockScheduler> scheduler; |
| 1793 // The scheduler should be notified of activation of the provider. |
| 1794 EXPECT_CALL(scheduler, OnProviderActivated()); |
| 1795 // The scheduler should be notified of clearing the history. |
| 1796 EXPECT_CALL(scheduler, OnSuggestionsCleared()); |
| 1797 |
| 1798 service->SetRemoteSuggestionsScheduler(&scheduler); |
| 1799 service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_OUT, |
| 1800 RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN); |
| 1801 } |
| 1802 |
1823 } // namespace ntp_snippets | 1803 } // namespace ntp_snippets |
OLD | NEW |