blob: b2fb62b06dae9799e03d59926cec4a4c151938be [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/strings/string_util.h"
#include "build/build_config.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#if !defined(OS_CHROMEOS)
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/test_extension_system.h"
#include "chrome/browser/profiles/profile_attributes_entry.h"
#include "chrome/browser/profiles/profile_attributes_storage.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "content/public/browser/web_contents.h"
#include "extensions/common/extension_builder.h"
#include "google_apis/gaia/gaia_urls.h"
#endif
class LoginUIServiceTest : public testing::Test {
public:
LoginUIServiceTest()
: profile_manager_(TestingBrowserProcess::GetGlobal()),
profile_(nullptr) {}
~LoginUIServiceTest() override {}
void SetUp() override {
ASSERT_TRUE(profile_manager_.SetUp());
profile_ = profile_manager_.CreateTestingProfile("Person 1");
}
protected:
content::TestBrowserThreadBundle thread_bundle_;
TestingProfileManager profile_manager_;
// Test profile used by all tests - this is owned by profile_manager_.
TestingProfile* profile_;
private:
DISALLOW_COPY_AND_ASSIGN(LoginUIServiceTest);
};
class TestLoginUI : public LoginUIService::LoginUI {
public:
TestLoginUI() { }
~TestLoginUI() override {}
void FocusUI() override {}
private:
DISALLOW_COPY_AND_ASSIGN(TestLoginUI);
};
TEST_F(LoginUIServiceTest, CanSetMultipleLoginUIs) {
LoginUIService service(profile_);
EXPECT_EQ(nullptr, service.current_login_ui());
TestLoginUI ui;
service.SetLoginUI(&ui);
EXPECT_EQ(&ui, service.current_login_ui());
// Test that we can replace the active login UI.
TestLoginUI other_ui;
service.SetLoginUI(&other_ui);
EXPECT_EQ(&other_ui, service.current_login_ui());
// Test that closing the non-active login UI has no effect.
service.LoginUIClosed(&ui);
EXPECT_EQ(&other_ui, service.current_login_ui());
// Test that closing the foreground UI yields the background UI.
service.SetLoginUI(&ui);
EXPECT_EQ(&ui, service.current_login_ui());
service.LoginUIClosed(&ui);
EXPECT_EQ(&other_ui, service.current_login_ui());
// Test that closing the last login UI makes the current login UI nullptr.
service.LoginUIClosed(&other_ui);
EXPECT_EQ(nullptr, service.current_login_ui());
}
TEST_F(LoginUIServiceTest, SetProfileBlockingErrorMessage) {
LoginUIService service(profile_);
service.SetProfileBlockingErrorMessage();
EXPECT_EQ(base::string16(), service.GetLastLoginResult());
EXPECT_EQ(base::string16(), service.GetLastLoginErrorEmail());
EXPECT_TRUE(service.IsDisplayingProfileBlockedErrorMessage());
}
#if !defined(OS_CHROMEOS)
class LoginUIServiceExtensionLoginPromptTest
: public BrowserWithTestWindowTest {
public:
void SetUp() override {
BrowserWithTestWindowTest::SetUp();
service_ = std::make_unique<LoginUIService>(profile());
model_ = browser()->tab_strip_model();
ASSERT_EQ(0, model_->count());
}
std::unique_ptr<LoginUIService> service_;
TabStripModel* model_;
};
TEST_F(LoginUIServiceExtensionLoginPromptTest, Show) {
extensions::TestExtensionSystem* extension_system =
static_cast<extensions::TestExtensionSystem*>(
extensions::ExtensionSystem::Get(profile()));
extension_system->CreateExtensionService(
base::CommandLine::ForCurrentProcess(), base::FilePath(), false);
service_->ShowExtensionLoginPrompt(/*restricted_to_primary_account=*/true,
/*email_hint=*/std::string());
EXPECT_EQ(1, model_->count());
// Calling the function again reuses the tab.
service_->ShowExtensionLoginPrompt(/*restricted_to_primary_account=*/true,
/*email_hint=*/std::string());
EXPECT_EQ(1, model_->count());
content::WebContents* tab = model_->GetWebContentsAt(0);
ASSERT_TRUE(tab);
EXPECT_TRUE(base::StartsWith(
tab->GetVisibleURL().spec(),
GaiaUrls::GetInstance()->signin_chrome_sync_dice().spec(),
base::CompareCase::INSENSITIVE_ASCII));
// Changing the parameter opens a new tab.
service_->ShowExtensionLoginPrompt(/*restricted_to_primary_account=*/false,
/*email_hint=*/std::string());
EXPECT_EQ(2, model_->count());
// Calling the function again reuses the tab.
service_->ShowExtensionLoginPrompt(/*restricted_to_primary_account=*/false,
/*email_hint=*/std::string());
EXPECT_EQ(2, model_->count());
tab = model_->GetWebContentsAt(1);
ASSERT_TRUE(tab);
EXPECT_TRUE(
base::StartsWith(tab->GetVisibleURL().spec(),
GaiaUrls::GetInstance()->add_account_url().spec(),
base::CompareCase::INSENSITIVE_ASCII));
}
TEST_F(LoginUIServiceExtensionLoginPromptTest, AsLockedProfile) {
ProfileAttributesEntry* entry;
ASSERT_TRUE(g_browser_process->profile_manager()
->GetProfileAttributesStorage()
.GetProfileAttributesWithPath(profile()->GetPath(), &entry));
entry->SetIsSigninRequired(true);
service_->ShowExtensionLoginPrompt(/*restricted_to_primary_account=*/true,
/*email_hint=*/std::string());
EXPECT_EQ(0, model_->count());
service_->ShowExtensionLoginPrompt(/*restricted_to_primary_account=*/false,
/*email_hint=*/std::string());
EXPECT_EQ(0, model_->count());
}
#endif