Commit 919287d0 authored by Wenzhao Zang's avatar Wenzhao Zang Committed by Commit Bot

cros: Show Powerwash button in case of a fatal demo setup error

Bug: 871412
Change-Id: I5bf054ed6ef4c927253fbad4fe09ec674cc58d39
Reviewed-on: https://chromium-review.googlesource.com/c/1310559Reviewed-by: default avatarAga Wronska <agawronska@chromium.org>
Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Commit-Queue: Wenzhao (Colin) Zang <wzang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605256}
parent 8bc8d513
......@@ -74,8 +74,8 @@ enum class OobeButton { kBack, kNext, kText };
// Dialogs that are a part of Demo Mode setup screens.
enum class DemoSetupDialog { kNetwork, kEula, kProgress, kError };
// Returns js id of the given |button| type.
std::string ButtonToStringId(OobeButton button) {
// Returns the tag of the given |button| type.
std::string ButtonToTag(OobeButton button) {
switch (button) {
case OobeButton::kBack:
return "oobe-back-button";
......@@ -201,32 +201,25 @@ class DemoSetupTest : public LoginManagerTest {
return !js_checker().GetBool(kIsConfirmationDialogHiddenQuery);
}
bool IsDialogShown(OobeScreen screen, DemoSetupDialog dialog) {
const std::string query =
base::StrCat({"!", ScreenToContentQuery(screen), ".$.",
DialogToStringId(dialog), ".hidden"});
return js_checker().GetBool(query);
}
bool IsScreenDialogElementShown(OobeScreen screen,
DemoSetupDialog dialog,
const std::string& element) {
const std::string element_selector = base::StrCat(
const std::string& element_selector) {
const std::string element = base::StrCat(
{ScreenToContentQuery(screen), ".$.", DialogToStringId(dialog),
".querySelector('", element, "')"});
const std::string query = base::StrCat(
{"!!", element_selector, " && !", element_selector, ".hidden"});
".querySelector('", element_selector, "')"});
const std::string query =
base::StrCat({"!!", element, " && !", element, ".hidden"});
return js_checker().GetBool(query);
}
bool IsScreenDialogElementEnabled(OobeScreen screen,
DemoSetupDialog dialog,
const std::string& element) {
const std::string element_selector = base::StrCat(
const std::string& element_selector) {
const std::string element = base::StrCat(
{ScreenToContentQuery(screen), ".$.", DialogToStringId(dialog),
".querySelector('", element, "')"});
const std::string query = base::StrCat(
{"!!", element_selector, " && !", element_selector, ".disabled"});
".querySelector('", element_selector, "')"});
const std::string query =
base::StrCat({"!!", element, " && !", element, ".disabled"});
return js_checker().GetBool(query);
}
......@@ -296,17 +289,17 @@ class DemoSetupTest : public LoginManagerTest {
void ClickOobeButton(OobeScreen screen,
OobeButton button,
JSExecution execution) {
ClickOobeButtonWithId(screen, ButtonToStringId(button), execution);
ClickOobeButtonWithSelector(screen, ButtonToTag(button), execution);
}
// Simulates click on a button with |button_id| on specified OOBE |screen|.
// Can be used for screens that consists of one oobe-dialog element.
void ClickOobeButtonWithId(OobeScreen screen,
const std::string& button_id,
JSExecution execution) {
// Simulates click on a button with |button_selector| on specified OOBE
// |screen|. Can be used for screens that consists of one oobe-dialog element.
void ClickOobeButtonWithSelector(OobeScreen screen,
const std::string& button_selector,
JSExecution execution) {
const std::string query = base::StrCat(
{ScreenToContentQuery(screen), ".$$('oobe-dialog').querySelector('",
button_id, "').click();"});
button_selector, "').click();"});
switch (execution) {
case JSExecution::kAsync:
JSExecuteAsync(query);
......@@ -325,20 +318,20 @@ class DemoSetupTest : public LoginManagerTest {
DemoSetupDialog dialog,
OobeButton button,
JSExecution execution) {
ClickScreenDialogButtonWithId(screen, dialog, ButtonToStringId(button),
execution);
ClickScreenDialogButtonWithSelector(screen, dialog, ButtonToTag(button),
execution);
}
// Simulates click on a button with |button_id| on a |dialog| of the specified
// OOBE |screen|. Can be used for screens that consists of multiple
// Simulates click on a button with |button_selector| on a |dialog| of the
// specified OOBE |screen|. Can be used for screens that consist of multiple
// oobe-dialog elements.
void ClickScreenDialogButtonWithId(OobeScreen screen,
DemoSetupDialog dialog,
const std::string& button_id,
JSExecution execution) {
void ClickScreenDialogButtonWithSelector(OobeScreen screen,
DemoSetupDialog dialog,
const std::string& button_selector,
JSExecution execution) {
const std::string query = base::StrCat(
{ScreenToContentQuery(screen), ".$.", DialogToStringId(dialog),
".querySelector('", button_id, "').click();"});
".querySelector('", button_selector, "').click();"});
switch (execution) {
case JSExecution::kAsync:
JSExecuteAsync(query);
......@@ -364,7 +357,8 @@ class DemoSetupTest : public LoginManagerTest {
void SkipToErrorDialog() {
// Simulate online setup error.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
&MockDemoModeOnlineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_DEFAULT>);
// Enrollment type is set in the part of the flow that is skipped, That is
// why we need to set it here.
......@@ -561,9 +555,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowSuccess) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_TRUE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickOobeButton(OobeScreen::SCREEN_OOBE_NETWORK, OobeButton::kNext,
JSExecution::kAsync);
......@@ -578,10 +572,10 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowSuccess) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
......@@ -594,10 +588,11 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowSuccess) {
EXPECT_TRUE(StartupUtils::IsDeviceRegistered());
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowError) {
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowErrorDefault) {
// Simulate online setup failure.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
&MockDemoModeOnlineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_DEFAULT>);
SimulateNetworkConnected();
InvokeDemoModeWithAccelerator();
......@@ -611,9 +606,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowError) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_TRUE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickOobeButton(OobeScreen::SCREEN_OOBE_NETWORK, OobeButton::kNext,
JSExecution::kAsync);
......@@ -628,10 +623,10 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowError) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
......@@ -643,6 +638,79 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowError) {
// Default error returned by MockDemoModeOnlineEnrollmentHelperCreator.
EXPECT_TRUE(IsErrorMessageShown(IDS_DEMO_SETUP_TEMPORARY_ERROR,
IDS_DEMO_SETUP_RECOVERY_RETRY));
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#retryButton"));
EXPECT_FALSE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#powerwashButton"));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
ButtonToTag(OobeButton::kBack)));
EXPECT_FALSE(StartupUtils::IsOobeCompleted());
EXPECT_FALSE(StartupUtils::IsDeviceRegistered());
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowErrorPowerwashRequired) {
// Simulate online setup failure that requires powerwash.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_POWERWASH_REQUIRED>);
SimulateNetworkConnected();
InvokeDemoModeWithAccelerator();
ClickOkOnConfirmationDialog();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
ClickOobeButton(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES, OobeButton::kText,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickOobeButton(OobeScreen::SCREEN_OOBE_NETWORK, OobeButton::kNext,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_EULA).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_EULA));
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_EULA, DemoSetupDialog::kEula,
OobeButton::kText, JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError);
EXPECT_TRUE(IsErrorMessageShown(IDS_DEMO_SETUP_ALREADY_LOCKED_ERROR,
IDS_DEMO_SETUP_RECOVERY_POWERWASH));
EXPECT_FALSE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#retryButton"));
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#powerwashButton"));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
ButtonToTag(OobeButton::kBack)));
EXPECT_FALSE(StartupUtils::IsOobeCompleted());
EXPECT_FALSE(StartupUtils::IsDeviceRegistered());
}
......@@ -670,9 +738,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowCrosComponentFailure) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_TRUE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickOobeButton(OobeScreen::SCREEN_OOBE_NETWORK, OobeButton::kNext,
JSExecution::kAsync);
......@@ -687,10 +755,10 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowCrosComponentFailure) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
......@@ -727,9 +795,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowSuccess) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_FALSE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
const std::string offline_setup_item_name =
l10n_util::GetStringUTF8(IDS_NETWORK_OFFLINE_DEMO_SETUP_LIST_ITEM_NAME);
......@@ -745,10 +813,10 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowSuccess) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
// TODO(agawronska): Progress dialog transition is async - extra work is
......@@ -759,10 +827,11 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowSuccess) {
EXPECT_TRUE(StartupUtils::IsDeviceRegistered());
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowErrorDefault) {
// Simulate offline setup failure.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_DEFAULT>);
SimulateNetworkDisconnected();
InvokeDemoModeWithAccelerator();
......@@ -780,9 +849,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_FALSE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
const std::string offline_setup_item_name =
l10n_util::GetStringUTF8(IDS_NETWORK_OFFLINE_DEMO_SETUP_LIST_ITEM_NAME);
......@@ -798,10 +867,10 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithId(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
// TODO(agawronska): Progress dialog transition is async - extra work is
......@@ -809,8 +878,83 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError);
// Default error returned by MockDemoModeOfflineEnrollmentHelperCreator.
EXPECT_TRUE(IsErrorMessageShown(IDS_DEMO_SETUP_OFFLINE_POLICY_ERROR,
IDS_DEMO_SETUP_RECOVERY_OFFLINE_FATAL));
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#retryButton"));
EXPECT_FALSE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#powerwashButton"));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
ButtonToTag(OobeButton::kBack)));
EXPECT_FALSE(StartupUtils::IsOobeCompleted());
EXPECT_FALSE(StartupUtils::IsDeviceRegistered());
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowErrorPowerwashRequired) {
// Simulate offline setup failure.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_POWERWASH_REQUIRED>);
SimulateNetworkDisconnected();
InvokeDemoModeWithAccelerator();
ClickOkOnConfirmationDialog();
// It needs to be done after demo setup controller was created (demo setup
// flow was started).
SimulateOfflineEnvironment();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
ClickOobeButton(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES, OobeButton::kText,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
const std::string offline_setup_item_name =
l10n_util::GetStringUTF8(IDS_NETWORK_OFFLINE_DEMO_SETUP_LIST_ITEM_NAME);
ClickNetworkListElement(offline_setup_item_name);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_EULA).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_EULA));
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_EULA, DemoSetupDialog::kEula,
OobeButton::kText, JSExecution::kSync);
OobeScreenWaiter(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE));
SetPlayStoreTermsForTesting();
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-next-button", JSExecution::kSync);
ClickOobeButtonWithSelector(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE,
"#arc-tos-accept-button", JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError);
EXPECT_TRUE(IsErrorMessageShown(IDS_DEMO_SETUP_LOCK_ERROR,
IDS_DEMO_SETUP_RECOVERY_POWERWASH));
EXPECT_FALSE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#retryButton"));
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
"#powerwashButton"));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError,
ButtonToTag(OobeButton::kBack)));
EXPECT_FALSE(StartupUtils::IsOobeCompleted());
EXPECT_FALSE(StartupUtils::IsDeviceRegistered());
......@@ -819,10 +963,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
IN_PROC_BROWSER_TEST_F(DemoSetupTest, NextDisabledOnNetworkScreen) {
SimulateNetworkDisconnected();
SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_FALSE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickOobeButton(OobeScreen::SCREEN_OOBE_NETWORK, OobeButton::kNext,
JSExecution::kSync);
......@@ -833,9 +976,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, NextDisabledOnNetworkScreen) {
IN_PROC_BROWSER_TEST_F(DemoSetupTest, ClickNetworkOnNetworkScreen) {
SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_FALSE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_FALSE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickNetworkListElement(kDefaultNetworkName);
SimulateNetworkConnected();
......@@ -847,9 +990,9 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, ClickNetworkOnNetworkScreen) {
IN_PROC_BROWSER_TEST_F(DemoSetupTest, ClickConnectedNetworkOnNetworkScreen) {
SimulateNetworkConnected();
SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
EXPECT_TRUE(IsScreenDialogElementEnabled(OobeScreen::SCREEN_OOBE_NETWORK,
DemoSetupDialog::kNetwork,
ButtonToTag(OobeButton::kNext)));
ClickNetworkListElement(kDefaultNetworkName);
......@@ -896,13 +1039,11 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, RetryOnErrorScreen) {
// Simulate successful online setup on retry.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError, OobeButton::kText,
JSExecution::kAsync);
ClickScreenDialogButtonWithSelector(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError, "#retryButton",
JSExecution::kAsync);
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
}
......
......@@ -229,12 +229,38 @@ TEST_F(DemoSetupControllerTest, OfflineInvalidDeviceLocalAccountPolicyBlob) {
EXPECT_EQ("", GetDeviceRequisition());
}
TEST_F(DemoSetupControllerTest, OfflineError) {
TEST_F(DemoSetupControllerTest, OfflineErrorDefault) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_DEFAULT>);
policy::MockCloudPolicyStore mock_store;
EXPECT_CALL(mock_store, Store(_)).Times(0);
tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
tested_controller_->set_demo_config(DemoSession::DemoModeConfig::kOffline);
tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_FALSE(helper_->RequiresPowerwash());
EXPECT_EQ("", GetDeviceRequisition());
}
TEST_F(DemoSetupControllerTest, OfflineErrorPowerwashRequired) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_POWERWASH_REQUIRED>);
policy::MockCloudPolicyStore mock_store;
EXPECT_CALL(mock_store, Store(_)).Times(0);
......@@ -268,9 +294,10 @@ TEST_F(DemoSetupControllerTest, OnlineSuccess) {
EXPECT_EQ("", GetDeviceRequisition());
}
TEST_F(DemoSetupControllerTest, OnlineError) {
TEST_F(DemoSetupControllerTest, OnlineErrorDefault) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
&MockDemoModeOnlineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_DEFAULT>);
tested_controller_->set_demo_config(DemoSession::DemoModeConfig::kOnline);
tested_controller_->Enroll(
......@@ -284,6 +311,23 @@ TEST_F(DemoSetupControllerTest, OnlineError) {
EXPECT_EQ("", GetDeviceRequisition());
}
TEST_F(DemoSetupControllerTest, OnlineErrorPowerwashRequired) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_POWERWASH_REQUIRED>);
tested_controller_->set_demo_config(DemoSession::DemoModeConfig::kOnline);
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_TRUE(helper_->RequiresPowerwash());
EXPECT_EQ("", GetDeviceRequisition());
}
TEST_F(DemoSetupControllerTest, OnlineComponentError) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
......@@ -305,7 +349,8 @@ TEST_F(DemoSetupControllerTest, OnlineComponentError) {
TEST_F(DemoSetupControllerTest, EnrollTwice) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
&MockDemoModeOnlineEnrollmentHelperCreator<
DemoModeSetupResult::ERROR_DEFAULT>);
tested_controller_->set_demo_config(DemoSession::DemoModeConfig::kOnline);
tested_controller_->Enroll(
......
......@@ -22,7 +22,12 @@ namespace chromeos {
namespace test {
// Result of Demo Mode setup.
enum class DemoModeSetupResult { SUCCESS, ERROR };
// TODO(agawronska, wzang): Test more error types.
enum class DemoModeSetupResult {
SUCCESS,
ERROR_DEFAULT,
ERROR_POWERWASH_REQUIRED
};
// Helper method that mocks EnterpriseEnrollmentHelper for online Demo Mode
// setup. It simulates specified Demo Mode enrollment |result|.
......@@ -37,14 +42,23 @@ EnterpriseEnrollmentHelper* MockDemoModeOnlineEnrollmentHelperCreator(
EXPECT_EQ(enrollment_config.mode, policy::EnrollmentConfig::MODE_ATTESTATION);
EXPECT_CALL(*mock, EnrollUsingAttestation())
.WillRepeatedly(testing::Invoke([mock]() {
if (result == DemoModeSetupResult::SUCCESS) {
mock->status_consumer()->OnDeviceEnrolled("");
} else {
// TODO(agawronska): Test different error types.
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForRegistrationError(
policy::DeviceManagementStatus::
DM_STATUS_TEMPORARY_UNAVAILABLE));
switch (result) {
case DemoModeSetupResult::SUCCESS:
mock->status_consumer()->OnDeviceEnrolled("");
break;
case DemoModeSetupResult::ERROR_POWERWASH_REQUIRED:
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForLockError(
chromeos::InstallAttributes::LOCK_ALREADY_LOCKED));
break;
case DemoModeSetupResult::ERROR_DEFAULT:
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForRegistrationError(
policy::DeviceManagementStatus::
DM_STATUS_TEMPORARY_UNAVAILABLE));
break;
default:
NOTREACHED();
}
}));
return mock;
......@@ -64,13 +78,22 @@ EnterpriseEnrollmentHelper* MockDemoModeOfflineEnrollmentHelperCreator(
policy::EnrollmentConfig::MODE_OFFLINE_DEMO);
EXPECT_CALL(*mock, EnrollForOfflineDemo())
.WillRepeatedly(testing::Invoke([mock]() {
if (result == DemoModeSetupResult::SUCCESS) {
mock->status_consumer()->OnDeviceEnrolled("");
} else {
// TODO(agawronska): Test different error types.
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForLockError(
chromeos::InstallAttributes::LOCK_READBACK_ERROR));
switch (result) {
case DemoModeSetupResult::SUCCESS:
mock->status_consumer()->OnDeviceEnrolled("");
break;
case DemoModeSetupResult::ERROR_POWERWASH_REQUIRED:
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForLockError(
chromeos::InstallAttributes::LOCK_READBACK_ERROR));
break;
case DemoModeSetupResult::ERROR_DEFAULT:
mock->status_consumer()->OnEnrollmentError(
policy::EnrollmentStatus::ForStatus(
policy::EnrollmentStatus::OFFLINE_POLICY_DECODING_FAILED));
break;
default:
NOTREACHED();
}
}));
return mock;
......
......@@ -8,11 +8,14 @@
#include "chrome/browser/chromeos/login/screens/base_screen_delegate.h"
#include "chrome/browser/chromeos/login/screens/demo_setup_screen_view.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/session_manager_client.h"
namespace {
constexpr char kUserActionStartSetup[] = "start-setup";
constexpr char kUserActionClose[] = "close-setup";
constexpr char kUserActionPowerwash[] = "powerwash";
} // namespace
......@@ -47,6 +50,10 @@ void DemoSetupScreen::OnUserAction(const std::string& action_id) {
StartEnrollment();
} else if (action_id == kUserActionClose) {
Finish(ScreenExitCode::DEMO_MODE_SETUP_CANCELED);
} else if (action_id == kUserActionPowerwash) {
chromeos::DBusThreadManager::Get()
->GetSessionManagerClient()
->StartDeviceWipe();
} else {
BaseScreen::OnUserAction(action_id);
}
......
......@@ -51,12 +51,20 @@
images/alert-illustration_2x.svg 2x">
</div>
<div slot="bottom-buttons" class="layout horizontal justified">
<oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
<oobe-text-button inverse on-tap="onRetryClicked_">
<oobe-back-button inverse on-tap="onCloseClicked_"
disabled="[[isPowerwashRequired_]]"></oobe-back-button>
<oobe-text-button id="retryButton" on-tap="onRetryClicked_"
inverse hidden="[[isPowerwashRequired_]]">
<div>
[[i18nDynamic(locale, 'demoSetupErrorScreenRetryButtonLabel')]]
</div>
</oobe-text-button>
<oobe-text-button id="powerwashButton" on-tap="onPowerwashClicked_"
inverse hidden="[[!isPowerwashRequired_]]">
<div>
[[i18nDynamic(locale, 'demoSetupErrorScreenPowerwashButtonLabel')]]
</div>
</oobe-text-button>
</div>
</oobe-dialog>
......
......@@ -19,6 +19,12 @@ Polymer({
value: '',
},
/** Whether powerwash is required in case of a setup error. */
isPowerwashRequired_: {
type: Boolean,
value: false,
},
/** Ordered array of screen ids that are a part of demo setup flow. */
screens_: {
type: Array,
......@@ -48,9 +54,12 @@ Polymer({
/**
* Called when demo mode setup failed.
* @param {string} message Error message to be displayed to the user.
* @param {boolean} isPowerwashRequired Whether powerwash is required to
* recover from the error.
*/
onSetupFailed: function(message) {
onSetupFailed: function(message, isPowerwashRequired) {
this.errorMessage_ = message;
this.isPowerwashRequired_ = isPowerwashRequired;
this.showScreen_('demoSetupErrorDialog');
},
......@@ -96,11 +105,22 @@ Polymer({
this.reset();
},
/**
* Powerwash button click handler.
* @private
*/
onPowerwashClicked_: function() {
chrome.send('login.DemoSetupScreen.userActed', ['powerwash']);
},
/**
* Close button click handler.
* @private
*/
onCloseClicked_: function() {
// TODO(wzang): Remove this after crbug.com/900640 is fixed.
if (this.isPowerwashRequired_)
return;
chrome.send('login.DemoSetupScreen.userActed', ['close-setup']);
},
});
......@@ -46,6 +46,7 @@
Attributes:
'disabled' - button is disabled when the attribute is set.
(See crbug.com/900640)
'inverse' - makes text white and background blue.
'label-for-aria' - accessibility label.
'border' - adds border to the button.
......@@ -84,6 +85,7 @@
Attributes:
'disabled' - button is disabled when the attribute is set.
(See crbug.com/900640)
'label-for-aria' - accessibility label.
-->
<dom-module id="oobe-back-button">
......
......@@ -45,9 +45,11 @@ login.createScreen('DemoSetupScreen', 'demo-setup', function() {
/**
* Called when demo mode setup failed.
* @param {string} message Error message to be displayed to the user.
* @param {boolean} isPowerwashRequired Whether powerwash is required to
* recover from the error.
*/
onSetupFailed: function(message) {
this.demoSetupModule_.onSetupFailed(message);
onSetupFailed: function(message, isPowerwashRequired) {
this.demoSetupModule_.onSetupFailed(message, isPowerwashRequired);
},
};
});
......@@ -43,10 +43,13 @@ void DemoSetupScreenHandler::Bind(DemoSetupScreen* screen) {
void DemoSetupScreenHandler::OnSetupFailed(
const DemoSetupController::DemoSetupError& error) {
// TODO(wzang): Consider customization for RecoveryMethod::kReboot as well.
CallJS("onSetupFailed",
base::JoinString({error.GetLocalizedErrorMessage(),
error.GetLocalizedRecoveryMessage()},
base::UTF8ToUTF16(" ")));
base::UTF8ToUTF16(" ")),
error.recovery_method() ==
DemoSetupController::DemoSetupError::RecoveryMethod::kPowerwash);
}
void DemoSetupScreenHandler::OnSetupSucceeded() {
......@@ -63,6 +66,8 @@ void DemoSetupScreenHandler::DeclareLocalizedValues(
IDS_OOBE_DEMO_SETUP_ERROR_SCREEN_TITLE);
builder->Add("demoSetupErrorScreenRetryButtonLabel",
IDS_OOBE_DEMO_SETUP_ERROR_SCREEN_RETRY_BUTTON_LABEL);
builder->Add("demoSetupErrorScreenPowerwashButtonLabel",
IDS_LOCAL_STATE_ERROR_POWERWASH_BUTTON);
}
} // namespace chromeos
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment