File Index
Files and directories
Sign in
FILE

prog_tests_framework.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/bpf/prog_tests/prog_tests_framework.c C
  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}
~/ Read-only file preview.