2 * Copyright (c) 2018 SUSE Linux GmbH
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
31 /* Set these to 1 to get success for current broken behavior */
32 /* Strip leading whitespace between quotes */
33 #define LSTRIP_QUOTED_WSP 0
34 /* Stop parsing at 2nd quote */
35 #define TWO_QUOTES_ONLY 0
37 static char *test_file = "test.conf";
39 /* Missing declaration */
40 int validate_config_strvec(vector strvec, char *file);
42 /* Stringify helpers */
44 #define str(x) _str_(x)
46 static int setup(void **state)
51 static int teardown(void **state)
56 static void test01(void **state)
58 vector v = alloc_strvec("keyword value");
61 assert_int_equal(validate_config_strvec(v, test_file), 0);
62 assert_int_equal(VECTOR_SIZE(v), 2);
63 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
64 assert_string_equal(VECTOR_SLOT(v, 1), "value");
67 assert_string_equal(val, "value");
73 static void test02(void **state)
75 vector v = alloc_strvec("keyword \"value\"");
78 assert_int_equal(validate_config_strvec(v, test_file), 0);
79 assert_int_equal(VECTOR_SIZE(v), 4);
80 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
81 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
82 assert_string_equal(VECTOR_SLOT(v, 2), "value");
83 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
86 assert_string_equal(val, "value");
92 static void test03(void **state)
94 vector v = alloc_strvec("keyword value\n");
97 assert_int_equal(validate_config_strvec(v, test_file), 0);
98 assert_int_equal(VECTOR_SIZE(v), 2);
99 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
100 assert_string_equal(VECTOR_SLOT(v, 1), "value");
103 assert_string_equal(val, "value");
109 static void test04(void **state)
111 vector v = alloc_strvec("keyword \t value \t \n ");
114 assert_int_equal(validate_config_strvec(v, test_file), 0);
115 assert_int_equal(VECTOR_SIZE(v), 2);
116 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
117 assert_string_equal(VECTOR_SLOT(v, 1), "value");
120 assert_string_equal(val, "value");
126 static void test05(void **state)
128 vector v = alloc_strvec("keyword \t value \t ! comment ");
131 assert_int_equal(validate_config_strvec(v, test_file), 0);
132 assert_int_equal(VECTOR_SIZE(v), 2);
133 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
134 assert_string_equal(VECTOR_SLOT(v, 1), "value");
137 assert_string_equal(val, "value");
143 static void test06(void **state)
145 vector v = alloc_strvec("keyword \t value # \n comment ");
148 assert_int_equal(validate_config_strvec(v, test_file), 0);
149 assert_int_equal(VECTOR_SIZE(v), 2);
150 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
151 assert_string_equal(VECTOR_SLOT(v, 1), "value");
154 assert_string_equal(val, "value");
160 static void test07(void **state)
162 vector v = alloc_strvec("keyword \t value more ");
165 assert_int_equal(validate_config_strvec(v, test_file), 0);
166 assert_int_equal(VECTOR_SIZE(v), 3);
167 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
168 assert_string_equal(VECTOR_SLOT(v, 1), "value");
169 assert_string_equal(VECTOR_SLOT(v, 2), "more");
172 assert_string_equal(val, "value");
178 static void test08(void **state)
180 #define QUOTED08 " value more "
181 #define QUOTED08B "value more "
182 vector v = alloc_strvec("keyword \t \"" QUOTED08 "\"");
185 assert_int_equal(validate_config_strvec(v, test_file), 0);
186 assert_int_equal(VECTOR_SIZE(v), 4);
187 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
188 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
189 #if LSTRIP_QUOTED_WSP
190 assert_string_equal(VECTOR_SLOT(v, 2), QUOTED08B);
192 assert_string_equal(VECTOR_SLOT(v, 2), QUOTED08);
194 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
197 #if LSTRIP_QUOTED_WSP
198 assert_string_equal(val, QUOTED08B);
200 assert_string_equal(val, QUOTED08);
206 static void test09(void **state)
208 #define QUOTED09 "value # more"
209 vector v = alloc_strvec("keyword \"" QUOTED09 "\"");
212 assert_int_equal(validate_config_strvec(v, test_file), 0);
213 assert_int_equal(VECTOR_SIZE(v), 4);
214 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
215 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
216 assert_string_equal(VECTOR_SLOT(v, 2), QUOTED09);
217 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
220 assert_string_equal(val, QUOTED09);
226 static void test10(void **state)
228 #define QUOTED10 "value ! more"
229 vector v = alloc_strvec("keyword \"" QUOTED10 "\"");
232 assert_int_equal(validate_config_strvec(v, test_file), 0);
233 assert_int_equal(VECTOR_SIZE(v), 4);
234 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
235 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
236 assert_string_equal(VECTOR_SLOT(v, 2), QUOTED10);
237 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
240 assert_string_equal(val, QUOTED10);
246 static void test11(void **state)
248 #define QUOTED11 "value comment"
249 vector v = alloc_strvec("keyword\"" QUOTED11 "\"");
252 assert_int_equal(validate_config_strvec(v, test_file), 0);
253 assert_int_equal(VECTOR_SIZE(v), 4);
254 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
255 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
256 assert_string_equal(VECTOR_SLOT(v, 2), QUOTED11);
257 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
260 assert_string_equal(val, QUOTED11);
266 static void test12(void **state)
268 vector v = alloc_strvec("key\"word\"");
271 assert_int_equal(validate_config_strvec(v, test_file), 0);
272 assert_int_equal(VECTOR_SIZE(v), 4);
273 assert_string_equal(VECTOR_SLOT(v, 0), "key");
274 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
275 assert_string_equal(VECTOR_SLOT(v, 2), "word");
276 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
279 assert_string_equal(val, "word");
285 static void test13(void **state)
287 vector v = alloc_strvec("keyword value \"quoted\"");
290 assert_int_equal(validate_config_strvec(v, test_file), 0);
291 assert_int_equal(VECTOR_SIZE(v), 5);
292 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
293 assert_string_equal(VECTOR_SLOT(v, 1), "value");
294 assert_true(is_quote(VECTOR_SLOT(v, 2)));;
295 assert_string_equal(VECTOR_SLOT(v, 3), "quoted");
296 assert_true(is_quote(VECTOR_SLOT(v, 4)));;
299 assert_string_equal(val, "value");
305 static void test14(void **state)
307 vector v = alloc_strvec("keyword \"value \" comment\"\"");
310 assert_int_equal(validate_config_strvec(v, test_file), 0);
311 assert_int_equal(VECTOR_SIZE(v), 7);
312 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
313 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
314 assert_string_equal(VECTOR_SLOT(v, 2), "value ");
315 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
316 assert_string_equal(VECTOR_SLOT(v, 4), "comment");
317 assert_true(is_quote(VECTOR_SLOT(v, 5)));;
318 assert_true(is_quote(VECTOR_SLOT(v, 6)));;
321 assert_string_equal(val, "value ");
327 static void test15(void **state)
329 #define QUOTED15 "word value\n comment"
330 vector v = alloc_strvec("key\"" QUOTED15 "\"");
333 assert_int_equal(VECTOR_SIZE(v), 4);
334 assert_string_equal(VECTOR_SLOT(v, 0), "key");
335 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
336 assert_string_equal(VECTOR_SLOT(v, 2), QUOTED15);
337 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
338 assert_int_equal(validate_config_strvec(v, test_file), 0);
341 assert_string_equal(val, QUOTED15);
347 static void test16(void **state)
349 vector v = alloc_strvec("keyword \"2.5\"\" SSD\"");
353 assert_int_equal(validate_config_strvec(v, test_file), 0);
354 assert_int_equal(VECTOR_SIZE(v), 6);
355 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
356 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
357 assert_string_equal(VECTOR_SLOT(v, 2), "2.5");
358 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
359 assert_string_equal(VECTOR_SLOT(v, 4), "SSD");
360 assert_true(is_quote(VECTOR_SLOT(v, 5)));;
363 assert_string_equal(val, "2.5");
365 assert_int_equal(VECTOR_SIZE(v), 4);
366 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
367 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
368 assert_string_equal(VECTOR_SLOT(v, 2), "2.5\" SSD");
369 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
372 assert_string_equal(val, "2.5\" SSD");
378 static void test17(void **state)
380 vector v = alloc_strvec("keyword \"\"\"\"\" is empty\"");
383 assert_int_equal(validate_config_strvec(v, test_file), 0);
384 assert_int_equal(VECTOR_SIZE(v), 6);
385 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
386 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
387 assert_true(is_quote(VECTOR_SLOT(v, 2)));;
388 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
389 #if LSTRIP_QUOTED_WSP
390 assert_string_equal(VECTOR_SLOT(v, 4), "is empty");
392 assert_string_equal(VECTOR_SLOT(v, 4), " is empty");
394 assert_true(is_quote(VECTOR_SLOT(v, 5)));;
397 assert_string_equal(val, "");
399 assert_int_equal(validate_config_strvec(v, test_file), 0);
400 assert_int_equal(VECTOR_SIZE(v), 4);
401 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
402 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
403 assert_string_equal(VECTOR_SLOT(v, 2), "\"\" is empty");
404 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
407 assert_string_equal(val, "\"\" is empty");
413 static void test18(void **state)
415 vector v = alloc_strvec("keyword \"\"\"\"");
418 assert_int_equal(validate_config_strvec(v, test_file), 0);
419 assert_int_equal(VECTOR_SIZE(v), 5);
420 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
421 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
422 assert_true(is_quote(VECTOR_SLOT(v, 2)));;
423 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
424 assert_true(is_quote(VECTOR_SLOT(v, 4)));;
427 assert_string_equal(val, "");
429 assert_int_equal(validate_config_strvec(v, test_file), 0);
430 assert_int_equal(VECTOR_SIZE(v), 4);
431 assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
432 assert_true(is_quote(VECTOR_SLOT(v, 1)));;
433 assert_string_equal(VECTOR_SLOT(v, 2), "\"");
434 assert_true(is_quote(VECTOR_SLOT(v, 3)));;
437 assert_string_equal(val, "\"");
443 int test_config_parser(void)
445 const struct CMUnitTest tests[] = {
446 cmocka_unit_test(test01),
447 cmocka_unit_test(test02),
448 cmocka_unit_test(test03),
449 cmocka_unit_test(test04),
450 cmocka_unit_test(test05),
451 cmocka_unit_test(test06),
452 cmocka_unit_test(test07),
453 cmocka_unit_test(test08),
454 cmocka_unit_test(test09),
455 cmocka_unit_test(test10),
456 cmocka_unit_test(test11),
457 cmocka_unit_test(test12),
458 cmocka_unit_test(test13),
459 cmocka_unit_test(test14),
460 cmocka_unit_test(test15),
461 cmocka_unit_test(test16),
462 cmocka_unit_test(test17),
463 cmocka_unit_test(test18),
465 return cmocka_run_group_tests(tests, setup, teardown);
472 ret += test_config_parser();