1 /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 #include "config.h"
3 #include <cJSON.h>
4 #include <errno.h>
5 #include <string.h>
6 #include <stdio.h>
7 #include <sys/stat.h>
8 
9 #include "daemon/config_util.h"
10 
11 #ifdef WIN32
setenv(const char *key, const char *value, int overwrite)12 static void setenv(const char *key, const char *value, int overwrite)
13 {
14     char obj[1024];
15     sprintf(obj, "%s=%s", key, value);
16     _putenv(_strdup(obj));
17 }
18 
unsetenv(const char *key)19 static void unsetenv(const char *key)
20 {
21     char obj[1024];
22     sprintf(obj, "%s=", key);
23     _putenv(_strdup(obj));
24 }
25 #endif
26 
einval(void)27 static void einval(void)
28 {
29    char buff[1];
30    char *fnm = buff;
31    cJSON *json;
32    cb_assert(config_load_file(NULL, NULL) == CONFIG_INVALID_ARGUMENTS);
33    cb_assert(config_load_file(fnm, NULL) == CONFIG_INVALID_ARGUMENTS);
34    cb_assert(config_load_file(NULL, &json) == CONFIG_INVALID_ARGUMENTS);
35 }
36 
no_such_file(void)37 static void no_such_file(void)
38 {
39    cJSON *ptr;
40    config_error_t err = config_load_file("/it/would/suck/if/this/file/exists",
41                                          &ptr);
42    cb_assert(err == CONFIG_NO_SUCH_FILE);
43 }
44 
open_failed(void)45 static void open_failed(void)
46 {
47 #ifndef WIN32
48    /* @todo figure out how do chmod a file on windows ;) */
49    cJSON *ptr;
50    config_error_t err;
51    FILE *fp = fopen("config_test", "w");
52 
53    if (fp == NULL) {
54       fprintf(stderr, "Failed to create file \"config_test\": %s\n",
55               strerror(errno));
56       exit(EXIT_FAILURE);
57    }
58 
59    fclose(fp);
60    chmod("config_test", S_IWUSR);
61 
62    err = config_load_file("config_test", &ptr);
63    remove("config_test");
64    cb_assert(err == CONFIG_OPEN_FAILED);
65 #endif
66 }
67 
malloc_failed(void)68 static void malloc_failed(void)
69 {
70    cJSON *ptr;
71    config_error_t err;
72    FILE *fp = fopen("config_test", "w");
73 
74    if (fp == NULL) {
75       fprintf(stderr, "Failed to create file \"config_test\": %s\n",
76               strerror(errno));
77       exit(EXIT_FAILURE);
78    }
79 
80    fclose(fp);
81 
82    setenv("CONFIG_TEST_MOCK_MALLOC_FAILURE", "on", 1);
83    err = config_load_file("config_test", &ptr);
84    unsetenv("CONFIG_TEST_MOCK_MALLOC_FAILURE");
85 
86    remove("config_test");
87 
88    cb_assert(err == CONFIG_MALLOC_FAILED);
89 }
90 
io_error(void)91 static void io_error(void)
92 {
93    cJSON *ptr;
94    config_error_t err;
95    FILE *fp = fopen("config_test", "w");
96 
97    if (fp == NULL) {
98       fprintf(stderr, "Failed to create file \"config_test\": %s\n",
99               strerror(errno));
100       exit(EXIT_FAILURE);
101    }
102 
103    fclose(fp);
104 
105    setenv("CONFIG_TEST_MOCK_SPOOL_FAILURE", "on", 1);
106    err = config_load_file("config_test", &ptr);
107    unsetenv("CONFIG_TEST_MOCK_SPOOL_FAILURE");
108 
109    remove("config_test");
110 
111    cb_assert(err == CONFIG_IO_ERROR);
112 }
113 
parse_error(void)114 static void parse_error(void)
115 {
116    cJSON *ptr;
117    config_error_t err;
118    FILE *fp = fopen("config_test", "w");
119 
120    if (fp == NULL) {
121       fprintf(stderr, "Failed to create file \"config_test\": %s\n",
122               strerror(errno));
123       exit(EXIT_FAILURE);
124    }
125 
126    fprintf(fp, "{ foo : bar }");
127    fclose(fp);
128 
129    err = config_load_file("config_test", &ptr);
130    remove("config_test");
131 
132    cb_assert(err == CONFIG_PARSE_ERROR);
133 }
134 
parse_success(void)135 static void parse_success(void)
136 {
137    cJSON *ptr = NULL;
138    config_error_t err;
139    FILE *fp = fopen("config_test", "w");
140 
141    if (fp == NULL) {
142       fprintf(stderr, "Failed to create file \"config_test\": %s\n",
143               strerror(errno));
144       exit(EXIT_FAILURE);
145    }
146 
147    fprintf(fp, "{ \"string\" : \"stringval\", \"number\" : 123 }");
148    fclose(fp);
149 
150    err = config_load_file("config_test", &ptr);
151    remove("config_test");
152    cb_assert(ptr != NULL);
153    cJSON_Delete(ptr);
154    cb_assert(err == CONFIG_SUCCESS);
155 }
156 
test_config_strerror(void)157 static void test_config_strerror(void)
158 {
159     int ii;
160     errno = ENOENT;
161     for (ii = 0; ii < 1000; ++ii) {
162         char *msg = config_strerror("foo", (config_error_t)ii);
163         cb_assert(msg != NULL);
164         free(msg);
165     }
166 }
167 
main(void)168 int main(void)
169 {
170    einval();
171    no_such_file();
172    open_failed();
173    malloc_failed();
174    io_error();
175    parse_error();
176    parse_success();
177 
178    test_config_strerror();
179 
180    return 0;
181 }
182