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