| // SPDX-License-Identifier: GPL-2.0 | |
| #define _GNU_SOURCE | |
| #include <check.h> | |
| #include <signal.h> | |
| #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; | |
| } |