180814287SRaphael Isemann //===-- UnixSignalsTest.cpp -----------------------------------------------===//
27993cc5eSEugene Zemtsov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67993cc5eSEugene Zemtsov //
77993cc5eSEugene Zemtsov //===----------------------------------------------------------------------===//
87993cc5eSEugene Zemtsov #include <string>
97993cc5eSEugene Zemtsov
107993cc5eSEugene Zemtsov #include "gtest/gtest.h"
117993cc5eSEugene Zemtsov
127993cc5eSEugene Zemtsov #include "lldb/Target/UnixSignals.h"
137993cc5eSEugene Zemtsov #include "llvm/Support/FormatVariadic.h"
147993cc5eSEugene Zemtsov
157993cc5eSEugene Zemtsov using namespace lldb;
167993cc5eSEugene Zemtsov using namespace lldb_private;
177993cc5eSEugene Zemtsov using llvm::None;
187993cc5eSEugene Zemtsov
197993cc5eSEugene Zemtsov class TestSignals : public UnixSignals {
207993cc5eSEugene Zemtsov public:
TestSignals()217993cc5eSEugene Zemtsov TestSignals() {
227993cc5eSEugene Zemtsov m_signals.clear();
237993cc5eSEugene Zemtsov AddSignal(2, "SIG2", false, true, true, "DESC2");
247993cc5eSEugene Zemtsov AddSignal(4, "SIG4", true, false, true, "DESC4");
257993cc5eSEugene Zemtsov AddSignal(8, "SIG8", true, true, true, "DESC8");
267993cc5eSEugene Zemtsov AddSignal(16, "SIG16", true, false, false, "DESC16");
277993cc5eSEugene Zemtsov }
287993cc5eSEugene Zemtsov };
297993cc5eSEugene Zemtsov
ExpectEqArrays(llvm::ArrayRef<int32_t> expected,llvm::ArrayRef<int32_t> observed,const char * file,int line)307993cc5eSEugene Zemtsov void ExpectEqArrays(llvm::ArrayRef<int32_t> expected,
317993cc5eSEugene Zemtsov llvm::ArrayRef<int32_t> observed, const char *file,
327993cc5eSEugene Zemtsov int line) {
337993cc5eSEugene Zemtsov std::string location = llvm::formatv("{0}:{1}", file, line);
347993cc5eSEugene Zemtsov ASSERT_EQ(expected.size(), observed.size()) << location;
357993cc5eSEugene Zemtsov
367993cc5eSEugene Zemtsov for (size_t i = 0; i < observed.size(); ++i) {
377993cc5eSEugene Zemtsov ASSERT_EQ(expected[i], observed[i])
387993cc5eSEugene Zemtsov << "array index: " << i << "location:" << location;
397993cc5eSEugene Zemtsov }
407993cc5eSEugene Zemtsov }
417993cc5eSEugene Zemtsov
427993cc5eSEugene Zemtsov #define EXPECT_EQ_ARRAYS(expected, observed) \
437993cc5eSEugene Zemtsov ExpectEqArrays((expected), (observed), __FILE__, __LINE__);
447993cc5eSEugene Zemtsov
TEST(UnixSignalsTest,Iteration)457993cc5eSEugene Zemtsov TEST(UnixSignalsTest, Iteration) {
467993cc5eSEugene Zemtsov TestSignals signals;
477993cc5eSEugene Zemtsov
487993cc5eSEugene Zemtsov EXPECT_EQ(4, signals.GetNumSignals());
497993cc5eSEugene Zemtsov EXPECT_EQ(2, signals.GetFirstSignalNumber());
507993cc5eSEugene Zemtsov EXPECT_EQ(4, signals.GetNextSignalNumber(2));
517993cc5eSEugene Zemtsov EXPECT_EQ(8, signals.GetNextSignalNumber(4));
527993cc5eSEugene Zemtsov EXPECT_EQ(16, signals.GetNextSignalNumber(8));
537993cc5eSEugene Zemtsov EXPECT_EQ(LLDB_INVALID_SIGNAL_NUMBER, signals.GetNextSignalNumber(16));
547993cc5eSEugene Zemtsov }
557993cc5eSEugene Zemtsov
TEST(UnixSignalsTest,Reset)56*134d7f9aSJim Ingham TEST(UnixSignalsTest, Reset) {
57*134d7f9aSJim Ingham TestSignals signals;
58*134d7f9aSJim Ingham bool stop_val = signals.GetShouldStop(2);
59*134d7f9aSJim Ingham bool notify_val = signals.GetShouldNotify(2);
60*134d7f9aSJim Ingham bool suppress_val = signals.GetShouldSuppress(2);
61*134d7f9aSJim Ingham
62*134d7f9aSJim Ingham // Change two, then reset one and make sure only that one was reset:
63*134d7f9aSJim Ingham EXPECT_EQ(true, signals.SetShouldNotify(2, !notify_val));
64*134d7f9aSJim Ingham EXPECT_EQ(true, signals.SetShouldSuppress(2, !suppress_val));
65*134d7f9aSJim Ingham EXPECT_EQ(true, signals.ResetSignal(2, false, true, false));
66*134d7f9aSJim Ingham EXPECT_EQ(stop_val, signals.GetShouldStop(2));
67*134d7f9aSJim Ingham EXPECT_EQ(notify_val, signals.GetShouldStop(2));
68*134d7f9aSJim Ingham EXPECT_EQ(!suppress_val, signals.GetShouldNotify(2));
69*134d7f9aSJim Ingham
70*134d7f9aSJim Ingham // Make sure reset with no arguments resets them all:
71*134d7f9aSJim Ingham EXPECT_EQ(true, signals.SetShouldSuppress(2, !suppress_val));
72*134d7f9aSJim Ingham EXPECT_EQ(true, signals.SetShouldNotify(2, !notify_val));
73*134d7f9aSJim Ingham EXPECT_EQ(true, signals.ResetSignal(2));
74*134d7f9aSJim Ingham EXPECT_EQ(stop_val, signals.GetShouldStop(2));
75*134d7f9aSJim Ingham EXPECT_EQ(notify_val, signals.GetShouldNotify(2));
76*134d7f9aSJim Ingham EXPECT_EQ(suppress_val, signals.GetShouldSuppress(2));
77*134d7f9aSJim Ingham }
78*134d7f9aSJim Ingham
TEST(UnixSignalsTest,GetInfo)797993cc5eSEugene Zemtsov TEST(UnixSignalsTest, GetInfo) {
807993cc5eSEugene Zemtsov TestSignals signals;
817993cc5eSEugene Zemtsov
827993cc5eSEugene Zemtsov bool should_suppress = false, should_stop = false, should_notify = false;
837993cc5eSEugene Zemtsov int32_t signo = 4;
847993cc5eSEugene Zemtsov std::string name =
857993cc5eSEugene Zemtsov signals.GetSignalInfo(signo, should_suppress, should_stop, should_notify);
867993cc5eSEugene Zemtsov EXPECT_EQ("SIG4", name);
877993cc5eSEugene Zemtsov EXPECT_EQ(true, should_suppress);
887993cc5eSEugene Zemtsov EXPECT_EQ(false, should_stop);
897993cc5eSEugene Zemtsov EXPECT_EQ(true, should_notify);
907993cc5eSEugene Zemtsov
917993cc5eSEugene Zemtsov EXPECT_EQ(true, signals.GetShouldSuppress(signo));
927993cc5eSEugene Zemtsov EXPECT_EQ(false, signals.GetShouldStop(signo));
937993cc5eSEugene Zemtsov EXPECT_EQ(true, signals.GetShouldNotify(signo));
947993cc5eSEugene Zemtsov EXPECT_EQ(name, signals.GetSignalAsCString(signo));
957993cc5eSEugene Zemtsov }
967993cc5eSEugene Zemtsov
TEST(UnixSignalsTest,VersionChange)977993cc5eSEugene Zemtsov TEST(UnixSignalsTest, VersionChange) {
987993cc5eSEugene Zemtsov TestSignals signals;
997993cc5eSEugene Zemtsov
1007993cc5eSEugene Zemtsov int32_t signo = 8;
1017993cc5eSEugene Zemtsov uint64_t ver = signals.GetVersion();
1027993cc5eSEugene Zemtsov EXPECT_GT(ver, 0ull);
1037993cc5eSEugene Zemtsov EXPECT_EQ(true, signals.GetShouldSuppress(signo));
1047993cc5eSEugene Zemtsov EXPECT_EQ(true, signals.GetShouldStop(signo));
1057993cc5eSEugene Zemtsov EXPECT_EQ(true, signals.GetShouldNotify(signo));
1067993cc5eSEugene Zemtsov
1077993cc5eSEugene Zemtsov EXPECT_EQ(signals.GetVersion(), ver);
1087993cc5eSEugene Zemtsov
1097993cc5eSEugene Zemtsov signals.SetShouldSuppress(signo, false);
1107993cc5eSEugene Zemtsov EXPECT_LT(ver, signals.GetVersion());
1117993cc5eSEugene Zemtsov ver = signals.GetVersion();
1127993cc5eSEugene Zemtsov
1137993cc5eSEugene Zemtsov signals.SetShouldStop(signo, true);
1147993cc5eSEugene Zemtsov EXPECT_LT(ver, signals.GetVersion());
1157993cc5eSEugene Zemtsov ver = signals.GetVersion();
1167993cc5eSEugene Zemtsov
1177993cc5eSEugene Zemtsov signals.SetShouldNotify(signo, false);
1187993cc5eSEugene Zemtsov EXPECT_LT(ver, signals.GetVersion());
1197993cc5eSEugene Zemtsov ver = signals.GetVersion();
1207993cc5eSEugene Zemtsov
1217993cc5eSEugene Zemtsov EXPECT_EQ(false, signals.GetShouldSuppress(signo));
1227993cc5eSEugene Zemtsov EXPECT_EQ(true, signals.GetShouldStop(signo));
1237993cc5eSEugene Zemtsov EXPECT_EQ(false, signals.GetShouldNotify(signo));
1247993cc5eSEugene Zemtsov
1257993cc5eSEugene Zemtsov EXPECT_EQ(ver, signals.GetVersion());
1267993cc5eSEugene Zemtsov }
1277993cc5eSEugene Zemtsov
TEST(UnixSignalsTest,GetFilteredSignals)1287993cc5eSEugene Zemtsov TEST(UnixSignalsTest, GetFilteredSignals) {
1297993cc5eSEugene Zemtsov TestSignals signals;
1307993cc5eSEugene Zemtsov
1317993cc5eSEugene Zemtsov auto all_signals = signals.GetFilteredSignals(None, None, None);
1327993cc5eSEugene Zemtsov std::vector<int32_t> expected = {2, 4, 8, 16};
1337993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, all_signals);
1347993cc5eSEugene Zemtsov
1357993cc5eSEugene Zemtsov auto supressed = signals.GetFilteredSignals(true, None, None);
1367993cc5eSEugene Zemtsov expected = {4, 8, 16};
1377993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, supressed);
1387993cc5eSEugene Zemtsov
1397993cc5eSEugene Zemtsov auto not_supressed = signals.GetFilteredSignals(false, None, None);
1407993cc5eSEugene Zemtsov expected = {2};
1417993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, not_supressed);
1427993cc5eSEugene Zemtsov
1437993cc5eSEugene Zemtsov auto stopped = signals.GetFilteredSignals(None, true, None);
1447993cc5eSEugene Zemtsov expected = {2, 8};
1457993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, stopped);
1467993cc5eSEugene Zemtsov
1477993cc5eSEugene Zemtsov auto not_stopped = signals.GetFilteredSignals(None, false, None);
1487993cc5eSEugene Zemtsov expected = {4, 16};
1497993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, not_stopped);
1507993cc5eSEugene Zemtsov
1517993cc5eSEugene Zemtsov auto notified = signals.GetFilteredSignals(None, None, true);
1527993cc5eSEugene Zemtsov expected = {2, 4, 8};
1537993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, notified);
1547993cc5eSEugene Zemtsov
1557993cc5eSEugene Zemtsov auto not_notified = signals.GetFilteredSignals(None, None, false);
1567993cc5eSEugene Zemtsov expected = {16};
1577993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, not_notified);
1587993cc5eSEugene Zemtsov
1597993cc5eSEugene Zemtsov auto signal4 = signals.GetFilteredSignals(true, false, true);
1607993cc5eSEugene Zemtsov expected = {4};
1617993cc5eSEugene Zemtsov EXPECT_EQ_ARRAYS(expected, signal4);
1627993cc5eSEugene Zemtsov }
163