tests: add unit tests for config file parser
authorMartin Wilck <mwilck@suse.com>
Wed, 7 Mar 2018 23:26:16 +0000 (00:26 +0100)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Sat, 10 Mar 2018 07:24:11 +0000 (08:24 +0100)
Add test cases for parsing the config file.

Some of these tests currently fail. The patches that follow fix them.

Signed-off-by: Martin Wilck <mwilck@suse.com>
tests/Makefile
tests/globals.c
tests/parser.c [new file with mode: 0644]

index 7ae6b90..81f5518 100644 (file)
@@ -3,7 +3,7 @@ include ../Makefile.inc
 CFLAGS += $(BIN_CFLAGS) -I$(multipathdir) -I$(mpathcmddir)
 LIBDEPS += -L$(multipathdir) -lmultipath -lcmocka
 
-TESTS := uevent
+TESTS := uevent parser
 
 .SILENT: $(TESTS:%=%.o)
 .PRECIOUS: $(TESTS:%=%-test)
index 96a5651..80f57bd 100644 (file)
@@ -6,6 +6,7 @@ struct udev *udev;
 int logsink = 0;
 struct config conf = {
        .uid_attrs = "sd:ID_BOGUS",
+       .verbosity = 4,
 };
 
 struct config *get_multipath_config(void)
