Home | History | Annotate | Line # | Download | only in unit
ckh.c revision 1.1
      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  christos 	assert_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  christos 	assert_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  christos 	assert_false(ckh_new(tsd, &ckh, 2, ckh_string_hash,
     34  1.1  christos 	    ckh_string_keycomp), "Unexpected ckh_new() error");
     35  1.1  christos 	assert_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  christos 		assert_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  christos 		assert_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  christos 		assert_ptr_eq((void *)ks, (void *)k.s, "Key mismatch, i=%zu",
     66  1.1  christos 		    i);
     67  1.1  christos 		assert_ptr_eq((void *)vs, (void *)v.s, "Value mismatch, i=%zu",
     68  1.1  christos 		    i);
     69  1.1  christos 	}
     70  1.1  christos 	assert_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  christos 		assert_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  christos 		assert_ptr_eq((void *)ks, (void *)k.s, "Key mismatch, i=%zu",
     92  1.1  christos 		    i);
     93  1.1  christos 		assert_ptr_eq((void *)vs, (void *)v.s, "Value mismatch, i=%zu",
     94  1.1  christos 		    i);
     95  1.1  christos 		assert_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  christos 	assert_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  christos 		assert_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  christos 			assert_false(ckh_insert(tsd, &ckh, p[j], p[j]),
    129  1.1  christos 			    "Unexpected ckh_insert() failure");
    130  1.1  christos 			assert_false(ckh_search(&ckh, p[j], &q, &r),
    131  1.1  christos 			    "Unexpected ckh_search() failure");
    132  1.1  christos 			assert_ptr_eq(p[j], q, "Key pointer mismatch");
    133  1.1  christos 			assert_ptr_eq(p[j], r, "Value pointer mismatch");
    134  1.1  christos 		}
    135  1.1  christos 
    136  1.1  christos 		assert_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  christos 			assert_false(ckh_search(&ckh, p[j], NULL, NULL),
    142  1.1  christos 			    "Unexpected ckh_search() failure");
    143  1.1  christos 			assert_false(ckh_remove(tsd, &ckh, p[j], &q, &r),
    144  1.1  christos 			    "Unexpected ckh_remove() failure");
    145  1.1  christos 			assert_ptr_eq(p[j], q, "Key pointer mismatch");
    146  1.1  christos 			assert_ptr_eq(p[j], r, "Value pointer mismatch");
    147  1.1  christos 			assert_true(ckh_search(&ckh, p[j], NULL, NULL),
    148  1.1  christos 			    "Unexpected ckh_search() success");
    149  1.1  christos 			assert_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  christos 				assert_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  christos 						assert_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  christos 				assert_true(seen[j], "Item %zu not seen", j);
    176  1.1  christos 			}
    177  1.1  christos 			for (; j < NITEMS; j++) {
    178  1.1  christos 				assert_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  christos 		assert_false(ckh_search(&ckh, p[i], NULL, NULL),
    185  1.1  christos 		    "Unexpected ckh_search() failure");
    186  1.1  christos 		assert_false(ckh_remove(tsd, &ckh, p[i], &q, &r),
    187  1.1  christos 		    "Unexpected ckh_remove() failure");
    188  1.1  christos 		assert_ptr_eq(p[i], q, "Key pointer mismatch");
    189  1.1  christos 		assert_ptr_eq(p[i], r, "Value pointer mismatch");
    190  1.1  christos 		assert_true(ckh_search(&ckh, p[i], NULL, NULL),
    191  1.1  christos 		    "Unexpected ckh_search() success");
    192  1.1  christos 		assert_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  christos 	assert_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