Skip to content

Commit

Permalink
test-config: add tests for some config samples
Browse files Browse the repository at this point in the history
Add infrastructure to easily parse config-samples in our test. This
allows us to add any reports about broken configurations easily, and
making sure we will not run into the same issues again.

Signed-off-by: David Rheinsberg <[email protected]>
  • Loading branch information
dvdhrm committed May 5, 2022
1 parent 03a7d11 commit 33e0595
Showing 1 changed file with 91 additions and 6 deletions.
97 changes: 91 additions & 6 deletions src/launch/test-config.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "launch/config.h"
#include "launch/nss-cache.h"
#include "util/dirwatch.h"
#include "util/syscall.h"

static const char *test_type2str[_CONFIG_NODE_N] = {
[CONFIG_NODE_BUSCONFIG] = "busconfig",
Expand All @@ -35,12 +36,23 @@ static const char *test_type2str[_CONFIG_NODE_N] = {
[CONFIG_NODE_ASSOCIATE] = "associate",
};

static void print_config(const char *path) {
static int config_memfd(const char *data) {
ssize_t n;
int fd;

fd = syscall_memfd_create("dbus-broker-test-config", 0);
c_assert(fd >= 0);
n = write(fd, data, strlen(data));
c_assert(n == (ssize_t)strlen(data));

return fd;
}

static int parse_config(ConfigRoot **rootp, const char *path) {
_c_cleanup_(config_parser_deinit) ConfigParser parser = CONFIG_PARSER_NULL(parser);
_c_cleanup_(config_root_freep) ConfigRoot *root = NULL;
_c_cleanup_(nss_cache_deinit) NSSCache nss_cache = NSS_CACHE_INIT;
_c_cleanup_(dirwatch_freep) Dirwatch *dirwatch = NULL;
ConfigNode *i_node;
int r;

r = dirwatch_new(&dirwatch);
Expand All @@ -49,25 +61,98 @@ static void print_config(const char *path) {
config_parser_init(&parser);

r = config_parser_read(&parser, &root, path, &nss_cache, dirwatch);
if (r)
return r;

*rootp = root;
root = NULL;
return 0;
}

static int parse_config_inline(ConfigRoot **rootp, const char *data) {
_c_cleanup_(c_closep) int fd = -1;
_c_cleanup_(c_freep) char *path = NULL;
int r;

fd = config_memfd(data);
r = asprintf(&path, "/proc/self/fd/%d", fd);
c_assert(r > 0);

return parse_config(rootp, path);
}

static void print_config(const char *path) {
_c_cleanup_(config_root_freep) ConfigRoot *root = NULL;
ConfigNode *i_node;
int r;

r = parse_config(&root, path);
c_assert(!r);

c_list_for_each_entry(i_node, &root->node_list, root_link) {
fprintf(stderr, "<%s>\n", test_type2str[i_node->type]);
}
}

static void test_config(void) {
static void test_config_base(void) {
_c_cleanup_(config_parser_deinit) ConfigParser parser = CONFIG_PARSER_NULL(parser);

config_parser_init(&parser);
config_parser_deinit(&parser);
}

static void test_config_sample0(void) {
_c_cleanup_(config_root_freep) ConfigRoot *root = NULL;
const char *data;
int r;

data =
"<?xml version=\"1.0\"?> <!--*-nxml-*-->\
<!DOCTYPE g PUBLIC \"-/N\"\
\"htt\">\
<busconfig>\
<policy user=\"root\">\
<allow own_prefix=\"oramd\"/>\
<allow send_interface=\"d\"/>\
</policy>\
<user ix=\"d\"/>\
</cy>";

r = parse_config_inline(&root, data);
c_assert(r == CONFIG_E_INVALID);
}

static void test_config_sample1(void) {
_c_cleanup_(config_root_freep) ConfigRoot *root = NULL;
const char *data;
int r;

data =
"<?xml version=\"1.0\"?> <!--*-nxml-*-->\
<!DOCTYPE g PUBLIC \"-/N\"\
\"htt\">\
<busconfig>\
<policy user=\"root\">\
<allow own_prefix=\"oramd\"/>\
<allow send_interface=\"d\"/>\
</policy>\
<policy context=\"default\"/> <user ix=\"d\"/>\
</policy>\
</busconfig>";

r = parse_config_inline(&root, data);
c_assert(r == CONFIG_E_INVALID);
}

int main(int argc, char **argv) {
if (argc < 2)
test_config();
else
if (argc > 1) {
print_config(argv[1]);
return 0;
}

test_config_base();
test_config_sample0();
test_config_sample1();

return 0;
}

0 comments on commit 33e0595

Please sign in to comment.