blob: 2f349c13a1b79d28ebe000e9b2bfa3d9c97c1301 [file] [log] [blame]
Brian Silverman407cc532019-11-03 11:40:56 -08001#include "aos/ipc_lib/signalfd.h"
2
Austin Schuh60e77942022-05-16 17:48:24 -07003#include "glog/logging.h"
4#include "gtest/gtest.h"
Brian Silverman407cc532019-11-03 11:40:56 -08005
Philipp Schrader790cb542023-07-05 21:06:52 -07006#include "aos/testing/test_logging.h"
7
Stephan Pleinesf63bde82024-01-13 15:59:33 -08008namespace aos::ipc_lib::testing {
Brian Silverman407cc532019-11-03 11:40:56 -08009
10// Tests in this file use separate threads to isolate all manipulation of signal
11// masks between test cases.
12
13// Verify that SignalFd will leave signals unblocked if we ask it to.
14TEST(SignalFdTest, LeaveSignalBlocked) {
15 ::aos::testing::EnableTestLogging();
16 std::thread thread([]() {
17 {
18 sigset_t test_mask;
19 CHECK_EQ(0, sigemptyset(&test_mask));
20 CHECK_EQ(0, sigaddset(&test_mask, SIGUSR1));
21 PCHECK(sigprocmask(SIG_BLOCK, &test_mask, nullptr) == 0);
22 }
23 SignalFd({SIGUSR1});
24 {
25 sigset_t blocked_now;
26 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
27 ASSERT_TRUE(sigismember(&blocked_now, SIGUSR1));
28 }
29 });
30 thread.join();
31}
32
33// Verify that SignalFd actually blocks the requested signals, and unblocks them
34// afterwards.
35TEST(SignalFdTest, BlockSignal) {
36 ::aos::testing::EnableTestLogging();
37 std::thread thread([]() {
38 {
39 sigset_t blocked_now;
40 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
41 ASSERT_FALSE(sigismember(&blocked_now, SIGUSR1));
42 }
43 {
44 SignalFd signalfd({SIGUSR1});
45 sigset_t blocked_now;
46 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
47 ASSERT_TRUE(sigismember(&blocked_now, SIGUSR1));
48 }
49 {
50 sigset_t blocked_now;
51 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
52 ASSERT_FALSE(sigismember(&blocked_now, SIGUSR1));
53 }
54 });
55 thread.join();
56}
57
58// Verify that SignalFd responds correctly when some other code unblocks one of
59// its signals.
60TEST(SignalFdDeathTest, ExternalUnblockSignal) {
61 ::aos::testing::EnableTestLogging();
Brian Silverman96437c12020-06-23 16:36:44 -070062 auto t = []() {
63 SignalFd signalfd({SIGUSR1});
64 sigset_t test_mask;
65 CHECK_EQ(0, sigemptyset(&test_mask));
66 CHECK_EQ(0, sigaddset(&test_mask, SIGUSR1));
67 PCHECK(sigprocmask(SIG_UNBLOCK, &test_mask, nullptr) == 0);
68 };
69 EXPECT_DEATH({ t(); },
70 "Some other code unblocked one or more of our signals");
Brian Silverman407cc532019-11-03 11:40:56 -080071}
72
Stephan Pleinesf63bde82024-01-13 15:59:33 -080073} // namespace aos::ipc_lib::testing