blob: b4fe74b6e453417e5532fb2f42ed11e8a32abca3 [file] [log] [blame]
Brian Silverman407cc532019-11-03 11:40:56 -08001#include "aos/ipc_lib/signalfd.h"
2
3#include "gtest/gtest.h"
4#include "glog/logging.h"
5#include "aos/testing/test_logging.h"
6
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();
63 EXPECT_DEATH(
64 {
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 "Some other code unblocked one or more of our signals");
72}
73
74} // namespace testing
75} // namespace ipc_lib
76} // namespace aos