| // 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(); |
| } |
| } |
| } |