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