diff --git a/tests/parser.c b/tests/parser.c
new file mode 100644 (file)
index 0000000..8e73ceb
--- /dev/null
@@ -0,0 +1,479 @@
+/*
+ * Copyright (c) 2018 SUSE Linux GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ *
+ */
+
+#include <stdbool.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <stdlib.h>
+#include <cmocka.h>
+// #include "list.h"
+#include "parser.h"
+#include "vector.h"
+
+#include "globals.c"
+
+/* Set these to 1 to get success for current broken behavior */
+/* Strip leading whitespace between quotes */
+#define LSTRIP_QUOTED_WSP 0
+/* Stop parsing at 2nd quote */
+#define TWO_QUOTES_ONLY 0
+
+static bool is_quote(const char *s)
+{
+       return *s == '"';
+}
+
+static char *test_file = "test.conf";
+
+/* Missing declaration */
+int validate_config_strvec(vector strvec, char *file);
+
+/* Stringify helpers */
+#define _str_(x) #x
+#define str(x) _str_(x)
+
+static int setup(void **state)
+{
+       return 0;
+}
+
+static int teardown(void **state)
+{
+       return 0;
+}
+
+static void test01(void **state)
+{
+       vector v = alloc_strvec("keyword value");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 2);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test02(void **state)
+{
+       vector v = alloc_strvec("keyword \"value\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "value");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test03(void **state)
+{
+       vector v = alloc_strvec("keyword value\n");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 2);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test04(void **state)
+{
+       vector v = alloc_strvec("keyword \t   value   \t \n   ");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 2);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test05(void **state)
+{
+       vector v = alloc_strvec("keyword \t   value   \t ! comment  ");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 2);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test06(void **state)
+{
+       vector v = alloc_strvec("keyword \t   value   # \n comment  ");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 2);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test07(void **state)
+{
+       vector v = alloc_strvec("keyword \t   value   more  ");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 3);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+       assert_string_equal(VECTOR_SLOT(v, 2), "more");
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test08(void **state)
+{
+#define QUOTED08 "  value   more  "
+#define QUOTED08B "value   more  "
+       vector v = alloc_strvec("keyword \t \"" QUOTED08 "\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+#if LSTRIP_QUOTED_WSP
+       assert_string_equal(VECTOR_SLOT(v, 2), QUOTED08B);
+#else
+       assert_string_equal(VECTOR_SLOT(v, 2), QUOTED08);
+#endif
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+#if LSTRIP_QUOTED_WSP
+       assert_string_equal(val, QUOTED08B);
+#else
+       assert_string_equal(val, QUOTED08);
+#endif
+       free(val);
+       free_strvec(v);
+}
+
+static void test09(void **state)
+{
+#define QUOTED09 "value # more"
+       vector v = alloc_strvec("keyword \"" QUOTED09 "\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), QUOTED09);
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, QUOTED09);
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test10(void **state)
+{
+#define QUOTED10 "value ! more"
+       vector v = alloc_strvec("keyword \"" QUOTED10 "\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), QUOTED10);
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, QUOTED10);
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test11(void **state)
+{
+#define QUOTED11 "value comment"
+       vector v = alloc_strvec("keyword\"" QUOTED11 "\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), QUOTED11);
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, QUOTED11);
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test12(void **state)
+{
+       vector v = alloc_strvec("key\"word\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "key");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "word");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "word");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test13(void **state)
+{
+       vector v = alloc_strvec("keyword value \"quoted\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 5);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_string_equal(VECTOR_SLOT(v, 1), "value");
+       assert_true(is_quote(VECTOR_SLOT(v, 2)));;
+       assert_string_equal(VECTOR_SLOT(v, 3), "quoted");
+       assert_true(is_quote(VECTOR_SLOT(v, 4)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "value");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test14(void **state)
+{
+       vector v = alloc_strvec("keyword \"value \"  comment\"\"");
+       char *val;
+
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 7);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "value ");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+       assert_string_equal(VECTOR_SLOT(v, 4), "comment");
+       assert_true(is_quote(VECTOR_SLOT(v, 5)));;
+       assert_true(is_quote(VECTOR_SLOT(v, 6)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "value ");
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test15(void **state)
+{
+#define QUOTED15 "word  value\n  comment"
+       vector v = alloc_strvec("key\"" QUOTED15 "\"");
+       char *val;
+
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "key");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), QUOTED15);
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+
+       val = set_value(v);
+       assert_string_equal(val, QUOTED15);
+
+       free(val);
+       free_strvec(v);
+}
+
+static void test16(void **state)
+{
+       vector v = alloc_strvec("keyword \"2.5\"\" SSD\"");
+       char *val;
+
+#if TWO_QUOTES_ONLY
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 6);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "2.5");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+       assert_string_equal(VECTOR_SLOT(v, 4), "SSD");
+       assert_true(is_quote(VECTOR_SLOT(v, 5)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "2.5");
+#else
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "2.5\" SSD");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "2.5\" SSD");
+#endif
+       free(val);
+       free_strvec(v);
+}
+
+static void test17(void **state)
+{
+       vector v = alloc_strvec("keyword \"\"\"\"\" is empty\"");
+       char *val;
+#if TWO_QUOTES_ONLY
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 6);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_true(is_quote(VECTOR_SLOT(v, 2)));;
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+#if LSTRIP_QUOTED_WSP
+       assert_string_equal(VECTOR_SLOT(v, 4), "is empty");
+#else
+       assert_string_equal(VECTOR_SLOT(v, 4), " is empty");
+#endif
+       assert_true(is_quote(VECTOR_SLOT(v, 5)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "");
+#else
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "\"\" is empty");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "\"\" is empty");
+#endif
+       free(val);
+       free_strvec(v);
+}
+
+static void test18(void **state)
+{
+       vector v = alloc_strvec("keyword \"\"\"\"");
+       char *val;
+#if TWO_QUOTES_ONLY
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 5);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_true(is_quote(VECTOR_SLOT(v, 2)));;
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+       assert_true(is_quote(VECTOR_SLOT(v, 4)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "");
+#else
+       assert_int_equal(validate_config_strvec(v, test_file), 0);
+       assert_int_equal(VECTOR_SIZE(v), 4);
+       assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+       assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+       assert_string_equal(VECTOR_SLOT(v, 2), "\"");
+       assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+       val = set_value(v);
+       assert_string_equal(val, "\"");
+#endif
+       free(val);
+       free_strvec(v);
+}
+
+int test_config_parser(void)
+{
+       const struct CMUnitTest tests[] = {
+               cmocka_unit_test(test01),
+               cmocka_unit_test(test02),
+               cmocka_unit_test(test03),
+               cmocka_unit_test(test04),
+               cmocka_unit_test(test05),
+               cmocka_unit_test(test06),
+               cmocka_unit_test(test07),
+               cmocka_unit_test(test08),
+               cmocka_unit_test(test09),
+               cmocka_unit_test(test10),
+               cmocka_unit_test(test11),
+               cmocka_unit_test(test12),
+               cmocka_unit_test(test13),
+               cmocka_unit_test(test14),
+               cmocka_unit_test(test15),
+               cmocka_unit_test(test16),
+               cmocka_unit_test(test17),
+               cmocka_unit_test(test18),
+       };
+       return cmocka_run_group_tests(tests, setup, teardown);
+}
+
+int main(void)
+{
+       int ret = 0;
+
+       ret += test_config_parser();
+       return ret;
+}