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