Skip to content

Commit ce818c2

Browse files
committed
Adapt btree_direct.c to follow btree.c
btree_direct.c and btree.c must follow the same parameters except dyenamic registration and drain. Unify test execution implementation. Signed-off-by: Tomasz Gromadzki <[email protected]>
1 parent 0ca56fd commit ce818c2

File tree

1 file changed

+127
-104
lines changed

1 file changed

+127
-104
lines changed

src/common/tests/btree_direct.c

Lines changed: 127 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/**
22
* (C) Copyright 2018-2022 Intel Corporation.
3+
* (C) Copyright 2025 Hewlett Packard Enterprise Development LP
34
*
45
* SPDX-License-Identifier: BSD-2-Clause-Patent
56
*/
67
#define D_LOGFAC DD_FAC(tests)
78

89
#include <stdio.h>
9-
#include <stdlib.h>
1010
#include <fcntl.h>
1111
#include <string.h>
1212
#include <errno.h>
@@ -25,10 +25,6 @@
2525
#include <daos/tests_lib.h>
2626
#include "utest_common.h"
2727

28-
static char **test_group_args;
29-
static int test_group_start;
30-
static int test_group_stop;
31-
3228
enum sk_btr_opc {
3329
BTR_OPC_UPDATE,
3430
BTR_OPC_LOOKUP,
@@ -53,6 +49,11 @@ struct sk_rec {
5349
char sr_key[0];
5450
};
5551

52+
struct btr_test_state {
53+
int argc;
54+
char **argv;
55+
};
56+
5657
#define SK_TREE_CLASS 100
5758
#define POOL_NAME "/mnt/daos/btree-direct-test"
5859
#define POOL_SIZE ((1024 * 1024 * 1024ULL))
@@ -285,15 +286,15 @@ sk_rec_stat(struct btr_instance *tins, struct btr_record *rec,
285286
}
286287

287288
static btr_ops_t sk_ops = {
288-
.to_key_cmp = sk_key_cmp,
289-
.to_key_encode = sk_key_encode,
290-
.to_key_decode = sk_key_decode,
291-
.to_rec_alloc = sk_rec_alloc,
292-
.to_rec_free = sk_rec_free,
293-
.to_rec_fetch = sk_rec_fetch,
294-
.to_rec_update = sk_rec_update,
295-
.to_rec_string = sk_rec_string,
296-
.to_rec_stat = sk_rec_stat,
289+
.to_key_encode = sk_key_encode,
290+
.to_key_decode = sk_key_decode,
291+
.to_key_cmp = sk_key_cmp,
292+
.to_rec_alloc = sk_rec_alloc,
293+
.to_rec_free = sk_rec_free,
294+
.to_rec_fetch = sk_rec_fetch,
295+
.to_rec_update = sk_rec_update,
296+
.to_rec_string = sk_rec_string,
297+
.to_rec_stat = sk_rec_stat,
297298
};
298299

299300
#define SK_SEP ','
@@ -1026,37 +1027,85 @@ sk_btr_perf(void **state)
10261027
D_FREE(kv);
10271028
}
10281029

