| Index: chrome/browser/ui/ash/session_controller_client_unittest.cc
|
| diff --git a/chrome/browser/ui/ash/session_controller_client_unittest.cc b/chrome/browser/ui/ash/session_controller_client_unittest.cc
|
| index 661034316ebb325e70607e8b50250f13ec14ac2b..d67ace335d0b772f9b963b50aba6d463f8b28d2a 100644
|
| --- a/chrome/browser/ui/ash/session_controller_client_unittest.cc
|
| +++ b/chrome/browser/ui/ash/session_controller_client_unittest.cc
|
| @@ -17,9 +17,12 @@
|
| #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/browser/supervised_user/supervised_user_service.h"
|
| +#include "chrome/browser/supervised_user/supervised_user_service_factory.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/session_manager/core/session_manager.h"
|
| #include "components/signin/core/account_id/account_id.h"
|
| #include "components/user_manager/user_manager.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| @@ -45,6 +48,69 @@ std::unique_ptr<KeyedService> CreateTestPolicyCertService(
|
| user_manager::UserManager::Get());
|
| }
|
|
|
| +// A user manager that does not set profiles as loaded and notifies observers
|
| +// when users being added to a session.
|
| +class TestChromeUserManager : public FakeChromeUserManager {
|
| + public:
|
| + TestChromeUserManager() = default;
|
| + ~TestChromeUserManager() override = default;
|
| +
|
| + // user_manager::UserManager:
|
| + void UserLoggedIn(const AccountId& account_id,
|
| + const std::string& user_id_hash,
|
| + bool browser_restart) override {
|
| + FakeChromeUserManager::UserLoggedIn(account_id, user_id_hash,
|
| + browser_restart);
|
| + active_user_ = const_cast<user_manager::User*>(FindUser(account_id));
|
| + NotifyOnLogin();
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(TestChromeUserManager);
|
| +};
|
| +
|
| +// A session controller interface implementation that tracks sessions and users.
|
| +class TestSessionController : public ash::mojom::SessionController {
|
| + public:
|
| + TestSessionController() : binding_(this) {}
|
| + ~TestSessionController() override {}
|
| +
|
| + ash::mojom::SessionControllerPtr CreateInterfacePtrAndBind() {
|
| + return binding_.CreateInterfacePtrAndBind();
|
| + }
|
| +
|
| + ash::mojom::SessionInfo* last_session_info() {
|
| + return last_session_info_.get();
|
| + }
|
| +
|
| + ash::mojom::UserSession* last_user_session() {
|
| + return last_user_session_.get();
|
| + }
|
| +
|
| + // ash::mojom::SessionController:
|
| + void SetClient(ash::mojom::SessionControllerClientPtr client) override {}
|
| + void SetSessionInfo(ash::mojom::SessionInfoPtr info) override {
|
| + last_session_info_ = info->Clone();
|
| + }
|
| + void UpdateUserSession(ash::mojom::UserSessionPtr user_session) override {
|
| + last_user_session_ = user_session->Clone();
|
| + }
|
| + void SetUserSessionOrder(
|
| + const std::vector<uint32_t>& user_session_order) override {}
|
| + void StartLock(const StartLockCallback& callback) override {}
|
| + void RunUnlockAnimation(const RunUnlockAnimationCallback& callback) override {
|
| + }
|
| + void NotifyChromeTerminating() override {}
|
| +
|
| + private:
|
| + mojo::Binding<ash::mojom::SessionController> binding_;
|
| +
|
| + ash::mojom::SessionInfoPtr last_session_info_;
|
| + ash::mojom::UserSessionPtr last_user_session_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestSessionController);
|
| +};
|
| +
|
| } // namespace
|
|
|
| class SessionControllerClientTest : public testing::Test {
|
| @@ -53,17 +119,19 @@ class SessionControllerClientTest : public testing::Test {
|
| ~SessionControllerClientTest() override {}
|
|
|
| void SetUp() override {
|
| - // Initialize the UserManager singleton to a fresh FakeChromeUserManager
|
| - // instance.
|
| - user_manager_ = new FakeChromeUserManager;
|
| + testing::Test::SetUp();
|
| +
|
| + // Initialize the UserManager singleton.
|
| + user_manager_ = new TestChromeUserManager;
|
| user_manager_enabler_.reset(
|
| new chromeos::ScopedUserManagerEnabler(user_manager_));
|
|
|
| - testing::Test::SetUp();
|
| + profile_manager_.reset(
|
| + new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
|
| + ASSERT_TRUE(profile_manager_->SetUp());
|
| }
|
|
|
| void TearDown() override {
|
| - testing::Test::TearDown();
|
| user_manager_enabler_.reset();
|
| user_manager_ = nullptr;
|
| // Clear our cached pointer to the PolicyCertVerifier.
|
| @@ -77,6 +145,8 @@ class SessionControllerClientTest : public testing::Test {
|
| // PolicyCertService::OnTrustAnchorsChanged() which is called from
|
| // PolicyCertService::Shutdown()).
|
| base::RunLoop().RunUntilIdle();
|
| +
|
| + testing::Test::TearDown();
|
| }
|
|
|
| // Add and log in a user to the session.
|
| @@ -93,17 +163,20 @@ class SessionControllerClientTest : public testing::Test {
|
| .GetUserEmail();
|
| }
|
|
|
| - FakeChromeUserManager* user_manager() { return user_manager_; }
|
| + TestChromeUserManager* user_manager() { return user_manager_; }
|
|
|
| + // Adds a regular user with a profile.
|
| void InitForMultiProfile() {
|
| - profile_manager_.reset(
|
| - new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
|
| - ASSERT_TRUE(profile_manager_->SetUp());
|
| -
|
| const AccountId account_id(AccountId::FromUserEmail(kUser));
|
| const user_manager::User* user = user_manager()->AddUser(account_id);
|
|
|
| // Note that user profiles are created after user login in reality.
|
| + CreateTestingProfile(user);
|
| + }
|
| +
|
| + // Calls private methods to create a testing profile.
|
| + void CreateTestingProfile(const user_manager::User* user) {
|
| + const AccountId& account_id = user->GetAccountId();
|
| user_profile_ =
|
| profile_manager_->CreateTestingProfile(account_id.GetUserEmail());
|
| user_profile_->set_profile_name(account_id.GetUserEmail());
|
| @@ -115,12 +188,13 @@ class SessionControllerClientTest : public testing::Test {
|
| std::unique_ptr<policy::PolicyCertVerifier> cert_verifier_;
|
| std::unique_ptr<TestingProfileManager> profile_manager_;
|
| TestingProfile* user_profile_;
|
| + session_manager::SessionManager session_manager_;
|
|
|
| private:
|
| std::unique_ptr<chromeos::ScopedUserManagerEnabler> user_manager_enabler_;
|
|
|
| // Owned by |user_manager_enabler_|.
|
| - FakeChromeUserManager* user_manager_ = nullptr;
|
| + TestChromeUserManager* user_manager_ = nullptr;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(SessionControllerClientTest);
|
| };
|
| @@ -141,9 +215,11 @@ TEST_F(SessionControllerClientTest, CyclingThreeUsers) {
|
| UserAddedToSession("firstuser@test.com");
|
| UserAddedToSession("seconduser@test.com");
|
| UserAddedToSession("thirduser@test.com");
|
| - const ash::CycleUserDirection forward = ash::CycleUserDirection::NEXT;
|
| + user_manager()->SwitchActiveUser(
|
| + AccountId::FromUserEmail("firstuser@test.com"));
|
|
|
| // Cycle forward.
|
| + const ash::CycleUserDirection forward = ash::CycleUserDirection::NEXT;
|
| EXPECT_EQ("firstuser@test.com", GetActiveUserEmail());
|
| SessionControllerClient::DoCycleActiveUser(forward);
|
| EXPECT_EQ("seconduser@test.com", GetActiveUserEmail());
|
| @@ -283,3 +359,64 @@ TEST_F(SessionControllerClientTest,
|
| EXPECT_EQ(ash::AddUserSessionPolicy::ERROR_NOT_ALLOWED_PRIMARY_USER,
|
| SessionControllerClient::GetAddUserSessionPolicy());
|
| }
|
| +
|
| +TEST_F(SessionControllerClientTest, SupervisedUser) {
|
| + // Create an object to test and connect it to our test interface.
|
| + SessionControllerClient client;
|
| + TestSessionController session_controller;
|
| + client.session_controller_ = session_controller.CreateInterfacePtrAndBind();
|
| + client.Init();
|
| + SessionControllerClient::FlushForTesting();
|
| +
|
| + // Simulate the login screen. No user session yet.
|
| + session_manager_.SetSessionState(
|
| + session_manager::SessionState::LOGIN_PRIMARY);
|
| + EXPECT_FALSE(session_controller.last_user_session());
|
| +
|
| + // Simulate a supervised user logging in.
|
| + const AccountId account_id(AccountId::FromUserEmail("child@test.com"));
|
| + const user_manager::User* user =
|
| + user_manager()->AddSupervisedUser(account_id);
|
| + ASSERT_TRUE(user);
|
| +
|
| + // Start session. This logs in the user and sends an active user notification.
|
| + // The hash must match the one used by FakeChromeUserManager.
|
| + session_manager_.CreateSession(
|
| + account_id, chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting(
|
| + "child@test.com"));
|
| + SessionControllerClient::FlushForTesting();
|
| +
|
| + // The session controller received session info and user session.
|
| + EXPECT_LT(0u, session_controller.last_user_session()->session_id);
|
| + EXPECT_EQ(user_manager::USER_TYPE_SUPERVISED,
|
| + session_controller.last_user_session()->type);
|
| +
|
| + // Simulate profile creation after login.
|
| + CreateTestingProfile(user);
|
| + user_profile_->SetSupervisedUserId("child-id");
|
| +
|
| + // Simulate supervised user custodians.
|
| + PrefService* prefs = user_profile_->GetPrefs();
|
| + prefs->SetString(prefs::kSupervisedUserCustodianEmail, "parent1@test.com");
|
| + prefs->SetString(prefs::kSupervisedUserSecondCustodianEmail,
|
| + "parent2@test.com");
|
| +
|
| + // Simulate the notification that the profile is ready.
|
| + client.OnLoginUserProfilePrepared(user_profile_);
|
| + base::RunLoop().RunUntilIdle(); // For PostTask and mojo interface.
|
| +
|
| + // The custodians were sent over the mojo interface.
|
| + EXPECT_EQ("parent1@test.com",
|
| + session_controller.last_user_session()->custodian_email);
|
| + EXPECT_EQ("parent2@test.com",
|
| + session_controller.last_user_session()->second_custodian_email);
|
| +
|
| + // Simulate an update to the custodian information.
|
| + prefs->SetString(prefs::kSupervisedUserCustodianEmail, "parent3@test.com");
|
| + client.OnCustodianInfoChanged();
|
| + SessionControllerClient::FlushForTesting();
|
| +
|
| + // The updated custodian was sent over the mojo interface.
|
| + EXPECT_EQ("parent3@test.com",
|
| + session_controller.last_user_session()->custodian_email);
|
| +}
|
|
|