[apparmor] [PATCH] fixup! libapparmor: Move the aa_features API
Tyler Hicks
tyhicks at canonical.com
Thu Mar 19 16:06:42 UTC 2015
Move the aa_features unit tests into their own source file, which
includes features.c to get at private members, so that `make check` can
be run after any build, regardless of configure options.
Signed-off-by: Tyler Hicks <tyhicks at canonical.com>
---
libraries/libapparmor/src/Makefile.am | 6 +-
libraries/libapparmor/src/features.c | 229 ----------------------------
libraries/libapparmor/src/tst_features.c | 247 +++++++++++++++++++++++++++++++
parser/Makefile | 4 +-
4 files changed, 253 insertions(+), 233 deletions(-)
create mode 100644 libraries/libapparmor/src/tst_features.c
diff --git a/libraries/libapparmor/src/Makefile.am b/libraries/libapparmor/src/Makefile.am
index ac93bf5..840742f 100644
--- a/libraries/libapparmor/src/Makefile.am
+++ b/libraries/libapparmor/src/Makefile.am
@@ -63,7 +63,11 @@ CLEANFILES = libapparmor.pc
tst_aalogmisc_SOURCES = tst_aalogmisc.c
tst_aalogmisc_LDADD = .libs/libapparmor.a
-check_PROGRAMS = tst_aalogmisc
+
+tst_features_SOURCES = tst_features.c
+tst_features_LDADD = .libs/libapparmor.a
+
+check_PROGRAMS = tst_aalogmisc tst_features
TESTS = $(check_PROGRAMS)
EXTRA_DIST = grammar.y scanner.l libapparmor.map libapparmor.pc
diff --git a/libraries/libapparmor/src/features.c b/libraries/libapparmor/src/features.c
index 876f75c..4a70475 100644
--- a/libraries/libapparmor/src/features.c
+++ b/libraries/libapparmor/src/features.c
@@ -533,232 +533,3 @@ bool aa_features_supports(aa_features *features, const char *str)
return true;
}
-
-#ifdef UNIT_TEST
-
-#include "unit_test.h"
-
-static int test_tokenize_path_components(void)
-{
- struct component components[32];
- size_t max = sizeof(components) / sizeof(*components);
- size_t num;
- int rc = 0;
-
- num = tokenize_path_components(NULL, components, max);
- MY_TEST(num == 0, "basic NULL test");
-
- num = tokenize_path_components("", components, max);
- MY_TEST(num == 0, "basic empty string test");
-
- num = tokenize_path_components("a", components, 0);
- MY_TEST(num == 0, "basic empty array test");
-
- num = tokenize_path_components("a", components, 1);
- MY_TEST(num == 1, "one component full test (num)");
- MY_TEST(!strncmp(components[0].str, "a", components[0].len),
- "one component full test (components[0])");
-
- num = tokenize_path_components("a/b", components, 2);
- MY_TEST(num == 2, "two component full test (num)");
- MY_TEST(!strncmp(components[0].str, "a", components[0].len),
- "two component full test (components[0])");
- MY_TEST(!strncmp(components[1].str, "b", components[0].len),
- "two component full test (components[1])");
-
- num = tokenize_path_components("a/b/c", components, 1);
- MY_TEST(num == 1, "not enough components full test (num)");
- MY_TEST(!strncmp(components[0].str, "a/b/c", components[0].len),
- "not enough components full test (components[0])");
-
- num = tokenize_path_components("/", components, max);
- MY_TEST(num == 0, "no valid components #1 (num)");
-
- num = tokenize_path_components("////////", components, max);
- MY_TEST(num == 0, "no valid components #2 (num)");
-
- num = tokenize_path_components("////////////foo////", components, max);
- MY_TEST(num == 1, "many invalid components (num)");
- MY_TEST(!strncmp(components[0].str, "foo", components[0].len),
- "many invalid components (components[0])");
-
- num = tokenize_path_components("file", components, max);
- MY_TEST(num == 1, "file (num)");
- MY_TEST(!strncmp(components[0].str, "file", components[0].len),
- "file (components[0])");
-
- num = tokenize_path_components("/policy///versions//v7/", components, max);
- MY_TEST(num == 3, "v7 (num)");
- MY_TEST(!strncmp(components[0].str, "policy", components[0].len),
- "v7 (components[0])");
- MY_TEST(!strncmp(components[1].str, "versions", components[1].len),
- "v7 (components[1])");
- MY_TEST(!strncmp(components[2].str, "v7", components[2].len),
- "v7 (components[2])");
-
- num = tokenize_path_components("dbus/mask/send", components, max);
- MY_TEST(num == 3, "dbus send (num)");
- MY_TEST(!strncmp(components[0].str, "dbus", components[0].len),
- "dbus send (components[0])");
- MY_TEST(!strncmp(components[1].str, "mask", components[1].len),
- "dbus send (components[1])");
- MY_TEST(!strncmp(components[2].str, "send", components[2].len),
- "dbus send (components[2])");
-
-
- return rc;
-}
-
-static int do_test_walk_one(const char **str, const struct component *component,
- bool is_top_level, bool expect_walk, const char *e1,
- const char *e2, const char *e3)
-{
- const char *save = str ? *str : NULL;
- bool walked = walk_one(str, component, is_top_level);
- int rc = 0;
-
- /* Check if the result of the walk matches the expected result*/
- MY_TEST(expect_walk == walked, e1);
- if (save) {
- /**
- * If a walk was expected, @*str should have changed. It
- * shouldn't change if a walk was unexpected.
- */
- if (expect_walk) {
- MY_TEST(*str != save, e2);
- } else {
- MY_TEST(*str == save, e3);
- }
- }
-
- return rc;
-}
-
-#define MY_WALK_TEST(str, component, is_top_level, expect_walk, error) \
- if (do_test_walk_one(str, component, is_top_level, \
- expect_walk, \
- error " (walk check)", \
- error " (str didn't change)", \
- error " (str changed)")) { \
- rc = 1; \
- }
-
-#define MY_GOOD_WALK_TEST(str, component, is_top_level, error) \
- MY_WALK_TEST(str, component, is_top_level, true, error)
-#define MY_BAD_WALK_TEST(str, component, is_top_level, error) \
- MY_WALK_TEST(str, component, is_top_level, false, error)
-
-static int test_walk_one(void)
-{
- struct component c;
- const char *str;
- int rc = 0;
-
- MY_BAD_WALK_TEST(NULL, &c, true, "basic NULL str test");
-
- str = NULL;
- MY_BAD_WALK_TEST(&str, &c, true, "basic NULL *str test");
-
- str = "test { a b }";
- MY_BAD_WALK_TEST(&str, NULL, true, "basic NULL component test");
-
- str = "test { a b }";
- c = { NULL, 8 };
- MY_BAD_WALK_TEST(&str, &c, true, "basic NULL c.str test");
-
- str = "test { a b }";
- c = { "", 0 };
- MY_BAD_WALK_TEST(&str, &c, true, "basic empty c.str test");
-
- str = "test";
- c = { "test", 4 };
- MY_GOOD_WALK_TEST(&str, &c, true, "single component");
-
- str = "testX";
- c = { "test", 4 };
- MY_BAD_WALK_TEST(&str, &c, true, "single component bad str");
-
- str = "test";
- c = { "testX", 5 };
- MY_BAD_WALK_TEST(&str, &c, true, "single component bad c.str");
-
- str = "test { }";
- c = { "test", 4 };
- MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #1");
-
- str = "test {\n\t}";
- c = { "test", 4 };
- MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #2");
-
- str = "test{}";
- c = { "test", 4 };
- MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #3");
-
- str = "test\t{}\n ";
- c = { "test", 4 };
- MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #4");
-
- str = "test {}";
- c = { "test", 4 };
- MY_BAD_WALK_TEST(&str, &c, false, "single component bad is_top_level");
-
- str = "front{back";
- c = { "frontback", 9};
- MY_BAD_WALK_TEST(&str, &c, true, "brace in the middle #1");
- MY_BAD_WALK_TEST(&str, &c, false, "brace in the middle #2");
-
- str = "ardvark { bear cat { deer } }";
- c = { "ardvark", 7 };
- MY_GOOD_WALK_TEST(&str, &c, true, "animal walk good ardvark");
- c = { "deer", 4 };
- MY_BAD_WALK_TEST(&str, &c, false, "animal walk bad deer");
- MY_BAD_WALK_TEST(&str, &c, true, "animal walk bad top-level deer");
- c = { "bear", 4 };
- MY_BAD_WALK_TEST(&str, &c, true, "animal walk bad bear");
- c = { "cat", 3 };
- MY_GOOD_WALK_TEST(&str, &c, false, "animal walk good cat");
- c = { "ardvark", 7 };
- MY_BAD_WALK_TEST(&str, &c, true, "animal walk bad ardvark");
- c = { "deer", 4 };
- MY_GOOD_WALK_TEST(&str, &c, false, "animal walk good deer");
-
- str = "dbus {mask {acquire send receive\n}\n}\nsignal {mask {hup int\n}\n}";
- c = { "hup", 3 };
- MY_BAD_WALK_TEST(&str, &c, true, "dbus/signal bad hup #1");
- MY_BAD_WALK_TEST(&str, &c, false, "dbus/signal bad hup #2");
- c = { "signal", 6 };
- MY_BAD_WALK_TEST(&str, &c, false, "dbus/signal bad signal");
- MY_GOOD_WALK_TEST(&str, &c, true, "dbus/signal good signal");
- c = { "mask", 4 };
- MY_BAD_WALK_TEST(&str, &c, true, "dbus/signal bad mask");
- MY_GOOD_WALK_TEST(&str, &c, false, "dbus/signal good mask");
- c = { "hup", 3 };
- MY_GOOD_WALK_TEST(&str, &c, false, "dbus/signal good hup");
-
- str = "policy {set_load {yes\n}\nversions {v7 {yes\n}\nv6 {yes\n}";
- c = { "policy", 6 };
- MY_GOOD_WALK_TEST(&str, &c, true, "policy good");
- c = { "versions", 8 };
- MY_GOOD_WALK_TEST(&str, &c, false, "versions good");
- c = { "v7", 2 };
- MY_GOOD_WALK_TEST(&str, &c, false, "v7 good");
-
- return rc;
-}
-
-int main(void)
-{
- int retval, rc = 0;
-
- retval = test_tokenize_path_components();
- if (retval)
- rc = retval;
-
- retval = test_walk_one();
- if (retval)
- rc = retval;
-
- return rc;
-}
-
-#endif
diff --git a/libraries/libapparmor/src/tst_features.c b/libraries/libapparmor/src/tst_features.c
new file mode 100644
index 0000000..036fc9d
--- /dev/null
+++ b/libraries/libapparmor/src/tst_features.c
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 2015
+ * Canonical, Ltd. (All rights reserved)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License published by the Free Software Foundation.
+ *
+ * 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, contact Novell, Inc. or Canonical
+ * Ltd.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "private.h"
+
+#include "features.c"
+
+static int test_tokenize_path_components(void)
+{
+ struct component components[32];
+ size_t max = sizeof(components) / sizeof(*components);
+ size_t num;
+ int rc = 0;
+
+ num = tokenize_path_components(NULL, components, max);
+ MY_TEST(num == 0, "basic NULL test");
+
+ num = tokenize_path_components("", components, max);
+ MY_TEST(num == 0, "basic empty string test");
+
+ num = tokenize_path_components("a", components, 0);
+ MY_TEST(num == 0, "basic empty array test");
+
+ num = tokenize_path_components("a", components, 1);
+ MY_TEST(num == 1, "one component full test (num)");
+ MY_TEST(!strncmp(components[0].str, "a", components[0].len),
+ "one component full test (components[0])");
+
+ num = tokenize_path_components("a/b", components, 2);
+ MY_TEST(num == 2, "two component full test (num)");
+ MY_TEST(!strncmp(components[0].str, "a", components[0].len),
+ "two component full test (components[0])");
+ MY_TEST(!strncmp(components[1].str, "b", components[0].len),
+ "two component full test (components[1])");
+
+ num = tokenize_path_components("a/b/c", components, 1);
+ MY_TEST(num == 1, "not enough components full test (num)");
+ MY_TEST(!strncmp(components[0].str, "a/b/c", components[0].len),
+ "not enough components full test (components[0])");
+
+ num = tokenize_path_components("/", components, max);
+ MY_TEST(num == 0, "no valid components #1 (num)");
+
+ num = tokenize_path_components("////////", components, max);
+ MY_TEST(num == 0, "no valid components #2 (num)");
+
+ num = tokenize_path_components("////////////foo////", components, max);
+ MY_TEST(num == 1, "many invalid components (num)");
+ MY_TEST(!strncmp(components[0].str, "foo", components[0].len),
+ "many invalid components (components[0])");
+
+ num = tokenize_path_components("file", components, max);
+ MY_TEST(num == 1, "file (num)");
+ MY_TEST(!strncmp(components[0].str, "file", components[0].len),
+ "file (components[0])");
+
+ num = tokenize_path_components("/policy///versions//v7/", components, max);
+ MY_TEST(num == 3, "v7 (num)");
+ MY_TEST(!strncmp(components[0].str, "policy", components[0].len),
+ "v7 (components[0])");
+ MY_TEST(!strncmp(components[1].str, "versions", components[1].len),
+ "v7 (components[1])");
+ MY_TEST(!strncmp(components[2].str, "v7", components[2].len),
+ "v7 (components[2])");
+
+ num = tokenize_path_components("dbus/mask/send", components, max);
+ MY_TEST(num == 3, "dbus send (num)");
+ MY_TEST(!strncmp(components[0].str, "dbus", components[0].len),
+ "dbus send (components[0])");
+ MY_TEST(!strncmp(components[1].str, "mask", components[1].len),
+ "dbus send (components[1])");
+ MY_TEST(!strncmp(components[2].str, "send", components[2].len),
+ "dbus send (components[2])");
+
+
+ return rc;
+}
+
+static int do_test_walk_one(const char **str, const struct component *component,
+ bool is_top_level, bool expect_walk, const char *e1,
+ const char *e2, const char *e3)
+{
+ const char *save = str ? *str : NULL;
+ bool walked = walk_one(str, component, is_top_level);
+ int rc = 0;
+
+ /* Check if the result of the walk matches the expected result*/
+ MY_TEST(expect_walk == walked, e1);
+ if (save) {
+ /**
+ * If a walk was expected, @*str should have changed. It
+ * shouldn't change if a walk was unexpected.
+ */
+ if (expect_walk) {
+ MY_TEST(*str != save, e2);
+ } else {
+ MY_TEST(*str == save, e3);
+ }
+ }
+
+ return rc;
+}
+
+#define MY_WALK_TEST(str, component, is_top_level, expect_walk, error) \
+ if (do_test_walk_one(str, component, is_top_level, \
+ expect_walk, \
+ error " (walk check)", \
+ error " (str didn't change)", \
+ error " (str changed)")) { \
+ rc = 1; \
+ }
+
+#define MY_GOOD_WALK_TEST(str, component, is_top_level, error) \
+ MY_WALK_TEST(str, component, is_top_level, true, error)
+#define MY_BAD_WALK_TEST(str, component, is_top_level, error) \
+ MY_WALK_TEST(str, component, is_top_level, false, error)
+
+static int test_walk_one(void)
+{
+ struct component c;
+ const char *str;
+ int rc = 0;
+
+ MY_BAD_WALK_TEST(NULL, &c, true, "basic NULL str test");
+
+ str = NULL;
+ MY_BAD_WALK_TEST(&str, &c, true, "basic NULL *str test");
+
+ str = "test { a b }";
+ MY_BAD_WALK_TEST(&str, NULL, true, "basic NULL component test");
+
+ str = "test { a b }";
+ c = (struct component) { NULL, 8 };
+ MY_BAD_WALK_TEST(&str, &c, true, "basic NULL c.str test");
+
+ str = "test { a b }";
+ c = (struct component) { "", 0 };
+ MY_BAD_WALK_TEST(&str, &c, true, "basic empty c.str test");
+
+ str = "test";
+ c = (struct component) { "test", 4 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "single component");
+
+ str = "testX";
+ c = (struct component) { "test", 4 };
+ MY_BAD_WALK_TEST(&str, &c, true, "single component bad str");
+
+ str = "test";
+ c = (struct component) { "testX", 5 };
+ MY_BAD_WALK_TEST(&str, &c, true, "single component bad c.str");
+
+ str = "test { }";
+ c = (struct component) { "test", 4 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #1");
+
+ str = "test {\n\t}";
+ c = (struct component) { "test", 4 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #2");
+
+ str = "test{}";
+ c = (struct component) { "test", 4 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #3");
+
+ str = "test\t{}\n ";
+ c = (struct component) { "test", 4 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "single component empty braces #4");
+
+ str = "test {}";
+ c = (struct component) { "test", 4 };
+ MY_BAD_WALK_TEST(&str, &c, false, "single component bad is_top_level");
+
+ str = "front{back";
+ c = (struct component) { "frontback", 9};
+ MY_BAD_WALK_TEST(&str, &c, true, "brace in the middle #1");
+ MY_BAD_WALK_TEST(&str, &c, false, "brace in the middle #2");
+
+ str = "ardvark { bear cat { deer } }";
+ c = (struct component) { "ardvark", 7 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "animal walk good ardvark");
+ c = (struct component) { "deer", 4 };
+ MY_BAD_WALK_TEST(&str, &c, false, "animal walk bad deer");
+ MY_BAD_WALK_TEST(&str, &c, true, "animal walk bad top-level deer");
+ c = (struct component) { "bear", 4 };
+ MY_BAD_WALK_TEST(&str, &c, true, "animal walk bad bear");
+ c = (struct component) { "cat", 3 };
+ MY_GOOD_WALK_TEST(&str, &c, false, "animal walk good cat");
+ c = (struct component) { "ardvark", 7 };
+ MY_BAD_WALK_TEST(&str, &c, true, "animal walk bad ardvark");
+ c = (struct component) { "deer", 4 };
+ MY_GOOD_WALK_TEST(&str, &c, false, "animal walk good deer");
+
+ str = "dbus {mask {acquire send receive\n}\n}\nsignal {mask {hup int\n}\n}";
+ c = (struct component) { "hup", 3 };
+ MY_BAD_WALK_TEST(&str, &c, true, "dbus/signal bad hup #1");
+ MY_BAD_WALK_TEST(&str, &c, false, "dbus/signal bad hup #2");
+ c = (struct component) { "signal", 6 };
+ MY_BAD_WALK_TEST(&str, &c, false, "dbus/signal bad signal");
+ MY_GOOD_WALK_TEST(&str, &c, true, "dbus/signal good signal");
+ c = (struct component) { "mask", 4 };
+ MY_BAD_WALK_TEST(&str, &c, true, "dbus/signal bad mask");
+ MY_GOOD_WALK_TEST(&str, &c, false, "dbus/signal good mask");
+ c = (struct component) { "hup", 3 };
+ MY_GOOD_WALK_TEST(&str, &c, false, "dbus/signal good hup");
+
+ str = "policy {set_load {yes\n}\nversions {v7 {yes\n}\nv6 {yes\n}";
+ c = (struct component) { "policy", 6 };
+ MY_GOOD_WALK_TEST(&str, &c, true, "policy good");
+ c = (struct component) { "versions", 8 };
+ MY_GOOD_WALK_TEST(&str, &c, false, "versions good");
+ c = (struct component) { "v7", 2 };
+ MY_GOOD_WALK_TEST(&str, &c, false, "v7 good");
+
+ return rc;
+}
+
+int main(void)
+{
+ int retval, rc = 0;
+
+ retval = test_tokenize_path_components();
+ if (retval)
+ rc = retval;
+
+ retval = test_walk_one();
+ if (retval)
+ rc = retval;
+
+ return rc;
+}
diff --git a/parser/Makefile b/parser/Makefile
index 722b218..51efe9d 100644
--- a/parser/Makefile
+++ b/parser/Makefile
@@ -109,7 +109,7 @@ EXTRA_CFLAGS += $(INCLUDE_APPARMOR)
LEX_C_FILES = parser_lex.c
YACC_C_FILES = parser_yacc.c parser_yacc.h
-TESTS = tst_regex tst_misc tst_symtab tst_variable tst_lib tst_features
+TESTS = tst_regex tst_misc tst_symtab tst_variable tst_lib
TEST_CFLAGS = $(EXTRA_CFLAGS) -DUNIT_TEST -Wno-unused-result
TEST_OBJECTS = $(filter-out \
parser_lex.o \
@@ -291,8 +291,6 @@ tst_lib: lib.c parser.h $(filter-out lib.o, ${TEST_OBJECTS})
$(CXX) $(TEST_CFLAGS) -o $@ $< $(filter-out $(<:.c=.o), ${TEST_OBJECTS}) $(TEST_LDFLAGS) $(TEST_LDLIBS)
tst_%: parser_%.c parser.h $(filter-out parser_%.o, ${TEST_OBJECTS})
$(CXX) $(TEST_CFLAGS) -o $@ $< $(filter-out $(<:.c=.o), ${TEST_OBJECTS}) $(TEST_LDFLAGS) $(TEST_LDLIBS)
-tst_features: features.c features.h parser.h
- $(CXX) $(TEST_CFLAGS) -o $@ $< $(filter-out $(<:.c=.o), ${TEST_OBJECTS}) $(TEST_LDFLAGS) $(TEST_LDLIBS)
.SILENT: check
.PHONY: check
--
2.1.4
More information about the AppArmor
mailing list