• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/sync/signin_manager.h"
6 
7 #include "chrome/browser/net/gaia/token_service.h"
8 #include "chrome/browser/net/gaia/token_service_unittest.h"
9 #include "chrome/browser/password_manager/encryptor.h"
10 #include "chrome/browser/webdata/web_data_service.h"
11 #include "chrome/common/net/test_url_fetcher_factory.h"
12 #include "chrome/test/testing_profile.h"
13 #include "chrome/test/signaling_task.h"
14 #include "net/url_request/url_request.h"
15 #include "net/url_request/url_request_status.h"
16 
17 #include "testing/gtest/include/gtest/gtest.h"
18 
19 class SigninManagerTest : public TokenServiceTestHarness {
20  public:
SetUp()21   virtual void SetUp() {
22     TokenServiceTestHarness::SetUp();
23     manager_.reset(new SigninManager());
24     google_login_success_.ListenFor(NotificationType::GOOGLE_SIGNIN_SUCCESSFUL,
25                                     Source<Profile>(profile_.get()));
26     google_login_failure_.ListenFor(NotificationType::GOOGLE_SIGNIN_FAILED,
27                                     Source<Profile>(profile_.get()));
28 
29     URLFetcher::set_factory(&factory_);
30   }
31 
SimulateValidResponse()32   void SimulateValidResponse() {
33     // Simulate the correct ClientLogin response.
34     TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
35     DCHECK(fetcher);
36     DCHECK(fetcher->delegate());
37     fetcher->delegate()->OnURLFetchComplete(
38         fetcher, GURL(GaiaAuthFetcher::kClientLoginUrl),
39         net::URLRequestStatus(), 200, ResponseCookies(),
40         "SID=sid\nLSID=lsid\nAuth=auth");
41 
42     // Then simulate the correct GetUserInfo response for the canonical email.
43     // A new URL fetcher is used for each call.
44     fetcher = factory_.GetFetcherByID(0);
45     DCHECK(fetcher);
46     DCHECK(fetcher->delegate());
47     fetcher->delegate()->OnURLFetchComplete(
48         fetcher, GURL(GaiaAuthFetcher::kGetUserInfoUrl),
49         net::URLRequestStatus(), 200, ResponseCookies(),
50         "email=user@gmail.com");
51   }
52 
53 
54   TestURLFetcherFactory factory_;
55   scoped_ptr<SigninManager> manager_;
56   TestNotificationTracker google_login_success_;
57   TestNotificationTracker google_login_failure_;
58 };
59 
TEST_F(SigninManagerTest,SignIn)60 TEST_F(SigninManagerTest, SignIn) {
61   manager_->Initialize(profile_.get());
62   EXPECT_TRUE(manager_->GetUsername().empty());
63 
64   manager_->StartSignIn("username", "password", "", "");
65   EXPECT_FALSE(manager_->GetUsername().empty());
66 
67   SimulateValidResponse();
68 
69   // Should go into token service and stop.
70   EXPECT_EQ(1U, google_login_success_.size());
71   EXPECT_EQ(0U, google_login_failure_.size());
72 
73   // Should persist across resets.
74   manager_.reset(new SigninManager());
75   manager_->Initialize(profile_.get());
76   EXPECT_EQ("user@gmail.com", manager_->GetUsername());
77 }
78 
TEST_F(SigninManagerTest,SignOut)79 TEST_F(SigninManagerTest, SignOut) {
80   manager_->Initialize(profile_.get());
81   manager_->StartSignIn("username", "password", "", "");
82   SimulateValidResponse();
83   manager_->OnClientLoginSuccess(credentials_);
84 
85   EXPECT_EQ("user@gmail.com", manager_->GetUsername());
86   manager_->SignOut();
87   EXPECT_TRUE(manager_->GetUsername().empty());
88   // Should not be persisted anymore
89   manager_.reset(new SigninManager());
90   manager_->Initialize(profile_.get());
91   EXPECT_TRUE(manager_->GetUsername().empty());
92 }
93 
TEST_F(SigninManagerTest,SignInFailure)94 TEST_F(SigninManagerTest, SignInFailure) {
95   manager_->Initialize(profile_.get());
96   manager_->StartSignIn("username", "password", "", "");
97   GoogleServiceAuthError error(GoogleServiceAuthError::REQUEST_CANCELED);
98   manager_->OnClientLoginFailure(error);
99 
100   EXPECT_EQ(0U, google_login_success_.size());
101   EXPECT_EQ(1U, google_login_failure_.size());
102 
103   EXPECT_TRUE(manager_->GetUsername().empty());
104 
105   // Should not be persisted
106   manager_.reset(new SigninManager());
107   manager_->Initialize(profile_.get());
108   EXPECT_TRUE(manager_->GetUsername().empty());
109 }
110 
TEST_F(SigninManagerTest,ProvideSecondFactorSuccess)111 TEST_F(SigninManagerTest, ProvideSecondFactorSuccess) {
112   manager_->Initialize(profile_.get());
113   manager_->StartSignIn("username", "password", "", "");
114   GoogleServiceAuthError error(GoogleServiceAuthError::TWO_FACTOR);
115   manager_->OnClientLoginFailure(error);
116 
117   EXPECT_EQ(0U, google_login_success_.size());
118   EXPECT_EQ(1U, google_login_failure_.size());
119 
120   EXPECT_FALSE(manager_->GetUsername().empty());
121 
122   manager_->ProvideSecondFactorAccessCode("access");
123   SimulateValidResponse();
124 
125   EXPECT_EQ(1U, google_login_success_.size());
126   EXPECT_EQ(1U, google_login_failure_.size());
127 }
128 
TEST_F(SigninManagerTest,ProvideSecondFactorFailure)129 TEST_F(SigninManagerTest, ProvideSecondFactorFailure) {
130   manager_->Initialize(profile_.get());
131   manager_->StartSignIn("username", "password", "", "");
132   GoogleServiceAuthError error1(GoogleServiceAuthError::TWO_FACTOR);
133   manager_->OnClientLoginFailure(error1);
134 
135   EXPECT_EQ(0U, google_login_success_.size());
136   EXPECT_EQ(1U, google_login_failure_.size());
137 
138   EXPECT_FALSE(manager_->GetUsername().empty());
139 
140   manager_->ProvideSecondFactorAccessCode("badaccess");
141   GoogleServiceAuthError error2(
142       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
143   manager_->OnClientLoginFailure(error2);
144 
145   EXPECT_EQ(0U, google_login_success_.size());
146   EXPECT_EQ(2U, google_login_failure_.size());
147   EXPECT_FALSE(manager_->GetUsername().empty());
148 
149   manager_->ProvideSecondFactorAccessCode("badaccess");
150   GoogleServiceAuthError error3(GoogleServiceAuthError::CONNECTION_FAILED);
151   manager_->OnClientLoginFailure(error3);
152 
153   EXPECT_EQ(0U, google_login_success_.size());
154   EXPECT_EQ(3U, google_login_failure_.size());
155   EXPECT_TRUE(manager_->GetUsername().empty());
156 }
157 
TEST_F(SigninManagerTest,SignOutMidConnect)158 TEST_F(SigninManagerTest, SignOutMidConnect) {
159   manager_->Initialize(profile_.get());
160   manager_->StartSignIn("username", "password", "", "");
161   manager_->SignOut();
162   EXPECT_EQ(0U, google_login_success_.size());
163   EXPECT_EQ(0U, google_login_failure_.size());
164 
165   EXPECT_TRUE(manager_->GetUsername().empty());
166 }
167