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