172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 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, 25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<Profile>(profile_.get())); 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen google_login_failure_.ListenFor(NotificationType::GOOGLE_SIGNIN_FAILED, 27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Source<Profile>(profile_.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( 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen fetcher, GURL(GaiaAuthFetcher::kClientLoginUrl), 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen net::URLRequestStatus(), 200, ResponseCookies(), 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "SID=sid\nLSID=lsid\nAuth=auth"); 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Then simulate the correct GetUserInfo response for the canonical email. 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A new URL fetcher is used for each call. 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher = factory_.GetFetcherByID(0); 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(fetcher); 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DCHECK(fetcher->delegate()); 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen fetcher->delegate()->OnURLFetchComplete( 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen fetcher, GURL(GaiaAuthFetcher::kGetUserInfoUrl), 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen net::URLRequestStatus(), 200, ResponseCookies(), 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "email=user@gmail.com"); 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestURLFetcherFactory factory_; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<SigninManager> manager_; 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestNotificationTracker google_login_success_; 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TestNotificationTracker google_login_failure_; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignIn) { 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_FALSE(manager_->GetUsername().empty()); 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SimulateValidResponse(); 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should go into token service and stop. 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(1U, google_login_success_.size()); 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_failure_.size()); 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should persist across resets. 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ("user@gmail.com", manager_->GetUsername()); 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignOut) { 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen SimulateValidResponse(); 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->OnClientLoginSuccess(credentials_); 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ("user@gmail.com", manager_->GetUsername()); 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->SignOut(); 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should not be persisted anymore 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignInFailure) { 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GoogleServiceAuthError error(GoogleServiceAuthError::REQUEST_CANCELED); 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->OnClientLoginFailure(error); 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_success_.size()); 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(1U, google_login_failure_.size()); 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Should not be persisted 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_.reset(new SigninManager()); 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 111731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SigninManagerTest, ProvideSecondFactorSuccess) { 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->Initialize(profile_.get()); 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->StartSignIn("username", "password", "", ""); 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error(GoogleServiceAuthError::TWO_FACTOR); 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error); 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_failure_.size()); 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(manager_->GetUsername().empty()); 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->ProvideSecondFactorAccessCode("access"); 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SimulateValidResponse(); 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_success_.size()); 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_failure_.size()); 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 129731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST_F(SigninManagerTest, ProvideSecondFactorFailure) { 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->Initialize(profile_.get()); 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->StartSignIn("username", "password", "", ""); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error1(GoogleServiceAuthError::TWO_FACTOR); 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error1); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(1U, google_login_failure_.size()); 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(manager_->GetUsername().empty()); 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->ProvideSecondFactorAccessCode("badaccess"); 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error2( 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error2); 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(2U, google_login_failure_.size()); 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(manager_->GetUsername().empty()); 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->ProvideSecondFactorAccessCode("badaccess"); 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GoogleServiceAuthError error3(GoogleServiceAuthError::CONNECTION_FAILED); 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->OnClientLoginFailure(error3); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(0U, google_login_success_.size()); 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(3U, google_login_failure_.size()); 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(manager_->GetUsername().empty()); 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenTEST_F(SigninManagerTest, SignOutMidConnect) { 159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->Initialize(profile_.get()); 160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->StartSignIn("username", "password", "", ""); 161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen manager_->SignOut(); 162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_success_.size()); 163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_EQ(0U, google_login_failure_.size()); 164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen EXPECT_TRUE(manager_->GetUsername().empty()); 166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 167