blob: be088dc67c6d5c4a784209a826b8493241a969b5 [file] [log] [blame]
// Copyright 2018 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "arc/setup/config.h"
#include <utility>
#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>
#include <gtest/gtest.h>
#include "arc/setup/arc_setup_util.h" // for WriteToFile()
namespace arc {
namespace {
constexpr char kValidJsonFile[] =
"{\n"
" \"ARC_TEST_INT\":42,\n"
" \"ARC_TEST_STR\":\"42\",\n"
" \"ARC_TEST_BOOL\":true\n"
"}\n";
constexpr char kInvalidJsonFile[] =
"{\n"
" \"ARC_TEST_INT\":42,\n"
"}\n";
TEST(Config, TestGetInt) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
ASSERT_TRUE(env->SetVar("ARC_TEST_INT", "43"));
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
const base::FilePath file(temp_directory.GetPath().Append("file"));
// Try to parse a valid env file.
ASSERT_TRUE(WriteToFile(file, 0700, kValidJsonFile));
Config config(file, std::move(env));
int var = 0;
EXPECT_TRUE(config.GetInt("ARC_TEST_INT", &var));
EXPECT_EQ(42, var); // not 43. The variable in |env| should be ignored.
// Does the same with -OrDie().
EXPECT_EQ(42, config.GetIntOrDie("ARC_TEST_INT"));
// Verify that type mismatches are caught.
EXPECT_FALSE(config.GetInt("ARC_TEST_STR", &var));
EXPECT_FALSE(config.GetInt("ARC_TEST_BOOL", &var));
EXPECT_FALSE(config.GetInt("ARC_NONEXISTENT", &var));
EXPECT_DEATH(config.GetIntOrDie("ARC_TEST_STR"), ".*");
EXPECT_DEATH(config.GetIntOrDie("ARC_TEST_BOOL"), ".*");
EXPECT_DEATH(config.GetIntOrDie("ARC_NONEXISTENT"), ".*");
}
TEST(Config, TestGetIntFallback) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
ASSERT_TRUE(env->SetVar("ARC_TEST_INT_FALLBACK_1", "42"));
ASSERT_TRUE(env->SetVar("ARC_TEST_INT_FALLBACK_2", "0"));
ASSERT_TRUE(env->SetVar("ARC_TEST_INT_FALLBACK_3", "-42"));
// Invalid values.
ASSERT_TRUE(env->SetVar("ARC_TEST_INT_FALLBACK_4", "1a"));
ASSERT_TRUE(env->SetVar("ARC_TEST_INT_FALLBACK_5", "a1"));
ASSERT_TRUE(env->SetVar("ARC_TEST_INT_FALLBACK_6", "0xff"));
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
const base::FilePath file(temp_directory.GetPath().Append("file"));
// Try to parse a valid env file.
ASSERT_TRUE(WriteToFile(file, 0700, kValidJsonFile));
Config config(file, std::move(env));
int var;
// Since JSON does not define ARC_TEST_INT_FALLBACK_*, |env| should be read.
EXPECT_TRUE(config.GetInt("ARC_TEST_INT_FALLBACK_1", &var));
EXPECT_EQ(42, var);
EXPECT_TRUE(config.GetInt("ARC_TEST_INT_FALLBACK_2", &var));
EXPECT_EQ(0, var);
EXPECT_TRUE(config.GetInt("ARC_TEST_INT_FALLBACK_3", &var));
EXPECT_EQ(-42, var);
EXPECT_FALSE(config.GetInt("ARC_TEST_INT_FALLBACK_4", &var));
EXPECT_FALSE(config.GetInt("ARC_TEST_INT_FALLBACK_5", &var));
EXPECT_FALSE(config.GetInt("ARC_TEST_INT_FALLBACK_6", &var));
}
TEST(Config, TestGetBool) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL", "false"));
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
const base::FilePath file(temp_directory.GetPath().Append("file"));
// Try to parse a valid env file.
ASSERT_TRUE(WriteToFile(file, 0700, kValidJsonFile));
Config config(file, std::move(env));
bool var = false;
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL", &var));
EXPECT_TRUE(var); // The variable in |env| should be ignored.
// Does the same with -OrDie().
EXPECT_TRUE(config.GetBoolOrDie("ARC_TEST_BOOL"));
// Verify that type mismatches are caught.
EXPECT_FALSE(config.GetBool("ARC_TEST_INT", &var));
EXPECT_FALSE(config.GetBool("ARC_TEST_STR", &var));
EXPECT_FALSE(config.GetBool("ARC_NONEXISTENT", &var));
EXPECT_DEATH(config.GetBoolOrDie("ARC_TEST_INT"), ".*");
EXPECT_DEATH(config.GetBoolOrDie("ARC_TEST_STR"), ".*");
EXPECT_DEATH(config.GetBoolOrDie("ARC_NONEXISTENT"), ".*");
}
TEST(Config, TestGetBoolFallback) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_1", "false"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_2", "False"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_3", "FALSE"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_4", "FalsE"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_5", "0"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_6", "true"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_7", "True"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_8", "TRUE"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_9", "TruE"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_10", "1"));
// Invalid values.
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_11", "F"));
ASSERT_TRUE(env->SetVar("ARC_TEST_BOOL_FALLBACK_12", "11"));
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
const base::FilePath file(temp_directory.GetPath().Append("file"));
// Try to parse a valid env file.
ASSERT_TRUE(WriteToFile(file, 0700, kValidJsonFile));
Config config(file, std::move(env));
bool var;
// Since JSON does not define ARC_TEST_BOOL_FALLBACK_*, |env| should be read.
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_1", &var));
EXPECT_FALSE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_2", &var));
EXPECT_FALSE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_3", &var));
EXPECT_FALSE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_4", &var));
EXPECT_FALSE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_5", &var));
EXPECT_FALSE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_6", &var));
EXPECT_TRUE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_7", &var));
EXPECT_TRUE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_8", &var));
EXPECT_TRUE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_9", &var));
EXPECT_TRUE(var);
EXPECT_TRUE(config.GetBool("ARC_TEST_BOOL_FALLBACK_10", &var));
EXPECT_TRUE(var);
EXPECT_FALSE(config.GetBool("ARC_TEST_BOOL_FALLBACK_11", &var));
EXPECT_FALSE(config.GetBool("ARC_TEST_BOOL_FALLBACK_12", &var));
}
TEST(Config, TestGetString) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
ASSERT_TRUE(env->SetVar("ARC_TEST_STR", "str1"));
ASSERT_TRUE(env->SetVar("ARC_TEST_STR_ENVONLY", "str2"));
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
const base::FilePath file(temp_directory.GetPath().Append("file"));
// Try to parse a valid env file.
ASSERT_TRUE(WriteToFile(file, 0700, kValidJsonFile));
Config config(file, std::move(env));
std::string var;
EXPECT_TRUE(config.GetString("ARC_TEST_STR", &var));
// Confirm that the JSON file is searched first.
EXPECT_EQ("42", var); // not "str1"
// Does the same with -OrDie().
EXPECT_EQ("42", config.GetStringOrDie("ARC_TEST_STR"));
// Confirm that the env variables are also searched after JSON.
EXPECT_TRUE(config.GetString("ARC_TEST_STR_ENVONLY", &var));
// Confirm that the JSON file is searched first.
EXPECT_EQ("str2", var);
EXPECT_EQ("str2", config.GetStringOrDie("ARC_TEST_STR_ENVONLY"));
// Verify that type mismatches are caught.
EXPECT_FALSE(config.GetString("ARC_TEST_INT", &var));
EXPECT_FALSE(config.GetString("ARC_TEST_BOOL", &var));
EXPECT_FALSE(config.GetString("ARC_NONEXISTENT", &var));
EXPECT_DEATH(config.GetStringOrDie("ARC_TEST_INT"), ".*");
EXPECT_DEATH(config.GetStringOrDie("ARC_TEST_BOOL"), ".*");
EXPECT_DEATH(config.GetStringOrDie("ARC_NONEXISTENT"), ".*");
}
TEST(Config, TestJsonParseFailure) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
base::ScopedTempDir temp_directory;
ASSERT_TRUE(temp_directory.CreateUniqueTempDir());
const base::FilePath invalid_file(temp_directory.GetPath().Append("file"));
ASSERT_TRUE(WriteToFile(invalid_file, 0700, kInvalidJsonFile));
EXPECT_DEATH(Config(invalid_file, std::move(env)), ".*");
}
} // namespace
} // namespace arc