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