blob: e8883c8add3d338893a5ed9b43492760b78a9847 [file] [log] [blame]
// Copyright 2013 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/ash/session_state_delegate_chromeos.h"
#include <string>
#include <vector>
#include "base/run_loop.h"
#include "chrome/browser/chromeos/login/users/fake_user_manager.h"
#include "chrome/browser/chromeos/login/users/multi_profile_user_controller.h"
#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
#include "chrome/browser/chromeos/policy/policy_cert_service.h"
#include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
#include "chrome/browser/chromeos/policy/policy_cert_verifier.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "components/user_manager/user_manager.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "net/cert/x509_certificate.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace {
const char* kUser = "user@test.com";
// Weak ptr to PolicyCertVerifier - object is freed in test destructor once
// we've ensured the profile has been shut down.
policy::PolicyCertVerifier* g_policy_cert_verifier_for_factory = NULL;
KeyedService* CreateTestPolicyCertService(content::BrowserContext* context) {
return policy::PolicyCertService::CreateForTesting(
kUser,
g_policy_cert_verifier_for_factory,
user_manager::UserManager::Get()).release();
}
} // namespace
class SessionStateDelegateChromeOSTest : public testing::Test {
protected:
SessionStateDelegateChromeOSTest() : user_manager_(NULL) {
}
virtual ~SessionStateDelegateChromeOSTest() {
}
virtual void SetUp() override {
// Initialize the UserManager singleton to a fresh FakeUserManager instance.
user_manager_ = new chromeos::FakeUserManager;
user_manager_enabler_.reset(
new chromeos::ScopedUserManagerEnabler(user_manager_));
// Create our SessionStateDelegate to experiment with.
session_state_delegate_.reset(new SessionStateDelegateChromeos());
testing::Test::SetUp();
}
virtual void TearDown() override {
testing::Test::TearDown();
session_state_delegate_.reset();
user_manager_enabler_.reset();
user_manager_ = NULL;
// Clear our cached pointer to the PolicyCertVerifier.
g_policy_cert_verifier_for_factory = NULL;
profile_manager_.reset();
// We must ensure that the PolicyCertVerifier outlives the
// PolicyCertService so shutdown the profile here. Additionally, we need
// to run the message loop between freeing the PolicyCertService and
// freeing the PolicyCertVerifier (see
// PolicyCertService::OnTrustAnchorsChanged() which is called from
// PolicyCertService::Shutdown()).
base::RunLoop().RunUntilIdle();
}
// Add and log in a user to the session.
void UserAddedToSession(std::string user) {
user_manager()->AddUser(user);
user_manager()->LoginUser(user);
}
// Get the active user.
const std::string& GetActiveUser() {
return user_manager::UserManager::Get()->GetActiveUser()->email();
}
chromeos::FakeUserManager* user_manager() { return user_manager_; }
SessionStateDelegateChromeos* session_state_delegate() {
return session_state_delegate_.get();
}
void InitForMultiProfile() {
profile_manager_.reset(
new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
ASSERT_TRUE(profile_manager_->SetUp());
const std::string user_email(kUser);
const user_manager::User* user = user_manager()->AddUser(user_email);
// Note that user profiles are created after user login in reality.
user_profile_ = profile_manager_->CreateTestingProfile(user_email);
user_profile_->set_profile_name(user_email);
chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
user, user_profile_);
}
content::TestBrowserThreadBundle threads_;
scoped_ptr<policy::PolicyCertVerifier> cert_verifier_;
scoped_ptr<TestingProfileManager> profile_manager_;
TestingProfile* user_profile_;
private:
scoped_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
scoped_ptr<SessionStateDelegateChromeos> session_state_delegate_;
// Not owned.
chromeos::FakeUserManager* user_manager_;
DISALLOW_COPY_AND_ASSIGN(SessionStateDelegateChromeOSTest);
};
// Make sure that cycling one user does not cause any harm.
TEST_F(SessionStateDelegateChromeOSTest, CyclingOneUser) {
UserAddedToSession("firstuser@test.com");
EXPECT_EQ("firstuser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(
ash::SessionStateDelegate::CYCLE_TO_NEXT_USER);
EXPECT_EQ("firstuser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(
ash::SessionStateDelegate::CYCLE_TO_PREVIOUS_USER);
EXPECT_EQ("firstuser@test.com", GetActiveUser());
}
// Cycle three users forwards and backwards to see that it works.
TEST_F(SessionStateDelegateChromeOSTest, CyclingThreeUsers) {
UserAddedToSession("firstuser@test.com");
UserAddedToSession("seconduser@test.com");
UserAddedToSession("thirduser@test.com");
const ash::SessionStateDelegate::CycleUser forward =
ash::SessionStateDelegate::CYCLE_TO_NEXT_USER;
// Cycle forward.
EXPECT_EQ("firstuser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(forward);
EXPECT_EQ("seconduser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(forward);
EXPECT_EQ("thirduser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(forward);
EXPECT_EQ("firstuser@test.com", GetActiveUser());
// Cycle backwards.
const ash::SessionStateDelegate::CycleUser backward =
ash::SessionStateDelegate::CYCLE_TO_PREVIOUS_USER;
session_state_delegate()->CycleActiveUser(backward);
EXPECT_EQ("thirduser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(backward);
EXPECT_EQ("seconduser@test.com", GetActiveUser());
session_state_delegate()->CycleActiveUser(backward);
EXPECT_EQ("firstuser@test.com", GetActiveUser());
}
// Make sure MultiProfile disabled by primary user policy.
TEST_F(SessionStateDelegateChromeOSTest, MultiProfileDisallowedByUserPolicy) {
InitForMultiProfile();
EXPECT_TRUE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
const std::string user_email(kUser);
user_manager()->LoginUser(user_email);
EXPECT_TRUE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
user_profile_->GetPrefs()->SetString(
prefs::kMultiProfileUserBehavior,
chromeos::MultiProfileUserController::kBehaviorNotAllowed);
EXPECT_FALSE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
}
// Make sure MultiProfile disabled by primary user policy certificates.
TEST_F(SessionStateDelegateChromeOSTest,
MultiProfileDisallowedByPolicyCertificates) {
InitForMultiProfile();
const std::string user_email(kUser);
user_manager()->LoginUser(user_email);
EXPECT_TRUE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
policy::PolicyCertServiceFactory::SetUsedPolicyCertificates(user_email);
EXPECT_FALSE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
// Flush tasks posted to IO.
base::RunLoop().RunUntilIdle();
}
// Make sure MultiProfile disabled by primary user certificates in memory.
TEST_F(SessionStateDelegateChromeOSTest,
MultiProfileDisallowedByPrimaryUserCertificatesInMemory) {
InitForMultiProfile();
const std::string user_email(kUser);
user_manager()->LoginUser(user_email);
EXPECT_TRUE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
cert_verifier_.reset(new policy::PolicyCertVerifier(base::Closure()));
g_policy_cert_verifier_for_factory = cert_verifier_.get();
ASSERT_TRUE(
policy::PolicyCertServiceFactory::GetInstance()->SetTestingFactoryAndUse(
user_profile_, CreateTestPolicyCertService));
policy::PolicyCertService* service =
policy::PolicyCertServiceFactory::GetForProfile(user_profile_);
ASSERT_TRUE(service);
EXPECT_FALSE(service->has_policy_certificates());
net::CertificateList certificates;
certificates.push_back(new net::X509Certificate(
"subject", "issuer", base::Time(), base::Time()));
service->OnTrustAnchorsChanged(certificates);
EXPECT_TRUE(service->has_policy_certificates());
EXPECT_FALSE(
session_state_delegate()->IsMultiProfileAllowedByPrimaryUserPolicy());
// Flush tasks posted to IO.
base::RunLoop().RunUntilIdle();
}
// Make sure adding users to multiprofiles disabled by reaching maximum
// number of users in sessions.
TEST_F(SessionStateDelegateChromeOSTest,
AddUserToMultiprofileDisallowedByMaximumUsers) {
InitForMultiProfile();
ash::SessionStateDelegate::AddUserError add_user_error;
EXPECT_TRUE(
session_state_delegate()->CanAddUserToMultiProfile(&add_user_error));
const std::string user_email(kUser);
user_manager()->LoginUser(user_email);
while (session_state_delegate()->NumberOfLoggedInUsers() <
session_state_delegate()->GetMaximumNumberOfLoggedInUsers()) {
UserAddedToSession("bb@b.b");
}
EXPECT_FALSE(
session_state_delegate()->CanAddUserToMultiProfile(&add_user_error));
EXPECT_EQ(ash::SessionStateDelegate::ADD_USER_ERROR_MAXIMUM_USERS_REACHED,
add_user_error);
}
// Make sure adding users to multiprofiles disabled by logging in all possible
// users.
TEST_F(SessionStateDelegateChromeOSTest,
AddUserToMultiprofileDisallowedByAllUsersLogged) {
InitForMultiProfile();
ash::SessionStateDelegate::AddUserError add_user_error;
EXPECT_TRUE(
session_state_delegate()->CanAddUserToMultiProfile(&add_user_error));
const std::string user_email(kUser);
user_manager()->LoginUser(user_email);
UserAddedToSession("bb@b.b");
EXPECT_FALSE(
session_state_delegate()->CanAddUserToMultiProfile(&add_user_error));
EXPECT_EQ(ash::SessionStateDelegate::ADD_USER_ERROR_OUT_OF_USERS,
add_user_error);
}
// Make sure adding users to multiprofiles disabled by primary user policy.
TEST_F(SessionStateDelegateChromeOSTest,
AddUserToMultiprofileDisallowedByPrimaryUserPolicy) {
InitForMultiProfile();
ash::SessionStateDelegate::AddUserError add_user_error;
EXPECT_TRUE(
session_state_delegate()->CanAddUserToMultiProfile(&add_user_error));
const std::string user_email(kUser);
user_manager()->LoginUser(user_email);
user_profile_->GetPrefs()->SetString(
prefs::kMultiProfileUserBehavior,
chromeos::MultiProfileUserController::kBehaviorNotAllowed);
user_manager()->AddUser("bb@b.b");
EXPECT_FALSE(
session_state_delegate()->CanAddUserToMultiProfile(&add_user_error));
EXPECT_EQ(ash::SessionStateDelegate::ADD_USER_ERROR_NOT_ALLOWED_PRIMARY_USER,
add_user_error);
}
} // namespace chromeos