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