1030+
static void
1031+
sk_btr_memory_register(char *pmem_flag)
1032+
{
1033+
int rc = 0;
1034+
if (pmem_flag && *pmem_flag != 'p') {
1035+
fail_msg("Invalid value of -M parameter: %c\n", *pmem_flag);
1036+
}
1037+
if (pmem_flag) {
1038+
D_PRINT("Using pmem\n");
1039+
rc = utest_pmem_create(POOL_NAME, POOL_SIZE, sizeof(*sk_root), NULL, &sk_utx);
1040+
if (rc) {
1041+
fail_msg("Cannot setup pmem: %d\n", rc);
1042+
}
1043+
} else {
1044+
D_PRINT("Using vmem\n");
1045+
rc = utest_vmem_create(sizeof(*sk_root), &sk_utx);
1046+
if (rc) {
1047+
fail_msg("Cannot setup vmem: %d\n", rc);
1048+
}
1049+
}
1050+
1051+
sk_root = utest_utx2root(sk_utx);
1052+
sk_uma = utest_utx2uma(sk_utx);
1053+
}
1054+
static void
1055+
sk_btr_class_register()
1056+
{
1057+
D_PRINT("Using dynamic tree order\n");
1058+
int rc = dbtree_class_register(SK_TREE_CLASS, BTR_FEAT_EMBED_FIRST | BTR_FEAT_DIRECT_KEY,
1059+
&sk_ops);
1060+
if (rc) {
1061+
fail_msg("Cannot register memory class: %d\n", rc);
1062+
}
1063+
}
1064+
10291065
static struct option btr_ops[] = {
1030-
{ "create", required_argument, NULL, 'C' },
1031-
{ "destroy", no_argument, NULL, 'D' },
1032-
{ "open", no_argument, NULL, 'o' },
1033-
{ "close", no_argument, NULL, 'c' },
1034-
{ "update", required_argument, NULL, 'u' },
1035-
{ "find", required_argument, NULL, 'f' },
1036-
{ "delete", required_argument, NULL, 'd' },
1037-
{ "del_retain", required_argument, NULL, 'r' },
1038-
{ "query", no_argument, NULL, 'q' },
1039-
{ "iterate", required_argument, NULL, 'i' },
1040-
{ "batch", required_argument, NULL, 'b' },
1041-
{ "perf", required_argument, NULL, 'p' },
1042-
{ NULL, 0, NULL, 0 },
1066+
{"start-test", required_argument, NULL, 'S'},
1067+
{"reg-class", no_argument, NULL, 'R'},
1068+
{"reg-memory", optional_argument, NULL, 'M'},
1069+
{"create", required_argument, NULL, 'C'},
1070+
{"destroy", no_argument, NULL, 'D'},
1071+
{"open", no_argument, NULL, 'o'},
1072+
{"close", no_argument, NULL, 'c'},
1073+
{"update", required_argument, NULL, 'u'},
1074+
{"find", required_argument, NULL, 'f'},
1075+
{"delete", required_argument, NULL, 'd'},
1076+
{"del_retain", required_argument, NULL, 'r'},
1077+
{"query", no_argument, NULL, 'q'},
1078+
{"iterate", required_argument, NULL, 'i'},
1079+
{"batch", required_argument, NULL, 'b'},
1080+
{"perf", required_argument, NULL, 'p'},
1081+
{NULL, 0, NULL, 0},
10431082
};
10441083

