Skip to content

Commit

Permalink
Port helper/test-sha256.c and helper/test-sha1.c to unit-tests/t-hash.c
Browse files Browse the repository at this point in the history
In the recent codebase update (8bf6fbd (Merge branch
'js/doc-unit-tests', 2023-12-09)), a new unit testing framework was
merged, providing a standardized approach for testing C code. Prior to
this update, some unit tests relied on the test helper mechanism,
lacking a dedicated unit testing framework. It's more natural to perform
these unit tests using the new unit test framework.

This commit migrates the unit tests for hash functionality from the
legacy approach using the test-tool command `test-tool sha1`and
`test-tool sha256` in helper/test-sha256.c and helper/test-sha1.c to the
new unit testing framework (t/unit-tests/test-lib.h).

The migration involves refactoring the tests to utilize the testing
macros provided by the framework (TEST() and check_*()).

Mentored-by: Christian Couder <[email protected]>
Signed-off-by: Achu Luma <[email protected]>
  • Loading branch information
achluma committed Feb 21, 2024
1 parent 10f4942 commit 28a2a8b
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -1346,6 +1346,7 @@ UNIT_TEST_PROGRAMS += t-mem-pool
UNIT_TEST_PROGRAMS += t-strbuf
UNIT_TEST_PROGRAMS += t-ctype
UNIT_TEST_PROGRAMS += t-prio-queue
UNIT_TEST_PROGRAMS += t-hash
UNIT_TEST_PROGS = $(patsubst %,$(UNIT_TEST_BIN)/%$X,$(UNIT_TEST_PROGRAMS))
UNIT_TEST_OBJS = $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TEST_PROGRAMS))
UNIT_TEST_OBJS += $(UNIT_TEST_DIR)/test-lib.o
Expand Down
75 changes: 75 additions & 0 deletions t/unit-tests/t-hash.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include "test-lib.h"
#include "hash-ll.h"
#include "hex.h"
#include "strbuf.h"

static void check_hash_data(const void *data, size_t data_length, const char *expected, int algo) {
git_hash_ctx ctx;
unsigned char hash[GIT_MAX_HEXSZ];
const struct git_hash_algo *algop = &hash_algos[algo];

if (!check(!!data)) {
test_msg("Error: No data provided");

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 21, 2024

Maybe:

		test_msg("Error: No data provided when expecting: %s", expected);

This comment has been minimized.

Copy link
@achluma

achluma Feb 22, 2024

Author Owner

ACK

return;
}

algop->init_fn(&ctx);
algop->update_fn(&ctx, data, data_length);
algop->final_fn(hash, &ctx);

check_str(hash_to_hex_algop(hash, algop), expected);
}

/* Works with a NUL terminated string. Doesn't work if it should contain a NUL character. */
#define TEST_SHA1_STR(data, expected_output) \

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 21, 2024

const char *expected is an argument to check_hash_data(), so we can also use expected instead of expected_output in TEST_SHA1_STR().

This comment has been minimized.

Copy link
@achluma

achluma Feb 22, 2024

Author Owner

ACK

TEST(check_hash_data(data, strlen(data), expected_output, GIT_HASH_SHA1), \
"SHA1 (%s) works", #data)

/* Only works with a literal string, useful when it contains a NUL character. */
#define TEST_SHA1_DATA(data, expected_output) \

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 21, 2024

I think TEST_SHA1_LITERAL(literal, expected) would be a bit better as it works only with literal strings, not any kind of data.

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 21, 2024

Also const char *expected is an argument to check_hash_data(), so we can also use expected instead of expected_output in TEST_SHA1_LITERAL().

This comment has been minimized.

Copy link
@achluma

achluma Feb 22, 2024

Author Owner

ACK

TEST(check_hash_data(data, (sizeof(data) - 1), expected_output, GIT_HASH_SHA1), \
"SHA1 (%s) works", #data)

/* Works with a NUL terminated string. Doesn't work if it should contain a NUL character. */
#define TEST_SHA256_STR(data, expected_output) \

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 21, 2024

const char *expected is an argument to check_hash_data(), so we can also use expected instead of expected_output in TEST_SHA256_STR().

This comment has been minimized.

Copy link
@achluma

achluma Feb 22, 2024

Author Owner

ACK

TEST(check_hash_data(data, strlen(data), expected_output, GIT_HASH_SHA256), \
"SHA256 (%s) works", #data)

/* Only works with a literal string, useful when it contains a NUL character. */
#define TEST_SHA256_DATA(data, expected_output) \

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 21, 2024

Here also I think TEST_SHA256_LITERAL(literal, expected) would be a bit better.

This comment has been minimized.

Copy link
@achluma

achluma Feb 22, 2024

Author Owner

ACK

TEST(check_hash_data(data, (sizeof(data) - 1), expected_output, GIT_HASH_SHA256), \
"SHA256 (%s) works", #data)

int cmd_main(int argc, const char **argv) {
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_SHA1_STR("", "da39a3ee5e6b4b0d3255bfef95601890afd80709");
TEST_SHA1_STR("a", "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8");
TEST_SHA1_STR("abc", "a9993e364706816aba3e25717850c26c9cd0d89d");
TEST_SHA1_STR("message digest", "c12252ceda8be8994d5fa0290a47231c1d16aae3");
TEST_SHA1_STR("abcdefghijklmnopqrstuvwxyz", "32d10c7b8cf96570ca04ce37f2a19d84240d3a89");
TEST_SHA1_STR(aaaaaaaaaa_100000.buf, "34aa973cd4c4daa4f61eeb2bdbad27316534016f");
TEST_SHA1_DATA("blob 0\0", "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391");
TEST_SHA1_DATA("blob 3\0abc", "f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f");
TEST_SHA1_DATA("tree 0\0", "4b825dc642cb6eb9a060e54bf8d69288fbee4904");

TEST_SHA256_STR("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
TEST_SHA256_STR("a", "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb");
TEST_SHA256_STR("abc", "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
TEST_SHA256_STR("message digest", "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650");
TEST_SHA256_STR("abcdefghijklmnopqrstuvwxyz", "71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73");
TEST_SHA256_STR(aaaaaaaaaa_100000.buf, "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
TEST_SHA256_STR(alphabet_100000.buf, "e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35");
TEST_SHA256_DATA("blob 0\0", "473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813");
TEST_SHA256_DATA("blob 3\0abc", "c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6");
TEST_SHA256_DATA("tree 0\0", "6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321");

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

return test_done();
}

0 comments on commit 28a2a8b

Please sign in to comment.