| // 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 "base/command_line.h" |
| #include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chromeos/login/login_manager_test.h" |
| #include "chrome/browser/chromeos/login/oobe_screen.h" |
| #include "chrome/browser/chromeos/login/startup_utils.h" |
| #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" |
| #include "chrome/browser/chromeos/login/ui/webui_login_view.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| #include "chromeos/chromeos_switches.h" |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| #include "chromeos/dbus/fake_power_manager_client.h" |
| #include "chromeos/dbus/fake_session_manager_client.h" |
| #include "chromeos/dbus/fake_update_engine_client.h" |
| #include "components/prefs/pref_service.h" |
| #include "content/public/test/browser_test_utils.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| |
| constexpr char kTestUser1[] = "test-user1@gmail.com"; |
| constexpr char kTestUser1GaiaId[] = "test-user1@gmail.com"; |
| |
| } // namespace |
| |
| class ResetTest : public LoginManagerTest { |
| public: |
| ResetTest() |
| : LoginManagerTest(false, true /* should_initialize_webui */), |
| update_engine_client_(NULL), |
| session_manager_client_(NULL), |
| power_manager_client_(NULL) {} |
| ~ResetTest() override {} |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| LoginManagerTest::SetUpCommandLine(command_line); |
| } |
| |
| // LoginManagerTest overrides: |
| void SetUpInProcessBrowserTestFixture() override { |
| std::unique_ptr<DBusThreadManagerSetter> dbus_setter = |
| chromeos::DBusThreadManager::GetSetterForTesting(); |
| session_manager_client_ = new FakeSessionManagerClient; |
| dbus_setter->SetSessionManagerClient( |
| std::unique_ptr<SessionManagerClient>(session_manager_client_)); |
| power_manager_client_ = new FakePowerManagerClient; |
| dbus_setter->SetPowerManagerClient( |
| std::unique_ptr<PowerManagerClient>(power_manager_client_)); |
| update_engine_client_ = new FakeUpdateEngineClient; |
| dbus_setter->SetUpdateEngineClient( |
| std::unique_ptr<UpdateEngineClient>(update_engine_client_)); |
| |
| LoginManagerTest::SetUpInProcessBrowserTestFixture(); |
| } |
| |
| void RegisterSomeUser() { |
| RegisterUser(AccountId::FromUserEmailGaiaId(kTestUser1, kTestUser1GaiaId)); |
| StartupUtils::MarkOobeCompleted(); |
| } |
| |
| bool JSExecuted(const std::string& script) { |
| return content::ExecuteScript(web_contents(), script); |
| } |
| |
| void InvokeResetScreen() { |
| ASSERT_TRUE(JSExecuted("cr.ui.Oobe.handleAccelerator('reset');")); |
| OobeScreenWaiter(OobeScreen::SCREEN_OOBE_RESET).Wait(); |
| } |
| |
| void InvokeRollbackOption() { |
| ASSERT_TRUE(JSExecuted("cr.ui.Oobe.handleAccelerator('reset');")); |
| } |
| |
| void HideRollbackOption() { |
| ASSERT_TRUE(JSExecuted("cr.ui.Oobe.handleAccelerator('reset');")); |
| } |
| |
| void CloseResetScreen() { |
| ASSERT_TRUE(JSExecuted( |
| "chrome.send('login.ResetScreen.userActed', ['cancel-reset']);")); |
| } |
| |
| void ClickResetButton() { |
| ASSERT_TRUE(JSExecuted( |
| "chrome.send('login.ResetScreen.userActed', ['powerwash-pressed']);")); |
| } |
| |
| void ClickRestartButton() { |
| ASSERT_TRUE(JSExecuted( |
| "chrome.send('login.ResetScreen.userActed', ['restart-pressed']);")); |
| } |
| void ClickToConfirmButton() { |
| ASSERT_TRUE(JSExecuted( |
| "chrome.send('login.ResetScreen.userActed', ['show-confirmation']);")); |
| } |
| void ClickDismissConfirmationButton() { |
| ASSERT_TRUE( |
| JSExecuted("chrome.send('login.ResetScreen.userActed', " |
| "['reset-confirm-dismissed']);")); |
| } |
| |
| FakeUpdateEngineClient* update_engine_client_; |
| FakeSessionManagerClient* session_manager_client_; |
| FakePowerManagerClient* power_manager_client_; |
| }; |
| |
| class ResetFirstAfterBootTest : public ResetTest { |
| public: |
| ~ResetFirstAfterBootTest() override {} |
| |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| LoginManagerTest::SetUpCommandLine(command_line); |
| command_line->AppendSwitch(switches::kFirstExecAfterBoot); |
| } |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(ResetTest, PRE_ShowAndCancel) { |
| RegisterSomeUser(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetTest, ShowAndCancel) { |
| test::OobeJS().ExpectTrue("!!document.querySelector('#reset.hidden')"); |
| InvokeResetScreen(); |
| test::OobeJS().ExpectTrue("!document.querySelector('#reset.hidden')"); |
| CloseResetScreen(); |
| test::OobeJS().ExpectTrue("!!document.querySelector('#reset.hidden')"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetTest, PRE_RestartBeforePowerwash) { |
| RegisterSomeUser(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) { |
| PrefService* prefs = g_browser_process->local_state(); |
| |
| InvokeResetScreen(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| ClickRestartButton(); |
| ASSERT_EQ(1, power_manager_client_->num_request_restart_calls()); |
| ASSERT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| |
| EXPECT_TRUE(prefs->GetBoolean(prefs::kFactoryResetRequested)); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ViewsLogic) { |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| RegisterSomeUser(); |
| update_engine_client_->set_can_rollback_check_result(false); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ViewsLogic) { |
| PrefService* prefs = g_browser_process->local_state(); |
| |
| // Rollback unavailable. Show and cancel. |
| update_engine_client_->set_can_rollback_check_result(false); |
| test::OobeJS().ExpectTrue("document.querySelector('#reset').hidden"); |
| test::OobeJS().ExpectTrue("document.querySelector('#overlay-reset').hidden"); |
| InvokeResetScreen(); |
| test::OobeJS().ExpectTrue("!document.querySelector('#reset').hidden"); |
| test::OobeJS().ExpectTrue("document.querySelector('#overlay-reset').hidden"); |
| CloseResetScreen(); |
| test::OobeJS().ExpectTrue("document.querySelector('#reset').hidden"); |
| |
| // Go to confirmation phase, cancel from there in 2 steps. |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| InvokeResetScreen(); |
| test::OobeJS().ExpectTrue("document.querySelector('#overlay-reset').hidden"); |
| ClickToConfirmButton(); |
| test::OobeJS().ExpectTrue("!document.querySelector('#overlay-reset').hidden"); |
| ClickDismissConfirmationButton(); |
| test::OobeJS().ExpectTrue("document.querySelector('#overlay-reset').hidden"); |
| test::OobeJS().ExpectTrue("!document.querySelector('#reset').hidden"); |
| CloseResetScreen(); |
| test::OobeJS().ExpectTrue("document.querySelector('#reset').hidden"); |
| |
| // 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().ExpectTrue("document.querySelector('#overlay-reset').hidden"); |
| ClickToConfirmButton(); |
| test::OobeJS().ExpectTrue("!document.querySelector('#overlay-reset').hidden"); |
| ClickDismissConfirmationButton(); |
| test::OobeJS().ExpectTrue("document.querySelector('#overlay-reset').hidden"); |
| test::OobeJS().ExpectTrue("!document.querySelector('#reset').hidden"); |
| CloseResetScreen(); |
| test::OobeJS().ExpectTrue("document.querySelector('#reset').hidden"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ShowAfterBootIfRequested) { |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| RegisterSomeUser(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ShowAfterBootIfRequested) { |
| OobeScreenWaiter(OobeScreen::SCREEN_OOBE_RESET).Wait(); |
| test::OobeJS().ExpectTrue("!document.querySelector('#reset').hidden"); |
| CloseResetScreen(); |
| test::OobeJS().ExpectTrue("document.querySelector('#reset').hidden"); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) { |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| RegisterSomeUser(); |
| } |
| |
| // Disabled due to flakiness (crbug.com/870284) |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, DISABLED_RollbackUnavailable) { |
| update_engine_client_->set_can_rollback_check_result(false); |
| |
| InvokeResetScreen(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| InvokeRollbackOption(); // No changes |
| ClickToConfirmButton(); |
| ClickResetButton(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(1, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| CloseResetScreen(); |
| OobeScreenWaiter(OobeScreen::SCREEN_ACCOUNT_PICKER).Wait(); |
| |
| // Next invocation leads to rollback view. |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| InvokeResetScreen(); |
| ClickToConfirmButton(); |
| ClickResetButton(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(2, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| CloseResetScreen(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackAvailable) { |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| RegisterSomeUser(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackAvailable) { |
| update_engine_client_->set_can_rollback_check_result(true); |
| PrefService* prefs = g_browser_process->local_state(); |
| |
| InvokeResetScreen(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| ClickToConfirmButton(); |
| ClickResetButton(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(1, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| CloseResetScreen(); |
| OobeScreenWaiter(OobeScreen::SCREEN_ACCOUNT_PICKER).Wait(); |
| |
| // Next invocation leads to simple reset, not rollback view. |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| InvokeResetScreen(); |
| InvokeRollbackOption(); // Shows rollback. |
| ClickDismissConfirmationButton(); |
| CloseResetScreen(); |
| InvokeResetScreen(); |
| ClickToConfirmButton(); |
| ClickResetButton(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(2, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| CloseResetScreen(); |
| OobeScreenWaiter(OobeScreen::SCREEN_ACCOUNT_PICKER).Wait(); |
| |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| InvokeResetScreen(); |
| InvokeRollbackOption(); // Shows rollback. |
| ClickToConfirmButton(); |
| ClickResetButton(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(2, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(1, update_engine_client_->rollback_call_count()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ErrorOnRollbackRequested) { |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| RegisterSomeUser(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ErrorOnRollbackRequested) { |
| update_engine_client_->set_can_rollback_check_result(true); |
| OobeScreenWaiter(OobeScreen::SCREEN_OOBE_RESET).Wait(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| test::OobeJS().ExpectTrue( |
| "!$('reset').classList.contains('revert-promise-view')"); |
| InvokeRollbackOption(); |
| ClickToConfirmButton(); |
| ClickResetButton(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(1, update_engine_client_->rollback_call_count()); |
| test::OobeJS().ExpectTrue( |
| "$('reset').classList.contains('revert-promise-view')"); |
| UpdateEngineClient::Status error_update_status; |
| error_update_status.status = UpdateEngineClient::UPDATE_STATUS_ERROR; |
| update_engine_client_->NotifyObserversThatStatusChanged(error_update_status); |
| OobeScreenWaiter(OobeScreen::SCREEN_ERROR_MESSAGE).Wait(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RevertAfterCancel) { |
| PrefService* prefs = g_browser_process->local_state(); |
| prefs->SetBoolean(prefs::kFactoryResetRequested, true); |
| RegisterSomeUser(); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RevertAfterCancel) { |
| update_engine_client_->set_can_rollback_check_result(true); |
| OobeScreenWaiter(OobeScreen::SCREEN_OOBE_RESET).Wait(); |
| EXPECT_EQ(0, power_manager_client_->num_request_restart_calls()); |
| EXPECT_EQ(0, session_manager_client_->start_device_wipe_call_count()); |
| EXPECT_EQ(0, update_engine_client_->rollback_call_count()); |
| test::OobeJS().ExpectTrue( |
| "!$('reset').classList.contains('rollback-proposal-view')"); |
| InvokeRollbackOption(); |
| test::OobeJS().ExpectTrue( |
| "$('reset').classList.contains('rollback-proposal-view')"); |
| CloseResetScreen(); |
| InvokeResetScreen(); |
| OobeScreenWaiter(OobeScreen::SCREEN_OOBE_RESET).Wait(); |
| InvokeRollbackOption(); |
| test::OobeJS().ExpectTrue( |
| "$('reset').classList.contains('rollback-proposal-view')"); |
| } |
| |
| } // namespace chromeos |