From f031deb610ff592327db9dbd410644dd7474dcdc Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 13 Aug 2025 13:48:15 +0200 Subject: [PATCH 01/16] add dlck_args_files tests Signed-off-by: Oksana Salyk --- src/utils/dlck/dlck_args.h | 6 ++ src/utils/dlck/dlck_args_files.c | 14 ++- src/utils/dlck/tests/SConscript | 11 +++ src/utils/dlck/tests/dlck_args_files_ut.c | 100 ++++++++++++++++++++++ 4 files changed, 127 insertions(+), 4 deletions(-) create mode 100644 src/utils/dlck/tests/dlck_args_files_ut.c diff --git a/src/utils/dlck/dlck_args.h b/src/utils/dlck/dlck_args.h index c69e3ded9dd..ad5c00dc66b 100644 --- a/src/utils/dlck/dlck_args.h +++ b/src/utils/dlck/dlck_args.h @@ -202,4 +202,10 @@ dlck_args_free(struct dlck_control *ctrl); void dlck_args_files_free(struct dlck_args_files *args); +#ifdef DLCK_UT_BUILD +int args_files_parser(int key, char *arg, struct argp_state *state); +void args_files_init(struct dlck_args_files *args); +int args_files_check(struct argp_state *state, struct dlck_args_files *args); +#endif + #endif /** __DLCK_ARGS__ */ diff --git a/src/utils/dlck/dlck_args_files.c b/src/utils/dlck/dlck_args_files.c index c6814759cad..d088208d140 100644 --- a/src/utils/dlck/dlck_args_files.c +++ b/src/utils/dlck/dlck_args_files.c @@ -12,12 +12,18 @@ #include "dlck_args.h" -static struct argp_option args_files_options[] = { +#ifdef DLCK_UT_BUILD +#define DLCK_STATIC +#else +#define DLCK_STATIC static +#endif + +DLCK_STATIC struct argp_option args_files_options[] = { {"file", KEY_FILES, "UUID,TARGET", 0, "Pool UUID and set of targets. Can be used more than once.", GROUP_OPTIONS}, {0}}; -static void +DLCK_STATIC void args_files_init(struct dlck_args_files *args) { memset(args, 0, sizeof(*args)); @@ -25,7 +31,7 @@ args_files_init(struct dlck_args_files *args) D_INIT_LIST_HEAD(&args->list); } -static int +DLCK_STATIC int args_files_check(struct argp_state *state, struct dlck_args_files *args) { if (d_list_empty(&args->list)) { @@ -34,7 +40,7 @@ args_files_check(struct argp_state *state, struct dlck_args_files *args) return 0; } -static error_t +DLCK_STATIC error_t args_files_parser(int key, char *arg, struct argp_state *state) { struct dlck_args_files *args = state->input; diff --git a/src/utils/dlck/tests/SConscript b/src/utils/dlck/tests/SConscript index 2e9db925b6c..a219a744da6 100644 --- a/src/utils/dlck/tests/SConscript +++ b/src/utils/dlck/tests/SConscript @@ -55,6 +55,16 @@ def build_dlck_vos_cont_recs_get_active(venv): venv.Install('$PREFIX/bin/', program) +def build_dlck_args_files_ut(venv): + """Build args_files.c test""" + venv.require('cmocka') + libs = ['cmocka', 'gurt', 'daos_common_pmem', 'uuid'] + srcs = ['dlck_args_files_ut.c', '../dlck_args_files.c', '../dlck_args_parse.c'] + + program = venv.d_test_program('dlck_args_files_ut', srcs, LIBS=libs, CPPDEFINES=['DLCK_UT_BUILD']) + venv.Install('$PREFIX/bin/', program) + + def build_dlck_test_helper(henv): """Build dlck_test_helper""" henv.Append(OBJPREFIX="dlck_ut_helper_") @@ -94,6 +104,7 @@ def scons(): build_dlck_dtx_act_recs_recover_ut(env.Clone()) build_dlck_vos_cont_recs_get_active(env.Clone()) build_dlck_test_helper(env.Clone()) + build_dlck_args_files_ut(env.Clone()) if __name__ == "SCons.Script": diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c new file mode 100644 index 00000000000..4ccae049a50 --- /dev/null +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -0,0 +1,100 @@ +/** + * (C) Copyright 2025 Hewlett Packard Enterprise Development LP + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "../dlck_args.h" + +/* Helper to create dummy file entry */ +static struct dlck_file *create_dummy_file(const char *uuid_str) +{ + struct dlck_file *file = malloc(sizeof(*file)); + assert_non_null(file); + uuid_parse(uuid_str, file->po_uuid); + D_INIT_LIST_HEAD(&file->link); + return file; +} + +/* Setup and teardown for dlck_args_files */ +static int setup(void **state) +{ + struct dlck_args_files *args = malloc(sizeof(*args)); + assert_non_null(args); + args_files_init(args); + *state = args; + return 0; +} + +static int teardown(void **state) +{ + struct dlck_args_files *args = *state; + dlck_args_files_free(args); + free(args); + return 0; +} + +static void test_args_files_init_should_initialize_list(void **state) +{ + struct dlck_args_files *args = *state; + assert_true(d_list_empty(&args->list)); +} + +static void test_args_files_check_should_fail_if_no_files(void **state) +{ + struct dlck_args_files *args = *state; + struct argp_state argp_state = {0}; + + int rc = args_files_check(&argp_state, args); + assert_int_not_equal(rc, 0); +} + +static void test_args_files_parser_should_add_file_to_list(void **state) +{ + struct dlck_args_files *args = *state; + struct argp_state argp_state = {.input = args}; + + uuid_t expected; + uuid_parse("12345678-1234-1234-1234-123456789abc", expected); + + const char *arg = "12345678-1234-1234-1234-123456789abc,1,2,3"; + int rc = args_files_parser(KEY_FILES, (char *)arg, &argp_state); + assert_int_equal(rc, 0); + assert_false(d_list_empty(&args->list)); + + struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); + assert_non_null(file); + assert_memory_equal(file->po_uuid, expected, 16); +} + +static void test_dlck_args_files_free_should_cleanup_list(void **state) +{ + struct dlck_args_files *args = *state; + + struct dlck_file *file = create_dummy_file("12345678-1234-1234-1234-123456789abc"); + d_list_add_tail(&file->link, &args->list); + + dlck_args_files_free(args); + assert_true(d_list_empty(&args->list)); +} + +int main(void) +{ + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_args_files_init_should_initialize_list, setup, teardown), + cmocka_unit_test_setup_teardown(test_args_files_check_should_fail_if_no_files, setup, teardown), + cmocka_unit_test_setup_teardown(test_args_files_parser_should_add_file_to_list, setup, teardown), + cmocka_unit_test_setup_teardown(test_dlck_args_files_free_should_cleanup_list, setup, teardown), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); +} From e30742936340fbef312cf20ea09dce308e0e3168 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 13 Aug 2025 14:05:47 +0200 Subject: [PATCH 02/16] fix files after github checks Signed-off-by: Oksana Salyk --- src/utils/dlck/dlck_args.h | 9 ++- src/utils/dlck/tests/SConscript | 3 +- src/utils/dlck/tests/dlck_args_files_ut.c | 84 +++++++++++++---------- 3 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/utils/dlck/dlck_args.h b/src/utils/dlck/dlck_args.h index ad5c00dc66b..d39fde9a35f 100644 --- a/src/utils/dlck/dlck_args.h +++ b/src/utils/dlck/dlck_args.h @@ -203,9 +203,12 @@ void dlck_args_files_free(struct dlck_args_files *args); #ifdef DLCK_UT_BUILD -int args_files_parser(int key, char *arg, struct argp_state *state); -void args_files_init(struct dlck_args_files *args); -int args_files_check(struct argp_state *state, struct dlck_args_files *args); +int +args_files_parser(int key, char *arg, struct argp_state *state); +void +args_files_init(struct dlck_args_files *args); +int +args_files_check(struct argp_state *state, struct dlck_args_files *args); #endif #endif /** __DLCK_ARGS__ */ diff --git a/src/utils/dlck/tests/SConscript b/src/utils/dlck/tests/SConscript index a219a744da6..13bddd2c898 100644 --- a/src/utils/dlck/tests/SConscript +++ b/src/utils/dlck/tests/SConscript @@ -60,8 +60,9 @@ def build_dlck_args_files_ut(venv): venv.require('cmocka') libs = ['cmocka', 'gurt', 'daos_common_pmem', 'uuid'] srcs = ['dlck_args_files_ut.c', '../dlck_args_files.c', '../dlck_args_parse.c'] + cppdefines=['DLCK_UT_BUILD'] - program = venv.d_test_program('dlck_args_files_ut', srcs, LIBS=libs, CPPDEFINES=['DLCK_UT_BUILD']) + program = venv.d_test_program('dlck_args_files_ut', srcs, LIBS=libs, CPPDEFINES=cppdefines) venv.Install('$PREFIX/bin/', program) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 4ccae049a50..4c9f82dcdad 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -16,49 +16,55 @@ #include "../dlck_args.h" /* Helper to create dummy file entry */ -static struct dlck_file *create_dummy_file(const char *uuid_str) +static struct dlck_file * +create_dummy_file(const char *uuid_str) { - struct dlck_file *file = malloc(sizeof(*file)); - assert_non_null(file); - uuid_parse(uuid_str, file->po_uuid); - D_INIT_LIST_HEAD(&file->link); - return file; + struct dlck_file *file = malloc(sizeof(*file)); + assert_non_null(file); + uuid_parse(uuid_str, file->po_uuid); + D_INIT_LIST_HEAD(&file->link); + return file; } /* Setup and teardown for dlck_args_files */ -static int setup(void **state) +static int +setup(void **state) { - struct dlck_args_files *args = malloc(sizeof(*args)); - assert_non_null(args); - args_files_init(args); - *state = args; - return 0; + struct dlck_args_files *args = malloc(sizeof(*args)); + assert_non_null(args); + args_files_init(args); + *state = args; + return 0; } -static int teardown(void **state) +static int +teardown(void **state) { - struct dlck_args_files *args = *state; - dlck_args_files_free(args); - free(args); - return 0; + struct dlck_args_files *args = *state; + dlck_args_files_free(args); + free(args); + return 0; } -static void test_args_files_init_should_initialize_list(void **state) +static void +test_args_files_init_should_initialize_list(void **state) { - struct dlck_args_files *args = *state; - assert_true(d_list_empty(&args->list)); + struct dlck_args_files *args = *state; + assert_true(d_list_empty(&args->list)); } -static void test_args_files_check_should_fail_if_no_files(void **state) +static void +test_args_files_check_should_fail_if_no_files(void **state) { - struct dlck_args_files *args = *state; - struct argp_state argp_state = {0}; + struct dlck_args_files *args = *state; + struct argp_state argp_state = {0}; - int rc = args_files_check(&argp_state, args); - assert_int_not_equal(rc, 0); + int rc = args_files_check(&argp_state, args); + assert_int_not_equal(rc, 0); } -static void test_args_files_parser_should_add_file_to_list(void **state) +static void +test_args_files_parser_should_add_file_to_list(void **state) { struct dlck_args_files *args = *state; struct argp_state argp_state = {.input = args}; @@ -76,7 +82,8 @@ static void test_args_files_parser_should_add_file_to_list(void **state) assert_memory_equal(file->po_uuid, expected, 16); } -static void test_dlck_args_files_free_should_cleanup_list(void **state) +static void +test_dlck_args_files_free_should_cleanup_list(void **state) { struct dlck_args_files *args = *state; @@ -87,14 +94,19 @@ static void test_dlck_args_files_free_should_cleanup_list(void **state) assert_true(d_list_empty(&args->list)); } -int main(void) +int +main(void) { - const struct CMUnitTest tests[] = { - cmocka_unit_test_setup_teardown(test_args_files_init_should_initialize_list, setup, teardown), - cmocka_unit_test_setup_teardown(test_args_files_check_should_fail_if_no_files, setup, teardown), - cmocka_unit_test_setup_teardown(test_args_files_parser_should_add_file_to_list, setup, teardown), - cmocka_unit_test_setup_teardown(test_dlck_args_files_free_should_cleanup_list, setup, teardown), - }; - - return cmocka_run_group_tests(tests, NULL, NULL); + const struct CMUnitTest tests[] = { + cmocka_unit_test_setup_teardown(test_args_files_init_should_initialize_list, setup, + teardown), + cmocka_unit_test_setup_teardown(test_args_files_check_should_fail_if_no_files, setup, + teardown), + cmocka_unit_test_setup_teardown(test_args_files_parser_should_add_file_to_list, setup, + teardown), + cmocka_unit_test_setup_teardown(test_dlck_args_files_free_should_cleanup_list, setup, + teardown), + }; + + return cmocka_run_group_tests(tests, NULL, NULL); } From 36d42ff2d49c2327414756b750ed8e50ee749524 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 13 Aug 2025 14:14:08 +0200 Subject: [PATCH 03/16] add fix part 2 Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/SConscript | 2 +- src/utils/dlck/tests/dlck_args_files_ut.c | 25 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/utils/dlck/tests/SConscript b/src/utils/dlck/tests/SConscript index 13bddd2c898..48e71637623 100644 --- a/src/utils/dlck/tests/SConscript +++ b/src/utils/dlck/tests/SConscript @@ -60,7 +60,7 @@ def build_dlck_args_files_ut(venv): venv.require('cmocka') libs = ['cmocka', 'gurt', 'daos_common_pmem', 'uuid'] srcs = ['dlck_args_files_ut.c', '../dlck_args_files.c', '../dlck_args_parse.c'] - cppdefines=['DLCK_UT_BUILD'] + cppdefines = ['DLCK_UT_BUILD'] program = venv.d_test_program('dlck_args_files_ut', srcs, LIBS=libs, CPPDEFINES=cppdefines) venv.Install('$PREFIX/bin/', program) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 4c9f82dcdad..1b30d790f70 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -66,20 +66,21 @@ test_args_files_check_should_fail_if_no_files(void **state) static void test_args_files_parser_should_add_file_to_list(void **state) { - struct dlck_args_files *args = *state; - struct argp_state argp_state = {.input = args}; + struct dlck_args_files *args = *state; + struct argp_state argp_state = {.input = args}; - uuid_t expected; - uuid_parse("12345678-1234-1234-1234-123456789abc", expected); + uuid_t expected; + uuid_parse("12345678-1234-1234-1234-123456789abc", expected); - const char *arg = "12345678-1234-1234-1234-123456789abc,1,2,3"; - int rc = args_files_parser(KEY_FILES, (char *)arg, &argp_state); - assert_int_equal(rc, 0); - assert_false(d_list_empty(&args->list)); + const char *arg = "12345678-1234-1234-1234-123456789abc,1,2,3"; + int rc = args_files_parser(KEY_FILES, (char *)arg, &argp_state); + assert_int_equal(rc, 0); + assert_false(d_list_empty(&args->list)); + ; - struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); - assert_non_null(file); - assert_memory_equal(file->po_uuid, expected, 16); + struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); + assert_non_null(file); + assert_memory_equal(file->po_uuid, expected, 16); } static void @@ -87,7 +88,7 @@ test_dlck_args_files_free_should_cleanup_list(void **state) { struct dlck_args_files *args = *state; - struct dlck_file *file = create_dummy_file("12345678-1234-1234-1234-123456789abc"); + struct dlck_file *file = create_dummy_file("12345678-1234-1234-1234-123456789abc"); d_list_add_tail(&file->link, &args->list); dlck_args_files_free(args); From 11fb459aa7ae3835120213c33f2afc992d279eb8 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 13 Aug 2025 14:24:56 +0200 Subject: [PATCH 04/16] add fix part 3 Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 1b30d790f70..6cdc1ea6364 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -86,13 +86,13 @@ test_args_files_parser_should_add_file_to_list(void **state) static void test_dlck_args_files_free_should_cleanup_list(void **state) { - struct dlck_args_files *args = *state; + struct dlck_args_files *args = *state; - struct dlck_file *file = create_dummy_file("12345678-1234-1234-1234-123456789abc"); - d_list_add_tail(&file->link, &args->list); + struct dlck_file *file = create_dummy_file("12345678-1234-1234-1234-123456789abc"); + d_list_add_tail(&file->link, &args->list); - dlck_args_files_free(args); - assert_true(d_list_empty(&args->list)); + dlck_args_files_free(args); + assert_true(d_list_empty(&args->list)); } int From bbf98ba0b4938dae33200002b2c8ba7c8f2068ee Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 20 Aug 2025 09:59:03 +0200 Subject: [PATCH 05/16] add corrections after code review Signed-off-by: Oksana Salyk --- src/include/daos_srv/dlck.h | 7 +- src/include/daos_srv/dlck_debug.h | 17 ++++ src/utils/dlck/dlck_args.c | 1 - src/utils/dlck/dlck_args.h | 11 +-- src/utils/dlck/dlck_args_files.c | 11 +-- src/utils/dlck/tests/SConscript | 12 ++- src/utils/dlck/tests/dlck_args_files_ut.c | 98 +++++++++++++---------- 7 files changed, 89 insertions(+), 68 deletions(-) create mode 100644 src/include/daos_srv/dlck_debug.h diff --git a/src/include/daos_srv/dlck.h b/src/include/daos_srv/dlck.h index f7ef07eccbd..4f708fd7843 100644 --- a/src/include/daos_srv/dlck.h +++ b/src/include/daos_srv/dlck.h @@ -8,6 +8,7 @@ #define __DAOS_DLCK_H__ #include "d_vector.h" +#include "dlck_debug.h" /** * Trace a single DTX record. @@ -70,12 +71,6 @@ dlck_dtx_act_recs_remove(daos_handle_t coh); int dlck_dtx_act_recs_set(daos_handle_t coh, d_vector_t *dv); -#ifdef DLCK_UT_BUILD -#define DLCK_STATIC -#else -#define DLCK_STATIC static -#endif - /** * \struct dlck_iter_bundle * diff --git a/src/include/daos_srv/dlck_debug.h b/src/include/daos_srv/dlck_debug.h new file mode 100644 index 00000000000..7a54a9a4f96 --- /dev/null +++ b/src/include/daos_srv/dlck_debug.h @@ -0,0 +1,17 @@ +/** + * (C) Copyright 2025 Hewlett Packard Enterprise Development LP + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + */ + +#ifndef __DAOS_DLCK_DEBUG_H__ +#define __DAOS_DLCK_DEBUG_H__ + + +#ifdef DLCK_UT_BUILD +#define DLCK_STATIC +#else +#define DLCK_STATIC static +#endif + +#endif /** __DLCK_DEBUG__ */ diff --git a/src/utils/dlck/dlck_args.c b/src/utils/dlck/dlck_args.c index 34e24104424..aa16881042c 100644 --- a/src/utils/dlck/dlck_args.c +++ b/src/utils/dlck/dlck_args.c @@ -30,7 +30,6 @@ static struct argp_option empty_options[] = {{0}}; static struct argp_option _automagic[] = {OPT_HEADER("Other options:", GROUP_AUTOMAGIC), {0}}; /** glue everything together */ - extern struct argp argp_common; extern struct argp argp_file; extern struct argp argp_engine; diff --git a/src/utils/dlck/dlck_args.h b/src/utils/dlck/dlck_args.h index d39fde9a35f..11e3ea2b1bf 100644 --- a/src/utils/dlck/dlck_args.h +++ b/src/utils/dlck/dlck_args.h @@ -128,6 +128,8 @@ struct dlck_control { #define DLCK_PRINTF(ctrl, fmt, ...) (void)ctrl->print.dp_printf(fmt, __VA_ARGS__) +extern struct argp argp_file; + /** dlck_args_parse.c */ /** @@ -202,13 +204,4 @@ dlck_args_free(struct dlck_control *ctrl); void dlck_args_files_free(struct dlck_args_files *args); -#ifdef DLCK_UT_BUILD -int -args_files_parser(int key, char *arg, struct argp_state *state); -void -args_files_init(struct dlck_args_files *args); -int -args_files_check(struct argp_state *state, struct dlck_args_files *args); -#endif - #endif /** __DLCK_ARGS__ */ diff --git a/src/utils/dlck/dlck_args_files.c b/src/utils/dlck/dlck_args_files.c index d088208d140..d1b5eb9186c 100644 --- a/src/utils/dlck/dlck_args_files.c +++ b/src/utils/dlck/dlck_args_files.c @@ -11,14 +11,9 @@ #include #include "dlck_args.h" +#include "daos_srv/dlck_debug.h" -#ifdef DLCK_UT_BUILD -#define DLCK_STATIC -#else -#define DLCK_STATIC static -#endif - -DLCK_STATIC struct argp_option args_files_options[] = { +static struct argp_option args_files_options[] = { {"file", KEY_FILES, "UUID,TARGET", 0, "Pool UUID and set of targets. Can be used more than once.", GROUP_OPTIONS}, {0}}; @@ -40,7 +35,7 @@ args_files_check(struct argp_state *state, struct dlck_args_files *args) return 0; } -DLCK_STATIC error_t +static error_t args_files_parser(int key, char *arg, struct argp_state *state) { struct dlck_args_files *args = state->input; diff --git a/src/utils/dlck/tests/SConscript b/src/utils/dlck/tests/SConscript index 48e71637623..1d7292f9b13 100644 --- a/src/utils/dlck/tests/SConscript +++ b/src/utils/dlck/tests/SConscript @@ -56,10 +56,18 @@ def build_dlck_vos_cont_recs_get_active(venv): def build_dlck_args_files_ut(venv): - """Build args_files.c test""" + """Build dlck_args_files.c test""" venv.require('cmocka') + venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=argp_failure']) libs = ['cmocka', 'gurt', 'daos_common_pmem', 'uuid'] - srcs = ['dlck_args_files_ut.c', '../dlck_args_files.c', '../dlck_args_parse.c'] + srcs = [ + 'dlck_args_files_ut.c', + '../dlck_args_files.c', + '../dlck_args_parse.c', + '../dlck_args.c', + '../dlck_args_common.c', + '../dlck_args_engine.c' + ] cppdefines = ['DLCK_UT_BUILD'] program = venv.d_test_program('dlck_args_files_ut', srcs, LIBS=libs, CPPDEFINES=cppdefines) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 6cdc1ea6364..58593cb550b 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -15,22 +15,17 @@ #include "../dlck_args.h" -/* Helper to create dummy file entry */ -static struct dlck_file * -create_dummy_file(const char *uuid_str) -{ - struct dlck_file *file = malloc(sizeof(*file)); - assert_non_null(file); - uuid_parse(uuid_str, file->po_uuid); - D_INIT_LIST_HEAD(&file->link); - return file; -} +void +args_files_init(struct dlck_args_files *args); +int +args_files_check(struct argp_state *state, struct dlck_args_files *args); /* Setup and teardown for dlck_args_files */ static int setup(void **state) { - struct dlck_args_files *args = malloc(sizeof(*args)); + struct dlck_args_files *args; + D_ALLOC_PTR(args); assert_non_null(args); args_files_init(args); *state = args; @@ -42,72 +37,91 @@ teardown(void **state) { struct dlck_args_files *args = *state; dlck_args_files_free(args); - free(args); + D_FREE(args); return 0; } +/** mocks */ + +void __wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) { + check_expected_ptr(state); + check_expected(status); + check_expected(errnum); + check_expected(fmt); +} + +/** tests */ + static void -test_args_files_init_should_initialize_list(void **state) +test_init_should_initialize_list(void **state) { struct dlck_args_files *args = *state; assert_true(d_list_empty(&args->list)); } static void -test_args_files_check_should_fail_if_no_files(void **state) +test_check_should_fail_if_no_files(void **state) { struct dlck_args_files *args = *state; struct argp_state argp_state = {0}; + expect_any(__wrap_argp_failure, state); + expect_value(__wrap_argp_failure, status, EINVAL); + expect_value(__wrap_argp_failure, errnum, EINVAL); + expect_string(__wrap_argp_failure, fmt, "No file chosen"); + int rc = args_files_check(&argp_state, args); - assert_int_not_equal(rc, 0); + assert_int_equal(rc, EINVAL); } static void -test_args_files_parser_should_add_file_to_list(void **state) +test_parser_should_add_file_to_list(void **state) { - struct dlck_args_files *args = *state; - struct argp_state argp_state = {.input = args}; + struct dlck_args_files *args = *state; + + uuid_t expected; + uuid_parse("12345678-1234-1234-1234-123456789abc", expected); - uuid_t expected; - uuid_parse("12345678-1234-1234-1234-123456789abc", expected); + char *argv[] = { + "program_name", + "--file=12345678-1234-1234-1234-123456789abc,1,2,3", + NULL + }; - const char *arg = "12345678-1234-1234-1234-123456789abc,1,2,3"; - int rc = args_files_parser(KEY_FILES, (char *)arg, &argp_state); - assert_int_equal(rc, 0); - assert_false(d_list_empty(&args->list)); - ; + int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); + assert_int_equal(rc, 0); + assert_false(d_list_empty(&args->list)); - struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); - assert_non_null(file); - assert_memory_equal(file->po_uuid, expected, 16); + struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); + assert_non_null(file); + assert_memory_equal(file->po_uuid, expected, 16); } static void -test_dlck_args_files_free_should_cleanup_list(void **state) +test_free_should_cleanup_list(void **state) { struct dlck_args_files *args = *state; - struct dlck_file *file = create_dummy_file("12345678-1234-1234-1234-123456789abc"); + struct dlck_file *file; + D_ALLOC_PTR(file); + d_list_add_tail(&file->link, &args->list); dlck_args_files_free(args); assert_true(d_list_empty(&args->list)); } +static const struct CMUnitTest tests_all[] = { + {"DARG100: init", test_init_should_initialize_list, setup, teardown}, + {"DARG101: check", test_check_should_fail_if_no_files, setup, teardown}, + {"DARG102: parser", test_parser_should_add_file_to_list, setup, teardown}, + {"DARG103: free", test_free_should_cleanup_list, setup, teardown}, +}; + int main(void) { - const struct CMUnitTest tests[] = { - cmocka_unit_test_setup_teardown(test_args_files_init_should_initialize_list, setup, - teardown), - cmocka_unit_test_setup_teardown(test_args_files_check_should_fail_if_no_files, setup, - teardown), - cmocka_unit_test_setup_teardown(test_args_files_parser_should_add_file_to_list, setup, - teardown), - cmocka_unit_test_setup_teardown(test_dlck_args_files_free_should_cleanup_list, setup, - teardown), - }; - - return cmocka_run_group_tests(tests, NULL, NULL); + const char *test_name = "args_files_tests"; + + return cmocka_run_group_tests_name(test_name, tests_all, NULL, NULL); } From 5e542308468a0c7cd8e4734596b9d343ccdf827f Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 20 Aug 2025 10:05:33 +0200 Subject: [PATCH 06/16] clang changes Signed-off-by: Oksana Salyk --- src/include/daos_srv/dlck_debug.h | 1 - src/utils/dlck/tests/dlck_args_files_ut.c | 36 +++++++++++------------ 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/include/daos_srv/dlck_debug.h b/src/include/daos_srv/dlck_debug.h index 7a54a9a4f96..eff6442a1ff 100644 --- a/src/include/daos_srv/dlck_debug.h +++ b/src/include/daos_srv/dlck_debug.h @@ -7,7 +7,6 @@ #ifndef __DAOS_DLCK_DEBUG_H__ #define __DAOS_DLCK_DEBUG_H__ - #ifdef DLCK_UT_BUILD #define DLCK_STATIC #else diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 58593cb550b..a38b32506e0 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -43,11 +43,13 @@ teardown(void **state) /** mocks */ -void __wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) { - check_expected_ptr(state); - check_expected(status); - check_expected(errnum); - check_expected(fmt); +void +__wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) +{ + check_expected_ptr(state); + check_expected(status); + check_expected(errnum); + check_expected(fmt); } /** tests */ @@ -70,7 +72,7 @@ test_check_should_fail_if_no_files(void **state) expect_value(__wrap_argp_failure, errnum, EINVAL); expect_string(__wrap_argp_failure, fmt, "No file chosen"); - int rc = args_files_check(&argp_state, args); + int rc = args_files_check(&argp_state, args); assert_int_equal(rc, EINVAL); } @@ -79,22 +81,18 @@ test_parser_should_add_file_to_list(void **state) { struct dlck_args_files *args = *state; - uuid_t expected; - uuid_parse("12345678-1234-1234-1234-123456789abc", expected); + uuid_t expected; + uuid_parse("12345678-1234-1234-1234-123456789abc", expected); - char *argv[] = { - "program_name", - "--file=12345678-1234-1234-1234-123456789abc,1,2,3", - NULL - }; + char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1,2,3", NULL}; - int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); - assert_int_equal(rc, 0); - assert_false(d_list_empty(&args->list)); + int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); + assert_int_equal(rc, 0); + assert_false(d_list_empty(&args->list)); - struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); - assert_non_null(file); - assert_memory_equal(file->po_uuid, expected, 16); + struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); + assert_non_null(file); + assert_memory_equal(file->po_uuid, expected, 16); } static void From d7f2deec323a030b83adec0d2f272d1d85ec16ff Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 20 Aug 2025 10:08:15 +0200 Subject: [PATCH 07/16] clang changes 2 Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index a38b32506e0..484e09f2e5b 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -110,10 +110,10 @@ test_free_should_cleanup_list(void **state) } static const struct CMUnitTest tests_all[] = { - {"DARG100: init", test_init_should_initialize_list, setup, teardown}, - {"DARG101: check", test_check_should_fail_if_no_files, setup, teardown}, - {"DARG102: parser", test_parser_should_add_file_to_list, setup, teardown}, - {"DARG103: free", test_free_should_cleanup_list, setup, teardown}, + {"DARG100: init", test_init_should_initialize_list, setup, teardown}, + {"DARG101: check", test_check_should_fail_if_no_files, setup, teardown}, + {"DARG102: parser", test_parser_should_add_file_to_list, setup, teardown}, + {"DARG103: free", test_free_should_cleanup_list, setup, teardown}, }; int From abbaea0e2794146320e6e72dace6a06c3c669846 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Thu, 21 Aug 2025 11:50:56 +0200 Subject: [PATCH 08/16] apply comments from review Signed-off-by: Oksana Salyk --- src/include/daos_srv/dlck_debug.h | 6 +-- src/utils/dlck/dlck_args.c | 1 + src/utils/dlck/dlck_args.h | 2 - src/utils/dlck/tests/SConscript | 11 +---- src/utils/dlck/tests/dlck_args_files_ut.c | 53 ++++++++++++++--------- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/include/daos_srv/dlck_debug.h b/src/include/daos_srv/dlck_debug.h index eff6442a1ff..12f9a5d26cc 100644 --- a/src/include/daos_srv/dlck_debug.h +++ b/src/include/daos_srv/dlck_debug.h @@ -4,8 +4,8 @@ * SPDX-License-Identifier: BSD-2-Clause-Patent */ -#ifndef __DAOS_DLCK_DEBUG_H__ -#define __DAOS_DLCK_DEBUG_H__ +#ifndef __DLCK_DEBUG_H__ +#define __DLCK_DEBUG_H__ #ifdef DLCK_UT_BUILD #define DLCK_STATIC @@ -13,4 +13,4 @@ #define DLCK_STATIC static #endif -#endif /** __DLCK_DEBUG__ */ +#endif /** __DLCK_DEBUG_H__ */ diff --git a/src/utils/dlck/dlck_args.c b/src/utils/dlck/dlck_args.c index aa16881042c..34e24104424 100644 --- a/src/utils/dlck/dlck_args.c +++ b/src/utils/dlck/dlck_args.c @@ -30,6 +30,7 @@ static struct argp_option empty_options[] = {{0}}; static struct argp_option _automagic[] = {OPT_HEADER("Other options:", GROUP_AUTOMAGIC), {0}}; /** glue everything together */ + extern struct argp argp_common; extern struct argp argp_file; extern struct argp argp_engine; diff --git a/src/utils/dlck/dlck_args.h b/src/utils/dlck/dlck_args.h index 11e3ea2b1bf..c69e3ded9dd 100644 --- a/src/utils/dlck/dlck_args.h +++ b/src/utils/dlck/dlck_args.h @@ -128,8 +128,6 @@ struct dlck_control { #define DLCK_PRINTF(ctrl, fmt, ...) (void)ctrl->print.dp_printf(fmt, __VA_ARGS__) -extern struct argp argp_file; - /** dlck_args_parse.c */ /** diff --git a/src/utils/dlck/tests/SConscript b/src/utils/dlck/tests/SConscript index 1d7292f9b13..9c71e772e62 100644 --- a/src/utils/dlck/tests/SConscript +++ b/src/utils/dlck/tests/SConscript @@ -58,16 +58,9 @@ def build_dlck_vos_cont_recs_get_active(venv): def build_dlck_args_files_ut(venv): """Build dlck_args_files.c test""" venv.require('cmocka') - venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=argp_failure']) + venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=argp_failure', '-Wl,--wrap=parse_file']) libs = ['cmocka', 'gurt', 'daos_common_pmem', 'uuid'] - srcs = [ - 'dlck_args_files_ut.c', - '../dlck_args_files.c', - '../dlck_args_parse.c', - '../dlck_args.c', - '../dlck_args_common.c', - '../dlck_args_engine.c' - ] + srcs = ['dlck_args_files_ut.c', '../dlck_args_files.c'] cppdefines = ['DLCK_UT_BUILD'] program = venv.d_test_program('dlck_args_files_ut', srcs, LIBS=libs, CPPDEFINES=cppdefines) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 484e09f2e5b..20f7a002834 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -20,6 +20,28 @@ args_files_init(struct dlck_args_files *args); int args_files_check(struct argp_state *state, struct dlck_args_files *args); +/** mocks */ + +#define MOCK_ARGP_STATE ((void *)0xDEADBEEF) +struct dlck_file File; + +void +__wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) +{ + check_expected(status); + check_expected(errnum); + check_expected(fmt); +} + +int +__wrap_parse_file(const char *arg, struct argp_state *state, struct dlck_file **file_ptr) +{ + memset(&File, 0, sizeof(File)); + uuid_parse("12345678-1234-1234-1234-123456789abc", File.po_uuid); + *file_ptr = &File; + return 0; +} + /* Setup and teardown for dlck_args_files */ static int setup(void **state) @@ -41,17 +63,6 @@ teardown(void **state) return 0; } -/** mocks */ - -void -__wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) -{ - check_expected_ptr(state); - check_expected(status); - check_expected(errnum); - check_expected(fmt); -} - /** tests */ static void @@ -65,14 +76,14 @@ static void test_check_should_fail_if_no_files(void **state) { struct dlck_args_files *args = *state; - struct argp_state argp_state = {0}; + struct argp_state *argp_state = MOCK_ARGP_STATE; + assert_ptr_equal(argp_state, MOCK_ARGP_STATE); - expect_any(__wrap_argp_failure, state); expect_value(__wrap_argp_failure, status, EINVAL); expect_value(__wrap_argp_failure, errnum, EINVAL); expect_string(__wrap_argp_failure, fmt, "No file chosen"); - int rc = args_files_check(&argp_state, args); + int rc = args_files_check(argp_state, args); assert_int_equal(rc, EINVAL); } @@ -80,9 +91,7 @@ static void test_parser_should_add_file_to_list(void **state) { struct dlck_args_files *args = *state; - - uuid_t expected; - uuid_parse("12345678-1234-1234-1234-123456789abc", expected); + extern struct argp argp_file; char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1,2,3", NULL}; @@ -91,8 +100,10 @@ test_parser_should_add_file_to_list(void **state) assert_false(d_list_empty(&args->list)); struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); - assert_non_null(file); - assert_memory_equal(file->po_uuid, expected, 16); + assert_ptr_equal(file, &File); + + /** cleanup */ + D_FREE(args); } static void @@ -112,14 +123,14 @@ test_free_should_cleanup_list(void **state) static const struct CMUnitTest tests_all[] = { {"DARG100: init", test_init_should_initialize_list, setup, teardown}, {"DARG101: check", test_check_should_fail_if_no_files, setup, teardown}, - {"DARG102: parser", test_parser_should_add_file_to_list, setup, teardown}, + {"DARG102: parser", test_parser_should_add_file_to_list, setup, NULL}, {"DARG103: free", test_free_should_cleanup_list, setup, teardown}, }; int main(void) { - const char *test_name = "args_files_tests"; + const char *test_name = "dlck_args_files.c tests"; return cmocka_run_group_tests_name(test_name, tests_all, NULL, NULL); } From b6922b65d64a3773765f5c740575d20cecbabad9 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Thu, 21 Aug 2025 13:26:29 +0200 Subject: [PATCH 09/16] add new test cases Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 116 ++++++++++++++++++++-- 1 file changed, 109 insertions(+), 7 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 20f7a002834..22977aa1ca4 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -24,13 +24,14 @@ args_files_check(struct argp_state *state, struct dlck_args_files *args); #define MOCK_ARGP_STATE ((void *)0xDEADBEEF) struct dlck_file File; +extern struct argp argp_file; void __wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) { check_expected(status); check_expected(errnum); - check_expected(fmt); + assert_non_null(fmt); } int @@ -39,7 +40,7 @@ __wrap_parse_file(const char *arg, struct argp_state *state, struct dlck_file ** memset(&File, 0, sizeof(File)); uuid_parse("12345678-1234-1234-1234-123456789abc", File.po_uuid); *file_ptr = &File; - return 0; + return (int)mock(); } /* Setup and teardown for dlck_args_files */ @@ -47,8 +48,10 @@ static int setup(void **state) { struct dlck_args_files *args; + D_ALLOC_PTR(args); assert_non_null(args); + args_files_init(args); *state = args; return 0; @@ -58,8 +61,10 @@ static int teardown(void **state) { struct dlck_args_files *args = *state; + dlck_args_files_free(args); D_FREE(args); + return 0; } @@ -69,9 +74,23 @@ static void test_init_should_initialize_list(void **state) { struct dlck_args_files *args = *state; + assert_true(d_list_empty(&args->list)); } +static void +test_files_free_empty_list() +{ + struct dlck_args_files *args; + D_ALLOC_PTR(args); + assert_non_null(args); + + args_files_init(args); + + dlck_args_files_free(args); + D_FREE(args); +} + static void test_check_should_fail_if_no_files(void **state) { @@ -81,7 +100,6 @@ test_check_should_fail_if_no_files(void **state) expect_value(__wrap_argp_failure, status, EINVAL); expect_value(__wrap_argp_failure, errnum, EINVAL); - expect_string(__wrap_argp_failure, fmt, "No file chosen"); int rc = args_files_check(argp_state, args); assert_int_equal(rc, EINVAL); @@ -91,10 +109,11 @@ static void test_parser_should_add_file_to_list(void **state) { struct dlck_args_files *args = *state; - extern struct argp argp_file; char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1,2,3", NULL}; + will_return(__wrap_parse_file, DER_SUCCESS); + int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); assert_int_equal(rc, 0); assert_false(d_list_empty(&args->list)); @@ -120,11 +139,94 @@ test_free_should_cleanup_list(void **state) assert_true(d_list_empty(&args->list)); } +static void +test_init_sets_up_list(void **state) +{ + struct dlck_args_files args; + memset(&args, 0, sizeof(args)); + + char *argv[] = {"program_name", NULL}; + int argc = 1; + + expect_value(__wrap_argp_failure, status, EINVAL); + expect_value(__wrap_argp_failure, errnum, EINVAL); + + int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + assert_int_equal(rc, EINVAL); + assert_true(d_list_empty(&args.list)); +} + +static void +test_parser_end_fails_without_file(void **state) +{ + struct dlck_args_files args; + args_files_init(&args); + + char *argv[] = {"program_name", NULL}; + int argc = 1; + + expect_value(__wrap_argp_failure, status, EINVAL); + expect_value(__wrap_argp_failure, errnum, EINVAL); + + int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + assert_int_equal(rc, EINVAL); +} + +static void +test_end_succeeds_with_file(void **state) +{ + struct dlck_args_files args; + args_files_init(&args); + + char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1", NULL}; + int argc = 2; + + will_return(__wrap_parse_file, DER_SUCCESS); + int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + assert_int_equal(rc, 0); + assert_false(d_list_empty(&args.list)); +} + +static void +test_key_files_parse_file_fails(void **state) +{ + struct dlck_args_files args; + args_files_init(&args); + + char *argv[] = {"program_name", "--file=invalid", NULL}; + int argc = 2; + + will_return(__wrap_parse_file, EINVAL); + int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + assert_int_equal(rc, EINVAL); + assert_true(d_list_empty(&args.list)); +} + +static void +test_success_and_fini_are_noops(void **state) +{ + struct dlck_args_files args; + args_files_init(&args); + + char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1", NULL}; + int argc = 2; + + will_return(__wrap_parse_file, DER_SUCCESS); + int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + assert_int_equal(rc, 0); +} + static const struct CMUnitTest tests_all[] = { {"DARG100: init", test_init_should_initialize_list, setup, teardown}, - {"DARG101: check", test_check_should_fail_if_no_files, setup, teardown}, - {"DARG102: parser", test_parser_should_add_file_to_list, setup, NULL}, - {"DARG103: free", test_free_should_cleanup_list, setup, teardown}, + {"DARG101: free empty", test_files_free_empty_list, NULL, NULL}, + {"DARG102: check fail", test_check_should_fail_if_no_files, setup, teardown}, + {"DARG103: parser add", test_parser_should_add_file_to_list, setup, NULL}, + {"DARG104: free list", test_free_should_cleanup_list, setup, teardown}, + {"DARG105: key init", test_init_sets_up_list, setup, teardown}, + {"DARG106: key end fail", test_parser_end_fails_without_file, setup, teardown}, + {"DARG107: key end ok", test_end_succeeds_with_file, setup, teardown}, + {"DARG108: paser fail", test_key_files_parse_file_fails, setup, teardown}, + {"DARG109: success noop", test_success_and_fini_are_noops, setup, teardown}, }; int From d96db9bdf2fa16672cd2b33508723b01538b0fb3 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Thu, 21 Aug 2025 13:29:55 +0200 Subject: [PATCH 10/16] apply clang changes Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 22977aa1ca4..04715fec89b 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -23,7 +23,7 @@ args_files_check(struct argp_state *state, struct dlck_args_files *args); /** mocks */ #define MOCK_ARGP_STATE ((void *)0xDEADBEEF) -struct dlck_file File; +struct dlck_file File; extern struct argp argp_file; void @@ -114,7 +114,7 @@ test_parser_should_add_file_to_list(void **state) will_return(__wrap_parse_file, DER_SUCCESS); - int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); + int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); assert_int_equal(rc, 0); assert_false(d_list_empty(&args->list)); From be5bda30874a906085216e82e5df01aa74b6b4a0 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Thu, 21 Aug 2025 13:31:22 +0200 Subject: [PATCH 11/16] fix a typo Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 04715fec89b..985544ca9ce 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -225,7 +225,7 @@ static const struct CMUnitTest tests_all[] = { {"DARG105: key init", test_init_sets_up_list, setup, teardown}, {"DARG106: key end fail", test_parser_end_fails_without_file, setup, teardown}, {"DARG107: key end ok", test_end_succeeds_with_file, setup, teardown}, - {"DARG108: paser fail", test_key_files_parse_file_fails, setup, teardown}, + {"DARG108: parser fail", test_key_files_parse_file_fails, setup, teardown}, {"DARG109: success noop", test_success_and_fini_are_noops, setup, teardown}, }; From 629de3b8643459cec25d277a84a0e1297739b152 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Mon, 25 Aug 2025 11:23:13 +0200 Subject: [PATCH 12/16] develop the tests Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/SConscript | 4 +- src/utils/dlck/tests/dlck_args_files_ut.c | 159 ++++++++++++---------- 2 files changed, 88 insertions(+), 75 deletions(-) diff --git a/src/utils/dlck/tests/SConscript b/src/utils/dlck/tests/SConscript index 9c71e772e62..d3db6b6a20c 100644 --- a/src/utils/dlck/tests/SConscript +++ b/src/utils/dlck/tests/SConscript @@ -58,7 +58,9 @@ def build_dlck_vos_cont_recs_get_active(venv): def build_dlck_args_files_ut(venv): """Build dlck_args_files.c test""" venv.require('cmocka') - venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=argp_failure', '-Wl,--wrap=parse_file']) + venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=argp_failure']) + venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=d_calloc']) + venv.AppendUnique(LINKFLAGS=['-Wl,--wrap=d_free']) libs = ['cmocka', 'gurt', 'daos_common_pmem', 'uuid'] srcs = ['dlck_args_files_ut.c', '../dlck_args_files.c'] cppdefines = ['DLCK_UT_BUILD'] diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 985544ca9ce..91cec4f66fe 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -19,28 +19,49 @@ void args_files_init(struct dlck_args_files *args); int args_files_check(struct argp_state *state, struct dlck_args_files *args); +extern struct argp argp_file; /** mocks */ -#define MOCK_ARGP_STATE ((void *)0xDEADBEEF) +struct argp_state Argp_state; +#define MOCK_ARGP_STATE (&Argp_state) struct dlck_file File; -extern struct argp argp_file; +static char mock_arg_str[] = "mock_arg_value"; +#define MOCK_ARG mock_arg_str void __wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) { + assert_ptr_equal(state, MOCK_ARGP_STATE); check_expected(status); check_expected(errnum); assert_non_null(fmt); } int -__wrap_parse_file(const char *arg, struct argp_state *state, struct dlck_file **file_ptr) +parse_file(const char *arg, struct argp_state *state, struct dlck_file **file_ptr) { - memset(&File, 0, sizeof(File)); - uuid_parse("12345678-1234-1234-1234-123456789abc", File.po_uuid); - *file_ptr = &File; - return (int)mock(); + assert_ptr_equal(arg, MOCK_ARG); + assert_ptr_equal(state, MOCK_ARGP_STATE); + assert_non_null(file_ptr); + int rc = mock_type(int); + if (rc == DER_SUCCESS) { + memset(&File, 0, sizeof(File)); + *file_ptr = &File; + } + return rc; +} + +void * +__wrap_d_calloc(size_t count, size_t eltsize) +{ + return test_calloc(count, eltsize); +} + +void +__wrap_d_free(void *ptr) +{ + test_free(ptr); } /* Setup and teardown for dlck_args_files */ @@ -63,13 +84,20 @@ teardown(void **state) struct dlck_args_files *args = *state; dlck_args_files_free(args); - D_FREE(args); - + if (args) { + D_FREE(args); + } return 0; } /** tests */ +static void +test_files_free_empty_list(void **unused) +{ + /** the work is done by setup and teardown functions */; +} + static void test_init_should_initialize_list(void **state) { @@ -79,30 +107,26 @@ test_init_should_initialize_list(void **state) } static void -test_files_free_empty_list() +test_check_should_fail_if_no_files(void **state) { - struct dlck_args_files *args; - D_ALLOC_PTR(args); - assert_non_null(args); + struct dlck_args_files *args = *state; - args_files_init(args); + expect_value(__wrap_argp_failure, status, EINVAL); + expect_value(__wrap_argp_failure, errnum, EINVAL); - dlck_args_files_free(args); - D_FREE(args); + int rc = args_files_check(MOCK_ARGP_STATE, args); + assert_int_equal(rc, EINVAL); } static void -test_check_should_fail_if_no_files(void **state) +test_check_should_succeed_with_file(void **state) { - struct dlck_args_files *args = *state; - struct argp_state *argp_state = MOCK_ARGP_STATE; - assert_ptr_equal(argp_state, MOCK_ARGP_STATE); + struct dlck_args_files *args = *state; - expect_value(__wrap_argp_failure, status, EINVAL); - expect_value(__wrap_argp_failure, errnum, EINVAL); + d_list_add_tail(&File.link, &args->list); - int rc = args_files_check(argp_state, args); - assert_int_equal(rc, EINVAL); + int rc = args_files_check(MOCK_ARGP_STATE, args); + assert_int_equal(rc, 0); } static void @@ -110,19 +134,18 @@ test_parser_should_add_file_to_list(void **state) { struct dlck_args_files *args = *state; - char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1,2,3", NULL}; + memset(&Argp_state, 0, sizeof(Argp_state)); + Argp_state.input = args; - will_return(__wrap_parse_file, DER_SUCCESS); + will_return(parse_file, 0); - int rc = argp_parse(&argp_file, 2, argv, 0, NULL, args); + int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); assert_int_equal(rc, 0); + assert_false(d_list_empty(&args->list)); struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); assert_ptr_equal(file, &File); - - /** cleanup */ - D_FREE(args); } static void @@ -136,24 +159,21 @@ test_free_should_cleanup_list(void **state) d_list_add_tail(&file->link, &args->list); dlck_args_files_free(args); - assert_true(d_list_empty(&args->list)); } static void -test_init_sets_up_list(void **state) +test_free_should_cleanup_multiple_files(void **state) { - struct dlck_args_files args; - memset(&args, 0, sizeof(args)); - - char *argv[] = {"program_name", NULL}; - int argc = 1; + struct dlck_args_files *args = *state; - expect_value(__wrap_argp_failure, status, EINVAL); - expect_value(__wrap_argp_failure, errnum, EINVAL); + for (int i = 0; i < 3; i++) { + struct dlck_file *file; + D_ALLOC_PTR(file); + d_list_add_tail(&file->link, &args->list); + } - int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); - assert_int_equal(rc, EINVAL); - assert_true(d_list_empty(&args.list)); + dlck_args_files_free(args); + assert_true(d_list_empty(&args->list)); } static void @@ -162,14 +182,11 @@ test_parser_end_fails_without_file(void **state) struct dlck_args_files args; args_files_init(&args); - char *argv[] = {"program_name", NULL}; - int argc = 1; - - expect_value(__wrap_argp_failure, status, EINVAL); - expect_value(__wrap_argp_failure, errnum, EINVAL); + will_return(parse_file, EINVAL); - int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); assert_int_equal(rc, EINVAL); + assert_true(d_list_empty(&args.list)); } static void @@ -177,12 +194,11 @@ test_end_succeeds_with_file(void **state) { struct dlck_args_files args; args_files_init(&args); + Argp_state.input = &args; - char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1", NULL}; - int argc = 2; + will_return(parse_file, DER_SUCCESS); - will_return(__wrap_parse_file, DER_SUCCESS); - int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); assert_int_equal(rc, 0); assert_false(d_list_empty(&args.list)); } @@ -193,40 +209,35 @@ test_key_files_parse_file_fails(void **state) struct dlck_args_files args; args_files_init(&args); - char *argv[] = {"program_name", "--file=invalid", NULL}; - int argc = 2; + will_return(parse_file, EINVAL); - will_return(__wrap_parse_file, EINVAL); - int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); + int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); assert_int_equal(rc, EINVAL); assert_true(d_list_empty(&args.list)); } static void -test_success_and_fini_are_noops(void **state) +test_parser_unknown_key_should_return_zero(void **state) { - struct dlck_args_files args; - args_files_init(&args); - - char *argv[] = {"program_name", "--file=12345678-1234-1234-1234-123456789abc,1", NULL}; - int argc = 2; + struct dlck_args_files *args = *state; + Argp_state.input = args; - will_return(__wrap_parse_file, DER_SUCCESS); - int rc = argp_parse(&argp_file, argc, argv, 0, NULL, &args); - assert_int_equal(rc, 0); + int rc = argp_file.parser(9999, NULL, &Argp_state); + assert_int_equal(rc, ARGP_ERR_UNKNOWN); } static const struct CMUnitTest tests_all[] = { - {"DARG100: init", test_init_should_initialize_list, setup, teardown}, - {"DARG101: free empty", test_files_free_empty_list, NULL, NULL}, + {"DARG100: free empty", test_files_free_empty_list, setup, teardown}, + {"DARG101: init", test_init_should_initialize_list, setup, teardown}, {"DARG102: check fail", test_check_should_fail_if_no_files, setup, teardown}, - {"DARG103: parser add", test_parser_should_add_file_to_list, setup, NULL}, - {"DARG104: free list", test_free_should_cleanup_list, setup, teardown}, - {"DARG105: key init", test_init_sets_up_list, setup, teardown}, - {"DARG106: key end fail", test_parser_end_fails_without_file, setup, teardown}, - {"DARG107: key end ok", test_end_succeeds_with_file, setup, teardown}, - {"DARG108: parser fail", test_key_files_parse_file_fails, setup, teardown}, - {"DARG109: success noop", test_success_and_fini_are_noops, setup, teardown}, + {"DARG103: check success", test_check_should_succeed_with_file, setup, NULL}, + {"DARG104: parser add", test_parser_should_add_file_to_list, setup, NULL}, + {"DARG105: free list", test_free_should_cleanup_list, setup, teardown}, + {"DARG106: free list multiple", test_free_should_cleanup_multiple_files, setup, teardown}, + {"DARG107: key end fail", test_parser_end_fails_without_file, setup, teardown}, + {"DARG108: key end ok", test_end_succeeds_with_file, setup, teardown}, + {"DARG109: parser fail", test_key_files_parse_file_fails, setup, teardown}, + {"DARG110: unknown key", test_parser_unknown_key_should_return_zero, setup, teardown}, }; int From 58165e8a76a60d95a5d237d31b98419d6785c2a4 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Mon, 25 Aug 2025 11:31:01 +0200 Subject: [PATCH 13/16] clang fixes Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 91cec4f66fe..8a17c918802 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -18,15 +18,15 @@ void args_files_init(struct dlck_args_files *args); int -args_files_check(struct argp_state *state, struct dlck_args_files *args); + args_files_check(struct argp_state *state, struct dlck_args_files *args); extern struct argp argp_file; /** mocks */ struct argp_state Argp_state; #define MOCK_ARGP_STATE (&Argp_state) -struct dlck_file File; -static char mock_arg_str[] = "mock_arg_value"; +struct dlck_file File; +static char mock_arg_str[] = "mock_arg_value"; #define MOCK_ARG mock_arg_str void From e6f1ea41fed1ad5a7c0c29e483e4affcec463ba4 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Thu, 28 Aug 2025 14:58:37 +0200 Subject: [PATCH 14/16] add new test cases Signed-off-by: Oksana Salyk --- src/utils/dlck/tests/dlck_args_files_ut.c | 203 ++++++++++++---------- 1 file changed, 112 insertions(+), 91 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 8a17c918802..58092fcb7f1 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -26,8 +26,8 @@ extern struct argp argp_file; struct argp_state Argp_state; #define MOCK_ARGP_STATE (&Argp_state) struct dlck_file File; -static char mock_arg_str[] = "mock_arg_value"; -#define MOCK_ARG mock_arg_str +#define MOCK_ARG ((void *)0xDEADBEEF) +struct dlck_args_files Args; void __wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) @@ -64,57 +64,25 @@ __wrap_d_free(void *ptr) test_free(ptr); } -/* Setup and teardown for dlck_args_files */ +/* Setup for dlck_args_files */ static int setup(void **state) { - struct dlck_args_files *args; - - D_ALLOC_PTR(args); - assert_non_null(args); - - args_files_init(args); - *state = args; - return 0; -} - -static int -teardown(void **state) -{ - struct dlck_args_files *args = *state; - - dlck_args_files_free(args); - if (args) { - D_FREE(args); - } + args_files_init(&Args); + Argp_state.input = &Args; + *state = &Args; return 0; } /** tests */ static void -test_files_free_empty_list(void **unused) -{ - /** the work is done by setup and teardown functions */; -} - -static void -test_init_should_initialize_list(void **state) -{ - struct dlck_args_files *args = *state; - - assert_true(d_list_empty(&args->list)); -} - -static void -test_check_should_fail_if_no_files(void **state) +test_check_should_fail_if_no_files(void **unused) { - struct dlck_args_files *args = *state; - expect_value(__wrap_argp_failure, status, EINVAL); expect_value(__wrap_argp_failure, errnum, EINVAL); - int rc = args_files_check(MOCK_ARGP_STATE, args); + int rc = args_files_check(MOCK_ARGP_STATE, &Args); assert_int_equal(rc, EINVAL); } @@ -130,77 +98,94 @@ test_check_should_succeed_with_file(void **state) } static void -test_parser_should_add_file_to_list(void **state) +test_parser_key_init(void **state) { - struct dlck_args_files *args = *state; - - memset(&Argp_state, 0, sizeof(Argp_state)); - Argp_state.input = args; + struct dlck_args_files args; + args_files_init(&args); + struct dlck_file *dummy; + D_ALLOC_PTR(dummy); + d_list_add_tail(&dummy->link, &args.list); + assert_false(d_list_empty(&args.list)); - will_return(parse_file, 0); + Argp_state.input = &args; - int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); + int rc = argp_file.parser(ARGP_KEY_INIT, NULL, &Argp_state); assert_int_equal(rc, 0); - assert_false(d_list_empty(&args->list)); + assert_true(d_list_empty(&args.list)); - struct dlck_file *file = d_list_entry(args->list.next, struct dlck_file, link); - assert_ptr_equal(file, &File); + D_FREE(dummy); } static void -test_free_should_cleanup_list(void **state) +test_parser_end_without_files_triggers_failure(void **unused) { - struct dlck_args_files *args = *state; - - struct dlck_file *file; - D_ALLOC_PTR(file); - - d_list_add_tail(&file->link, &args->list); + expect_value(__wrap_argp_failure, status, EINVAL); + expect_value(__wrap_argp_failure, errnum, EINVAL); - dlck_args_files_free(args); + Argp_state.input = &Args; + int rc = argp_file.parser(ARGP_KEY_END, NULL, &Argp_state); + assert_int_equal(rc, EINVAL); } static void -test_free_should_cleanup_multiple_files(void **state) +test_parser_end_with_files_returns_zero(void **state) { struct dlck_args_files *args = *state; - for (int i = 0; i < 3; i++) { - struct dlck_file *file; - D_ALLOC_PTR(file); - d_list_add_tail(&file->link, &args->list); - } + struct dlck_file *f; + D_ALLOC_PTR(f); + d_list_add_tail(&f->link, &args->list); - dlck_args_files_free(args); - assert_true(d_list_empty(&args->list)); + Argp_state.input = args; + int rc = argp_file.parser(ARGP_KEY_END, NULL, &Argp_state); + + assert_int_equal(rc, 0); + + D_FREE(f); } static void -test_parser_end_fails_without_file(void **state) +test_parser_success_and_fini_are_noop(void **state) { - struct dlck_args_files args; - args_files_init(&args); + struct dlck_args_files *args = *state; - will_return(parse_file, EINVAL); + struct dlck_file *d1, *d2; + D_ALLOC_PTR(d1); + D_ALLOC_PTR(d2); + d_list_add_tail(&d1->link, &args->list); + d_list_add_tail(&d2->link, &args->list); - int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); - assert_int_equal(rc, EINVAL); - assert_true(d_list_empty(&args.list)); + assert_false(d_list_empty(&args->list)); + + Argp_state.input = args; + + /* SUCCESS */ + int rc1 = argp_file.parser(ARGP_KEY_SUCCESS, NULL, &Argp_state); + assert_int_equal(rc1, 0); + assert_false(d_list_empty(&args->list)); + + /* FINI */ + int rc2 = argp_file.parser(ARGP_KEY_FINI, NULL, &Argp_state); + assert_int_equal(rc2, 0); + assert_false(d_list_empty(&args->list)); + + D_FREE(d1); + D_FREE(d2); } static void -test_end_succeeds_with_file(void **state) +test_parser_should_add_file_to_list(void **state) { - struct dlck_args_files args; - args_files_init(&args); - Argp_state.input = &args; - - will_return(parse_file, DER_SUCCESS); + will_return(parse_file, 0); int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); assert_int_equal(rc, 0); - assert_false(d_list_empty(&args.list)); + + assert_false(d_list_empty(&Args.list)); + + struct dlck_file *file = d_list_entry(Args.list.next, struct dlck_file, link); + assert_ptr_equal(file, &File); } static void @@ -226,18 +211,54 @@ test_parser_unknown_key_should_return_zero(void **state) assert_int_equal(rc, ARGP_ERR_UNKNOWN); } +static void +test_files_free_empty_list(void **unused) +{ + assert_true(d_list_empty(&Args.list)); + dlck_args_files_free(&Args); +} + +static void +test_free_should_cleanup_list(void **state) +{ + struct dlck_args_files *args = *state; + + struct dlck_file *file; + D_ALLOC_PTR(file); + + d_list_add_tail(&file->link, &args->list); + + dlck_args_files_free(args); +} + +static void +test_free_should_cleanup_multiple_files(void **state) +{ + struct dlck_args_files *args = *state; + + for (int i = 0; i < 3; i++) { + struct dlck_file *file; + D_ALLOC_PTR(file); + d_list_add_tail(&file->link, &args->list); + } + + dlck_args_files_free(args); + assert_true(d_list_empty(&args->list)); +} + static const struct CMUnitTest tests_all[] = { - {"DARG100: free empty", test_files_free_empty_list, setup, teardown}, - {"DARG101: init", test_init_should_initialize_list, setup, teardown}, - {"DARG102: check fail", test_check_should_fail_if_no_files, setup, teardown}, - {"DARG103: check success", test_check_should_succeed_with_file, setup, NULL}, - {"DARG104: parser add", test_parser_should_add_file_to_list, setup, NULL}, - {"DARG105: free list", test_free_should_cleanup_list, setup, teardown}, - {"DARG106: free list multiple", test_free_should_cleanup_multiple_files, setup, teardown}, - {"DARG107: key end fail", test_parser_end_fails_without_file, setup, teardown}, - {"DARG108: key end ok", test_end_succeeds_with_file, setup, teardown}, - {"DARG109: parser fail", test_key_files_parse_file_fails, setup, teardown}, - {"DARG110: unknown key", test_parser_unknown_key_should_return_zero, setup, teardown}, + {"DARG100: check fail", test_check_should_fail_if_no_files, setup, NULL}, + {"DARG101: check success", test_check_should_succeed_with_file, setup, NULL}, + {"DARG102: key init", test_parser_key_init, setup, NULL}, + {"DARG103: key end fail", test_parser_end_without_files_triggers_failure, setup, NULL}, + {"DARG104: key end", test_parser_end_with_files_returns_zero, setup, NULL}, + {"DARG105: key success and fini", test_parser_success_and_fini_are_noop, setup, NULL}, + {"DARG106: parser add", test_parser_should_add_file_to_list, setup, NULL}, + {"DARG107: parser fail", test_key_files_parse_file_fails, setup, NULL}, + {"DARG108: unknown key", test_parser_unknown_key_should_return_zero, setup, NULL}, + {"DARG109: free empty", test_files_free_empty_list, setup, NULL}, + {"DARG110: free list", test_free_should_cleanup_list, setup, NULL}, + {"DARG111: free list multiple", test_free_should_cleanup_multiple_files, setup, NULL}, }; int From 64b5a4f8c08846edbe2a039273dd11ce52d33174 Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 24 Sep 2025 12:57:33 +0200 Subject: [PATCH 15/16] improve tests --- src/utils/dlck/tests/dlck_args_files_ut.c | 164 +++++++++------------- 1 file changed, 66 insertions(+), 98 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index 58092fcb7f1..b0a6716b8aa 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -21,7 +21,7 @@ int args_files_check(struct argp_state *state, struct dlck_args_files *args); extern struct argp argp_file; -/** mocks */ +/** mocks & globals */ struct argp_state Argp_state; #define MOCK_ARGP_STATE (&Argp_state) @@ -29,6 +29,8 @@ struct dlck_file File; #define MOCK_ARG ((void *)0xDEADBEEF) struct dlck_args_files Args; +#define MOCK_KEY_UKNOWN 9999 + void __wrap_argp_failure(struct argp_state *state, int status, int errnum, const char *fmt, ...) { @@ -45,7 +47,7 @@ parse_file(const char *arg, struct argp_state *state, struct dlck_file **file_pt assert_ptr_equal(state, MOCK_ARGP_STATE); assert_non_null(file_ptr); int rc = mock_type(int); - if (rc == DER_SUCCESS) { + if (rc == 0) { memset(&File, 0, sizeof(File)); *file_ptr = &File; } @@ -64,20 +66,19 @@ __wrap_d_free(void *ptr) test_free(ptr); } -/* Setup for dlck_args_files */ +/** setup (no teardown necessary) */ static int -setup(void **state) +setup(void **unused) { args_files_init(&Args); Argp_state.input = &Args; - *state = &Args; return 0; } /** tests */ static void -test_check_should_fail_if_no_files(void **unused) +test_check_no_files_fail(void **unused) { expect_value(__wrap_argp_failure, status, EINVAL); expect_value(__wrap_argp_failure, errnum, EINVAL); @@ -87,38 +88,27 @@ test_check_should_fail_if_no_files(void **unused) } static void -test_check_should_succeed_with_file(void **state) +test_check_success(void **unused) { - struct dlck_args_files *args = *state; - - d_list_add_tail(&File.link, &args->list); + d_list_add_tail(&File.link, &Args.list); - int rc = args_files_check(MOCK_ARGP_STATE, args); + int rc = args_files_check(MOCK_ARGP_STATE, &Args); assert_int_equal(rc, 0); } static void -test_parser_key_init(void **state) +test_parser_KEY_INIT(void **unused) { - struct dlck_args_files args; - args_files_init(&args); - struct dlck_file *dummy; - D_ALLOC_PTR(dummy); - d_list_add_tail(&dummy->link, &args.list); - assert_false(d_list_empty(&args.list)); - - Argp_state.input = &args; + memset(&Args, 0xf, sizeof(Args)); int rc = argp_file.parser(ARGP_KEY_INIT, NULL, &Argp_state); assert_int_equal(rc, 0); - assert_true(d_list_empty(&args.list)); - - D_FREE(dummy); + assert_true(d_list_empty(&Args.list)); } static void -test_parser_end_without_files_triggers_failure(void **unused) +test_parser_KEY_END_without_files_fails(void **unused) { expect_value(__wrap_argp_failure, status, EINVAL); expect_value(__wrap_argp_failure, errnum, EINVAL); @@ -129,53 +119,38 @@ test_parser_end_without_files_triggers_failure(void **unused) } static void -test_parser_end_with_files_returns_zero(void **state) +test_parser_KEY_END_with_files_success(void **unused) { - struct dlck_args_files *args = *state; - - struct dlck_file *f; - D_ALLOC_PTR(f); - d_list_add_tail(&f->link, &args->list); + d_list_add_tail(&File.link, &Args.list); - Argp_state.input = args; - int rc = argp_file.parser(ARGP_KEY_END, NULL, &Argp_state); + int rc = argp_file.parser(ARGP_KEY_END, NULL, &Argp_state); assert_int_equal(rc, 0); - - D_FREE(f); } static void -test_parser_success_and_fini_are_noop(void **state) +helper_KEY_is_noop(int key) { - struct dlck_args_files *args = *state; - - struct dlck_file *d1, *d2; - D_ALLOC_PTR(d1); - D_ALLOC_PTR(d2); - d_list_add_tail(&d1->link, &args->list); - d_list_add_tail(&d2->link, &args->list); - - assert_false(d_list_empty(&args->list)); - - Argp_state.input = args; - - /* SUCCESS */ - int rc1 = argp_file.parser(ARGP_KEY_SUCCESS, NULL, &Argp_state); - assert_int_equal(rc1, 0); - assert_false(d_list_empty(&args->list)); + d_list_add_tail(&File.link, &Args.list); + int rc = argp_file.parser(key, NULL, &Argp_state); + assert_int_equal(rc, 0); + assert_false(d_list_empty(&Args.list)); +} - /* FINI */ - int rc2 = argp_file.parser(ARGP_KEY_FINI, NULL, &Argp_state); - assert_int_equal(rc2, 0); - assert_false(d_list_empty(&args->list)); +static void +test_parser_KEY_SUCCESS_is_noop(void **unused) +{ + helper_KEY_is_noop(ARGP_KEY_SUCCESS); +} - D_FREE(d1); - D_FREE(d2); +static void +test_parser_KEY_FINI_is_noop(void **unused) +{ + helper_KEY_is_noop(ARGP_KEY_FINI); } static void -test_parser_should_add_file_to_list(void **state) +test_KEY_FILE_success(void **unused) { will_return(parse_file, 0); @@ -189,25 +164,19 @@ test_parser_should_add_file_to_list(void **state) } static void -test_key_files_parse_file_fails(void **state) +test_KEY_FILE_fail(void **unused) { - struct dlck_args_files args; - args_files_init(&args); - will_return(parse_file, EINVAL); int rc = argp_file.parser(KEY_FILES, MOCK_ARG, &Argp_state); assert_int_equal(rc, EINVAL); - assert_true(d_list_empty(&args.list)); + assert_true(d_list_empty(&Args.list)); } static void -test_parser_unknown_key_should_return_zero(void **state) +test_KEY_UNKNOWN_fail(void **unused) { - struct dlck_args_files *args = *state; - Argp_state.input = args; - - int rc = argp_file.parser(9999, NULL, &Argp_state); + int rc = argp_file.parser(MOCK_KEY_UKNOWN, NULL, &Argp_state); assert_int_equal(rc, ARGP_ERR_UNKNOWN); } @@ -216,49 +185,48 @@ test_files_free_empty_list(void **unused) { assert_true(d_list_empty(&Args.list)); dlck_args_files_free(&Args); + assert_true(d_list_empty(&Args.list)); } static void -test_free_should_cleanup_list(void **state) +helper_files_free(int file_num) { - struct dlck_args_files *args = *state; - - struct dlck_file *file; - D_ALLOC_PTR(file); - - d_list_add_tail(&file->link, &args->list); + for (int i = 0; i < file_num; i++) { + struct dlck_file *file; + D_ALLOC_PTR(file); + d_list_add_tail(&file->link, &Args.list); + } - dlck_args_files_free(args); + dlck_args_files_free(&Args); + assert_true(d_list_empty(&Args.list)); } static void -test_free_should_cleanup_multiple_files(void **state) +test_files_free_one_file(void **unused) { - struct dlck_args_files *args = *state; - - for (int i = 0; i < 3; i++) { - struct dlck_file *file; - D_ALLOC_PTR(file); - d_list_add_tail(&file->link, &args->list); - } + helper_files_free(1); +} - dlck_args_files_free(args); - assert_true(d_list_empty(&args->list)); +static void +test_files_free_three_files(void **state) +{ + helper_files_free(3); } static const struct CMUnitTest tests_all[] = { - {"DARG100: check fail", test_check_should_fail_if_no_files, setup, NULL}, - {"DARG101: check success", test_check_should_succeed_with_file, setup, NULL}, - {"DARG102: key init", test_parser_key_init, setup, NULL}, - {"DARG103: key end fail", test_parser_end_without_files_triggers_failure, setup, NULL}, - {"DARG104: key end", test_parser_end_with_files_returns_zero, setup, NULL}, - {"DARG105: key success and fini", test_parser_success_and_fini_are_noop, setup, NULL}, - {"DARG106: parser add", test_parser_should_add_file_to_list, setup, NULL}, - {"DARG107: parser fail", test_key_files_parse_file_fails, setup, NULL}, - {"DARG108: unknown key", test_parser_unknown_key_should_return_zero, setup, NULL}, - {"DARG109: free empty", test_files_free_empty_list, setup, NULL}, - {"DARG110: free list", test_free_should_cleanup_list, setup, NULL}, - {"DARG111: free list multiple", test_free_should_cleanup_multiple_files, setup, NULL}, + {"ARGFILES100: args_files_check() no files", test_check_no_files_fail, setup, NULL}, + {"ARGFILES101: args_files_check() success", test_check_success, setup, NULL}, + {"ARGFILES102: parser ARGP_KEY_INIT", test_parser_KEY_INIT, setup, NULL}, + {"ARGFILES103: parser ARGP_KEY_END no files", test_parser_KEY_END_without_files_fails, setup, NULL}, + {"ARGFILES104: parser ARGP_KEY_END success", test_parser_KEY_END_with_files_success, setup, NULL}, + {"ARGFILES105: parser ARGP_KEY_SUCCESS noop", test_parser_KEY_SUCCESS_is_noop, setup, NULL}, + {"ARGFILES106: parser ARGP_KEY_FINI noop", test_parser_KEY_FINI_is_noop, setup, NULL}, + {"ARGFILES107: KEY_FILES success", test_KEY_FILE_success, setup, NULL}, + {"ARGFILES108: KEY_FILES fail", test_KEY_FILE_fail, setup, NULL}, + {"ARGFILES109: unknown key", test_KEY_UNKNOWN_fail, setup, NULL}, + {"ARGFILES110: dlck_args_files_free() no files", test_files_free_empty_list, setup, NULL}, + {"ARGFILES111: dlck_args_files_free() one file", test_files_free_one_file, setup, NULL}, + {"ARGFILES112: dlck_args_files_free() multiple files", test_files_free_three_files, setup, NULL}, }; int From d3f6a76ac8550ab42afb9908690ed9311c216dfa Mon Sep 17 00:00:00 2001 From: Oksana Salyk Date: Wed, 24 Sep 2025 13:54:51 +0200 Subject: [PATCH 16/16] apply clang-format changes --- src/utils/dlck/tests/dlck_args_files_ut.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/utils/dlck/tests/dlck_args_files_ut.c b/src/utils/dlck/tests/dlck_args_files_ut.c index b0a6716b8aa..91109fbcf47 100644 --- a/src/utils/dlck/tests/dlck_args_files_ut.c +++ b/src/utils/dlck/tests/dlck_args_files_ut.c @@ -217,16 +217,19 @@ static const struct CMUnitTest tests_all[] = { {"ARGFILES100: args_files_check() no files", test_check_no_files_fail, setup, NULL}, {"ARGFILES101: args_files_check() success", test_check_success, setup, NULL}, {"ARGFILES102: parser ARGP_KEY_INIT", test_parser_KEY_INIT, setup, NULL}, - {"ARGFILES103: parser ARGP_KEY_END no files", test_parser_KEY_END_without_files_fails, setup, NULL}, - {"ARGFILES104: parser ARGP_KEY_END success", test_parser_KEY_END_with_files_success, setup, NULL}, - {"ARGFILES105: parser ARGP_KEY_SUCCESS noop", test_parser_KEY_SUCCESS_is_noop, setup, NULL}, + {"ARGFILES103: parser ARGP_KEY_END no files", test_parser_KEY_END_without_files_fails, setup, + NULL}, + {"ARGFILES104: parser ARGP_KEY_END success", test_parser_KEY_END_with_files_success, setup, + NULL}, + {"ARGFILES105: parser ARGP_KEY_SUCCESS noop", test_parser_KEY_SUCCESS_is_noop, setup, NULL}, {"ARGFILES106: parser ARGP_KEY_FINI noop", test_parser_KEY_FINI_is_noop, setup, NULL}, - {"ARGFILES107: KEY_FILES success", test_KEY_FILE_success, setup, NULL}, + {"ARGFILES107: KEY_FILES success", test_KEY_FILE_success, setup, NULL}, {"ARGFILES108: KEY_FILES fail", test_KEY_FILE_fail, setup, NULL}, {"ARGFILES109: unknown key", test_KEY_UNKNOWN_fail, setup, NULL}, {"ARGFILES110: dlck_args_files_free() no files", test_files_free_empty_list, setup, NULL}, {"ARGFILES111: dlck_args_files_free() one file", test_files_free_one_file, setup, NULL}, - {"ARGFILES112: dlck_args_files_free() multiple files", test_files_free_three_files, setup, NULL}, + {"ARGFILES112: dlck_args_files_free() multiple files", test_files_free_three_files, setup, + NULL}, }; int