| Index: components/ntp_snippets/ntp_snippets_service_unittest.cc
 | 
| diff --git a/components/ntp_snippets/ntp_snippets_service_unittest.cc b/components/ntp_snippets/ntp_snippets_service_unittest.cc
 | 
| index fac43c445ef9a5c64085345bbd062289c8f7e571..22678af60f9eacd5c33344f8bce2a1fa12e55ffb 100644
 | 
| --- a/components/ntp_snippets/ntp_snippets_service_unittest.cc
 | 
| +++ b/components/ntp_snippets/ntp_snippets_service_unittest.cc
 | 
| @@ -27,13 +27,11 @@
 | 
|  #include "components/ntp_snippets/ntp_snippets_database.h"
 | 
|  #include "components/ntp_snippets/ntp_snippets_fetcher.h"
 | 
|  #include "components/ntp_snippets/ntp_snippets_scheduler.h"
 | 
| +#include "components/ntp_snippets/ntp_snippets_test_utils.h"
 | 
|  #include "components/ntp_snippets/switches.h"
 | 
|  #include "components/prefs/testing_pref_service.h"
 | 
| -#include "components/signin/core/browser/account_tracker_service.h"
 | 
|  #include "components/signin/core/browser/fake_profile_oauth2_token_service.h"
 | 
|  #include "components/signin/core/browser/fake_signin_manager.h"
 | 
| -#include "components/signin/core/browser/test_signin_client.h"
 | 
| -#include "components/sync_driver/fake_sync_service.h"
 | 
|  #include "google_apis/google_api_keys.h"
 | 
|  #include "net/url_request/test_url_fetcher_factory.h"
 | 
|  #include "net/url_request/url_request_test_util.h"
 | 
| @@ -207,9 +205,9 @@ class FailingFakeURLFetcherFactory : public net::URLFetcherFactory {
 | 
|    std::unique_ptr<net::URLFetcher> CreateURLFetcher(
 | 
|        int id, const GURL& url, net::URLFetcher::RequestType request_type,
 | 
|        net::URLFetcherDelegate* d) override {
 | 
| -    return base::WrapUnique(new net::FakeURLFetcher(
 | 
| +    return base::MakeUnique<net::FakeURLFetcher>(
 | 
|          url, d, /*response_data=*/std::string(), net::HTTP_NOT_FOUND,
 | 
| -        net::URLRequestStatus::FAILED));
 | 
| +        net::URLRequestStatus::FAILED);
 | 
|    }
 | 
|  };
 | 
|  
 | 
| @@ -223,21 +221,12 @@ class MockScheduler : public NTPSnippetsScheduler {
 | 
|    MOCK_METHOD0(Unschedule, bool());
 | 
|  };
 | 
|  
 | 
| -class MockSyncService : public sync_driver::FakeSyncService {
 | 
| - public:
 | 
| -  MockSyncService() {}
 | 
| -  virtual ~MockSyncService() {}
 | 
| -  MOCK_CONST_METHOD0(CanSyncStart, bool());
 | 
| -  MOCK_CONST_METHOD0(IsSyncActive, bool());
 | 
| -  MOCK_CONST_METHOD0(ConfigurationDone, bool());
 | 
| -  MOCK_CONST_METHOD0(GetActiveDataTypes, syncer::ModelTypeSet());
 | 
| -};
 | 
| -
 | 
|  class MockServiceObserver : public NTPSnippetsServiceObserver {
 | 
|   public:
 | 
|    MOCK_METHOD0(NTPSnippetsServiceLoaded, void());
 | 
|    MOCK_METHOD0(NTPSnippetsServiceShutdown, void());
 | 
| -  MOCK_METHOD0(NTPSnippetsServiceDisabled, void());
 | 
| +  MOCK_METHOD1(NTPSnippetsServiceDisabledReasonChanged,
 | 
| +               void(DisabledReason disabled_reason));
 | 
|  };
 | 
|  
 | 
