[apparmor] [patch 1/2] parser: refactor symtab unit tests, expand coverage, fix seenlist bug
Seth Arnold
seth.arnold at canonical.com
Wed Apr 23 22:51:17 UTC 2014
On Fri, Mar 28, 2014 at 11:14:20AM -0700, Steve Beattie wrote:
> parser: refactor symtab unit tests, expand coverage, fix seenlist bug
>
> This patch:
> - refactors the parser_symtab.c unit tests a bit in preparation for
> the patch to add an implicit autofilled @{profile_name} variable
> - expands coverage of the unit tests such that all code paths that
> don't result in an exit() or are due to memory allocation errors are
> exercised (this doesn't mean the tests are complete; the
> __expand_variable() could use more tests for correctness).
> - it fixes a bug where variables were not being removed from the
> seenlist when a problem was detected in __expand_variable().
>
> Signed-off-by: Steve Beattie <steve at nxnw.org>
Acked-By: Seth Arnold <seth.arnold at canonical.com>
Thanks
> ---
> parser/parser_symtab.c | 209 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 182 insertions(+), 27 deletions(-)
>
> Index: b/parser/parser_symtab.c
> ===================================================================
> --- a/parser/parser_symtab.c
> +++ b/parser/parser_symtab.c
> @@ -446,8 +446,9 @@ next:
> }
>
> symbol->expanded = expanded;
> - pop_seen_var(symbol->var_name);
> +
> out:
> + pop_seen_var(symbol->var_name);
> free_var_string(split);
> return retval;
> }
> @@ -545,12 +546,11 @@ void free_symtabs(void)
>
> #include "unit_test.h"
>
> -int main(void)
> +int test_compare_symtab(void)
> {
> int rc = 0;
> int retval;
> - struct set_value *retptr;
> - struct symtab *a, *b;
> + struct symtab *a, *b, *c;
>
> a = new_symtab_entry("blah");
> b = new_symtab_entry("suck");
> @@ -565,6 +565,181 @@ int main(void)
> retval = compare_symtabs(b, a);
> MY_TEST(retval != 0, "comparison 3");
>
> + retval = compare_symtabs(b, b);
> + MY_TEST(retval == 0, "comparison 4");
> +
> + c = new_symtab_entry("blah");
> + retval = compare_symtabs(a, c);
> + MY_TEST(retval == 0, "comparison 5");
> +
> + free_symtab(a);
> + free_symtab(b);
> + free_symtab(c);
> +
> + return rc;
> +}
> +
> +int test_seenlist(void)
> +{
> + int rc = 0;
> +
> + MY_TEST(!is_seen("oogabooga"), "lookup unseen variable");
> +
> + push_seen_var("oogabooga");
> + MY_TEST(is_seen("oogabooga"), "lookup seen variable 1");
> + MY_TEST(!is_seen("not_seen"), "lookup unseen variable 2");
> +
> + push_seen_var("heebiejeebie");
> + MY_TEST(is_seen("oogabooga"), "lookup seen variable 2");
> + MY_TEST(is_seen("heebiejeebie"), "lookup seen variable 3");
> + MY_TEST(!is_seen("not_seen"), "lookup unseen variable 3");
> +
> + pop_seen_var("oogabooga");
> + MY_TEST(!is_seen("oogabooga"), "lookup unseen variable 4");
> + MY_TEST(is_seen("heebiejeebie"), "lookup seen variable 4");
> + MY_TEST(!is_seen("not_seen"), "lookup unseen variable 5");
> +
> + pop_seen_var("heebiejeebie");
> + MY_TEST(!is_seen("heebiejeebie"), "lookup unseen variable 6");
> +
> + //pop_seen_var("not_seen"); /* triggers assert */
> +
> + return rc;
> +}
> +
> +int test_add_set_to_boolean(void)
> +{
> + int rc = 0;
> + int retval;
> +
> + /* test adding a set value to a boolean variable */
> + retval = add_boolean_var("not_a_set_variable", 1);
> + MY_TEST(retval == 0, "new boolean variable 3");
> + retval = add_set_value("not_a_set_variable", "a set value");
> + MY_TEST(retval != 0, "add set value to boolean");
> +
> + free_symtabs();
> +
> + return rc;
> +}
> +
> +int test_expand_bool_within_set(void)
> +{
> + int rc = 0;
> + int retval;
> + struct symtab *retsym;
> +
> + /* test expanding a boolean var within a set variable */
> + retval = add_boolean_var("not_a_set_variable", 1);
> + MY_TEST(retval == 0, "new boolean variable 4");
> + retval = new_set_var("set_variable", "set_value@{not_a_set_variable}");
> + MY_TEST(retval == 0, "add set value with embedded boolean");
> + retsym = lookup_existing_symbol("set_variable");
> + MY_TEST(retsym != NULL, "get set variable w/boolean");
> + retval = __expand_variable(retsym);
> + MY_TEST(retval != 0, "expand set variable with embedded boolean");
> +
> + free_symtabs();
> +
> + return rc;
> +}
> +
> +int test_expand_recursive_set_vars(void)
> +{
> + int rc = 0;
> + int retval;
> + struct symtab *retsym;
> +
> + /* test expanding a recursive var within a set variable */
> + retval = new_set_var("recursive_1", "set_value@{recursive_2}");
> + MY_TEST(retval == 0, "new recursive set variable 1");
> + retval = new_set_var("recursive_2", "set_value@{recursive_3}");
> + MY_TEST(retval == 0, "new recursive set variable 2");
> + retval = new_set_var("recursive_3", "set_value@{recursive_1}");
> + MY_TEST(retval == 0, "new recursive set variable 3");
> + retsym = lookup_existing_symbol("recursive_1");
> + MY_TEST(retsym != NULL, "get recursive set variable");
> + retval = __expand_variable(retsym);
> + MY_TEST(retval != 0, "expand recursive set variable");
> +
> + free_symtabs();
> +
> + return rc;
> +}
> +
> +int test_expand_undefined_set_var(void)
> +{
> + int rc = 0;
> + int retval;
> + struct symtab *retsym;
> +
> + /* test expanding an undefined var within a set variable */
> + retval = new_set_var("defined_var", "set_value@{undefined_var}");
> + MY_TEST(retval == 0, "new undefined test set variable");
> + retsym = lookup_existing_symbol("defined_var");
> + MY_TEST(retsym != NULL, "get undefined test set variable");
> + retval = __expand_variable(retsym);
> + MY_TEST(retval != 0, "expand undefined set variable");
> +
> + free_symtabs();
> +
> + return rc;
> +}
> +
> +int test_expand_set_var_during_dump(void)
> +{
> + int rc = 0;
> + int retval;
> + struct symtab *retsym;
> +
> + /* test expanding an defined var within a set variable during var dump*/
> + retval = new_set_var("set_var_1", "set_value@{set_var_2}");
> + MY_TEST(retval == 0, "new dump expansion set variable 1");
> + retval = new_set_var("set_var_2", "some other set_value");
> + MY_TEST(retval == 0, "new dump expansion set variable 2");
> + retsym = lookup_existing_symbol("set_var_1");
> + MY_TEST(retsym != NULL, "get dump expansion set variable 1");
> + __dump_symtab_entry(retsym, 0);
> + __dump_symtab_entry(retsym, 1);
> + __dump_symtab_entry(retsym, 0);
> +
> + free_symtabs();
> +
> + return rc;
> +}
> +
> +int main(void)
> +{
> + int rc = 0;
> + int retval;
> + struct set_value *retptr;
> +
> + rc = test_compare_symtab();
> +
> + retval = test_seenlist();
> + if (rc == 0)
> + rc = retval;
> +
> + retval = test_add_set_to_boolean();
> + if (rc == 0)
> + rc = retval;
> +
> + retval = test_expand_bool_within_set();
> + if (rc == 0)
> + rc = retval;
> +
> + retval = test_expand_recursive_set_vars();
> + if (rc == 0)
> + rc = retval;
> +
> + retval = test_expand_undefined_set_var();
> + if (rc == 0)
> + rc = retval;
> +
> + retval = test_expand_set_var_during_dump();
> + if (rc == 0)
> + rc = retval;
> +
> retval = new_set_var("test", "test value");
> MY_TEST(retval == 0, "new set variable 1");
>
> @@ -619,35 +794,13 @@ int main(void)
> retptr = get_set_var("abuse");
> MY_TEST(retptr == NULL, "get set variable that's declared a boolean");
>
> + /* test walking set values */
> retptr = get_set_var("monopuff");
> MY_TEST(retptr != NULL, "get set variable 1");
> -
> retval = strcmp(get_next_set_value(&retptr), "Mockingbird");
> MY_TEST(retval == 0, "get set value 1");
> -
> MY_TEST(get_next_set_value(&retptr) == NULL, "get no more set values 1");
>
> - MY_TEST(!is_seen("oogabooga"), "lookup unseen variable");
> -
> - push_seen_var("oogabooga");
> - MY_TEST(is_seen("oogabooga"), "lookup seen variable 1");
> - MY_TEST(!is_seen("not_seen"), "lookup unseen variable 2");
> -
> - push_seen_var("heebiejeebie");
> - MY_TEST(is_seen("oogabooga"), "lookup seen variable 2");
> - MY_TEST(is_seen("heebiejeebie"), "lookup seen variable 3");
> - MY_TEST(!is_seen("not_seen"), "lookup unseen variable 3");
> -
> - pop_seen_var("oogabooga");
> - MY_TEST(!is_seen("oogabooga"), "lookup unseen variable 4");
> - MY_TEST(is_seen("heebiejeebie"), "lookup seen variable 4");
> - MY_TEST(!is_seen("not_seen"), "lookup unseen variable 5");
> -
> - pop_seen_var("heebiejeebie");
> - MY_TEST(!is_seen("heebiejeebie"), "lookup unseen variable 6");
> -
> - //pop_seen_var("not_seen"); /* triggers assert */
> -
> retval = new_set_var("eek", "Mocking@{monopuff}bir@{stereopuff}d@{stereopuff}");
> MY_TEST(retval == 0, "new set variable 4");
>
> @@ -656,6 +809,8 @@ int main(void)
> dump_symtab();
> dump_expanded_symtab();
>
> + free_symtabs();
> +
> return rc;
> }
> #endif /* UNIT_TEST */
> --
> Steve Beattie
> <sbeattie at ubuntu.com>
> http://NxNW.org/~steve/
> --
> AppArmor mailing list
> AppArmor at lists.ubuntu.com
> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20140423/69820fb8/attachment.pgp>
More information about the AppArmor
mailing list