brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 54de8f7 Raw
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