123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * (C) Copyright 2019
- * Roman Kapl, SYSGO, rka@sysgo.com
- */
- #include <common.h>
- #include <command.h>
- #include <log.h>
- #include <search.h>
- #include <stdio.h>
- #include <test/env.h>
- #include <test/ut.h>
- #define SIZE 32
- #define ITERATIONS 10000
- static int htab_fill(struct unit_test_state *uts,
- struct hsearch_data *htab, size_t size)
- {
- size_t i;
- struct env_entry item;
- struct env_entry *ritem;
- char key[20];
- for (i = 0; i < size; i++) {
- sprintf(key, "%d", (int)i);
- item.callback = NULL;
- item.data = key;
- item.flags = 0;
- item.key = key;
- ut_asserteq(1, hsearch_r(item, ENV_ENTER, &ritem, htab, 0));
- }
- return 0;
- }
- static int htab_check_fill(struct unit_test_state *uts,
- struct hsearch_data *htab, size_t size)
- {
- size_t i;
- struct env_entry item;
- struct env_entry *ritem;
- char key[20];
- for (i = 0; i < size; i++) {
- sprintf(key, "%d", (int)i);
- item.callback = NULL;
- item.flags = 0;
- item.data = key;
- item.key = key;
- hsearch_r(item, ENV_FIND, &ritem, htab, 0);
- ut_assert(ritem);
- ut_asserteq_str(key, ritem->key);
- ut_asserteq_str(key, ritem->data);
- }
- return 0;
- }
- static int htab_create_delete(struct unit_test_state *uts,
- struct hsearch_data *htab, size_t iterations)
- {
- size_t i;
- struct env_entry item;
- struct env_entry *ritem;
- char key[20];
- for (i = 0; i < iterations; i++) {
- sprintf(key, "cd-%d", (int)i);
- item.callback = NULL;
- item.flags = 0;
- item.data = key;
- item.key = key;
- hsearch_r(item, ENV_ENTER, &ritem, htab, 0);
- ritem = NULL;
- hsearch_r(item, ENV_FIND, &ritem, htab, 0);
- ut_assert(ritem);
- ut_asserteq_str(key, ritem->key);
- ut_asserteq_str(key, ritem->data);
- ut_asserteq(0, hdelete_r(key, htab, 0));
- }
- return 0;
- }
- /* Completely fill up the hash table */
- static int env_test_htab_fill(struct unit_test_state *uts)
- {
- struct hsearch_data htab;
- memset(&htab, 0, sizeof(htab));
- ut_asserteq(1, hcreate_r(SIZE, &htab));
- ut_assertok(htab_fill(uts, &htab, SIZE));
- ut_assertok(htab_check_fill(uts, &htab, SIZE));
- ut_asserteq(SIZE, htab.filled);
- hdestroy_r(&htab);
- return 0;
- }
- ENV_TEST(env_test_htab_fill, 0);
- /* Fill the hashtable up halfway an repeateadly delete/create elements
- * and check for corruption
- */
- static int env_test_htab_deletes(struct unit_test_state *uts)
- {
- struct hsearch_data htab;
- memset(&htab, 0, sizeof(htab));
- ut_asserteq(1, hcreate_r(SIZE, &htab));
- ut_assertok(htab_fill(uts, &htab, SIZE / 2));
- ut_assertok(htab_create_delete(uts, &htab, ITERATIONS));
- ut_assertok(htab_check_fill(uts, &htab, SIZE / 2));
- ut_asserteq(SIZE / 2, htab.filled);
- hdestroy_r(&htab);
- return 0;
- }
- ENV_TEST(env_test_htab_deletes, 0);
|