17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_mock.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/sync/sync_startup_tracker.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ::testing::_;
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ::testing::AnyNumber;
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ::testing::Mock;
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ::testing::Return;
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ::testing::ReturnRef;
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class MockObserver : public SyncStartupTracker::Observer {
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD0(SyncStartupCompleted, void(void));
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MOCK_METHOD0(SyncStartupFailed, void(void));
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class SyncStartupTrackerTest : public testing::Test {
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTrackerTest() :
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      no_error_(GoogleServiceAuthError::NONE) {
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    profile_.reset(new TestingProfile());
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    mock_pss_ = static_cast<ProfileSyncServiceMock*>(
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            profile_.get(),
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            ProfileSyncServiceMock::BuildMockProfileSyncService));
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Make gmock not spam the output with information about these uninteresting
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // calls.
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_pss_, AddObserver(_)).Times(AnyNumber());
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_pss_, RemoveObserver(_)).Times(AnyNumber());
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_CALL(*mock_pss_, GetAuthError()).
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        WillRepeatedly(ReturnRef(no_error_));
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ON_CALL(*mock_pss_, GetRegisteredDataTypes())
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        .WillByDefault(Return(syncer::ModelTypeSet()));
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    mock_pss_->Initialize();
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    profile_.reset();
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void SetupNonInitializedPSS() {
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_pss_, GetAuthError())
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        .WillRepeatedly(ReturnRef(no_error_));
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(false));
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_pss_, HasUnrecoverableError())
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        .WillRepeatedly(Return(false));
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_CALL(*mock_pss_, IsSyncEnabledAndLoggedIn())
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        .WillRepeatedly(Return(true));
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GoogleServiceAuthError no_error_;
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProfileSyncServiceMock* mock_pss_;
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MockObserver observer_;
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncStartupTrackerTest, SyncAlreadyInitialized) {
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(true));
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, IsSyncEnabledAndLoggedIn())
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      .WillRepeatedly(Return(true));
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupCompleted());
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker tracker(profile_.get(), &observer_);
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncStartupTrackerTest, SyncNotSignedIn) {
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure that we get a SyncStartupFailed() callback if sync is not logged
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // in.
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(false));
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, IsSyncEnabledAndLoggedIn()).WillRepeatedly(
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Return(false));
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed());
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker tracker(profile_.get(), &observer_);
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncStartupTrackerTest, SyncAuthError) {
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Make sure that we get a SyncStartupFailed() callback if sync gets an auth
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // error.
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(false));
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, IsSyncEnabledAndLoggedIn()).WillRepeatedly(
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Return(true));
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GoogleServiceAuthError error(
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error));
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed());
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker tracker(profile_.get(), &observer_);
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncStartupTrackerTest, SyncDelayedInitialization) {
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Non-initialized PSS should result in no callbacks to the observer.
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetupNonInitializedPSS();
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupCompleted()).Times(0);
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed()).Times(0);
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker tracker(profile_.get(), &observer_);
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now, mark the PSS as initialized.
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(true));
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupCompleted());
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  tracker.OnStateChanged();
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncStartupTrackerTest, SyncDelayedAuthError) {
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Non-initialized PSS should result in no callbacks to the observer.
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetupNonInitializedPSS();
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupCompleted()).Times(0);
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed()).Times(0);
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker tracker(profile_.get(), &observer_);
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Mock::VerifyAndClearExpectations(mock_pss_);
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now, mark the PSS as having an auth error.
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(false));
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, IsSyncEnabledAndLoggedIn()).WillRepeatedly(
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Return(true));
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GoogleServiceAuthError error(
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error));
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed());
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  tracker.OnStateChanged();
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncStartupTrackerTest, SyncDelayedUnrecoverableError) {
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Non-initialized PSS should result in no callbacks to the observer.
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SetupNonInitializedPSS();
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupCompleted()).Times(0);
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed()).Times(0);
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SyncStartupTracker tracker(profile_.get(), &observer_);
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Mock::VerifyAndClearExpectations(mock_pss_);
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Now, mark the PSS as having an unrecoverable error.
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, sync_initialized()).WillRepeatedly(Return(false));
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, IsSyncEnabledAndLoggedIn()).WillRepeatedly(
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Return(true));
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GoogleServiceAuthError error(
1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error));
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_CALL(observer_, SyncStartupFailed());
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  tracker.OnStateChanged();
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
156