Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
3#include "test_progs.h"
4#include "testing_helpers.h"
5
6static void clear_test_state(struct test_state *state)
7{
8 state->error_cnt = 0;
9 state->sub_succ_cnt = 0;
10 state->skip_cnt = 0;
11}
12
13void test_prog_tests_framework(void)
14{
15 struct test_state *state = env.test_state;
16
17 /* in all the ASSERT calls below we need to return on the first
18 * error due to the fact that we are cleaning the test state after
19 * each dummy subtest
20 */
21
22 /* test we properly count skipped tests with subtests */
23 if (test__start_subtest("test_good_subtest"))
24 test__end_subtest();
25 if (!ASSERT_EQ(state->skip_cnt, 0, "skip_cnt_check"))
26 return;
27 if (!ASSERT_EQ(state->error_cnt, 0, "error_cnt_check"))
28 return;
29 if (!ASSERT_EQ(state->subtest_num, 1, "subtest_num_check"))
30 return;
31 clear_test_state(state);
32
33 if (test__start_subtest("test_skip_subtest")) {
34 test__skip();
35 test__end_subtest();
36 }
37 if (test__start_subtest("test_skip_subtest")) {
38 test__skip();
39 test__end_subtest();
40 }
41 if (!ASSERT_EQ(state->skip_cnt, 2, "skip_cnt_check"))
42 return;
43 if (!ASSERT_EQ(state->subtest_num, 3, "subtest_num_check"))
44 return;
45 clear_test_state(state);
46
47 if (test__start_subtest("test_fail_subtest")) {
48 test__fail();
49 test__end_subtest();
50 }
51 if (!ASSERT_EQ(state->error_cnt, 1, "error_cnt_check"))
52 return;
53 if (!ASSERT_EQ(state->subtest_num, 4, "subtest_num_check"))
54 return;
55 clear_test_state(state);
56}
57
58static void dummy_emit(const char *buf, bool force) {}
59
60void test_prog_tests_framework_expected_msgs(void)
61{
62 struct expected_msgs msgs;
63 int i, j, error_cnt;
64 const struct {
65 const char *name;
66 const char *log;
67 const char *expected;
68 struct expect_msg *pats;
69 } cases[] = {
70 {
71 .name = "simple-ok",
72 .log = "aaabbbccc",
73 .pats = (struct expect_msg[]) {
74 { .substr = "aaa" },
75 { .substr = "ccc" },
76 {}
77 }
78 },
79 {
80 .name = "simple-fail",
81 .log = "aaabbbddd",
82 .expected = "MATCHED SUBSTR: 'aaa'\n"
83 "EXPECTED SUBSTR: 'ccc'\n",
84 .pats = (struct expect_msg[]) {
85 { .substr = "aaa" },
86 { .substr = "ccc" },
87 {}
88 }
89 },
90 {
91 .name = "negative-ok-mid",
92 .log = "aaabbbccc",
93 .pats = (struct expect_msg[]) {
94 { .substr = "aaa" },
95 { .substr = "foo", .negative = true },
96 { .substr = "bar", .negative = true },
97 { .substr = "ccc" },
98 {}
99 }
100 },
101 {
102 .name = "negative-ok-tail",
103 .log = "aaabbbccc",
104 .pats = (struct expect_msg[]) {
105 { .substr = "aaa" },
106 { .substr = "foo", .negative = true },
107 {}
108 }
109 },
110 {
111 .name = "negative-ok-head",
112 .log = "aaabbbccc",
113 .pats = (struct expect_msg[]) {
114 { .substr = "foo", .negative = true },
115 { .substr = "ccc" },
116 {}
117 }
118 },
119 {
120 .name = "negative-fail-head",
121 .log = "aaabbbccc",
122 .expected = "UNEXPECTED SUBSTR: 'aaa'\n",
123 .pats = (struct expect_msg[]) {
124 { .substr = "aaa", .negative = true },
125 { .substr = "bbb" },
126 {}
127 }
128 },
129 {
130 .name = "negative-fail-tail",
131 .log = "aaabbbccc",
132 .expected = "UNEXPECTED SUBSTR: 'ccc'\n",
133 .pats = (struct expect_msg[]) {
134 { .substr = "bbb" },
135 { .substr = "ccc", .negative = true },
136 {}
137 }
138 },
139 {
140 .name = "negative-fail-mid-1",
141 .log = "aaabbbccc",
142 .expected = "UNEXPECTED SUBSTR: 'bbb'\n",
143 .pats = (struct expect_msg[]) {
144 { .substr = "aaa" },
145 { .substr = "bbb", .negative = true },
146 { .substr = "ccc" },
147 {}
148 }
149 },
150 {
151 .name = "negative-fail-mid-2",
152 .log = "aaabbb222ccc",
153 .expected = "UNEXPECTED SUBSTR: '222'\n",
154 .pats = (struct expect_msg[]) {
155 { .substr = "aaa" },
156 { .substr = "222", .negative = true },
157 { .substr = "bbb", .negative = true },
158 { .substr = "ccc" },
159 {}
160 }
161 }
162 };
163
164 for (i = 0; i < ARRAY_SIZE(cases); i++) {
165 if (test__start_subtest(cases[i].name)) {
166 error_cnt = env.subtest_state->error_cnt;
167 msgs.patterns = cases[i].pats;
168 msgs.cnt = 0;
169 for (j = 0; cases[i].pats[j].substr; j++)
170 msgs.cnt++;
171 validate_msgs(cases[i].log, &msgs, dummy_emit);
172 fflush(stderr);
173 env.subtest_state->error_cnt = error_cnt;
174 if (cases[i].expected)
175 ASSERT_HAS_SUBSTR(env.subtest_state->log_buf, cases[i].expected, "expected output");
176 else
177 ASSERT_STREQ(env.subtest_state->log_buf, "", "expected no output");
178 test__end_subtest();
179 }
180 }
181}