Blame jemalloc/test/unit/ckh.c

Packit Service 724aca
#include "test/jemalloc_test.h"
Packit Service 724aca
Packit Service 724aca
TEST_BEGIN(test_new_delete) {
Packit Service 724aca
	tsd_t *tsd;
Packit Service 724aca
	ckh_t ckh;
Packit Service 724aca
Packit Service 724aca
	tsd = tsd_fetch();
Packit Service 724aca
Packit Service 724aca
	assert_false(ckh_new(tsd, &ckh, 2, ckh_string_hash,
Packit Service 724aca
	    ckh_string_keycomp), "Unexpected ckh_new() error");
Packit Service 724aca
	ckh_delete(tsd, &ckh);
Packit Service 724aca
Packit Service 724aca
	assert_false(ckh_new(tsd, &ckh, 3, ckh_pointer_hash,
Packit Service 724aca
	    ckh_pointer_keycomp), "Unexpected ckh_new() error");
Packit Service 724aca
	ckh_delete(tsd, &ckh);
Packit Service 724aca
}
Packit Service 724aca
TEST_END
Packit Service 724aca
Packit Service 724aca
TEST_BEGIN(test_count_insert_search_remove) {
Packit Service 724aca
	tsd_t *tsd;
Packit Service 724aca
	ckh_t ckh;
Packit Service 724aca
	const char *strs[] = {
Packit Service 724aca
	    "a string",
Packit Service 724aca
	    "A string",
Packit Service 724aca
	    "a string.",
Packit Service 724aca
	    "A string."
Packit Service 724aca
	};
Packit Service 724aca
	const char *missing = "A string not in the hash table.";
Packit Service 724aca
	size_t i;
Packit Service 724aca
Packit Service 724aca
	tsd = tsd_fetch();
Packit Service 724aca
Packit Service 724aca
	assert_false(ckh_new(tsd, &ckh, 2, ckh_string_hash,
Packit Service 724aca
	    ckh_string_keycomp), "Unexpected ckh_new() error");
Packit Service 724aca
	assert_zu_eq(ckh_count(&ckh), 0,
Packit Service 724aca
	    "ckh_count() should return %zu, but it returned %zu", ZU(0),
Packit Service 724aca
	    ckh_count(&ckh));
Packit Service 724aca
Packit Service 724aca
	/* Insert. */
Packit Service 724aca
	for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
Packit Service 724aca
		ckh_insert(tsd, &ckh, strs[i], strs[i]);
Packit Service 724aca
		assert_zu_eq(ckh_count(&ckh), i+1,
Packit Service 724aca
		    "ckh_count() should return %zu, but it returned %zu", i+1,
Packit Service 724aca
		    ckh_count(&ckh));
Packit Service 724aca
	}
Packit Service 724aca
Packit Service 724aca
	/* Search. */
Packit Service 724aca
	for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
Packit Service 724aca
		union {
Packit Service 724aca
			void *p;
Packit Service 724aca
			const char *s;
Packit Service 724aca
		} k, v;
Packit Service 724aca
		void **kp, **vp;
Packit Service 724aca
		const char *ks, *vs;
Packit Service 724aca
Packit Service 724aca
		kp = (i & 1) ? &k.p : NULL;
Packit Service 724aca
		vp = (i & 2) ? &v.p : NULL;
Packit Service 724aca
		k.p = NULL;
Packit Service 724aca
		v.p = NULL;
Packit Service 724aca
		assert_false(ckh_search(&ckh, strs[i], kp, vp),
Packit Service 724aca
		    "Unexpected ckh_search() error");
Packit Service 724aca
Packit Service 724aca
		ks = (i & 1) ? strs[i] : (const char *)NULL;
Packit Service 724aca
		vs = (i & 2) ? strs[i] : (const char *)NULL;
Packit Service 724aca
		assert_ptr_eq((void *)ks, (void *)k.s, "Key mismatch, i=%zu",
Packit Service 724aca
		    i);
Packit Service 724aca
		assert_ptr_eq((void *)vs, (void *)v.s, "Value mismatch, i=%zu",
Packit Service 724aca
		    i);
Packit Service 724aca
	}
Packit Service 724aca
	assert_true(ckh_search(&ckh, missing, NULL, NULL),
Packit Service 724aca
	    "Unexpected ckh_search() success");
