| 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 "chrome/browser/ui/webui/settings/people_handler.h" | 5 #include "chrome/browser/ui/webui/settings/people_handler.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 15 #include "base/values.h" | 15 #include "base/values.h" |
| 16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 17 #include "chrome/browser/signin/fake_signin_manager_builder.h" | 17 #include "chrome/browser/signin/fake_signin_manager_builder.h" |
| 18 #include "chrome/browser/signin/signin_error_controller_factory.h" | 18 #include "chrome/browser/signin/signin_error_controller_factory.h" |
| 19 #include "chrome/browser/signin/signin_manager_factory.h" | 19 #include "chrome/browser/signin/signin_manager_factory.h" |
| 20 #include "chrome/browser/sync/profile_sync_service_factory.h" | 20 #include "chrome/browser/sync/profile_sync_service_factory.h" |
| 21 #include "chrome/browser/sync/profile_sync_test_util.h" | 21 #include "chrome/browser/sync/profile_sync_test_util.h" |
| 22 #include "chrome/browser/ui/chrome_pages.h" |
| 22 #include "chrome/browser/ui/webui/signin/login_ui_service.h" | 23 #include "chrome/browser/ui/webui/signin/login_ui_service.h" |
| 23 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" | 24 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" |
| 24 #include "chrome/common/chrome_switches.h" | 25 #include "chrome/common/chrome_switches.h" |
| 25 #include "chrome/common/pref_names.h" | 26 #include "chrome/common/pref_names.h" |
| 27 #include "chrome/common/url_constants.h" |
| 28 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 26 #include "chrome/test/base/scoped_testing_local_state.h" | 29 #include "chrome/test/base/scoped_testing_local_state.h" |
| 30 #include "chrome/test/base/test_chrome_web_ui_controller_factory.h" |
| 27 #include "chrome/test/base/testing_browser_process.h" | 31 #include "chrome/test/base/testing_browser_process.h" |
| 28 #include "chrome/test/base/testing_profile.h" | 32 #include "chrome/test/base/testing_profile.h" |
| 29 #include "chrome/test/base/testing_profile_manager.h" | |
| 30 #include "components/prefs/pref_service.h" | 33 #include "components/prefs/pref_service.h" |
| 31 #include "components/signin/core/browser/fake_auth_status_provider.h" | 34 #include "components/signin/core/browser/fake_auth_status_provider.h" |
| 32 #include "components/signin/core/browser/signin_manager.h" | 35 #include "components/signin/core/browser/signin_manager.h" |
| 33 #include "components/sync/base/sync_prefs.h" | 36 #include "components/sync/base/sync_prefs.h" |
| 34 #include "components/sync_preferences/pref_service_syncable.h" | 37 #include "components/sync_preferences/pref_service_syncable.h" |
| 38 #include "content/public/browser/web_contents.h" |
| 35 #include "content/public/browser/web_ui.h" | 39 #include "content/public/browser/web_ui.h" |
| 40 #include "content/public/browser/web_ui_controller.h" |
| 36 #include "content/public/test/test_browser_thread.h" | 41 #include "content/public/test/test_browser_thread.h" |
| 37 #include "content/public/test/test_browser_thread_bundle.h" | 42 #include "content/public/test/test_browser_thread_bundle.h" |
| 38 #include "content/public/test/test_web_ui.h" | 43 #include "content/public/test/test_web_ui.h" |
| 44 #include "content/public/test/web_contents_tester.h" |
| 39 #include "testing/gtest/include/gtest/gtest.h" | 45 #include "testing/gtest/include/gtest/gtest.h" |
| 40 #include "ui/base/layout.h" | 46 #include "ui/base/layout.h" |
| 41 | 47 |
| 42 using ::testing::_; | 48 using ::testing::_; |
| 43 using ::testing::Mock; | 49 using ::testing::Mock; |
| 44 using ::testing::Return; | 50 using ::testing::Return; |
| 45 using ::testing::ReturnRef; | 51 using ::testing::ReturnRef; |
| 46 using ::testing::Values; | 52 using ::testing::Values; |
| 47 using browser_sync::ProfileSyncService; | 53 using browser_sync::ProfileSyncService; |
| 48 using browser_sync::ProfileSyncServiceMock; | 54 using browser_sync::ProfileSyncServiceMock; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 | 168 |
| 163 private: | 169 private: |
| 164 #if !defined(OS_CHROMEOS) | 170 #if !defined(OS_CHROMEOS) |
| 165 void DisplayGaiaLoginInNewTabOrWindow( | 171 void DisplayGaiaLoginInNewTabOrWindow( |
| 166 signin_metrics::AccessPoint access_point) override {} | 172 signin_metrics::AccessPoint access_point) override {} |
| 167 #endif | 173 #endif |
| 168 | 174 |
| 169 DISALLOW_COPY_AND_ASSIGN(TestingPeopleHandler); | 175 DISALLOW_COPY_AND_ASSIGN(TestingPeopleHandler); |
| 170 }; | 176 }; |
| 171 | 177 |
| 178 class TestWebUIProvider |
| 179 : public TestChromeWebUIControllerFactory::WebUIProvider { |
| 180 public: |
| 181 content::WebUIController* NewWebUI(content::WebUI* web_ui, |
| 182 const GURL& url) override { |
| 183 content::WebUIController* controller = new content::WebUIController(web_ui); |
| 184 return controller; |
| 185 } |
| 186 }; |
| 187 |
| 172 // The boolean parameter indicates whether the test is run with ClientOAuth | 188 // The boolean parameter indicates whether the test is run with ClientOAuth |
| 173 // or not. The test parameter is a bool: whether or not to test with/ | 189 // or not. The test parameter is a bool: whether or not to test with/ |
| 174 // /ClientLogin enabled or not. | 190 // /ClientLogin enabled or not. |
| 175 class PeopleHandlerTest : public testing::Test { | 191 class PeopleHandlerTest : public ChromeRenderViewHostTestHarness { |
| 176 public: | 192 public: |
| 177 PeopleHandlerTest() : error_(GoogleServiceAuthError::NONE) {} | 193 PeopleHandlerTest() : error_(GoogleServiceAuthError::NONE) {} |
| 178 void SetUp() override { | 194 void SetUp() override { |
| 195 ChromeRenderViewHostTestHarness::SetUp(); |
| 179 error_ = GoogleServiceAuthError::AuthErrorNone(); | 196 error_ = GoogleServiceAuthError::AuthErrorNone(); |
| 180 | 197 |
| 181 profile_manager_.reset( | |
| 182 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); | |
| 183 ASSERT_TRUE(profile_manager_->SetUp()); | |
| 184 | |
| 185 TestingProfile::TestingFactories testing_factories; | |
| 186 testing_factories.push_back(std::make_pair( | |
| 187 SigninManagerFactory::GetInstance(), BuildFakeSigninManagerBase)); | |
| 188 profile_ = profile_manager_->CreateTestingProfile( | |
| 189 "Person 1", nullptr, base::UTF8ToUTF16("Person 1"), 0, std::string(), | |
| 190 testing_factories); | |
| 191 | |
| 192 // Sign in the user. | 198 // Sign in the user. |
| 193 mock_signin_ = static_cast<SigninManagerBase*>( | 199 mock_signin_ = static_cast<SigninManagerBase*>( |
| 194 SigninManagerFactory::GetForProfile(profile_)); | 200 SigninManagerFactory::GetForProfile(profile())); |
| 195 std::string username = GetTestUser(); | 201 std::string username = GetTestUser(); |
| 196 if (!username.empty()) | 202 if (!username.empty()) |
| 197 mock_signin_->SetAuthenticatedAccountInfo(username, username); | 203 mock_signin_->SetAuthenticatedAccountInfo(username, username); |
| 198 | 204 |
| 199 mock_pss_ = static_cast<ProfileSyncServiceMock*>( | 205 mock_pss_ = static_cast<ProfileSyncServiceMock*>( |
| 200 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( | 206 ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
| 201 profile_, BuildMockProfileSyncService)); | 207 profile(), BuildMockProfileSyncService)); |
| 202 EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error_)); | 208 EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error_)); |
| 203 ON_CALL(*mock_pss_, GetPassphraseType()) | 209 ON_CALL(*mock_pss_, GetPassphraseType()) |
| 204 .WillByDefault(Return(syncer::PassphraseType::IMPLICIT_PASSPHRASE)); | 210 .WillByDefault(Return(syncer::PassphraseType::IMPLICIT_PASSPHRASE)); |
| 205 ON_CALL(*mock_pss_, GetExplicitPassphraseTime()).WillByDefault( | 211 ON_CALL(*mock_pss_, GetExplicitPassphraseTime()).WillByDefault( |
| 206 Return(base::Time())); | 212 Return(base::Time())); |
| 207 ON_CALL(*mock_pss_, GetRegisteredDataTypes()) | 213 ON_CALL(*mock_pss_, GetRegisteredDataTypes()) |
| 208 .WillByDefault(Return(syncer::ModelTypeSet())); | 214 .WillByDefault(Return(syncer::ModelTypeSet())); |
| 209 | 215 |
| 210 mock_pss_->Initialize(); | 216 mock_pss_->Initialize(); |
| 211 | 217 |
| 212 handler_.reset(new TestingPeopleHandler(&web_ui_, profile_)); | 218 handler_.reset(new TestingPeopleHandler(&web_ui_, profile())); |
| 213 handler_->AllowJavascript(); | 219 handler_->AllowJavascript(); |
| 214 } | 220 } |
| 215 | 221 |
| 222 void TearDown() override { |
| 223 handler_->set_web_ui(nullptr); |
| 224 handler_->DisallowJavascript(); |
| 225 handler_->sync_startup_tracker_.reset(); |
| 226 ChromeRenderViewHostTestHarness::TearDown(); |
| 227 } |
| 228 |
| 216 // Setup the expectations for calls made when displaying the config page. | 229 // Setup the expectations for calls made when displaying the config page. |
| 217 void SetDefaultExpectationsForConfigPage() { | 230 void SetDefaultExpectationsForConfigPage() { |
| 218 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); | 231 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); |
| 219 EXPECT_CALL(*mock_pss_, GetRegisteredDataTypes()) | 232 EXPECT_CALL(*mock_pss_, GetRegisteredDataTypes()) |
| 220 .WillRepeatedly(Return(GetAllTypes())); | 233 .WillRepeatedly(Return(GetAllTypes())); |
| 221 EXPECT_CALL(*mock_pss_, GetPreferredDataTypes()) | 234 EXPECT_CALL(*mock_pss_, GetPreferredDataTypes()) |
| 222 .WillRepeatedly(Return(GetAllTypes())); | 235 .WillRepeatedly(Return(GetAllTypes())); |
| 223 EXPECT_CALL(*mock_pss_, GetActiveDataTypes()) | 236 EXPECT_CALL(*mock_pss_, GetActiveDataTypes()) |
| 224 .WillRepeatedly(Return(GetAllTypes())); | 237 .WillRepeatedly(Return(GetAllTypes())); |
| 225 EXPECT_CALL(*mock_pss_, IsEncryptEverythingAllowed()) | 238 EXPECT_CALL(*mock_pss_, IsEncryptEverythingAllowed()) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 std::string status; | 271 std::string status; |
| 259 ASSERT_TRUE(data.arg2()->GetAsString(&status)); | 272 ASSERT_TRUE(data.arg2()->GetAsString(&status)); |
| 260 EXPECT_EQ(expected_status, status); | 273 EXPECT_EQ(expected_status, status); |
| 261 } | 274 } |
| 262 | 275 |
| 263 void ExpectSpinnerAndClose() { | 276 void ExpectSpinnerAndClose() { |
| 264 ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); | 277 ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); |
| 265 | 278 |
| 266 // Cancelling the spinner dialog will cause CloseSyncSetup(). | 279 // Cancelling the spinner dialog will cause CloseSyncSetup(). |
| 267 handler_->CloseSyncSetup(); | 280 handler_->CloseSyncSetup(); |
| 268 EXPECT_EQ(NULL, | 281 EXPECT_EQ( |
| 269 LoginUIServiceFactory::GetForProfile( | 282 NULL, |
| 270 profile_)->current_login_ui()); | 283 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 271 } | 284 } |
| 272 | 285 |
| 273 const base::DictionaryValue* ExpectSyncPrefsChanged() { | 286 const base::DictionaryValue* ExpectSyncPrefsChanged() { |
| 274 const content::TestWebUI::CallData& data1 = *web_ui_.call_data().back(); | 287 const content::TestWebUI::CallData& data1 = *web_ui_.call_data().back(); |
| 275 EXPECT_EQ("cr.webUIListenerCallback", data1.function_name()); | 288 EXPECT_EQ("cr.webUIListenerCallback", data1.function_name()); |
| 276 | 289 |
| 277 std::string event; | 290 std::string event; |
| 278 EXPECT_TRUE(data1.arg1()->GetAsString(&event)); | 291 EXPECT_TRUE(data1.arg1()->GetAsString(&event)); |
| 279 EXPECT_EQ(event, "sync-prefs-changed"); | 292 EXPECT_EQ(event, "sync-prefs-changed"); |
| 280 | 293 |
| 281 const base::DictionaryValue* dictionary = nullptr; | 294 const base::DictionaryValue* dictionary = nullptr; |
| 282 EXPECT_TRUE(data1.arg2()->GetAsDictionary(&dictionary)); | 295 EXPECT_TRUE(data1.arg2()->GetAsDictionary(&dictionary)); |
| 283 return dictionary; | 296 return dictionary; |
| 284 } | 297 } |
| 285 | 298 |
| 286 // It's difficult to notify sync listeners when using a ProfileSyncServiceMock | 299 // It's difficult to notify sync listeners when using a ProfileSyncServiceMock |
| 287 // so this helper routine dispatches an OnStateChanged() notification to the | 300 // so this helper routine dispatches an OnStateChanged() notification to the |
| 288 // SyncStartupTracker. | 301 // SyncStartupTracker. |
| 289 void NotifySyncListeners() { | 302 void NotifySyncListeners() { |
| 290 if (handler_->sync_startup_tracker_) | 303 if (handler_->sync_startup_tracker_) |
| 291 handler_->sync_startup_tracker_->OnStateChanged(mock_pss_); | 304 handler_->sync_startup_tracker_->OnStateChanged(mock_pss_); |
| 292 } | 305 } |
| 293 | 306 |
| 294 void NotifySyncStateChanged() { handler_->OnStateChanged(mock_pss_); } | 307 void NotifySyncStateChanged() { handler_->OnStateChanged(mock_pss_); } |
| 295 | 308 |
| 296 virtual std::string GetTestUser() { | 309 virtual std::string GetTestUser() { |
| 297 return std::string(kTestUser); | 310 return std::string(kTestUser); |
| 298 } | 311 } |
| 299 | 312 |
| 300 content::TestBrowserThreadBundle thread_bundle_; | |
| 301 std::unique_ptr<TestingProfileManager> profile_manager_; | |
| 302 Profile* profile_; | |
| 303 ProfileSyncServiceMock* mock_pss_; | 313 ProfileSyncServiceMock* mock_pss_; |
| 304 GoogleServiceAuthError error_; | 314 GoogleServiceAuthError error_; |
| 305 SigninManagerBase* mock_signin_; | 315 SigninManagerBase* mock_signin_; |
| 306 content::TestWebUI web_ui_; | 316 content::TestWebUI web_ui_; |
| 317 TestWebUIProvider test_provider_; |
| 318 std::unique_ptr<TestChromeWebUIControllerFactory> test_factory_; |
| 307 std::unique_ptr<TestingPeopleHandler> handler_; | 319 std::unique_ptr<TestingPeopleHandler> handler_; |
| 308 }; | 320 }; |
| 309 | 321 |
| 310 class PeopleHandlerFirstSigninTest : public PeopleHandlerTest { | 322 class PeopleHandlerFirstSigninTest : public PeopleHandlerTest { |
| 311 std::string GetTestUser() override { return std::string(); } | 323 std::string GetTestUser() override { return std::string(); } |
| 312 }; | 324 }; |
| 313 | 325 |
| 314 #if !defined(OS_CHROMEOS) | 326 #if !defined(OS_CHROMEOS) |
| 315 TEST_F(PeopleHandlerFirstSigninTest, DisplayBasicLogin) { | 327 TEST_F(PeopleHandlerFirstSigninTest, DisplayBasicLogin) { |
| 316 // Test that the HandleStartSignin call enables JavaScript. | 328 // Test that the HandleStartSignin call enables JavaScript. |
| 317 handler_->DisallowJavascript(); | 329 handler_->DisallowJavascript(); |
| 318 | 330 |
| 319 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); | 331 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); |
| 320 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); | 332 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); |
| 321 // Ensure that the user is not signed in before calling |HandleStartSignin()|. | 333 // Ensure that the user is not signed in before calling |HandleStartSignin()|. |
| 322 SigninManager* manager = static_cast<SigninManager*>(mock_signin_); | 334 SigninManager* manager = static_cast<SigninManager*>(mock_signin_); |
| 323 manager->SignOut(signin_metrics::SIGNOUT_TEST, | 335 manager->SignOut(signin_metrics::SIGNOUT_TEST, |
| 324 signin_metrics::SignoutDelete::IGNORE_METRIC); | 336 signin_metrics::SignoutDelete::IGNORE_METRIC); |
| 325 base::ListValue list_args; | 337 base::ListValue list_args; |
| 326 handler_->HandleStartSignin(&list_args); | 338 handler_->HandleStartSignin(&list_args); |
| 327 | 339 |
| 328 // Sync setup hands off control to the gaia login tab. | 340 // Sync setup hands off control to the gaia login tab. |
| 329 EXPECT_EQ(NULL, | 341 EXPECT_EQ( |
| 330 LoginUIServiceFactory::GetForProfile( | 342 NULL, |
| 331 profile_)->current_login_ui()); | 343 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 332 | 344 |
| 333 ASSERT_FALSE(handler_->is_configuring_sync()); | 345 ASSERT_FALSE(handler_->is_configuring_sync()); |
| 334 | 346 |
| 335 handler_->CloseSyncSetup(); | 347 handler_->CloseSyncSetup(); |
| 336 EXPECT_EQ(NULL, | 348 EXPECT_EQ( |
| 337 LoginUIServiceFactory::GetForProfile( | 349 NULL, |
| 338 profile_)->current_login_ui()); | 350 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 339 } | 351 } |
| 340 | 352 |
| 341 TEST_F(PeopleHandlerTest, ShowSyncSetupWhenNotSignedIn) { | 353 TEST_F(PeopleHandlerTest, ShowSyncSetupWhenNotSignedIn) { |
| 342 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); | 354 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); |
| 343 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); | 355 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); |
| 344 handler_->HandleShowSetupUI(NULL); | 356 handler_->HandleShowSetupUI(NULL); |
| 345 | 357 |
| 346 ExpectPageStatusChanged(PeopleHandler::kDonePageStatus); | 358 ExpectPageStatusChanged(PeopleHandler::kDonePageStatus); |
| 347 | 359 |
| 348 ASSERT_FALSE(handler_->is_configuring_sync()); | 360 ASSERT_FALSE(handler_->is_configuring_sync()); |
| 349 EXPECT_EQ(NULL, | 361 EXPECT_EQ( |
| 350 LoginUIServiceFactory::GetForProfile( | 362 NULL, |
| 351 profile_)->current_login_ui()); | 363 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 352 } | 364 } |
| 353 #endif // !defined(OS_CHROMEOS) | 365 #endif // !defined(OS_CHROMEOS) |
| 354 | 366 |
| 355 // Verifies that the sync setup is terminated correctly when the | 367 // Verifies that the sync setup is terminated correctly when the |
| 356 // sync is disabled. | 368 // sync is disabled. |
| 357 TEST_F(PeopleHandlerTest, HandleSetupUIWhenSyncDisabled) { | 369 TEST_F(PeopleHandlerTest, HandleSetupUIWhenSyncDisabled) { |
| 358 EXPECT_CALL(*mock_pss_, IsManaged()).WillRepeatedly(Return(true)); | 370 EXPECT_CALL(*mock_pss_, IsManaged()).WillRepeatedly(Return(true)); |
| 359 handler_->HandleShowSetupUI(NULL); | 371 handler_->HandleShowSetupUI(NULL); |
| 360 | 372 |
| 361 // Sync setup is closed when sync is disabled. | 373 // Sync setup is closed when sync is disabled. |
| 362 EXPECT_EQ(NULL, | 374 EXPECT_EQ( |
| 363 LoginUIServiceFactory::GetForProfile( | 375 NULL, |
| 364 profile_)->current_login_ui()); | 376 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 365 ASSERT_FALSE(handler_->is_configuring_sync()); | 377 ASSERT_FALSE(handler_->is_configuring_sync()); |
| 366 } | 378 } |
| 367 | 379 |
| 368 // Verifies that the handler correctly handles a cancellation when | 380 // Verifies that the handler correctly handles a cancellation when |
| 369 // it is displaying the spinner to the user. | 381 // it is displaying the spinner to the user. |
| 370 TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancel) { | 382 TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndCancel) { |
| 371 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); | 383 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); |
| 372 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); | 384 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); |
| 373 error_ = GoogleServiceAuthError::AuthErrorNone(); | 385 error_ = GoogleServiceAuthError::AuthErrorNone(); |
| 374 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); | 386 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); |
| 375 EXPECT_CALL(*mock_pss_, RequestStart()); | 387 EXPECT_CALL(*mock_pss_, RequestStart()); |
| 376 | 388 |
| 377 // We're simulating a user setting up sync, which would cause the engine to | 389 // We're simulating a user setting up sync, which would cause the engine to |
| 378 // kick off initialization, but not download user data types. The sync | 390 // kick off initialization, but not download user data types. The sync |
| 379 // engine will try to download control data types (e.g encryption info), but | 391 // engine will try to download control data types (e.g encryption info), but |
| 380 // that won't finish for this test as we're simulating cancelling while the | 392 // that won't finish for this test as we're simulating cancelling while the |
| 381 // spinner is showing. | 393 // spinner is showing. |
| 382 handler_->HandleShowSetupUI(NULL); | 394 handler_->HandleShowSetupUI(NULL); |
| 383 | 395 |
| 384 EXPECT_EQ(handler_.get(), | 396 EXPECT_EQ( |
| 385 LoginUIServiceFactory::GetForProfile( | 397 handler_.get(), |
| 386 profile_)->current_login_ui()); | 398 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 387 | 399 |
| 388 ExpectSpinnerAndClose(); | 400 ExpectSpinnerAndClose(); |
| 389 } | 401 } |
| 390 | 402 |
| 391 // Verifies that the handler correctly transitions from showing the spinner | 403 // Verifies that the handler correctly transitions from showing the spinner |
| 392 // to showing a configuration page when sync setup completes successfully. | 404 // to showing a configuration page when sync setup completes successfully. |
| 393 TEST_F(PeopleHandlerTest, | 405 TEST_F(PeopleHandlerTest, |
| 394 DisplayConfigureWithEngineDisabledAndSyncStartupCompleted) { | 406 DisplayConfigureWithEngineDisabledAndSyncStartupCompleted) { |
| 395 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); | 407 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); |
| 396 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); | 408 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 SetDefaultExpectationsForConfigPage(); | 451 SetDefaultExpectationsForConfigPage(); |
| 440 handler_->OpenSyncSetup(); | 452 handler_->OpenSyncSetup(); |
| 441 | 453 |
| 442 // It's important to tell sync the user cancelled the setup flow before we | 454 // It's important to tell sync the user cancelled the setup flow before we |
| 443 // tell it we're through with the setup progress. | 455 // tell it we're through with the setup progress. |
| 444 testing::InSequence seq; | 456 testing::InSequence seq; |
| 445 EXPECT_CALL(*mock_pss_, RequestStop(ProfileSyncService::CLEAR_DATA)); | 457 EXPECT_CALL(*mock_pss_, RequestStop(ProfileSyncService::CLEAR_DATA)); |
| 446 EXPECT_CALL(*mock_pss_, OnSetupInProgressHandleDestroyed()); | 458 EXPECT_CALL(*mock_pss_, OnSetupInProgressHandleDestroyed()); |
| 447 | 459 |
| 448 handler_->CloseSyncSetup(); | 460 handler_->CloseSyncSetup(); |
| 449 EXPECT_EQ(NULL, | 461 EXPECT_EQ( |
| 450 LoginUIServiceFactory::GetForProfile( | 462 NULL, |
| 451 profile_)->current_login_ui()); | 463 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 452 } | 464 } |
| 453 | 465 |
| 454 TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndSigninFailed) { | 466 TEST_F(PeopleHandlerTest, DisplayConfigureWithEngineDisabledAndSigninFailed) { |
| 455 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); | 467 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); |
| 456 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); | 468 EXPECT_CALL(*mock_pss_, IsFirstSetupComplete()).WillRepeatedly(Return(false)); |
| 457 error_ = GoogleServiceAuthError::AuthErrorNone(); | 469 error_ = GoogleServiceAuthError::AuthErrorNone(); |
| 458 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); | 470 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); |
| 459 EXPECT_CALL(*mock_pss_, RequestStart()); | 471 EXPECT_CALL(*mock_pss_, RequestStart()); |
| 460 | 472 |
| 461 handler_->OpenSyncSetup(); | 473 handler_->OpenSyncSetup(); |
| 462 ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); | 474 ExpectPageStatusChanged(PeopleHandler::kSpinnerPageStatus); |
| 463 Mock::VerifyAndClearExpectations(mock_pss_); | 475 Mock::VerifyAndClearExpectations(mock_pss_); |
| 464 error_ = GoogleServiceAuthError( | 476 error_ = GoogleServiceAuthError( |
| 465 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 477 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |
| 466 EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error_)); | 478 EXPECT_CALL(*mock_pss_, GetAuthError()).WillRepeatedly(ReturnRef(error_)); |
| 467 NotifySyncListeners(); | 479 NotifySyncListeners(); |
| 468 | 480 |
| 469 // On failure, the dialog will be closed. | 481 // On failure, the dialog will be closed. |
| 470 EXPECT_EQ(NULL, | 482 EXPECT_EQ( |
| 471 LoginUIServiceFactory::GetForProfile( | 483 NULL, |
| 472 profile_)->current_login_ui()); | 484 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 473 } | 485 } |
| 474 | 486 |
| 475 // Tests that signals not related to user intention to configure sync don't | 487 // Tests that signals not related to user intention to configure sync don't |
| 476 // trigger sync engine start. | 488 // trigger sync engine start. |
| 477 TEST_F(PeopleHandlerTest, OnlyStartEngineWhenConfiguringSync) { | 489 TEST_F(PeopleHandlerTest, OnlyStartEngineWhenConfiguringSync) { |
| 478 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); | 490 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); |
| 479 EXPECT_CALL(*mock_pss_, RequestStart()).Times(0); | 491 EXPECT_CALL(*mock_pss_, RequestStart()).Times(0); |
| 480 NotifySyncStateChanged(); | 492 NotifySyncStateChanged(); |
| 481 } | 493 } |
| 482 | 494 |
| 495 TEST_F(PeopleHandlerTest, AcquireSyncBlockerWhenLoadingSyncSettingsSubpage) { |
| 496 /// We set up a factory override here to prevent a new web ui from being |
| 497 /// created when we navigate to a page that would normally create one. |
| 498 web_ui_.set_web_contents(web_contents()); |
| 499 test_factory_ = base::MakeUnique<TestChromeWebUIControllerFactory>(); |
| 500 test_factory_->AddFactoryOverride( |
| 501 chrome::GetSettingsUrl(chrome::kSyncSetupSubPage).host(), |
| 502 &test_provider_); |
| 503 content::WebUIControllerFactory::RegisterFactory(test_factory_.get()); |
| 504 content::WebUIControllerFactory::UnregisterFactoryForTesting( |
| 505 ChromeWebUIControllerFactory::GetInstance()); |
| 506 |
| 507 EXPECT_FALSE(handler_->sync_blocker_); |
| 508 |
| 509 content::WebContentsTester::For(web_contents()) |
| 510 ->StartNavigation(chrome::GetSettingsUrl(chrome::kSyncSetupSubPage)); |
| 511 handler_->MaybeAcquireSyncBlocker(); |
| 512 |
| 513 EXPECT_TRUE(handler_->sync_blocker_); |
| 514 } |
| 515 |
| 483 #if !defined(OS_CHROMEOS) | 516 #if !defined(OS_CHROMEOS) |
| 484 | 517 |
| 485 class PeopleHandlerNonCrosTest : public PeopleHandlerTest { | 518 class PeopleHandlerNonCrosTest : public PeopleHandlerTest { |
| 486 public: | 519 public: |
| 487 PeopleHandlerNonCrosTest() {} | 520 PeopleHandlerNonCrosTest() {} |
| 488 }; | 521 }; |
| 489 | 522 |
| 490 TEST_F(PeopleHandlerNonCrosTest, HandleGaiaAuthFailure) { | 523 TEST_F(PeopleHandlerNonCrosTest, HandleGaiaAuthFailure) { |
| 491 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); | 524 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(false)); |
| 492 EXPECT_CALL(*mock_pss_, HasUnrecoverableError()) | 525 EXPECT_CALL(*mock_pss_, HasUnrecoverableError()) |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 | 752 |
| 720 // We do not display signin on chromeos in the case of auth error. | 753 // We do not display signin on chromeos in the case of auth error. |
| 721 TEST_F(PeopleHandlerTest, ShowSigninOnAuthError) { | 754 TEST_F(PeopleHandlerTest, ShowSigninOnAuthError) { |
| 722 // Initialize the system to a signed in state, but with an auth error. | 755 // Initialize the system to a signed in state, but with an auth error. |
| 723 error_ = GoogleServiceAuthError( | 756 error_ = GoogleServiceAuthError( |
| 724 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); | 757 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); |
| 725 | 758 |
| 726 SetupInitializedProfileSyncService(); | 759 SetupInitializedProfileSyncService(); |
| 727 mock_signin_->SetAuthenticatedAccountInfo(kTestUser, kTestUser); | 760 mock_signin_->SetAuthenticatedAccountInfo(kTestUser, kTestUser); |
| 728 FakeAuthStatusProvider provider( | 761 FakeAuthStatusProvider provider( |
| 729 SigninErrorControllerFactory::GetForProfile(profile_)); | 762 SigninErrorControllerFactory::GetForProfile(profile())); |
| 730 provider.SetAuthError(kTestUser, error_); | 763 provider.SetAuthError(kTestUser, error_); |
| 731 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); | 764 EXPECT_CALL(*mock_pss_, CanSyncStart()).WillRepeatedly(Return(true)); |
| 732 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) | 765 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) |
| 733 .WillRepeatedly(Return(false)); | 766 .WillRepeatedly(Return(false)); |
| 734 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) | 767 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) |
| 735 .WillRepeatedly(Return(false)); | 768 .WillRepeatedly(Return(false)); |
| 736 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); | 769 EXPECT_CALL(*mock_pss_, IsEngineInitialized()).WillRepeatedly(Return(false)); |
| 737 | 770 |
| 738 #if defined(OS_CHROMEOS) | 771 #if defined(OS_CHROMEOS) |
| 739 // On ChromeOS, auth errors are ignored - instead we just try to start the | 772 // On ChromeOS, auth errors are ignored - instead we just try to start the |
| 740 // sync engine (which will fail due to the auth error). This should only | 773 // sync engine (which will fail due to the auth error). This should only |
| 741 // happen if the user manually navigates to chrome://settings/syncSetup - | 774 // happen if the user manually navigates to chrome://settings/syncSetup - |
| 742 // clicking on the button in the UI will sign the user out rather than | 775 // clicking on the button in the UI will sign the user out rather than |
| 743 // displaying a spinner. Should be no visible UI on ChromeOS in this case. | 776 // displaying a spinner. Should be no visible UI on ChromeOS in this case. |
| 744 EXPECT_EQ(NULL, LoginUIServiceFactory::GetForProfile( | 777 EXPECT_EQ( |
| 745 profile_)->current_login_ui()); | 778 NULL, |
| 779 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 746 #else | 780 #else |
| 747 | 781 |
| 748 // On ChromeOS, this should display the spinner while we try to startup the | 782 // On ChromeOS, this should display the spinner while we try to startup the |
| 749 // sync engine, and on desktop this displays the login dialog. | 783 // sync engine, and on desktop this displays the login dialog. |
| 750 handler_->OpenSyncSetup(); | 784 handler_->OpenSyncSetup(); |
| 751 | 785 |
| 752 // Sync setup is closed when re-auth is in progress. | 786 // Sync setup is closed when re-auth is in progress. |
| 753 EXPECT_EQ(NULL, | 787 EXPECT_EQ( |
| 754 LoginUIServiceFactory::GetForProfile( | 788 NULL, |
| 755 profile_)->current_login_ui()); | 789 LoginUIServiceFactory::GetForProfile(profile())->current_login_ui()); |
| 756 | 790 |
| 757 ASSERT_FALSE(handler_->is_configuring_sync()); | 791 ASSERT_FALSE(handler_->is_configuring_sync()); |
| 758 #endif | 792 #endif |
| 759 } | 793 } |
| 760 | 794 |
| 761 TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) { | 795 TEST_F(PeopleHandlerTest, ShowSetupSyncEverything) { |
| 762 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) | 796 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) |
| 763 .WillRepeatedly(Return(false)); | 797 .WillRepeatedly(Return(false)); |
| 764 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) | 798 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) |
| 765 .WillRepeatedly(Return(false)); | 799 .WillRepeatedly(Return(false)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 785 CheckBool(dictionary, "encryptAllData", false); | 819 CheckBool(dictionary, "encryptAllData", false); |
| 786 CheckConfigDataTypeArguments(dictionary, SYNC_ALL_DATA, GetAllTypes()); | 820 CheckConfigDataTypeArguments(dictionary, SYNC_ALL_DATA, GetAllTypes()); |
| 787 } | 821 } |
| 788 | 822 |
| 789 TEST_F(PeopleHandlerTest, ShowSetupManuallySyncAll) { | 823 TEST_F(PeopleHandlerTest, ShowSetupManuallySyncAll) { |
| 790 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) | 824 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) |
| 791 .WillRepeatedly(Return(false)); | 825 .WillRepeatedly(Return(false)); |
| 792 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) | 826 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) |
| 793 .WillRepeatedly(Return(false)); | 827 .WillRepeatedly(Return(false)); |
| 794 SetupInitializedProfileSyncService(); | 828 SetupInitializedProfileSyncService(); |
| 795 syncer::SyncPrefs sync_prefs(profile_->GetPrefs()); | 829 syncer::SyncPrefs sync_prefs(profile()->GetPrefs()); |
| 796 sync_prefs.SetKeepEverythingSynced(false); | 830 sync_prefs.SetKeepEverythingSynced(false); |
| 797 SetDefaultExpectationsForConfigPage(); | 831 SetDefaultExpectationsForConfigPage(); |
| 798 // This should display the sync setup dialog (not login). | 832 // This should display the sync setup dialog (not login). |
| 799 handler_->OpenSyncSetup(); | 833 handler_->OpenSyncSetup(); |
| 800 | 834 |
| 801 const base::DictionaryValue* dictionary = ExpectSyncPrefsChanged(); | 835 const base::DictionaryValue* dictionary = ExpectSyncPrefsChanged(); |
| 802 CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, GetAllTypes()); | 836 CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, GetAllTypes()); |
| 803 } | 837 } |
| 804 | 838 |
| 805 TEST_F(PeopleHandlerTest, ShowSetupSyncForAllTypesIndividually) { | 839 TEST_F(PeopleHandlerTest, ShowSetupSyncForAllTypesIndividually) { |
| 806 syncer::ModelTypeSet user_selectable_types = GetAllTypes(); | 840 syncer::ModelTypeSet user_selectable_types = GetAllTypes(); |
| 807 syncer::ModelTypeSet::Iterator it; | 841 syncer::ModelTypeSet::Iterator it; |
| 808 for (it = user_selectable_types.First(); it.Good(); it.Inc()) { | 842 for (it = user_selectable_types.First(); it.Good(); it.Inc()) { |
| 809 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) | 843 EXPECT_CALL(*mock_pss_, IsPassphraseRequired()) |
| 810 .WillRepeatedly(Return(false)); | 844 .WillRepeatedly(Return(false)); |
| 811 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) | 845 EXPECT_CALL(*mock_pss_, IsUsingSecondaryPassphrase()) |
| 812 .WillRepeatedly(Return(false)); | 846 .WillRepeatedly(Return(false)); |
| 813 SetupInitializedProfileSyncService(); | 847 SetupInitializedProfileSyncService(); |
| 814 syncer::SyncPrefs sync_prefs(profile_->GetPrefs()); | 848 syncer::SyncPrefs sync_prefs(profile()->GetPrefs()); |
| 815 sync_prefs.SetKeepEverythingSynced(false); | 849 sync_prefs.SetKeepEverythingSynced(false); |
| 816 SetDefaultExpectationsForConfigPage(); | 850 SetDefaultExpectationsForConfigPage(); |
| 817 syncer::ModelTypeSet types; | 851 syncer::ModelTypeSet types; |
| 818 types.Put(it.Get()); | 852 types.Put(it.Get()); |
| 819 EXPECT_CALL(*mock_pss_, GetPreferredDataTypes()). | 853 EXPECT_CALL(*mock_pss_, GetPreferredDataTypes()). |
| 820 WillRepeatedly(Return(types)); | 854 WillRepeatedly(Return(types)); |
| 821 | 855 |
| 822 // This should display the sync setup dialog (not login). | 856 // This should display the sync setup dialog (not login). |
| 823 handler_->OpenSyncSetup(); | 857 handler_->OpenSyncSetup(); |
| 824 | 858 |
| 825 // Close the config overlay. | 859 // Close the config overlay. |
| 826 LoginUIServiceFactory::GetForProfile(profile_)->LoginUIClosed( | 860 LoginUIServiceFactory::GetForProfile(profile())->LoginUIClosed( |
| 827 handler_.get()); | 861 handler_.get()); |
| 828 | 862 |
| 829 const base::DictionaryValue* dictionary = ExpectSyncPrefsChanged(); | 863 const base::DictionaryValue* dictionary = ExpectSyncPrefsChanged(); |
| 830 CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, types); | 864 CheckConfigDataTypeArguments(dictionary, CHOOSE_WHAT_TO_SYNC, types); |
| 831 Mock::VerifyAndClearExpectations(mock_pss_); | 865 Mock::VerifyAndClearExpectations(mock_pss_); |
| 832 // Clean up so we can loop back to display the dialog again. | 866 // Clean up so we can loop back to display the dialog again. |
| 833 web_ui_.ClearTrackedCalls(); | 867 web_ui_.ClearTrackedCalls(); |
| 834 } | 868 } |
| 835 } | 869 } |
| 836 | 870 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 915 SetupInitializedProfileSyncService(); | 949 SetupInitializedProfileSyncService(); |
| 916 EXPECT_CALL(*mock_pss_, IsEncryptEverythingAllowed()) | 950 EXPECT_CALL(*mock_pss_, IsEncryptEverythingAllowed()) |
| 917 .WillRepeatedly(Return(false)); | 951 .WillRepeatedly(Return(false)); |
| 918 EXPECT_CALL(*mock_pss_, EnableEncryptEverything()).Times(0); | 952 EXPECT_CALL(*mock_pss_, EnableEncryptEverything()).Times(0); |
| 919 handler_->HandleSetEncryption(&list_args); | 953 handler_->HandleSetEncryption(&list_args); |
| 920 | 954 |
| 921 ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus); | 955 ExpectPageStatusResponse(PeopleHandler::kConfigurePageStatus); |
| 922 } | 956 } |
| 923 | 957 |
| 924 } // namespace settings | 958 } // namespace settings |
| OLD | NEW |