Commit 5fee5742 authored by Jae Hoon Kim's avatar Jae Hoon Kim Committed by Commit Bot

Plugin VM installer UI to accommodate DLC Failures - Phase 2

Display to the users specific actions to take when PluginVM DLC runs
into errors.

BUG=chromium:1041311
TEST=./out/Default/unit_tests --gtest_filter=PluginVm*

Change-Id: Ib0a649f79dc07e15f38d0d950f9574442109c4d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2063731
Commit-Queue: Jae Hoon Kim <kimjae@chromium.org>
Reviewed-by: default avatarJulian Watson <juwa@google.com>
Reviewed-by: default avatarTimothy Loh <timloh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#745733}
parent 5cad4d74
...@@ -4274,7 +4274,7 @@ ...@@ -4274,7 +4274,7 @@
Couldn't install the virtual machine. Please try again, or contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>. Couldn't install the virtual machine. Please try again, or contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
</message> </message>
<message name="IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE" desc="Error message to be shown if a setup/launch is attempted although Plugin VM is disallowed."> <message name="IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE" desc="Error message to be shown if a setup/launch is attempted although Plugin VM is disallowed.">
Plugin VM isn't allowed on this device. Contact your organization's device administrator. Plugin VM isn't allowed on this device. Contact your organization's device administrator. Error code: <ph name="ERROR_CODE">$1<ex>7</ex></ph>.
</message> </message>
<message name="IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_MESSAGE" desc="Text of the Plugin VM installer during downloading Plugin VM image, showing download progress."> <message name="IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_MESSAGE" desc="Text of the Plugin VM installer during downloading Plugin VM image, showing download progress.">
<ph name="DOWNLOADED_SIZE">$1<ex>1.2</ex></ph>/<ph name="DOWNLOAD_SIZE">$2<ex>3.4 GB</ex></ph> <ph name="DOWNLOADED_SIZE">$1<ex>1.2</ex></ph>/<ph name="DOWNLOAD_SIZE">$2<ex>3.4 GB</ex></ph>
...@@ -4309,6 +4309,18 @@ ...@@ -4309,6 +4309,18 @@
<message name="IDS_PLUGIN_VM_REMOVING_NOTIFICATION_FAILED_MESSAGE" desc="Message in the notification shown when removing the 'Plugin VM' app failed."> <message name="IDS_PLUGIN_VM_REMOVING_NOTIFICATION_FAILED_MESSAGE" desc="Message in the notification shown when removing the 'Plugin VM' app failed.">
Couldn't uninstall Plugin VM Couldn't uninstall Plugin VM
</message> </message>
<message name="IDS_PLUGIN_VM_DLC_INTERNAL_FAILED_MESSAGE" desc="Error message shown if Plugin VM installation fails because an internal error indicates the device needs to be updated.">
Your device needs to be updated before you can use Plugin VM.
</message>
<message name="IDS_PLUGIN_VM_DLC_BUSY_FAILED_MESSAGE" desc="Error message shown if Plugin VM installation fails because dlcservice and update_engine are busy.">
Something went wrong. Please wait a few minutes and run Plugin VM again.
</message>
<message name="IDS_PLUGIN_VM_DLC_NEED_REBOOT_FAILED_MESSAGE" desc="Error message shown if Plugin VM installation fails because a pending update requires the device to be restarted.">
Please restart your device to use Plugin VM.
</message>
<message name="IDS_PLUGIN_VM_DLC_NEED_SPACE_FAILED_MESSAGE" desc="Error message shown if Plugin VM installation fails because there is not enough free space on the device.">
Your device is low on storage space. Please free up space to use Plugin VM.
</message>
<!-- Strings for Account Manager error screen --> <!-- Strings for Account Manager error screen -->
<message name="IDS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TITLE" desc="Title for the Chrome OS Account Manager error screen when addition of secondary Google Accounts is disabled."> <message name="IDS_ACCOUNT_MANAGER_SECONDARY_ACCOUNTS_DISABLED_TITLE" desc="Title for the Chrome OS Account Manager error screen when addition of secondary Google Accounts is disabled.">
......
791a00410763595c111806e6e55d051e684325c8
\ No newline at end of file
f0ec9081a558a1e820565ebeab7f06fcc7c18fea
\ No newline at end of file
6db80c623be35908c38d1c91c3b8a47d0380f3a0
\ No newline at end of file
ab2aaafa34246f7a3c88c095348306050c987c4e
\ No newline at end of file
c2812c4f692dc0568d1353b5c4c58eced1b4a5ce 972e7c0020f0ed930ca4707875f23f9675400862
\ No newline at end of file \ No newline at end of file
...@@ -190,38 +190,45 @@ void PluginVmInstaller::OnDlcDownloadCompleted( ...@@ -190,38 +190,45 @@ void PluginVmInstaller::OnDlcDownloadCompleted(
} }
DCHECK_EQ(state_, State::DOWNLOADING_DLC); DCHECK_EQ(state_, State::DOWNLOADING_DLC);
if (err == dlcservice::kErrorInvalidDlc) { // If success, continue to the next state.
LOG(ERROR) << "PluginVM DLC is not supported, need to enable PluginVM DLC."; if (err == dlcservice::kErrorNone) {
state_ = State::DOWNLOAD_DLC_FAILED; RecordPluginVmDlcUseResultHistogram(PluginVmDlcUseResult::kDlcSuccess);
if (observer_) if (observer_)
observer_->OnDownloadFailed(FailureReason::DLC_DOWNLOAD_FAILED); observer_->OnDlcDownloadCompleted();
RecordPluginVmDlcUseResultHistogram( StartDownload();
PluginVmDlcUseResult::kFallbackToRootFsInvalidDlcError);
return; return;
} }
if (err != dlcservice::kErrorNone) { // At this point, PluginVM DLC download failed.
// TODO(b/148470849): Remove this log once PluginVM is converted to DLC and state_ = State::DOWNLOAD_DLC_FAILED;
// invoke |OnDownloadFailed()|. The temporary passthrough is safe as PluginVmDlcUseResult result = PluginVmDlcUseResult::kInternalDlcError;
// PluginVM will be rootfs resident as a fallback. FailureReason reason = FailureReason::DLC_INTERNAL;
LOG(ERROR) << "PluginVM DLC installation failed, falling back to rootfs "
"resident PluginVM. Reason being dlcservice error: " if (err == dlcservice::kErrorInvalidDlc) {
<< err; LOG(ERROR) << "PluginVM DLC is not supported, need to enable PluginVM DLC.";
PluginVmDlcUseResult dlc_use_result = result = PluginVmDlcUseResult::kInvalidDlcError;
PluginVmDlcUseResult::kFallbackToRootFsInternalDlcError; reason = FailureReason::DLC_UNSUPPORTED;
if (err == dlcservice::kErrorBusy) } else if (err == dlcservice::kErrorBusy) {
dlc_use_result = PluginVmDlcUseResult::kFallbackToRootFsBusyDlcError; LOG(ERROR)
else if (err == dlcservice::kErrorNeedReboot) << "PluginVM DLC is not able to be downloaded as dlcservice is busy.";
dlc_use_result = result = PluginVmDlcUseResult::kBusyDlcError;
PluginVmDlcUseResult::kFallbackToRootFsNeedRebootDlcError; reason = FailureReason::DLC_BUSY;
RecordPluginVmDlcUseResultHistogram(dlc_use_result); } else if (err == dlcservice::kErrorNeedReboot) {
LOG(ERROR)
<< "Device has pending update and needs a reboot to use PluginVM DLC.";
result = PluginVmDlcUseResult::kNeedRebootDlcError;
reason = FailureReason::DLC_NEED_REBOOT;
} else if (err == dlcservice::kErrorAllocation) {
LOG(ERROR) << "Device needs to free space to use PluginVM DLC.";
result = PluginVmDlcUseResult::kNeedSpaceDlcError;
reason = FailureReason::DLC_NEED_SPACE;
} else { } else {
RecordPluginVmDlcUseResultHistogram(PluginVmDlcUseResult::kDlcSuccess); LOG(ERROR) << "Failed to download PluginVM DLC: " << err;
} }
RecordPluginVmDlcUseResultHistogram(result);
if (observer_) if (observer_)
observer_->OnDlcDownloadCompleted(); observer_->OnDownloadFailed(reason);
StartDownload();
} }
void PluginVmInstaller::OnDownloadStarted() { void PluginVmInstaller::OnDownloadStarted() {
......
...@@ -58,8 +58,13 @@ class PluginVmInstaller : public KeyedService, ...@@ -58,8 +58,13 @@ class PluginVmInstaller : public KeyedService,
COULD_NOT_OPEN_IMAGE = 13, COULD_NOT_OPEN_IMAGE = 13,
INVALID_IMPORT_RESPONSE = 14, INVALID_IMPORT_RESPONSE = 14,
IMAGE_IMPORT_FAILED = 15, IMAGE_IMPORT_FAILED = 15,
DLC_DOWNLOAD_FAILED = 16, // DLC_DOWNLOAD_FAILED = 16,
// DLC_DOWNLOAD_NOT_STARTED = 17, // DLC_DOWNLOAD_NOT_STARTED = 17,
DLC_INTERNAL = 18,
DLC_UNSUPPORTED = 19,
DLC_BUSY = 20,
DLC_NEED_REBOOT = 21,
DLC_NEED_SPACE = 22,
}; };
// Observer class for the PluginVm image related events. // Observer class for the PluginVm image related events.
......
...@@ -49,6 +49,7 @@ namespace { ...@@ -49,6 +49,7 @@ namespace {
using ::testing::_; using ::testing::_;
using ::testing::AtLeast; using ::testing::AtLeast;
using ::testing::Invoke; using ::testing::Invoke;
using ::testing::StrictMock;
const char kProfileName[] = "p1"; const char kProfileName[] = "p1";
const char kUrl[] = "http://example.com"; const char kUrl[] = "http://example.com";
...@@ -165,7 +166,7 @@ class PluginVmInstallerTestBase : public testing::Test { ...@@ -165,7 +166,7 @@ class PluginVmInstallerTestBase : public testing::Test {
fake_downloaded_plugin_vm_image_archive_ = CreateZipFile(); fake_downloaded_plugin_vm_image_archive_ = CreateZipFile();
installer_ = PluginVmInstallerFactory::GetForProfile(profile_.get()); installer_ = PluginVmInstallerFactory::GetForProfile(profile_.get());
observer_ = std::make_unique<MockObserver>(); observer_ = std::make_unique<StrictMock<MockObserver>>();
installer_->SetObserver(observer_.get()); installer_->SetObserver(observer_.get());
// These actions are required to make the RunUntil* functions work, so tests // These actions are required to make the RunUntil* functions work, so tests
...@@ -391,7 +392,6 @@ TEST_F(PluginVmInstallerDownloadServiceTest, VmExists) { ...@@ -391,7 +392,6 @@ TEST_F(PluginVmInstallerDownloadServiceTest, VmExists) {
->set_list_vms_response(list_vms_response); ->set_list_vms_response(list_vms_response);
EXPECT_CALL(*observer_, OnVmExists()); EXPECT_CALL(*observer_, OnVmExists());
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(0);
StartAndRunToCompletion(); StartAndRunToCompletion();
} }
...@@ -445,6 +445,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest, ...@@ -445,6 +445,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest,
CanProceedWithANewImageWhenSucceededTest) { CanProceedWithANewImageWhenSucceededTest) {
SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_); SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(2);
EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(2); EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(2);
EXPECT_CALL(*observer_, OnImportProgressUpdated(50.0, _)).Times(2); EXPECT_CALL(*observer_, OnImportProgressUpdated(50.0, _)).Times(2);
EXPECT_CALL(*observer_, OnImported()).Times(2); EXPECT_CALL(*observer_, OnImported()).Times(2);
...@@ -487,8 +488,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest, ...@@ -487,8 +488,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest,
} }
TEST_F(PluginVmInstallerDownloadServiceTest, CancelledDownloadTest) { TEST_F(PluginVmInstallerDownloadServiceTest, CancelledDownloadTest) {
EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0); EXPECT_CALL(*observer_, OnDlcDownloadCompleted());
EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(0);
EXPECT_CALL(*observer_, OnDownloadCancelled()); EXPECT_CALL(*observer_, OnDownloadCancelled());
StartAndRunUntilDownloading(); StartAndRunUntilDownloading();
...@@ -503,6 +503,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CancelledDownloadTest) { ...@@ -503,6 +503,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CancelledDownloadTest) {
TEST_F(PluginVmInstallerDownloadServiceTest, ImportNonExistingImageTest) { TEST_F(PluginVmInstallerDownloadServiceTest, ImportNonExistingImageTest) {
SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_); SetupConciergeForSuccessfulDiskImageImport(fake_concierge_client_);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted());
EXPECT_CALL(*observer_, OnDownloadCompleted()); EXPECT_CALL(*observer_, OnDownloadCompleted());
EXPECT_CALL( EXPECT_CALL(
*observer_, *observer_,
...@@ -520,9 +521,8 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CancelledImportTest) { ...@@ -520,9 +521,8 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CancelledImportTest) {
SetupConciergeForCancelDiskImageOperation(fake_concierge_client_, SetupConciergeForCancelDiskImageOperation(fake_concierge_client_,
true /* success */); true /* success */);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted());
EXPECT_CALL(*observer_, OnDownloadCompleted()); EXPECT_CALL(*observer_, OnDownloadCompleted());
EXPECT_CALL(*observer_, OnImported()).Times(0);
EXPECT_CALL(*observer_, OnImportFailed(_)).Times(0);
EXPECT_CALL(*observer_, OnImportCancelled()); EXPECT_CALL(*observer_, OnImportCancelled());
StartAndRunUntilImporting(); StartAndRunUntilImporting();
...@@ -535,7 +535,6 @@ TEST_F(PluginVmInstallerDownloadServiceTest, EmptyPluginVmImageUrlTest) { ...@@ -535,7 +535,6 @@ TEST_F(PluginVmInstallerDownloadServiceTest, EmptyPluginVmImageUrlTest) {
EXPECT_CALL( EXPECT_CALL(
*observer_, *observer_,
OnDownloadFailed(PluginVmInstaller::FailureReason::INVALID_IMAGE_URL)); OnDownloadFailed(PluginVmInstaller::FailureReason::INVALID_IMAGE_URL));
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(0);
StartAndRunToCompletion(); StartAndRunToCompletion();
histogram_tester_->ExpectTotalCount(kPluginVmImageDownloadedSizeHistogram, 0); histogram_tester_->ExpectTotalCount(kPluginVmImageDownloadedSizeHistogram, 0);
...@@ -553,7 +552,6 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CannotStartIfPluginVmIsDisabled) { ...@@ -553,7 +552,6 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CannotStartIfPluginVmIsDisabled) {
chromeos::kPluginVmAllowed, false); chromeos::kPluginVmAllowed, false);
EXPECT_CALL(*observer_, EXPECT_CALL(*observer_,
OnDownloadFailed(PluginVmInstaller::FailureReason::NOT_ALLOWED)); OnDownloadFailed(PluginVmInstaller::FailureReason::NOT_ALLOWED));
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(0);
installer_->Start(); installer_->Start();
task_environment_.RunUntilIdle(); task_environment_.RunUntilIdle();
} }
...@@ -583,6 +581,7 @@ TEST_F(PluginVmInstallerDriveTest, WrongHashDriveTest) { ...@@ -583,6 +581,7 @@ TEST_F(PluginVmInstallerDriveTest, WrongHashDriveTest) {
SetPluginVmImagePref(kDriveUrl, kHash2); SetPluginVmImagePref(kDriveUrl, kHash2);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()); EXPECT_CALL(*observer_, OnDlcDownloadCompleted());
EXPECT_CALL(*observer_, OnDownloadProgressUpdated(_, _, _)).Times(2);
EXPECT_CALL(*observer_, OnDownloadFailed( EXPECT_CALL(*observer_, OnDownloadFailed(
PluginVmInstaller::FailureReason::HASH_MISMATCH)); PluginVmInstaller::FailureReason::HASH_MISMATCH));
...@@ -599,7 +598,6 @@ TEST_F(PluginVmInstallerDriveTest, DriveDownloadFailedAfterStartingTest) { ...@@ -599,7 +598,6 @@ TEST_F(PluginVmInstallerDriveTest, DriveDownloadFailedAfterStartingTest) {
EXPECT_CALL(*observer_, EXPECT_CALL(*observer_,
OnDownloadFailed( OnDownloadFailed(
PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_NETWORK)); PluginVmInstaller::FailureReason::DOWNLOAD_FAILED_NETWORK));
EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0);
StartAndRunToCompletion(); StartAndRunToCompletion();
...@@ -619,7 +617,6 @@ TEST_F(PluginVmInstallerDriveTest, CancelledDriveDownloadTest) { ...@@ -619,7 +617,6 @@ TEST_F(PluginVmInstallerDriveTest, CancelledDriveDownloadTest) {
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()); EXPECT_CALL(*observer_, OnDlcDownloadCompleted());
EXPECT_CALL(*observer_, OnDownloadProgressUpdated(5, 100, _)); EXPECT_CALL(*observer_, OnDownloadProgressUpdated(5, 100, _));
EXPECT_CALL(*observer_, OnDownloadCompleted()).Times(0);
StartAndRunToCompletion(); StartAndRunToCompletion();
...@@ -640,71 +637,70 @@ TEST_F(PluginVmInstallerDriveTest, SuccessfulDriveDownloadTest) { ...@@ -640,71 +637,70 @@ TEST_F(PluginVmInstallerDriveTest, SuccessfulDriveDownloadTest) {
EXPECT_CALL(*observer_, EXPECT_CALL(*observer_,
OnDownloadProgressUpdated(_, std::strlen(kContent), _)) OnDownloadProgressUpdated(_, std::strlen(kContent), _))
.Times(AtLeast(1)); .Times(AtLeast(1));
EXPECT_CALL(*observer_, OnImportFailed(_));
StartAndRunToCompletion(); StartAndRunToCompletion();
histogram_tester_->ExpectUniqueSample(kPluginVmDlcUseResultHistogram, histogram_tester_->ExpectUniqueSample(kPluginVmDlcUseResultHistogram,
PluginVmDlcUseResult::kDlcSuccess, 1); PluginVmDlcUseResult::kDlcSuccess, 1);
} }
// TODO(b/148470849): Modify test to block once PluginVM DLC is stable and TEST_F(PluginVmInstallerDriveTest, InstallingPluingVmDlcInternal) {
// rootfs PluginVM is no longer resident.
TEST_F(PluginVmInstallerDriveTest,
InstallingPluingVmDlcInternalFailureAllowsPassthrough) {
SetPluginVmImagePref(kDriveUrl, kHash); SetPluginVmImagePref(kDriveUrl, kHash);
fake_dlcservice_client_->SetInstallError(dlcservice::kErrorInternal); fake_dlcservice_client_->SetInstallError(dlcservice::kErrorInternal);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()); EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(1);
EXPECT_CALL(*observer_, OnDownloadCompleted());
StartAndRunToCompletion(); StartAndRunToCompletion();
histogram_tester_->ExpectUniqueSample( histogram_tester_->ExpectUniqueSample(kPluginVmDlcUseResultHistogram,
kPluginVmDlcUseResultHistogram, PluginVmDlcUseResult::kInternalDlcError,
PluginVmDlcUseResult::kFallbackToRootFsInternalDlcError, 1); 1);
} }
// TODO(b/148470849): Modify test to block once PluginVM DLC is stable and TEST_F(PluginVmInstallerDriveTest, InstallingPluingVmDlcBusy) {
// rootfs PluginVM is no longer resident.
TEST_F(PluginVmInstallerDriveTest,
InstallingPluingVmDlcBusyFailureAllowsPassthrough) {
SetPluginVmImagePref(kDriveUrl, kHash); SetPluginVmImagePref(kDriveUrl, kHash);
fake_dlcservice_client_->SetInstallError(dlcservice::kErrorBusy); fake_dlcservice_client_->SetInstallError(dlcservice::kErrorBusy);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()); EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(1);
EXPECT_CALL(*observer_, OnDownloadCompleted());
StartAndRunToCompletion(); StartAndRunToCompletion();
histogram_tester_->ExpectUniqueSample( histogram_tester_->ExpectUniqueSample(kPluginVmDlcUseResultHistogram,
kPluginVmDlcUseResultHistogram, PluginVmDlcUseResult::kBusyDlcError, 1);
PluginVmDlcUseResult::kFallbackToRootFsBusyDlcError, 1);
} }
// TODO(b/148470849): Modify test to block once PluginVM DLC is stable and TEST_F(PluginVmInstallerDriveTest, InstallingPluginVmDlcNeedReboot) {
// rootfs PluginVM is no longer resident.
TEST_F(PluginVmInstallerDriveTest,
InstallingPluingVmDlcNeedRebootFailureAllowsPassthrough) {
SetPluginVmImagePref(kDriveUrl, kHash); SetPluginVmImagePref(kDriveUrl, kHash);
fake_dlcservice_client_->SetInstallError(dlcservice::kErrorNeedReboot); fake_dlcservice_client_->SetInstallError(dlcservice::kErrorNeedReboot);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()); EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(1);
EXPECT_CALL(*observer_, OnDownloadCompleted());
StartAndRunToCompletion(); StartAndRunToCompletion();
histogram_tester_->ExpectUniqueSample( histogram_tester_->ExpectUniqueSample(
kPluginVmDlcUseResultHistogram, kPluginVmDlcUseResultHistogram, PluginVmDlcUseResult::kNeedRebootDlcError,
PluginVmDlcUseResult::kFallbackToRootFsNeedRebootDlcError, 1); 1);
}
TEST_F(PluginVmInstallerDriveTest, InstallingPluginVmDlcNeedSpace) {
SetPluginVmImagePref(kDriveUrl, kHash);
fake_dlcservice_client_->SetInstallError(dlcservice::kErrorAllocation);
EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(1);
StartAndRunToCompletion();
histogram_tester_->ExpectUniqueSample(
kPluginVmDlcUseResultHistogram, PluginVmDlcUseResult::kNeedSpaceDlcError,
1);
} }
TEST_F(PluginVmInstallerDriveTest, InstallingPluginVmDlcWhenUnsupported) { TEST_F(PluginVmInstallerDriveTest, InstallingPluginVmDlcWhenUnsupported) {
SetPluginVmImagePref(kDriveUrl, kHash); SetPluginVmImagePref(kDriveUrl, kHash);
fake_dlcservice_client_->SetInstallError(dlcservice::kErrorInvalidDlc); fake_dlcservice_client_->SetInstallError(dlcservice::kErrorInvalidDlc);
EXPECT_CALL(*observer_, OnDlcDownloadCompleted()).Times(0);
EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(1); EXPECT_CALL(*observer_, OnDownloadFailed(_)).Times(1);
StartAndRunToCompletion(); StartAndRunToCompletion();
histogram_tester_->ExpectUniqueSample( histogram_tester_->ExpectUniqueSample(kPluginVmDlcUseResultHistogram,
kPluginVmDlcUseResultHistogram, PluginVmDlcUseResult::kInvalidDlcError,
PluginVmDlcUseResult::kFallbackToRootFsInvalidDlcError, 1); 1);
} }
} // namespace plugin_vm } // namespace plugin_vm
...@@ -51,11 +51,12 @@ enum class PluginVmSetupResult { ...@@ -51,11 +51,12 @@ enum class PluginVmSetupResult {
enum class PluginVmDlcUseResult { enum class PluginVmDlcUseResult {
kDlcSuccess = 0, kDlcSuccess = 0,
kFallbackToRootFsInvalidDlcError = 1, kInvalidDlcError = 1,
kFallbackToRootFsInternalDlcError = 2, kInternalDlcError = 2,
kFallbackToRootFsBusyDlcError = 3, kBusyDlcError = 3,
kFallbackToRootFsNeedRebootDlcError = 4, kNeedRebootDlcError = 4,
kMaxValue = kFallbackToRootFsNeedRebootDlcError, kNeedSpaceDlcError = 5,
kMaxValue = kNeedSpaceDlcError,
}; };
void RecordPluginVmImageDownloadedSizeHistogram(uint64_t bytes_downloaded); void RecordPluginVmImageDownloadedSizeHistogram(uint64_t bytes_downloaded);
......
...@@ -395,8 +395,11 @@ base::string16 PluginVmInstallerView::GetMessage() const { ...@@ -395,8 +395,11 @@ base::string16 PluginVmInstallerView::GetMessage() const {
base::NumberToString16( base::NumberToString16(
static_cast<std::underlying_type_t<Reason>>(*reason_))); static_cast<std::underlying_type_t<Reason>>(*reason_)));
case Reason::NOT_ALLOWED: case Reason::NOT_ALLOWED:
return l10n_util::GetStringUTF16( case Reason::DLC_UNSUPPORTED:
IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE); return l10n_util::GetStringFUTF16(
IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE,
base::NumberToString16(
static_cast<std::underlying_type_t<Reason>>(*reason_)));
case Reason::INVALID_IMAGE_URL: case Reason::INVALID_IMAGE_URL:
case Reason::HASH_MISMATCH: case Reason::HASH_MISMATCH:
return l10n_util::GetStringFUTF16( return l10n_util::GetStringFUTF16(
...@@ -417,6 +420,19 @@ base::string16 PluginVmInstallerView::GetMessage() const { ...@@ -417,6 +420,19 @@ base::string16 PluginVmInstallerView::GetMessage() const {
IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_INSTALLING_FAILED, IDS_PLUGIN_VM_INSTALLER_ERROR_MESSAGE_INSTALLING_FAILED,
base::NumberToString16( base::NumberToString16(
static_cast<std::underlying_type_t<Reason>>(*reason_))); static_cast<std::underlying_type_t<Reason>>(*reason_)));
// DLC Failure Reasons.
case Reason::DLC_INTERNAL:
return l10n_util::GetStringUTF16(
IDS_PLUGIN_VM_DLC_INTERNAL_FAILED_MESSAGE);
case Reason::DLC_BUSY:
return l10n_util::GetStringUTF16(
IDS_PLUGIN_VM_DLC_BUSY_FAILED_MESSAGE);
case Reason::DLC_NEED_REBOOT:
return l10n_util::GetStringUTF16(
IDS_PLUGIN_VM_DLC_NEED_REBOOT_FAILED_MESSAGE);
case Reason::DLC_NEED_SPACE:
return l10n_util::GetStringUTF16(
IDS_PLUGIN_VM_DLC_NEED_SPACE_FAILED_MESSAGE);
} }
} }
} }
......
...@@ -92,7 +92,8 @@ class PluginVmInstallerViewBrowserTest : public DialogBrowserTest { ...@@ -92,7 +92,8 @@ class PluginVmInstallerViewBrowserTest : public DialogBrowserTest {
plugin_vm_image->SetKey("hash", base::Value(hash)); plugin_vm_image->SetKey("hash", base::Value(hash));
} }
void CheckSetupNotAllowed() { void CheckSetupNotAllowed(
plugin_vm::PluginVmInstaller::FailureReason reason) {
EXPECT_FALSE(HasAcceptButton()); EXPECT_FALSE(HasAcceptButton());
EXPECT_TRUE(HasCancelButton()); EXPECT_TRUE(HasCancelButton());
EXPECT_EQ( EXPECT_EQ(
...@@ -100,7 +101,11 @@ class PluginVmInstallerViewBrowserTest : public DialogBrowserTest { ...@@ -100,7 +101,11 @@ class PluginVmInstallerViewBrowserTest : public DialogBrowserTest {
l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_TITLE)); l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_TITLE));
EXPECT_EQ( EXPECT_EQ(
view_->GetMessage(), view_->GetMessage(),
l10n_util::GetStringUTF16(IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE)); l10n_util::GetStringFUTF16(
IDS_PLUGIN_VM_INSTALLER_NOT_ALLOWED_MESSAGE,
base::NumberToString16(
static_cast<std::underlying_type_t<
plugin_vm::PluginVmInstaller::FailureReason>>(reason))));
} }
void WaitForSetupToFinish() { void WaitForSetupToFinish() {
...@@ -284,7 +289,8 @@ IN_PROC_BROWSER_TEST_F( ...@@ -284,7 +289,8 @@ IN_PROC_BROWSER_TEST_F(
// We do not have to wait for setup to finish since the NOT_ALLOWED state // We do not have to wait for setup to finish since the NOT_ALLOWED state
// is set during dialogue construction. // is set during dialogue construction.
CheckSetupNotAllowed(); CheckSetupNotAllowed(
plugin_vm::PluginVmInstaller::FailureReason::NOT_ALLOWED);
histogram_tester_->ExpectUniqueSample( histogram_tester_->ExpectUniqueSample(
plugin_vm::kPluginVmSetupResultHistogram, plugin_vm::kPluginVmSetupResultHistogram,
......
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