Commit adde4173 authored by Muhammad Hasan Khan's avatar Muhammad Hasan Khan Committed by Chromium LUCI CQ

arc: add error code to sign-in and check-in failure message

There are multiple reasons for which we show same message in case of
sign-in and check-in failure so we're adding an error code on the UI
to help distinguish the underlying reasons.

BUG=b:166322619
TEST=deploy to DUT, force the sign-in failure, verify message is shown

Change-Id: If8e758d02777c3aaa5ced74ac44eaa54dee8a59e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2569988
Commit-Queue: Muhammad Hasan Khan <mhasank@chromium.org>
Reviewed-by: default avatarHidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833795}
parent fc868f17
...@@ -4076,13 +4076,13 @@ ...@@ -4076,13 +4076,13 @@
Network connection was lost. Please check your connection or try another Wi-Fi network. Network connection was lost. Please check your connection or try another Wi-Fi network.
</message> </message>
<message name="IDS_ARC_SIGN_IN_SERVICE_UNAVAILABLE_ERROR" desc="Android sign-in error because of service is unavailable"> <message name="IDS_ARC_SIGN_IN_SERVICE_UNAVAILABLE_ERROR" desc="Android sign-in error because of service is unavailable">
Couldn't reach Google Play Couldn't reach Google Play. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
</message> </message>
<message name="IDS_ARC_SIGN_IN_BAD_AUTHENTICATION_ERROR" desc="Android sign-in error because of bad authentification"> <message name="IDS_ARC_SIGN_IN_BAD_AUTHENTICATION_ERROR" desc="Android sign-in error because of bad authentification">
Couldn’t verify your account. Please try again or restart your Chromebook. Couldn’t verify your account. Please try again or restart your Chromebook.
</message> </message>
<message name="IDS_ARC_SIGN_IN_GMS_NOT_AVAILABLE_ERROR" desc="Android sign-in error because of GMS services are unavailable"> <message name="IDS_ARC_SIGN_IN_GMS_NOT_AVAILABLE_ERROR" desc="Android sign-in error because of GMS services are unavailable">
Couldn’t connect with Google services Couldn’t connect with Google services. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
</message> </message>
<message name="IDS_ARC_SIGN_IN_CLOUD_PROVISION_FLOW_ACCOUNT_MISSING_ERROR" desc="Android permament sign-in error because of cloud provision flow failed"> <message name="IDS_ARC_SIGN_IN_CLOUD_PROVISION_FLOW_ACCOUNT_MISSING_ERROR" desc="Android permament sign-in error because of cloud provision flow failed">
Provisioning failed because your account details could not be retrieved. Please try again. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>. Provisioning failed because your account details could not be retrieved. Please try again. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
......
eaaf2e943790d476190c1cdd3773126e69885b25
\ No newline at end of file
23edc2c2d9a9bda258271892611221de55f5b0a8
\ No newline at end of file
...@@ -376,6 +376,8 @@ void ArcSupportHost::ShowError(ErrorInfo error_info, ...@@ -376,6 +376,8 @@ void ArcSupportHost::ShowError(ErrorInfo error_info,
case Error::SIGN_IN_CLOUD_PROVISION_FLOW_NETWORK_ERROR: case Error::SIGN_IN_CLOUD_PROVISION_FLOW_NETWORK_ERROR:
case Error::SIGN_IN_CLOUD_PROVISION_FLOW_PERMANENT_ERROR: case Error::SIGN_IN_CLOUD_PROVISION_FLOW_PERMANENT_ERROR:
case Error::SIGN_IN_CLOUD_PROVISION_FLOW_TRANSIENT_ERROR: case Error::SIGN_IN_CLOUD_PROVISION_FLOW_TRANSIENT_ERROR:
case Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR:
case Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR:
case Error::SIGN_IN_UNKNOWN_ERROR: case Error::SIGN_IN_UNKNOWN_ERROR:
DCHECK(error_info.arg); DCHECK(error_info.arg);
message = l10n_util::GetStringFUTF16( message = l10n_util::GetStringFUTF16(
......
...@@ -1141,12 +1141,55 @@ class ArcSessionManagerArcAlwaysStartTest : public ArcSessionManagerTest { ...@@ -1141,12 +1141,55 @@ class ArcSessionManagerArcAlwaysStartTest : public ArcSessionManagerTest {
DISALLOW_COPY_AND_ASSIGN(ArcSessionManagerArcAlwaysStartTest); DISALLOW_COPY_AND_ASSIGN(ArcSessionManagerArcAlwaysStartTest);
}; };
ArcProvisioningResult CreateProvisioningResult(
const absl::variant<arc::mojom::GeneralSignInError,
arc::mojom::GMSSignInError,
arc::mojom::GMSCheckInError,
arc::mojom::CloudProvisionFlowError,
ArcStopReason,
ChromeProvisioningTimeout>& error) {
if (absl::holds_alternative<arc::mojom::GeneralSignInError>(error)) {
return ArcProvisioningResult(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewGeneralError(
absl::get<arc::mojom::GeneralSignInError>(error))));
}
if (absl::holds_alternative<arc::mojom::GMSSignInError>(error)) {
return ArcProvisioningResult(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewSignInError(
absl::get<arc::mojom::GMSSignInError>(error))));
}
if (absl::holds_alternative<arc::mojom::GMSCheckInError>(error)) {
return ArcProvisioningResult(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewCheckInError(
absl::get<arc::mojom::GMSCheckInError>(error))));
}
if (absl::holds_alternative<arc::mojom::CloudProvisionFlowError>(error)) {
return ArcProvisioningResult(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewCloudProvisionFlowError(
absl::get<arc::mojom::CloudProvisionFlowError>(error))));
}
if (absl::holds_alternative<ArcStopReason>(error))
return ArcProvisioningResult(absl::get<ArcStopReason>(error));
return ArcProvisioningResult(ChromeProvisioningTimeout{});
}
struct ProvisioningErrorDisplayTestParam { struct ProvisioningErrorDisplayTestParam {
// the reason for arc instance stopping // the reason for arc instance stopping
ArcStopReason stop_reason; absl::variant<arc::mojom::GeneralSignInError,
arc::mojom::GMSSignInError,
arc::mojom::GMSCheckInError,
arc::mojom::CloudProvisionFlowError,
ArcStopReason,
ChromeProvisioningTimeout>
error;
// the error sent to arc support host // the error sent to arc support host
ArcSupportHost::Error error; ArcSupportHost::Error message;
// the error code sent to arc support host // the error code sent to arc support host
base::Optional<int> arg; base::Optional<int> arg;
...@@ -1160,7 +1203,16 @@ constexpr ProvisioningErrorDisplayTestParam ...@@ -1160,7 +1203,16 @@ constexpr ProvisioningErrorDisplayTestParam
ArcSupportHost::Error::LOW_DISK_SPACE_ERROR, ArcSupportHost::Error::LOW_DISK_SPACE_ERROR,
{}}, {}},
{ArcStopReason::CRASH, ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR, {ArcStopReason::CRASH, ArcSupportHost::Error::SIGN_IN_UNKNOWN_ERROR,
8 /*ARC_STOPPED*/}}; 8 /*ARC_STOPPED*/},
{arc::mojom::GMSSignInError::GMS_SIGN_IN_NETWORK_ERROR,
ArcSupportHost::Error::SIGN_IN_NETWORK_ERROR,
1 /*GMS_SIGN_IN_NETWORK_ERROR*/},
{arc::mojom::GMSSignInError::GMS_SIGN_IN_TIMEOUT,
ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR,
5 /*GMS_SIGN_IN_TIMEOUT*/},
{arc::mojom::GMSCheckInError::GMS_CHECK_IN_TIMEOUT,
ArcSupportHost::Error::SIGN_IN_GMS_NOT_AVAILABLE_ERROR,
2 /*GMS_CHECK_IN_TIMEOUT*/}};
class ProvisioningErrorDisplayTest class ProvisioningErrorDisplayTest
: public ArcSessionManagerTest, : public ArcSessionManagerTest,
...@@ -1187,11 +1239,11 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -1187,11 +1239,11 @@ INSTANTIATE_TEST_SUITE_P(
TEST_P(ProvisioningErrorDisplayTest, ArcStopped) { TEST_P(ProvisioningErrorDisplayTest, ArcStopped) {
ShowErrorObserver observer(arc_session_manager()); ShowErrorObserver observer(arc_session_manager());
arc_session_manager()->OnProvisioningFinished( ArcProvisioningResult result = CreateProvisioningResult(GetParam().error);
ArcProvisioningResult(GetParam().stop_reason)); arc_session_manager()->OnProvisioningFinished(result);
ASSERT_TRUE(observer.error_info()); ASSERT_TRUE(observer.error_info());
EXPECT_EQ(GetParam().error, observer.error_info().value().error); EXPECT_EQ(GetParam().message, observer.error_info().value().error);
EXPECT_EQ(GetParam().arg, observer.error_info().value().arg); EXPECT_EQ(GetParam().arg, observer.error_info().value().arg);
} }
...@@ -1752,39 +1804,8 @@ TEST_P(ArcSessionRetryTest, ContainerRestarted) { ...@@ -1752,39 +1804,8 @@ TEST_P(ArcSessionRetryTest, ContainerRestarted) {
arc_session_manager()->StartArcForTesting(); arc_session_manager()->StartArcForTesting();
EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state()); EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
absl::variant<arc::mojom::GeneralSignInError, arc::mojom::GMSSignInError, ArcProvisioningResult result1 = CreateProvisioningResult(GetParam().error);
arc::mojom::GMSCheckInError, arc_session_manager()->OnProvisioningFinished(result1);
arc::mojom::CloudProvisionFlowError, ArcStopReason,
ChromeProvisioningTimeout>
error = std::move(GetParam().error);
if (absl::holds_alternative<arc::mojom::CloudProvisionFlowError>(error)) {
ArcProvisioningResult result(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewCloudProvisionFlowError(
absl::get<arc::mojom::CloudProvisionFlowError>(error))));
arc_session_manager()->OnProvisioningFinished(result);
} else if (absl::holds_alternative<ArcStopReason>(error)) {
ArcProvisioningResult result(absl::get<ArcStopReason>(error));
arc_session_manager()->OnProvisioningFinished(result);
} else if (absl::holds_alternative<arc::mojom::GeneralSignInError>(error)) {
ArcProvisioningResult result(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewGeneralError(
absl::get<arc::mojom::GeneralSignInError>(error))));
arc_session_manager()->OnProvisioningFinished(result);
} else if (absl::holds_alternative<arc::mojom::GMSSignInError>(error)) {
ArcProvisioningResult result(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewSignInError(
absl::get<arc::mojom::GMSSignInError>(error))));
arc_session_manager()->OnProvisioningFinished(result);
} else if (absl::holds_alternative<arc::mojom::GMSCheckInError>(error)) {
ArcProvisioningResult result(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewCheckInError(
absl::get<arc::mojom::GMSCheckInError>(error))));
arc_session_manager()->OnProvisioningFinished(result);
} else if (absl::holds_alternative<ChromeProvisioningTimeout>(error)) {
arc_session_manager()->OnProvisioningFinished(
ArcProvisioningResult(ChromeProvisioningTimeout{}));
}
// In case of permanent error data removal request is scheduled. // In case of permanent error data removal request is scheduled.
EXPECT_EQ(GetParam().data_removed, EXPECT_EQ(GetParam().data_removed,
......
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