Packit Service 724aca
Packit Service 724aca
	/* Remove. */
Packit Service 724aca
	for (i = 0; i < sizeof(strs)/sizeof(const char *); i++) {
Packit Service 724aca
		union {
Packit Service 724aca
			void *p;
Packit Service 724aca
			const char *s;
Packit Service 724aca
		} k, v;
Packit Service 724aca
		void **kp, **vp;
Packit Service 724aca
		const char *ks, *vs;
Packit Service 724aca
Packit Service 724aca
		kp = (i & 1) ? &k.p : NULL;
Packit Service 724aca
		vp = (i & 2) ? &v.p : NULL;
Packit Service 724aca
		k.p = NULL;
Packit Service 724aca
		v.p = NULL;
Packit Service 724aca
		assert_false(ckh_remove(tsd, &ckh, strs[i], kp, vp),
Packit Service 724aca
		    "Unexpected ckh_remove() error");
Packit Service 724aca
Packit Service 724aca
		ks = (i & 1) ? strs[i] : (const char *)NULL;
Packit Service 724aca
		vs = (i & 2) ? strs[i] : (const char *)NULL;
Packit Service 724aca
		assert_ptr_eq((void *)ks, (void *)k.s, "Key mismatch, i=%zu",
Packit Service 724aca
		    i);
Packit Service 724aca
		assert_ptr_eq((void *)vs, (void *)v.s, "Value mismatch, i=%zu",
Packit Service 724aca
		    i);
Packit Service 724aca
		assert_zu_eq(ckh_count(&ckh),
Packit Service 724aca
		    sizeof(strs)/sizeof(const char *) - i - 1,
Packit Service 724aca
		    "ckh_count() should return %zu, but it returned %zu",
Packit Service 724aca
		        sizeof(strs)/sizeof(const char *) - i - 1,
Packit Service 724aca
		    ckh_count(&ckh));
Packit Service 724aca
	}
Packit Service 724aca
Packit Service 724aca
	ckh_delete(tsd, &ckh);
