1e6d48874SKrzysztof Grobelny #include "dbus_environment.hpp"
21cdd7e4fSSzymon Dompke #include "helpers.hpp"
3e6d48874SKrzysztof Grobelny #include "messages/update_report_ind.hpp"
4d960e1f3SWludzik, Jozef #include "trigger_actions.hpp"
5e6d48874SKrzysztof Grobelny #include "utils/messanger.hpp"
6d960e1f3SWludzik, Jozef
7d960e1f3SWludzik, Jozef #include <stdexcept>
8d960e1f3SWludzik, Jozef
9e6d48874SKrzysztof Grobelny #include <gmock/gmock.h>
10e6d48874SKrzysztof Grobelny
11d960e1f3SWludzik, Jozef using namespace testing;
12d960e1f3SWludzik, Jozef
13d960e1f3SWludzik, Jozef namespace action
14d960e1f3SWludzik, Jozef {
15f763c9e3SSzymon Dompke namespace numeric
16f763c9e3SSzymon Dompke {
17f763c9e3SSzymon Dompke using LogParam = std::tuple<::numeric::Type, double, double>;
18d960e1f3SWludzik, Jozef
getCorrectParams()19f763c9e3SSzymon Dompke static auto getCorrectParams()
20f763c9e3SSzymon Dompke {
21f763c9e3SSzymon Dompke return Values(std::make_tuple(::numeric::Type::upperCritical, 91.1, 90),
22f763c9e3SSzymon Dompke std::make_tuple(::numeric::Type::lowerCritical, 91.2, 90),
23f763c9e3SSzymon Dompke std::make_tuple(::numeric::Type::upperWarning, 88.5, 90),
24f763c9e3SSzymon Dompke std::make_tuple(::numeric::Type::lowerWarning, 88.6, 90));
25f763c9e3SSzymon Dompke }
26d960e1f3SWludzik, Jozef
getIncorrectParams()27f763c9e3SSzymon Dompke static auto getIncorrectParams()
28f763c9e3SSzymon Dompke {
29f763c9e3SSzymon Dompke return Values(
30f763c9e3SSzymon Dompke std::make_tuple(::numeric::Type::upperCritical, 90.0, 90),
31f763c9e3SSzymon Dompke std::make_tuple(static_cast<::numeric::Type>(-1), 88.0, 90),
32f763c9e3SSzymon Dompke std::make_tuple(static_cast<::numeric::Type>(123), 123.0, 90));
33f763c9e3SSzymon Dompke }
34f763c9e3SSzymon Dompke
35b7b7e1b6SSzymon Dompke template <typename ActionType>
36b7b7e1b6SSzymon Dompke class TestActionNumeric : public Test, public WithParamInterface<LogParam>
37d960e1f3SWludzik, Jozef {
38d960e1f3SWludzik, Jozef public:
SetUp()39d960e1f3SWludzik, Jozef void SetUp() override
40d960e1f3SWludzik, Jozef {
41f763c9e3SSzymon Dompke auto [type, threshold, value] = GetParam();
42b7b7e1b6SSzymon Dompke sut = std::make_unique<ActionType>(type, threshold);
43f763c9e3SSzymon Dompke commmitValue = value;
44f763c9e3SSzymon Dompke }
45f763c9e3SSzymon Dompke
commit()46b7b7e1b6SSzymon Dompke void commit()
47b7b7e1b6SSzymon Dompke {
48b7b7e1b6SSzymon Dompke sut->commit("MyTrigger", std::nullopt, "MySensor",
49b7b7e1b6SSzymon Dompke Milliseconds{100'000}, commmitValue);
50b7b7e1b6SSzymon Dompke }
51b7b7e1b6SSzymon Dompke
52b7b7e1b6SSzymon Dompke std::unique_ptr<ActionType> sut;
53f763c9e3SSzymon Dompke double commmitValue;
54f763c9e3SSzymon Dompke };
55f763c9e3SSzymon Dompke
56b7b7e1b6SSzymon Dompke class TestLogToJournalNumeric : public TestActionNumeric<LogToJournal>
57b7b7e1b6SSzymon Dompke {};
58b7b7e1b6SSzymon Dompke
59f763c9e3SSzymon Dompke INSTANTIATE_TEST_SUITE_P(LogToJournalNumericParams, TestLogToJournalNumeric,
60f763c9e3SSzymon Dompke getCorrectParams());
61f763c9e3SSzymon Dompke
TEST_P(TestLogToJournalNumeric,commitAnActionDoesNotThrow)62f763c9e3SSzymon Dompke TEST_P(TestLogToJournalNumeric, commitAnActionDoesNotThrow)
63f763c9e3SSzymon Dompke {
64b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit());
65f763c9e3SSzymon Dompke }
66f763c9e3SSzymon Dompke
67f763c9e3SSzymon Dompke class TestLogToJournalNumericThrow : public TestLogToJournalNumeric
68f763c9e3SSzymon Dompke {};
69f763c9e3SSzymon Dompke
70f763c9e3SSzymon Dompke INSTANTIATE_TEST_SUITE_P(_, TestLogToJournalNumericThrow, getIncorrectParams());
71f763c9e3SSzymon Dompke
TEST_P(TestLogToJournalNumericThrow,commitAnActionExpectThrow)72f763c9e3SSzymon Dompke TEST_P(TestLogToJournalNumericThrow, commitAnActionExpectThrow)
73f763c9e3SSzymon Dompke {
74b7b7e1b6SSzymon Dompke EXPECT_ANY_THROW(commit());
75f763c9e3SSzymon Dompke }
76f763c9e3SSzymon Dompke
77b7b7e1b6SSzymon Dompke class TestLogToRedfishEventLogNumeric :
78b7b7e1b6SSzymon Dompke public TestActionNumeric<LogToRedfishEventLog>
79f763c9e3SSzymon Dompke {};
80f763c9e3SSzymon Dompke
81b7b7e1b6SSzymon Dompke INSTANTIATE_TEST_SUITE_P(LogToRedfishEventLogNumericParams,
82b7b7e1b6SSzymon Dompke TestLogToRedfishEventLogNumeric, getCorrectParams());
83f763c9e3SSzymon Dompke
TEST_P(TestLogToRedfishEventLogNumeric,commitExpectNoThrow)84b7b7e1b6SSzymon Dompke TEST_P(TestLogToRedfishEventLogNumeric, commitExpectNoThrow)
85f763c9e3SSzymon Dompke {
86b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit());
87b7b7e1b6SSzymon Dompke }
88b7b7e1b6SSzymon Dompke
89b7b7e1b6SSzymon Dompke class TestLogToRedfishEventLogNumericThrow :
90b7b7e1b6SSzymon Dompke public TestLogToRedfishEventLogNumeric
91b7b7e1b6SSzymon Dompke {};
92b7b7e1b6SSzymon Dompke
93b7b7e1b6SSzymon Dompke INSTANTIATE_TEST_SUITE_P(_, TestLogToRedfishEventLogNumericThrow,
94b7b7e1b6SSzymon Dompke getIncorrectParams());
95b7b7e1b6SSzymon Dompke
TEST_P(TestLogToRedfishEventLogNumericThrow,commitExpectToThrow)96b7b7e1b6SSzymon Dompke TEST_P(TestLogToRedfishEventLogNumericThrow, commitExpectToThrow)
97b7b7e1b6SSzymon Dompke {
98b7b7e1b6SSzymon Dompke EXPECT_ANY_THROW(commit());
99f763c9e3SSzymon Dompke }
100f763c9e3SSzymon Dompke
101f763c9e3SSzymon Dompke } // namespace numeric
102f763c9e3SSzymon Dompke
103f763c9e3SSzymon Dompke namespace discrete
104f763c9e3SSzymon Dompke {
105b7b7e1b6SSzymon Dompke using LogParam = std::tuple<::discrete::Severity, TriggerValue>;
106f763c9e3SSzymon Dompke
getCorrectParams()107f763c9e3SSzymon Dompke static auto getCorrectParams()
108f763c9e3SSzymon Dompke {
109b7b7e1b6SSzymon Dompke return Values(
110b7b7e1b6SSzymon Dompke std::make_tuple(::discrete::Severity::critical,
111b7b7e1b6SSzymon Dompke TriggerValue("DiscreteVal")),
112b7b7e1b6SSzymon Dompke std::make_tuple(::discrete::Severity::warning, TriggerValue("On")),
113b7b7e1b6SSzymon Dompke std::make_tuple(::discrete::Severity::ok, TriggerValue("Off")));
114f763c9e3SSzymon Dompke }
115f763c9e3SSzymon Dompke
getIncorrectParams()116f763c9e3SSzymon Dompke static auto getIncorrectParams()
117f763c9e3SSzymon Dompke {
118b7b7e1b6SSzymon Dompke return Values(
119b7b7e1b6SSzymon Dompke std::make_tuple(static_cast<::discrete::Severity>(-1),
120b7b7e1b6SSzymon Dompke TriggerValue("DiscreteVal42")),
121b7b7e1b6SSzymon Dompke std::make_tuple(static_cast<::discrete::Severity>(42),
122b7b7e1b6SSzymon Dompke TriggerValue("On")),
123b7b7e1b6SSzymon Dompke std::make_tuple(::discrete::Severity::critical, TriggerValue(42.0)),
124b7b7e1b6SSzymon Dompke std::make_tuple(::discrete::Severity::warning, TriggerValue(0.0)),
125b7b7e1b6SSzymon Dompke std::make_tuple(::discrete::Severity::ok, TriggerValue(0.1)));
126f763c9e3SSzymon Dompke }
127f763c9e3SSzymon Dompke
128b7b7e1b6SSzymon Dompke template <typename ActionType>
129b7b7e1b6SSzymon Dompke class TestActionDiscrete : public Test, public WithParamInterface<LogParam>
130f763c9e3SSzymon Dompke {
131f763c9e3SSzymon Dompke public:
SetUp()132f763c9e3SSzymon Dompke void SetUp() override
133f763c9e3SSzymon Dompke {
134b7b7e1b6SSzymon Dompke auto [severity, value] = GetParam();
135b7b7e1b6SSzymon Dompke sut = std::make_unique<ActionType>(severity);
136b7b7e1b6SSzymon Dompke commitValue = value;
137d960e1f3SWludzik, Jozef }
138d960e1f3SWludzik, Jozef
commit()139b7b7e1b6SSzymon Dompke void commit()
140b7b7e1b6SSzymon Dompke {
141b7b7e1b6SSzymon Dompke std::string thresholdName = "MyThreshold";
142b7b7e1b6SSzymon Dompke sut->commit("MyTrigger", std::cref(thresholdName), "MySensor",
143b7b7e1b6SSzymon Dompke Milliseconds{100'000}, commitValue);
144b7b7e1b6SSzymon Dompke }
145b7b7e1b6SSzymon Dompke
146b7b7e1b6SSzymon Dompke TriggerValue commitValue;
147b7b7e1b6SSzymon Dompke std::unique_ptr<ActionType> sut;
148d960e1f3SWludzik, Jozef };
149d960e1f3SWludzik, Jozef
150b7b7e1b6SSzymon Dompke class TestLogToJournalDiscrete : public TestActionDiscrete<LogToJournal>
151b7b7e1b6SSzymon Dompke {};
152b7b7e1b6SSzymon Dompke
153f763c9e3SSzymon Dompke INSTANTIATE_TEST_SUITE_P(LogToJournalDiscreteParams, TestLogToJournalDiscrete,
154f763c9e3SSzymon Dompke getCorrectParams());
155d960e1f3SWludzik, Jozef
TEST_P(TestLogToJournalDiscrete,commitAnActionWIthDiscreteValueDoesNotThrow)156b7b7e1b6SSzymon Dompke TEST_P(TestLogToJournalDiscrete, commitAnActionWIthDiscreteValueDoesNotThrow)
157d960e1f3SWludzik, Jozef {
158b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit());
159d960e1f3SWludzik, Jozef }
160d960e1f3SWludzik, Jozef
161f763c9e3SSzymon Dompke class TestLogToJournalDiscreteThrow : public TestLogToJournalDiscrete
162d960e1f3SWludzik, Jozef {};
163d960e1f3SWludzik, Jozef
164f763c9e3SSzymon Dompke INSTANTIATE_TEST_SUITE_P(_, TestLogToJournalDiscreteThrow,
165f763c9e3SSzymon Dompke getIncorrectParams());
166d960e1f3SWludzik, Jozef
TEST_P(TestLogToJournalDiscreteThrow,commitAnActionExpectThrow)167f763c9e3SSzymon Dompke TEST_P(TestLogToJournalDiscreteThrow, commitAnActionExpectThrow)
168d960e1f3SWludzik, Jozef {
169b7b7e1b6SSzymon Dompke EXPECT_ANY_THROW(commit());
170d960e1f3SWludzik, Jozef }
171d960e1f3SWludzik, Jozef
172b7b7e1b6SSzymon Dompke class TestLogToRedfishEventLogDiscrete :
173b7b7e1b6SSzymon Dompke public TestActionDiscrete<LogToRedfishEventLog>
174d960e1f3SWludzik, Jozef {};
175d960e1f3SWludzik, Jozef
176b7b7e1b6SSzymon Dompke INSTANTIATE_TEST_SUITE_P(LogToRedfishEventLogDiscreteParams,
177b7b7e1b6SSzymon Dompke TestLogToRedfishEventLogDiscrete, getCorrectParams());
178b7b7e1b6SSzymon Dompke
TEST_P(TestLogToRedfishEventLogDiscrete,commitExpectNoThrow)179b7b7e1b6SSzymon Dompke TEST_P(TestLogToRedfishEventLogDiscrete, commitExpectNoThrow)
180b7b7e1b6SSzymon Dompke {
181b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit());
182b7b7e1b6SSzymon Dompke }
183b7b7e1b6SSzymon Dompke
184b7b7e1b6SSzymon Dompke class TestLogToRedfishEventLogDiscreteThrow :
185b7b7e1b6SSzymon Dompke public TestLogToRedfishEventLogDiscrete
186b7b7e1b6SSzymon Dompke {};
187b7b7e1b6SSzymon Dompke
188b7b7e1b6SSzymon Dompke INSTANTIATE_TEST_SUITE_P(_, TestLogToRedfishEventLogDiscreteThrow,
189f763c9e3SSzymon Dompke getIncorrectParams());
190d960e1f3SWludzik, Jozef
TEST_P(TestLogToRedfishEventLogDiscreteThrow,commitExpectToThrow)191b7b7e1b6SSzymon Dompke TEST_P(TestLogToRedfishEventLogDiscreteThrow, commitExpectToThrow)
192d960e1f3SWludzik, Jozef {
193b7b7e1b6SSzymon Dompke EXPECT_ANY_THROW(commit());
194d960e1f3SWludzik, Jozef }
195d960e1f3SWludzik, Jozef
196f763c9e3SSzymon Dompke namespace onChange
197f763c9e3SSzymon Dompke {
198b7b7e1b6SSzymon Dompke
199b7b7e1b6SSzymon Dompke template <typename ActionType>
200b7b7e1b6SSzymon Dompke class TestActionOnChange : public Test
201f763c9e3SSzymon Dompke {
202f763c9e3SSzymon Dompke public:
SetUp()203f763c9e3SSzymon Dompke void SetUp() override
204f763c9e3SSzymon Dompke {
205b7b7e1b6SSzymon Dompke sut = std::make_unique<ActionType>();
206f763c9e3SSzymon Dompke }
207f763c9e3SSzymon Dompke
commit(TriggerValue value)208b7b7e1b6SSzymon Dompke void commit(TriggerValue value)
209b7b7e1b6SSzymon Dompke {
210b7b7e1b6SSzymon Dompke sut->commit("MyTrigger", std::nullopt, "MySensor",
211b7b7e1b6SSzymon Dompke Milliseconds{100'000}, value);
212b7b7e1b6SSzymon Dompke }
213b7b7e1b6SSzymon Dompke
214b7b7e1b6SSzymon Dompke std::unique_ptr<ActionType> sut;
215f763c9e3SSzymon Dompke };
216f763c9e3SSzymon Dompke
217b7b7e1b6SSzymon Dompke class TestLogToJournalDiscreteOnChange : public TestActionOnChange<LogToJournal>
218b7b7e1b6SSzymon Dompke {};
219b7b7e1b6SSzymon Dompke
TEST_F(TestLogToJournalDiscreteOnChange,commitNumericValueExpectNoThrow)220b7b7e1b6SSzymon Dompke TEST_F(TestLogToJournalDiscreteOnChange, commitNumericValueExpectNoThrow)
221f763c9e3SSzymon Dompke {
222b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit(90.0));
223f763c9e3SSzymon Dompke }
224f763c9e3SSzymon Dompke
TEST_F(TestLogToJournalDiscreteOnChange,commitDiscreteValueExpectNoThrow)225b7b7e1b6SSzymon Dompke TEST_F(TestLogToJournalDiscreteOnChange, commitDiscreteValueExpectNoThrow)
226f763c9e3SSzymon Dompke {
227b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit("Off"));
228f763c9e3SSzymon Dompke }
229f763c9e3SSzymon Dompke
230b7b7e1b6SSzymon Dompke class TestLogToRedfishEventLogDiscreteOnChange :
231b7b7e1b6SSzymon Dompke public TestActionOnChange<LogToRedfishEventLog>
232b7b7e1b6SSzymon Dompke {};
233f763c9e3SSzymon Dompke
TEST_F(TestLogToRedfishEventLogDiscreteOnChange,commitNumericValueExpectNoThrow)234b7b7e1b6SSzymon Dompke TEST_F(TestLogToRedfishEventLogDiscreteOnChange,
235b7b7e1b6SSzymon Dompke commitNumericValueExpectNoThrow)
236f763c9e3SSzymon Dompke {
237b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit(90.0));
238f763c9e3SSzymon Dompke }
239b7b7e1b6SSzymon Dompke
TEST_F(TestLogToRedfishEventLogDiscreteOnChange,commitDiscreteValueExpectNoThrow)240b7b7e1b6SSzymon Dompke TEST_F(TestLogToRedfishEventLogDiscreteOnChange,
241b7b7e1b6SSzymon Dompke commitDiscreteValueExpectNoThrow)
242b7b7e1b6SSzymon Dompke {
243b7b7e1b6SSzymon Dompke EXPECT_NO_THROW(commit("Off"));
244b7b7e1b6SSzymon Dompke }
245b7b7e1b6SSzymon Dompke
246f763c9e3SSzymon Dompke } // namespace onChange
247f763c9e3SSzymon Dompke } // namespace discrete
248f763c9e3SSzymon Dompke
249d960e1f3SWludzik, Jozef class TestUpdateReport : public Test
250d960e1f3SWludzik, Jozef {
251d960e1f3SWludzik, Jozef public:
TestUpdateReport()252*3a1c297aSPatrick Williams TestUpdateReport() : messanger(DbusEnvironment::getIoc()) {}
253e6d48874SKrzysztof Grobelny
make(std::vector<std::string> names)254d960e1f3SWludzik, Jozef void make(std::vector<std::string> names)
255d960e1f3SWludzik, Jozef {
256e6d48874SKrzysztof Grobelny messanger.on_receive<messages::UpdateReportInd>(
257e6d48874SKrzysztof Grobelny [this](const auto& msg) { updateReport.Call(msg); });
258e6d48874SKrzysztof Grobelny
25994f71c51SSzymon Dompke sut = std::make_unique<UpdateReport>(
260e6d48874SKrzysztof Grobelny DbusEnvironment::getIoc(),
26194f71c51SSzymon Dompke std::make_shared<std::vector<std::string>>(std::move(names)));
262d960e1f3SWludzik, Jozef }
263d960e1f3SWludzik, Jozef
commit(TriggerValue value)264b7b7e1b6SSzymon Dompke void commit(TriggerValue value)
265b7b7e1b6SSzymon Dompke {
266b7b7e1b6SSzymon Dompke sut->commit(triggerId, std::nullopt, "MySensor", Milliseconds{100'000},
267b7b7e1b6SSzymon Dompke value);
268b7b7e1b6SSzymon Dompke }
269b7b7e1b6SSzymon Dompke
270e6d48874SKrzysztof Grobelny utils::Messanger messanger;
271e6d48874SKrzysztof Grobelny NiceMock<MockFunction<void(const messages::UpdateReportInd&)>> updateReport;
272d960e1f3SWludzik, Jozef std::unique_ptr<UpdateReport> sut;
273b7b7e1b6SSzymon Dompke std::string triggerId = "MyTrigger";
274d960e1f3SWludzik, Jozef };
275d960e1f3SWludzik, Jozef
TEST_F(TestUpdateReport,commitWhenReportNameIsEmptyExpectNoReportUpdate)276d960e1f3SWludzik, Jozef TEST_F(TestUpdateReport, commitWhenReportNameIsEmptyExpectNoReportUpdate)
277d960e1f3SWludzik, Jozef {
278e6d48874SKrzysztof Grobelny EXPECT_CALL(updateReport, Call(_)).Times(0);
279d960e1f3SWludzik, Jozef
280d960e1f3SWludzik, Jozef make({});
281b7b7e1b6SSzymon Dompke commit(90.0);
282d960e1f3SWludzik, Jozef }
283d960e1f3SWludzik, Jozef
TEST_F(TestUpdateReport,commitExpectReportUpdate)284d960e1f3SWludzik, Jozef TEST_F(TestUpdateReport, commitExpectReportUpdate)
285d960e1f3SWludzik, Jozef {
286d960e1f3SWludzik, Jozef std::vector<std::string> names = {"Report1", "Report2", "Report3"};
287e6d48874SKrzysztof Grobelny EXPECT_CALL(updateReport,
288e6d48874SKrzysztof Grobelny Call(FieldsAre(UnorderedElementsAreArray(names))));
289d960e1f3SWludzik, Jozef
290d960e1f3SWludzik, Jozef make(names);
291b7b7e1b6SSzymon Dompke commit(90.0);
292d960e1f3SWludzik, Jozef }
293d960e1f3SWludzik, Jozef
294d960e1f3SWludzik, Jozef } // namespace action
295