tests/test_hash_key.c

Tue, 16 Jan 2024 23:12:43 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 16 Jan 2024 23:12:43 +0100
changeset 809
b7e2e1d7ed22
parent 768
0e1cf2cd500e
child 890
54565fd74e74
permissions
-rw-r--r--

fix assertion failure depending on possibly uninitialized memory

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "cx/test.h"

#include "cx/hash_key.h"
#include "cx/string.h"

CX_TEST(test_hash_key_functions) {
    char const* str = "my key";
    size_t len = strlen(str);

    CxHashKey str_key = cx_hash_key_str(str);
    CxHashKey bytes_key = cx_hash_key_bytes((unsigned char const*)str, len);
    CxHashKey obj_key = cx_hash_key(str, len);
    CxHashKey cxstr_key = cx_hash_key_cxstr(cx_str(str));

    CX_TEST_DO {
        CX_TEST_ASSERT(str_key.hash == bytes_key.hash);
        CX_TEST_ASSERT(obj_key.hash == bytes_key.hash);
        CX_TEST_ASSERT(cxstr_key.hash == bytes_key.hash);
        CX_TEST_ASSERT(str_key.len == len);
        CX_TEST_ASSERT(cxstr_key.len == len);
        CX_TEST_ASSERT(bytes_key.len == len);
        CX_TEST_ASSERT(bytes_key.len == len);
        CX_TEST_ASSERT(str_key.data == str);
    }
}

CX_TEST(test_hash_key_empty_string) {
    char const* str = "";

    CxHashKey str_key = cx_hash_key_str(str);
    CxHashKey bytes_key = cx_hash_key_bytes((unsigned char const*) str, 0);
    CxHashKey obj_key = cx_hash_key(str, 0);

    CX_TEST_DO {
        CX_TEST_ASSERT(bytes_key.hash == 4152238450u);
        CX_TEST_ASSERT(str_key.hash == 4152238450u);
        CX_TEST_ASSERT(obj_key.hash == 4152238450u);
        CX_TEST_ASSERT(str_key.len == 0);
        CX_TEST_ASSERT(bytes_key.len == 0);
        CX_TEST_ASSERT(bytes_key.len == 0);
        CX_TEST_ASSERT(str_key.data == str);
    }
}

CX_TEST(test_hash_key_null) {
    CxHashKey str_key = cx_hash_key_str(NULL);
    CxHashKey bytes_key = cx_hash_key_bytes(NULL, 0);
    CxHashKey obj_key = cx_hash_key(NULL, 0);

    CX_TEST_DO {
        CX_TEST_ASSERT(bytes_key.hash == 1574210520u);
        CX_TEST_ASSERT(str_key.hash == 1574210520u);
        CX_TEST_ASSERT(obj_key.hash == 1574210520u);
        CX_TEST_ASSERT(str_key.len == 0);
        CX_TEST_ASSERT(bytes_key.len == 0);
        CX_TEST_ASSERT(bytes_key.len == 0);
        CX_TEST_ASSERT(str_key.data == NULL);
    }
}

CxTestSuite *cx_test_suite_hash_key(void) {
    CxTestSuite *suite = cx_test_suite_new("hash_key");

    cx_test_register(suite, test_hash_key_functions);
    cx_test_register(suite, test_hash_key_empty_string);
    cx_test_register(suite, test_hash_key_null);

    return suite;
}

mercurial