Skip to content

Commit

Permalink
t: port helper/test-oid-array.c to unit-tests/t-oid-array.c
Browse files Browse the repository at this point in the history
helper/test-oid-array.c along with t0064-oid-array.sh test the
oid-array.h API, which provides storage and processing
efficiency over large lists of object identifiers.

Migrate them to the unit testing framework for better runtime
performance and efficiency. As we don't initialize a repository
in these tests, the hash algo that functions like oid_array_lookup()
use is not initialized, therefore call repo_set_hash_algo() to
initialize it. And init_hash_algo():lib-oid.c can aid in this
process, so make it public.

Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
Helped-by: Phillip Wood <phillip.wood123@gmail.com>
Signed-off-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
spectre10 authored and gitster committed Sep 2, 2024
1 parent 6a09c36 commit a680635
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 175 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -808,7 +808,6 @@ TEST_BUILTINS_OBJS += test-lazy-init-name-hash.o
TEST_BUILTINS_OBJS += test-match-trees.o
TEST_BUILTINS_OBJS += test-mergesort.o
TEST_BUILTINS_OBJS += test-mktemp.o
TEST_BUILTINS_OBJS += test-oid-array.o
TEST_BUILTINS_OBJS += test-online-cpus.o
TEST_BUILTINS_OBJS += test-pack-mtimes.o
TEST_BUILTINS_OBJS += test-parse-options.o
Expand Down Expand Up @@ -1337,6 +1336,7 @@ 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
UNIT_TEST_PROGRAMS += t-oidmap
UNIT_TEST_PROGRAMS += t-oidtree
UNIT_TEST_PROGRAMS += t-prio-queue
Expand Down
49 changes: 0 additions & 49 deletions t/helper/test-oid-array.c

This file was deleted.

