/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "test.h" #include "functionalext.h" #include "sigchain_util.h" static int g_count = 0; /** * @brief the special handler */ static bool sigchain_special_sigint_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_001", signo, SIGINT); return false; } /** * @brief the special handler */ static bool sigchain_special_sigint_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_001", signo, SIGINT); return true; } /** * @tc.name : sigchain_add_special_handler_001 * @tc.desc : The signal is not registered with the kernel, call add_special_signal_handler to add * two special handlers * @tc.level : Level 0 */ static void sigchain_add_special_handler_001() { struct signal_chain_action sigint = { .sca_sigaction = sigchain_special_sigint_handler1, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGINT, &sigint); struct signal_chain_action sigint1 = { .sca_sigaction = sigchain_special_sigint_handler2, .sca_mask = {}, .sca_flags = SIGCHAIN_ALLOW_NORETURN, }; add_special_signal_handler(SIGINT, &sigint1); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGINT}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_001", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGINT); EXPECT_EQ("sigchain_add_special_handler_001", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2); } /** * @brief the special handler */ static bool sigchain_special_sighup_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_002", signo, SIGHUP); return false; } /** * @brief the special handler */ static bool sigchain_special_sighup_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_002", signo, SIGHUP); return false; } /** * @brief the signal handler */ static void signal_sighup_handler(int signo) { g_count++; EXPECT_EQ("sigchain_add_special_handler_002", signo, SIGHUP); } /** * @tc.name : sigchain_add_special_handler_002 * @tc.desc : The signal is registered with the kernel(Using signal), call * add_special_signal_handler to add two special handlers * @tc.level : Level 0 */ static void sigchain_add_special_handler_002() { g_count = 0; signal(SIGHUP, signal_sighup_handler); struct signal_chain_action sighup = { .sca_sigaction = sigchain_special_sighup_handler1, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGHUP, &sighup); struct signal_chain_action sighup1 = { .sca_sigaction = sigchain_special_sighup_handler2, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGHUP, &sighup1); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGHUP}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_002", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGHUP); EXPECT_EQ("sigchain_add_special_handler_002", g_count, SIGCHIAN_TEST_SIGNAL_NUM_3); } /** * @brief the special handler */ static bool sigchain_special_sigusr2_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_003", signo, SIGUSR2); return false; } /** * @brief the special handler */ static bool sigchain_special_sigusr2_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_003", signo, SIGUSR2); return false; } /** * @brief the signal handler */ static void signal_sigusr2_sigaction(int signo) { g_count++; EXPECT_EQ("sigchain_add_special_handler_003", signo, SIGUSR2); } /** * @tc.name : sigchain_add_special_handler_003 * @tc.desc : The signal is registered with the kernel(Using sigaction), call * add_special_signal_handler to add two special handlers * @tc.level : Level 0 */ static void sigchain_add_special_handler_003() { g_count = 0; struct sigaction sigac = { .sa_handler = signal_sigusr2_sigaction, }; sigaction(SIGUSR2, &sigac, NULL); struct signal_chain_action sigusr2 = { .sca_sigaction = sigchain_special_sigusr2_handler1, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGUSR2, &sigusr2); struct signal_chain_action sigusr21 = { .sca_sigaction = sigchain_special_sigusr2_handler2, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGUSR2, &sigusr21); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGUSR2}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_003", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGUSR2); EXPECT_EQ("sigchain_add_special_handler_003", g_count, SIGCHIAN_TEST_SIGNAL_NUM_3); } /** * @brief the special handler */ static bool sigchain_special_sigterm_handler(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_004", signo, SIGTERM); return true; } /** * @tc.name : sigchain_add_special_handler_004 * @tc.desc : the signal is not registered with the kernel, call add_special_signal_handler to add * a special handler. * @tc.level : Level 0 */ static void sigchain_add_special_handler_004() { g_count = 0; struct signal_chain_action sigterm = { .sca_sigaction = sigchain_special_sigterm_handler, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGTERM, &sigterm); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGTERM}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_004", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGTERM); EXPECT_EQ("sigchain_add_special_handler_004", g_count, SIGCHIAN_TEST_SIGNAL_NUM_1); } /** * @brief the special handler */ static bool sigchain_special_64_handler(int signo, siginfo_t *siginfo, void *ucontext_raw) { EXPECT_EQ("sigchain_add_special_handler_005", signo, SIGCHAIN_SIGNAL_64); g_count++; return false; } /** * @brief the signal handler */ static void signal_64_handler(int signo) { g_count++; EXPECT_EQ("sigchain_add_special_handler_005", signo, SIGCHAIN_SIGNAL_64); } /** * @tc.name : sigchain_add_special_handler_005 * @tc.desc : the signal is registered with the kernel(Using signal), call add_special_signal_handler to add * a special handler. * @tc.level : Level 0 */ static void sigchain_add_special_handler_005() { g_count = 0; signal(SIGCHAIN_SIGNAL_64, signal_64_handler); struct signal_chain_action sighup = { .sca_sigaction = sigchain_special_64_handler, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGCHAIN_SIGNAL_64, &sighup); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_64}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_005", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGCHAIN_SIGNAL_64); EXPECT_EQ("sigchain_add_special_handler_005", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2); } /** * @brief the special handler */ static bool sigchain_special_37_handler(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_006", signo, SIGCHAIN_SIGNAL_37); return false; } /** * @brief the signal handler */ static void signal_37_sigaction(int signo) { g_count++; EXPECT_EQ("sigchain_add_special_handler_006", signo, SIGCHAIN_SIGNAL_37); } /** * @tc.name : sigchain_add_special_handler_006 * @tc.desc : the signal is registered with the kernel(Using sigaction), call add_special_signal_handler * to add a special handler. * @tc.level : Level 0 */ static void sigchain_add_special_handler_006() { g_count = 0; struct sigaction sigac = { .sa_handler = signal_37_sigaction, }; sigaction(SIGCHAIN_SIGNAL_37, &sigac, NULL); struct signal_chain_action sig37 = { .sca_sigaction = sigchain_special_37_handler, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGCHAIN_SIGNAL_37, &sig37); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_37}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_006", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGCHAIN_SIGNAL_37); EXPECT_EQ("sigchain_add_special_handler_006", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2); } /** * @brief the special handler */ static bool sigchain_special_43_handler(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_007", signo, SIGCHAIN_SIGNAL_43); return true; } /** * @brief the signal handler */ static void signal_43_sigaction(int signo) { g_count++; EXPECT_FALSE("sigchain_add_special_handler_007", true); } /** * @tc.name : sigchain_add_special_handler_007 * @tc.desc : Multiple signal are registered with the kernel(Using sigaction), sigchain_special_43_handler return * true. * @tc.level : Level 0 */ static void sigchain_add_special_handler_007() { g_count = 0; struct sigaction sigac = { .sa_handler = signal_43_sigaction, }; sigaction(SIGCHAIN_SIGNAL_43, &sigac, NULL); struct signal_chain_action sig43 = { .sca_sigaction = sigchain_special_43_handler, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGCHAIN_SIGNAL_43, &sig43); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_43}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_007", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGCHAIN_SIGNAL_43); EXPECT_EQ("sigchain_add_special_handler_007", g_count, SIGCHIAN_TEST_SIGNAL_NUM_1); } /** * @brief the special handler */ static bool sigchain_special_45_handler(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_008", signo, SIGCHAIN_SIGNAL_45); return false; } /** * @brief the signal handler */ static void signal_45_sigaction(int signo) { g_count++; EXPECT_EQ("sigchain_add_special_handler_008", signo, SIGCHAIN_SIGNAL_45); } /** * @tc.name : sigchain_add_special_handler_008 * @tc.desc : There is no special handler, add the special at the last of the chains * @tc.level : Level 0 */ static void sigchain_add_special_handler_008() { g_count = 0; struct sigaction sigac = { .sa_handler = signal_45_sigaction, }; sigaction(SIGCHAIN_SIGNAL_45, &sigac, NULL); struct signal_chain_action sig45 = { .sca_sigaction = sigchain_special_45_handler, .sca_mask = {}, .sca_flags = 0, }; add_special_handler_at_last(SIGCHAIN_SIGNAL_45, &sig45); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_45}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_008", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGCHAIN_SIGNAL_45); EXPECT_EQ("sigchain_add_special_handler_008", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2); } /** * @brief the special handler */ static bool sigchain_special_56_handler1(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_009", signo, SIGCHAIN_SIGNAL_56); EXPECT_EQ("sigchain_add_special_handler_009", g_count, SIGCHIAN_TEST_SIGNAL_NUM_2); return false; } /** * @brief the special handler */ static bool sigchain_special_56_handler2(int signo, siginfo_t *siginfo, void *ucontext_raw) { g_count++; EXPECT_EQ("sigchain_add_special_handler_009", signo, SIGCHAIN_SIGNAL_56); EXPECT_EQ("sigchain_add_special_handler_009", g_count, SIGCHIAN_TEST_SIGNAL_NUM_1); return false; } /** * @brief the signal handler */ static void signal_56_sigaction(int signo) { g_count++; EXPECT_EQ("sigchain_add_special_handler_009", signo, SIGCHAIN_SIGNAL_56); } /** * @tc.name : sigchain_add_special_handler_009 * @tc.desc : There are one special handler, add the special at the last of the chains * @tc.level : Level 0 */ static void sigchain_add_special_handler_009() { g_count = 0; struct sigaction sigac = { .sa_handler = signal_56_sigaction, }; sigaction(SIGCHAIN_SIGNAL_56, &sigac, NULL); struct signal_chain_action sig56 = { .sca_sigaction = sigchain_special_56_handler2, .sca_mask = {}, .sca_flags = 0, }; add_special_signal_handler(SIGCHAIN_SIGNAL_56, &sig56); struct signal_chain_action sig561 = { .sca_sigaction = sigchain_special_56_handler1, .sca_mask = {}, .sca_flags = 0, }; add_special_handler_at_last(SIGCHAIN_SIGNAL_56, &sig561); if (get_sigchain_mask_enable()) { sigset_t set = {0}; int signo[SIGCHIAN_TEST_SIGNAL_NUM_1] = {SIGCHAIN_SIGNAL_56}; SIGCHAIN_TEST_SET_MASK(set, "sigchain_add_special_handler_009", signo, SIGCHIAN_TEST_SIGNAL_NUM_1); } raise(SIGCHAIN_SIGNAL_56); EXPECT_EQ("sigchain_add_special_handler_009", g_count, SIGCHIAN_TEST_SIGNAL_NUM_3); } int main(void) { sigchain_add_special_handler_001(); sigchain_add_special_handler_002(); sigchain_add_special_handler_003(); sigchain_add_special_handler_004(); sigchain_add_special_handler_005(); sigchain_add_special_handler_006(); sigchain_add_special_handler_007(); sigchain_add_special_handler_008(); sigchain_add_special_handler_009(); return t_status; }