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>
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-
3228enum 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
287288static 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+
10291065static 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+
10451086static void
10461087ts_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
11131158static 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
11311168int
11321169main (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