xref: /openbmc/obmc-console/test/test-config-parse.c (revision 1e04f449b7f00a7b426615533a44519149d2ea38)
1d30d7573SAndrew Jeffery 
2d30d7573SAndrew Jeffery #include <assert.h>
3d30d7573SAndrew Jeffery #include <stdlib.h>
4d30d7573SAndrew Jeffery #include <stdint.h>
5d30d7573SAndrew Jeffery #include <stdio.h>
6d30d7573SAndrew Jeffery 
7d30d7573SAndrew Jeffery #ifndef SYSCONFDIR
8d30d7573SAndrew Jeffery // Bypass compilation error due to -DSYSCONFDIR not provided
9d30d7573SAndrew Jeffery #define SYSCONFDIR
10d30d7573SAndrew Jeffery #endif
11d30d7573SAndrew Jeffery 
12d30d7573SAndrew Jeffery #include "config.c"
13d30d7573SAndrew Jeffery 
mock_config_from_buffer(const char * input)14*1e04f449SAlexander Hansen static struct config *mock_config_from_buffer(const char *input)
15*1e04f449SAlexander Hansen {
16*1e04f449SAlexander Hansen 	struct config *ctx;
17*1e04f449SAlexander Hansen 	ssize_t rc;
18*1e04f449SAlexander Hansen 
19*1e04f449SAlexander Hansen 	int fd = memfd_create("test-parse-ini", 0);
20*1e04f449SAlexander Hansen 	assert(fd != -1);
21*1e04f449SAlexander Hansen 
22*1e04f449SAlexander Hansen 	const size_t len = strlen(input);
23*1e04f449SAlexander Hansen 	rc = write(fd, input, len);
24*1e04f449SAlexander Hansen 
25*1e04f449SAlexander Hansen 	assert(rc >= 0);
26*1e04f449SAlexander Hansen 	assert((size_t)rc == len);
27*1e04f449SAlexander Hansen 
28*1e04f449SAlexander Hansen 	rc = lseek(fd, 0, SEEK_SET);
29*1e04f449SAlexander Hansen 	assert(rc == 0);
30*1e04f449SAlexander Hansen 
31*1e04f449SAlexander Hansen 	FILE *f = fdopen(fd, "r");
32*1e04f449SAlexander Hansen 	assert(f != NULL);
33*1e04f449SAlexander Hansen 
34*1e04f449SAlexander Hansen 	dictionary *dict = iniparser_load_file(f, "");
35*1e04f449SAlexander Hansen 
36*1e04f449SAlexander Hansen 	fclose(f);
37*1e04f449SAlexander Hansen 
38*1e04f449SAlexander Hansen 	if (dict == NULL) {
39*1e04f449SAlexander Hansen 		return NULL;
40*1e04f449SAlexander Hansen 	}
41*1e04f449SAlexander Hansen 
42*1e04f449SAlexander Hansen 	ctx = calloc(1, sizeof(*ctx));
43*1e04f449SAlexander Hansen 
44*1e04f449SAlexander Hansen 	if (ctx) {
45*1e04f449SAlexander Hansen 		ctx->dict = dict;
46*1e04f449SAlexander Hansen 	}
47*1e04f449SAlexander Hansen 
48*1e04f449SAlexander Hansen 	return ctx;
49*1e04f449SAlexander Hansen }
50*1e04f449SAlexander Hansen 
execute_test(const char * input,const char * key,const char * expected)51a72711afSAndrew Jeffery static void execute_test(const char *input, const char *key,
52a72711afSAndrew Jeffery 			 const char *expected)
53d30d7573SAndrew Jeffery {
54*1e04f449SAlexander Hansen 	struct config *ctx = mock_config_from_buffer(input);
55d30d7573SAndrew Jeffery 	const char *found;
56d30d7573SAndrew Jeffery 
572834c5b1SAndrew Jeffery 	if (!expected) {
58*1e04f449SAlexander Hansen 		if (ctx == NULL) {
59*1e04f449SAlexander Hansen 			return;
602834c5b1SAndrew Jeffery 		}
61*1e04f449SAlexander Hansen 
62*1e04f449SAlexander Hansen 		found = config_get_value(ctx, key);
63*1e04f449SAlexander Hansen 		assert(!found);
64*1e04f449SAlexander Hansen 
65*1e04f449SAlexander Hansen 		goto cleanup;
66*1e04f449SAlexander Hansen 	}
67*1e04f449SAlexander Hansen 
68*1e04f449SAlexander Hansen 	assert(ctx->dict != NULL);
69*1e04f449SAlexander Hansen 	found = config_get_value(ctx, key);
70*1e04f449SAlexander Hansen 
71d30d7573SAndrew Jeffery 	assert(found);
72d30d7573SAndrew Jeffery 	assert(!strcmp(expected, found));
73*1e04f449SAlexander Hansen cleanup:
74d30d7573SAndrew Jeffery 	config_fini(ctx);
75d30d7573SAndrew Jeffery }
76d30d7573SAndrew Jeffery 
test_config_parse_basic(void)77d30d7573SAndrew Jeffery static void test_config_parse_basic(void)
78d30d7573SAndrew Jeffery {
79d30d7573SAndrew Jeffery 	execute_test("tty = ttyS0", "tty", "ttyS0");
80d30d7573SAndrew Jeffery }
81d30d7573SAndrew Jeffery 
test_config_parse_no_key(void)82d30d7573SAndrew Jeffery static void test_config_parse_no_key(void)
83d30d7573SAndrew Jeffery {
84d30d7573SAndrew Jeffery 	execute_test("= ttyS0", "tty", NULL);
85d30d7573SAndrew Jeffery }
86d30d7573SAndrew Jeffery 
test_config_parse_no_value(void)87d30d7573SAndrew Jeffery static void test_config_parse_no_value(void)
88d30d7573SAndrew Jeffery {
89d30d7573SAndrew Jeffery 	execute_test("tty =", "tty", NULL);
90d30d7573SAndrew Jeffery }
91d30d7573SAndrew Jeffery 
test_config_parse_no_operator(void)92d30d7573SAndrew Jeffery static void test_config_parse_no_operator(void)
93d30d7573SAndrew Jeffery {
94d30d7573SAndrew Jeffery 	execute_test("tty ttyS0", "tty", NULL);
95d30d7573SAndrew Jeffery }
96d30d7573SAndrew Jeffery 
test_config_parse_no_spaces(void)97d30d7573SAndrew Jeffery static void test_config_parse_no_spaces(void)
98d30d7573SAndrew Jeffery {
99d30d7573SAndrew Jeffery 	execute_test("tty=ttyS0", "tty", "ttyS0");
100d30d7573SAndrew Jeffery }
101d30d7573SAndrew Jeffery 
test_config_parse_empty(void)102d30d7573SAndrew Jeffery static void test_config_parse_empty(void)
103d30d7573SAndrew Jeffery {
104d30d7573SAndrew Jeffery 	execute_test("", "tty", NULL);
105d30d7573SAndrew Jeffery }
106d30d7573SAndrew Jeffery 
main(void)107d30d7573SAndrew Jeffery int main(void)
108d30d7573SAndrew Jeffery {
109d30d7573SAndrew Jeffery 	test_config_parse_basic();
110d30d7573SAndrew Jeffery 	test_config_parse_no_key();
111d30d7573SAndrew Jeffery 	test_config_parse_no_value();
112d30d7573SAndrew Jeffery 	test_config_parse_no_operator();
113d30d7573SAndrew Jeffery 	test_config_parse_no_spaces();
114d30d7573SAndrew Jeffery 	test_config_parse_empty();
115d30d7573SAndrew Jeffery 
116d30d7573SAndrew Jeffery 	return EXIT_SUCCESS;
117d30d7573SAndrew Jeffery }
118