blob: b117595994abb394cd4db46ac9e13bb11d8eb34a [file] [log] [blame]
Jason Evanse948fa62013-12-16 18:04:23 -08001#include "test/jemalloc_test.h"
2
3TEST_BEGIN(test_new_delete)
4{
Jason Evans5460aa62014-09-22 21:09:23 -07005 tsd_t *tsd;
Jason Evanse948fa62013-12-16 18:04:23 -08006 ckh_t ckh;
7
Jason Evans029d44c2014-10-04 11:12:53 -07008 tsd = tsd_fetch();
Jason Evanse948fa62013-12-16 18:04:23 -08009
Jason Evans5460aa62014-09-22 21:09:23 -070010 assert_false(ckh_new(tsd, &ckh, 2, ckh_string_hash, ckh_string_keycomp),
Jason Evanse948fa62013-12-16 18:04:23 -080011 "Unexpected ckh_new() error");
Jason Evans5460aa62014-09-22 21:09:23 -070012 ckh_delete(tsd, &ckh);
13
14 assert_false(ckh_new(tsd, &ckh, 3, ckh_pointer_hash,
15 ckh_pointer_keycomp), "Unexpected ckh_new() error");
16 ckh_delete(tsd, &ckh);
Jason Evanse948fa62013-12-16 18:04:23 -080017}
18TEST_END
19
20TEST_BEGIN(test_count_insert_search_remove)
21{
Jason Evans5460aa62014-09-22 21:09:23 -070022 tsd_t *tsd;
Jason Evanse948fa62013-12-16 18:04:23 -080023 ckh_t ckh;
24 const char *strs[] = {
25 "a string",
26 "A string",
27 "a string.",
28 "A string."
29 };
Christopher Ferris10071f22016-03-02 21:56:36 +000030 const char *missing = "A string not in the hash table.";
Jason Evanse948fa62013-12-16 18:04:23 -080031 size_t i;
32
Jason Evans029d44c2014-10-04 11:12:53 -070033 tsd = tsd_fetch();
Jason Evans5460aa62014-09-22 21:09:23 -070034
35 assert_false(ckh_new(tsd, &ckh, 2, ckh_string_hash, ckh_string_keycomp),
Jason Evanse948fa62013-12-16 18:04:23 -080036 "Unexpected ckh_new() error");
37 assert_zu_eq(ckh_count(&ckh), 0,
Jason Evans5fae7dc2015-07-23 13:56:25 -070038 "ckh_count() should return %zu, but it returned %zu", ZU(0),
Jason Evanse948fa62013-12-16 18:04:23 -080039 ckh_count(&ckh));
40
41 /* Insert. */
42 for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
Jason Evans5460aa62014-09-22 21:09:23 -070043 ckh_insert(tsd, &ckh, strs[i], strs[i]);
Jason Evanse948fa62013-12-16 18:04:23 -080044 assert_zu_eq(ckh_count(&ckh), i+1,
Jason Evans5fae7dc2015-07-23 13:56:25 -070045 "ckh_count() should return %zu, but it returned %zu", i+1,
46 ckh_count(&ckh));
Jason Evanse948fa62013-12-16 18:04:23 -080047 }
48
49 /* Search. */
50 for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
51 union {
52 void *p;
53 const char *s;
54 } k, v;
55 void **kp, **vp;
56 const char *ks, *vs;
57
58 kp = (i & 1) ? &k.p : NULL;
59 vp = (i & 2) ? &v.p : NULL;
60 k.p = NULL;
61 v.p = NULL;
62 assert_false(ckh_search(&ckh, strs[i], kp, vp),
63 "Unexpected ckh_search() error");
64
65 ks = (i & 1) ? strs[i] : (const char *)NULL;
66 vs = (i & 2) ? strs[i] : (const char *)NULL;
Jason Evans5fae7dc2015-07-23 13:56:25 -070067 assert_ptr_eq((void *)ks, (void *)k.s, "Key mismatch, i=%zu",
68 i);
69 assert_ptr_eq((void *)vs, (void *)v.s, "Value mismatch, i=%zu",
70 i);
Jason Evanse948fa62013-12-16 18:04:23 -080071 }
Christopher Ferris10071f22016-03-02 21:56:36 +000072 assert_true(ckh_search(&ckh, missing, NULL, NULL),
73 "Unexpected ckh_search() success");
Jason Evanse948fa62013-12-16 18:04:23 -080074
75 /* Remove. */
76 for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
77 union {
78 void *p;
79 const char *s;
80 } k, v;
81 void **kp, **vp;
82 const char *ks, *vs;
83
84 kp = (i & 1) ? &k.p : NULL;
85 vp = (i & 2) ? &v.p : NULL;
86 k.p = NULL;
87 v.p = NULL;
Jason Evans5460aa62014-09-22 21:09:23 -070088 assert_false(ckh_remove(tsd, &ckh, strs[i], kp, vp),
Jason Evanse948fa62013-12-16 18:04:23 -080089 "Unexpected ckh_remove() error");
90
91 ks = (i & 1) ? strs[i] : (const char *)NULL;
92 vs = (i & 2) ? strs[i] : (const char *)NULL;
Jason Evans5fae7dc2015-07-23 13:56:25 -070093 assert_ptr_eq((void *)ks, (void *)k.s, "Key mismatch, i=%zu",
94 i);
95 assert_ptr_eq((void *)vs, (void *)v.s, "Value mismatch, i=%zu",
96 i);
Jason Evanse948fa62013-12-16 18:04:23 -080097 assert_zu_eq(ckh_count(&ckh),
98 sizeof(strs)/sizeof(const char *) - i - 1,
Jason Evans5fae7dc2015-07-23 13:56:25 -070099 "ckh_count() should return %zu, but it returned %zu",
100 sizeof(strs)/sizeof(const char *) - i - 1,
Jason Evanse948fa62013-12-16 18:04:23 -0800101 ckh_count(&ckh));
102 }
103
Jason Evans5460aa62014-09-22 21:09:23 -0700104 ckh_delete(tsd, &ckh);
Jason Evanse948fa62013-12-16 18:04:23 -0800105}
106TEST_END
107
108TEST_BEGIN(test_insert_iter_remove)
109{
Jason Evansab8c79f2014-03-30 11:21:09 -0700110#define NITEMS ZU(1000)
Jason Evans5460aa62014-09-22 21:09:23 -0700111 tsd_t *tsd;
Jason Evanse948fa62013-12-16 18:04:23 -0800112 ckh_t ckh;
113 void **p[NITEMS];
114 void *q, *r;
Jason Evansab8c79f2014-03-30 11:21:09 -0700115 size_t i;
Jason Evanse948fa62013-12-16 18:04:23 -0800116
Jason Evans029d44c2014-10-04 11:12:53 -0700117 tsd = tsd_fetch();
Jason Evans5460aa62014-09-22 21:09:23 -0700118
119 assert_false(ckh_new(tsd, &ckh, 2, ckh_pointer_hash,
120 ckh_pointer_keycomp), "Unexpected ckh_new() error");
Jason Evanse948fa62013-12-16 18:04:23 -0800121
122 for (i = 0; i < NITEMS; i++) {
123 p[i] = mallocx(i+1, 0);
124 assert_ptr_not_null(p[i], "Unexpected mallocx() failure");
125 }
126
127 for (i = 0; i < NITEMS; i++) {
Jason Evansab8c79f2014-03-30 11:21:09 -0700128 size_t j;
Jason Evanse948fa62013-12-16 18:04:23 -0800129
130 for (j = i; j < NITEMS; j++) {
Jason Evans5460aa62014-09-22 21:09:23 -0700131 assert_false(ckh_insert(tsd, &ckh, p[j], p[j]),
Jason Evanse948fa62013-12-16 18:04:23 -0800132 "Unexpected ckh_insert() failure");
133 assert_false(ckh_search(&ckh, p[j], &q, &r),
134 "Unexpected ckh_search() failure");
135 assert_ptr_eq(p[j], q, "Key pointer mismatch");
136 assert_ptr_eq(p[j], r, "Value pointer mismatch");
137 }
138
139 assert_zu_eq(ckh_count(&ckh), NITEMS,
Jason Evans5fae7dc2015-07-23 13:56:25 -0700140 "ckh_count() should return %zu, but it returned %zu",
141 NITEMS, ckh_count(&ckh));
Jason Evanse948fa62013-12-16 18:04:23 -0800142
143 for (j = i + 1; j < NITEMS; j++) {
144 assert_false(ckh_search(&ckh, p[j], NULL, NULL),
145 "Unexpected ckh_search() failure");
Jason Evans5460aa62014-09-22 21:09:23 -0700146 assert_false(ckh_remove(tsd, &ckh, p[j], &q, &r),
Jason Evanse948fa62013-12-16 18:04:23 -0800147 "Unexpected ckh_remove() failure");
148 assert_ptr_eq(p[j], q, "Key pointer mismatch");
149 assert_ptr_eq(p[j], r, "Value pointer mismatch");
150 assert_true(ckh_search(&ckh, p[j], NULL, NULL),
151 "Unexpected ckh_search() success");
Jason Evans5460aa62014-09-22 21:09:23 -0700152 assert_true(ckh_remove(tsd, &ckh, p[j], &q, &r),
Jason Evanse948fa62013-12-16 18:04:23 -0800153 "Unexpected ckh_remove() success");
154 }
155
156 {
157 bool seen[NITEMS];
158 size_t tabind;
159
160 memset(seen, 0, sizeof(seen));
161
Jason Evans551ebc42014-10-03 10:16:09 -0700162 for (tabind = 0; !ckh_iter(&ckh, &tabind, &q, &r);) {
Jason Evansab8c79f2014-03-30 11:21:09 -0700163 size_t k;
Jason Evanse948fa62013-12-16 18:04:23 -0800164
165 assert_ptr_eq(q, r, "Key and val not equal");
166
167 for (k = 0; k < NITEMS; k++) {
168 if (p[k] == q) {
169 assert_false(seen[k],
Jason Evans5fae7dc2015-07-23 13:56:25 -0700170 "Item %zu already seen", k);
Jason Evanse948fa62013-12-16 18:04:23 -0800171 seen[k] = true;
172 break;
173 }
174 }
175 }
176
Jason Evans5fae7dc2015-07-23 13:56:25 -0700177 for (j = 0; j < i + 1; j++)
178 assert_true(seen[j], "Item %zu not seen", j);
Jason Evanse948fa62013-12-16 18:04:23 -0800179 for (; j < NITEMS; j++)
Jason Evans5fae7dc2015-07-23 13:56:25 -0700180 assert_false(seen[j], "Item %zu seen", j);
Jason Evanse948fa62013-12-16 18:04:23 -0800181 }
182 }
183
184 for (i = 0; i < NITEMS; i++) {
185 assert_false(ckh_search(&ckh, p[i], NULL, NULL),
186 "Unexpected ckh_search() failure");
Jason Evans5460aa62014-09-22 21:09:23 -0700187 assert_false(ckh_remove(tsd, &ckh, p[i], &q, &r),
Jason Evanse948fa62013-12-16 18:04:23 -0800188 "Unexpected ckh_remove() failure");
189 assert_ptr_eq(p[i], q, "Key pointer mismatch");
190 assert_ptr_eq(p[i], r, "Value pointer mismatch");
191 assert_true(ckh_search(&ckh, p[i], NULL, NULL),
192 "Unexpected ckh_search() success");
Jason Evans5460aa62014-09-22 21:09:23 -0700193 assert_true(ckh_remove(tsd, &ckh, p[i], &q, &r),
Jason Evanse948fa62013-12-16 18:04:23 -0800194 "Unexpected ckh_remove() success");
195 dallocx(p[i], 0);
196 }
197
198 assert_zu_eq(ckh_count(&ckh), 0,
Jason Evans5fae7dc2015-07-23 13:56:25 -0700199 "ckh_count() should return %zu, but it returned %zu",
Jason Evans218b15c2015-07-17 18:12:44 -0700200 ZU(0), ckh_count(&ckh));
Jason Evans5460aa62014-09-22 21:09:23 -0700201 ckh_delete(tsd, &ckh);
Jason Evanse948fa62013-12-16 18:04:23 -0800202#undef NITEMS
203}
204TEST_END
205
206int
207main(void)
208{
209
210 return (test(
211 test_new_delete,
212 test_count_insert_search_remove,
213 test_insert_iter_remove));
214}