Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | // 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); |