mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-08-31 06:16:03 +00:00
Subject: 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@nxnw.org> Acked-By: Seth Arnold <seth.arnold@canonical.com>
This commit is contained in:
@@ -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 */
|
||||
|
Reference in New Issue
Block a user