1084+
#define BTR_SHORTOPTS "+S:RM::C:Docqu:f:d:r:qi:b:p:"
1085+
10451086
static void
10461087
ts_group(void **state) {
1047-
1088+
struct btr_test_state *test_state = (struct btr_test_state *)*state;
10481089
int opt = 0;
10491090
void **st = NULL;
10501091

1051-
D_PRINT("--------------------------------------\n");
1052-
while ((opt = getopt_long(test_group_stop-test_group_start+1,
1053-
test_group_args+test_group_start,
1054-
"mC:Docqu:d:r:f:i:b:p:",
1055-
btr_ops,
1092+
while ((opt = getopt_long(test_state->argc, test_state->argv, BTR_SHORTOPTS, btr_ops,
10561093
NULL)) != -1) {
10571094
tst_fn_val.optval = optarg;
10581095
tst_fn_val.input = true;
1096+
10591097
switch (opt) {
1098+
case 'S':
1099+
/* not part of the test sequence */
1100+
break;
1101+
case 'R':
1102+
sk_btr_class_register();
1103+
break;
1104+
1105+
case 'M':
1106+
sk_btr_memory_register(tst_fn_val.optval);
1107+
break;
1108+
10601109
case 'C':
10611110
sk_btr_open_create(st);
10621111
break;
@@ -1101,104 +1150,78 @@ ts_group(void **state) {
11011150
sk_btr_perf(st);
11021151
break;
11031152
default:
1104-
D_PRINT("Unsupported command %c\n", opt);
1105-
case 'm':
1106-
/* already handled */
1107-
break;
1153+
fail_msg("Unsupported command %c\n", opt);
11081154
}
1109-
D_PRINT("--------------------------------------\n");
11101155
}
11111156
}
11121157

11131158
static int
1114-
run_cmd_line_test(char *test_name, char **args, int start_idx, int stop_idx)
1159+
run_cmd_line_test(char *test_name, struct btr_test_state *initial_state)
11151160
{
11161161
const struct CMUnitTest btree_test[] = {
1117-
{test_name, ts_group, NULL, NULL},
1162+
{test_name, ts_group, NULL, NULL, initial_state},
11181163
};
11191164

1120-
test_group_args = args;
1121-
test_group_start = start_idx;
1122-
test_group_stop = stop_idx;
1123-
1124-
return cmocka_run_group_tests_name(test_name,
1125-
btree_test,
1126-
NULL,
1127-
NULL);
1128-
1165+
return cmocka_run_group_tests_name(test_name, btree_test, NULL, NULL);
11291166
}
11301167

11311168
int
11321169
main(int argc, char **argv)
11331170
{
11341171
struct timeval tv;
1172+
int rc = 0;
11351173
int opt;
1136-
int rc;
1137-
int start_idx;
1138-
char *test_name;
1139-
int stop_idx;
1174+
char *test_name = NULL;
1175+
struct btr_test_state initial_state = {.argc = argc, .argv = argv};
11401176

11411177
d_register_alt_assert(mock_assert);
11421178

1143-
gettimeofday(&tv, NULL);
1144-
srand(tv.tv_usec);
1145-
1146-
sk_toh = DAOS_HDL_INVAL;
1147-
sk_root_off = UMOFF_NULL;
1148-
1149-
rc = daos_debug_init(DAOS_LOG_DEFAULT);
1150-
if (rc != 0)
1151-
return rc;
1179+
if (argc == 1) {
1180+
print_message("No parameters provided.\n");
1181+
return -1;
1182+
}
11521183

1153-
rc = dbtree_class_register(SK_TREE_CLASS, BTR_FEAT_EMBED_FIRST | BTR_FEAT_DIRECT_KEY,
1154-
&sk_ops);
1155-
D_ASSERT(rc == 0);
1156-
1157-
stop_idx = argc-1;
1158-
if (strcmp(argv[1], "--start-test") == 0) {
1159-
start_idx = 2;
1160-
test_name = argv[2];
1161-
if (strcmp(argv[3], "-m") == 0) {
1162-
D_PRINT("Using pmem\n");
1163-
rc = utest_pmem_create(POOL_NAME, POOL_SIZE,
1164-
sizeof(*sk_root), NULL, &sk_utx);
1165-
D_ASSERT(rc == 0);
1166-
}
1167-
} else {
1168-
start_idx = 0;
1169-
test_name = "Btree testing tool";
1170-
optind = 0;
1171-
/* Check for -m option first */
1172-
while ((opt = getopt_long(argc, argv, "mC:Docqu:d:r:f:i:b:p:",
1173-
btr_ops, NULL)) != -1) {
1174-
if (opt == 'm') {
1175-
D_PRINT("Using pmem\n");
1176-
rc = utest_pmem_create(POOL_NAME, POOL_SIZE,
1177-
sizeof(*sk_root), NULL,
1178-
&sk_utx);
1179-
D_ASSERT(rc == 0);
1180-
break;
1181-
}
1184+
/* Check for --start-test parameter and verify that all parameters are in place */
1185+
while ((opt = getopt_long(argc, argv, BTR_SHORTOPTS, btr_ops, NULL)) != -1) {
1186+
if (opt == 'S') {
1187+
test_name = optarg;
1188+
} else if (opt == '?') {
1189+
break;
11821190
}
11831191
}
1192+
if (opt == '?') {
1193+
/* invalid option - error message printed on stderr already */
1194+
return -1;
1195+
} else if (argc != optind) {
1196+
fail_msg("Cannot interpret parameter: \"%s\" at optind: %d.\n", argv[optind],
1197+
optind);
1198+
}
11841199

1185-
if (sk_utx == NULL) {
1186-
D_PRINT("Using vmem\n");
1187-
rc = utest_vmem_create(sizeof(*sk_root), &sk_utx);
1188-
D_ASSERT(rc == 0);
1200+
/* getopt_long start over */
1201+
optind = 1;
1202+
1203+
if (test_name == NULL) {
1204+
test_name = "Btree testing tool";
11891205
}
11901206

1191-
sk_root = utest_utx2root(sk_utx);
1192-
sk_uma = utest_utx2uma(sk_utx);
1207+
gettimeofday(&tv, NULL);
1208+
srand(tv.tv_usec);
11931209

1194-
/* start over */
1195-
optind = 0;
1196-
rc = run_cmd_line_test(test_name, argv, start_idx, stop_idx);
1210+
sk_toh = DAOS_HDL_INVAL;
1211+
sk_root_off = UMOFF_NULL;
11971212

1213+
rc = daos_debug_init(DAOS_LOG_DEFAULT);
1214+
if (rc != 0) {
1215+
fail_msg("daos_debug_init() failed: %d\n", rc);
1216+
}
1217+
rc = run_cmd_line_test(test_name, &initial_state);
11981218
daos_debug_fini();
1199-
rc += utest_utx_destroy(sk_utx);
1200-
if (rc != 0)
1201-
printf("Error: %d\n", rc);
1219+
if (sk_utx) {
1220+
rc += utest_utx_destroy(sk_utx);
1221+
}
1222+
if (rc != 0) {
1223+
fail_msg("Error: %d\n", rc);
1224+
}
12021225

1203-
return rc;
1226+
return 0;
12041227
}

0 commit comments

Comments
 (0)