1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017 Wind River Systems, Inc.
3 */
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <stdint.h>
8 #include <sys/queue.h>
9
10 #include <rte_cfgfile.h>
11
12 #include "test.h"
13 #include "resource.h"
14
15
16 #define CFG_FILES_ETC "test_cfgfiles/etc"
17
18 REGISTER_LINKED_RESOURCE(test_cfgfiles);
19
20 static int
test_cfgfile_setup(void)21 test_cfgfile_setup(void)
22 {
23 const struct resource *r;
24 int ret;
25
26 r = resource_find("test_cfgfiles");
27 TEST_ASSERT_NOT_NULL(r, "missing resource test_cfgfiles");
28
29 ret = resource_untar(r);
30 TEST_ASSERT_SUCCESS(ret, "failed to untar %s", r->name);
31
32 return 0;
33 }
34
35 static int
test_cfgfile_cleanup(void)36 test_cfgfile_cleanup(void)
37 {
38 const struct resource *r;
39 int ret;
40
41 r = resource_find("test_cfgfiles");
42 TEST_ASSERT_NOT_NULL(r, "missing resource test_cfgfiles");
43
44 ret = resource_rm_by_tar(r);
45 TEST_ASSERT_SUCCESS(ret, "Failed to delete resource %s", r->name);
46
47 return 0;
48 }
49
50 static int
_test_cfgfile_sample(struct rte_cfgfile * cfgfile)51 _test_cfgfile_sample(struct rte_cfgfile *cfgfile)
52 {
53 const char *value;
54 int ret;
55
56 ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
57 TEST_ASSERT(ret == 2, "Unexpected number of sections: %d", ret);
58
59 ret = rte_cfgfile_has_section(cfgfile, "section1");
60 TEST_ASSERT(ret, "section1 section missing");
61
62 ret = rte_cfgfile_section_num_entries(cfgfile, "section1");
63 TEST_ASSERT(ret == 1, "section1 unexpected number of entries: %d", ret);
64
65 value = rte_cfgfile_get_entry(cfgfile, "section1", "key1");
66 TEST_ASSERT(strcmp("value1", value) == 0,
67 "key1 unexpected value: %s", value);
68
69 ret = rte_cfgfile_has_section(cfgfile, "section2");
70 TEST_ASSERT(ret, "section2 section missing");
71
72 ret = rte_cfgfile_section_num_entries(cfgfile, "section2");
73 TEST_ASSERT(ret == 2, "section2 unexpected number of entries: %d", ret);
74
75 value = rte_cfgfile_get_entry(cfgfile, "section2", "key2");
76 TEST_ASSERT(strcmp("value2", value) == 0,
77 "key2 unexpected value: %s", value);
78
79 value = rte_cfgfile_get_entry(cfgfile, "section2", "key3");
80 TEST_ASSERT(strcmp("value3", value) == 0,
81 "key3 unexpected value: %s", value);
82
83 return 0;
84 }
85
86 static int
test_cfgfile_sample1(void)87 test_cfgfile_sample1(void)
88 {
89 struct rte_cfgfile *cfgfile;
90 int ret;
91
92 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/sample1.ini", 0);
93 TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
94
95 ret = _test_cfgfile_sample(cfgfile);
96 TEST_ASSERT_SUCCESS(ret, "Failed to validate sample file: %d", ret);
97
98 ret = rte_cfgfile_close(cfgfile);
99 TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
100
101 return 0;
102 }
103
104 static int
test_cfgfile_sample2(void)105 test_cfgfile_sample2(void)
106 {
107 struct rte_cfgfile_parameters params;
108 struct rte_cfgfile *cfgfile;
109 int ret;
110
111 /* override comment character */
112 memset(¶ms, 0, sizeof(params));
113 params.comment_character = '#';
114
115 cfgfile = rte_cfgfile_load_with_params(CFG_FILES_ETC "/sample2.ini", 0,
116 ¶ms);
117 TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse sample2.ini");
118
119 ret = _test_cfgfile_sample(cfgfile);
120 TEST_ASSERT_SUCCESS(ret, "Failed to validate sample file: %d", ret);
121
122 ret = rte_cfgfile_close(cfgfile);
123 TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
124
125 return 0;
126 }
127
128 static int
test_cfgfile_realloc_sections(void)129 test_cfgfile_realloc_sections(void)
130 {
131 struct rte_cfgfile *cfgfile;
132 int ret;
133 const char *value;
134
135 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/realloc_sections.ini", 0);
136 TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
137
138 ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
139 TEST_ASSERT(ret == 9, "Unexpected number of sections: %d", ret);
140
141 ret = rte_cfgfile_has_section(cfgfile, "section9");
142 TEST_ASSERT(ret, "section9 missing");
143
144 ret = rte_cfgfile_section_num_entries(cfgfile, "section3");
145 TEST_ASSERT(ret == 21,
146 "section3 unexpected number of entries: %d", ret);
147
148 ret = rte_cfgfile_section_num_entries(cfgfile, "section9");
149 TEST_ASSERT(ret == 8, "section9 unexpected number of entries: %d", ret);
150
151 value = rte_cfgfile_get_entry(cfgfile, "section9", "key8");
152 TEST_ASSERT(strcmp("value8_section9", value) == 0,
153 "key unexpected value: %s", value);
154
155 ret = rte_cfgfile_save(cfgfile, "/tmp/cfgfile_save.ini");
156 TEST_ASSERT_SUCCESS(ret, "Failed to save *.ini file");
157 remove("/tmp/cfgfile_save.ini");
158
159 ret = rte_cfgfile_close(cfgfile);
160 TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
161
162 return 0;
163 }
164
165 static int
test_cfgfile_invalid_section_header(void)166 test_cfgfile_invalid_section_header(void)
167 {
168 struct rte_cfgfile *cfgfile;
169
170 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/invalid_section.ini", 0);
171 TEST_ASSERT_NULL(cfgfile, "Expected failured did not occur");
172
173 return 0;
174 }
175
176 static int
test_cfgfile_invalid_comment(void)177 test_cfgfile_invalid_comment(void)
178 {
179 struct rte_cfgfile_parameters params;
180 struct rte_cfgfile *cfgfile;
181
182 /* override comment character with an invalid one */
183 memset(¶ms, 0, sizeof(params));
184 params.comment_character = '$';
185
186 cfgfile = rte_cfgfile_load_with_params(CFG_FILES_ETC "/sample2.ini", 0,
187 ¶ms);
188 TEST_ASSERT_NULL(cfgfile, "Expected failured did not occur");
189
190 return 0;
191 }
192
193 static int
test_cfgfile_invalid_key_value_pair(void)194 test_cfgfile_invalid_key_value_pair(void)
195 {
196 struct rte_cfgfile *cfgfile;
197
198 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty_key_value.ini", 0);
199 TEST_ASSERT_NULL(cfgfile, "Expected failured did not occur");
200
201 return 0;
202 }
203
204 static int
test_cfgfile_empty_key_value_pair(void)205 test_cfgfile_empty_key_value_pair(void)
206 {
207 struct rte_cfgfile *cfgfile;
208 const char *value;
209 int ret;
210
211 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty_key_value.ini",
212 CFG_FLAG_EMPTY_VALUES);
213 TEST_ASSERT_NOT_NULL(cfgfile, "Failed to parse empty_key_value.ini");
214
215 ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
216 TEST_ASSERT(ret == 1, "Unexpected number of sections: %d", ret);
217
218 ret = rte_cfgfile_has_section(cfgfile, "section1");
219 TEST_ASSERT(ret, "section1 missing");
220
221 ret = rte_cfgfile_section_num_entries(cfgfile, "section1");
222 TEST_ASSERT(ret == 1, "section1 unexpected number of entries: %d", ret);
223
224 value = rte_cfgfile_get_entry(cfgfile, "section1", "key");
225 TEST_ASSERT(strlen(value) == 0, "key unexpected value: %s", value);
226
227 ret = rte_cfgfile_close(cfgfile);
228 TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
229
230 return 0;
231 }
232
233 static int
test_cfgfile_missing_section(void)234 test_cfgfile_missing_section(void)
235 {
236 struct rte_cfgfile *cfgfile;
237
238 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/missing_section.ini", 0);
239 TEST_ASSERT_NULL(cfgfile, "Expected failured did not occur");
240
241 return 0;
242 }
243
244 static int
test_cfgfile_global_properties(void)245 test_cfgfile_global_properties(void)
246 {
247 struct rte_cfgfile *cfgfile;
248 const char *value;
249 int ret;
250
251 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/missing_section.ini",
252 CFG_FLAG_GLOBAL_SECTION);
253 TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
254
255 ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
256 TEST_ASSERT(ret == 1, "Unexpected number of sections: %d", ret);
257
258 ret = rte_cfgfile_has_section(cfgfile, "GLOBAL");
259 TEST_ASSERT(ret, "global section missing");
260
261 ret = rte_cfgfile_section_num_entries(cfgfile, "GLOBAL");
262 TEST_ASSERT(ret == 1, "GLOBAL unexpected number of entries: %d", ret);
263
264 value = rte_cfgfile_get_entry(cfgfile, "GLOBAL", "key");
265 TEST_ASSERT(strcmp("value", value) == 0,
266 "key unexpected value: %s", value);
267
268 ret = rte_cfgfile_close(cfgfile);
269 TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
270
271 return 0;
272 }
273
274 static int
test_cfgfile_empty_file(void)275 test_cfgfile_empty_file(void)
276 {
277 struct rte_cfgfile *cfgfile;
278 int ret;
279
280 cfgfile = rte_cfgfile_load(CFG_FILES_ETC "/empty.ini", 0);
281 TEST_ASSERT_NOT_NULL(cfgfile, "Failed to load config file");
282
283 ret = rte_cfgfile_num_sections(cfgfile, NULL, 0);
284 TEST_ASSERT(ret == 0, "Unexpected number of sections: %d", ret);
285
286 ret = rte_cfgfile_close(cfgfile);
287 TEST_ASSERT_SUCCESS(ret, "Failed to close cfgfile");
288
289 return 0;
290 }
291
292 static int
test_cfgfile(void)293 test_cfgfile(void)
294 {
295 if (test_cfgfile_setup())
296 return -1;
297
298 if (test_cfgfile_sample1())
299 return -1;
300
301 if (test_cfgfile_sample2())
302 return -1;
303
304 if (test_cfgfile_realloc_sections())
305 return -1;
306
307 if (test_cfgfile_invalid_section_header())
308 return -1;
309
310 if (test_cfgfile_invalid_comment())
311 return -1;
312
313 if (test_cfgfile_invalid_key_value_pair())
314 return -1;
315
316 if (test_cfgfile_empty_key_value_pair())
317 return -1;
318
319 if (test_cfgfile_missing_section())
320 return -1;
321
322 if (test_cfgfile_global_properties())
323 return -1;
324
325 if (test_cfgfile_empty_file())
326 return -1;
327
328 if (test_cfgfile_cleanup())
329 return -1;
330
331 return 0;
332 }
333
334 REGISTER_TEST_COMMAND(cfgfile_autotest, test_cfgfile);
335