diff options
author | Joe Thornber <ejt@redhat.com> | 2018-06-19 13:38:13 +0100 |
---|---|---|
committer | Joe Thornber <ejt@redhat.com> | 2018-06-21 09:49:25 +0100 |
commit | c8cfbfa605ce6577c390cf940d51d872b3556c64 (patch) | |
tree | 97dda86f696fd0e0958a25a3382a2b2ca048f233 /test/unit | |
parent | 20b9746c5d22de385e32f5be9a8f04754be2c706 (diff) | |
download | lvm2-c8cfbfa605ce6577c390cf940d51d872b3556c64.tar.gz |
radix_tree: add new test case
Check that value destructors are called by radix_tree_destroy()
Diffstat (limited to 'test/unit')
-rw-r--r-- | test/unit/radix_tree_t.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/unit/radix_tree_t.c b/test/unit/radix_tree_t.c index e2d11e851..4ee22c159 100644 --- a/test/unit/radix_tree_t.c +++ b/test/unit/radix_tree_t.c @@ -562,6 +562,47 @@ static void test_remove_calls_dtr(void *fixture) radix_tree_destroy(rt); } +static void test_destroy_calls_dtr(void *fixture) +{ + unsigned i; + struct counter c; + struct radix_tree *rt = radix_tree_create(_counting_dtr, &c); + T_ASSERT(rt); + + // Bug hunting, so I need the keys to be deterministic + srand(0); + + c.c = 0; + memset(c.present, 1, sizeof(c.present)); + + { + uint8_t keys[DTR_COUNT * 3]; + union radix_value v; + + // generate and insert a lot of keys + for (i = 0; i < DTR_COUNT; i++) { + bool found = false; + do { + v.n = i; + uint8_t *k = keys + (i * 3); + _gen_key(k, k + 3); + if (!radix_tree_lookup(rt, k, k + 3, &v)) { + T_ASSERT(radix_tree_insert(rt, k, k + 3, v)); + found = true; + } + + } while (!found); + } + + T_ASSERT(radix_tree_is_well_formed(rt)); + } + + radix_tree_destroy(rt); + T_ASSERT(c.c == DTR_COUNT); + for (i = 0; i < DTR_COUNT; i++) + T_ASSERT(!c.present[i]); +} + //---------------------------------------------------------------- #define T(path, desc, fn) register_test(ts, "/base/data-struct/radix-tree/" path, desc, fn) @@ -595,6 +636,7 @@ void radix_tree_tests(struct dm_list *all_tests) T("iterate-single", "iterate a subset that contains a single entry", test_iterate_single); T("iterate-vary-middle", "iterate keys that vary in the middle", test_iterate_vary_middle); T("remove-calls-dtr", "remove should call the dtr for the value", test_remove_calls_dtr); + T("destroy-calls-dtr", "destroy should call the dtr for all values", test_destroy_calls_dtr); dm_list_add(all_tests, &ts->list); } |