profile_sync_service_startup_unittest.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "testing/gtest/include/gtest/gtest.h" 6 7#include "base/message_loop.h" 8#include "base/scoped_ptr.h" 9#include "chrome/browser/chrome_thread.h" 10#include "chrome/browser/net/gaia/token_service.h" 11#include "chrome/browser/sync/glue/data_type_manager.h" 12#include "chrome/browser/sync/glue/data_type_manager_mock.h" 13#include "chrome/browser/sync/profile_sync_factory_mock.h" 14#include "chrome/browser/sync/profile_sync_test_util.h" 15#include "chrome/browser/sync/test_profile_sync_service.h" 16#include "chrome/common/net/gaia/gaia_auth_consumer.h" 17#include "chrome/common/notification_type.h" 18#include "chrome/common/pref_names.h" 19#include "chrome/test/testing_profile.h" 20#include "testing/gmock/include/gmock/gmock.h" 21 22using browser_sync::DataTypeManager; 23using browser_sync::DataTypeManagerMock; 24using testing::_; 25using testing::DoAll; 26using testing::InvokeArgument; 27using testing::Mock; 28using testing::Return; 29 30ACTION_P(InvokeCallback, callback_result) { 31 arg0->Run(callback_result); 32 delete arg0; 33} 34 35// TODO(skrul) This test fails on the mac. See http://crbug.com/33443 36#if defined(OS_MACOSX) 37#define SKIP_MACOSX(test) DISABLED_##test 38#else 39#define SKIP_MACOSX(test) test 40#endif 41 42class ProfileSyncServiceStartupTest : public testing::Test { 43 public: 44 ProfileSyncServiceStartupTest() 45 : ui_thread_(ChromeThread::UI, &message_loop_) {} 46 47 virtual ~ProfileSyncServiceStartupTest() { 48 // The PSS has some deletes that are scheduled on the main thread 49 // so we must delete the service and run the message loop. 50 service_.reset(); 51 MessageLoop::current()->RunAllPending(); 52 } 53 54 virtual void SetUp() { 55 service_.reset(new TestProfileSyncService(&factory_, &profile_, 56 false, true, NULL)); 57 service_->AddObserver(&observer_); 58 service_->set_num_expected_resumes(0); 59 service_->set_num_expected_pauses(0); 60 service_->set_synchronous_sync_configuration(); 61 } 62 63 virtual void TearDown() { 64 service_->RemoveObserver(&observer_); 65 } 66 67 protected: 68 DataTypeManagerMock* SetUpDataTypeManager() { 69 DataTypeManagerMock* data_type_manager = new DataTypeManagerMock(); 70 EXPECT_CALL(factory_, CreateDataTypeManager(_, _)). 71 WillOnce(Return(data_type_manager)); 72 return data_type_manager; 73 } 74 75 MessageLoop message_loop_; 76 ChromeThread ui_thread_; 77 TestingProfile profile_; 78 ProfileSyncFactoryMock factory_; 79 scoped_ptr<TestProfileSyncService> service_; 80 ProfileSyncServiceObserverMock observer_; 81}; 82 83TEST_F(ProfileSyncServiceStartupTest, SKIP_MACOSX(StartFirstTime)) { 84 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager(); 85 EXPECT_CALL(*data_type_manager, Configure(_)).Times(0); 86 87 // We've never completed startup. 88 profile_.GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted); 89 90 // Should not actually start, rather just clean things up and wait 91 // to be enabled. 92 EXPECT_CALL(observer_, OnStateChanged()).Times(1); 93 service_->Initialize(); 94 95 // Preferences should be back to defaults. 96 EXPECT_EQ(0, profile_.GetPrefs()->GetInt64(prefs::kSyncLastSyncedTime)); 97 EXPECT_FALSE(profile_.GetPrefs()->GetBoolean(prefs::kSyncHasSetupCompleted)); 98 Mock::VerifyAndClearExpectations(data_type_manager); 99 100 // Then start things up. 101 EXPECT_CALL(*data_type_manager, Configure(_)).Times(1); 102 EXPECT_CALL(*data_type_manager, state()). 103 WillOnce(Return(DataTypeManager::CONFIGURED)); 104 EXPECT_CALL(*data_type_manager, Stop()).Times(1); 105 EXPECT_CALL(observer_, OnStateChanged()).Times(4); 106 service_->EnableForUser(NULL); 107 syncable::ModelTypeSet set; 108 set.insert(syncable::BOOKMARKS); 109 service_->OnUserChoseDatatypes(false, set); 110} 111 112TEST_F(ProfileSyncServiceStartupTest, SKIP_MACOSX(StartNormal)) { 113 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager(); 114 EXPECT_CALL(*data_type_manager, Configure(_)).Times(1); 115 EXPECT_CALL(*data_type_manager, state()). 116 WillOnce(Return(DataTypeManager::CONFIGURED)); 117 EXPECT_CALL(*data_type_manager, Stop()).Times(1); 118 119 EXPECT_CALL(observer_, OnStateChanged()).Times(3); 120 121 service_->Initialize(); 122} 123 124TEST_F(ProfileSyncServiceStartupTest, SKIP_MACOSX(ManagedStartup)) { 125 // Disable sync through policy. 126 profile_.GetPrefs()->SetBoolean(prefs::kSyncManaged, true); 127 128 EXPECT_CALL(factory_, CreateDataTypeManager(_, _)).Times(0); 129 EXPECT_CALL(observer_, OnStateChanged()).Times(1); 130 131 // Service should not be started by Initialize() since it's managed. 132 service_->Initialize(); 133} 134 135TEST_F(ProfileSyncServiceStartupTest, SKIP_MACOSX(SwitchManaged)) { 136 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager(); 137 EXPECT_CALL(*data_type_manager, Configure(_)).Times(1); 138 EXPECT_CALL(observer_, OnStateChanged()).Times(3); 139 140 service_->Initialize(); 141 142 // The service should stop when switching to managed mode. 143 Mock::VerifyAndClearExpectations(data_type_manager); 144 EXPECT_CALL(*data_type_manager, state()). 145 WillOnce(Return(DataTypeManager::CONFIGURED)); 146 EXPECT_CALL(*data_type_manager, Stop()).Times(1); 147 EXPECT_CALL(observer_, OnStateChanged()).Times(2); 148 profile_.GetPrefs()->SetBoolean(prefs::kSyncManaged, true); 149 150 // When switching back to unmanaged, the state should change, but the service 151 // should not start up automatically (kSyncSetupCompleted will be false). 152 Mock::VerifyAndClearExpectations(data_type_manager); 153 EXPECT_CALL(factory_, CreateDataTypeManager(_, _)).Times(0); 154 EXPECT_CALL(observer_, OnStateChanged()).Times(1); 155 profile_.GetPrefs()->ClearPref(prefs::kSyncManaged); 156} 157 158TEST_F(ProfileSyncServiceStartupTest, SKIP_MACOSX(StartFailure)) { 159 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager(); 160 DataTypeManager::ConfigureResult result = 161 DataTypeManager::ASSOCIATION_FAILED; 162 EXPECT_CALL(*data_type_manager, Configure(_)). 163 WillOnce(DoAll(Notify(NotificationType::SYNC_CONFIGURE_START), 164 NotifyWithResult(NotificationType::SYNC_CONFIGURE_DONE, 165 &result))); 166 EXPECT_CALL(*data_type_manager, Stop()).Times(1); 167 EXPECT_CALL(*data_type_manager, state()). 168 WillOnce(Return(DataTypeManager::STOPPED)); 169 170 EXPECT_CALL(observer_, OnStateChanged()).Times(3); 171 172 service_->Initialize(); 173 EXPECT_TRUE(service_->unrecoverable_error_detected()); 174} 175 176class ProfileSyncServiceStartupBootstrapTest 177 : public ProfileSyncServiceStartupTest { 178 public: 179 ProfileSyncServiceStartupBootstrapTest() {} 180 virtual ~ProfileSyncServiceStartupBootstrapTest() {} 181 182 virtual void SetUp() { 183 service_.reset(new TestProfileSyncService(&factory_, &profile_, 184 true, true, NULL)); 185 service_->AddObserver(&observer_); 186 service_->set_num_expected_resumes(0); 187 service_->set_num_expected_pauses(0); 188 service_->set_synchronous_sync_configuration(); 189 } 190}; 191 192TEST_F(ProfileSyncServiceStartupBootstrapTest, SKIP_MACOSX(StartFirstTime)) { 193 DataTypeManagerMock* data_type_manager = SetUpDataTypeManager(); 194 EXPECT_CALL(*data_type_manager, Configure(_)).Times(1); 195 EXPECT_CALL(*data_type_manager, state()). 196 WillOnce(Return(DataTypeManager::CONFIGURED)); 197 EXPECT_CALL(*data_type_manager, Stop()).Times(1); 198 EXPECT_CALL(observer_, OnStateChanged()).Times(4); 199 200 profile_.GetPrefs()->ClearPref(prefs::kSyncHasSetupCompleted); 201 202 // Pretend the login screen worked. 203 GaiaAuthConsumer::ClientLoginResult result; 204 result.sid = "sid"; 205 result.lsid = "lsid"; 206 profile_.GetTokenService()->SetClientLoginResult(result); 207 // Will start sync even though setup hasn't been completed (since 208 // setup is bypassed when bootstrapping is enabled). 209 service_->Initialize(); 210} 211