Home | History | Annotate | Download | only in unit
      1 #include "test/jemalloc_test.h"
      2 
      3 TEST_BEGIN(test_new_delete)
      4 {
      5 	ckh_t ckh;
      6 
      7 	assert_false(ckh_new(&ckh, 2, ckh_string_hash, ckh_string_keycomp),
      8 	    "Unexpected ckh_new() error");
      9 	ckh_delete(&ckh);
     10 
     11 	assert_false(ckh_new(&ckh, 3, ckh_pointer_hash, ckh_pointer_keycomp),
     12 	    "Unexpected ckh_new() error");
     13 	ckh_delete(&ckh);
     14 }
     15 TEST_END
     16 
     17 TEST_BEGIN(test_count_insert_search_remove)
     18 {
     19 	ckh_t ckh;
     20 	const char *strs[] = {
     21 	    "a string",
     22 	    "A string",
     23 	    "a string.",
     24 	    "A string."
     25 	};
     26 	const char *missing = "A string not in the hash table.";
     27 	size_t i;
     28 
     29 	assert_false(ckh_new(&ckh, 2, ckh_string_hash, ckh_string_keycomp),
     30 	    "Unexpected ckh_new() error");
     31 	assert_zu_eq(ckh_count(&ckh), 0,
     32 	    "ckh_count() should return %zu, but it returned %zu", ZU(0),
     33 	    ckh_count(&ckh));
     34 
     35 	/* Insert. */
     36 	for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
     37 		ckh_insert(&ckh, strs[i], strs[i]);
     38 		assert_zu_eq(ckh_count(&ckh), i+1,
     39 		    "ckh_count() should return %zu, but it returned %zu", i+1,
     40 		    ckh_count(&ckh));
     41 	}
     42 
     43 	/* Search. */
     44 	for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
     45 		union {
     46 			void *p;
     47 			const char *s;
     48 		} k, v;
     49 		void **kp, **vp;
     50 		const char *ks, *vs;
     51 
     52 		kp = (i & 1) ? &k.p : NULL;
     53 		vp = (i & 2) ? &v.p : NULL;
     54 		k.p = NULL;
     55 		v.p = NULL;
     56 		assert_false(ckh_search(&ckh, strs[i], kp, vp),
     57 		    "Unexpected ckh_search() error");
     58 
     59 		ks = (i & 1) ? strs[i] : (const char *)NULL;
     60 		vs = (i & 2) ? strs[i] : (const char *)NULL;
     61 		assert_ptr_eq((void *)ks, (void *)k.s,
     62 		    "Key mismatch, i=%zu", i);
     63 		assert_ptr_eq((void *)vs, (void *)v.s,
     64 		    "Value mismatch, i=%zu", i);
     65 	}
     66 	assert_true(ckh_search(&ckh, missing, NULL, NULL),
     67 	    "Unexpected ckh_search() success");
     68 
     69 	/* Remove. */
     70 	for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
     71 		union {
     72 			void *p;
     73 			const char *s;
     74 		} k, v;
     75 		void **kp, **vp;
     76 		const char *ks, *vs;
     77 
     78 		kp = (i & 1) ? &k.p : NULL;
     79 		vp = (i & 2) ? &v.p : NULL;
     80 		k.p = NULL;
     81 		v.p = NULL;
     82 		assert_false(ckh_remove(&ckh, strs[i], kp, vp),
     83 		    "Unexpected ckh_remove() error");
     84 
     85 		ks = (i & 1) ? strs[i] : (const char *)NULL;
     86 		vs = (i & 2) ? strs[i] : (const char *)NULL;
     87 		assert_ptr_eq((void *)ks, (void *)k.s,
     88 		    "Key mismatch, i=%zu", i);
     89 		assert_ptr_eq((void *)vs, (void *)v.s,
     90 		    "Value mismatch, i=%zu", i);
     91 		assert_zu_eq(ckh_count(&ckh),
     92 		    sizeof(strs)/sizeof(const char *) - i - 1,
     93 		    "ckh_count() should return %zu, but it returned %zu",
     94 		    sizeof(strs)/sizeof(const char *) - i - 1,
     95 		    ckh_count(&ckh));
     96 	}
     97 
     98 	ckh_delete(&ckh);
     99 }
    100 TEST_END
    101 
    102 TEST_BEGIN(test_insert_iter_remove)
    103 {
    104 #define	NITEMS ZU(1000)
    105 	ckh_t ckh;
    106 	void **p[NITEMS];
    107 	void *q, *r;
    108 	size_t i;
    109 
    110 	assert_false(ckh_new(&ckh, 2, ckh_pointer_hash, ckh_pointer_keycomp),
    111 	    "Unexpected ckh_new() error");
    112 
    113 	for (i = 0; i < NITEMS; i++) {
    114 		p[i] = mallocx(i+1, 0);
    115 		assert_ptr_not_null(p[i], "Unexpected mallocx() failure");
    116 	}
    117 
    118 	for (i = 0; i < NITEMS; i++) {
    119 		size_t j;
    120 
    121 		for (j = i; j < NITEMS; j++) {
    122 			assert_false(ckh_insert(&ckh, p[j], p[j]),
    123 			    "Unexpected ckh_insert() failure");
    124 			assert_false(ckh_search(&ckh, p[j], &q, &r),
    125 			    "Unexpected ckh_search() failure");
    126 			assert_ptr_eq(p[j], q, "Key pointer mismatch");
    127 			assert_ptr_eq(p[j], r, "Value pointer mismatch");
    128 		}
    129 
    130 		assert_zu_eq(ckh_count(&ckh), NITEMS,
    131 		    "ckh_count() should return %zu, but it returned %zu",
    132 		    NITEMS, ckh_count(&ckh));
    133 
    134 		for (j = i + 1; j < NITEMS; j++) {
    135 			assert_false(ckh_search(&ckh, p[j], NULL, NULL),
    136 			    "Unexpected ckh_search() failure");
    137 			assert_false(ckh_remove(&ckh, p[j], &q, &r),
    138 			    "Unexpected ckh_remove() failure");
    139 			assert_ptr_eq(p[j], q, "Key pointer mismatch");
    140 			assert_ptr_eq(p[j], r, "Value pointer mismatch");
    141 			assert_true(ckh_search(&ckh, p[j], NULL, NULL),
    142 			    "Unexpected ckh_search() success");
    143 			assert_true(ckh_remove(&ckh, p[j], &q, &r),
    144 			    "Unexpected ckh_remove() success");
    145 		}
    146 
    147 		{
    148 			bool seen[NITEMS];
    149 			size_t tabind;
    150 
    151 			memset(seen, 0, sizeof(seen));
    152 
    153 			for (tabind = 0; ckh_iter(&ckh, &tabind, &q, &r) ==
    154 			    false;) {
    155 				size_t k;
    156 
    157 				assert_ptr_eq(q, r, "Key and val not equal");
    158 
    159 				for (k = 0; k < NITEMS; k++) {
    160 					if (p[k] == q) {
    161 						assert_false(seen[k],
    162 						    "Item %zu already seen", k);
    163 						seen[k] = true;
    164 						break;
    165 					}
    166 				}
    167 			}
    168 
    169 			for (j = 0; j < i + 1; j++)
    170 				assert_true(seen[j], "Item %zu not seen", j);
    171 			for (; j < NITEMS; j++)
    172 				assert_false(seen[j], "Item %zu seen", j);
    173 		}
    174 	}
    175 
    176 	for (i = 0; i < NITEMS; i++) {
    177 		assert_false(ckh_search(&ckh, p[i], NULL, NULL),
    178 		    "Unexpected ckh_search() failure");
    179 		assert_false(ckh_remove(&ckh, p[i], &q, &r),
    180 		    "Unexpected ckh_remove() failure");
    181 		assert_ptr_eq(p[i], q, "Key pointer mismatch");
    182 		assert_ptr_eq(p[i], r, "Value pointer mismatch");
    183 		assert_true(ckh_search(&ckh, p[i], NULL, NULL),
    184 		    "Unexpected ckh_search() success");
    185 		assert_true(ckh_remove(&ckh, p[i], &q, &r),
    186 		    "Unexpected ckh_remove() success");
    187 		dallocx(p[i], 0);
    188 	}
    189 
    190 	assert_zu_eq(ckh_count(&ckh), 0,
    191 	    "ckh_count() should return %zu, but it returned %zu", ZU(0),
    192 	    ckh_count(&ckh));
    193 	ckh_delete(&ckh);
    194 #undef NITEMS
    195 }
    196 TEST_END
    197 
    198 int
    199 main(void)
    200 {
    201 
    202 	return (test(
    203 	    test_new_delete,
    204 	    test_count_insert_search_remove,
    205 	    test_insert_iter_remove));
    206 }
    207