llvm-project/lldb/unittests/Signals/UnixSignalsTest.cpp
Jim Ingham 134d7f9a4b Store a by name list of signals with their actions in the Target
so that they can be used to prime new Process runs.  "process handle"
was also changed to populate the dummy target if there's no selected
target, so that the settings will get copied into new targets.

Differential Revision: https://reviews.llvm.org/D126259
2022-05-26 14:50:33 -07:00

163 lines
5.3 KiB
C++

//===-- UnixSignalsTest.cpp -----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include <string>
#include "gtest/gtest.h"
#include "lldb/Target/UnixSignals.h"
#include "llvm/Support/FormatVariadic.h"
using namespace lldb;
using namespace lldb_private;
using llvm::None;
class TestSignals : public UnixSignals {
public:
TestSignals() {
m_signals.clear();
AddSignal(2, "SIG2", false, true, true, "DESC2");
AddSignal(4, "SIG4", true, false, true, "DESC4");
AddSignal(8, "SIG8", true, true, true, "DESC8");
AddSignal(16, "SIG16", true, false, false, "DESC16");
}
};
void ExpectEqArrays(llvm::ArrayRef<int32_t> expected,
llvm::ArrayRef<int32_t> observed, const char *file,
int line) {
std::string location = llvm::formatv("{0}:{1}", file, line);
ASSERT_EQ(expected.size(), observed.size()) << location;
for (size_t i = 0; i < observed.size(); ++i) {
ASSERT_EQ(expected[i], observed[i])
<< "array index: " << i << "location:" << location;
}
}
#define EXPECT_EQ_ARRAYS(expected, observed) \
ExpectEqArrays((expected), (observed), __FILE__, __LINE__);
TEST(UnixSignalsTest, Iteration) {
TestSignals signals;
EXPECT_EQ(4, signals.GetNumSignals());
EXPECT_EQ(2, signals.GetFirstSignalNumber());
EXPECT_EQ(4, signals.GetNextSignalNumber(2));
EXPECT_EQ(8, signals.GetNextSignalNumber(4));
EXPECT_EQ(16, signals.GetNextSignalNumber(8));
EXPECT_EQ(LLDB_INVALID_SIGNAL_NUMBER, signals.GetNextSignalNumber(16));
}
TEST(UnixSignalsTest, Reset) {
TestSignals signals;
bool stop_val = signals.GetShouldStop(2);
bool notify_val = signals.GetShouldNotify(2);
bool suppress_val = signals.GetShouldSuppress(2);
// Change two, then reset one and make sure only that one was reset:
EXPECT_EQ(true, signals.SetShouldNotify(2, !notify_val));
EXPECT_EQ(true, signals.SetShouldSuppress(2, !suppress_val));
EXPECT_EQ(true, signals.ResetSignal(2, false, true, false));
EXPECT_EQ(stop_val, signals.GetShouldStop(2));
EXPECT_EQ(notify_val, signals.GetShouldStop(2));
EXPECT_EQ(!suppress_val, signals.GetShouldNotify(2));
// Make sure reset with no arguments resets them all:
EXPECT_EQ(true, signals.SetShouldSuppress(2, !suppress_val));
EXPECT_EQ(true, signals.SetShouldNotify(2, !notify_val));
EXPECT_EQ(true, signals.ResetSignal(2));
EXPECT_EQ(stop_val, signals.GetShouldStop(2));
EXPECT_EQ(notify_val, signals.GetShouldNotify(2));
EXPECT_EQ(suppress_val, signals.GetShouldSuppress(2));
}
TEST(UnixSignalsTest, GetInfo) {
TestSignals signals;
bool should_suppress = false, should_stop = false, should_notify = false;
int32_t signo = 4;
std::string name =
signals.GetSignalInfo(signo, should_suppress, should_stop, should_notify);
EXPECT_EQ("SIG4", name);
EXPECT_EQ(true, should_suppress);
EXPECT_EQ(false, should_stop);
EXPECT_EQ(true, should_notify);
EXPECT_EQ(true, signals.GetShouldSuppress(signo));
EXPECT_EQ(false, signals.GetShouldStop(signo));
EXPECT_EQ(true, signals.GetShouldNotify(signo));
EXPECT_EQ(name, signals.GetSignalAsCString(signo));
}
TEST(UnixSignalsTest, VersionChange) {
TestSignals signals;
int32_t signo = 8;
uint64_t ver = signals.GetVersion();
EXPECT_GT(ver, 0ull);
EXPECT_EQ(true, signals.GetShouldSuppress(signo));
EXPECT_EQ(true, signals.GetShouldStop(signo));
EXPECT_EQ(true, signals.GetShouldNotify(signo));
EXPECT_EQ(signals.GetVersion(), ver);
signals.SetShouldSuppress(signo, false);
EXPECT_LT(ver, signals.GetVersion());
ver = signals.GetVersion();
signals.SetShouldStop(signo, true);
EXPECT_LT(ver, signals.GetVersion());
ver = signals.GetVersion();
signals.SetShouldNotify(signo, false);
EXPECT_LT(ver, signals.GetVersion());
ver = signals.GetVersion();
EXPECT_EQ(false, signals.GetShouldSuppress(signo));
EXPECT_EQ(true, signals.GetShouldStop(signo));
EXPECT_EQ(false, signals.GetShouldNotify(signo));
EXPECT_EQ(ver, signals.GetVersion());
}
TEST(UnixSignalsTest, GetFilteredSignals) {
TestSignals signals;
auto all_signals = signals.GetFilteredSignals(None, None, None);
std::vector<int32_t> expected = {2, 4, 8, 16};
EXPECT_EQ_ARRAYS(expected, all_signals);
auto supressed = signals.GetFilteredSignals(true, None, None);
expected = {4, 8, 16};
EXPECT_EQ_ARRAYS(expected, supressed);
auto not_supressed = signals.GetFilteredSignals(false, None, None);
expected = {2};
EXPECT_EQ_ARRAYS(expected, not_supressed);
auto stopped = signals.GetFilteredSignals(None, true, None);
expected = {2, 8};
EXPECT_EQ_ARRAYS(expected, stopped);
auto not_stopped = signals.GetFilteredSignals(None, false, None);
expected = {4, 16};
EXPECT_EQ_ARRAYS(expected, not_stopped);
auto notified = signals.GetFilteredSignals(None, None, true);
expected = {2, 4, 8};
EXPECT_EQ_ARRAYS(expected, notified);
auto not_notified = signals.GetFilteredSignals(None, None, false);
expected = {16};
EXPECT_EQ_ARRAYS(expected, not_notified);
auto signal4 = signals.GetFilteredSignals(true, false, true);
expected = {4};
EXPECT_EQ_ARRAYS(expected, signal4);
}