[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