X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=t%2Futils%2Fllist_test.c;h=cc9954d98662c76f89ef32f4e9416ea178073017;hp=70b7cd349242511bf143b0a9e98b9fc2e19285d1;hb=3ba81224dac4d31ea5ad651db569543825ea5078;hpb=cc26ea7dbae4179b8e3f7728b4d3bb1525bedc48 diff --git a/t/utils/llist_test.c b/t/utils/llist_test.c index 70b7cd3..cc9954d 100644 --- a/t/utils/llist_test.c +++ b/t/utils/llist_test.c @@ -25,10 +25,10 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include - -#include "libsysdb_test.h" #include "utils/llist.h" +#include "libsysdb_test.h" + +#include /* * private data types @@ -56,6 +56,8 @@ static void setup(void) { list = sdb_llist_create(); + fail_unless(list != NULL, + "sdb_llist_create() = NULL; expected list object"); } /* setup */ static void @@ -69,7 +71,7 @@ teardown(void) static void populate(void) { - int i; + size_t i; for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { int check = sdb_llist_append(list, &golden_data[i]); fail_unless(check == 0, @@ -81,13 +83,13 @@ populate(void) START_TEST(test_clone) { sdb_llist_t *clone; - int i; + size_t i; populate(); clone = sdb_llist_clone(list); fail_unless(clone != NULL, - "sdb_llist_clone() = NULL; expected: !NULL"); + "sdb_llist_clone() = NULL; expected: cloned list object"); for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { fail_unless(golden_data[i].ref_cnt == 3, @@ -100,7 +102,7 @@ END_TEST START_TEST(test_destroy) { - int i; + size_t i; populate(); sdb_llist_destroy(list); list = NULL; @@ -113,9 +115,33 @@ START_TEST(test_destroy) } END_TEST +START_TEST(test_clear) +{ + size_t i; + populate(); + sdb_llist_clear(list); + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + fail_unless(golden_data[i].ref_cnt == 1, + "sdb_llist_clear() did not deref element %s", + golden_data[i].name); + } + + i = sdb_llist_len(list); + fail_unless(i == 0, + "sdb_llist_clear() left %zu elements in the list; " + "expected: 0", i); +} +END_TEST + START_TEST(test_append) { - int i; + size_t i; + + fail_unless(sdb_llist_len(list) == 0, + "sdb_llist_len() = %zu; expected: 0", + sdb_llist_len(list)); + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { int check = sdb_llist_append(list, &golden_data[i]); fail_unless(check == 0, @@ -124,13 +150,16 @@ START_TEST(test_append) fail_unless(golden_data[i].ref_cnt == 2, "sdb_llist_append(%s) did not take ownership", golden_data[i].name); + fail_unless(sdb_llist_len(list) == i + 1, + "sdb_llist_len() = %zu; expected: zu", + sdb_llist_len(list), i + 1); } } END_TEST START_TEST(test_insert) { - int i; + size_t i; for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { int check = sdb_llist_insert(list, &golden_data[i], 0); fail_unless(check == 0, @@ -143,9 +172,9 @@ START_TEST(test_insert) } END_TEST -START_TEST(test_insert_invalid) +START_TEST(test_validate_insert) { - int i; + size_t i; for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { /* none of these operations will succeed * => 1 is invalid for each case */ @@ -160,9 +189,62 @@ START_TEST(test_insert_invalid) } END_TEST +START_TEST(test_get) +{ + size_t i; + populate(); + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + sdb_object_t *check = sdb_llist_get(list, i); + fail_unless(check == &golden_data[i], + "sdb_llist_get() = %p; expected: %p", + check, &golden_data[i]); + fail_unless(check->ref_cnt == 3, + "sdb_llist_get() didn't increment reference count; got: %i; " + "expected: 3", check->ref_cnt); + sdb_object_deref(check); + } +} +END_TEST + +START_TEST(test_remove_by_name) +{ + /* "random" indexes */ + int indexes[] = { 4, 5, 3, 6, 2, 0, 1 }; + size_t i; + + populate(); + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(indexes); ++i) { + sdb_object_t *check; + + fail_unless((size_t)indexes[i] < SDB_STATIC_ARRAY_LEN(golden_data), + "INTERNAL ERROR: invalid index %i", indexes[i]); + + check = sdb_llist_remove_by_name(list, golden_data[indexes[i]].name); + fail_unless(check == &golden_data[indexes[i]], + "sdb_llist_remove_by_name() = %p; expected: %p", + check, &golden_data[indexes[i]]); + fail_unless(check->ref_cnt == 2, + "sdb_llist_remove_by_name() returned unexpected reference " + "count; got: %i; expected: 2", check->ref_cnt); + + check = sdb_llist_remove_by_name(list, golden_data[indexes[i]].name); + fail_unless(check == NULL, + "sdb_llist_remove_by_name() did not remove the element"); + } +} +END_TEST + +static int +dummy_lookup(const sdb_object_t __attribute__((unused)) *obj, + const void __attribute__((unused)) *user_data) +{ + return 0; +} /* dummy_lookup */ + START_TEST(test_search) { - int i; + size_t i; populate(); for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { sdb_object_t *check = sdb_llist_search_by_name(list, @@ -179,12 +261,34 @@ START_TEST(test_search) "sdb_llist_search_by_name(%s) = %p; expected: NULL", unused_names[i], check); } + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + /* dummy_lookup always return 0, thus, this will always return the + * first element */ + sdb_object_t *check = sdb_llist_search(list, dummy_lookup, NULL); + fail_unless(check == &golden_data[i], + "sdb_llist_search() = %p (%s); expected: %p (%s)", + check, check->name, &golden_data[i], golden_data[i].name); + + /* => remove the first element */ + check = sdb_llist_remove(list, dummy_lookup, NULL); + fail_unless(check == &golden_data[i], + "sdb_llist_remove() = %p (%s); expected: %p (%s)", + check, check->name, &golden_data[i], golden_data[i].name); + fail_unless(check->ref_cnt == 2, + "sdb_llist_remove() changed reference count; got: %i; " + "expected: 2", check->ref_cnt); + } + /* should now be empty */ + fail_unless(sdb_llist_len(list) == 0, + "Still have %i elements in the list; expected: 0", + sdb_llist_len(list)); } END_TEST START_TEST(test_shift) { - int i; + size_t i; populate(); for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { sdb_object_t *check = sdb_llist_shift(list); @@ -205,7 +309,7 @@ END_TEST START_TEST(test_iter) { sdb_llist_iter_t *iter; - int i; + size_t i; populate(); @@ -231,6 +335,41 @@ START_TEST(test_iter) } END_TEST +START_TEST(test_iter_remove) +{ + sdb_llist_iter_t *iter; + sdb_object_t *check; + size_t i; + + populate(); + + iter = sdb_llist_get_iter(list); + fail_unless(iter != NULL, + "sdb_llist_get_iter() did not return an iterator"); + + i = 0; + while (sdb_llist_iter_has_next(iter)) { + check = sdb_llist_iter_get_next(iter); + fail_unless(check == &golden_data[i], + "sdb_llist_iter_get_next() = %p; expected: %p", + check, &golden_data[i]); + + sdb_llist_iter_remove_current(iter); + ++i; + } + sdb_llist_iter_destroy(iter); + + fail_unless(i == (size_t)SDB_STATIC_ARRAY_LEN(golden_data), + "iterated for %zu steps; expected: %i", + i, SDB_STATIC_ARRAY_LEN(golden_data)); + + /* all elements should be removed */ + check = sdb_llist_shift(list); + fail_unless(check == NULL, + "sdb_llist_shift() = %p; expected: NULL", check); +} +END_TEST + Suite * util_llist_suite(void) { @@ -241,12 +380,16 @@ util_llist_suite(void) tcase_add_checked_fixture(tc, setup, teardown); tcase_add_test(tc, test_clone); tcase_add_test(tc, test_destroy); + tcase_add_test(tc, test_clear); tcase_add_test(tc, test_append); tcase_add_test(tc, test_insert); - tcase_add_test(tc, test_insert_invalid); + tcase_add_test(tc, test_validate_insert); + tcase_add_test(tc, test_get); + tcase_add_test(tc, test_remove_by_name); tcase_add_test(tc, test_search); tcase_add_test(tc, test_shift); tcase_add_test(tc, test_iter); + tcase_add_test(tc, test_iter_remove); suite_add_tcase(s, tc); return s;