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: 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 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 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 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 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 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 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