1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for sigaction -------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #include "hdr/errno_macros.h"
10*71db0c75SAndroid Build Coastguard Worker #include "hdr/signal_macros.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/signal/raise.h"
12*71db0c75SAndroid Build Coastguard Worker #include "src/signal/sigaction.h"
13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/ErrnoSetterMatcher.h"
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
15*71db0c75SAndroid Build Coastguard Worker
16*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
17*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
18*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcSigaction,Invalid)19*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSigaction, Invalid) {
20*71db0c75SAndroid Build Coastguard Worker // -1 is a much larger signal that NSIG, so this should fail.
21*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(-1, nullptr, nullptr), Fails(EINVAL));
22*71db0c75SAndroid Build Coastguard Worker }
23*71db0c75SAndroid Build Coastguard Worker
24*71db0c75SAndroid Build Coastguard Worker // SIGKILL cannot have its action changed, but it can be examined.
TEST(LlvmLibcSigaction,Sigkill)25*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSigaction, Sigkill) {
26*71db0c75SAndroid Build Coastguard Worker struct sigaction action;
27*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGKILL, nullptr, &action), Succeeds());
28*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGKILL, &action, nullptr),
29*71db0c75SAndroid Build Coastguard Worker Fails(EINVAL));
30*71db0c75SAndroid Build Coastguard Worker }
31*71db0c75SAndroid Build Coastguard Worker
32*71db0c75SAndroid Build Coastguard Worker static int sigusr1Count;
33*71db0c75SAndroid Build Coastguard Worker static bool correctSignal;
34*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcSigaction,CustomAction)35*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSigaction, CustomAction) {
36*71db0c75SAndroid Build Coastguard Worker // Zero this incase tests get run multiple times in the future.
37*71db0c75SAndroid Build Coastguard Worker sigusr1Count = 0;
38*71db0c75SAndroid Build Coastguard Worker
39*71db0c75SAndroid Build Coastguard Worker struct sigaction action;
40*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGUSR1, nullptr, &action), Succeeds());
41*71db0c75SAndroid Build Coastguard Worker
42*71db0c75SAndroid Build Coastguard Worker action.sa_handler = +[](int signal) {
43*71db0c75SAndroid Build Coastguard Worker correctSignal = signal == SIGUSR1;
44*71db0c75SAndroid Build Coastguard Worker sigusr1Count++;
45*71db0c75SAndroid Build Coastguard Worker };
46*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGUSR1, &action, nullptr), Succeeds());
47*71db0c75SAndroid Build Coastguard Worker
48*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::raise(SIGUSR1);
49*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(sigusr1Count, 1);
50*71db0c75SAndroid Build Coastguard Worker EXPECT_TRUE(correctSignal);
51*71db0c75SAndroid Build Coastguard Worker
52*71db0c75SAndroid Build Coastguard Worker action.sa_handler = SIG_DFL;
53*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGUSR1, &action, nullptr), Succeeds());
54*71db0c75SAndroid Build Coastguard Worker
55*71db0c75SAndroid Build Coastguard Worker EXPECT_DEATH([] { LIBC_NAMESPACE::raise(SIGUSR1); }, WITH_SIGNAL(SIGUSR1));
56*71db0c75SAndroid Build Coastguard Worker }
57*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcSigaction,Ignore)58*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSigaction, Ignore) {
59*71db0c75SAndroid Build Coastguard Worker struct sigaction action;
60*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGUSR1, nullptr, &action), Succeeds());
61*71db0c75SAndroid Build Coastguard Worker action.sa_handler = SIG_IGN;
62*71db0c75SAndroid Build Coastguard Worker EXPECT_THAT(LIBC_NAMESPACE::sigaction(SIGUSR1, &action, nullptr), Succeeds());
63*71db0c75SAndroid Build Coastguard Worker
64*71db0c75SAndroid Build Coastguard Worker EXPECT_EXITS([] { LIBC_NAMESPACE::raise(SIGUSR1); }, 0);
65*71db0c75SAndroid Build Coastguard Worker }
66