// SPDX-License-Identifier: GPL-2.0 #define _GNU_SOURCE #include #include #include "../../src/actions.h" static struct actions actions_fixture; static void actions_fixture_setup(void) { actions_init(&actions_fixture); } static void actions_fixture_teardown(void) { actions_destroy(&actions_fixture); } START_TEST(test_actions_init) { struct actions actions; actions_init(&actions); ck_assert_int_eq(actions.len, 0); ck_assert_int_eq(actions.size, action_default_size); ck_assert(!actions.continue_flag); ck_assert_ptr_eq(actions.trace_output_inst, NULL); } END_TEST START_TEST(test_actions_destroy) { struct actions actions; actions_init(&actions); actions_destroy(&actions); } END_TEST START_TEST(test_actions_reallocate) { struct actions actions; int i; actions_init(&actions); ck_assert_int_eq(actions.len, 0); ck_assert_int_eq(actions.size, action_default_size); /* Fill size of actions array */ for (i = 0; i < action_default_size; i++) actions_add_continue(&actions); ck_assert_int_eq(actions.len, action_default_size); ck_assert_int_eq(actions.size, action_default_size); /* Add one more action to trigger reallocation */ actions_add_continue(&actions); ck_assert_int_eq(actions.len, action_default_size + 1); ck_assert_int_eq(actions.size, action_default_size * 2); actions_destroy(&actions); } END_TEST START_TEST(test_actions_add_trace_output) { actions_add_trace_output(&actions_fixture, "trace_output.txt"); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_TRACE_OUTPUT); ck_assert_str_eq(actions_fixture.list[0].trace_output, "trace_output.txt"); ck_assert(actions_fixture.present[ACTION_TRACE_OUTPUT]); } END_TEST START_TEST(test_actions_add_signal) { actions_add_signal(&actions_fixture, SIGINT, 1234); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_SIGNAL); ck_assert_int_eq(actions_fixture.list[0].signal, SIGINT); ck_assert_int_eq(actions_fixture.list[0].pid, 1234); ck_assert(actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_add_shell) { actions_add_shell(&actions_fixture, "echo Hello"); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_SHELL); ck_assert_str_eq(actions_fixture.list[0].command, "echo Hello"); ck_assert(actions_fixture.present[ACTION_SHELL]); } END_TEST START_TEST(test_actions_add_continue) { actions_add_continue(&actions_fixture); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_CONTINUE); ck_assert(actions_fixture.present[ACTION_CONTINUE]); } END_TEST START_TEST(test_actions_add_multiple_same_action) { actions_add_trace_output(&actions_fixture, "trace1.txt"); actions_add_trace_output(&actions_fixture, "trace2.txt"); ck_assert_int_eq(actions_fixture.len, 2); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_TRACE_OUTPUT); ck_assert_str_eq(actions_fixture.list[0].trace_output, "trace1.txt"); ck_assert_int_eq(actions_fixture.list[1].type, ACTION_TRACE_OUTPUT); ck_assert_str_eq(actions_fixture.list[1].trace_output, "trace2.txt"); ck_assert(actions_fixture.present[ACTION_TRACE_OUTPUT]); } END_TEST START_TEST(test_actions_add_multiple_different_action) { actions_add_trace_output(&actions_fixture, "trace_output.txt"); actions_add_signal(&actions_fixture, SIGINT, 1234); ck_assert_int_eq(actions_fixture.len, 2); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_TRACE_OUTPUT); ck_assert_str_eq(actions_fixture.list[0].trace_output, "trace_output.txt"); ck_assert(actions_fixture.present[ACTION_TRACE_OUTPUT]); ck_assert_int_eq(actions_fixture.list[1].type, ACTION_SIGNAL); ck_assert_int_eq(actions_fixture.list[1].signal, SIGINT); ck_assert_int_eq(actions_fixture.list[1].pid, 1234); ck_assert(actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_trace_output) { ck_assert_int_eq(actions_parse(&actions_fixture, "trace", "trace.txt"), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_TRACE_OUTPUT); ck_assert_str_eq(actions_fixture.list[0].trace_output, "trace.txt"); ck_assert(actions_fixture.present[ACTION_TRACE_OUTPUT]); } END_TEST START_TEST(test_actions_parse_trace_output_arg) { ck_assert_int_eq(actions_parse(&actions_fixture, "trace,file=trace2.txt", "trace1.txt"), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_TRACE_OUTPUT); ck_assert_str_eq(actions_fixture.list[0].trace_output, "trace2.txt"); ck_assert(actions_fixture.present[ACTION_TRACE_OUTPUT]); } END_TEST START_TEST(test_actions_parse_trace_output_arg_bad) { ck_assert_int_eq(actions_parse(&actions_fixture, "trace,foo=bar", "trace_output.txt"), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_TRACE_OUTPUT]); } END_TEST START_TEST(test_actions_parse_signal) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal,num=1,pid=1234", NULL), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_SIGNAL); ck_assert_int_eq(actions_fixture.list[0].signal, 1); ck_assert_int_eq(actions_fixture.list[0].pid, 1234); ck_assert(actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_signal_swapped) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal,pid=1234,num=1", NULL), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_SIGNAL); ck_assert_int_eq(actions_fixture.list[0].signal, 1); ck_assert_int_eq(actions_fixture.list[0].pid, 1234); ck_assert(actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_signal_parent) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal,pid=parent,num=1", NULL), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_SIGNAL); ck_assert_int_eq(actions_fixture.list[0].signal, 1); ck_assert_int_eq(actions_fixture.list[0].pid, -1); ck_assert(actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_signal_no_arg) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_signal_no_pid) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal,num=1", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_signal_no_num) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal,pid=1234", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_signal_arg_bad) { ck_assert_int_eq(actions_parse(&actions_fixture, "signal,foo=bar", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_SIGNAL]); } END_TEST START_TEST(test_actions_parse_shell) { ck_assert_int_eq(actions_parse(&actions_fixture, "shell,command=echo Hello", NULL), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_SHELL); ck_assert_str_eq(actions_fixture.list[0].command, "echo Hello"); ck_assert(actions_fixture.present[ACTION_SHELL]); } END_TEST START_TEST(test_actions_parse_shell_no_arg) { ck_assert_int_eq(actions_parse(&actions_fixture, "shell", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_SHELL]); } END_TEST START_TEST(test_actions_parse_shell_arg_bad) { ck_assert_int_eq(actions_parse(&actions_fixture, "shell,foo=bar", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_SHELL]); } END_TEST START_TEST(test_actions_parse_continue) { ck_assert_int_eq(actions_parse(&actions_fixture, "continue", NULL), 0); ck_assert_int_eq(actions_fixture.len, 1); ck_assert_int_eq(actions_fixture.list[0].type, ACTION_CONTINUE); ck_assert(actions_fixture.present[ACTION_CONTINUE]); } END_TEST START_TEST(test_actions_parse_continue_arg_bad) { ck_assert_int_eq(actions_parse(&actions_fixture, "continue,foo=bar", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); ck_assert(!actions_fixture.present[ACTION_CONTINUE]); } END_TEST START_TEST(test_actions_parse_invalid) { ck_assert_int_eq(actions_parse(&actions_fixture, "foobar", NULL), -1); ck_assert_int_eq(actions_fixture.len, 0); } END_TEST START_TEST(test_actions_perform_continue) { actions_add_continue(&actions_fixture); ck_assert_int_eq(actions_perform(&actions_fixture), 0); ck_assert(actions_fixture.continue_flag); } END_TEST START_TEST(test_actions_perform_continue_after_successful_shell_command) { actions_add_shell(&actions_fixture, "exit 0"); actions_add_continue(&actions_fixture); ck_assert_int_eq(actions_perform(&actions_fixture), 0 << 8); ck_assert(actions_fixture.continue_flag); } END_TEST START_TEST(test_actions_perform_continue_after_failed_shell_command) { actions_add_shell(&actions_fixture, "exit 1"); actions_add_continue(&actions_fixture); ck_assert_int_eq(actions_perform(&actions_fixture), 1 << 8); ck_assert(!actions_fixture.continue_flag); } END_TEST START_TEST(test_actions_perform_continue_unset_flag) { actions_fixture.continue_flag = true; actions_add_shell(&actions_fixture, "exit 1"); actions_add_continue(&actions_fixture); ck_assert_int_eq(actions_perform(&actions_fixture), 1 << 8); ck_assert(!actions_fixture.continue_flag); } END_TEST Suite *actions_suite(void) { Suite *s = suite_create("actions"); TCase *tc; tc = tcase_create("alloc"); tcase_add_test(tc, test_actions_init); tcase_add_test(tc, test_actions_destroy); tcase_add_test(tc, test_actions_reallocate); suite_add_tcase(s, tc); tc = tcase_create("add"); tcase_add_checked_fixture(tc, actions_fixture_setup, actions_fixture_teardown); tcase_add_test(tc, test_actions_add_trace_output); tcase_add_test(tc, test_actions_add_signal); tcase_add_test(tc, test_actions_add_shell); tcase_add_test(tc, test_actions_add_continue); tcase_add_test(tc, test_actions_add_multiple_same_action); tcase_add_test(tc, test_actions_add_multiple_different_action); suite_add_tcase(s, tc); tc = tcase_create("parse"); tcase_add_checked_fixture(tc, actions_fixture_setup, actions_fixture_teardown); tcase_add_test(tc, test_actions_parse_trace_output); tcase_add_test(tc, test_actions_parse_trace_output_arg); tcase_add_test(tc, test_actions_parse_trace_output_arg_bad); tcase_add_test(tc, test_actions_parse_signal); tcase_add_test(tc, test_actions_parse_signal_swapped); tcase_add_test(tc, test_actions_parse_signal_parent); tcase_add_test(tc, test_actions_parse_signal_no_arg); tcase_add_test(tc, test_actions_parse_signal_no_pid); tcase_add_test(tc, test_actions_parse_signal_no_num); tcase_add_test(tc, test_actions_parse_signal_arg_bad); tcase_add_test(tc, test_actions_parse_shell); tcase_add_test(tc, test_actions_parse_shell_no_arg); tcase_add_test(tc, test_actions_parse_shell_arg_bad); tcase_add_test(tc, test_actions_parse_continue); tcase_add_test(tc, test_actions_parse_continue_arg_bad); tcase_add_test(tc, test_actions_parse_invalid); suite_add_tcase(s, tc); tc = tcase_create("perform"); tcase_add_checked_fixture(tc, actions_fixture_setup, actions_fixture_teardown); tcase_add_test(tc, test_actions_perform_continue); tcase_add_test(tc, test_actions_perform_continue_after_successful_shell_command); tcase_add_test(tc, test_actions_perform_continue_after_failed_shell_command); tcase_add_test(tc, test_actions_perform_continue_unset_flag); suite_add_tcase(s, tc); return s; }