rtree.c revision b980cc774a9ccb208a82f4e9ccdcc695d06a960a
1#include "test/jemalloc_test.h"
2
3TEST_BEGIN(test_rtree_get_empty)
4{
5	unsigned i;
6
7	for (i = 1; i <= (sizeof(uintptr_t) << 3); i++) {
8		rtree_t *rtree = rtree_new(i, imalloc, idalloc);
9		assert_ptr_null(rtree_get(rtree, 0),
10		    "rtree_get() should return NULL for empty tree");
11		rtree_delete(rtree);
12	}
13}
14TEST_END
15
16TEST_BEGIN(test_rtree_extrema)
17{
18	unsigned i;
19
20	for (i = 1; i <= (sizeof(uintptr_t) << 3); i++) {
21		rtree_t *rtree = rtree_new(i, imalloc, idalloc);
22
23		rtree_set(rtree, 0, (void *)1);
24		assert_ptr_eq(rtree_get(rtree, 0), (void *)1,
25		    "rtree_get() should return previously set value");
26
27		rtree_set(rtree, ~((uintptr_t)0), (void *)1);
28		assert_ptr_eq(rtree_get(rtree, ~((uintptr_t)0)), (void *)1,
29		    "rtree_get() should return previously set value");
30
31		rtree_delete(rtree);
32	}
33}
34TEST_END
35
36TEST_BEGIN(test_rtree_bits)
37{
38	unsigned i, j, k;
39
40	for (i = 1; i < (sizeof(uintptr_t) << 3); i++) {
41		uintptr_t keys[] = {0, 1,
42		    (((uintptr_t)1) << (sizeof(uintptr_t)*8-i)) - 1};
43		rtree_t *rtree = rtree_new(i, imalloc, idalloc);
44
45		for (j = 0; j < sizeof(keys)/sizeof(uintptr_t); j++) {
46			rtree_set(rtree, keys[j], (void *)1);
47			for (k = 0; k < sizeof(keys)/sizeof(uintptr_t); k++) {
48				assert_ptr_eq(rtree_get(rtree, keys[k]),
49				    (void *)1,
50				    "rtree_get() should return previously set "
51				    "value and ignore insignificant key bits; "
52				    "i=%u, j=%u, k=%u, set key=%#x, "
53				    "get key=%#x", i, j, k, keys[j], keys[k]);
54			}
55			assert_ptr_eq(rtree_get(rtree,
56			    (((uintptr_t)1) << (sizeof(uintptr_t)*8-i))),
57			    (void *)0,
58			    "Only leftmost rtree leaf should be set; "
59			    "i=%u, j=%u", i, j);
60			rtree_set(rtree, keys[j], (void *)0);
61		}
62
63		rtree_delete(rtree);
64	}
65}
66TEST_END
67
68TEST_BEGIN(test_rtree_random)
69{
70	unsigned i;
71	sfmt_t *sfmt;
72#define	NSET 100
73#define	SEED 42
74
75	sfmt = init_gen_rand(SEED);
76	for (i = 1; i <= (sizeof(uintptr_t) << 3); i++) {
77		rtree_t *rtree = rtree_new(i, imalloc, idalloc);
78		uintptr_t keys[NSET];
79		unsigned j;
80
81		for (j = 0; j < NSET; j++) {
82			keys[j] = (uintptr_t)gen_rand64(sfmt);
83			rtree_set(rtree, keys[j], (void *)1);
84			assert_ptr_eq(rtree_get(rtree, keys[j]), (void *)1,
85			    "rtree_get() should return previously set value");
86		}
87		for (j = 0; j < NSET; j++) {
88			assert_ptr_eq(rtree_get(rtree, keys[j]), (void *)1,
89			    "rtree_get() should return previously set value");
90		}
91
92		for (j = 0; j < NSET; j++) {
93			rtree_set(rtree, keys[j], (void *)0);
94			assert_ptr_eq(rtree_get(rtree, keys[j]), (void *)0,
95			    "rtree_get() should return previously set value");
96		}
97		for (j = 0; j < NSET; j++) {
98			assert_ptr_eq(rtree_get(rtree, keys[j]), (void *)0,
99			    "rtree_get() should return previously set value");
100		}
101
102		rtree_delete(rtree);
103	}
104	fini_gen_rand(sfmt);
105#undef NSET
106#undef SEED
107}
108TEST_END
109
110int
111main(void)
112{
113
114	return (test(
115	    test_rtree_get_empty,
116	    test_rtree_extrema,
117	    test_rtree_bits,
118	    test_rtree_random));
119}
120