1 change: 0 additions & 1 deletion t/helper/test-tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ static struct test_cmd cmds[] = {
{ "match-trees", cmd__match_trees },
{ "mergesort", cmd__mergesort },
{ "mktemp", cmd__mktemp },
{ "oid-array", cmd__oid_array },
{ "online-cpus", cmd__online_cpus },
{ "pack-mtimes", cmd__pack_mtimes },
{ "parse-options", cmd__parse_options },
Expand Down
1 change: 0 additions & 1 deletion t/helper/test-tool.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ int cmd__scrap_cache_tree(int argc, const char **argv);
int cmd__serve_v2(int argc, const char **argv);
int cmd__sha1(int argc, const char **argv);
int cmd__sha1_is_sha1dc(int argc, const char **argv);
int cmd__oid_array(int argc, const char **argv);
int cmd__sha256(int argc, const char **argv);
int cmd__sigchain(int argc, const char **argv);
int cmd__simple_ipc(int argc, const char **argv);
Expand Down
122 changes: 0 additions & 122 deletions t/t0064-oid-array.sh

This file was deleted.

2 changes: 1 addition & 1 deletion t/unit-tests/lib-oid.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "strbuf.h"
#include "hex.h"

static int init_hash_algo(void)
int init_hash_algo(void)
{
static int algo = -1;

Expand Down
8 changes: 8 additions & 0 deletions t/unit-tests/lib-oid.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,13 @@
* environment variable.
*/
int get_oid_arbitrary_hex(const char *s, struct object_id *oid);
/*
* Returns one of GIT_HASH_{SHA1, SHA256, UNKNOWN} based on the value of
* GIT_TEST_DEFAULT_HASH environment variable. The fallback value in the
* absence of GIT_TEST_DEFAULT_HASH is GIT_HASH_SHA1. It also uses
* check(algo != GIT_HASH_UNKNOWN) before returning to verify if the
* GIT_TEST_DEFAULT_HASH's value is valid or not.
*/
int init_hash_algo(void);

#endif /* LIB_OID_H */
126 changes: 126 additions & 0 deletions t/unit-tests/t-oid-array.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
#define USE_THE_REPOSITORY_VARIABLE

#include "test-lib.h"
#include "lib-oid.h"
#include "oid-array.h"
#include "hex.h"

static int fill_array(struct oid_array *array, const char *hexes[], size_t n)
{
for (size_t i = 0; i < n; i++) {
struct object_id oid;

if (!check_int(get_oid_arbitrary_hex(hexes[i], &oid), ==, 0))
return -1;
oid_array_append(array, &oid);
}
if (!check_uint(array->nr, ==, n))
return -1;
return 0;
}

static int add_to_oid_array(const struct object_id *oid, void *data)
{
struct oid_array *array = data;

oid_array_append(array, oid);
return 0;
}

static void t_enumeration(const char **input_args, size_t input_sz,
const char **expect_args, size_t expect_sz)
{
struct oid_array input = OID_ARRAY_INIT, expect = OID_ARRAY_INIT,
actual = OID_ARRAY_INIT;
size_t i;

if (fill_array(&input, input_args, input_sz))
return;
if (fill_array(&expect, expect_args, expect_sz))
return;

oid_array_for_each_unique(&input, add_to_oid_array, &actual);
if (!check_uint(actual.nr, ==, expect.nr))
return;

for (i = 0; i < actual.nr; i++) {
if (!check(oideq(&actual.oid[i], &expect.oid[i])))
test_msg("expected: %s\n got: %s\n index: %" PRIuMAX,
oid_to_hex(&expect.oid[i]), oid_to_hex(&actual.oid[i]),
(uintmax_t)i);
}

oid_array_clear(&actual);
oid_array_clear(&input);
oid_array_clear(&expect);
}

#define TEST_ENUMERATION(input, expect, desc) \
TEST(t_enumeration(input, ARRAY_SIZE(input), expect, ARRAY_SIZE(expect)), \
desc " works")

static void t_lookup(const char **input_hexes, size_t n, const char *query_hex,
int lower_bound, int upper_bound)
{
struct oid_array array = OID_ARRAY_INIT;
struct object_id oid_query;
int ret;

if (!check_int(get_oid_arbitrary_hex(query_hex, &oid_query), ==, 0))
return;
if (fill_array(&array, input_hexes, n))
return;
ret = oid_array_lookup(&array, &oid_query);

if (!check_int(ret, <=, upper_bound) ||
!check_int(ret, >=, lower_bound))
test_msg("oid query for lookup: %s", oid_to_hex(&oid_query));

oid_array_clear(&array);
}

#define TEST_LOOKUP(input_hexes, query, lower_bound, upper_bound, desc) \
TEST(t_lookup(input_hexes, ARRAY_SIZE(input_hexes), query, \
lower_bound, upper_bound), \
desc " works")

static void setup(void)
{
/* The hash algo is used by oid_array_lookup() internally */
int algo = init_hash_algo();
if (check_int(algo, !=, GIT_HASH_UNKNOWN))
repo_set_hash_algo(the_repository, algo);
}

int cmd_main(int argc UNUSED, const char **argv UNUSED)
{
const char *arr_input[] = { "88", "44", "aa", "55" };
const char *arr_input_dup[] = { "88", "44", "aa", "55",
"88", "44", "aa", "55",
"88", "44", "aa", "55" };
const char *res_sorted[] = { "44", "55", "88", "aa" };
const char *nearly_55;

if (!TEST(setup(), "setup"))
test_skip_all("hash algo initialization failed");

TEST_ENUMERATION(arr_input, res_sorted, "ordered enumeration");
TEST_ENUMERATION(arr_input_dup, res_sorted,
"ordered enumeration with duplicate suppression");

TEST_LOOKUP(arr_input, "55", 1, 1, "lookup");
TEST_LOOKUP(arr_input, "33", INT_MIN, -1, "lookup non-existent entry");
TEST_LOOKUP(arr_input_dup, "55", 3, 5, "lookup with duplicates");
TEST_LOOKUP(arr_input_dup, "66", INT_MIN, -1,
"lookup non-existent entry with duplicates");

nearly_55 = init_hash_algo() == GIT_HASH_SHA1 ?
"5500000000000000000000000000000000000001" :
"5500000000000000000000000000000000000000000000000000000000000001";
TEST_LOOKUP(((const char *[]){ "55", nearly_55 }), "55", 0, 0,
"lookup with almost duplicate values");
TEST_LOOKUP(((const char *[]){ "55", "55" }), "55", 0, 1,
"lookup with single duplicate value");

return test_done();
}

0 comments on commit a680635

Please sign in to comment.