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

Side by Side 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, 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 unified diff | Download patch
OLDNEW
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
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
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(OnProviderDeactivated, 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
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
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
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
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
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, OnProviderDeactivated());
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, OnProviderDeactivated());
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698