1 //===-- UnixSignalsTest.cpp -------------------------------------*- C++ -*-===// 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, 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 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 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