Merge pull request #2618 from ajssmith/amqp1_dev1_branch
[collectd.git] / src / daemon / utils_avltree_test.c
1 /**
2  * collectd - src/tests/test_utils_avltree.c
3  * Copyright (C) 2013       Florian octo Forster
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  *   Florian octo Forster <octo at collectd.org>
25  */
26
27 #include "collectd.h"
28 #include "common.h" /* STATIC_ARRAY_SIZE */
29
30 #include "testing.h"
31 #include "utils_avltree.h"
32
33 static int compare_total_count;
34
35 #define RESET_COUNTS()                                                         \
36   do {                                                                         \
37     compare_total_count = 0;                                                   \
38   } while (0)
39
40 static int compare_callback(void const *v0, void const *v1) {
41   assert(v0 != NULL);
42   assert(v1 != NULL);
43
44   compare_total_count++;
45   return strcmp(v0, v1);
46 }
47
48 DEF_TEST(success) {
49   struct {
50     char *key;
51     char *value;
52   } cases[] = {
53       {"Eeph7chu", "vai1reiV"}, {"igh3Paiz", "teegh1Ee"},
54       {"caip6Uu8", "ooteQu8n"}, {"Aech6vah", "AijeeT0l"},
55       {"Xah0et2L", "gah8Taep"}, {"BocaeB8n", "oGaig8io"},
56       {"thai8AhM", "ohjeFo3f"}, {"ohth6ieC", "hoo8ieWo"},
57       {"aej7Woow", "phahuC2s"}, {"Hai8ier2", "Yie6eimi"},
58       {"phuXi3Li", "JaiF7ieb"}, {"Shaig5ef", "aihi5Zai"},
59       {"voh6Aith", "Oozaeto0"}, {"zaiP5kie", "seep5veM"},
60       {"pae7ba7D", "chie8Ojo"}, {"Gou2ril3", "ouVoo0ha"},
61       {"lo3Thee3", "ahDu4Zuj"}, {"Rah8kohv", "ieShoc7E"},
62       {"ieN5engi", "Aevou1ah"}, {"ooTe4OhP", "aingai5Y"},
63   };
64
65   c_avl_tree_t *t;
66
67   RESET_COUNTS();
68   CHECK_NOT_NULL(t = c_avl_create(compare_callback));
69
70   /* insert */
71   for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++) {
72     char *key;
73     char *value;
74
75     CHECK_NOT_NULL(key = strdup(cases[i].key));
76     CHECK_NOT_NULL(value = strdup(cases[i].value));
77
78     CHECK_ZERO(c_avl_insert(t, key, value));
79     EXPECT_EQ_INT((int)(i + 1), c_avl_size(t));
80   }
81
82   /* Key already exists. */
83   for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++)
84     EXPECT_EQ_INT(1, c_avl_insert(t, cases[i].key, cases[i].value));
85
86   /* get */
87   for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases); i++) {
88     char *value_ret = NULL;
89
90     CHECK_ZERO(c_avl_get(t, cases[i].key, (void *)&value_ret));
91     EXPECT_EQ_STR(cases[i].value, value_ret);
92   }
93
94   /* remove half */
95   for (size_t i = 0; i < STATIC_ARRAY_SIZE(cases) / 2; i++) {
96     char *key = NULL;
97     char *value = NULL;
98
99     int expected_size = (int)(STATIC_ARRAY_SIZE(cases) - (i + 1));
100
101     CHECK_ZERO(c_avl_remove(t, cases[i].key, (void *)&key, (void *)&value));
102
103     EXPECT_EQ_STR(cases[i].key, key);
104     EXPECT_EQ_STR(cases[i].value, value);
105
106     free(key);
107     free(value);
108
109     EXPECT_EQ_INT(expected_size, c_avl_size(t));
110   }
111
112   /* pick the other half */
113   for (size_t i = STATIC_ARRAY_SIZE(cases) / 2; i < STATIC_ARRAY_SIZE(cases);
114        i++) {
115     char *key = NULL;
116     char *value = NULL;
117
118     int expected_size = (int)(STATIC_ARRAY_SIZE(cases) - (i + 1));
119
120     EXPECT_EQ_INT(expected_size + 1, c_avl_size(t));
121     EXPECT_EQ_INT(0, c_avl_pick(t, (void *)&key, (void *)&value));
122
123     free(key);
124     free(value);
125
126     EXPECT_EQ_INT(expected_size, c_avl_size(t));
127   }
128
129   c_avl_destroy(t);
130
131   return 0;
132 }
133
134 int main(void) {
135   RUN_TEST(success);
136
137   END_TEST;
138 }