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