blob: d23f42f57ef9a590d606bc5d792f86b4a5aaca9c [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/host/host_config.h"
#include <optional>
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/json/json_writer.h"
#include "base/memory/ref_counted.h"
#include "base/values.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace remoting {
namespace {
constexpr char kHostOwnerJid[] = "obfuscated_value@id.talk.google.com";
constexpr char kHostOwnerEmail[] = "host_owner@gmail.com";
constexpr char kServiceAccountEmail[] =
"aaaaaaaabbbbccccddddeeeeeeeeeeee@chromoting.gserviceaccount.com";
constexpr char kHostId[] = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
constexpr char kHostName[] = "TEST_MACHINE_NAME";
constexpr char kRefreshToken[] = "TEST_REFRESH_TOKEN";
constexpr char kPrivateKey[] = "TEST_PRIVATE_KEY";
constexpr char kNewRefreshToken[] = "NEW_REFRESH_TOKEN";
auto kBaseConfig = base::Value::Dict()
.Set(kOAuthRefreshTokenConfigPath, kRefreshToken)
.Set(kHostIdConfigPath, kHostId)
.Set(kHostNameConfigPath, kHostName)
.Set(kPrivateKeyConfigPath, kPrivateKey);
auto kTestConfig = base::Value::Dict(kBaseConfig.Clone())
.Set(kHostOwnerConfigPath, kHostOwnerEmail)
.Set(kServiceAccountConfigPath, kServiceAccountEmail);
auto kLegacyTestConfig =
base::Value::Dict(kBaseConfig.Clone())
.Set(kHostOwnerConfigPath, kHostOwnerJid)
.Set(kDeprecatedHostOwnerEmailConfigPath, kHostOwnerEmail)
.Set(kDeprecatedXmppLoginConfigPath, kServiceAccountEmail);
void WriteTestFile(const base::FilePath& filename,
const base::Value::Dict& file_contents) {
auto json = base::WriteJson(file_contents);
ASSERT_TRUE(json.has_value());
base::WriteFile(filename, *json);
}
} // namespace
class HostConfigTest : public ::testing::TestWithParam<base::Value::Dict*> {
public:
HostConfigTest(const HostConfigTest&) = delete;
HostConfigTest& operator=(const HostConfigTest&) = delete;
protected:
HostConfigTest() = default;
// The temporary directory used to contain the test operations.
base::ScopedTempDir test_dir_;
};
TEST(HostConfigTest, InvalidFile) {
base::ScopedTempDir test_dir;
ASSERT_TRUE(test_dir.CreateUniqueTempDir());
base::FilePath non_existent_file =
test_dir.GetPath().AppendASCII("non_existent.json");
ASSERT_FALSE(HostConfigFromJsonFile(non_existent_file));
}
TEST_P(HostConfigTest, ReadConfigFromFile) {
// Write file directly using base libraries.
ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
base::FilePath test_file_path = test_dir_.GetPath().AppendASCII("read.json");
WriteTestFile(test_file_path, *GetParam());
// Read the config from the test file.
auto target(HostConfigFromJsonFile(test_file_path));
ASSERT_TRUE(target.has_value());
// Verify the expected values.
std::string* value = target->FindString(kHostOwnerConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kHostOwnerEmail);
value = target->FindString(kServiceAccountConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kServiceAccountEmail);
value = target->FindString(kOAuthRefreshTokenConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kRefreshToken);
value = target->FindString(kHostIdConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kHostId);
value = target->FindString(kHostNameConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kHostName);
value = target->FindString(kPrivateKeyConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kPrivateKey);
// Verify deprecated values are not present.
value = target->FindString(kDeprecatedXmppLoginConfigPath);
EXPECT_EQ(value, nullptr);
value = target->FindString(kDeprecatedHostOwnerEmailConfigPath);
EXPECT_EQ(value, nullptr);
// Verify non-existent values are not present.
value = target->FindString("non_existent_value");
EXPECT_EQ(value, nullptr);
}
TEST_P(HostConfigTest, WriteConfigToFile) {
// Write file directly using base libraries.
ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
base::FilePath test_file_path = test_dir_.GetPath().AppendASCII("write.json");
WriteTestFile(test_file_path, *GetParam());
// Read from the test file.
auto target(HostConfigFromJsonFile(test_file_path));
ASSERT_TRUE(target.has_value());
// Modify a value.
target->Set(kOAuthRefreshTokenConfigPath, kNewRefreshToken);
ASSERT_TRUE(HostConfigToJsonFile(*target, test_file_path));
// Now read the file again and check that the value has been written.
auto reader(HostConfigFromJsonFile(test_file_path));
ASSERT_TRUE(reader.has_value());
// Verify the update value was persisted.
std::string* value = target->FindString(kOAuthRefreshTokenConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kNewRefreshToken);
// Verify the rest of the expected values.
value = target->FindString(kHostOwnerConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kHostOwnerEmail);
value = target->FindString(kServiceAccountConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kServiceAccountEmail);
value = target->FindString(kHostIdConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kHostId);
value = target->FindString(kHostNameConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kHostName);
value = target->FindString(kPrivateKeyConfigPath);
ASSERT_NE(value, nullptr);
EXPECT_EQ(*value, kPrivateKey);
// Verify deprecated values are not present.
value = target->FindString(kDeprecatedXmppLoginConfigPath);
EXPECT_EQ(value, nullptr);
value = target->FindString(kDeprecatedHostOwnerEmailConfigPath);
EXPECT_EQ(value, nullptr);
// Verify non-existent values are not present.
value = target->FindString("non_existent_value");
EXPECT_EQ(value, nullptr);
}
INSTANTIATE_TEST_SUITE_P(All,
HostConfigTest,
testing::Values(&kTestConfig, &kLegacyTestConfig));
} // namespace remoting