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