Skip to content

Commit

Permalink
t/unit-tests: convert hash to use clar test framework
Browse files Browse the repository at this point in the history
Adapt the hash test functions to clar framework by using clar
assertions where necessary. Following the consensus to convert
the unit-tests scripts found in the t/unit-tests folder to clar driven by
Patrick Steinhardt. Test functions are structured as a standalone to
test individual hash string and literal case.

Mentored-by: Patrick Steinhardt <[email protected]>
Signed-off-by: Seyi Kuforiji <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
Seyi007 authored and gitster committed Jan 8, 2025
1 parent 1465006 commit 136297e
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 27 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1338,14 +1338,14 @@ THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/%
THIRD_PARTY_SOURCES += $(UNIT_TEST_DIR)/clar/clar/%

CLAR_TEST_SUITES += u-ctype
CLAR_TEST_SUITES += u-hash
CLAR_TEST_SUITES += u-strvec
CLAR_TEST_PROG = $(UNIT_TEST_BIN)/unit-tests$(X)
CLAR_TEST_OBJS = $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(CLAR_TEST_SUITES))
CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/clar/clar.o
CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/unit-test.o

UNIT_TEST_PROGRAMS += t-example-decorate
UNIT_TEST_PROGRAMS += t-hash
UNIT_TEST_PROGRAMS += t-hashmap
UNIT_TEST_PROGRAMS += t-mem-pool
UNIT_TEST_PROGRAMS += t-oid-array
Expand Down
2 changes: 1 addition & 1 deletion t/meson.build
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
clar_test_suites = [
'unit-tests/u-ctype.c',
'unit-tests/u-strvec.c',
'unit-tests/u-hash.c',
]

clar_sources = [
Expand Down Expand Up @@ -41,7 +42,6 @@ test('unit-tests', clar_unit_tests)

unit_test_programs = [
'unit-tests/t-example-decorate.c',
'unit-tests/t-hash.c',
'unit-tests/t-hashmap.c',
'unit-tests/t-mem-pool.c',
'unit-tests/t-oid-array.c',
Expand Down
75 changes: 50 additions & 25 deletions t/unit-tests/t-hash.c → t/unit-tests/u-hash.c
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
#include "test-lib.h"
#include "unit-test.h"
#include "hex.h"
#include "strbuf.h"

static void check_hash_data(const void *data, size_t data_length,
const char *expected_hashes[])
{
if (!check(data != NULL)) {
test_msg("BUG: NULL data pointer provided");
return;
}
cl_assert(data != NULL);

for (size_t i = 1; i < ARRAY_SIZE(hash_algos); i++) {
git_hash_ctx ctx;
Expand All @@ -19,66 +16,94 @@ static void check_hash_data(const void *data, size_t data_length,
algop->update_fn(&ctx, data, data_length);
algop->final_fn(hash, &ctx);

if (!check_str(hash_to_hex_algop(hash, algop), expected_hashes[i - 1]))
test_msg("result does not match with the expected for %s\n", hash_algos[i].name);
cl_assert_equal_s(hash_to_hex_algop(hash,algop), expected_hashes[i - 1]);
}
}

/* Works with a NUL terminated string. Doesn't work if it should contain a NUL character. */
#define TEST_HASH_STR(data, expected_sha1, expected_sha256) do { \
const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \
TEST(check_hash_data(data, strlen(data), expected_hashes), \
"SHA1 and SHA256 (%s) works", #data); \
} while (0)
check_hash_data(data, strlen(data), expected_hashes); \
} while(0)

/* Only works with a literal string, useful when it contains a NUL character. */
#define TEST_HASH_LITERAL(literal, expected_sha1, expected_sha256) do { \
const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \
TEST(check_hash_data(literal, (sizeof(literal) - 1), expected_hashes), \
"SHA1 and SHA256 (%s) works", #literal); \
} while (0)
check_hash_data(literal, (sizeof(literal) - 1), expected_hashes); \
} while(0)

int cmd_main(int argc UNUSED, const char **argv UNUSED)
void test_hash__empty_string(void)
{
struct strbuf aaaaaaaaaa_100000 = STRBUF_INIT;
struct strbuf alphabet_100000 = STRBUF_INIT;

strbuf_addstrings(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000);
strbuf_addstrings(&alphabet_100000, "abcdefghijklmnopqrstuvwxyz", 100000);

TEST_HASH_STR("",
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
}

void test_hash__single_character(void)
{
TEST_HASH_STR("a",
"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8",
"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb");
}

void test_hash__multi_character(void)
{
TEST_HASH_STR("abc",
"a9993e364706816aba3e25717850c26c9cd0d89d",
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
}

void test_hash__message_digest(void)
{
TEST_HASH_STR("message digest",
"c12252ceda8be8994d5fa0290a47231c1d16aae3",
"f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650");
}

void test_hash__alphabet(void)
{
TEST_HASH_STR("abcdefghijklmnopqrstuvwxyz",
"32d10c7b8cf96570ca04ce37f2a19d84240d3a89",
"71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73");
}

void test_hash__aaaaaaaaaa_100000(void)
{
struct strbuf aaaaaaaaaa_100000 = STRBUF_INIT;
strbuf_addstrings(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000);
TEST_HASH_STR(aaaaaaaaaa_100000.buf,
"34aa973cd4c4daa4f61eeb2bdbad27316534016f",
"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
strbuf_release(&aaaaaaaaaa_100000);
}

void test_hash__alphabet_100000(void)
{
struct strbuf alphabet_100000 = STRBUF_INIT;
strbuf_addstrings(&alphabet_100000, "abcdefghijklmnopqrstuvwxyz", 100000);
TEST_HASH_STR(alphabet_100000.buf,
"e7da7c55b3484fdf52aebec9cbe7b85a98f02fd4",
"e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35");
strbuf_release(&alphabet_100000);
}

void test_hash__zero_blob_literal(void)
{
TEST_HASH_LITERAL("blob 0\0",
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
"473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813");
}

void test_hash__three_blob_literal(void)
{
TEST_HASH_LITERAL("blob 3\0abc",
"f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f",
"c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6");
}

void test_hash__zero_tree_literal(void)
{
TEST_HASH_LITERAL("tree 0\0",
"4b825dc642cb6eb9a060e54bf8d69288fbee4904",
"6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321");

strbuf_release(&aaaaaaaaaa_100000);
strbuf_release(&alphabet_100000);

return test_done();
}

0 comments on commit 136297e

Please sign in to comment.