|  class WaitForDBLoad : public NTPSnippetsServiceObserver {
 | 
| @@ -259,7 +248,8 @@ class WaitForDBLoad : public NTPSnippetsServiceObserver {
 | 
|    }
 | 
|  
 | 
|    void NTPSnippetsServiceShutdown() override {}
 | 
| -  void NTPSnippetsServiceDisabled() override {}
 | 
| +  void NTPSnippetsServiceDisabledReasonChanged(
 | 
| +      DisabledReason disabled_reason) override {}
 | 
|  
 | 
|    NTPSnippetsService* service_;
 | 
|    base::RunLoop run_loop_;
 | 
| @@ -269,20 +259,15 @@ class WaitForDBLoad : public NTPSnippetsServiceObserver {
 | 
|  
 | 
|  }  // namespace
 | 
|  
 | 
| -class NTPSnippetsServiceTest : public testing::Test {
 | 
| +class NTPSnippetsServiceTest : public test::NTPSnippetsTestBase {
 | 
|   public:
 | 
|    NTPSnippetsServiceTest()
 | 
|        : fake_url_fetcher_factory_(
 | 
|              /*default_factory=*/&failing_url_fetcher_factory_),
 | 
|          test_url_(base::StringPrintf(kTestContentSnippetsServerFormat,
 | 
| -                                     google_apis::GetAPIKey().c_str())),
 | 
| -        pref_service_(new TestingPrefServiceSimple()),
 | 
| -        signin_client_(new TestSigninClient(nullptr)),
 | 
| -        account_tracker_(new AccountTrackerService()),
 | 
| -        fake_signin_manager_(new FakeSigninManagerBase(signin_client_.get(),
 | 
| -                                                       account_tracker_.get())),
 | 
| -        fake_token_service_(new FakeProfileOAuth2TokenService()) {
 | 
| -    NTPSnippetsService::RegisterProfilePrefs(pref_service_->registry());
 | 
| +                                     google_apis::GetAPIKey().c_str())) {
 | 
| +    NTPSnippetsService::RegisterProfilePrefs(pref_service()->registry());
 | 
| +
 | 
|      // Since no SuggestionsService is injected in tests, we need to force the
 | 
|      // service to fetch from all hosts.
 | 
|      base::CommandLine::ForCurrentProcess()->AppendSwitch(
 | 
| @@ -302,7 +287,7 @@ class NTPSnippetsServiceTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void SetUp() override {
 | 
| -    ResetSyncServiceMock();
 | 
| +    test::NTPSnippetsTestBase::SetUp();
 | 
|      EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1);
 | 
|      CreateSnippetsService(/*enabled=*/true);
 | 
|    }
 | 
| @@ -320,16 +305,25 @@ class NTPSnippetsServiceTest : public testing::Test {
 | 
|      // create the new one, otherwise opening the new database will fail.
 | 
|      service_.reset();
 | 
|  
 | 
| -    service_.reset(new NTPSnippetsService(
 | 
| -        enabled, pref_service_.get(), mock_sync_service_.get(), nullptr,
 | 
| -        std::string("fr"), &scheduler_,
 | 
| -        base::WrapUnique(new NTPSnippetsFetcher(
 | 
| -            fake_signin_manager_.get(), fake_token_service_.get(),
 | 
| +    ResetSigninManager();
 | 
| +    std::unique_ptr<NTPSnippetsFetcher> snippets_fetcher =
 | 
| +        base::MakeUnique<NTPSnippetsFetcher>(
 | 
| +            fake_signin_manager(), fake_token_service_.get(),
 | 
|              std::move(request_context_getter), base::Bind(&ParseJson),
 | 
| -            /*is_stable_channel=*/true)),
 | 
| -        /*image_fetcher=*/nullptr, /*image_decoder=*/nullptr,
 | 
| -        base::WrapUnique(new NTPSnippetsDatabase(database_dir_.path(),
 | 
| -                                                 task_runner))));
 | 
| +            /*is_stable_channel=*/true);
 | 
| +
 | 
| +    fake_signin_manager()->SignIn("foo@bar.com");
 | 
| +    snippets_fetcher->SetPersonalizationForTesting(
 | 
| +        NTPSnippetsFetcher::Personalization::kNonPersonal);
 | 
| +
 | 
| +    service_.reset(new NTPSnippetsService(
 | 
| +        enabled, pref_service(), nullptr, "fr", &scheduler_,
 | 
| +        std::move(snippets_fetcher), /*image_fetcher=*/nullptr,
 | 
| +        /*image_fetcher=*/nullptr, base::MakeUnique<NTPSnippetsDatabase>(
 | 
| +                                       database_dir_.path(), task_runner),
 | 
| +        base::MakeUnique<NTPSnippetsStatusService>(fake_signin_manager(),
 | 
| +                                                   mock_sync_service())));
 | 
| +
 | 
|      if (enabled)
 | 
|        WaitForDBLoad(service_.get());
 | 
|    }
 | 
| @@ -338,7 +332,6 @@ class NTPSnippetsServiceTest : public testing::Test {
 | 
|    const GURL& test_url() { return test_url_; }
 | 
|    NTPSnippetsService* service() { return service_.get(); }
 | 
|    MockScheduler& mock_scheduler() {  return scheduler_; }
 | 
| -  MockSyncService* mock_sync_service() { return mock_sync_service_.get(); }
 | 
|  
 | 
|    // Provide the json to be returned by the fake fetcher.
 | 
|    void SetUpFetchResponse(const std::string& json) {
 | 
| @@ -352,34 +345,12 @@ class NTPSnippetsServiceTest : public testing::Test {
 | 
|      base::RunLoop().RunUntilIdle();
 | 
|    }
 | 
|  
 | 
| -  // Call before the service is set up to initialize a sync service.
 | 
| -  // Subsequent calls reset the return values of the mocked methods.
 | 
| -  void ResetSyncServiceMock() {
 | 
| -    if (!mock_sync_service_) {
 | 
| -      // Use a NiceMock to avoid the "uninteresting call" warnings.
 | 
| -      mock_sync_service_.reset(new testing::NiceMock<MockSyncService>);
 | 
| -    }
 | 
| -
 | 
| -    ON_CALL(*mock_sync_service_, CanSyncStart()).WillByDefault(Return(true));
 | 
| -    ON_CALL(*mock_sync_service_, IsSyncActive()).WillByDefault(Return(true));
 | 
| -    ON_CALL(*mock_sync_service_, ConfigurationDone())
 | 
| -        .WillByDefault(Return(true));
 | 
| -    ON_CALL(*mock_sync_service_, GetActiveDataTypes())
 | 
| -        .WillByDefault(
 | 
| -            Return(syncer::ModelTypeSet(syncer::HISTORY_DELETE_DIRECTIVES)));
 | 
| -  }
 | 
| -
 | 
|   private:
 | 
|    base::MessageLoop message_loop_;
 | 
|    FailingFakeURLFetcherFactory failing_url_fetcher_factory_;
 | 
|    // Instantiation of factory automatically sets itself as URLFetcher's factory.
 | 
|    net::FakeURLFetcherFactory fake_url_fetcher_factory_;
 | 
|    const GURL test_url_;
 | 
| -  std::unique_ptr<TestingPrefServiceSimple> pref_service_;
 | 
| -  std::unique_ptr<TestSigninClient> signin_client_;
 | 
| -  std::unique_ptr<AccountTrackerService> account_tracker_;
 | 
| -  std::unique_ptr<MockSyncService> mock_sync_service_;  // Null by default.
 | 
| -  std::unique_ptr<SigninManagerBase> fake_signin_manager_;
 | 
|    std::unique_ptr<OAuth2TokenService> fake_token_service_;
 | 
|    MockScheduler scheduler_;
 | 
|    // Last so that the dependencies are deleted after the service.
 | 
| @@ -393,6 +364,7 @@ class NTPSnippetsServiceTest : public testing::Test {
 | 
|  class NTPSnippetsServiceDisabledTest : public NTPSnippetsServiceTest {
 | 
|   public:
 | 
|    void SetUp() override {
 | 
| +    test::NTPSnippetsTestBase::SetUp();
 | 
|      EXPECT_CALL(mock_scheduler(), Unschedule()).Times(1);
 | 
|      CreateSnippetsService(/*enabled=*/false);
 | 
|    }
 | 
| @@ -875,59 +847,25 @@ TEST_F(NTPSnippetsServiceTest, DiscardShouldRespectAllKnownUrls) {
 | 
|    ASSERT_THAT(service()->snippets(), IsEmpty());
 | 
|  }
 | 
|  
 | 
| -TEST_F(NTPSnippetsServiceTest, SyncStateCompatibility) {
 | 
| -  // The default test setup has a compatible sync state.
 | 
| -  EXPECT_EQ(DisabledReason::NONE, service()->GetDisabledReason());
 | 
| -
 | 
| -  // History sync disabled.
 | 
| -  ON_CALL(*mock_sync_service(), GetActiveDataTypes())
 | 
| -      .WillByDefault(Return(syncer::ModelTypeSet()));
 | 
| -  EXPECT_EQ(DisabledReason::HISTORY_SYNC_DISABLED,
 | 
| -            service()->GetDisabledReason());
 | 
| -  ResetSyncServiceMock();
 | 
| -
 | 
| -  // Not done loading.
 | 
| -  ON_CALL(*mock_sync_service(), ConfigurationDone())
 | 
| -      .WillByDefault(Return(false));
 | 
| -  ON_CALL(*mock_sync_service(), GetActiveDataTypes())
 | 
| -      .WillByDefault(Return(syncer::ModelTypeSet()));
 | 
| -  EXPECT_EQ(DisabledReason::HISTORY_SYNC_STATE_UNKNOWN,
 | 
| -            service()->GetDisabledReason());
 | 
| -  ResetSyncServiceMock();
 | 
| -
 | 
| -  // Sync disabled.
 | 
| -  ON_CALL(*mock_sync_service(), CanSyncStart()).WillByDefault(Return(false));
 | 
| -  EXPECT_EQ(DisabledReason::HISTORY_SYNC_DISABLED,
 | 
| -            service()->GetDisabledReason());
 | 
| -  ResetSyncServiceMock();
 | 
| -
 | 
| -  // No service.
 | 
| -  service()->sync_service_ = nullptr;
 | 
| -  EXPECT_EQ(DisabledReason::HISTORY_SYNC_DISABLED,
 | 
| -            service()->GetDisabledReason());
 | 
| -}
 | 
| -
 | 
|  TEST_F(NTPSnippetsServiceTest, HistorySyncStateChanges) {
 | 
|    MockServiceObserver mock_observer;
 | 
|    service()->AddObserver(&mock_observer);
 | 
|  
 | 
| -  // Simulate user disabled sync.
 | 
| -  ON_CALL(*mock_sync_service(), CanSyncStart()).WillByDefault(Return(false));
 | 
| -  // The service should notify observers it's been disabled and clear the
 | 
| -  // snippets instead of pulling new ones.
 | 
| -  EXPECT_CALL(mock_observer, NTPSnippetsServiceDisabled());
 | 
| +  // Simulate user signed out
 | 
|    SetUpFetchResponse(GetTestJson({GetSnippet()}));
 | 
| -  service()->OnStateChanged();
 | 
| +  EXPECT_CALL(mock_observer, NTPSnippetsServiceDisabledReasonChanged(
 | 
| +                                 DisabledReason::SIGNED_OUT));
 | 
| +  service()->UpdateStateForStatus(DisabledReason::SIGNED_OUT);
 | 
|    base::RunLoop().RunUntilIdle();
 | 
|    EXPECT_EQ(NTPSnippetsService::State::DISABLED, service()->state_);
 | 
|    EXPECT_THAT(service()->snippets(), IsEmpty()); // No fetch should be made.
 | 
|  
 | 
| -  // Simulate user sign in.
 | 
| -  ResetSyncServiceMock();
 | 
| -  // The service should be ready again and load snippets.
 | 
| -  EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1);
 | 
| +  // Simulate user sign in. The service should be ready again and load snippets.
 | 
|    SetUpFetchResponse(GetTestJson({GetSnippet()}));
 | 
| -  service()->OnStateChanged();
 | 
| +  EXPECT_CALL(mock_observer,
 | 
| +              NTPSnippetsServiceDisabledReasonChanged(DisabledReason::NONE));
 | 
| +  EXPECT_CALL(mock_scheduler(), Schedule(_, _, _, _)).Times(1);
 | 
| +  service()->UpdateStateForStatus(DisabledReason::NONE);
 | 
|    base::RunLoop().RunUntilIdle();
 | 
|    EXPECT_EQ(NTPSnippetsService::State::READY, service()->state_);
 | 
|    EXPECT_FALSE(service()->snippets().empty());
 | 
| 
 |