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_to_hex_algop 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 19, 2024
1 parent 3e0d3cd commit 9093db2
Show file tree
Hide file tree
Showing 2 changed files with 83 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
82 changes: 82 additions & 0 deletions t/unit-tests/t-hash.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#include "test-lib.h"
#include "hash-ll.h"
#include "hex.h"
#include "strbuf.h"

static void repeat(struct strbuf *buf, const char *pattern, size_t repetitions) {
for (size_t i = 0; i < repetitions; i++) {
strbuf_addstr(buf, pattern);
}

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 19, 2024

We don't need the { and } when there is only one instruction between those characters.

This comment has been minimized.

Copy link
@achluma

achluma Feb 19, 2024

Author Owner

ACK

}

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");
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);
}

static void check_hash_str(const void *data, const char *expected, int algo) {
check_hash_data(data, strlen(data), expected, algo);
}

#define TEST_SHA1_STR(data, expected_output) \
TEST(check_hash_str(data, expected_output, GIT_HASH_SHA1 ), \
"SHA1 (%s) works", #data)

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 19, 2024

Actually I don't think check_hash_str() is needed as you could use:

#define TEST_SHA1_STR(str, expected_output) \
    	TEST(check_hash_data(str, strlen(str), expected_output, GIT_HASH_SHA1 ), \
        	"SHA1 (%s) works", #str)

This comment has been minimized.

Copy link
@achluma

achluma Feb 19, 2024

Author Owner

ACK


#define TEST_SHA1_DATA(data, data_length, expected_output) \
TEST(check_hash_data(data, data_length, expected_output, GIT_HASH_SHA1 ), \
"SHA1 (%s) works", #data)

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 19, 2024

I think for literal strings like "blob 0\0" we can use sizeof() to get the size of the literal string, but we need to substract 1, so maybe we can use the following macro instead:

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

Let me know if this works.

This comment has been minimized.

Copy link
@achluma

achluma Feb 19, 2024

Author Owner

ACK. It works:)



#define TEST_SHA256_STR(data, expected_output) \
TEST(check_hash_str(data, expected_output, GIT_HASH_SHA256 ), \
"SHA256 (%s) works", #data)

#define TEST_SHA256_DATA(data, data_length, expected_output) \
TEST(check_hash_data(data, data_length, 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;

setenv("LANG", "C", 1);

repeat(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000);
repeat(&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", 7, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391");
TEST_SHA1_DATA("blob 3\0abc", 10, "f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f");
TEST_SHA1_DATA("tree 0\0", 7, "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", 7, "473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813");
TEST_SHA256_DATA("blob 3\0abc", 10, "c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6");
TEST_SHA256_DATA("tree 0\0", 7, "6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321");

This comment has been minimized.

Copy link
@chriscool

chriscool Feb 19, 2024

Here strbuf_release() should be used to release the memory used by aaaaaaaaaa_100000 and alphabet_100000.

This comment has been minimized.

Copy link
@achluma

achluma Feb 19, 2024

Author Owner

ACK

return test_done();
}

0 comments on commit 9093db2

Please sign in to comment.