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