blob: 3aab402b7f0e23f1d67706f8a56738830089e9ad [file] [log] [blame]
// Copyright 2014 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 <string>
#include "ash/public/cpp/login_screen_test_api.h"
#include "base/command_line.h"
#include "base/scoped_observer.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/login/login_wizard.h"
#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/chromeos/login/screens/reset_screen.h"
#include "chrome/browser/chromeos/login/startup_utils.h"
#include "chrome/browser/chromeos/login/test/js_checker.h"
#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/test/oobe_window_visibility_waiter.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h"
#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/mixin_based_in_process_browser_test.h"
#include "chromeos/constants/chromeos_switches.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/fake_update_engine_client.h"
#include "chromeos/dbus/power/fake_power_manager_client.h"
#include "chromeos/dbus/session_manager/fake_session_manager_client.h"
#include "chromeos/dbus/session_manager/session_manager_client.h"
#include "chromeos/dbus/shill/shill_manager_client.h"
#include "components/prefs/pref_service.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_launcher.h"
#include "content/public/test/test_utils.h"
namespace chromeos {
namespace {
constexpr char kTestUser1[] = "test-user1@gmail.com";
constexpr char kTestUser1GaiaId[] = "test-user1@gmail.com";
void InvokeRollbackOption() {
test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');");
}
void CloseResetScreen() {
test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', ['cancel-reset']);");
}
void ClickResetButton() {
test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', ['powerwash-pressed']);");
}
void ClickRestartButton() {
test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', ['restart-pressed']);");
}
void ClickToConfirmButton() {
test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', ['show-confirmation']);");
}
void ClickDismissConfirmationButton() {
test::ExecuteOobeJS(
"chrome.send('login.ResetScreen.userActed', "
"['reset-confirm-dismissed']);");
}
// Helper class that tracks whether 'login-prompt-visible' signal was requested
// from the session manager service.
class LoginPromptVisibleObserver : public SessionManagerClient::Observer {
public:
explicit LoginPromptVisibleObserver(
SessionManagerClient* session_manager_client) {
observer_.Add(session_manager_client);
}
~LoginPromptVisibleObserver() override = default;
bool signal_emitted() const { return signal_emitted_; }
// SessionManagerClient::Observer:
void EmitLoginPromptVisibleCalled() override {
ASSERT_FALSE(signal_emitted_);
signal_emitted_ = true;
}
private:
bool signal_emitted_ = false;
ScopedObserver<SessionManagerClient, LoginPromptVisibleObserver> observer_{
this};
DISALLOW_COPY_AND_ASSIGN(LoginPromptVisibleObserver);
};
} // namespace
class ResetTest : public MixinBasedInProcessBrowserTest {
public:
ResetTest() = default;
~ResetTest() override = default;
// LoginManagerTest overrides:
void SetUpInProcessBrowserTestFixture() override {
std::unique_ptr<DBusThreadManagerSetter> dbus_setter =
chromeos::DBusThreadManager::GetSetterForTesting();
update_engine_client_ = new FakeUpdateEngineClient;
dbus_setter->SetUpdateEngineClient(
std::unique_ptr<UpdateEngineClient>(update_engine_client_));
SessionManagerClient::InitializeFakeInMemory();
login_prompt_visible_observer_ =
std::make_unique<LoginPromptVisibleObserver>(
SessionManagerClient::Get());
MixinBasedInProcessBrowserTest::SetUpInProcessBrowserTestFixture();
}
void TearDownOnMainThread() override {
login_prompt_visible_observer_.reset();
MixinBasedInProcessBrowserTest::TearDownOnMainThread();
}
// Simulates reset screen request from views based login.
void InvokeResetScreen() {
chromeos::LoginDisplayHost::default_host()->ShowResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait();
}
FakeUpdateEngineClient* update_engine_client_ = nullptr;
std::unique_ptr<LoginPromptVisibleObserver> login_prompt_visible_observer_;
private:
LoginManagerMixin::TestUserInfo test_user_{
AccountId::FromUserEmailGaiaId(kTestUser1, kTestUser1GaiaId)};
LoginManagerMixin login_manager_mixin_{&mixin_host_, {test_user_}};
DISALLOW_COPY_AND_ASSIGN(ResetTest);
};
class ResetOobeTest : public OobeBaseTest {
public:
ResetOobeTest() = default;
~ResetOobeTest() override = default;
// OobeBaseTest:
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitch(switches::kFirstExecAfterBoot);
OobeBaseTest::SetUpCommandLine(command_line);
}
void SetUpInProcessBrowserTestFixture() override {
std::unique_ptr<DBusThreadManagerSetter> dbus_setter =
chromeos::DBusThreadManager::GetSetterForTesting();
update_engine_client_ = new FakeUpdateEngineClient;
dbus_setter->SetUpdateEngineClient(
std::unique_ptr<UpdateEngineClient>(update_engine_client_));
OobeBaseTest::SetUpInProcessBrowserTestFixture();
}
// Simulates reset screen request from OOBE UI.
void InvokeResetScreen() {
test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');");
}
FakeUpdateEngineClient* update_engine_client_ = nullptr;
private:
DISALLOW_COPY_AND_ASSIGN(ResetOobeTest);
};
class ResetFirstAfterBootTest : public ResetTest {
public:
~ResetFirstAfterBootTest() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
ResetTest::SetUpCommandLine(command_line);
command_line->AppendSwitch(switches::kFirstExecAfterBoot);
}
void SetUpOnMainThread() override {
DBusThreadManager::Get()
->GetShillManagerClient()
->GetTestInterface()
->SetupDefaultEnvironment();
}
};
class ResetFirstAfterBootTestWithRollback : public ResetTest {
public:
~ResetFirstAfterBootTestWithRollback() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
ResetTest::SetUpCommandLine(command_line);
command_line->AppendSwitch(switches::kFirstExecAfterBoot);
}
void SetUpInProcessBrowserTestFixture() override {
ResetTest::SetUpInProcessBrowserTestFixture();
update_engine_client_->set_can_rollback_check_result(true);
}
};
class ResetTestWithTpmFirmwareUpdate : public ResetTest {
public:
ResetTestWithTpmFirmwareUpdate() = default;
~ResetTestWithTpmFirmwareUpdate() override = default;
// ResetTest:
void SetUpCommandLine(base::CommandLine* command_line) override {
ResetTest::SetUpCommandLine(command_line);
if (!content::IsPreTest())
command_line->AppendSwitch(switches::kFirstExecAfterBoot);
}
void SetUpInProcessBrowserTestFixture() override {
tpm_firmware_update_checker_callback_ = base::BindRepeating(
&ResetTestWithTpmFirmwareUpdate::HandleTpmFirmwareUpdateCheck,
base::Unretained(this));
ResetScreen::SetTpmFirmwareUpdateCheckerForTesting(
&tpm_firmware_update_checker_callback_);
ResetTest::SetUpInProcessBrowserTestFixture();
}
void TearDownInProcessBrowserTestFixture() override {
ResetTest::TearDownInProcessBrowserTestFixture();
ResetScreen::SetTpmFirmwareUpdateCheckerForTesting(nullptr);
}
bool HasPendingTpmFirmwareUpdateCheck() const {
return !pending_tpm_firmware_update_check_.is_null();
}
void FinishPendingTpmFirmwareUpdateCheck(
const std::set<tpm_firmware_update::Mode>& modes) {
std::move(pending_tpm_firmware_update_check_).Run(modes);
}
private:
void HandleTpmFirmwareUpdateCheck(
ResetScreen::TpmFirmwareUpdateAvailabilityCallback callback,
base::TimeDelta delay) {
EXPECT_EQ(delay, base::TimeDelta::FromSeconds(10));
// Multiple checks are technically allowed, but not needed by these tests.
ASSERT_FALSE(pending_tpm_firmware_update_check_);
pending_tpm_firmware_update_check_ = std::move(callback);
}
ResetScreen::TpmFirmwareUpdateAvailabilityCallback
pending_tpm_firmware_update_check_;
ResetScreen::TpmFirmwareUpdateAvailabilityChecker
tpm_firmware_update_checker_callback_;
};
IN_PROC_BROWSER_TEST_F(ResetTest, ShowAndCancel) {
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
test::OobeJS().ExpectVisible("reset");
CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
}
IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) {
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
PrefService* prefs = g_browser_process->local_state();
InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
ClickRestartButton();
ASSERT_EQ(1, FakePowerManagerClient::Get()->num_request_restart_calls());
ASSERT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_TRUE(prefs->GetBoolean(prefs::kFactoryResetRequested));
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
}
IN_PROC_BROWSER_TEST_F(ResetOobeTest, ResetOnWelcomeScreen) {
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait();
test::OobeJS().ExpectVisible("reset");
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
}
IN_PROC_BROWSER_TEST_F(ResetOobeTest, RequestAndCancleResetOnWelcomeScreen) {
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait();
test::OobeJS().ExpectVisible("reset");
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen();
OobeScreenWaiter(WelcomeView::kScreenId).Wait();
test::OobeJS().ExpectHidden("reset");
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
}
// See http://crbug.com/990362 for details.
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, DISABLED_PRE_ViewsLogic) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
update_engine_client_->set_can_rollback_check_result(false);
}
// See http://crbug.com/990362 for details.
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, DISABLED_ViewsLogic) {
PrefService* prefs = g_browser_process->local_state();
// Rollback unavailable. Show and cancel.
update_engine_client_->set_can_rollback_check_result(false);
InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
test::OobeJS().CreateVisibilityWaiter(true, {"reset"})->Wait();
test::OobeJS().ExpectHidden("overlay-reset");
CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Go to confirmation phase, cancel from there in 2 steps.
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"overlay-reset"})->Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ClickToConfirmButton();
test::OobeJS().CreateVisibilityWaiter(true, {"overlay-reset"})->Wait();
ClickDismissConfirmationButton();
test::OobeJS().CreateVisibilityWaiter(false, {"overlay-reset"})->Wait();
test::OobeJS().CreateVisibilityWaiter(true, {"reset"})->Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Rollback available. Show and cancel from confirmation screen.
update_engine_client_->set_can_rollback_check_result(true);
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen();
InvokeRollbackOption();
test::OobeJS().ExpectHidden("overlay-reset");
ClickToConfirmButton();
test::OobeJS().CreateVisibilityWaiter(true, {"overlay-reset"})->Wait();
ClickDismissConfirmationButton();
test::OobeJS().CreateVisibilityWaiter(false, {"overlay-reset"})->Wait();
test::OobeJS().ExpectVisible("reset");
CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ShowAfterBootIfRequested) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ShowAfterBootIfRequested) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
test::OobeJS().CreateVisibilityWaiter(true, {"reset"})->Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen();
test::OobeJS().CreateVisibilityWaiter(false, {"reset"})->Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackUnavailable) {
InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
InvokeRollbackOption(); // No changes
ClickToConfirmButton();
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Next invocation leads to rollback view.
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen();
ClickToConfirmButton();
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen();
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
PRE_RollbackAvailable) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
}
// See http://crbug.com/990362 for details.
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
DISABLED_RollbackAvailable) {
PrefService* prefs = g_browser_process->local_state();
// PRE test triggers start with Reset screen.
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
ClickToConfirmButton();
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
// Next invocation leads to simple reset, not rollback view.
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeRollbackOption(); // Shows rollback.
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
ClickDismissConfirmationButton();
EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown());
CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
InvokeResetScreen();
ClickToConfirmButton();
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown());
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
InvokeResetScreen();
InvokeRollbackOption(); // Shows rollback.
ClickToConfirmButton();
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(1, update_engine_client_->rollback_call_count());
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
PRE_ErrorOnRollbackRequested) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
ErrorOnRollbackRequested) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
test::OobeJS().ExpectHasNoClass("revert-promise-view", {"reset"});
InvokeRollbackOption();
ClickToConfirmButton();
ClickResetButton();
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(1, update_engine_client_->rollback_call_count());
test::OobeJS().ExpectHasClass("revert-promise-view", {"reset"});
update_engine::StatusResult error_update_status;
error_update_status.set_current_operation(update_engine::Operation::ERROR);
update_engine_client_->NotifyObserversThatStatusChanged(error_update_status);
OobeScreenWaiter(ErrorScreenView::kScreenId).Wait();
// Clicking 'ok' on the error screen will either show the previous OOBE screen
// or show the login screen. Here login screen should appear because there's
// no previous screen.
test::OobeJS().TapOnPath({"error-message-md-ok-button"});
OobeWindowVisibilityWaiter(false).Wait();
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback,
PRE_RevertAfterCancel) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
}
IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, RevertAfterCancel) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(0, update_engine_client_->rollback_call_count());
test::OobeJS().ExpectVisible("reset");
test::OobeJS().ExpectHasNoClass("rollback-proposal-view", {"reset"});
InvokeRollbackOption();
test::OobeJS()
.CreateHasClassWaiter(true, "rollback-proposal-view", {"reset"})
->Wait();
CloseResetScreen();
OobeScreenExitWaiter(ResetView::kScreenId).Wait();
InvokeResetScreen();
OobeScreenWaiter(ResetView::kScreenId).Wait();
InvokeRollbackOption();
test::OobeJS()
.CreateHasClassWaiter(true, "rollback-proposal-view", {"reset"})
->Wait();
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_ResetFromSigninWithFirmwareUpdate) {
InvokeResetScreen();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
test::OobeJS().ExpectHiddenPath({"oobe-reset-md", "tpmFirmwareUpdate"});
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
test::OobeJS().ExpectHiddenPath({"oobe-reset-md", "tpmFirmwareUpdate"});
ClickRestartButton();
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
ResetFromSigninWithFirmwareUpdate) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"})
->Wait();
test::OobeJS().Evaluate(
test::GetOobeElementPath({"oobe-reset-md", "tpmFirmwareUpdateCheckbox"}) +
".fire('click')");
ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
1,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
EXPECT_EQ("first_boot",
FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode());
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_TpmFirmwareUpdateAvailableButNotSelected) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
TpmFirmwareUpdateAvailableButNotSelected) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash});
test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"})
->Wait();
ClickResetButton();
EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_ResetWithTpmCleanUp) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode,
static_cast<int>(tpm_firmware_update::Mode::kCleanup));
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ResetWithTpmCleanUp) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"})
->Wait();
ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kCleanup});
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
1,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
EXPECT_EQ("cleanup",
FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode());
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_ResetWithTpmUpdatePreservingDeviceState) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
prefs->SetInteger(
prefs::kFactoryResetTPMFirmwareUpdateMode,
static_cast<int>(tpm_firmware_update::Mode::kPreserveDeviceState));
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
ResetWithTpmUpdatePreservingDeviceState) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"})
->Wait();
ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck(
{tpm_firmware_update::Mode::kPreserveDeviceState,
tpm_firmware_update::Mode::kPowerwash});
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
1,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
EXPECT_EQ("preserve_stateful",
FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode());
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_TpmFirmwareUpdateRequestedBeforeShowNotEditable) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode,
static_cast<int>(tpm_firmware_update::Mode::kPowerwash));
}
// Tests that clicking TPM firmware update checkbox is no-op if the update was
// requested before the Reset screen was shown (e.g. on previous boot in
// settings, or by policy).
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
TpmFirmwareUpdateRequestedBeforeShowNotEditable) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"})
->Wait();
test::OobeJS().Evaluate(
test::GetOobeElementPath({"oobe-reset-md", "tpmFirmwareUpdateCheckbox"}) +
".fire('click')");
ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck(
{tpm_firmware_update::Mode::kPreserveDeviceState,
tpm_firmware_update::Mode::kPowerwash});
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
1,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
EXPECT_EQ("first_boot",
FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode());
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
PRE_AvailableTpmUpdateModesChangeDuringRequest) {
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode,
static_cast<int>(tpm_firmware_update::Mode::kPowerwash));
}
IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate,
AvailableTpmUpdateModesChangeDuringRequest) {
OobeScreenWaiter(ResetView::kScreenId).Wait();
EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted());
EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck());
test::OobeJS()
.CreateVisibilityWaiter(true, {"oobe-reset-md", "tpmFirmwareUpdate"})
->Wait();
ClickResetButton();
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
FinishPendingTpmFirmwareUpdateCheck({});
EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
EXPECT_EQ(
0,
FakeSessionManagerClient::Get()->start_tpm_firmware_update_call_count());
}
} // namespace chromeos