1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Copyright (c) 2020 Cyril Hrubis <[email protected]>
4 * Copyright (c) Linux Test Project, 2021-2024
5 */
6
7 /*
8 * Test macros:
9 *
10 * - TST_EXP_FAIL
11 * - TST_EXP_FAIL_ARR
12 * - TST_EXP_FAIL2
13 * - TST_EXP_FAIL2_ARR
14 * - TST_EXP_FAIL_PTR_NULL
15 * - TST_EXP_FAIL_PTR_NULL_ARR
16 * - TST_EXP_FAIL_PTR_VOID
17 * - TST_EXP_FAIL_PTR_VOID_ARR
18 */
19
20 #include "tst_test.h"
21
fail_fn(void)22 static int fail_fn(void)
23 {
24 errno = EINVAL;
25 return -1;
26 }
27
pass_fn(void)28 static int pass_fn(void)
29 {
30 return 0;
31 }
32
inval_ret_fn(void)33 static int inval_ret_fn(void)
34 {
35 return 42;
36 }
37
fail_fn_null(void)38 static char *fail_fn_null(void)
39 {
40 errno = EINVAL;
41 return NULL;
42 }
43
fail_fn_void(void)44 static char *fail_fn_void(void)
45 {
46 errno = EINVAL;
47 return (void *)-1;
48 }
49
inval_ret_fn_char(void)50 static char *inval_ret_fn_char(void)
51 {
52 return (void *)-1;
53 }
54
pass_fn_char(void)55 static char *pass_fn_char(void)
56 {
57 return "pass";
58 }
59
60 #define TEST_MACRO(macro, macro_arr, fail_fn, pass_fn, inval_fn) \
61 do { \
62 tst_res(TINFO, "Testing " #macro " macro"); \
63 macro(fail_fn(), EINVAL, #fail_fn"()"); \
64 tst_res(TINFO, "TST_PASS = %i", TST_PASS); \
65 macro(fail_fn(), ENOTTY); /* skip msg parameter */ \
66 tst_res(TINFO, "TST_PASS = %i", TST_PASS); \
67 macro(pass_fn(), ENOTTY, #pass_fn"()"); \
68 tst_res(TINFO, "TST_PASS = %i", TST_PASS); \
69 macro(inval_fn(), ENOTTY, #inval_fn"()"); \
70 tst_res(TINFO, "TST_PASS = %i", TST_PASS); \
71 macro_arr(fail_fn(), exp_errs_pass, ARRAY_SIZE(exp_errs_pass), #fail_fn"()"); \
72 tst_res(TINFO, "TST_PASS = %i", TST_PASS); \
73 macro_arr(fail_fn(), exp_errs_fail, ARRAY_SIZE(exp_errs_fail)); /* skip msg parameter */ \
74 tst_res(TINFO, "TST_PASS = %i", TST_PASS); \
75 } while (0)
76
do_test(void)77 static void do_test(void)
78 {
79 const int exp_errs_pass[] = {ENOTTY, EINVAL};
80 const int exp_errs_fail[] = {ENOTTY, EISDIR};
81
82 TEST_MACRO(TST_EXP_FAIL, TST_EXP_FAIL_ARR, fail_fn, pass_fn, inval_ret_fn);
83 TEST_MACRO(TST_EXP_FAIL2, TST_EXP_FAIL2_ARR, fail_fn, pass_fn, inval_ret_fn);
84 TEST_MACRO(TST_EXP_FAIL_PTR_NULL, TST_EXP_FAIL_PTR_NULL_ARR, fail_fn_null,
85 pass_fn_char, inval_ret_fn_char);
86 TEST_MACRO(TST_EXP_FAIL_PTR_VOID, TST_EXP_FAIL_PTR_VOID_ARR, fail_fn_void,
87 pass_fn_char, inval_ret_fn_char);
88 }
89
90 static struct tst_test test = {
91 .test_all = do_test,
92 };
93