From: Florian Forster Date: Thu, 26 Nov 2015 13:13:17 +0000 (+0100) Subject: utils_avltree_test.c: Extend unit test to test c_avl_pick(). X-Git-Tag: collectd-5.6.0~580 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=adb8986db8afd4cea48e176619def459a5c292e7;p=collectd.git utils_avltree_test.c: Extend unit test to test c_avl_pick(). This demonstrates the bug that c_avl_pick() does not decrease the AVL tree's size. Issue: #1353 --- diff --git a/src/daemon/utils_avltree_test.c b/src/daemon/utils_avltree_test.c index 2a8244c9..6dbafe18 100644 --- a/src/daemon/utils_avltree_test.c +++ b/src/daemon/utils_avltree_test.c @@ -27,6 +27,7 @@ #include "testing.h" #include "collectd.h" #include "utils_avltree.h" +#include "common.h" /* STATIC_ARRAY_SIZE */ static int compare_total_count = 0; #define RESET_COUNTS() do { compare_total_count = 0; } while (0) @@ -42,30 +43,99 @@ static int compare_callback (void const *v0, void const *v1) DEF_TEST(success) { + struct { + char *key; + char *value; + } cases[] = { + {"Eeph7chu", "vai1reiV"}, + {"igh3Paiz", "teegh1Ee"}, + {"caip6Uu8", "ooteQu8n"}, + {"Aech6vah", "AijeeT0l"}, + {"Xah0et2L", "gah8Taep"}, + {"BocaeB8n", "oGaig8io"}, + {"thai8AhM", "ohjeFo3f"}, + {"ohth6ieC", "hoo8ieWo"}, + {"aej7Woow", "phahuC2s"}, + {"Hai8ier2", "Yie6eimi"}, + {"phuXi3Li", "JaiF7ieb"}, + {"Shaig5ef", "aihi5Zai"}, + {"voh6Aith", "Oozaeto0"}, + {"zaiP5kie", "seep5veM"}, + {"pae7ba7D", "chie8Ojo"}, + {"Gou2ril3", "ouVoo0ha"}, + {"lo3Thee3", "ahDu4Zuj"}, + {"Rah8kohv", "ieShoc7E"}, + {"ieN5engi", "Aevou1ah"}, + {"ooTe4OhP", "aingai5Y"}, + }; + c_avl_tree_t *t; - char key_orig[] = "foo"; - char value_orig[] = "bar"; - char *key_ret = NULL; - char *value_ret = NULL; + size_t i; RESET_COUNTS (); - t = c_avl_create (compare_callback); - OK (t != NULL); + CHECK_NOT_NULL (t = c_avl_create (compare_callback)); + + /* insert */ + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) + { + char *key; + char *value; - OK (c_avl_insert (t, key_orig, value_orig) == 0); - OK (c_avl_size (t) == 1); + CHECK_NOT_NULL (key = strdup (cases[i].key)); + CHECK_NOT_NULL (value = strdup (cases[i].value)); + + CHECK_ZERO (c_avl_insert (t, key, value)); + EXPECT_EQ_INT ((int) (i + 1), c_avl_size (t)); + } /* Key already exists. */ - OK (c_avl_insert (t, "foo", "qux") > 0); + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) + EXPECT_EQ_INT (1, c_avl_insert (t, cases[i].key, cases[i].value)); + + /* get */ + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) + { + char *value_ret = NULL; + + CHECK_ZERO (c_avl_get (t, cases[i].key, (void *) &value_ret)); + EXPECT_EQ_STR (cases[i].value, value_ret); + } + + /* remove half */ + for (i = 0; i < STATIC_ARRAY_SIZE (cases) / 2; i++) + { + char *key = NULL; + char *value = NULL; + + int expected_size = (int) (STATIC_ARRAY_SIZE (cases) - (i + 1)); + + CHECK_ZERO (c_avl_remove (t, cases[i].key, (void *) &key, (void *) &value)); + + EXPECT_EQ_STR (cases[i].key, key); + EXPECT_EQ_STR (cases[i].value, value); + + free (key); + free (value); + + EXPECT_EQ_INT (expected_size, c_avl_size (t)); + } + + /* pick the other half */ + for (i = STATIC_ARRAY_SIZE (cases) / 2; i < STATIC_ARRAY_SIZE (cases); i++) + { + char *key = NULL; + char *value = NULL; + + int expected_size = (int) (STATIC_ARRAY_SIZE (cases) - (i + 1)); + + EXPECT_EQ_INT (expected_size + 1, c_avl_size (t)); + EXPECT_EQ_INT (0, c_avl_pick (t, (void *) &key, (void *) &value)); - OK (c_avl_get (t, "foo", (void *) &value_ret) == 0); - OK (value_ret == &value_orig[0]); + free (key); + free (value); - key_ret = value_ret = NULL; - OK (c_avl_remove (t, "foo", (void *) &key_ret, (void *) &value_ret) == 0); - OK (key_ret == &key_orig[0]); - OK (value_ret == &value_orig[0]); - OK (c_avl_size (t) == 0); + EXPECT_EQ_INT (expected_size, c_avl_size (t)); + } c_avl_destroy (t);