Skip to content

Commit 2794932

Browse files
spectre10achluma
authored andcommitted
t/: migrate helper/test-{sha1, sha256} to unit-tests/t-hash
t/helper/test-{sha1, sha256} and t/t0015-hash.sh test the hash implementation of SHA-1 and SHA-256 in Git with basic hash values. Migrate them to the new unit testing framework for better debugging and runtime performance. The 'sha1' and 'sha256' subcommands are still not removed due to pack_trailer():lib-pack.sh's reliance on them. The 'sha1' subcommand is also relied upon by t0013-sha1dc (which requires 'test-tool sha1' dying when it is used on a file created to contain the known sha1 attack). Helped-by: Patrick Steinhardt <[email protected]> Mentored-by: Christian Couder <[email protected]> Mentored-by: Kaartic Sivaraam <[email protected]> Co-authored-by: Achu Luma <[email protected]> Signed-off-by: Achu Luma <[email protected]> Signed-off-by: Ghanshyam Thakkar <[email protected]> Acked-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent a70f8f1 commit 2794932

File tree

3 files changed

+85
-56
lines changed

3 files changed

+85
-56
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,7 @@ THIRD_PARTY_SOURCES += sha1collisiondetection/%
13481348
THIRD_PARTY_SOURCES += sha1dc/%
13491349

13501350
UNIT_TEST_PROGRAMS += t-basic
1351+
UNIT_TEST_PROGRAMS += t-hash
13511352
UNIT_TEST_PROGRAMS += t-mem-pool
13521353
UNIT_TEST_PROGRAMS += t-strbuf
13531354
UNIT_TEST_PROGRAMS += t-ctype

t/t0015-hash.sh

Lines changed: 0 additions & 56 deletions
This file was deleted.

t/unit-tests/t-hash.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include "test-lib.h"
2+
#include "hex.h"
3+
#include "strbuf.h"
4+
5+
static void check_hash_data(const void *data, size_t data_length,
6+
const char *expected_hashes[])
7+
{
8+
if (!check(data != NULL)) {
9+
test_msg("BUG: NULL data pointer provided");
10+
return;
11+
}
12+
13+
for (size_t i = 1; i < ARRAY_SIZE(hash_algos); i++) {
14+
git_hash_ctx ctx;
15+
unsigned char hash[GIT_MAX_HEXSZ];
16+
const struct git_hash_algo *algop = &hash_algos[i];
17+
18+
algop->init_fn(&ctx);
19+
algop->update_fn(&ctx, data, data_length);
20+
algop->final_fn(hash, &ctx);
21+
22+
if (!check_str(hash_to_hex_algop(hash, algop), expected_hashes[i - 1]))
23+
test_msg("result does not match with the expected for %s\n", hash_algos[i].name);
24+
}
25+
}
26+
27+
/* Works with a NUL terminated string. Doesn't work if it should contain a NUL character. */
28+
#define TEST_HASH_STR(data, expected_sha1, expected_sha256) do { \
29+
const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \
30+
TEST(check_hash_data(data, strlen(data), expected_hashes), \
31+
"SHA1 and SHA256 (%s) works", #data); \
32+
} while (0)
33+
34+
/* Only works with a literal string, useful when it contains a NUL character. */
35+
#define TEST_HASH_LITERAL(literal, expected_sha1, expected_sha256) do { \
36+
const char *expected_hashes[] = { expected_sha1, expected_sha256 }; \
37+
TEST(check_hash_data(literal, (sizeof(literal) - 1), expected_hashes), \
38+
"SHA1 and SHA256 (%s) works", #literal); \
39+
} while (0)
40+
41+
int cmd_main(int argc, const char **argv)
42+
{
43+
struct strbuf aaaaaaaaaa_100000 = STRBUF_INIT;
44+
struct strbuf alphabet_100000 = STRBUF_INIT;
45+
46+
strbuf_addstrings(&aaaaaaaaaa_100000, "aaaaaaaaaa", 100000);
47+
strbuf_addstrings(&alphabet_100000, "abcdefghijklmnopqrstuvwxyz", 100000);
48+
49+
TEST_HASH_STR("",
50+
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
51+
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
52+
TEST_HASH_STR("a",
53+
"86f7e437faa5a7fce15d1ddcb9eaeaea377667b8",
54+
"ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb");
55+
TEST_HASH_STR("abc",
56+
"a9993e364706816aba3e25717850c26c9cd0d89d",
57+
"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad");
58+
TEST_HASH_STR("message digest",
59+
"c12252ceda8be8994d5fa0290a47231c1d16aae3",
60+
"f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650");
61+
TEST_HASH_STR("abcdefghijklmnopqrstuvwxyz",
62+
"32d10c7b8cf96570ca04ce37f2a19d84240d3a89",
63+
"71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73");
64+
TEST_HASH_STR(aaaaaaaaaa_100000.buf,
65+
"34aa973cd4c4daa4f61eeb2bdbad27316534016f",
66+
"cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0");
67+
TEST_HASH_STR(alphabet_100000.buf,
68+
"e7da7c55b3484fdf52aebec9cbe7b85a98f02fd4",
69+
"e406ba321ca712ad35a698bf0af8d61fc4dc40eca6bdcea4697962724ccbde35");
70+
TEST_HASH_LITERAL("blob 0\0",
71+
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
72+
"473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813");
73+
TEST_HASH_LITERAL("blob 3\0abc",
74+
"f2ba8f84ab5c1bce84a7b441cb1959cfc7093b7f",
75+
"c1cf6e465077930e88dc5136641d402f72a229ddd996f627d60e9639eaba35a6");
76+
TEST_HASH_LITERAL("tree 0\0",
77+
"4b825dc642cb6eb9a060e54bf8d69288fbee4904",
78+
"6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321");
79+
80+
strbuf_release(&aaaaaaaaaa_100000);
81+
strbuf_release(&alphabet_100000);
82+
83+
return test_done();
84+
}

0 commit comments

Comments
 (0)