blob: 40c0a133bbd873e7e6b03b9b418dc60f228a289f [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
Brian Silverman407cc532019-11-03 11:40:56 -08008namespace aos {
9namespace ipc_lib {
10namespace testing {
11
12// Tests in this file use separate threads to isolate all manipulation of signal
13// masks between test cases.
14
15// Verify that SignalFd will leave signals unblocked if we ask it to.
16TEST(SignalFdTest, LeaveSignalBlocked) {
17 ::aos::testing::EnableTestLogging();
18 std::thread thread([]() {
19 {
20 sigset_t test_mask;
21 CHECK_EQ(0, sigemptyset(&test_mask));
22 CHECK_EQ(0, sigaddset(&test_mask, SIGUSR1));
23 PCHECK(sigprocmask(SIG_BLOCK, &test_mask, nullptr) == 0);
24 }
25 SignalFd({SIGUSR1});
26 {
27 sigset_t blocked_now;
28 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
29 ASSERT_TRUE(sigismember(&blocked_now, SIGUSR1));
30 }
31 });
32 thread.join();
33}
34
35// Verify that SignalFd actually blocks the requested signals, and unblocks them
36// afterwards.
37TEST(SignalFdTest, BlockSignal) {
38 ::aos::testing::EnableTestLogging();
39 std::thread thread([]() {
40 {
41 sigset_t blocked_now;
42 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
43 ASSERT_FALSE(sigismember(&blocked_now, SIGUSR1));
44 }
45 {
46 SignalFd signalfd({SIGUSR1});
47 sigset_t blocked_now;
48 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
49 ASSERT_TRUE(sigismember(&blocked_now, SIGUSR1));
50 }
51 {
52 sigset_t blocked_now;
53 PCHECK(sigprocmask(SIG_BLOCK, nullptr, &blocked_now) == 0);
54 ASSERT_FALSE(sigismember(&blocked_now, SIGUSR1));
55 }
56 });
57 thread.join();
58}
59
60// Verify that SignalFd responds correctly when some other code unblocks one of
61// its signals.
62TEST(SignalFdDeathTest, ExternalUnblockSignal) {
63 ::aos::testing::EnableTestLogging();
Brian Silverman96437c12020-06-23 16:36:44 -070064 auto t = []() {
65 SignalFd signalfd({SIGUSR1});
66 sigset_t test_mask;
67 CHECK_EQ(0, sigemptyset(&test_mask));
68 CHECK_EQ(0, sigaddset(&test_mask, SIGUSR1));
69 PCHECK(sigprocmask(SIG_UNBLOCK, &test_mask, nullptr) == 0);
70 };
71 EXPECT_DEATH({ t(); },
72 "Some other code unblocked one or more of our signals");
Brian Silverman407cc532019-11-03 11:40:56 -080073}
74
75} // namespace testing
76} // namespace ipc_lib
77} // namespace aos