// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) #include "test_progs.h" #include "testing_helpers.h" static void clear_test_state(struct test_state *state) { state->error_cnt = 0; state->sub_succ_cnt = 0; state->skip_cnt = 0; } void test_prog_tests_framework(void) { struct test_state *state = env.test_state; /* in all the ASSERT calls below we need to return on the first * error due to the fact that we are cleaning the test state after * each dummy subtest */ /* test we properly count skipped tests with subtests */ if (test__start_subtest("test_good_subtest")) test__end_subtest(); if (!ASSERT_EQ(state->skip_cnt, 0, "skip_cnt_check")) return; if (!ASSERT_EQ(state->error_cnt, 0, "error_cnt_check")) return; if (!ASSERT_EQ(state->subtest_num, 1, "subtest_num_check")) return; clear_test_state(state); if (test__start_subtest("test_skip_subtest")) { test__skip(); test__end_subtest(); } if (test__start_subtest("test_skip_subtest")) { test__skip(); test__end_subtest(); } if (!ASSERT_EQ(state->skip_cnt, 2, "skip_cnt_check")) return; if (!ASSERT_EQ(state->subtest_num, 3, "subtest_num_check")) return; clear_test_state(state); if (test__start_subtest("test_fail_subtest")) { test__fail(); test__end_subtest(); } if (!ASSERT_EQ(state->error_cnt, 1, "error_cnt_check")) return; if (!ASSERT_EQ(state->subtest_num, 4, "subtest_num_check")) return; clear_test_state(state); } static void dummy_emit(const char *buf, bool force) {} void test_prog_tests_framework_expected_msgs(void) { struct expected_msgs msgs; int i, j, error_cnt; const struct { const char *name; const char *log; const char *expected; struct expect_msg *pats; } cases[] = { { .name = "simple-ok", .log = "aaabbbccc", .pats = (struct expect_msg[]) { { .substr = "aaa" }, { .substr = "ccc" }, {} } }, { .name = "simple-fail", .log = "aaabbbddd", .expected = "MATCHED SUBSTR: 'aaa'\n" "EXPECTED SUBSTR: 'ccc'\n", .pats = (struct expect_msg[]) { { .substr = "aaa" }, { .substr = "ccc" }, {} } }, { .name = "negative-ok-mid", .log = "aaabbbccc", .pats = (struct expect_msg[]) { { .substr = "aaa" }, { .substr = "foo", .negative = true }, { .substr = "bar", .negative = true }, { .substr = "ccc" }, {} } }, { .name = "negative-ok-tail", .log = "aaabbbccc", .pats = (struct expect_msg[]) { { .substr = "aaa" }, { .substr = "foo", .negative = true }, {} } }, { .name = "negative-ok-head", .log = "aaabbbccc", .pats = (struct expect_msg[]) { { .substr = "foo", .negative = true }, { .substr = "ccc" }, {} } }, { .name = "negative-fail-head", .log = "aaabbbccc", .expected = "UNEXPECTED SUBSTR: 'aaa'\n", .pats = (struct expect_msg[]) { { .substr = "aaa", .negative = true }, { .substr = "bbb" }, {} } }, { .name = "negative-fail-tail", .log = "aaabbbccc", .expected = "UNEXPECTED SUBSTR: 'ccc'\n", .pats = (struct expect_msg[]) { { .substr = "bbb" }, { .substr = "ccc", .negative = true }, {} } }, { .name = "negative-fail-mid-1", .log = "aaabbbccc", .expected = "UNEXPECTED SUBSTR: 'bbb'\n", .pats = (struct expect_msg[]) { { .substr = "aaa" }, { .substr = "bbb", .negative = true }, { .substr = "ccc" }, {} } }, { .name = "negative-fail-mid-2", .log = "aaabbb222ccc", .expected = "UNEXPECTED SUBSTR: '222'\n", .pats = (struct expect_msg[]) { { .substr = "aaa" }, { .substr = "222", .negative = true }, { .substr = "bbb", .negative = true }, { .substr = "ccc" }, {} } } }; for (i = 0; i < ARRAY_SIZE(cases); i++) { if (test__start_subtest(cases[i].name)) { error_cnt = env.subtest_state->error_cnt; msgs.patterns = cases[i].pats; msgs.cnt = 0; for (j = 0; cases[i].pats[j].substr; j++) msgs.cnt++; validate_msgs(cases[i].log, &msgs, dummy_emit); fflush(stderr); env.subtest_state->error_cnt = error_cnt; if (cases[i].expected) ASSERT_HAS_SUBSTR(env.subtest_state->log_buf, cases[i].expected, "expected output"); else ASSERT_STREQ(env.subtest_state->log_buf, "", "expected no output"); test__end_subtest(); } } }