blob: ac1c1ebfb92b01abfcd9551e24e050d9865e672d [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/ash/app_mode/kiosk_app_launch_error.h"
#include <string>
#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/test/base/scoped_testing_local_state.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chromeos/login/auth/auth_status_consumer.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
namespace ash {
using ::chromeos::AuthFailure;
using ::chromeos::KioskAppLaunchError;
namespace {
// Key under "kiosk" dictionary to store the last launch error.
constexpr char kKeyLaunchError[] = "launch_error";
// Key under "kiosk" dictionary to store the last cryptohome error.
constexpr char kKeyCryptohomeFailure[] = "cryptohome_failure";
// Get Kiosk dictionary value. It is replaced after each update.
const base::DictionaryValue* GetKioskDictionary() {
return g_browser_process->local_state()->GetDictionary(
KioskAppManager::kKioskDictionaryName);
}
} // namespace
class KioskAppLaunchErrorTest : public testing::Test {
public:
KioskAppLaunchErrorTest()
: local_state_(TestingBrowserProcess::GetGlobal()) {}
~KioskAppLaunchErrorTest() override = default;
// Verify the mapping from the error code to the message.
void VerifyErrorMessage(KioskAppLaunchError::Error error,
const std::string& expected_message) const {
EXPECT_EQ(KioskAppLaunchError::GetErrorMessage(error), expected_message);
}
private:
ScopedTestingLocalState local_state_;
};
TEST_F(KioskAppLaunchErrorTest, GetErrorMessage) {
std::string expected_message;
VerifyErrorMessage(KioskAppLaunchError::Error::kNone, expected_message);
expected_message = l10n_util::GetStringUTF8(IDS_KIOSK_APP_FAILED_TO_LAUNCH);
VerifyErrorMessage(KioskAppLaunchError::Error::kHasPendingLaunch,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kNotKioskEnabled,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kUnableToRetrieveHash,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kPolicyLoadFailed,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kArcAuthFailed,
expected_message);
expected_message =
l10n_util::GetStringUTF8(IDS_KIOSK_APP_ERROR_UNABLE_TO_MOUNT);
VerifyErrorMessage(KioskAppLaunchError::Error::kCryptohomedNotRunning,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kAlreadyMounted,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kUnableToMount,
expected_message);
VerifyErrorMessage(KioskAppLaunchError::Error::kUnableToRemove,
expected_message);
expected_message =
l10n_util::GetStringUTF8(IDS_KIOSK_APP_ERROR_UNABLE_TO_INSTALL);
VerifyErrorMessage(KioskAppLaunchError::Error::kUnableToInstall,
expected_message);
expected_message = l10n_util::GetStringUTF8(IDS_KIOSK_APP_ERROR_USER_CANCEL);
VerifyErrorMessage(KioskAppLaunchError::Error::kUserCancel, expected_message);
expected_message =
l10n_util::GetStringUTF8(IDS_KIOSK_APP_ERROR_UNABLE_TO_DOWNLOAD);
VerifyErrorMessage(KioskAppLaunchError::Error::kUnableToDownload,
expected_message);
expected_message =
l10n_util::GetStringUTF8(IDS_KIOSK_APP_ERROR_UNABLE_TO_LAUNCH);
VerifyErrorMessage(KioskAppLaunchError::Error::kUnableToLaunch,
expected_message);
}
TEST_F(KioskAppLaunchErrorTest, SaveError) {
// No launch error is stored before it is saved.
EXPECT_EQ(GetKioskDictionary()->FindKey(kKeyLaunchError), nullptr);
KioskAppLaunchError::Save(KioskAppLaunchError::Error::kCount);
// The launch error can be retrieved.
int out_error;
EXPECT_TRUE(GetKioskDictionary()->GetInteger(kKeyLaunchError, &out_error));
EXPECT_EQ(out_error, static_cast<int>(KioskAppLaunchError::Error::kCount));
EXPECT_EQ(KioskAppLaunchError::Get(), KioskAppLaunchError::Error::kCount);
// The launch error is cleaned up after clear operation.
KioskAppLaunchError::RecordMetricAndClear();
EXPECT_EQ(GetKioskDictionary()->FindKey(kKeyLaunchError), nullptr);
EXPECT_EQ(KioskAppLaunchError::Get(), KioskAppLaunchError::Error::kNone);
}
TEST_F(KioskAppLaunchErrorTest, SaveCryptohomeFailure) {
// No cryptohome failure is stored before it is saved.
EXPECT_EQ(GetKioskDictionary()->FindKey(kKeyCryptohomeFailure), nullptr);
AuthFailure auth_failure(AuthFailure::FailureReason::AUTH_DISABLED);
KioskAppLaunchError::SaveCryptohomeFailure(auth_failure);
// The cryptohome failure can be retrieved.
int out_error;
EXPECT_TRUE(
GetKioskDictionary()->GetInteger(kKeyCryptohomeFailure, &out_error));
EXPECT_EQ(out_error, auth_failure.reason());
// The cryptohome failure is cleaned up after clear operation.
KioskAppLaunchError::RecordMetricAndClear();
EXPECT_EQ(GetKioskDictionary()->FindKey(kKeyCryptohomeFailure), nullptr);
}
} // namespace ash