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,GetInfo)56 TEST(UnixSignalsTest, GetInfo) {
57   TestSignals signals;
58 
59   bool should_suppress = false, should_stop = false, should_notify = false;
60   int32_t signo = 4;
61   std::string name =
62       signals.GetSignalInfo(signo, should_suppress, should_stop, should_notify);
63   EXPECT_EQ("SIG4", name);
64   EXPECT_EQ(true, should_suppress);
65   EXPECT_EQ(false, should_stop);
66   EXPECT_EQ(true, should_notify);
67 
68   EXPECT_EQ(true, signals.GetShouldSuppress(signo));
69   EXPECT_EQ(false, signals.GetShouldStop(signo));
70   EXPECT_EQ(true, signals.GetShouldNotify(signo));
71   EXPECT_EQ(name, signals.GetSignalAsCString(signo));
72 }
73 
TEST(UnixSignalsTest,VersionChange)74 TEST(UnixSignalsTest, VersionChange) {
75   TestSignals signals;
76 
77   int32_t signo = 8;
78   uint64_t ver = signals.GetVersion();
79   EXPECT_GT(ver, 0ull);
80   EXPECT_EQ(true, signals.GetShouldSuppress(signo));
81   EXPECT_EQ(true, signals.GetShouldStop(signo));
82   EXPECT_EQ(true, signals.GetShouldNotify(signo));
83 
84   EXPECT_EQ(signals.GetVersion(), ver);
85 
86   signals.SetShouldSuppress(signo, false);
87   EXPECT_LT(ver, signals.GetVersion());
88   ver = signals.GetVersion();
89 
90   signals.SetShouldStop(signo, true);
91   EXPECT_LT(ver, signals.GetVersion());
92   ver = signals.GetVersion();
93 
94   signals.SetShouldNotify(signo, false);
95   EXPECT_LT(ver, signals.GetVersion());
96   ver = signals.GetVersion();
97 
98   EXPECT_EQ(false, signals.GetShouldSuppress(signo));
99   EXPECT_EQ(true, signals.GetShouldStop(signo));
100   EXPECT_EQ(false, signals.GetShouldNotify(signo));
101 
102   EXPECT_EQ(ver, signals.GetVersion());
103 }
104 
TEST(UnixSignalsTest,GetFilteredSignals)105 TEST(UnixSignalsTest, GetFilteredSignals) {
106   TestSignals signals;
107 
108   auto all_signals = signals.GetFilteredSignals(None, None, None);
109   std::vector<int32_t> expected = {2, 4, 8, 16};
110   EXPECT_EQ_ARRAYS(expected, all_signals);
111 
112   auto supressed = signals.GetFilteredSignals(true, None, None);
113   expected = {4, 8, 16};
114   EXPECT_EQ_ARRAYS(expected, supressed);
115 
116   auto not_supressed = signals.GetFilteredSignals(false, None, None);
117   expected = {2};
118   EXPECT_EQ_ARRAYS(expected, not_supressed);
119 
120   auto stopped = signals.GetFilteredSignals(None, true, None);
121   expected = {2, 8};
122   EXPECT_EQ_ARRAYS(expected, stopped);
123 
124   auto not_stopped = signals.GetFilteredSignals(None, false, None);
125   expected = {4, 16};
126   EXPECT_EQ_ARRAYS(expected, not_stopped);
127 
128   auto notified = signals.GetFilteredSignals(None, None, true);
129   expected = {2, 4, 8};
130   EXPECT_EQ_ARRAYS(expected, notified);
131 
132   auto not_notified = signals.GetFilteredSignals(None, None, false);
133   expected = {16};
134   EXPECT_EQ_ARRAYS(expected, not_notified);
135 
136   auto signal4 = signals.GetFilteredSignals(true, false, true);
137   expected = {4};
138   EXPECT_EQ_ARRAYS(expected, signal4);
139 }
140