1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov#include <assert.h>
350aadb33SDmitri Tikhonov#include <stdint.h>
450aadb33SDmitri Tikhonov#include <stdio.h>
550aadb33SDmitri Tikhonov#include <stdlib.h>
650aadb33SDmitri Tikhonov#include <string.h>
750aadb33SDmitri Tikhonov#include <sys/queue.h>
8461e84d8SAmol Deshpande#ifndef WIN32
950aadb33SDmitri Tikhonov#include <unistd.h>
10461e84d8SAmol Deshpande#endif
1150aadb33SDmitri Tikhonov
1250aadb33SDmitri Tikhonov#include "lsquic_hash.h"
1350aadb33SDmitri Tikhonov
1450aadb33SDmitri Tikhonov
1550aadb33SDmitri Tikhonovstruct widget
1650aadb33SDmitri Tikhonov{
1750aadb33SDmitri Tikhonov    unsigned long   key;
185392f7a3SLiteSpeed Tech    struct lsquic_hash_elem hash_el;
1950aadb33SDmitri Tikhonov    char            data[30];
2050aadb33SDmitri Tikhonov};
2150aadb33SDmitri Tikhonov
2250aadb33SDmitri Tikhonov
2350aadb33SDmitri Tikhonovint
2450aadb33SDmitri Tikhonovmain (int argc, char **argv)
2550aadb33SDmitri Tikhonov{
2650aadb33SDmitri Tikhonov    struct lsquic_hash *hash;
2750aadb33SDmitri Tikhonov    struct lsquic_hash_elem *el;
2850aadb33SDmitri Tikhonov    unsigned n, nelems;
2950aadb33SDmitri Tikhonov    struct widget *widgets, *widget;
3050aadb33SDmitri Tikhonov
3150aadb33SDmitri Tikhonov    hash = lsquic_hash_create();
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonov    if (argc > 1)
3450aadb33SDmitri Tikhonov        nelems = atoi(argv[1]);
3550aadb33SDmitri Tikhonov    else
3650aadb33SDmitri Tikhonov        nelems = 1000000;
3750aadb33SDmitri Tikhonov
38fb3e20e0SDmitri Tikhonov    widgets = calloc(nelems, sizeof(widgets[0]));
3950aadb33SDmitri Tikhonov
4050aadb33SDmitri Tikhonov    for (n = 0; n < nelems; ++n)
4150aadb33SDmitri Tikhonov    {
4250aadb33SDmitri Tikhonov        widget = &widgets[n];
4350aadb33SDmitri Tikhonov        widget->key = n;    /* This will be used for verification later the test */
4450aadb33SDmitri Tikhonov        sprintf(widget->data, "%lu", widget->key);
4550aadb33SDmitri Tikhonov        el = lsquic_hash_find(hash, &widget->key, sizeof(widget->key));
4650aadb33SDmitri Tikhonov        assert(!el);
475392f7a3SLiteSpeed Tech        el = lsquic_hash_insert(hash, &widget->key, sizeof(widget->key), widget, &widget->hash_el);
4850aadb33SDmitri Tikhonov        assert(el);
4950aadb33SDmitri Tikhonov    }
5050aadb33SDmitri Tikhonov
5150aadb33SDmitri Tikhonov    assert(nelems == lsquic_hash_count(hash));
5250aadb33SDmitri Tikhonov
5350aadb33SDmitri Tikhonov    for (n = 0, el = lsquic_hash_first(hash); el; ++n, el = lsquic_hash_next(hash))
5450aadb33SDmitri Tikhonov    {
5550aadb33SDmitri Tikhonov        widget = lsquic_hashelem_getdata(el);
5650aadb33SDmitri Tikhonov        assert(widget >= widgets);
5750aadb33SDmitri Tikhonov        assert(widget < widgets + nelems);
5850aadb33SDmitri Tikhonov    }
5950aadb33SDmitri Tikhonov    assert(n == nelems);
6050aadb33SDmitri Tikhonov
6150aadb33SDmitri Tikhonov    for (n = 0; n < nelems; ++n)
6250aadb33SDmitri Tikhonov    {
6350aadb33SDmitri Tikhonov        unsigned long key = n;
6450aadb33SDmitri Tikhonov        el = lsquic_hash_find(hash, &key, sizeof(key));
6550aadb33SDmitri Tikhonov        assert(el);
6650aadb33SDmitri Tikhonov        widget = lsquic_hashelem_getdata(el);
6750aadb33SDmitri Tikhonov        assert(widget->key == key);
6850aadb33SDmitri Tikhonov        lsquic_hash_erase(hash, el);
6950aadb33SDmitri Tikhonov        el = lsquic_hash_find(hash, &key, sizeof(key));
7050aadb33SDmitri Tikhonov        assert(!el);
7150aadb33SDmitri Tikhonov    }
7250aadb33SDmitri Tikhonov
7350aadb33SDmitri Tikhonov    assert(0 == lsquic_hash_count(hash));
7450aadb33SDmitri Tikhonov
7550aadb33SDmitri Tikhonov    lsquic_hash_destroy(hash);
7650aadb33SDmitri Tikhonov    free(widgets);
7750aadb33SDmitri Tikhonov
7850aadb33SDmitri Tikhonov    exit(0);
7950aadb33SDmitri Tikhonov}
80