123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- /* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #include "testutil.h"
- #include "fspr.h"
- #include "fspr_strings.h"
- #include "fspr_general.h"
- #include "fspr_pools.h"
- #include "fspr_hash.h"
- static void dump_hash(fspr_pool_t *p, fspr_hash_t *h, char *str)
- {
- fspr_hash_index_t *hi;
- char *val, *key;
- fspr_ssize_t len;
- int i = 0;
- str[0] = '\0';
- for (hi = fspr_hash_first(p, h); hi; hi = fspr_hash_next(hi)) {
- fspr_hash_this(hi,(void*) &key, &len, (void*) &val);
- fspr_snprintf(str, 8196, "%sKey %s (%" APR_SSIZE_T_FMT ") Value %s\n",
- str, key, len, val);
- i++;
- }
- fspr_snprintf(str, 8196, "%s#entries %d\n", str, i);
- }
- static void sum_hash(fspr_pool_t *p, fspr_hash_t *h, int *pcount, int *keySum, int *valSum)
- {
- fspr_hash_index_t *hi;
- void *val, *key;
- int count = 0;
- *keySum = 0;
- *valSum = 0;
- *pcount = 0;
- for (hi = fspr_hash_first(p, h); hi; hi = fspr_hash_next(hi)) {
- fspr_hash_this(hi, (void*)&key, NULL, &val);
- *valSum += *(int *)val;
- *keySum += *(int *)key;
- count++;
- }
- *pcount=count;
- }
- static void hash_make(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- }
- static void hash_set(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- char *result = NULL;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "key", APR_HASH_KEY_STRING, "value");
- result = fspr_hash_get(h, "key", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "value", result);
- }
- static void hash_reset(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- char *result = NULL;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "key", APR_HASH_KEY_STRING, "value");
- result = fspr_hash_get(h, "key", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "value", result);
- fspr_hash_set(h, "key", APR_HASH_KEY_STRING, "new");
- result = fspr_hash_get(h, "key", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "new", result);
- }
- static void same_value(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- char *result = NULL;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "same1", APR_HASH_KEY_STRING, "same");
- result = fspr_hash_get(h, "same1", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "same", result);
- fspr_hash_set(h, "same2", APR_HASH_KEY_STRING, "same");
- result = fspr_hash_get(h, "same2", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "same", result);
- }
- static unsigned int hash_custom( const char *key, fspr_ssize_t *klen)
- {
- unsigned int hash = 0;
- while( *klen ) {
- (*klen) --;
- hash = hash * 33 + key[ *klen ];
- }
- return hash;
- }
- static void same_value_custom(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- char *result = NULL;
- h = fspr_hash_make_custom(p, hash_custom);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "same1", 5, "same");
- result = fspr_hash_get(h, "same1", 5);
- ABTS_STR_EQUAL(tc, "same", result);
- fspr_hash_set(h, "same2", 5, "same");
- result = fspr_hash_get(h, "same2", 5);
- ABTS_STR_EQUAL(tc, "same", result);
- }
- static void key_space(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- char *result = NULL;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "key with space", APR_HASH_KEY_STRING, "value");
- result = fspr_hash_get(h, "key with space", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "value", result);
- }
- /* This is kind of a hack, but I am just keeping an existing test. This is
- * really testing fspr_hash_first, fspr_hash_next, and fspr_hash_this which
- * should be tested in three separate tests, but this will do for now.
- */
- static void hash_traverse(abts_case *tc, void *data)
- {
- fspr_hash_t *h;
- char str[8196];
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "OVERWRITE", APR_HASH_KEY_STRING, "should not see this");
- fspr_hash_set(h, "FOO3", APR_HASH_KEY_STRING, "bar3");
- fspr_hash_set(h, "FOO3", APR_HASH_KEY_STRING, "bar3");
- fspr_hash_set(h, "FOO1", APR_HASH_KEY_STRING, "bar1");
- fspr_hash_set(h, "FOO2", APR_HASH_KEY_STRING, "bar2");
- fspr_hash_set(h, "FOO4", APR_HASH_KEY_STRING, "bar4");
- fspr_hash_set(h, "SAME1", APR_HASH_KEY_STRING, "same");
- fspr_hash_set(h, "SAME2", APR_HASH_KEY_STRING, "same");
- fspr_hash_set(h, "OVERWRITE", APR_HASH_KEY_STRING, "Overwrite key");
- dump_hash(p, h, str);
- ABTS_STR_EQUAL(tc, "Key FOO1 (4) Value bar1\n"
- "Key FOO2 (4) Value bar2\n"
- "Key OVERWRITE (9) Value Overwrite key\n"
- "Key FOO3 (4) Value bar3\n"
- "Key SAME1 (5) Value same\n"
- "Key FOO4 (4) Value bar4\n"
- "Key SAME2 (5) Value same\n"
- "#entries 7\n", str);
- }
- /* This is kind of a hack, but I am just keeping an existing test. This is
- * really testing fspr_hash_first, fspr_hash_next, and fspr_hash_this which
- * should be tested in three separate tests, but this will do for now.
- */
- static void summation_test(abts_case *tc, void *data)
- {
- fspr_hash_t *h;
- int sumKeys, sumVal, trySumKey, trySumVal;
- int i, j, *val, *key;
- h =fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- sumKeys = 0;
- sumVal = 0;
- trySumKey = 0;
- trySumVal = 0;
- for (i = 0; i < 100; i++) {
- j = i * 10 + 1;
- sumKeys += j;
- sumVal += i;
- key = fspr_palloc(p, sizeof(int));
- *key = j;
- val = fspr_palloc(p, sizeof(int));
- *val = i;
- fspr_hash_set(h, key, sizeof(int), val);
- }
- sum_hash(p, h, &i, &trySumKey, &trySumVal);
- ABTS_INT_EQUAL(tc, 100, i);
- ABTS_INT_EQUAL(tc, sumVal, trySumVal);
- ABTS_INT_EQUAL(tc, sumKeys, trySumKey);
- }
- static void delete_key(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- char *result = NULL;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "key", APR_HASH_KEY_STRING, "value");
- fspr_hash_set(h, "key2", APR_HASH_KEY_STRING, "value2");
- result = fspr_hash_get(h, "key", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "value", result);
- result = fspr_hash_get(h, "key2", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "value2", result);
- fspr_hash_set(h, "key", APR_HASH_KEY_STRING, NULL);
- result = fspr_hash_get(h, "key", APR_HASH_KEY_STRING);
- ABTS_PTR_EQUAL(tc, NULL, result);
- result = fspr_hash_get(h, "key2", APR_HASH_KEY_STRING);
- ABTS_STR_EQUAL(tc, "value2", result);
- }
- static void hash_count_0(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- int count;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- count = fspr_hash_count(h);
- ABTS_INT_EQUAL(tc, 0, count);
- }
- static void hash_count_1(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- int count;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "key", APR_HASH_KEY_STRING, "value");
- count = fspr_hash_count(h);
- ABTS_INT_EQUAL(tc, 1, count);
- }
- static void hash_count_5(abts_case *tc, void *data)
- {
- fspr_hash_t *h = NULL;
- int count;
- h = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, h);
- fspr_hash_set(h, "key1", APR_HASH_KEY_STRING, "value1");
- fspr_hash_set(h, "key2", APR_HASH_KEY_STRING, "value2");
- fspr_hash_set(h, "key3", APR_HASH_KEY_STRING, "value3");
- fspr_hash_set(h, "key4", APR_HASH_KEY_STRING, "value4");
- fspr_hash_set(h, "key5", APR_HASH_KEY_STRING, "value5");
- count = fspr_hash_count(h);
- ABTS_INT_EQUAL(tc, 5, count);
- }
- static void overlay_empty(abts_case *tc, void *data)
- {
- fspr_hash_t *base = NULL;
- fspr_hash_t *overlay = NULL;
- fspr_hash_t *result = NULL;
- int count;
- char str[8196];
- base = fspr_hash_make(p);
- overlay = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, base);
- ABTS_PTR_NOTNULL(tc, overlay);
- fspr_hash_set(base, "key1", APR_HASH_KEY_STRING, "value1");
- fspr_hash_set(base, "key2", APR_HASH_KEY_STRING, "value2");
- fspr_hash_set(base, "key3", APR_HASH_KEY_STRING, "value3");
- fspr_hash_set(base, "key4", APR_HASH_KEY_STRING, "value4");
- fspr_hash_set(base, "key5", APR_HASH_KEY_STRING, "value5");
- result = fspr_hash_overlay(p, overlay, base);
- count = fspr_hash_count(result);
- ABTS_INT_EQUAL(tc, 5, count);
- dump_hash(p, result, str);
- ABTS_STR_EQUAL(tc, "Key key1 (4) Value value1\n"
- "Key key2 (4) Value value2\n"
- "Key key3 (4) Value value3\n"
- "Key key4 (4) Value value4\n"
- "Key key5 (4) Value value5\n"
- "#entries 5\n", str);
- }
- static void overlay_2unique(abts_case *tc, void *data)
- {
- fspr_hash_t *base = NULL;
- fspr_hash_t *overlay = NULL;
- fspr_hash_t *result = NULL;
- int count;
- char str[8196];
- base = fspr_hash_make(p);
- overlay = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, base);
- ABTS_PTR_NOTNULL(tc, overlay);
- fspr_hash_set(base, "base1", APR_HASH_KEY_STRING, "value1");
- fspr_hash_set(base, "base2", APR_HASH_KEY_STRING, "value2");
- fspr_hash_set(base, "base3", APR_HASH_KEY_STRING, "value3");
- fspr_hash_set(base, "base4", APR_HASH_KEY_STRING, "value4");
- fspr_hash_set(base, "base5", APR_HASH_KEY_STRING, "value5");
- fspr_hash_set(overlay, "overlay1", APR_HASH_KEY_STRING, "value1");
- fspr_hash_set(overlay, "overlay2", APR_HASH_KEY_STRING, "value2");
- fspr_hash_set(overlay, "overlay3", APR_HASH_KEY_STRING, "value3");
- fspr_hash_set(overlay, "overlay4", APR_HASH_KEY_STRING, "value4");
- fspr_hash_set(overlay, "overlay5", APR_HASH_KEY_STRING, "value5");
- result = fspr_hash_overlay(p, overlay, base);
- count = fspr_hash_count(result);
- ABTS_INT_EQUAL(tc, 10, count);
- dump_hash(p, result, str);
- /* I don't know why these are out of order, but they are. I would probably
- * consider this a bug, but others should comment.
- */
- ABTS_STR_EQUAL(tc, "Key base5 (5) Value value5\n"
- "Key overlay1 (8) Value value1\n"
- "Key overlay2 (8) Value value2\n"
- "Key overlay3 (8) Value value3\n"
- "Key overlay4 (8) Value value4\n"
- "Key overlay5 (8) Value value5\n"
- "Key base1 (5) Value value1\n"
- "Key base2 (5) Value value2\n"
- "Key base3 (5) Value value3\n"
- "Key base4 (5) Value value4\n"
- "#entries 10\n", str);
- }
- static void overlay_same(abts_case *tc, void *data)
- {
- fspr_hash_t *base = NULL;
- fspr_hash_t *result = NULL;
- int count;
- char str[8196];
- base = fspr_hash_make(p);
- ABTS_PTR_NOTNULL(tc, base);
- fspr_hash_set(base, "base1", APR_HASH_KEY_STRING, "value1");
- fspr_hash_set(base, "base2", APR_HASH_KEY_STRING, "value2");
- fspr_hash_set(base, "base3", APR_HASH_KEY_STRING, "value3");
- fspr_hash_set(base, "base4", APR_HASH_KEY_STRING, "value4");
- fspr_hash_set(base, "base5", APR_HASH_KEY_STRING, "value5");
- result = fspr_hash_overlay(p, base, base);
- count = fspr_hash_count(result);
- ABTS_INT_EQUAL(tc, 5, count);
- dump_hash(p, result, str);
- /* I don't know why these are out of order, but they are. I would probably
- * consider this a bug, but others should comment.
- */
- ABTS_STR_EQUAL(tc, "Key base5 (5) Value value5\n"
- "Key base1 (5) Value value1\n"
- "Key base2 (5) Value value2\n"
- "Key base3 (5) Value value3\n"
- "Key base4 (5) Value value4\n"
- "#entries 5\n", str);
- }
- abts_suite *testhash(abts_suite *suite)
- {
- suite = ADD_SUITE(suite)
- abts_run_test(suite, hash_make, NULL);
- abts_run_test(suite, hash_set, NULL);
- abts_run_test(suite, hash_reset, NULL);
- abts_run_test(suite, same_value, NULL);
- abts_run_test(suite, same_value_custom, NULL);
- abts_run_test(suite, key_space, NULL);
- abts_run_test(suite, delete_key, NULL);
- abts_run_test(suite, hash_count_0, NULL);
- abts_run_test(suite, hash_count_1, NULL);
- abts_run_test(suite, hash_count_5, NULL);
- abts_run_test(suite, hash_traverse, NULL);
- abts_run_test(suite, summation_test, NULL);
- abts_run_test(suite, overlay_empty, NULL);
- abts_run_test(suite, overlay_2unique, NULL);
- abts_run_test(suite, overlay_same, NULL);
- return suite;
- }
|