blob: f425350fc4b9853641342a426d93c2f46a0e24e2 [file] [log] [blame]
Wludzik, Jozef76833cb2020-12-21 14:42:41 +01001#include "dbus_environment.hpp"
2#include "helpers.hpp"
Cezary Zwolaka4e67612021-02-18 13:16:16 +01003#include "mocks/json_storage_mock.hpp"
Wludzik, Jozef76833cb2020-12-21 14:42:41 +01004#include "mocks/trigger_factory_mock.hpp"
5#include "mocks/trigger_mock.hpp"
6#include "params/trigger_params.hpp"
Cezary Zwolak4416fce2021-03-17 03:21:06 +01007#include "trigger.hpp"
Wludzik, Jozef76833cb2020-12-21 14:42:41 +01008#include "trigger_manager.hpp"
Cezary Zwolak4416fce2021-03-17 03:21:06 +01009#include "utils/conversion_trigger.hpp"
Szymon Dompke32305f12022-07-05 15:37:21 +020010#include "utils/dbus_path_utils.hpp"
11#include "utils/string_utils.hpp"
Cezary Zwolak4416fce2021-03-17 03:21:06 +010012#include "utils/transform.hpp"
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010013
14using namespace testing;
Szymon Dompke1cdd7e42022-06-08 14:43:13 +020015using sdbusplus::message::object_path;
Szymon Dompke32305f12022-07-05 15:37:21 +020016using namespace std::literals::string_literals;
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010017
18class TestTriggerManager : public Test
19{
20 public:
Szymon Dompke32305f12022-07-05 15:37:21 +020021 TriggerParams triggerParams;
Patrick Williams583ba442025-02-03 14:28:19 -050022 std::pair<boost::system::error_code, std::string> addTrigger(
23 const TriggerParams& params)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010024 {
Cezary Zwolak4416fce2021-03-17 03:21:06 +010025 const auto sensorInfos =
26 utils::fromLabeledSensorsInfo(params.sensors());
Ed Tanous2efa95d2024-10-19 11:36:53 -070027 const std::vector<numeric::LabeledThresholdParam> numThresh =
28 params.numericThresholdParams();
29 const std::vector<discrete::LabeledThresholdParam> discThresh =
30 params.discreteThresholdParams();
31 const std::vector<numeric::ThresholdParam> numThresh2 = std::get<0>(
32 utils::FromLabeledThresholdParamConversion()(numThresh));
33 const auto discThresh2 = std::get<1>(
34 utils::FromLabeledThresholdParamConversion()(discThresh));
Cezary Zwolak4416fce2021-03-17 03:21:06 +010035
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010036 std::promise<std::pair<boost::system::error_code, std::string>>
37 addTriggerPromise;
38 DbusEnvironment::getBus()->async_method_call(
39 [&addTriggerPromise](boost::system::error_code ec,
40 const std::string& path) {
Patrick Williams583ba442025-02-03 14:28:19 -050041 addTriggerPromise.set_value({ec, path});
42 },
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010043 DbusEnvironment::serviceName(), TriggerManager::triggerManagerPath,
Szymon Dompkee28aa532021-10-27 12:33:12 +020044 TriggerManager::triggerManagerIfaceName, "AddTrigger", params.id(),
Szymon Dompke94f71c52021-12-10 07:16:33 +010045 params.name(),
Patrick Williams583ba442025-02-03 14:28:19 -050046 utils::transform(params.triggerActions(),
47 [](const auto& action) {
48 return actionToString(action);
49 }),
Ed Tanous2efa95d2024-10-19 11:36:53 -070050 sensorInfos, params.reports(), numThresh2, discThresh2);
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010051 return DbusEnvironment::waitForFuture(addTriggerPromise.get_future());
52 }
53
Cezary Zwolak4416fce2021-03-17 03:21:06 +010054 std::unique_ptr<TriggerManager> makeTriggerManager()
55 {
56 return std::make_unique<TriggerManager>(
57 std::move(triggerFactoryMockPtr), std::move(storageMockPtr),
58 DbusEnvironment::getObjServer());
59 }
60
61 void SetUp() override
62 {
63 sut = makeTriggerManager();
64 }
65
Cezary Zwolaka4e67612021-02-18 13:16:16 +010066 std::unique_ptr<StorageMock> storageMockPtr =
67 std::make_unique<NiceMock<StorageMock>>();
68 StorageMock& storageMock = *storageMockPtr;
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010069 std::unique_ptr<TriggerFactoryMock> triggerFactoryMockPtr =
70 std::make_unique<NiceMock<TriggerFactoryMock>>();
71 TriggerFactoryMock& triggerFactoryMock = *triggerFactoryMockPtr;
72 std::unique_ptr<TriggerMock> triggerMockPtr =
Szymon Dompkee28aa532021-10-27 12:33:12 +020073 std::make_unique<NiceMock<TriggerMock>>(TriggerParams().id());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010074 TriggerMock& triggerMock = *triggerMockPtr;
Cezary Zwolak4416fce2021-03-17 03:21:06 +010075 std::unique_ptr<TriggerManager> sut;
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010076 MockFunction<void(std::string)> checkPoint;
77};
78
79TEST_F(TestTriggerManager, addTrigger)
80{
Cezary Zwolak4416fce2021-03-17 03:21:06 +010081 triggerFactoryMock.expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010082 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
83
Cezary Zwolak4416fce2021-03-17 03:21:06 +010084 auto [ec, path] = addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010085 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
86 EXPECT_THAT(path, Eq(triggerMock.getPath()));
87}
88
Szymon Dompkef763c9e2021-03-12 09:19:22 +010089TEST_F(TestTriggerManager, addTriggerWithDiscreteThresholds)
90{
91 TriggerParams triggerParamsDiscrete;
Cezary Zwolak4416fce2021-03-17 03:21:06 +010092 auto thresholds = std::vector<discrete::LabeledThresholdParam>{
Szymon Dompke9f346792021-07-14 21:07:11 +020093 {"discrete_threshold1", discrete::Severity::ok, 10, "11.0"},
94 {"discrete_threshold2", discrete::Severity::warning, 10, "12.0"},
95 {"discrete_threshold3", discrete::Severity::critical, 10, "13.0"}};
Szymon Dompkef763c9e2021-03-12 09:19:22 +010096
Szymon Dompke20013012021-07-23 09:54:20 +020097 triggerParamsDiscrete.thresholdParams(thresholds);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010098
99 auto [ec, path] = addTrigger(triggerParamsDiscrete);
100 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
101 EXPECT_THAT(path, Eq(triggerMock.getPath()));
102}
103
104TEST_F(TestTriggerManager, addDiscreteTriggerWithoutThresholds)
105{
106 TriggerParams triggerParamsDiscrete;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100107 auto thresholds = std::vector<discrete::LabeledThresholdParam>();
Szymon Dompkef763c9e2021-03-12 09:19:22 +0100108
Szymon Dompke20013012021-07-23 09:54:20 +0200109 triggerParamsDiscrete.thresholdParams(thresholds);
Szymon Dompkef763c9e2021-03-12 09:19:22 +0100110
111 auto [ec, path] = addTrigger(triggerParamsDiscrete);
112 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
113 EXPECT_THAT(path, Eq(triggerMock.getPath()));
114}
115
Michal Orzelb47b7db2024-09-16 10:02:29 +0200116TEST_F(TestTriggerManager, failToAddTriggerTwice)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100117{
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100118 triggerFactoryMock.expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100119 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
120
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100121 addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100122
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100123 auto [ec, path] = addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100124 EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
125 EXPECT_THAT(path, Eq(std::string()));
126}
127
Michal Orzelb47b7db2024-09-16 10:02:29 +0200128TEST_F(TestTriggerManager, failToAddTriggerWithInvalidId)
Szymon Dompkee28aa532021-10-27 12:33:12 +0200129{
130 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
131 .Times(0);
132
133 auto [ec, path] = addTrigger(TriggerParams().id("not valid?"));
134 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
135 EXPECT_THAT(path, Eq(std::string()));
136}
137
Michal Orzelb47b7db2024-09-16 10:02:29 +0200138TEST_F(TestTriggerManager, failToAddTriggerWithDuplicatesInReportsIds)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100139{
140 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
141 .Times(0);
142
143 auto [ec, path] = addTrigger(
144 TriggerParams().reportIds({"trigger1", "trigger2", "trigger1"}));
145 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
146 EXPECT_THAT(path, Eq(std::string()));
147}
148
Szymon Dompke1cdd7e42022-06-08 14:43:13 +0200149TEST_F(TestTriggerManager, addTriggerWithProperReportPaths)
150{
151 auto [ec, path] = addTrigger(TriggerParams().reports(
152 {object_path("/xyz/openbmc_project/Telemetry/Reports/MyReport"),
153 object_path(
154 "/xyz/openbmc_project/Telemetry/Reports/MyPrefix/MyReport")}));
155 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
156 EXPECT_THAT(path, Eq(triggerMock.getPath()));
157}
158
Michal Orzelb47b7db2024-09-16 10:02:29 +0200159TEST_F(TestTriggerManager, failToAddTriggerWithBadReportsPath)
Szymon Dompke1cdd7e42022-06-08 14:43:13 +0200160{
161 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
162 .Times(0);
163
164 auto [ec, path] = addTrigger(TriggerParams().reports(
165 {object_path("/xyz/openbmc_project/Telemetry/NotReports/MyReport")}));
166 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
167 EXPECT_THAT(path, Eq(std::string()));
168}
169
Michal Orzelb47b7db2024-09-16 10:02:29 +0200170TEST_F(TestTriggerManager, failToAddTriggerWithTooManyReportPrefixes)
Szymon Dompke1cdd7e42022-06-08 14:43:13 +0200171{
172 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
173 .Times(0);
174
175 auto [ec, path] = addTrigger(TriggerParams().reports({object_path(
176 "/xyz/openbmc_project/Telemetry/Reports/P1/P2/MyReport")}));
177 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
178 EXPECT_THAT(path, Eq(std::string()));
179}
180
Szymon Dompkee28aa532021-10-27 12:33:12 +0200181TEST_F(TestTriggerManager, addTriggerWithoutIdAndName)
182{
183 triggerFactoryMock
184 .expectMake(TriggerParams()
185 .id(TriggerManager::triggerNameDefault)
186 .name(TriggerManager::triggerNameDefault),
187 Ref(*sut), Ref(storageMock))
188 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
189
190 auto [ec, path] = addTrigger(TriggerParams().id("").name(""));
191 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
192 EXPECT_THAT(path, Not(Eq("")));
193}
194
195TEST_F(TestTriggerManager, addTriggerWithPrefixId)
196{
197 triggerFactoryMock
198 .expectMake(TriggerParams()
199 .id("TelemetryService/HackyName")
200 .name("Hacky/Name!@#$"),
201 Ref(*sut), Ref(storageMock))
202 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
203
204 auto [ec, path] = addTrigger(
205 TriggerParams().id("TelemetryService/").name("Hacky/Name!@#$"));
206 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
207 EXPECT_THAT(path, Not(Eq("")));
208}
209
210TEST_F(TestTriggerManager, addTriggerWithoutIdTwice)
211{
212 addTrigger(TriggerParams().id(""));
213
214 auto [ec, path] = addTrigger(TriggerParams().id(""));
215 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
216 EXPECT_THAT(path, Not(Eq("")));
217}
218
219TEST_F(TestTriggerManager, addTriggerWithoutIdAndWithLongNameTwice)
220{
Szymon Dompke32305f12022-07-05 15:37:21 +0200221 std::string longName = utils::string_utils::getMaxName();
222 addTrigger(TriggerParams().id("").name(longName));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200223
Szymon Dompke32305f12022-07-05 15:37:21 +0200224 auto [ec, path] = addTrigger(TriggerParams().id("").name(longName));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200225 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
226 EXPECT_THAT(path, Not(Eq("")));
227}
228
229TEST_F(TestTriggerManager, addTriggerWithMaxLengthId)
230{
Szymon Dompke32305f12022-07-05 15:37:21 +0200231 std::string reportId = utils::string_utils::getMaxId();
232 triggerParams.id(reportId);
233 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200234
235 auto [ec, path] = addTrigger(triggerParams);
236
237 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Szymon Dompke32305f12022-07-05 15:37:21 +0200238 EXPECT_THAT(path, Eq("/"s + reportId));
239}
240
241TEST_F(TestTriggerManager, addTriggerWithMaxLengthPrefix)
242{
243 std::string reportId = utils::string_utils::getMaxPrefix() + "/MyId";
244 triggerParams.id(reportId);
245 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
246
247 auto [ec, path] = addTrigger(triggerParams);
248
249 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
250 EXPECT_THAT(path, Eq("/"s + reportId));
251}
252
253TEST_F(TestTriggerManager, addTriggerWithMaxLengthName)
254{
255 triggerParams.name(utils::string_utils::getMaxName());
256 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
257
258 auto [ec, path] = addTrigger(triggerParams);
259
260 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
261 EXPECT_THAT(path, Eq("/"s + triggerParams.id()));
262}
263
264TEST_F(TestTriggerManager, addTriggerWithMaxLengthDiscreteThresholdName)
265{
266 namespace ts = utils::tstring;
267
268 triggerParams =
269 TriggerParams()
270 .id("DiscreteTrigger")
271 .name("My Discrete Trigger")
272 .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
273 discrete::LabeledThresholdParam{
274 utils::string_utils::getMaxName(),
275 discrete::Severity::warning, Milliseconds(10).count(),
276 "15.2"}});
277
278 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
279
280 auto [ec, path] = addTrigger(triggerParams);
281
282 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
283 EXPECT_THAT(path, Eq("/"s + triggerParams.id()));
284}
285
Michal Orzelb47b7db2024-09-16 10:02:29 +0200286TEST_F(TestTriggerManager, failToAddTriggerWithTooLongFullId)
Szymon Dompke32305f12022-07-05 15:37:21 +0200287{
288 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
289 .Times(0);
290
291 triggerParams.id(
292 std::string(utils::constants::maxReportFullIdLength + 1, 'z'));
293
294 auto [ec, path] = addTrigger(triggerParams);
295
296 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
297 EXPECT_THAT(path, Eq(std::string()));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200298}
299
Michal Orzelb47b7db2024-09-16 10:02:29 +0200300TEST_F(TestTriggerManager, failToAddTriggerWithTooLongId)
Szymon Dompkee28aa532021-10-27 12:33:12 +0200301{
Szymon Dompke32305f12022-07-05 15:37:21 +0200302 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
303 .Times(0);
304
305 triggerParams.id(utils::string_utils::getTooLongId());
306
307 auto [ec, path] = addTrigger(triggerParams);
308
309 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
310 EXPECT_THAT(path, Eq(std::string()));
311}
312
Michal Orzelb47b7db2024-09-16 10:02:29 +0200313TEST_F(TestTriggerManager, failToAddTriggerWithTooLongPrefix)
Szymon Dompke32305f12022-07-05 15:37:21 +0200314{
315 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
316 .Times(0);
317
318 triggerParams.id(utils::string_utils::getTooLongPrefix() + "/MyId");
319
320 auto [ec, path] = addTrigger(triggerParams);
321
322 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
323 EXPECT_THAT(path, Eq(std::string()));
324}
325
Michal Orzelb47b7db2024-09-16 10:02:29 +0200326TEST_F(TestTriggerManager, failToAddTriggerWithTooManyPrefixes)
Szymon Dompke32305f12022-07-05 15:37:21 +0200327{
328 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
329 .Times(0);
330
331 std::string reportId;
332 for (size_t i = 0; i < utils::constants::maxPrefixesInId + 1; i++)
333 {
334 reportId += "prefix/";
335 }
336 reportId += "MyId";
337
338 triggerParams.id(reportId);
339
340 auto [ec, path] = addTrigger(triggerParams);
341
342 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
343 EXPECT_THAT(path, Eq(std::string()));
344}
345
Michal Orzelb47b7db2024-09-16 10:02:29 +0200346TEST_F(TestTriggerManager, failToAddTriggerWithTooLongName)
Szymon Dompke32305f12022-07-05 15:37:21 +0200347{
348 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
349 .Times(0);
350
351 triggerParams.name(utils::string_utils::getTooLongName());
352
353 auto [ec, path] = addTrigger(triggerParams);
354
355 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
356 EXPECT_THAT(path, Eq(std::string()));
357}
358
Michal Orzelb47b7db2024-09-16 10:02:29 +0200359TEST_F(TestTriggerManager, failToAddTriggerWithTooLongMetricId)
Szymon Dompke32305f12022-07-05 15:37:21 +0200360{
361 namespace ts = utils::tstring;
362
363 triggerParams =
364 TriggerParams()
365 .id("DiscreteTrigger")
366 .name("My Discrete Trigger")
367 .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
368 discrete::LabeledThresholdParam{
369 utils::string_utils::getTooLongName(),
370 discrete::Severity::warning, Milliseconds(10).count(),
371 "15.2"}});
Szymon Dompkee28aa532021-10-27 12:33:12 +0200372
373 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
374 .Times(0);
375
376 auto [ec, path] = addTrigger(triggerParams);
377
378 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
379 EXPECT_THAT(path, Eq(std::string()));
380}
381
Michal Orzelb47b7db2024-09-16 10:02:29 +0200382TEST_F(TestTriggerManager, failToAddTriggerWhenMaxTriggerIsReached)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100383{
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100384 auto triggerParams = TriggerParams();
385
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100386 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100387 .Times(TriggerManager::maxTriggers);
388
389 for (size_t i = 0; i < TriggerManager::maxTriggers; i++)
390 {
Szymon Dompkee28aa532021-10-27 12:33:12 +0200391 triggerParams.id(TriggerParams().id() + std::to_string(i));
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100392
393 auto [ec, path] = addTrigger(triggerParams);
394 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
395 }
396
Patrick Williams583ba442025-02-03 14:28:19 -0500397 triggerParams.id(
398 TriggerParams().id() + std::to_string(TriggerManager::maxTriggers));
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100399 auto [ec, path] = addTrigger(triggerParams);
400 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
401 EXPECT_THAT(path, Eq(std::string()));
402}
403
404TEST_F(TestTriggerManager, removeTrigger)
405{
406 {
407 InSequence seq;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100408 triggerFactoryMock
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100409 .expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100410 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
411 EXPECT_CALL(triggerMock, Die());
412 EXPECT_CALL(checkPoint, Call("end"));
413 }
414
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100415 addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100416 sut->removeTrigger(&triggerMock);
417 checkPoint.Call("end");
418}
419
420TEST_F(TestTriggerManager, removingTriggerThatIsNotInContainerHasNoEffect)
421{
422 {
423 InSequence seq;
424 EXPECT_CALL(checkPoint, Call("end"));
425 EXPECT_CALL(triggerMock, Die());
426 }
427
428 sut->removeTrigger(&triggerMock);
429 checkPoint.Call("end");
430}
431
432TEST_F(TestTriggerManager, removingSameTriggerTwiceHasNoSideEffect)
433{
434 {
435 InSequence seq;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100436 triggerFactoryMock
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100437 .expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100438 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
439 EXPECT_CALL(triggerMock, Die());
440 EXPECT_CALL(checkPoint, Call("end"));
441 }
442
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100443 addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100444 sut->removeTrigger(&triggerMock);
445 sut->removeTrigger(&triggerMock);
446 checkPoint.Call("end");
447}
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100448class TestTriggerManagerStorage : public TestTriggerManager
449{
450 public:
451 using FilePath = interfaces::JsonStorage::FilePath;
452 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
453
454 void SetUp() override
455 {
456 ON_CALL(storageMock, list())
457 .WillByDefault(Return(std::vector<FilePath>{
458 {FilePath("trigger1")}, {FilePath("trigger2")}}));
459
460 ON_CALL(storageMock, load(FilePath("trigger1")))
461 .WillByDefault(InvokeWithoutArgs([this] { return data1; }));
462
Szymon Dompkee28aa532021-10-27 12:33:12 +0200463 data2["Id"] = "Trigger2";
464 data2["Name"] = "Second Trigger";
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100465 ON_CALL(storageMock, load(FilePath("trigger2")))
466 .WillByDefault(InvokeWithoutArgs([this] { return data2; }));
467 }
468
469 nlohmann::json data1 = nlohmann::json{
470 {"Version", Trigger::triggerVersion},
Szymon Dompkee28aa532021-10-27 12:33:12 +0200471 {"Id", TriggerParams().id()},
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100472 {"Name", TriggerParams().name()},
473 {"ThresholdParamsDiscriminator",
474 TriggerParams().thresholdParams().index()},
Patrick Williamsc7935fa2023-10-20 11:19:30 -0500475 {"TriggerActions", utils::transform(TriggerParams().triggerActions(),
476 [](const auto& action) {
Patrick Williams583ba442025-02-03 14:28:19 -0500477 return actionToString(action);
478 })},
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100479 {"ThresholdParams", utils::labeledThresholdParamsToJson(
480 TriggerParams().thresholdParams())},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100481 {"ReportIds", TriggerParams().reportIds()},
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100482 {"Sensors", TriggerParams().sensors()}};
483
484 nlohmann::json data2 = data1;
485};
486
487TEST_F(TestTriggerManagerStorage, triggerManagerCtorAddTriggerFromStorage)
488{
489 triggerFactoryMock.expectMake(TriggerParams(), _, Ref(storageMock));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200490 triggerFactoryMock.expectMake(
491 TriggerParams().id("Trigger2").name("Second Trigger"), _,
492 Ref(storageMock));
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100493 EXPECT_CALL(storageMock, remove(_)).Times(0);
494
495 sut = makeTriggerManager();
496}
497
498TEST_F(TestTriggerManagerStorage,
499 triggerManagerCtorRemoveDiscreteTriggerFromStorage)
500{
501 LabeledTriggerThresholdParams thresholdParams =
502 std::vector<discrete::LabeledThresholdParam>{
Szymon Dompke9f346792021-07-14 21:07:11 +0200503 {"userId1", discrete::Severity::warning, 15, "10.0"},
504 {"userId2", discrete::Severity::critical, 5, "20.0"}};
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100505
506 data1["ThresholdParamsDiscriminator"] = thresholdParams.index();
507
508 data1["ThresholdParams"] =
509 utils::labeledThresholdParamsToJson(thresholdParams);
510
511 EXPECT_CALL(storageMock, remove(FilePath("trigger1"))).Times(0);
512
513 sut = makeTriggerManager();
514}
515
516TEST_F(TestTriggerManagerStorage,
517 triggerManagerCtorRemoveDiscreteTriggerFromStorage2)
518{
519 data1["IsDiscrete"] = true;
520
521 EXPECT_CALL(storageMock, remove(FilePath("trigger1"))).Times(0);
522
523 sut = makeTriggerManager();
524}
525
526TEST_F(TestTriggerManagerStorage,
527 triggerManagerCtorAddProperRemoveInvalidTriggerFromStorage)
528{
529 data1["Version"] = Trigger::triggerVersion - 1;
530
Szymon Dompkee28aa532021-10-27 12:33:12 +0200531 triggerFactoryMock.expectMake(
532 TriggerParams().id("Trigger2").name("Second Trigger"), _,
533 Ref(storageMock));
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100534 EXPECT_CALL(storageMock, remove(FilePath("trigger1")));
535
536 sut = makeTriggerManager();
537}