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