133 lines
4.0 KiB
C++
133 lines
4.0 KiB
C++
/* Copyright 2021 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*
|
|
* Test config_parser.c using gtest.
|
|
*/
|
|
|
|
#include <gtest/gtest.h>
|
|
#include <string>
|
|
|
|
#include "config_parser.h"
|
|
#include "test_util.h"
|
|
#include "util.h"
|
|
|
|
namespace {
|
|
|
|
class ConfigFileTest : public ::testing::Test {
|
|
protected:
|
|
virtual void SetUp() {
|
|
list_ = new_config_entry_list();
|
|
ASSERT_NE(list_, nullptr);
|
|
}
|
|
virtual void TearDown() { free_config_entry_list(list_); }
|
|
struct config_entry_list *list_;
|
|
};
|
|
|
|
} // namespace
|
|
|
|
TEST(ParsingConfigTest, valid_config_line) {
|
|
ScopedConfigEntry entry(
|
|
(config_entry *)calloc(1, sizeof(struct config_entry)));
|
|
const std::vector<std::string> valid_conf_lines = {
|
|
"mount=none",
|
|
"valueless_key"
|
|
"binding = none",
|
|
" xyz = abc ",
|
|
};
|
|
|
|
for (const auto& conf_line : valid_conf_lines) {
|
|
ASSERT_TRUE(parse_config_line(conf_line.c_str(), entry.get()));
|
|
clear_config_entry(entry.get());
|
|
}
|
|
}
|
|
|
|
TEST(ParsingConfigTest, invalid_config_line) {
|
|
ScopedConfigEntry entry(
|
|
(config_entry *)calloc(1, sizeof(struct config_entry)));
|
|
const std::vector<std::string> invalid_conf_lines = {
|
|
"= none",
|
|
"",
|
|
"empty_arg=",
|
|
"empty_arg= ",
|
|
};
|
|
|
|
for (const auto& conf_line : invalid_conf_lines) {
|
|
ASSERT_FALSE(parse_config_line(conf_line.c_str(), entry.get()));
|
|
}
|
|
}
|
|
|
|
TEST_F(ConfigFileTest, malformed_config_line) {
|
|
std::string config = "% minijail-config-file v0\n"
|
|
"=malformed";
|
|
ScopedFILE config_file(write_to_pipe(config));
|
|
ASSERT_NE(config_file.get(), nullptr);
|
|
|
|
bool res = parse_config_file(config_file.get(), list_);
|
|
|
|
// Policy is malformed, but process should not crash.
|
|
ASSERT_FALSE(res);
|
|
ASSERT_EQ(list_->num_entries, 0);
|
|
}
|
|
|
|
TEST_F(ConfigFileTest, bad_directive) {
|
|
std::string config = "% bad-directive\n"
|
|
"# comments";
|
|
ScopedFILE config_file(write_to_pipe(config));
|
|
ASSERT_NE(config_file.get(), nullptr);
|
|
|
|
bool res = parse_config_file(config_file.get(), list_);
|
|
|
|
// Policy is malformed, but process should not crash.
|
|
ASSERT_FALSE(res);
|
|
ASSERT_EQ(list_->num_entries, 0);
|
|
}
|
|
|
|
TEST_F(ConfigFileTest, wellformed_single_line) {
|
|
std::string config = "% minijail-config-file v0\n"
|
|
"# Comments \n"
|
|
"\n"
|
|
"uts\n"
|
|
"mount= xyz\n"
|
|
"binding = none,/tmp";
|
|
ScopedFILE config_file(write_to_pipe(config));
|
|
ASSERT_NE(config_file.get(), nullptr);
|
|
|
|
bool res = parse_config_file(config_file.get(), list_);
|
|
|
|
ASSERT_TRUE(res);
|
|
ASSERT_EQ(list_->num_entries, 3);
|
|
struct config_entry *first_entry = list_->entries;
|
|
struct config_entry *second_entry = list_->entries + 1;
|
|
struct config_entry *third_entry = list_->entries + 2;
|
|
ASSERT_EQ(std::string(first_entry->key), "uts");
|
|
ASSERT_EQ(first_entry->value, nullptr);
|
|
ASSERT_EQ(std::string(second_entry->key), "mount");
|
|
ASSERT_EQ(std::string(second_entry->value), "xyz");
|
|
ASSERT_EQ(std::string(third_entry->key), "binding");
|
|
ASSERT_EQ(std::string(third_entry->value), "none,/tmp");
|
|
}
|
|
|
|
TEST_F(ConfigFileTest, wellformed_multi_line) {
|
|
std::string config = "% minijail-config-file v0\n"
|
|
"# Comments \n"
|
|
"\n"
|
|
"mount = \\\n"
|
|
"none\n"
|
|
"binding = none,\\\n"
|
|
"/tmp";
|
|
ScopedFILE config_file(write_to_pipe(config));
|
|
ASSERT_NE(config_file.get(), nullptr);
|
|
|
|
int res = parse_config_file(config_file.get(), list_);
|
|
|
|
ASSERT_TRUE(res);
|
|
ASSERT_EQ(list_->num_entries, 2);
|
|
struct config_entry *first_entry = list_->entries;
|
|
struct config_entry *second_entry = list_->entries + 1;
|
|
ASSERT_EQ(std::string(first_entry->key), "mount");
|
|
ASSERT_EQ(std::string(first_entry->value), "none");
|
|
ASSERT_EQ(std::string(second_entry->key), "binding");
|
|
ASSERT_EQ(std::string(second_entry->value), "none, /tmp");
|
|
}
|