[LTP] [RFC PATCH 1/2] lib: add TST_RES_ serious macros

Li Wang liwang@redhat.com
Wed Jun 26 12:54:30 CEST 2024


This patch introduces new macros to encapsulate existing tst_res and
tst_brk functions in the LTP library. These macros simplify the usage
of tst_ functions by providing a more user-friendly interface for
generating standardized test output.

  TST_RES_TINFO()    -> tst_res(TINFO, ...)
  TST_RES_TWARN()    -> tst_res(TINFO, "WARNING: ", ...)
  TST_RES_TPASS()    -> tst_res(TPASS, ...)
  TST_RES_TDEBUG()   -> tst_res(TDEBUG, ...)
  TST_RES_TFAIL()    -> tst_res(TFAIL,  ...)

  TST_BRK_TCONF()    -> tst_brk(TCONF, ...)
  TST_BRK_TBROK()    -> tst_brk(TBROK,  ...)

  TST_RES_TPASS_ER() -> tst_res(TPASS | errno, ...)
  TST_RES_TFAIL_ER() -> tst_res(TFAIL | errno, ...)
  TST_BRK_TBROK_ER() -> tst_brk(TBROK | errno, ... )

The macros handle various scenarios including simple messages and messages
with error flags, ensuring consistent logging of file and line information.

Additionally, a new test case in tst_res_macros.c demonstrates the usage
of these macros.

Signed-off-by: Li Wang <liwang@redhat.com>
---

Notes:
    At the begining I wanted to implement one macro to implement functionality
    like handling both messages and printing errno with the message. Still,
    after trying some complex macro definition usages I found that this made
    things too complex and confusing, so why not define more macros for special
    use, and then this patch was signed.
    
    Maybe something like TST_RES_TFAIL_ER is not a good name, but please help to
    give another, or any advise will be appreciated.

 include/tst_test_macros.h         | 34 +++++++++++++++++++++
 lib/newlib_tests/tst_res_macros.c | 50 +++++++++++++++++++++++++++++++
 2 files changed, 84 insertions(+)
 create mode 100644 lib/newlib_tests/tst_res_macros.c

diff --git a/include/tst_test_macros.h b/include/tst_test_macros.h
index 22b39fb14..e36df9c0d 100644
--- a/include/tst_test_macros.h
+++ b/include/tst_test_macros.h
@@ -368,4 +368,38 @@ const char *tst_errno_names(char *buf, const int *exp_errs, int exp_errs_cnt);
 #define TST_EXP_EQ_SSZ(VAL_A, VAL_B) \
 		TST_EXP_EQ_(VAL_A, #VAL_A, VAL_B, #VAL_B, ssize_t, "%zi")
 
+/* Test result print macros */
+#define TST_RES_TINFO(MESSAGE, ...) \
+	tst_res(TINFO, MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TCONF(MESSAGE, ...) \
+	tst_res(TCONF, MESSAGE, ##__VA_ARGS__)
+
+#define TST_BRK_TCONF(MESSAGE, ...) \
+	tst_brk(TCONF, MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TWARN(MESSAGE, ...) \
+	tst_res(TINFO, "WARNING: "MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TPASS(MESSAGE, ...) \
+	tst_res(TPASS, MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TPASS_ER(flag, MESSAGE, ...) \
+	tst_res(TPASS | flag, MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TDEBUG(MESSAGE, ...) \
+	tst_res(TDEBUG, MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TFAIL(MESSAGE, ...) \
+	tst_res(TFAIL, MESSAGE, ##__VA_ARGS__)
+
+#define TST_RES_TFAIL_ER(flag, MESSAGE, ...) \
+	tst_res(TFAIL | flag, MESSAGE, ##__VA_ARGS__)
+
+#define TST_BRK_TBROK(MESSAGE, ...) \
+	tst_brk(TBROK, MESSAGE, ##__VA_ARGS__)
+
+#define TST_BRK_TBROK_ER(flag, MESSAGE, ...) \
+	tst_brk(TBROK | flag, MESSAGE, ##__VA_ARGS__)
+
 #endif	/* TST_TEST_MACROS_H__ */
diff --git a/lib/newlib_tests/tst_res_macros.c b/lib/newlib_tests/tst_res_macros.c
new file mode 100644
index 000000000..74b656da0
--- /dev/null
+++ b/lib/newlib_tests/tst_res_macros.c
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2024 Li Wang <liwang@redhat.com>
+ */
+
+#include "tst_test.h"
+
+static void do_test(void)
+{
+	int i = 10, j = 20;
+	char *str = "test";
+
+	TST_RES_TINFO("message");
+	TST_RES_TINFO("message, i = %d", i);
+	TST_RES_TDEBUG("message, i = %d", i);
+
+	TST_RES_TPASS("message");
+	TST_RES_TPASS("message, i = %d, j = %d, str = %s", i, j, str);
+	TST_RES_TPASS_ER(TTERRNO, "message, i = %d, j = %d", i, j);
+
+	TST_RES_TWARN("message");
+	TST_RES_TWARN("message, i = %d", i);
+
+	TST_RES_TFAIL("message");
+	TST_RES_TFAIL("message, i = %d, j = %d", i, j);
+
+	TST_RES_TFAIL_ER(TERRNO, "message");
+	TST_RES_TFAIL_ER(TERRNO, "message, i = %d, j = %d", i, j);
+	TST_RES_TFAIL_ER(TERRNO, "message, i = %d, str = %s", i, str);
+
+	TST_RES_TFAIL_ER(TTERRNO, "message");
+	TST_RES_TFAIL_ER(TTERRNO, "message, i = %d", i);
+	TST_RES_TFAIL_ER(TTERRNO, "message, i = %d, str = %s", i, str);
+
+	TST_BRK_TBROK("message");
+	TST_BRK_TBROK("message, i = %d, j = %d", i, j);
+
+	TST_BRK_TBROK_ER(TERRNO, "message");
+	TST_BRK_TBROK_ER(TERRNO, "message, i = %d, str = %s", i, str);
+
+	TST_BRK_TBROK_ER(TTERRNO, "message");
+	TST_BRK_TBROK_ER(TTERRNO, "message, i = %d", i);
+	TST_BRK_TBROK_ER(TTERRNO, "message, i = %d, str = %s", i, str);
+
+	TST_BRK_TCONF("message, i = %d, j = %d, str = %s", i, j, str);
+}
+
+static struct tst_test test = {
+	.test_all = do_test,
+};
-- 
2.45.2



More information about the ltp mailing list