blob: 29455b25420274b7e32c4ba020a07a938c8637fa [file] [log] [blame]
// Copyright 2022 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/chromeos/extensions/login_screen/login/cleanup/browser_cleanup_handler.h"
#include <memory>
#include <string>
#include "ash/constants/ash_switches.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "chrome/browser/ash/login/test/embedded_policy_test_server_mixin.h"
#include "chrome/browser/ash/login/test/session_manager_state_waiter.h"
#include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/test/browser_test.h"
#include "ui/base/window_open_disposition.h"
namespace {
const char kAccountId[] = "public-session@test";
} // namespace
class BrowserCleanupHandlerTest : public policy::DevicePolicyCrosBrowserTest {
public:
BrowserCleanupHandlerTest(const BrowserCleanupHandlerTest&) = delete;
BrowserCleanupHandlerTest& operator=(const BrowserCleanupHandlerTest&) =
delete;
protected:
BrowserCleanupHandlerTest() = default;
~BrowserCleanupHandlerTest() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
DevicePolicyCrosBrowserTest::SetUpCommandLine(command_line);
command_line->AppendSwitch(ash::switches::kForceLoginManagerInTests);
command_line->AppendSwitchASCII(ash::switches::kLoginProfile, "user");
command_line->AppendSwitch(ash::switches::kOobeSkipPostLogin);
}
void SetUpDeviceLocalAccountPolicy() {
enterprise_management::ChromeDeviceSettingsProto& proto(
device_policy()->payload());
enterprise_management::DeviceLocalAccountsProto* device_local_accounts =
proto.mutable_device_local_accounts();
enterprise_management::DeviceLocalAccountInfoProto* const account =
device_local_accounts->add_account();
account->set_account_id(kAccountId);
account->set_type(enterprise_management::DeviceLocalAccountInfoProto::
ACCOUNT_TYPE_PUBLIC_SESSION);
device_local_accounts->set_auto_login_id(kAccountId);
device_local_accounts->set_auto_login_delay(0);
RefreshDevicePolicy();
policy_test_server_mixin_.UpdateDevicePolicy(proto);
}
void WaitForSessionStart() {
if (session_manager::SessionManager::Get()->IsSessionStarted())
return;
ash::test::WaitForPrimaryUserSessionStart();
}
Profile* GetActiveUserProfile() {
const user_manager::User* active_user =
user_manager::UserManager::Get()->GetActiveUser();
return ash::ProfileHelper::Get()->GetProfileByUser(active_user);
}
void OpenNewBrowserPage(std::string page, WindowOpenDisposition disposition) {
GURL page_url = embedded_test_server()->GetURL(page);
ASSERT_TRUE(ui_test_utils::NavigateToURLWithDisposition(
browser(), page_url, disposition,
ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP));
}
int GetHistorySize() {
ui_test_utils::HistoryEnumerator enumerator(GetActiveUserProfile());
return enumerator.urls().size();
}
void RunBrowserCleanupHandler() {
base::RunLoop run_loop;
auto success_check_callback = base::BindLambdaForTesting(
[&](const absl::optional<std::string>& error) {
EXPECT_EQ(error, absl::nullopt);
run_loop.QuitClosure().Run();
});
std::unique_ptr<chromeos::BrowserCleanupHandler> browser_cleanup_handler =
std::make_unique<chromeos::BrowserCleanupHandler>();
browser_cleanup_handler->Cleanup(success_check_callback);
run_loop.Run();
}
ash::EmbeddedPolicyTestServerMixin policy_test_server_mixin_{&mixin_host_};
};
IN_PROC_BROWSER_TEST_F(BrowserCleanupHandlerTest, Cleanup) {
SetUpDeviceLocalAccountPolicy();
WaitForSessionStart();
ASSERT_TRUE(embedded_test_server()->Start());
OpenNewBrowserPage("/simple.html", WindowOpenDisposition::CURRENT_TAB);
OpenNewBrowserPage("/iframe.html", WindowOpenDisposition::NEW_FOREGROUND_TAB);
OpenNewBrowserPage("/beforeunload.html",
WindowOpenDisposition::NEW_BACKGROUND_TAB);
OpenNewBrowserPage("/unload.html", WindowOpenDisposition::NEW_WINDOW);
OpenNewBrowserPage("/title1.html", WindowOpenDisposition::NEW_WINDOW);
ASSERT_EQ(3U, BrowserList::GetInstance()->size());
ASSERT_EQ(5, GetHistorySize());
RunBrowserCleanupHandler();
ASSERT_TRUE(BrowserList::GetInstance()->empty());
ASSERT_EQ(0, GetHistorySize());
}
IN_PROC_BROWSER_TEST_F(BrowserCleanupHandlerTest, CleanupWhenBrowsersClosed) {
SetUpDeviceLocalAccountPolicy();
WaitForSessionStart();
ASSERT_TRUE(embedded_test_server()->Start());
OpenNewBrowserPage("/simple.html", WindowOpenDisposition::CURRENT_TAB);
BrowserList::CloseAllBrowsersWithProfile(
GetActiveUserProfile(),
/*on_close_success=*/BrowserList::CloseCallback(),
/*on_close_aborted=*/BrowserList::CloseCallback(),
/*skip_beforeunload=*/true);
ui_test_utils::WaitForBrowserToClose();
ASSERT_TRUE(BrowserList::GetInstance()->empty());
ASSERT_EQ(1, GetHistorySize());
RunBrowserCleanupHandler();
ASSERT_TRUE(BrowserList::GetInstance()->empty());
ASSERT_EQ(0, GetHistorySize());
}