blob: 136c2f6b9648df113840e01cbbb0986319b36764 [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 "chromeos/login/auth/sync_trusted_vault_keys.h"
#include "base/optional.h"
#include "base/values.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace {
using testing::ElementsAre;
using testing::Eq;
using testing::IsEmpty;
using testing::NotNull;
MATCHER(HasEmptyValue, "") {
return arg.encryption_keys().empty() &&
arg.last_encryption_key_version() == 0 &&
arg.trusted_public_keys().empty();
}
base::DictionaryValue MakeKeyValueWithoutVersion(
const std::vector<uint8_t>& key_material) {
base::DictionaryValue key_value;
key_value.SetKey("keyMaterial", base::Value(key_material));
return key_value;
}
base::DictionaryValue MakeKeyValue(const std::vector<uint8_t>& key_material,
int version) {
base::DictionaryValue key_value = MakeKeyValueWithoutVersion(key_material);
key_value.SetIntKey("version", version);
return key_value;
}
} // namespace
TEST(SyncTrustedVaultKeysTest, DefaultConstructor) {
EXPECT_THAT(SyncTrustedVaultKeys(), HasEmptyValue());
}
TEST(SyncTrustedVaultKeysTest, FromJsWithEmptyDictionary) {
EXPECT_THAT(SyncTrustedVaultKeys::FromJs(base::DictionaryValue()),
HasEmptyValue());
}
TEST(SyncTrustedVaultKeysTest, FromJsWithInvalidDictionary) {
base::DictionaryValue value;
value.SetStringKey("foo", "bar");
EXPECT_THAT(SyncTrustedVaultKeys::FromJs(value), HasEmptyValue());
}
TEST(SyncTrustedVaultKeysTest, FromJsWithEncryptionKeys) {
const std::vector<uint8_t> kEncryptionKeyMaterial1 = {1, 2, 3, 4};
const std::vector<uint8_t> kEncryptionKeyMaterial2 = {5, 6, 7, 8};
const int kEncryptionKeyVersion1 = 17;
const int kEncryptionKeyVersion2 = 15;
std::vector<base::Value> key_values;
key_values.push_back(
MakeKeyValue(kEncryptionKeyMaterial1, kEncryptionKeyVersion1));
key_values.push_back(
MakeKeyValue(kEncryptionKeyMaterial2, kEncryptionKeyVersion2));
base::DictionaryValue root_value;
root_value.SetKey("encryptionKeys", base::Value(std::move(key_values)));
const SyncTrustedVaultKeys actual_converted_keys =
SyncTrustedVaultKeys::FromJs(root_value);
EXPECT_THAT(actual_converted_keys.last_encryption_key_version(),
Eq(kEncryptionKeyVersion2));
EXPECT_THAT(actual_converted_keys.encryption_keys(),
ElementsAre(kEncryptionKeyMaterial1, kEncryptionKeyMaterial2));
EXPECT_THAT(actual_converted_keys.trusted_public_keys(), IsEmpty());
}
TEST(SyncTrustedVaultKeysTest, FromJsWithEncryptionKeysWithMissingVersion) {
const std::vector<uint8_t> kEncryptionKeyMaterial1 = {1, 2, 3, 4};
const std::vector<uint8_t> kEncryptionKeyMaterial2 = {5, 6, 7, 8};
const int kEncryptionKeyVersion1 = 17;
std::vector<base::Value> key_values;
key_values.push_back(
MakeKeyValue(kEncryptionKeyMaterial1, kEncryptionKeyVersion1));
key_values.push_back(MakeKeyValueWithoutVersion(kEncryptionKeyMaterial2));
base::DictionaryValue root_value;
root_value.SetKey("encryptionKeys", base::Value(std::move(key_values)));
const SyncTrustedVaultKeys actual_converted_keys =
SyncTrustedVaultKeys::FromJs(root_value);
EXPECT_THAT(actual_converted_keys.last_encryption_key_version(),
Eq(kEncryptionKeyVersion1));
EXPECT_THAT(actual_converted_keys.encryption_keys(),
ElementsAre(kEncryptionKeyMaterial1));
EXPECT_THAT(actual_converted_keys.trusted_public_keys(), IsEmpty());
}
TEST(SyncTrustedVaultKeysTest, FromJsWithTrustedPublicKeys) {
const std::vector<uint8_t> kPublicKeyMaterial1 = {1, 2, 3, 4};
const std::vector<uint8_t> kPublicKeyMaterial2 = {5, 6, 7, 8};
std::vector<base::Value> key_values;
key_values.push_back(MakeKeyValueWithoutVersion(kPublicKeyMaterial1));
key_values.push_back(MakeKeyValueWithoutVersion(kPublicKeyMaterial2));
base::DictionaryValue root_value;
root_value.SetKey("trustedPublicKeys", base::Value(std::move(key_values)));
const SyncTrustedVaultKeys actual_converted_keys =
SyncTrustedVaultKeys::FromJs(root_value);
EXPECT_THAT(actual_converted_keys.last_encryption_key_version(), Eq(0));
EXPECT_THAT(actual_converted_keys.encryption_keys(), IsEmpty());
EXPECT_THAT(actual_converted_keys.trusted_public_keys(),
ElementsAre(kPublicKeyMaterial1, kPublicKeyMaterial2));
}
} // namespace chromeos