Packit Service 724aca
}
Packit Service 724aca
TEST_END
Packit Service 724aca
Packit Service 724aca
TEST_BEGIN(test_insert_iter_remove) {
Packit Service 724aca
#define NITEMS ZU(1000)
Packit Service 724aca
	tsd_t *tsd;
Packit Service 724aca
	ckh_t ckh;
Packit Service 724aca
	void **p[NITEMS];
Packit Service 724aca
	void *q, *r;
Packit Service 724aca
	size_t i;
Packit Service 724aca
Packit Service 724aca
	tsd = tsd_fetch();
Packit Service 724aca
Packit Service 724aca
	assert_false(ckh_new(tsd, &ckh, 2, ckh_pointer_hash,
Packit Service 724aca
	    ckh_pointer_keycomp), "Unexpected ckh_new() error");
Packit Service 724aca
Packit Service 724aca
	for (i = 0; i < NITEMS; i++) {
Packit Service 724aca
		p[i] = mallocx(i+1, 0);
Packit Service 724aca
		assert_ptr_not_null(p[i], "Unexpected mallocx() failure");
Packit Service 724aca
	}
Packit Service 724aca
Packit Service 724aca
	for (i = 0; i < NITEMS; i++) {
Packit Service 724aca
		size_t j;
Packit Service 724aca
Packit Service 724aca
		for (j = i; j < NITEMS; j++) {
Packit Service 724aca
			assert_false(ckh_insert(tsd, &ckh, p[j], p[j]),
Packit Service 724aca
			    "Unexpected ckh_insert() failure");
Packit Service 724aca
			assert_false(ckh_search(&ckh, p[j], &q, &r),
Packit Service 724aca
			    "Unexpected ckh_search() failure");
Packit Service 724aca
			assert_ptr_eq(p[j], q, "Key pointer mismatch");
Packit Service 724aca
			assert_ptr_eq(p[j], r, "Value pointer mismatch");
Packit Service 724aca
		}
Packit Service 724aca
Packit Service 724aca
		assert_zu_eq(ckh_count(&ckh), NITEMS,
Packit Service 724aca
		    "ckh_count() should return %zu, but it returned %zu",
Packit Service 724aca
		    NITEMS, ckh_count(&ckh));
Packit Service 724aca
Packit Service 724aca
		for (j = i + 1; j < NITEMS; j++) {
Packit Service 724aca
			assert_false(ckh_search(&ckh, p[j], NULL, NULL),
Packit Service 724aca
			    "Unexpected ckh_search() failure");
Packit Service 724aca
			assert_false(ckh_remove(tsd, &ckh, p[j], &q, &r),
Packit Service 724aca
			    "Unexpected ckh_remove() failure");
Packit Service 724aca
			assert_ptr_eq(p[j], q, "Key pointer mismatch");
Packit Service 724aca
			assert_ptr_eq(p[j], r, "Value pointer mismatch");
Packit Service 724aca
			assert_true(ckh_search(&ckh, p[j], NULL, NULL),
Packit Service 724aca
			    "Unexpected ckh_search() success");
Packit Service 724aca
			assert_true(ckh_remove(tsd, &ckh, p[j], &q, &r),
Packit Service 724aca
			    "Unexpected ckh_remove() success");
Packit Service 724aca
		}
Packit Service 724aca
Packit Service 724aca
		{
Packit Service 724aca
			bool seen[NITEMS];
Packit Service 724aca
			size_t tabind;
Packit Service 724aca
Packit Service 724aca
			memset(seen, 0, sizeof(seen));
Packit Service 724aca
Packit Service 724aca
			for (tabind = 0; !ckh_iter(&ckh, &tabind, &q, &r);) {
Packit Service 724aca
				size_t k;
Packit Service 724aca
Packit Service 724aca
				assert_ptr_eq(q, r, "Key and val not equal");
Packit Service 724aca
Packit Service 724aca
				for (k = 0; k < NITEMS; k++) {
Packit Service 724aca
					if (p[k] == q) {
Packit Service 724aca
						assert_false(seen[k],
Packit Service 724aca
						    "Item %zu already seen", k);
Packit Service 724aca
						seen[k] = true;
Packit Service 724aca
						break;
Packit Service 724aca
					}
Packit Service 724aca
				}
Packit Service 724aca
			}
Packit Service 724aca
Packit Service 724aca
			for (j = 0; j < i + 1; j++) {
Packit Service 724aca
				assert_true(seen[j], "Item %zu not seen", j);
Packit Service 724aca
			}
Packit Service 724aca
			for (; j < NITEMS; j++) {
Packit Service 724aca
				assert_false(seen[j], "Item %zu seen", j);
Packit Service 724aca
			}
Packit Service 724aca
		}
Packit Service 724aca
	}
Packit Service 724aca
Packit Service 724aca
	for (i = 0; i < NITEMS; i++) {
Packit Service 724aca
		assert_false(ckh_search(&ckh, p[i], NULL, NULL),
Packit Service 724aca
		    "Unexpected ckh_search() failure");
Packit Service 724aca
		assert_false(ckh_remove(tsd, &ckh, p[i], &q, &r),
Packit Service 724aca
		    "Unexpected ckh_remove() failure");
Packit Service 724aca
		assert_ptr_eq(p[i], q, "Key pointer mismatch");
Packit Service 724aca
		assert_ptr_eq(p[i], r, "Value pointer mismatch");
Packit Service 724aca
		assert_true(ckh_search(&ckh, p[i], NULL, NULL),
Packit Service 724aca
		    "Unexpected ckh_search() success");
Packit Service 724aca
		assert_true(ckh_remove(tsd, &ckh, p[i], &q, &r),
Packit Service 724aca
		    "Unexpected ckh_remove() success");
Packit Service 724aca
		dallocx(p[i], 0);
Packit Service 724aca
	}
Packit Service 724aca
Packit Service 724aca
	assert_zu_eq(ckh_count(&ckh), 0,
Packit Service 724aca
	    "ckh_count() should return %zu, but it returned %zu",
Packit Service 724aca
	    ZU(0), ckh_count(&ckh));
Packit Service 724aca
	ckh_delete(tsd, &ckh);
Packit Service 724aca
#undef NITEMS
Packit Service 724aca
}
Packit Service 724aca
TEST_END
Packit Service 724aca
Packit Service 724aca
int
Packit Service 724aca
main(void) {
Packit Service 724aca
	return test(
Packit Service 724aca
	    test_new_delete,
Packit Service 724aca
	    test_count_insert_search_remove,
Packit Service 724aca
	    test_insert_iter_remove);
Packit Service 724aca
}