signin_tracker_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 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/signin/signin_tracker.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/compiler_specific.h"
10#include "chrome/browser/chrome_notification_types.h"
11#include "chrome/browser/profiles/profile.h"
12#include "chrome/browser/signin/fake_auth_status_provider.h"
13#include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
14#include "chrome/browser/signin/fake_profile_oauth2_token_service_wrapper.h"
15#include "chrome/browser/signin/fake_signin_manager.h"
16#include "chrome/browser/signin/profile_oauth2_token_service.h"
17#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
18#include "chrome/browser/signin/signin_manager.h"
19#include "chrome/browser/signin/signin_manager_factory.h"
20#include "chrome/browser/sync/profile_sync_service_factory.h"
21#include "chrome/browser/sync/profile_sync_service_mock.h"
22#include "chrome/test/base/testing_profile.h"
23#include "content/public/browser/notification_service.h"
24#include "content/public/test/test_browser_thread_bundle.h"
25#include "google_apis/gaia/gaia_constants.h"
26#include "google_apis/gaia/google_service_auth_error.h"
27
28#include "testing/gmock/include/gmock/gmock.h"
29#include "testing/gtest/include/gtest/gtest.h"
30
31using ::testing::_;
32using ::testing::AnyNumber;
33using ::testing::Mock;
34using ::testing::Return;
35using ::testing::ReturnRef;
36
37namespace {
38
39class MockObserver : public SigninTracker::Observer {
40 public:
41  MockObserver() {}
42  ~MockObserver() {}
43
44  MOCK_METHOD1(SigninFailed, void(const GoogleServiceAuthError&));
45  MOCK_METHOD0(SigninSuccess, void(void));
46  MOCK_METHOD1(MergeSessionComplete, void(const GoogleServiceAuthError&));
47};
48
49}  // namespace
50
51class SigninTrackerTest : public testing::Test {
52 public:
53  SigninTrackerTest() {}
54  virtual void SetUp() OVERRIDE {
55    TestingProfile::Builder builder;
56    builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
57                              FakeProfileOAuth2TokenServiceWrapper::Build);
58
59    profile_ = builder.Build();
60
61    fake_oauth2_token_service_ =
62        static_cast<FakeProfileOAuth2TokenService*>(
63            ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get()));
64
65    mock_signin_manager_ = static_cast<FakeSigninManagerForTesting*>(
66        SigninManagerFactory::GetInstance()->SetTestingFactoryAndUse(
67            profile_.get(), FakeSigninManagerBase::Build));
68
69    tracker_.reset(new SigninTracker(profile_.get(), &observer_));
70  }
71  virtual void TearDown() OVERRIDE {
72    tracker_.reset();
73    profile_.reset();
74  }
75
76  content::TestBrowserThreadBundle thread_bundle_;
77  scoped_ptr<SigninTracker> tracker_;
78  scoped_ptr<TestingProfile> profile_;
79  FakeSigninManagerForTesting* mock_signin_manager_;
80  FakeProfileOAuth2TokenService* fake_oauth2_token_service_;
81  MockObserver observer_;
82};
83
84TEST_F(SigninTrackerTest, SignInFails) {
85  // SIGNIN_FAILED notification should result in a SigninFailed callback.
86  const GoogleServiceAuthError error(
87      GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
88  EXPECT_CALL(observer_, SigninSuccess()).Times(0);
89  EXPECT_CALL(observer_, SigninFailed(error));
90
91  content::NotificationService::current()->Notify(
92      chrome::NOTIFICATION_GOOGLE_SIGNIN_FAILED,
93      content::Source<Profile>(profile_.get()),
94      content::Details<const GoogleServiceAuthError>(&error));
95}
96
97TEST_F(SigninTrackerTest, SignInSucceeds) {
98  EXPECT_CALL(observer_, SigninSuccess());
99  EXPECT_CALL(observer_, SigninFailed(_)).Times(0);
100
101  mock_signin_manager_->SetAuthenticatedUsername("user@gmail.com");
102  fake_oauth2_token_service_->IssueRefreshToken("refresh_token");
103}
104