Commit a0c15ea0 authored by Muhammad Hasan Khan's avatar Muhammad Hasan Khan Committed by Commit Bot

arc: replace ProvisioningResult enum with object

ProvisioningResult is used in UMA stats so we're not removing it but
replacing most of its use with a new ArcProvisioningResult object
that can represent all kinds of problems that can happen during
provisioning.

BUG=b:166322619
TEST=CQ
TEST=unit_tests --gtest_filter='*ArcProvisioningResultTest*'

Change-Id: Iec7192e05a84e1f4ae4d8e556a675d67fff1cd62
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2548841
Commit-Queue: Muhammad Hasan Khan <mhasank@chromium.org>
Reviewed-by: default avatarYury Khmel <khmel@chromium.org>
Reviewed-by: default avatarHidehiko Abe <hidehiko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#830485}
parent cf35a4ee
...@@ -766,6 +766,8 @@ source_set("chromeos") { ...@@ -766,6 +766,8 @@ source_set("chromeos") {
"arc/session/arc_app_id_provider_impl.h", "arc/session/arc_app_id_provider_impl.h",
"arc/session/arc_play_store_enabled_preference_handler.cc", "arc/session/arc_play_store_enabled_preference_handler.cc",
"arc/session/arc_play_store_enabled_preference_handler.h", "arc/session/arc_play_store_enabled_preference_handler.h",
"arc/session/arc_provisioning_result.cc",
"arc/session/arc_provisioning_result.h",
"arc/session/arc_service_launcher.cc", "arc/session/arc_service_launcher.cc",
"arc/session/arc_service_launcher.h", "arc/session/arc_service_launcher.h",
"arc/session/arc_session_manager.cc", "arc/session/arc_session_manager.cc",
...@@ -3335,6 +3337,7 @@ source_set("unit_tests") { ...@@ -3335,6 +3337,7 @@ source_set("unit_tests") {
"arc/policy/arc_policy_bridge_unittest.cc", "arc/policy/arc_policy_bridge_unittest.cc",
"arc/process/arc_process_unittest.cc", "arc/process/arc_process_unittest.cc",
"arc/session/arc_play_store_enabled_preference_handler_unittest.cc", "arc/session/arc_play_store_enabled_preference_handler_unittest.cc",
"arc/session/arc_provisioning_result_unittest.cc",
"arc/session/arc_session_manager_unittest.cc", "arc/session/arc_session_manager_unittest.cc",
"arc/tracing/arc_app_performance_tracing_unittest.cc", "arc/tracing/arc_app_performance_tracing_unittest.cc",
"arc/tracing/arc_cpu_event_unittest.cc", "arc/tracing/arc_cpu_event_unittest.cc",
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/chromeos/arc/policy/arc_policy_util.h" #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
#include "chrome/browser/chromeos/arc/session/arc_provisioning_result.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_session.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
...@@ -74,9 +75,9 @@ void UpdateOptInFlowResultUMA(OptInFlowResult result) { ...@@ -74,9 +75,9 @@ void UpdateOptInFlowResultUMA(OptInFlowResult result) {
base::UmaHistogramEnumeration("Arc.OptInResult", result); base::UmaHistogramEnumeration("Arc.OptInResult", result);
} }
void UpdateProvisioningResultUMA(ProvisioningResult result, void UpdateProvisioningResultUMA(ProvisioningResultUMA result,
const Profile* profile) { const Profile* profile) {
DCHECK_NE(result, ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR); DCHECK_NE(result, ProvisioningResultUMA::CHROME_SERVER_COMMUNICATION_ERROR);
base::UmaHistogramEnumeration( base::UmaHistogramEnumeration(
GetHistogramNameByUserType("Arc.Provisioning.Result", profile), result); GetHistogramNameByUserType("Arc.Provisioning.Result", profile), result);
} }
...@@ -88,7 +89,7 @@ void UpdateCloudProvisionFlowErrorUMA(mojom::CloudProvisionFlowError error, ...@@ -88,7 +89,7 @@ void UpdateCloudProvisionFlowErrorUMA(mojom::CloudProvisionFlowError error,
error); error);
} }
void UpdateSecondarySigninResultUMA(ProvisioningResult result) { void UpdateSecondarySigninResultUMA(ProvisioningResultUMA result) {
base::UmaHistogramEnumeration("Arc.Secondary.Signin.Result", result); base::UmaHistogramEnumeration("Arc.Secondary.Signin.Result", result);
} }
...@@ -105,7 +106,7 @@ void UpdateProvisioningTiming(const base::TimeDelta& elapsed_time, ...@@ -105,7 +106,7 @@ void UpdateProvisioningTiming(const base::TimeDelta& elapsed_time,
base::TimeDelta::FromSeconds(1), base::TimeDelta::FromMinutes(6), 50); base::TimeDelta::FromSeconds(1), base::TimeDelta::FromMinutes(6), 50);
} }
void UpdateReauthorizationResultUMA(ProvisioningResult result, void UpdateReauthorizationResultUMA(ProvisioningResultUMA result,
const Profile* profile) { const Profile* profile) {
base::UmaHistogramEnumeration( base::UmaHistogramEnumeration(
GetHistogramNameByUserType("Arc.Reauthorization.Result", profile), GetHistogramNameByUserType("Arc.Reauthorization.Result", profile),
...@@ -205,9 +206,80 @@ void UpdateSecondaryAccountSilentAuthCodeUMA(OptInSilentAuthCode state) { ...@@ -205,9 +206,80 @@ void UpdateSecondaryAccountSilentAuthCodeUMA(OptInSilentAuthCode state) {
static_cast<int>(state)); static_cast<int>(state));
} }
std::ostream& operator<<(std::ostream& os, const ProvisioningResult& result) { ProvisioningResultUMA GetProvisioningResultUMA(
const ArcProvisioningResult& provisioning_result) {
if (provisioning_result.is_stopped())
return ProvisioningResultUMA::ARC_STOPPED;
if (provisioning_result.is_timedout())
return ProvisioningResultUMA::OVERALL_SIGN_IN_TIMEOUT;
const mojom::ArcSignInResult* result = provisioning_result.signin_result();
if (result->is_success()) {
if (result->get_success() == mojom::ArcSignInSuccess::SUCCESS)
return ProvisioningResultUMA::SUCCESS;
else
return ProvisioningResultUMA::SUCCESS_ALREADY_PROVISIONED;
}
if (result->get_error()->is_cloud_provision_flow_error())
return ProvisioningResultUMA::CLOUD_PROVISION_FLOW_ERROR;
if (result->get_error()->is_general_error()) {
#define MAP_GENERAL_ERROR(name) \
case mojom::GeneralSignInError::name: \
return ProvisioningResultUMA::name
switch (result->get_error()->get_general_error()) {
MAP_GENERAL_ERROR(UNKNOWN_ERROR);
MAP_GENERAL_ERROR(MOJO_VERSION_MISMATCH);
MAP_GENERAL_ERROR(PROVISIONING_TIMEOUT);
MAP_GENERAL_ERROR(NO_NETWORK_CONNECTION);
MAP_GENERAL_ERROR(CHROME_SERVER_COMMUNICATION_ERROR);
MAP_GENERAL_ERROR(ARC_DISABLED);
MAP_GENERAL_ERROR(UNSUPPORTED_ACCOUNT_TYPE);
MAP_GENERAL_ERROR(CHROME_ACCOUNT_NOT_FOUND);
}
#undef MAP_GENERAL_ERROR
}
if (result->get_error()->is_checkin_error()) {
#define MAP_CHECKIN_ERROR(name) \
case mojom::DeviceCheckInError::name: \
return ProvisioningResultUMA::name
switch (result->get_error()->get_checkin_error()) {
MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_FAILED);
MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_TIMEOUT);
MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_INTERNAL_ERROR);
}
#undef MAP_CHECKIN_ERROR
}
if (result->get_error()->is_gms_error()) {
#define MAP_GMS_ERROR(name) \
case mojom::GMSError::name: \
return ProvisioningResultUMA::name
switch (result->get_error()->get_gms_error()) {
MAP_GMS_ERROR(GMS_NETWORK_ERROR);
MAP_GMS_ERROR(GMS_SERVICE_UNAVAILABLE);
MAP_GMS_ERROR(GMS_BAD_AUTHENTICATION);
MAP_GMS_ERROR(GMS_SIGN_IN_FAILED);
MAP_GMS_ERROR(GMS_SIGN_IN_TIMEOUT);
MAP_GMS_ERROR(GMS_SIGN_IN_INTERNAL_ERROR);
}
#undef MAP_GMS_ERROR
}
NOTREACHED() << "unknown sign result";
return ProvisioningResultUMA::UNKNOWN_ERROR;
}
std::ostream& operator<<(std::ostream& os,
const ProvisioningResultUMA& result) {
#define MAP_PROVISIONING_RESULT(name) \ #define MAP_PROVISIONING_RESULT(name) \
case ProvisioningResult::name: \ case ProvisioningResultUMA::name: \
return os << #name return os << #name
switch (result) { switch (result) {
......
...@@ -18,6 +18,8 @@ class TimeDelta; ...@@ -18,6 +18,8 @@ class TimeDelta;
namespace arc { namespace arc {
class ArcProvisioningResult;
// These enums are used to define the buckets for an enumerated UMA histogram // These enums are used to define the buckets for an enumerated UMA histogram
// and need to be synced with tools/metrics/histograms/enums.xml. Note that // and need to be synced with tools/metrics/histograms/enums.xml. Note that
// values 0, 1, 2, 3 and 4 are now deprecated. // values 0, 1, 2, 3 and 4 are now deprecated.
...@@ -103,7 +105,7 @@ enum class OptInSilentAuthCode { ...@@ -103,7 +105,7 @@ enum class OptInSilentAuthCode {
// The values should be listed in ascending order. They are also persisted to // The values should be listed in ascending order. They are also persisted to
// logs, and their values should therefore never be renumbered nor reused. For // logs, and their values should therefore never be renumbered nor reused. For
// detailed meaning, please consult auth.mojom. // detailed meaning, please consult auth.mojom.
enum class ProvisioningResult : int { enum class ProvisioningResultUMA : int {
// Provisioning was successful. Note, SUCCESS_ALREADY_PROVISIONED is also // Provisioning was successful. Note, SUCCESS_ALREADY_PROVISIONED is also
// successful state. // successful state.
SUCCESS = 0, SUCCESS = 0,
...@@ -224,15 +226,15 @@ void UpdateEnabledStateByUserTypeUMA(); ...@@ -224,15 +226,15 @@ void UpdateEnabledStateByUserTypeUMA();
void UpdateOptInActionUMA(OptInActionType type); void UpdateOptInActionUMA(OptInActionType type);
void UpdateOptInCancelUMA(OptInCancelReason reason); void UpdateOptInCancelUMA(OptInCancelReason reason);
void UpdateOptInFlowResultUMA(OptInFlowResult result); void UpdateOptInFlowResultUMA(OptInFlowResult result);
void UpdateProvisioningResultUMA(ProvisioningResult result, void UpdateProvisioningResultUMA(ProvisioningResultUMA result,
const Profile* profile); const Profile* profile);
void UpdateCloudProvisionFlowErrorUMA(mojom::CloudProvisionFlowError error, void UpdateCloudProvisionFlowErrorUMA(mojom::CloudProvisionFlowError error,
const Profile* profile); const Profile* profile);
void UpdateSecondarySigninResultUMA(ProvisioningResult result); void UpdateSecondarySigninResultUMA(ProvisioningResultUMA result);
void UpdateProvisioningTiming(const base::TimeDelta& elapsed_time, void UpdateProvisioningTiming(const base::TimeDelta& elapsed_time,
bool success, bool success,
const Profile* profile); const Profile* profile);
void UpdateReauthorizationResultUMA(ProvisioningResult result, void UpdateReauthorizationResultUMA(ProvisioningResultUMA result,
const Profile* profile); const Profile* profile);
void UpdatePlayAutoInstallRequestState(mojom::PaiFlowState state, void UpdatePlayAutoInstallRequestState(mojom::PaiFlowState state,
const Profile* profile); const Profile* profile);
...@@ -261,8 +263,14 @@ void UpdateMainAccountResolutionStatus( ...@@ -261,8 +263,14 @@ void UpdateMainAccountResolutionStatus(
const Profile* profile, const Profile* profile,
mojom::MainAccountResolutionStatus status); mojom::MainAccountResolutionStatus status);
// Returns the enum for use in UMA stat and displaying error code on the UI.
// This enum should not be used anywhere else. Please work with the object
// instead.
ProvisioningResultUMA GetProvisioningResultUMA(
const ArcProvisioningResult& provisioning_result);
// Outputs the stringified |result| to |os|. This is only for logging purposes. // Outputs the stringified |result| to |os|. This is only for logging purposes.
std::ostream& operator<<(std::ostream& os, const ProvisioningResult& result); std::ostream& operator<<(std::ostream& os, const ProvisioningResultUMA& result);
} // namespace arc } // namespace arc
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h" #include "chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h"
#include "chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.h" #include "chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.h"
#include "chrome/browser/chromeos/arc/policy/arc_policy_util.h" #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
#include "chrome/browser/chromeos/arc/session/arc_provisioning_result.h"
#include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_session.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/profiles/profile_helper.h"
...@@ -71,63 +72,6 @@ class ArcAuthServiceFactory ...@@ -71,63 +72,6 @@ class ArcAuthServiceFactory
~ArcAuthServiceFactory() override = default; ~ArcAuthServiceFactory() override = default;
}; };
// Converts mojom::ArcSignInResult into ProvisiningResult.
ProvisioningResult ConvertArcSignInResultToProvisioningResult(
mojom::ArcSignInResult* result) {
if (result->is_success()) {
if (result->get_success() == mojom::ArcSignInSuccess::SUCCESS)
return ProvisioningResult::SUCCESS;
else
return ProvisioningResult::SUCCESS_ALREADY_PROVISIONED;
} else if (result->get_error()->is_cloud_provision_flow_error()) {
return ProvisioningResult::CLOUD_PROVISION_FLOW_ERROR;
} else if (result->get_error()->is_general_error()) {
#define MAP_GENERAL_ERROR(name) \
case mojom::GeneralSignInError::name: \
return ProvisioningResult::name
switch (result->get_error()->get_general_error()) {
MAP_GENERAL_ERROR(UNKNOWN_ERROR);
MAP_GENERAL_ERROR(MOJO_VERSION_MISMATCH);
MAP_GENERAL_ERROR(PROVISIONING_TIMEOUT);
MAP_GENERAL_ERROR(NO_NETWORK_CONNECTION);
MAP_GENERAL_ERROR(CHROME_SERVER_COMMUNICATION_ERROR);
MAP_GENERAL_ERROR(ARC_DISABLED);
MAP_GENERAL_ERROR(UNSUPPORTED_ACCOUNT_TYPE);
MAP_GENERAL_ERROR(CHROME_ACCOUNT_NOT_FOUND);
}
#undef MAP_GENERAL_ERROR
} else if (result->get_error()->is_checkin_error()) {
#define MAP_CHECKIN_ERROR(name) \
case mojom::DeviceCheckInError::name: \
return ProvisioningResult::name
switch (result->get_error()->get_checkin_error()) {
MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_FAILED);
MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_TIMEOUT);
MAP_CHECKIN_ERROR(DEVICE_CHECK_IN_INTERNAL_ERROR);
}
#undef MAP_CHECKIN_ERROR
} else if (result->get_error()->is_gms_error()) {
#define MAP_GMS_ERROR(name) \
case mojom::GMSError::name: \
return ProvisioningResult::name
switch (result->get_error()->get_gms_error()) {
MAP_GMS_ERROR(GMS_NETWORK_ERROR);
MAP_GMS_ERROR(GMS_SERVICE_UNAVAILABLE);
MAP_GMS_ERROR(GMS_BAD_AUTHENTICATION);
MAP_GMS_ERROR(GMS_SIGN_IN_FAILED);
MAP_GMS_ERROR(GMS_SIGN_IN_TIMEOUT);
MAP_GMS_ERROR(GMS_SIGN_IN_INTERNAL_ERROR);
}
#undef MAP_GMS_ERROR
}
NOTREACHED() << "unknown sign result";
return ProvisioningResult::UNKNOWN_ERROR;
}
mojom::ChromeAccountType GetAccountType(const Profile* profile) { mojom::ChromeAccountType GetAccountType(const Profile* profile) {
if (profile->IsChild()) if (profile->IsChild())
return mojom::ChromeAccountType::CHILD_ACCOUNT; return mojom::ChromeAccountType::CHILD_ACCOUNT;
...@@ -368,14 +312,11 @@ void ArcAuthService::OnConnectionClosed() { ...@@ -368,14 +312,11 @@ void ArcAuthService::OnConnectionClosed() {
void ArcAuthService::OnAuthorizationResult(mojom::ArcSignInResultPtr result, void ArcAuthService::OnAuthorizationResult(mojom::ArcSignInResultPtr result,
mojom::ArcSignInAccountPtr account) { mojom::ArcSignInAccountPtr account) {
const ProvisioningResult provisioning_result = ArcProvisioningResult provisioning_result(std::move(result));
ConvertArcSignInResultToProvisioningResult(result.get());
if (account->is_initial_signin()) { if (account->is_initial_signin()) {
// UMA for initial signin is updated from ArcSessionManager. // UMA for initial signin is updated from ArcSessionManager.
ArcSessionManager::Get()->OnProvisioningFinished( ArcSessionManager::Get()->OnProvisioningFinished(provisioning_result);
provisioning_result,
result->is_error() ? std::move(result->get_error()) : nullptr);
return; return;
} }
...@@ -385,6 +326,9 @@ void ArcAuthService::OnAuthorizationResult(mojom::ArcSignInResultPtr result, ...@@ -385,6 +326,9 @@ void ArcAuthService::OnAuthorizationResult(mojom::ArcSignInResultPtr result,
return; return;
} }
ProvisioningResultUMA provisioning_result_enum =
GetProvisioningResultUMA(provisioning_result);
if (!account->is_account_name() || !account->get_account_name() || if (!account->is_account_name() || !account->get_account_name() ||
account->get_account_name().value().empty() || account->get_account_name().value().empty() ||
IsPrimaryOrDeviceLocalAccount(identity_manager_, IsPrimaryOrDeviceLocalAccount(identity_manager_,
...@@ -393,11 +337,11 @@ void ArcAuthService::OnAuthorizationResult(mojom::ArcSignInResultPtr result, ...@@ -393,11 +337,11 @@ void ArcAuthService::OnAuthorizationResult(mojom::ArcSignInResultPtr result,
// The check for |!account_name.has_value()| is for backwards compatibility // The check for |!account_name.has_value()| is for backwards compatibility
// with older ARC versions, for which Mojo will set |account_name| to // with older ARC versions, for which Mojo will set |account_name| to
// empty/null. // empty/null.
DCHECK_NE(ProvisioningResult::SUCCESS_ALREADY_PROVISIONED, DCHECK_NE(ProvisioningResultUMA::SUCCESS_ALREADY_PROVISIONED,
provisioning_result); provisioning_result_enum);
UpdateReauthorizationResultUMA(provisioning_result, profile_); UpdateReauthorizationResultUMA(provisioning_result_enum, profile_);
} else { } else {
UpdateSecondarySigninResultUMA(provisioning_result); UpdateSecondarySigninResultUMA(provisioning_result_enum);
} }
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "chrome/browser/chromeos/arc/arc_optin_uma.h" #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
#include "chrome/browser/chromeos/arc/session/arc_provisioning_result.h"
#include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
#include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h" #include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
...@@ -162,8 +163,11 @@ TEST_F(ArcSettingsServiceTest, ...@@ -162,8 +163,11 @@ TEST_F(ArcSettingsServiceTest,
EXPECT_FALSE( EXPECT_FALSE(
profile()->GetPrefs()->GetBoolean(prefs::kArcInitialSettingsPending)); profile()->GetPrefs()->GetBoolean(prefs::kArcInitialSettingsPending));
arc_session_manager()->OnProvisioningFinished(ProvisioningResult::SUCCESS, arc::mojom::ArcSignInResultPtr result =
{}); arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS);
arc_session_manager()->OnProvisioningFinished(
ArcProvisioningResult(std::move(result)));
EXPECT_TRUE( EXPECT_TRUE(
profile()->GetPrefs()->GetBoolean(prefs::kArcInitialSettingsPending)); profile()->GetPrefs()->GetBoolean(prefs::kArcInitialSettingsPending));
...@@ -201,8 +205,11 @@ TEST_F(ArcSettingsServiceTest, ...@@ -201,8 +205,11 @@ TEST_F(ArcSettingsServiceTest,
->GetBroadcastsForAction(kActionLocaionEnabled) ->GetBroadcastsForAction(kActionLocaionEnabled)
.empty()); .empty());
arc_session_manager()->OnProvisioningFinished(ProvisioningResult::SUCCESS, arc::mojom::ArcSignInResultPtr result =
{}); arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS);
arc_session_manager()->OnProvisioningFinished(
ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
profile()->GetPrefs()->GetBoolean(prefs::kArcInitialSettingsPending)); profile()->GetPrefs()->GetBoolean(prefs::kArcInitialSettingsPending));
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/chromeos/arc/arc_optin_uma.h" #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
#include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/chromeos/arc/session/arc_provisioning_result.h"
#include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
#include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h" #include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
#include "chrome/browser/chromeos/login/ui/fake_login_display_host.h" #include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
...@@ -125,7 +126,11 @@ TEST_F(ArcProvisionNotificationServiceTest, ...@@ -125,7 +126,11 @@ TEST_F(ArcProvisionNotificationServiceTest,
EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager_->state()); EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager_->state());
// Emulate successful provisioning. The notification gets removed. // Emulate successful provisioning. The notification gets removed.
arc_session_manager_->OnProvisioningFinished(ProvisioningResult::SUCCESS, {}); arc::mojom::ArcSignInResultPtr result =
arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS);
arc_session_manager_->OnProvisioningFinished(
ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
} }
...@@ -156,7 +161,11 @@ TEST_F(ArcProvisionNotificationServiceTest, ...@@ -156,7 +161,11 @@ TEST_F(ArcProvisionNotificationServiceTest,
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager_->state()); EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager_->state());
arc_session_manager_->OnProvisioningFinished(ProvisioningResult::SUCCESS, {}); arc::mojom::ArcSignInResultPtr result =
arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS);
arc_session_manager_->OnProvisioningFinished(
ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
} }
...@@ -187,8 +196,11 @@ TEST_F(ArcProvisionNotificationServiceTest, ...@@ -187,8 +196,11 @@ TEST_F(ArcProvisionNotificationServiceTest,
// Emulate provisioning failure that leads to stopping ARC. The notification // Emulate provisioning failure that leads to stopping ARC. The notification
// gets removed. // gets removed.
arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewGeneralError(
arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR));
arc_session_manager_->OnProvisioningFinished( arc_session_manager_->OnProvisioningFinished(
ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR, {}); ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
} }
...@@ -219,8 +231,11 @@ TEST_F(ArcProvisionNotificationServiceTest, ...@@ -219,8 +231,11 @@ TEST_F(ArcProvisionNotificationServiceTest,
// Emulate provisioning failure that leads to showing an error screen without // Emulate provisioning failure that leads to showing an error screen without
// shutting ARC down. The notification gets removed. // shutting ARC down. The notification gets removed.
arc::mojom::ArcSignInResultPtr result = arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewGeneralError(
arc::mojom::GeneralSignInError::NO_NETWORK_CONNECTION));
arc_session_manager_->OnProvisioningFinished( arc_session_manager_->OnProvisioningFinished(
ProvisioningResult::NO_NETWORK_CONNECTION, {}); ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
} }
...@@ -251,7 +266,11 @@ TEST_F(ArcProvisionNotificationServiceTest, ...@@ -251,7 +266,11 @@ TEST_F(ArcProvisionNotificationServiceTest,
// Emulate successful provisioning. // Emulate successful provisioning.
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
arc_session_manager_->OnProvisioningFinished(ProvisioningResult::SUCCESS, {}); arc::mojom::ArcSignInResultPtr result =
arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS);
arc_session_manager_->OnProvisioningFinished(
ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
} }
...@@ -314,7 +333,11 @@ TEST_F(ArcProvisionNotificationServiceOobeTest, ...@@ -314,7 +333,11 @@ TEST_F(ArcProvisionNotificationServiceOobeTest,
// Emulate successful provisioning. // Emulate successful provisioning.
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
arc_session_manager_->OnProvisioningFinished(ProvisioningResult::SUCCESS, {}); arc::mojom::ArcSignInResultPtr result =
arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS);
arc_session_manager_->OnProvisioningFinished(
ArcProvisioningResult(std::move(result)));
EXPECT_FALSE( EXPECT_FALSE(
display_service_->GetNotification(kArcManagedProvisionNotificationId)); display_service_->GetNotification(kArcManagedProvisionNotificationId));
} }
......
// Copyright 2020 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 "chrome/browser/chromeos/arc/session/arc_provisioning_result.h"
#include "base/check.h"
#include "chrome/browser/chromeos/arc/arc_optin_uma.h"
namespace arc {
ArcProvisioningResult::ArcProvisioningResult(mojom::ArcSignInResultPtr result)
: result_(std::move(result)) {}
ArcProvisioningResult::ArcProvisioningResult(ArcStopReason reason)
: result_(reason) {}
ArcProvisioningResult::ArcProvisioningResult(OverallSignInTimeout timeout)
: result_(timeout) {}
ArcProvisioningResult::ArcProvisioningResult(ArcProvisioningResult&& other) =
default;
ArcProvisioningResult::~ArcProvisioningResult() = default;
bool ArcProvisioningResult::has_signin_result() const {
return absl::holds_alternative<mojom::ArcSignInResultPtr>(result_);
}
const mojom::ArcSignInResult* ArcProvisioningResult::signin_result() const {
DCHECK(has_signin_result());
return absl::get<mojom::ArcSignInResultPtr>(result_).get();
}
bool ArcProvisioningResult::has_signin_error() const {
return has_signin_result() && signin_result()->is_error();
}
const mojom::ArcSignInError* ArcProvisioningResult::signin_error() const {
DCHECK(has_signin_error());
return signin_result()->get_error().get();
}
bool ArcProvisioningResult::is_success() const {
return has_signin_result() && signin_result()->is_success();
}
bool ArcProvisioningResult::has_general_error(
mojom::GeneralSignInError error) const {
return has_signin_error() && signin_error()->is_general_error() &&
signin_error()->get_general_error() == error;
}
bool ArcProvisioningResult::is_stopped() const {
return absl::holds_alternative<ArcStopReason>(result_);
}
ArcStopReason ArcProvisioningResult::stop_reason() const {
DCHECK(is_stopped());
return absl::get<ArcStopReason>(result_);
}
bool ArcProvisioningResult::is_timedout() const {
return absl::holds_alternative<OverallSignInTimeout>(result_);
}
std::ostream& operator<<(std::ostream& os,
const ArcProvisioningResult& result) {
return os << GetProvisioningResultUMA(result);
}
} // namespace arc
// Copyright 2020 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.
#ifndef CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_PROVISIONING_RESULT_H_
#define CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_PROVISIONING_RESULT_H_
#include <ostream>
#include "components/arc/mojom/auth.mojom.h"
#include "components/arc/session/arc_stop_reason.h"
#include "third_party/abseil-cpp/absl/types/variant.h"
enum class ProvisioningResultUMA : int;
namespace arc {
// A struct that represents timeout of ARC provisioning from Chrome.
struct OverallSignInTimeout {};
// A class that encapsulates the result of provisioning ARC.
class ArcProvisioningResult {
public:
explicit ArcProvisioningResult(mojom::ArcSignInResultPtr result);
explicit ArcProvisioningResult(ArcStopReason reason);
explicit ArcProvisioningResult(OverallSignInTimeout timeout);
ArcProvisioningResult(ArcProvisioningResult&& other);
~ArcProvisioningResult();
// Returns true if signin_result from ARC is present.
bool has_signin_result() const;
// Returns the result of provisioning from inside ARC.
const mojom::ArcSignInResult* signin_result() const;
// Returns true if signin_result is present with an error.
bool has_signin_error() const;
// Returns the error of signin_result coming from ARC.
const mojom::ArcSignInError* signin_error() const;
// Returns true if result has given general sign-in error.
bool has_general_error(mojom::GeneralSignInError error) const;
// Returns true if provisioning was successful.
bool is_success() const;
// Returns true if ARC provisioning was stopped pre-maturely.
bool is_stopped() const;
// Returns the reason for ARC stopped event.
ArcStopReason stop_reason() const;
// Returns true if ARC provisioning timed out in Chrome.
bool is_timedout() const;
private:
absl::variant<mojom::ArcSignInResultPtr, ArcStopReason, OverallSignInTimeout>
result_;
};
// Outputs the stringified |result| to |os|. This is only for logging purposes.
std::ostream& operator<<(std::ostream& os, const ArcProvisioningResult& result);
} // namespace arc
#endif // CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_PROVISIONING_RESULT_H_
// Copyright 2020 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 "chrome/browser/chromeos/arc/session/arc_provisioning_result.h"
#include "chrome/browser/chromeos/arc/arc_optin_uma.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace arc {
TEST(ArcProvisioningResultTest, HasSignInResult) {
ArcProvisioningResult result1(ArcStopReason::CRASH);
EXPECT_FALSE(result1.has_signin_result());
ArcProvisioningResult result2(arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS));
EXPECT_TRUE(result2.has_signin_result());
}
TEST(ArcProvisioningResultTest, HasSignInError) {
ArcProvisioningResult result1(ArcStopReason::CRASH);
EXPECT_FALSE(result1.has_signin_error());
ArcProvisioningResult result2(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewGeneralError(
arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR)));
EXPECT_TRUE(result2.has_signin_error());
}
TEST(ArcProvisioningResultTest, Success) {
ArcProvisioningResult result1(ArcStopReason::CRASH);
EXPECT_FALSE(result1.is_success());
ArcProvisioningResult result2(arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS));
EXPECT_TRUE(result2.is_success());
ArcProvisioningResult result3(arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS_ALREADY_PROVISIONED));
EXPECT_TRUE(result3.is_success());
}
TEST(ArcProvisioningResultTest, Stopped) {
ArcProvisioningResult result1(arc::mojom::ArcSignInResult::NewSuccess(
arc::mojom::ArcSignInSuccess::SUCCESS));
EXPECT_FALSE(result1.is_stopped());
ArcProvisioningResult result2(ArcStopReason::CRASH);
EXPECT_TRUE(result2.is_stopped());
ArcProvisioningResult result3(ArcStopReason::SHUTDOWN);
EXPECT_TRUE(result3.is_stopped());
ArcProvisioningResult result4(ArcStopReason::GENERIC_BOOT_FAILURE);
EXPECT_TRUE(result4.is_stopped());
ArcProvisioningResult result5(ArcStopReason::LOW_DISK_SPACE);
EXPECT_TRUE(result5.is_stopped());
}
TEST(ArcProvisioningResultTest, Timedout) {
ArcProvisioningResult result1(ArcStopReason::CRASH);
EXPECT_FALSE(result1.is_timedout());
ArcProvisioningResult result2(OverallSignInTimeout{});
EXPECT_TRUE(result2.is_timedout());
}
TEST(ArcProvisioningResultTest, HasGeneralError) {
ArcProvisioningResult result1(ArcStopReason::CRASH);
EXPECT_FALSE(result1.has_general_error(
arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR));
ArcProvisioningResult result2(arc::mojom::ArcSignInResult::NewError(
arc::mojom::ArcSignInError::NewGeneralError(
arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR)));
EXPECT_TRUE(result2.has_general_error(
arc::mojom::GeneralSignInError::CHROME_SERVER_COMMUNICATION_ERROR));
}
TEST(ArcProvisioningResultTest, StopReason) {
ArcProvisioningResult result1(ArcStopReason::CRASH);
EXPECT_EQ(ArcStopReason::CRASH, result1.stop_reason());
ArcProvisioningResult result2(ArcStopReason::SHUTDOWN);
EXPECT_EQ(ArcStopReason::SHUTDOWN, result2.stop_reason());
ArcProvisioningResult result3(ArcStopReason::GENERIC_BOOT_FAILURE);
EXPECT_EQ(ArcStopReason::GENERIC_BOOT_FAILURE, result3.stop_reason());
ArcProvisioningResult result4(ArcStopReason::LOW_DISK_SPACE);
EXPECT_EQ(ArcStopReason::LOW_DISK_SPACE, result4.stop_reason());
}
} // namespace arc
...@@ -41,10 +41,11 @@ class ArcAndroidManagementChecker; ...@@ -41,10 +41,11 @@ class ArcAndroidManagementChecker;
class ArcDataRemover; class ArcDataRemover;
class ArcFastAppReinstallStarter; class ArcFastAppReinstallStarter;
class ArcPaiStarter; class ArcPaiStarter;
class ArcProvisioningResult;
class ArcTermsOfServiceNegotiator; class ArcTermsOfServiceNegotiator;
class ArcUiAvailabilityReporter; class ArcUiAvailabilityReporter;
enum class ProvisioningResult : int; enum class ProvisioningResultUMA : int;
enum class ArcStopReason; enum class ArcStopReason;
// This class is responsible for handing stages of ARC life-cycle. // This class is responsible for handing stages of ARC life-cycle.
...@@ -210,14 +211,13 @@ class ArcSessionManager : public ArcSessionRunner::Observer, ...@@ -210,14 +211,13 @@ class ArcSessionManager : public ArcSessionRunner::Observer,
ArcSupportHost* support_host() { return support_host_.get(); } ArcSupportHost* support_host() { return support_host_.get(); }
// On provisioning completion (regardless of whether successfully done or // On provisioning completion (regardless of whether successfully done or
// not), this is called with its status. On success, called with // not), this is called with its status. On success, is_success() of
// ProvisioningResult::SUCCESS, otherwise |result| is the error reason. // |result| returns true, otherwise ArcSignInResult can be retrieved from
// |error| either contains the sign-in error that came from ARC or it may // get() if sign-in result came from ARC or is_stopped()
// indicate that ARC stopped prematurely and provisioning could not finish // will indicate that ARC stopped prematurely and provisioning could
// successfully. // not finish successfully. is_timedout() indicates that operation timed
void OnProvisioningFinished( // out.
ProvisioningResult result, void OnProvisioningFinished(const ArcProvisioningResult& result);
absl::variant<mojom::ArcSignInErrorPtr, ArcStopReason> error);
// A helper function that calls ArcSessionRunner's SetUserInfo. // A helper function that calls ArcSessionRunner's SetUserInfo.
void SetUserInfo(); void SetUserInfo();
......
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