signin_manager_unittest.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/signin_manager.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/net/gaia/token_service.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/net/gaia/token_service_unittest.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/password_manager/encryptor.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/webdata/web_data_service.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/net/test_url_fetcher_factory.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/testing_profile.h" 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/test/signaling_task.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/url_request/url_request.h" 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/url_request/url_request_status.h" 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SigninManagerTest : public TokenServiceTestHarness { 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public: 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen virtual void SetUp() { 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TokenServiceTestHarness::SetUp(); 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen google_login_success_.ListenFor(NotificationType::GOOGLE_SIGNIN_SUCCESSFUL, 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Source<SigninManager>(manager_.get())); 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen google_login_failure_.ListenFor(NotificationType::GOOGLE_SIGNIN_FAILED, 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Source<SigninManager>(manager_.get())); 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen URLFetcher::set_factory(&factory_); 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void SimulateValidResponse() { 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Simulate the correct ClientLogin response. 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(fetcher); 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(fetcher->delegate()); 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher->delegate()->OnURLFetchComplete( 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher, GURL(GaiaAuthenticator2::kClientLoginUrl), URLRequestStatus(), 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 200, ResponseCookies(), "SID=sid\nLSID=lsid\nAuth=auth"); 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then simulate the correct GetUserInfo response for the canonical email. 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A new URL fetcher is used for each call. 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher = factory_.GetFetcherByID(0); 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(fetcher); 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(fetcher->delegate()); 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher->delegate()->OnURLFetchComplete( 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher, GURL(GaiaAuthenticator2::kGetUserInfoUrl), URLRequestStatus(), 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 200, ResponseCookies(), "email=user@gmail.com"); 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestURLFetcherFactory factory_; 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<SigninManager> manager_; 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestNotificationTracker google_login_success_; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestNotificationTracker google_login_failure_; 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignIn) { 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(manager_->GetUsername().empty()); 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SimulateValidResponse(); 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should go into token service and stop. 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(1U, google_login_success_.size()); 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_failure_.size()); 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should persist across resets. 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ("user@gmail.com", manager_->GetUsername()); 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignOut) { 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SimulateValidResponse(); 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->OnClientLoginSuccess(credentials_); 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ("user@gmail.com", manager_->GetUsername()); 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->SignOut(); 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should not be persisted anymore 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignInFailure) { 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GoogleServiceAuthError error(GoogleServiceAuthError::REQUEST_CANCELED); 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->OnClientLoginFailure(error); 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_success_.size()); 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(1U, google_login_failure_.size()); 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should not be persisted 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 109731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SigninManagerTest, ProvideSecondFactorSuccess) { 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->Initialize(profile_.get()); 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->StartSignIn("username", "password", "", ""); 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error(GoogleServiceAuthError::TWO_FACTOR); 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error); 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_failure_.size()); 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(manager_->GetUsername().empty()); 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->ProvideSecondFactorAccessCode("access"); 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SimulateValidResponse(); 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_success_.size()); 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_failure_.size()); 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 127731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SigninManagerTest, ProvideSecondFactorFailure) { 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->Initialize(profile_.get()); 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->StartSignIn("username", "password", "", ""); 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error1(GoogleServiceAuthError::TWO_FACTOR); 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error1); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_failure_.size()); 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(manager_->GetUsername().empty()); 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->ProvideSecondFactorAccessCode("badaccess"); 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error2( 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error2); 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(2U, google_login_failure_.size()); 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(manager_->GetUsername().empty()); 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->ProvideSecondFactorAccessCode("badaccess"); 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error3(GoogleServiceAuthError::CONNECTION_FAILED); 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error3); 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(3U, google_login_failure_.size()); 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(manager_->GetUsername().empty()); 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignOutMidConnect) { 157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->SignOut(); 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_success_.size()); 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_failure_.size()); 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 165