1 //===-- UnixSignalsTest.cpp -----------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 #include <string>
9
10 #include "gtest/gtest.h"
11
12 #include "lldb/Target/UnixSignals.h"
13 #include "llvm/Support/FormatVariadic.h"
14
15 using namespace lldb;
16 using namespace lldb_private;
17 using llvm::None;
18
19 class TestSignals : public UnixSignals {
20 public:
TestSignals()21 TestSignals() {
22 m_signals.clear();
23 AddSignal(2, "SIG2", false, true, true, "DESC2");
24 AddSignal(4, "SIG4", true, false, true, "DESC4");
25 AddSignal(8, "SIG8", true, true, true, "DESC8");
26 AddSignal(16, "SIG16", true, false, false, "DESC16");
27 }
28 };
29
ExpectEqArrays(llvm::ArrayRef<int32_t> expected,llvm::ArrayRef<int32_t> observed,const char * file,int line)30 void ExpectEqArrays(llvm::ArrayRef<int32_t> expected,
31 llvm::ArrayRef<int32_t> observed, const char *file,
32 int line) {
33 std::string location = llvm::formatv("{0}:{1}", file, line);
34 ASSERT_EQ(expected.size(), observed.size()) << location;
35
36 for (size_t i = 0; i < observed.size(); ++i) {
37 ASSERT_EQ(expected[i], observed[i])
38 << "array index: " << i << "location:" << location;
39 }
40 }
41
42 #define EXPECT_EQ_ARRAYS(expected, observed) \
43 ExpectEqArrays((expected), (observed), __FILE__, __LINE__);
44
TEST(UnixSignalsTest,Iteration)45 TEST(UnixSignalsTest, Iteration) {
46 TestSignals signals;
47
48 EXPECT_EQ(4, signals.GetNumSignals());
49 EXPECT_EQ(2, signals.GetFirstSignalNumber());
50 EXPECT_EQ(4, signals.GetNextSignalNumber(2));
51 EXPECT_EQ(8, signals.GetNextSignalNumber(4));
52 EXPECT_EQ(16, signals.GetNextSignalNumber(8));
53 EXPECT_EQ(LLDB_INVALID_SIGNAL_NUMBER, signals.GetNextSignalNumber(16));
54 }
55
TEST(UnixSignalsTest,Reset)56 TEST(UnixSignalsTest, Reset) {
57 TestSignals signals;
58 bool stop_val = signals.GetShouldStop(2);
59 bool notify_val = signals.GetShouldNotify(2);
60 bool suppress_val = signals.GetShouldSuppress(2);
61
62 // Change two, then reset one and make sure only that one was reset:
63 EXPECT_EQ(true, signals.SetShouldNotify(2, !notify_val));
64 EXPECT_EQ(true, signals.SetShouldSuppress(2, !suppress_val));
65 EXPECT_EQ(true, signals.ResetSignal(2, false, true, false));
66 EXPECT_EQ(stop_val, signals.GetShouldStop(2));
67 EXPECT_EQ(notify_val, signals.GetShouldStop(2));
68 EXPECT_EQ(!suppress_val, signals.GetShouldNotify(2));
69
70 // Make sure reset with no arguments resets them all:
71 EXPECT_EQ(true, signals.SetShouldSuppress(2, !suppress_val));
72 EXPECT_EQ(true, signals.SetShouldNotify(2, !notify_val));
73 EXPECT_EQ(true, signals.ResetSignal(2));
74 EXPECT_EQ(stop_val, signals.GetShouldStop(2));
75 EXPECT_EQ(notify_val, signals.GetShouldNotify(2));
76 EXPECT_EQ(suppress_val, signals.GetShouldSuppress(2));
77 }
78
TEST(UnixSignalsTest,GetInfo)79 TEST(UnixSignalsTest, GetInfo) {
80 TestSignals signals;
81
82 bool should_suppress = false, should_stop = false, should_notify = false;
83 int32_t signo = 4;
84 std::string name =
85 signals.GetSignalInfo(signo, should_suppress, should_stop, should_notify);
86 EXPECT_EQ("SIG4", name);
87 EXPECT_EQ(true, should_suppress);
88 EXPECT_EQ(false, should_stop);
89 EXPECT_EQ(true, should_notify);
90
91 EXPECT_EQ(true, signals.GetShouldSuppress(signo));
92 EXPECT_EQ(false, signals.GetShouldStop(signo));
93 EXPECT_EQ(true, signals.GetShouldNotify(signo));
94 EXPECT_EQ(name, signals.GetSignalAsCString(signo));
95 }
96
TEST(UnixSignalsTest,VersionChange)97 TEST(UnixSignalsTest, VersionChange) {
98 TestSignals signals;
99
100 int32_t signo = 8;
101 uint64_t ver = signals.GetVersion();
102 EXPECT_GT(ver, 0ull);
103 EXPECT_EQ(true, signals.GetShouldSuppress(signo));
104 EXPECT_EQ(true, signals.GetShouldStop(signo));
105 EXPECT_EQ(true, signals.GetShouldNotify(signo));
106
107 EXPECT_EQ(signals.GetVersion(), ver);
108
109 signals.SetShouldSuppress(signo, false);
110 EXPECT_LT(ver, signals.GetVersion());
111 ver = signals.GetVersion();
112
113 signals.SetShouldStop(signo, true);
114 EXPECT_LT(ver, signals.GetVersion());
115 ver = signals.GetVersion();
116
117 signals.SetShouldNotify(signo, false);
118 EXPECT_LT(ver, signals.GetVersion());
119 ver = signals.GetVersion();
120
121 EXPECT_EQ(false, signals.GetShouldSuppress(signo));
122 EXPECT_EQ(true, signals.GetShouldStop(signo));
123 EXPECT_EQ(false, signals.GetShouldNotify(signo));
124
125 EXPECT_EQ(ver, signals.GetVersion());
126 }
127
TEST(UnixSignalsTest,GetFilteredSignals)128 TEST(UnixSignalsTest, GetFilteredSignals) {
129 TestSignals signals;
130
131 auto all_signals = signals.GetFilteredSignals(None, None, None);
132 std::vector<int32_t> expected = {2, 4, 8, 16};
133 EXPECT_EQ_ARRAYS(expected, all_signals);
134
135 auto supressed = signals.GetFilteredSignals(true, None, None);
136 expected = {4, 8, 16};
137 EXPECT_EQ_ARRAYS(expected, supressed);
138
139 auto not_supressed = signals.GetFilteredSignals(false, None, None);
140 expected = {2};
141 EXPECT_EQ_ARRAYS(expected, not_supressed);
142
143 auto stopped = signals.GetFilteredSignals(None, true, None);
144 expected = {2, 8};
145 EXPECT_EQ_ARRAYS(expected, stopped);
146
147 auto not_stopped = signals.GetFilteredSignals(None, false, None);
148 expected = {4, 16};
149 EXPECT_EQ_ARRAYS(expected, not_stopped);
150
151 auto notified = signals.GetFilteredSignals(None, None, true);
152 expected = {2, 4, 8};
153 EXPECT_EQ_ARRAYS(expected, notified);
154
155 auto not_notified = signals.GetFilteredSignals(None, None, false);
156 expected = {16};
157 EXPECT_EQ_ARRAYS(expected, not_notified);
158
159 auto signal4 = signals.GetFilteredSignals(true, false, true);
160 expected = {4};
161 EXPECT_EQ_ARRAYS(expected, signal4);
162 }
163