| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/system/user_removal_manager.h" |
| |
| #include <memory> |
| |
| #include "base/functional/bind.h" |
| #include "base/functional/callback.h" |
| #include "base/memory/scoped_refptr.h" |
| #include "base/test/test_mock_time_task_runner.h" |
| #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" |
| #include "chrome/common/pref_names.h" |
| #include "chrome/test/base/scoped_testing_local_state.h" |
| #include "chrome/test/base/testing_browser_process.h" |
| #include "components/account_id/account_id.h" |
| #include "components/user_manager/scoped_user_manager.h" |
| #include "components/user_manager/user_manager.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace ash { |
| |
| namespace { |
| |
| class UserRemovalManagerTest : public testing::Test { |
| public: |
| UserRemovalManagerTest(const UserRemovalManagerTest&) = delete; |
| UserRemovalManagerTest& operator=(const UserRemovalManagerTest&) = delete; |
| |
| protected: |
| UserRemovalManagerTest(); |
| ~UserRemovalManagerTest() override; |
| |
| FakeChromeUserManager* fake_user_manager() { return user_manager_.Get(); } |
| |
| void SetUp() override { |
| testing::Test::SetUp(); |
| fake_user_manager()->AddUser(AccountId::FromUserEmailGaiaId("user1", "1")); |
| fake_user_manager()->AddUser(AccountId::FromUserEmailGaiaId("user2", "2")); |
| fake_user_manager()->AddUser(AccountId::FromUserEmailGaiaId("user3", "3")); |
| fake_user_manager()->AddPublicAccountUser( |
| AccountId::FromUserEmailGaiaId("public1", "4")); |
| } |
| |
| scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
| ScopedTestingLocalState local_state_; |
| user_manager::TypedScopedUserManager<FakeChromeUserManager> user_manager_{ |
| std::make_unique<FakeChromeUserManager>()}; |
| }; |
| |
| UserRemovalManagerTest::UserRemovalManagerTest() |
| : task_runner_(base::MakeRefCounted<base::TestMockTimeTaskRunner>( |
| base::TestMockTimeTaskRunner::Type::kBoundToThread)), |
| local_state_(TestingBrowserProcess::GetGlobal()) {} |
| |
| UserRemovalManagerTest::~UserRemovalManagerTest() = default; |
| |
| } // namespace |
| |
| // Test that the InitiateUserRemoval/RemoveUsersIfNeeded sequence results in |
| // users being removed from the device. |
| TEST_F(UserRemovalManagerTest, TestUserRemovingWorks) { |
| user_removal_manager::InitiateUserRemoval(base::OnceClosure()); |
| EXPECT_TRUE(user_removal_manager::RemoveUsersIfNeeded()); |
| EXPECT_TRUE(fake_user_manager()->GetUsers().empty()); |
| EXPECT_TRUE(local_state_.Get() |
| ->FindPreference(prefs::kRemoveUsersRemoteCommand) |
| ->IsDefaultValue()); |
| } |
| |
| // Test that if Chrome crashes in the middle of the users removal - it does not |
| // try again. |
| TEST_F(UserRemovalManagerTest, TestUserRemovingDoNotRetryOnFailure) { |
| // If explicitly set to false - it means chrome might've crashed during the |
| // previous removal. |
| local_state_.Get()->SetBoolean(prefs::kRemoveUsersRemoteCommand, false); |
| EXPECT_FALSE(user_removal_manager::RemoveUsersIfNeeded()); |
| EXPECT_FALSE(fake_user_manager()->GetUsers().empty()); |
| } |
| |
| // Test that the failsafe timer runs LogOut after 60 seconds. |
| TEST_F(UserRemovalManagerTest, TestFailsafeTimer) { |
| bool log_out_called = false; |
| user_removal_manager::OverrideLogOutForTesting(base::BindOnce( |
| [](bool* log_out_called) { *log_out_called = true; }, &log_out_called)); |
| |
| // This call starts the timer. |
| user_removal_manager::InitiateUserRemoval(base::OnceClosure()); |
| |
| // After 55s the timer is not run yet. |
| task_runner_->FastForwardBy(base::Seconds(55)); |
| EXPECT_FALSE(log_out_called); |
| |
| // After 60s the timer is run. |
| task_runner_->FastForwardBy(base::Seconds(5)); |
| EXPECT_TRUE(log_out_called); |
| } |
| |
| } // namespace ash |