63 lines · cpp
1//===-- Unittests for sigprocmask -----------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/signal/raise.h"10#include "src/signal/sigaddset.h"11#include "src/signal/sigemptyset.h"12#include "src/signal/sigprocmask.h"13#include "test/UnitTest/ErrnoCheckingTest.h"14#include "test/UnitTest/ErrnoSetterMatcher.h"15#include "test/UnitTest/Test.h"16 17#include <signal.h>18 19class LlvmLibcSigprocmaskTest20 : public LIBC_NAMESPACE::testing::ErrnoCheckingTest {21 sigset_t oldSet;22 23public:24 void SetUp() override {25 ErrnoCheckingTest::SetUp();26 LIBC_NAMESPACE::sigprocmask(0, nullptr, &oldSet);27 }28 29 void TearDown() override {30 LIBC_NAMESPACE::sigprocmask(SIG_SETMASK, &oldSet, nullptr);31 ErrnoCheckingTest::TearDown();32 }33};34 35using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;36using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;37 38// This tests for invalid input.39TEST_F(LlvmLibcSigprocmaskTest, SigprocmaskInvalid) {40 sigset_t valid;41 // 17 and -4 are out of the range for sigprocmask's how paramater.42 EXPECT_THAT(LIBC_NAMESPACE::sigprocmask(17, &valid, nullptr), Fails(EINVAL));43 EXPECT_THAT(LIBC_NAMESPACE::sigprocmask(-4, &valid, nullptr), Fails(EINVAL));44 45 // This pointer is out of this processes address range.46 sigset_t *invalid = reinterpret_cast<sigset_t *>(-1);47 EXPECT_THAT(LIBC_NAMESPACE::sigprocmask(SIG_SETMASK, invalid, nullptr),48 Fails(EFAULT));49 EXPECT_THAT(LIBC_NAMESPACE::sigprocmask(-4, nullptr, invalid), Fails(EFAULT));50}51 52// This tests that when nothing is blocked, a process gets killed and alse tests53// that when signals are blocked they are not delivered to the process.54TEST_F(LlvmLibcSigprocmaskTest, BlockUnblock) {55 sigset_t sigset;56 EXPECT_EQ(LIBC_NAMESPACE::sigemptyset(&sigset), 0);57 EXPECT_EQ(LIBC_NAMESPACE::sigprocmask(SIG_SETMASK, &sigset, nullptr), 0);58 EXPECT_DEATH([] { LIBC_NAMESPACE::raise(SIGUSR1); }, WITH_SIGNAL(SIGUSR1));59 EXPECT_EQ(LIBC_NAMESPACE::sigaddset(&sigset, SIGUSR1), 0);60 EXPECT_EQ(LIBC_NAMESPACE::sigprocmask(SIG_SETMASK, &sigset, nullptr), 0);61 EXPECT_EXITS([] { LIBC_NAMESPACE::raise(SIGUSR1); }, 0);62}63