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