From b5aa52ad536e05332e56ee08442df6769270b1ca Mon Sep 17 00:00:00 2001 From: Tomasz Gromadzki Date: Tue, 12 Mar 2024 08:27:01 +0100 Subject: [PATCH] test: pmemobj_log_function UT scaffolding Signed-off-by: Tomasz Gromadzki --- src/test/Makefile | 1 + src/test/obj_log_function/.gitignore | 1 + src/test/obj_log_function/Makefile | 16 ++++ src/test/obj_log_function/TESTS.py | 27 ++++++ src/test/obj_log_function/obj_log_function.c | 92 ++++++++++++++++++++ 5 files changed, 137 insertions(+) create mode 100644 src/test/obj_log_function/.gitignore create mode 100644 src/test/obj_log_function/Makefile create mode 100755 src/test/obj_log_function/TESTS.py create mode 100644 src/test/obj_log_function/obj_log_function.c diff --git a/src/test/Makefile b/src/test/Makefile index 0cfdff1d793..87f07d65dda 100644 --- a/src/test/Makefile +++ b/src/test/Makefile @@ -62,6 +62,7 @@ OBJ_TESTS = \ obj_list_valgrind\ obj_list_macro\ obj_locks\ + obj_log_function\ obj_mem\ obj_memblock\ obj_memcheck\ diff --git a/src/test/obj_log_function/.gitignore b/src/test/obj_log_function/.gitignore new file mode 100644 index 00000000000..c72c292afa2 --- /dev/null +++ b/src/test/obj_log_function/.gitignore @@ -0,0 +1 @@ +obj_log_function diff --git a/src/test/obj_log_function/Makefile b/src/test/obj_log_function/Makefile new file mode 100644 index 00000000000..cf3ad5892fa --- /dev/null +++ b/src/test/obj_log_function/Makefile @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2024, Intel Corporation + +TARGET = obj_log_function +OBJS = obj_log_function.o + +BUILD_STATIC_DEBUG=n +BUILD_STATIC_NONDEBUG=n + +# 'internal' is required for proper mock integration +# 'debug' is required for debug version of core/log.o that provides +# implementation of 'out_log()' that is used by 'ut_log_function()' +LIBPMEMOBJ=internal-debug + +include ../Makefile.inc +LDFLAGS += $(call extract_funcs, obj_log_function.c) diff --git a/src/test/obj_log_function/TESTS.py b/src/test/obj_log_function/TESTS.py new file mode 100755 index 00000000000..1cce057d829 --- /dev/null +++ b/src/test/obj_log_function/TESTS.py @@ -0,0 +1,27 @@ +#!../env.py +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2024, Intel Corporation +# + + +import testframework as t +from testframework import granularity as g + + +@g.require_granularity(g.ANY) +# The 'debug' build is chosen arbitrarily to ensure these tests are run only +# once. No dynamic libraries are used nor .static_* builds are available. +@t.require_build('debug') +class CORE_LOG(t.BaseTest): + test_type = t.Short + + def run(self, ctx): + ctx.exec('obj_log_function', self.test_case) + + +class TEST0(CORE_LOG): + test_case = 'test_set_log_function' + + +class TEST1(CORE_LOG): + test_case = 'test_set_log_function_EAGAIN' diff --git a/src/test/obj_log_function/obj_log_function.c b/src/test/obj_log_function/obj_log_function.c new file mode 100644 index 00000000000..91873d450aa --- /dev/null +++ b/src/test/obj_log_function/obj_log_function.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: BSD-3-Clause +/* Copyright 2024, Intel Corporation */ + +/* + * core_log_default_function.c -- unit test for core_log_default_function + */ + +#undef _GNU_SOURCE +#include +#include +#include + +#include "unittest.h" +#include "log_internal.h" +#include "log_default.h" +#include "libpmemobj/log.h" + +#define NO_ARGS_CONSUMED 0 + +#define VALIDATED_CALL 127 +#define CALLED (VALIDATED_CALL + 1) + +#define PMEMOBJ_LOG_CUSTOM_FUNCTION_MOCK ((pmemobj_log_function *) 0xA1C5D68F) + +static struct { + int ret; +} Core_log_set_function; + +FUNC_MOCK(core_log_set_function, int, core_log_function *log_function) + FUNC_MOCK_RUN(VALIDATED_CALL) { + UT_ASSERT((void *)log_function == + (void *)PMEMOBJ_LOG_CUSTOM_FUNCTION_MOCK); + return Core_log_set_function.ret; + } +FUNC_MOCK_RUN_DEFAULT { + return _FUNC_REAL(core_log_set_function)(log_function); +} +FUNC_MOCK_END + +/* + * Check: + * - if core_log_set_function is called with proper argument + * - if pmemobj_log_set_function return 0 (no error) + * - no errno is set + */ +static int +test_set_log_function(const struct test_case *tc, int argc, char *argv[]) +{ + errno = NO_ERRNO; + Core_log_set_function.ret = 0; + FUNC_MOCK_RCOUNTER_SET(core_log_set_function, VALIDATED_CALL); + int ret = pmemobj_log_set_function(PMEMOBJ_LOG_CUSTOM_FUNCTION_MOCK); + UT_ASSERTeq(ret, 0); + UT_ASSERTeq(errno, NO_ERRNO); + UT_ASSERTeq(RCOUNTER(core_log_set_function), CALLED); + + return NO_ARGS_CONSUMED; +} + +/* + * core_log_set_function() with EAGAIN error + * Check: + * - if core_log_set_function is called with proper argument + * - if pmemobj_log_set_function return 1 (error via errno) + * - errno is set to EAGAIN + */ +static int +test_set_log_function_EAGAIN(const struct test_case *tc, int argc, char *argv[]) +{ + errno = NO_ERRNO; + Core_log_set_function.ret = EAGAIN; + FUNC_MOCK_RCOUNTER_SET(core_log_set_function, VALIDATED_CALL); + int ret = pmemobj_log_set_function(PMEMOBJ_LOG_CUSTOM_FUNCTION_MOCK); + UT_ASSERTeq(ret, 1); + UT_ASSERTeq(errno, EAGAIN); + UT_ASSERTeq(RCOUNTER(core_log_set_function), CALLED); + + return NO_ARGS_CONSUMED; +} + +static struct test_case test_cases[] = { + TEST_CASE(test_set_log_function), + TEST_CASE(test_set_log_function_EAGAIN), +}; + +int +main(int argc, char *argv[]) +{ + START(argc, argv, "obj_log_function"); + TEST_CASE_PROCESS(argc, argv, test_cases, ARRAY_SIZE(test_cases)); + DONE(NULL); +}