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