19578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne// Copyright (c) 2013 The Chromium Authors. All rights reserved.
29578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne// Use of this source code is governed by a BSD-style license that can be
39578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne// found in the LICENSE file.
49578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
59578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "chrome/browser/signin/signin_global_error.h"
69578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
79578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "base/memory/scoped_ptr.h"
89578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "base/prefs/pref_service.h"
9b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne#include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
10b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h"
11b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne#include "chrome/browser/signin/fake_signin_manager.h"
12b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
13b4d40a04f0639fdec8329a8708565411fa53b5bcRichard Osborne#include "chrome/browser/signin/signin_global_error_factory.h"
149578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "chrome/browser/signin/signin_manager_factory.h"
159578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "chrome/browser/ui/global_error/global_error_service.h"
169578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "chrome/browser/ui/global_error/global_error_service_factory.h"
179578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "chrome/common/pref_names.h"
189578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "chrome/test/base/testing_profile.h"
199578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "components/signin/core/browser/fake_auth_status_provider.h"
209578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "components/signin/core/browser/signin_error_controller.h"
219578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "components/signin/core/browser/signin_manager.h"
229578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "content/public/test/test_browser_thread_bundle.h"
239578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne#include "testing/gtest/include/gtest/gtest.h"
249578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
259578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornestatic const char kTestAccountId[] = "testuser@test.com";
269578d793c9450b315721d5cb15001c2e69bff3d0Richard Osbornestatic const char kTestUsername[] = "testuser@test.com";
279578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
289578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborneclass SigninGlobalErrorTest : public testing::Test {
299578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne public:
309578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne  virtual void SetUp() OVERRIDE {
319578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    // Create a signed-in profile.
329578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    TestingProfile::Builder builder;
339578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                              BuildFakeProfileOAuth2TokenService);
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
369578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne                              FakeSigninManagerBase::Build);
379578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    profile_ = builder.Build();
389578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
399578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    profile_->GetPrefs()->SetString(
409578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne        prefs::kGoogleServicesUsername, kTestAccountId);
419578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    SigninManagerFactory::GetForProfile(profile_.get())
429578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne        ->SetAuthenticatedUsername(kTestAccountId);
439578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne
449578d793c9450b315721d5cb15001c2e69bff3d0Richard Osborne    global_error_ = SigninGlobalErrorFactory::GetForProfile(profile_.get());
45    error_controller_ = ProfileOAuth2TokenServiceFactory::GetForProfile(
46        profile_.get())->signin_error_controller();
47  }
48
49  content::TestBrowserThreadBundle thread_bundle_;
50  scoped_ptr<TestingProfile> profile_;
51  SigninGlobalError* global_error_;
52  SigninErrorController* error_controller_;
53};
54
55TEST_F(SigninGlobalErrorTest, NoErrorAuthStatusProviders) {
56  scoped_ptr<FakeAuthStatusProvider> provider;
57
58  ASSERT_FALSE(global_error_->HasMenuItem());
59
60  // Add a provider.
61  provider.reset(new FakeAuthStatusProvider(error_controller_));
62  ASSERT_FALSE(global_error_->HasMenuItem());
63
64  // Remove the provider.
65  provider.reset();
66  ASSERT_FALSE(global_error_->HasMenuItem());
67}
68
69TEST_F(SigninGlobalErrorTest, ErrorAuthStatusProvider) {
70  scoped_ptr<FakeAuthStatusProvider> provider;
71  scoped_ptr<FakeAuthStatusProvider> error_provider;
72
73  provider.reset(new FakeAuthStatusProvider(error_controller_));
74  ASSERT_FALSE(global_error_->HasMenuItem());
75
76  error_provider.reset(new FakeAuthStatusProvider(error_controller_));
77  error_provider->SetAuthError(
78      kTestAccountId,
79      kTestUsername,
80      GoogleServiceAuthError(
81          GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
82  ASSERT_TRUE(global_error_->HasMenuItem());
83
84  error_provider.reset();
85  ASSERT_FALSE(global_error_->HasMenuItem());
86
87  provider.reset();
88  error_provider.reset();
89  ASSERT_FALSE(global_error_->HasMenuItem());
90}
91
92// Verify that SigninGlobalError ignores certain errors.
93TEST_F(SigninGlobalErrorTest, AuthStatusEnumerateAllErrors) {
94  typedef struct {
95    GoogleServiceAuthError::State error_state;
96    bool is_error;
97  } ErrorTableEntry;
98
99  ErrorTableEntry table[] = {
100    { GoogleServiceAuthError::NONE, false },
101    { GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, true },
102    { GoogleServiceAuthError::USER_NOT_SIGNED_UP, true },
103    { GoogleServiceAuthError::CONNECTION_FAILED, false },
104    { GoogleServiceAuthError::CAPTCHA_REQUIRED, true },
105    { GoogleServiceAuthError::ACCOUNT_DELETED, true },
106    { GoogleServiceAuthError::ACCOUNT_DISABLED, true },
107    { GoogleServiceAuthError::SERVICE_UNAVAILABLE, true },
108    { GoogleServiceAuthError::TWO_FACTOR, true },
109    { GoogleServiceAuthError::REQUEST_CANCELED, true },
110    { GoogleServiceAuthError::HOSTED_NOT_ALLOWED, true },
111    { GoogleServiceAuthError::UNEXPECTED_SERVICE_RESPONSE, true },
112    { GoogleServiceAuthError::SERVICE_ERROR, true },
113  };
114  COMPILE_ASSERT(ARRAYSIZE_UNSAFE(table) == GoogleServiceAuthError::NUM_STATES,
115      kTable_size_does_not_match_number_of_auth_error_types);
116
117  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(table); ++i) {
118    FakeAuthStatusProvider provider(error_controller_);
119    provider.SetAuthError(kTestAccountId,
120                          kTestUsername,
121                          GoogleServiceAuthError(table[i].error_state));
122
123    EXPECT_EQ(global_error_->HasMenuItem(), table[i].is_error);
124    EXPECT_EQ(global_error_->MenuItemLabel().empty(), !table[i].is_error);
125    EXPECT_EQ(global_error_->GetBubbleViewMessages().empty(),
126              !table[i].is_error);
127    EXPECT_FALSE(global_error_->GetBubbleViewTitle().empty());
128    EXPECT_FALSE(global_error_->GetBubbleViewAcceptButtonLabel().empty());
129    EXPECT_TRUE(global_error_->GetBubbleViewCancelButtonLabel().empty());
130  }
131}
132