blob: 2334b67552983d13195a8c99217cea5d840232a2 [file] [log] [blame]
// 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/ui/views/borealis/borealis_installer_view.h"
#include "base/bind.h"
#include "chrome/browser/chromeos/borealis/borealis_context.h"
#include "chrome/browser/chromeos/borealis/borealis_context_manager.h"
#include "chrome/browser/chromeos/borealis/borealis_installer_factory.h"
#include "chrome/browser/chromeos/borealis/borealis_metrics.h"
#include "chrome/browser/chromeos/borealis/borealis_service_fake.h"
#include "chrome/browser/chromeos/borealis/borealis_task.h"
#include "chrome/browser/chromeos/borealis/borealis_util.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/test/test_browser_dialog.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/strings/grit/ui_strings.h"
using ::testing::_;
using InstallationResult = borealis::BorealisInstallResult;
namespace borealis {
namespace {
class BorealisInstallerMock : public borealis::BorealisInstaller {
public:
MOCK_METHOD0(IsProcessing, bool());
MOCK_METHOD0(Start, void());
MOCK_METHOD0(Cancel, void());
MOCK_METHOD1(AddObserver, void(Observer*));
MOCK_METHOD1(RemoveObserver, void(Observer*));
};
class BorealisContextManagerMock : public borealis::BorealisContextManager {
public:
MOCK_METHOD(void,
StartBorealis,
(BorealisContextManager::ResultCallback),
());
MOCK_METHOD(void, ShutDownBorealis, (), ());
};
class BorealisInstallerViewBrowserTest : public DialogBrowserTest {
public:
BorealisInstallerViewBrowserTest() = default;
// DialogBrowserTest:
void SetUpOnMainThread() override {
app_name_ = l10n_util::GetStringUTF16(IDS_BOREALIS_APP_NAME);
mock_installer_ =
static_cast<::testing::StrictMock<BorealisInstallerMock>*>(
borealis::BorealisInstallerFactory::GetInstance()
->SetTestingFactoryAndUse(
browser()->profile(),
base::BindRepeating([](content::BrowserContext* context)
-> std::unique_ptr<KeyedService> {
return std::make_unique<
testing::StrictMock<BorealisInstallerMock>>();
})));
BorealisServiceFake* fake_service =
BorealisServiceFake::UseFakeForTesting(browser()->profile());
fake_service->SetContextManagerForTesting(&mock_context_manager_);
}
void ShowUi(const std::string& name) override {
borealis::ShowBorealisInstallerView(browser()->profile());
view_ = BorealisInstallerView::GetActiveViewForTesting();
EXPECT_FALSE(view_->GetWidget()->IsClosed());
ExpectConfirmationDisplayed();
}
protected:
bool HasAcceptButton() { return view_->GetOkButton() != nullptr; }
bool HasCancelButton() { return view_->GetCancelButton() != nullptr; }
void ExpectConfirmationDisplayed() {
EXPECT_TRUE(HasAcceptButton());
EXPECT_TRUE(HasCancelButton());
EXPECT_EQ(view_->GetPrimaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_INSTALLER_CONFIRMATION_TITLE, app_name_));
}
void ExpectInstallationInProgress() {
EXPECT_FALSE(HasAcceptButton());
EXPECT_TRUE(HasCancelButton());
EXPECT_EQ(view_->GetPrimaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_INSTALLER_ENVIRONMENT_SETTING_TITLE, app_name_));
}
void ExpectInstallationFailedWithRetry() {
EXPECT_TRUE(HasAcceptButton());
EXPECT_TRUE(HasCancelButton());
EXPECT_EQ(view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK),
l10n_util::GetStringUTF16(IDS_BOREALIS_INSTALLER_RETRY_BUTTON));
EXPECT_EQ(view_->GetPrimaryMessage(),
l10n_util::GetStringUTF16(IDS_BOREALIS_INSTALLER_ERROR_TITLE));
}
void ExpectInstallationFailedWithNoRetry() {
EXPECT_FALSE(HasAcceptButton());
EXPECT_TRUE(HasCancelButton());
EXPECT_EQ(view_->GetPrimaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_INSTALLER_NOT_ALLOWED_TITLE, app_name_));
}
void ExpectInstallationCompletedSucessfully() {
EXPECT_TRUE(HasAcceptButton());
EXPECT_EQ(view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_OK),
l10n_util::GetStringUTF16(IDS_BOREALIS_INSTALLER_LAUNCH_BUTTON));
EXPECT_TRUE(HasCancelButton());
EXPECT_EQ(view_->GetDialogButtonLabel(ui::DIALOG_BUTTON_CANCEL),
l10n_util::GetStringUTF16(IDS_APP_CLOSE));
EXPECT_EQ(view_->GetPrimaryMessage(),
l10n_util::GetStringUTF16(IDS_BOREALIS_INSTALLER_FINISHED_TITLE));
}
void AcceptInstallation() {
EXPECT_CALL(*mock_installer_, AddObserver(_));
EXPECT_CALL(*mock_installer_, Start());
view_->AcceptDialog();
view_->SetInstallingStateForTesting(
borealis::BorealisInstaller::InstallingState::kInstallingDlc);
ExpectInstallationInProgress();
}
void ClickCancel() {
EXPECT_CALL(*mock_installer_, RemoveObserver(_));
view_->CancelDialog();
EXPECT_TRUE(view_->GetWidget()->IsClosed());
}
::testing::StrictMock<BorealisInstallerMock>* mock_installer_;
::testing::StrictMock<BorealisContextManagerMock> mock_context_manager_;
BorealisInstallerView* view_;
base::string16 app_name_;
private:
// Disallow copy and assign.
BorealisInstallerViewBrowserTest(const BorealisInstallerViewBrowserTest&) =
delete;
BorealisInstallerViewBrowserTest& operator=(
const BorealisInstallerViewBrowserTest&) = delete;
};
// Test that the dialog can be launched.
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, InvokeUi_default) {
EXPECT_CALL(*mock_installer_, RemoveObserver(_));
EXPECT_CALL(*mock_installer_, Cancel());
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, SucessfulInstall) {
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(InstallationResult::kSuccess);
ExpectInstallationCompletedSucessfully();
EXPECT_CALL(mock_context_manager_, StartBorealis(_));
EXPECT_CALL(*mock_installer_, RemoveObserver(_));
view_->AcceptDialog();
EXPECT_TRUE(view_->GetWidget()->IsClosed());
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest,
ConfirmationCancelled) {
ShowUi("default");
EXPECT_CALL(*mock_installer_, Cancel());
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest,
InstallationCancelled) {
ShowUi("default");
AcceptInstallation();
EXPECT_CALL(*mock_installer_, Cancel());
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest,
InstallationSucessAfterRetry) {
InstallationResult error_type =
InstallationResult::kBorealisInstallInProgress;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(view_->GetSecondaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_INSTALLER_IN_PROGRESS_ERROR_MESSAGE, app_name_));
AcceptInstallation();
view_->OnInstallationEnded(InstallationResult::kSuccess);
ExpectInstallationCompletedSucessfully();
EXPECT_CALL(mock_context_manager_, StartBorealis(_));
EXPECT_CALL(*mock_installer_, RemoveObserver(_));
view_->AcceptDialog();
EXPECT_TRUE(view_->GetWidget()->IsClosed());
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, InProgressError) {
InstallationResult error_type =
InstallationResult::kBorealisInstallInProgress;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(view_->GetSecondaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_INSTALLER_IN_PROGRESS_ERROR_MESSAGE, app_name_));
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, NotAllowedError) {
InstallationResult error_type = InstallationResult::kBorealisNotAllowed;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithNoRetry();
EXPECT_EQ(view_->GetSecondaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_INSTALLER_NOT_ALLOWED_MESSAGE, app_name_,
base::NumberToString16(
static_cast<std::underlying_type_t<InstallationResult>>(
error_type))));
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, DlcInternalError) {
InstallationResult error_type = InstallationResult::kDlcInternalError;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(
view_->GetSecondaryMessage(),
l10n_util::GetStringUTF16(IDS_BOREALIS_DLC_INTERNAL_FAILED_MESSAGE));
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, DlcBusyError) {
InstallationResult error_type = InstallationResult::kDlcBusyError;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(view_->GetSecondaryMessage(),
l10n_util::GetStringFUTF16(IDS_BOREALIS_DLC_BUSY_FAILED_MESSAGE,
app_name_));
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, DlcNeedRebootError) {
InstallationResult error_type = InstallationResult::kDlcNeedRebootError;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(view_->GetSecondaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_DLC_NEED_REBOOT_FAILED_MESSAGE, app_name_));
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, DlcNeedSpaceError) {
InstallationResult error_type = InstallationResult::kDlcNeedSpaceError;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(
view_->GetSecondaryMessage(),
l10n_util::GetStringUTF16(IDS_BOREALIS_INSUFFICIENT_DISK_SPACE_MESSAGE));
ClickCancel();
}
IN_PROC_BROWSER_TEST_F(BorealisInstallerViewBrowserTest, DlcUnknownError) {
InstallationResult error_type = InstallationResult::kDlcUnknownError;
ShowUi("default");
AcceptInstallation();
view_->OnInstallationEnded(error_type);
ExpectInstallationFailedWithRetry();
EXPECT_EQ(view_->GetSecondaryMessage(),
l10n_util::GetStringFUTF16(
IDS_BOREALIS_GENERIC_ERROR_MESSAGE, app_name_,
base::NumberToString16(
static_cast<std::underlying_type_t<InstallationResult>>(
error_type))));
ClickCancel();
}
} // namespace
} // namespace borealis