t/unit-tests: convert oidtree test to use clar test framework
Adapt oidtree test script to clar framework by using clar assertions where necessary. `cl_parse_any_oid()` ensures the hash algorithm is set before parsing. This prevents issues from an uninitialized or invalid hash algorithm. Introduce 'test_oidtree__initialize` handles the to set up of the global oidtree variable and `test_oidtree__cleanup` frees the oidtree when all tests are completed. With this change, `check_each` stops at the first error encountered, making it easier to address it. Mentored-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Seyi Kuforiji <kuforiji98@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Seyi Kuforiji committed
Feb 25, 2025 at 11:10 UTC
149585079facfbdb5713bb8852caea2068cd4f28
4 files changed
+109
-124
Makefile
+1
-1
@@ -1358,6 +1358,7 @@ CLAR_TEST_SUITES += u-hashmap
1358
CLAR_TEST_SUITES += u-mem-pool
1359
CLAR_TEST_SUITES += u-oid-array
1360
CLAR_TEST_SUITES += u-oidmap
1361
+CLAR_TEST_SUITES += u-oidtree
1362
CLAR_TEST_SUITES += u-prio-queue
1363
CLAR_TEST_SUITES += u-reftable-tree
1364
CLAR_TEST_SUITES += u-strbuf
@@ -1369,7 +1370,6 @@ CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/clar/clar.o
1370
CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/unit-test.o
1371
CLAR_TEST_OBJS += $(UNIT_TEST_DIR)/lib-oid.o
1372
1372
-UNIT_TEST_PROGRAMS += t-oidtree
1373
UNIT_TEST_PROGRAMS += t-reftable-basics
1374
UNIT_TEST_PROGRAMS += t-reftable-block
1375
UNIT_TEST_PROGRAMS += t-reftable-merged
t/meson.build
+1
-1
@@ -6,6 +6,7 @@ clar_test_suites = [
6
'unit-tests/u-mem-pool.c',
7
'unit-tests/u-oid-array.c',
8
'unit-tests/u-oidmap.c',
9
+ 'unit-tests/u-oidtree.c',
10
'unit-tests/u-prio-queue.c',
11
'unit-tests/u-reftable-tree.c',
12
'unit-tests/u-strbuf.c',
@@ -51,7 +52,6 @@ clar_unit_tests = executable('unit-tests',
52
test('unit-tests', clar_unit_tests)
53
54
unit_test_programs = [
54
- 'unit-tests/t-oidtree.c',
55
'unit-tests/t-reftable-basics.c',
56
'unit-tests/t-reftable-block.c',
57
'unit-tests/t-reftable-merged.c',
t/unit-tests/t-oidtree.c
deleted
-122
@@ -1,122 +0,0 @@
1
-#include "test-lib.h"
2
-#include "lib-oid.h"
3
-#include "oidtree.h"
4
-#include "hash.h"
5
-#include "hex.h"
6
-#include "strvec.h"
7
-
8
-#define FILL_TREE(tree, ...) \
9
- do { \
10
- const char *hexes[] = { __VA_ARGS__ }; \
11
- if (fill_tree_loc(tree, hexes, ARRAY_SIZE(hexes))) \
12
- return; \
13
- } while (0)
14
-
15
-static int fill_tree_loc(struct oidtree *ot, const char *hexes[], size_t n)
16
-{
17
- for (size_t i = 0; i < n; i++) {
18
- struct object_id oid;
19
- if (!check_int(get_oid_arbitrary_hex(hexes[i], &oid), ==, 0))
20
- return -1;
21
- oidtree_insert(ot, &oid);
22
- }
23
- return 0;
24
-}
25
-
26
-static void check_contains(struct oidtree *ot, const char *hex, int expected)
27
-{
28
- struct object_id oid;
29
-
30
- if (!check_int(get_oid_arbitrary_hex(hex, &oid), ==, 0))
31
- return;
32
- if (!check_int(oidtree_contains(ot, &oid), ==, expected))
33
- test_msg("oid: %s", oid_to_hex(&oid));
34
-}
35
-
36
-struct expected_hex_iter {
37
- size_t i;
38
- struct strvec expected_hexes;
39
- const char *query;
40
-};
41
-
42
-static enum cb_next check_each_cb(const struct object_id *oid, void *data)
43
-{
44
- struct expected_hex_iter *hex_iter = data;
45
- struct object_id expected;
46
-
47
- if (!check_int(hex_iter->i, <, hex_iter->expected_hexes.nr)) {
48
- test_msg("error: extraneous callback for query: ('%s'), object_id: ('%s')",
49
- hex_iter->query, oid_to_hex(oid));
50
- return CB_BREAK;
51
- }
52
-
53
- if (!check_int(get_oid_arbitrary_hex(hex_iter->expected_hexes.v[hex_iter->i],
54
- &expected), ==, 0))
55
- ; /* the data is bogus and cannot be used */
56
- else if (!check(oideq(oid, &expected)))
57
- test_msg("expected: %s\n got: %s\n query: %s",
58
- oid_to_hex(&expected), oid_to_hex(oid), hex_iter->query);
59
-
60
- hex_iter->i += 1;
61
- return CB_CONTINUE;
62
-}
63
-
64
-LAST_ARG_MUST_BE_NULL
65
-static void check_each(struct oidtree *ot, const char *query, ...)
66
-{
67
- struct object_id oid;
68
- struct expected_hex_iter hex_iter = { .expected_hexes = STRVEC_INIT,
69
- .query = query };
70
- const char *arg;
71
- va_list hex_args;
72
-
73
- va_start(hex_args, query);
74
- while ((arg = va_arg(hex_args, const char *)))
75
- strvec_push(&hex_iter.expected_hexes, arg);
76
- va_end(hex_args);
77
-
78
- if (!check_int(get_oid_arbitrary_hex(query, &oid), ==, 0))
79
- return;
80
- oidtree_each(ot, &oid, strlen(query), check_each_cb, &hex_iter);
81
-
82
- if (!check_int(hex_iter.i, ==, hex_iter.expected_hexes.nr))
83
- test_msg("error: could not find some 'object_id's for query ('%s')", query);
84
- strvec_clear(&hex_iter.expected_hexes);
85
-}
86
-
87
-static void setup(void (*f)(struct oidtree *ot))
88
-{
89
- struct oidtree ot;
90
-
91
- oidtree_init(&ot);
92
- f(&ot);
93
- oidtree_clear(&ot);
94
-}
95
-
96
-static void t_contains(struct oidtree *ot)
97
-{
98
- FILL_TREE(ot, "444", "1", "2", "3", "4", "5", "a", "b", "c", "d", "e");
99
- check_contains(ot, "44", 0);
100
- check_contains(ot, "441", 0);
101
- check_contains(ot, "440", 0);
102
- check_contains(ot, "444", 1);
103
- check_contains(ot, "4440", 1);
104
- check_contains(ot, "4444", 0);
105
-}
106
-
107
-static void t_each(struct oidtree *ot)
108
-{
109
- FILL_TREE(ot, "f", "9", "8", "123", "321", "320", "a", "b", "c", "d", "e");
110
- check_each(ot, "12300", "123", NULL);
111
- check_each(ot, "3211", NULL); /* should not reach callback */
112
- check_each(ot, "3210", "321", NULL);
113
- check_each(ot, "32100", "321", NULL);
114
- check_each(ot, "32", "320", "321", NULL);
115
-}
116
-
117
-int cmd_main(int argc UNUSED, const char **argv UNUSED)
118
-{
119
- TEST(setup(t_contains), "oidtree insert and contains works");
120
- TEST(setup(t_each), "oidtree each works");
121
- return test_done();
122
-}
t/unit-tests/u-oidtree.c
new
+107
@@ -0,0 +1,107 @@
1
+#include "unit-test.h"
2
+#include "lib-oid.h"
3
+#include "oidtree.h"
4
+#include "hash.h"
5
+#include "hex.h"
6
+#include "strvec.h"
7
+
8
+static struct oidtree ot;
9
+
10
+#define FILL_TREE(tree, ...) \
11
+ do { \
12
+ const char *hexes[] = { __VA_ARGS__ }; \
13
+ if (fill_tree_loc(tree, hexes, ARRAY_SIZE(hexes))) \
14
+ return; \
15
+ } while (0)
16
+
17
+static int fill_tree_loc(struct oidtree *ot, const char *hexes[], size_t n)
18
+{
19
+ for (size_t i = 0; i < n; i++) {
20
+ struct object_id oid;
21
+ cl_parse_any_oid(hexes[i], &oid);
22
+ oidtree_insert(ot, &oid);
23
+ }
24
+ return 0;
25
+}
26
+
27
+static void check_contains(struct oidtree *ot, const char *hex, int expected)
28
+{
29
+ struct object_id oid;
30
+
31
+ cl_parse_any_oid(hex, &oid);
32
+ cl_assert_equal_i(oidtree_contains(ot, &oid), expected);
33
+}
34
+
35
+struct expected_hex_iter {
36
+ size_t i;
37
+ struct strvec expected_hexes;
38
+ const char *query;
39
+};
40
+
41
+static enum cb_next check_each_cb(const struct object_id *oid, void *data)
42
+{
43
+ struct expected_hex_iter *hex_iter = data;
44
+ struct object_id expected;
45
+
46
+ cl_assert(hex_iter->i < hex_iter->expected_hexes.nr);
47
+
48
+ cl_parse_any_oid(hex_iter->expected_hexes.v[hex_iter->i],
49
+ &expected);
50
+ cl_assert_equal_s(oid_to_hex(oid), oid_to_hex(&expected));
51
+ hex_iter->i += 1;
52
+ return CB_CONTINUE;
53
+}
54
+
55
+LAST_ARG_MUST_BE_NULL
56
+static void check_each(struct oidtree *ot, const char *query, ...)
57
+{
58
+ struct object_id oid;
59
+ struct expected_hex_iter hex_iter = { .expected_hexes = STRVEC_INIT,
60
+ .query = query };
61
+ const char *arg;
62
+ va_list hex_args;
63
+
64
+ va_start(hex_args, query);
65
+ while ((arg = va_arg(hex_args, const char *)))
66
+ strvec_push(&hex_iter.expected_hexes, arg);
67
+ va_end(hex_args);
68
+
69
+ cl_parse_any_oid(query, &oid);
70
+ oidtree_each(ot, &oid, strlen(query), check_each_cb, &hex_iter);
71
+
72
+ if (hex_iter.i != hex_iter.expected_hexes.nr)
73
+ cl_failf("error: could not find some 'object_id's for query ('%s')", query);
74
+
75
+ strvec_clear(&hex_iter.expected_hexes);
76
+}
77
+
78
+void test_oidtree__initialize(void)
79
+{
80
+ oidtree_init(&ot);
81
+}
82
+
83
+void test_oidtree__cleanup(void)
84
+{
85
+ oidtree_clear(&ot);
86
+}
87
+
88
+void test_oidtree__contains(void)
89
+{
90
+ FILL_TREE(&ot, "444", "1", "2", "3", "4", "5", "a", "b", "c", "d", "e");
91
+ check_contains(&ot, "44", 0);
92
+ check_contains(&ot, "441", 0);
93
+ check_contains(&ot, "440", 0);
94
+ check_contains(&ot, "444", 1);
95
+ check_contains(&ot, "4440", 1);
96
+ check_contains(&ot, "4444", 0);
97
+}
98
+
99
+void test_oidtree__each(void)
100
+{
101
+ FILL_TREE(&ot, "f", "9", "8", "123", "321", "320", "a", "b", "c", "d", "e");
102
+ check_each(&ot, "12300", "123", NULL);
103
+ check_each(&ot, "3211", NULL); /* should not reach callback */
104
+ check_each(&ot, "3210", "321", NULL);
105
+ check_each(&ot, "32100", "321", NULL);
106
+ check_each(&ot, "32", "320", "321", NULL);
107
+}