blob: 6251775fae2721a71640c3f9a2e1e4bf72ccc403 [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
Alexander Hansen6d276f62026-01-14 01:58:28 +010014#include <xyz/openbmc_project/Telemetry/TriggerManager/common.hpp>
15
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010016using namespace testing;
Szymon Dompke1cdd7e42022-06-08 14:43:13 +020017using sdbusplus::message::object_path;
Szymon Dompke32305f12022-07-05 15:37:21 +020018using namespace std::literals::string_literals;
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010019
Alexander Hansen6d276f62026-01-14 01:58:28 +010020using TelemetryTriggerManager =
21 sdbusplus::common::xyz::openbmc_project::telemetry::TriggerManager;
22
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010023class TestTriggerManager : public Test
24{
25 public:
Szymon Dompke32305f12022-07-05 15:37:21 +020026 TriggerParams triggerParams;
Patrick Williams583ba442025-02-03 14:28:19 -050027 std::pair<boost::system::error_code, std::string> addTrigger(
28 const TriggerParams& params)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010029 {
Cezary Zwolak4416fce2021-03-17 03:21:06 +010030 const auto sensorInfos =
31 utils::fromLabeledSensorsInfo(params.sensors());
Ed Tanous2efa95d2024-10-19 11:36:53 -070032 const std::vector<numeric::LabeledThresholdParam> numThresh =
33 params.numericThresholdParams();
34 const std::vector<discrete::LabeledThresholdParam> discThresh =
35 params.discreteThresholdParams();
36 const std::vector<numeric::ThresholdParam> numThresh2 = std::get<0>(
37 utils::FromLabeledThresholdParamConversion()(numThresh));
38 const auto discThresh2 = std::get<1>(
39 utils::FromLabeledThresholdParamConversion()(discThresh));
Cezary Zwolak4416fce2021-03-17 03:21:06 +010040
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010041 std::promise<std::pair<boost::system::error_code, std::string>>
42 addTriggerPromise;
43 DbusEnvironment::getBus()->async_method_call(
44 [&addTriggerPromise](boost::system::error_code ec,
45 const std::string& path) {
Patrick Williams583ba442025-02-03 14:28:19 -050046 addTriggerPromise.set_value({ec, path});
47 },
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010048 DbusEnvironment::serviceName(), TriggerManager::triggerManagerPath,
Alexander Hansen6d276f62026-01-14 01:58:28 +010049 TelemetryTriggerManager::interface,
50 TelemetryTriggerManager::method_names::add_trigger, params.id(),
Szymon Dompke94f71c52021-12-10 07:16:33 +010051 params.name(),
Patrick Williams583ba442025-02-03 14:28:19 -050052 utils::transform(params.triggerActions(),
53 [](const auto& action) {
54 return actionToString(action);
55 }),
Ed Tanous2efa95d2024-10-19 11:36:53 -070056 sensorInfos, params.reports(), numThresh2, discThresh2);
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010057 return DbusEnvironment::waitForFuture(addTriggerPromise.get_future());
58 }
59
Cezary Zwolak4416fce2021-03-17 03:21:06 +010060 std::unique_ptr<TriggerManager> makeTriggerManager()
61 {
62 return std::make_unique<TriggerManager>(
63 std::move(triggerFactoryMockPtr), std::move(storageMockPtr),
64 DbusEnvironment::getObjServer());
65 }
66
67 void SetUp() override
68 {
69 sut = makeTriggerManager();
70 }
71
Cezary Zwolaka4e67612021-02-18 13:16:16 +010072 std::unique_ptr<StorageMock> storageMockPtr =
73 std::make_unique<NiceMock<StorageMock>>();
74 StorageMock& storageMock = *storageMockPtr;
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010075 std::unique_ptr<TriggerFactoryMock> triggerFactoryMockPtr =
76 std::make_unique<NiceMock<TriggerFactoryMock>>();
77 TriggerFactoryMock& triggerFactoryMock = *triggerFactoryMockPtr;
78 std::unique_ptr<TriggerMock> triggerMockPtr =
Szymon Dompkee28aa532021-10-27 12:33:12 +020079 std::make_unique<NiceMock<TriggerMock>>(TriggerParams().id());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010080 TriggerMock& triggerMock = *triggerMockPtr;
Cezary Zwolak4416fce2021-03-17 03:21:06 +010081 std::unique_ptr<TriggerManager> sut;
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010082 MockFunction<void(std::string)> checkPoint;
83};
84
85TEST_F(TestTriggerManager, addTrigger)
86{
Cezary Zwolak4416fce2021-03-17 03:21:06 +010087 triggerFactoryMock.expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010088 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
89
Cezary Zwolak4416fce2021-03-17 03:21:06 +010090 auto [ec, path] = addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010091 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
92 EXPECT_THAT(path, Eq(triggerMock.getPath()));
93}
94
Szymon Dompkef763c9e2021-03-12 09:19:22 +010095TEST_F(TestTriggerManager, addTriggerWithDiscreteThresholds)
96{
97 TriggerParams triggerParamsDiscrete;
Cezary Zwolak4416fce2021-03-17 03:21:06 +010098 auto thresholds = std::vector<discrete::LabeledThresholdParam>{
Szymon Dompke9f346792021-07-14 21:07:11 +020099 {"discrete_threshold1", discrete::Severity::ok, 10, "11.0"},
100 {"discrete_threshold2", discrete::Severity::warning, 10, "12.0"},
101 {"discrete_threshold3", discrete::Severity::critical, 10, "13.0"}};
Szymon Dompkef763c9e2021-03-12 09:19:22 +0100102
Szymon Dompke20013012021-07-23 09:54:20 +0200103 triggerParamsDiscrete.thresholdParams(thresholds);
Szymon Dompkef763c9e2021-03-12 09:19:22 +0100104
105 auto [ec, path] = addTrigger(triggerParamsDiscrete);
106 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
107 EXPECT_THAT(path, Eq(triggerMock.getPath()));
108}
109
110TEST_F(TestTriggerManager, addDiscreteTriggerWithoutThresholds)
111{
112 TriggerParams triggerParamsDiscrete;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100113 auto thresholds = std::vector<discrete::LabeledThresholdParam>();
Szymon Dompkef763c9e2021-03-12 09:19:22 +0100114
Szymon Dompke20013012021-07-23 09:54:20 +0200115 triggerParamsDiscrete.thresholdParams(thresholds);
Szymon Dompkef763c9e2021-03-12 09:19:22 +0100116
117 auto [ec, path] = addTrigger(triggerParamsDiscrete);
118 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
119 EXPECT_THAT(path, Eq(triggerMock.getPath()));
120}
121
Michal Orzelb47b7db2024-09-16 10:02:29 +0200122TEST_F(TestTriggerManager, failToAddTriggerTwice)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100123{
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100124 triggerFactoryMock.expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100125 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
126
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100127 addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100128
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100129 auto [ec, path] = addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100130 EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
131 EXPECT_THAT(path, Eq(std::string()));
132}
133
Michal Orzelb47b7db2024-09-16 10:02:29 +0200134TEST_F(TestTriggerManager, failToAddTriggerWithInvalidId)
Szymon Dompkee28aa532021-10-27 12:33:12 +0200135{
136 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
137 .Times(0);
138
139 auto [ec, path] = addTrigger(TriggerParams().id("not valid?"));
140 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
141 EXPECT_THAT(path, Eq(std::string()));
142}
143
Michal Orzelb47b7db2024-09-16 10:02:29 +0200144TEST_F(TestTriggerManager, failToAddTriggerWithDuplicatesInReportsIds)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100145{
146 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
147 .Times(0);
148
149 auto [ec, path] = addTrigger(
150 TriggerParams().reportIds({"trigger1", "trigger2", "trigger1"}));
151 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
152 EXPECT_THAT(path, Eq(std::string()));
153}
154
Szymon Dompke1cdd7e42022-06-08 14:43:13 +0200155TEST_F(TestTriggerManager, addTriggerWithProperReportPaths)
156{
157 auto [ec, path] = addTrigger(TriggerParams().reports(
158 {object_path("/xyz/openbmc_project/Telemetry/Reports/MyReport"),
159 object_path(
160 "/xyz/openbmc_project/Telemetry/Reports/MyPrefix/MyReport")}));
161 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
162 EXPECT_THAT(path, Eq(triggerMock.getPath()));
163}
164
Michal Orzelb47b7db2024-09-16 10:02:29 +0200165TEST_F(TestTriggerManager, failToAddTriggerWithBadReportsPath)
Szymon Dompke1cdd7e42022-06-08 14:43:13 +0200166{
167 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
168 .Times(0);
169
170 auto [ec, path] = addTrigger(TriggerParams().reports(
171 {object_path("/xyz/openbmc_project/Telemetry/NotReports/MyReport")}));
172 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
173 EXPECT_THAT(path, Eq(std::string()));
174}
175
Michal Orzelb47b7db2024-09-16 10:02:29 +0200176TEST_F(TestTriggerManager, failToAddTriggerWithTooManyReportPrefixes)
Szymon Dompke1cdd7e42022-06-08 14:43:13 +0200177{
178 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
179 .Times(0);
180
181 auto [ec, path] = addTrigger(TriggerParams().reports({object_path(
182 "/xyz/openbmc_project/Telemetry/Reports/P1/P2/MyReport")}));
183 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
184 EXPECT_THAT(path, Eq(std::string()));
185}
186
Szymon Dompkee28aa532021-10-27 12:33:12 +0200187TEST_F(TestTriggerManager, addTriggerWithoutIdAndName)
188{
189 triggerFactoryMock
190 .expectMake(TriggerParams()
191 .id(TriggerManager::triggerNameDefault)
192 .name(TriggerManager::triggerNameDefault),
193 Ref(*sut), Ref(storageMock))
194 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
195
196 auto [ec, path] = addTrigger(TriggerParams().id("").name(""));
197 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
198 EXPECT_THAT(path, Not(Eq("")));
199}
200
201TEST_F(TestTriggerManager, addTriggerWithPrefixId)
202{
203 triggerFactoryMock
204 .expectMake(TriggerParams()
205 .id("TelemetryService/HackyName")
206 .name("Hacky/Name!@#$"),
207 Ref(*sut), Ref(storageMock))
208 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
209
210 auto [ec, path] = addTrigger(
211 TriggerParams().id("TelemetryService/").name("Hacky/Name!@#$"));
212 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
213 EXPECT_THAT(path, Not(Eq("")));
214}
215
216TEST_F(TestTriggerManager, addTriggerWithoutIdTwice)
217{
218 addTrigger(TriggerParams().id(""));
219
220 auto [ec, path] = addTrigger(TriggerParams().id(""));
221 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
222 EXPECT_THAT(path, Not(Eq("")));
223}
224
225TEST_F(TestTriggerManager, addTriggerWithoutIdAndWithLongNameTwice)
226{
Szymon Dompke32305f12022-07-05 15:37:21 +0200227 std::string longName = utils::string_utils::getMaxName();
228 addTrigger(TriggerParams().id("").name(longName));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200229
Szymon Dompke32305f12022-07-05 15:37:21 +0200230 auto [ec, path] = addTrigger(TriggerParams().id("").name(longName));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200231 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
232 EXPECT_THAT(path, Not(Eq("")));
233}
234
235TEST_F(TestTriggerManager, addTriggerWithMaxLengthId)
236{
Szymon Dompke32305f12022-07-05 15:37:21 +0200237 std::string reportId = utils::string_utils::getMaxId();
238 triggerParams.id(reportId);
239 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200240
241 auto [ec, path] = addTrigger(triggerParams);
242
243 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Szymon Dompke32305f12022-07-05 15:37:21 +0200244 EXPECT_THAT(path, Eq("/"s + reportId));
245}
246
247TEST_F(TestTriggerManager, addTriggerWithMaxLengthPrefix)
248{
249 std::string reportId = utils::string_utils::getMaxPrefix() + "/MyId";
250 triggerParams.id(reportId);
251 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
252
253 auto [ec, path] = addTrigger(triggerParams);
254
255 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
256 EXPECT_THAT(path, Eq("/"s + reportId));
257}
258
259TEST_F(TestTriggerManager, addTriggerWithMaxLengthName)
260{
261 triggerParams.name(utils::string_utils::getMaxName());
262 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
263
264 auto [ec, path] = addTrigger(triggerParams);
265
266 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
267 EXPECT_THAT(path, Eq("/"s + triggerParams.id()));
268}
269
270TEST_F(TestTriggerManager, addTriggerWithMaxLengthDiscreteThresholdName)
271{
272 namespace ts = utils::tstring;
273
274 triggerParams =
275 TriggerParams()
276 .id("DiscreteTrigger")
277 .name("My Discrete Trigger")
278 .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
279 discrete::LabeledThresholdParam{
280 utils::string_utils::getMaxName(),
281 discrete::Severity::warning, Milliseconds(10).count(),
282 "15.2"}});
283
284 triggerFactoryMock.expectMake(triggerParams, Ref(*sut), Ref(storageMock));
285
286 auto [ec, path] = addTrigger(triggerParams);
287
288 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
289 EXPECT_THAT(path, Eq("/"s + triggerParams.id()));
290}
291
Michal Orzelb47b7db2024-09-16 10:02:29 +0200292TEST_F(TestTriggerManager, failToAddTriggerWithTooLongFullId)
Szymon Dompke32305f12022-07-05 15:37:21 +0200293{
294 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
295 .Times(0);
296
297 triggerParams.id(
298 std::string(utils::constants::maxReportFullIdLength + 1, 'z'));
299
300 auto [ec, path] = addTrigger(triggerParams);
301
302 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
303 EXPECT_THAT(path, Eq(std::string()));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200304}
305
Michal Orzelb47b7db2024-09-16 10:02:29 +0200306TEST_F(TestTriggerManager, failToAddTriggerWithTooLongId)
Szymon Dompkee28aa532021-10-27 12:33:12 +0200307{
Szymon Dompke32305f12022-07-05 15:37:21 +0200308 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
309 .Times(0);
310
311 triggerParams.id(utils::string_utils::getTooLongId());
312
313 auto [ec, path] = addTrigger(triggerParams);
314
315 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
316 EXPECT_THAT(path, Eq(std::string()));
317}
318
Michal Orzelb47b7db2024-09-16 10:02:29 +0200319TEST_F(TestTriggerManager, failToAddTriggerWithTooLongPrefix)
Szymon Dompke32305f12022-07-05 15:37:21 +0200320{
321 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
322 .Times(0);
323
324 triggerParams.id(utils::string_utils::getTooLongPrefix() + "/MyId");
325
326 auto [ec, path] = addTrigger(triggerParams);
327
328 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
329 EXPECT_THAT(path, Eq(std::string()));
330}
331
Michal Orzelb47b7db2024-09-16 10:02:29 +0200332TEST_F(TestTriggerManager, failToAddTriggerWithTooManyPrefixes)
Szymon Dompke32305f12022-07-05 15:37:21 +0200333{
334 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
335 .Times(0);
336
337 std::string reportId;
338 for (size_t i = 0; i < utils::constants::maxPrefixesInId + 1; i++)
339 {
340 reportId += "prefix/";
341 }
342 reportId += "MyId";
343
344 triggerParams.id(reportId);
345
346 auto [ec, path] = addTrigger(triggerParams);
347
348 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
349 EXPECT_THAT(path, Eq(std::string()));
350}
351
Michal Orzelb47b7db2024-09-16 10:02:29 +0200352TEST_F(TestTriggerManager, failToAddTriggerWithTooLongName)
Szymon Dompke32305f12022-07-05 15:37:21 +0200353{
354 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
355 .Times(0);
356
357 triggerParams.name(utils::string_utils::getTooLongName());
358
359 auto [ec, path] = addTrigger(triggerParams);
360
361 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
362 EXPECT_THAT(path, Eq(std::string()));
363}
364
Michal Orzelb47b7db2024-09-16 10:02:29 +0200365TEST_F(TestTriggerManager, failToAddTriggerWithTooLongMetricId)
Szymon Dompke32305f12022-07-05 15:37:21 +0200366{
367 namespace ts = utils::tstring;
368
369 triggerParams =
370 TriggerParams()
371 .id("DiscreteTrigger")
372 .name("My Discrete Trigger")
373 .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
374 discrete::LabeledThresholdParam{
375 utils::string_utils::getTooLongName(),
376 discrete::Severity::warning, Milliseconds(10).count(),
377 "15.2"}});
Szymon Dompkee28aa532021-10-27 12:33:12 +0200378
379 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
380 .Times(0);
381
382 auto [ec, path] = addTrigger(triggerParams);
383
384 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
385 EXPECT_THAT(path, Eq(std::string()));
386}
387
Michal Orzelb47b7db2024-09-16 10:02:29 +0200388TEST_F(TestTriggerManager, failToAddTriggerWhenMaxTriggerIsReached)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100389{
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100390 auto triggerParams = TriggerParams();
391
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100392 triggerFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100393 .Times(TriggerManager::maxTriggers);
394
395 for (size_t i = 0; i < TriggerManager::maxTriggers; i++)
396 {
Szymon Dompkee28aa532021-10-27 12:33:12 +0200397 triggerParams.id(TriggerParams().id() + std::to_string(i));
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100398
399 auto [ec, path] = addTrigger(triggerParams);
400 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
401 }
402
Patrick Williams583ba442025-02-03 14:28:19 -0500403 triggerParams.id(
404 TriggerParams().id() + std::to_string(TriggerManager::maxTriggers));
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100405 auto [ec, path] = addTrigger(triggerParams);
406 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
407 EXPECT_THAT(path, Eq(std::string()));
408}
409
410TEST_F(TestTriggerManager, removeTrigger)
411{
412 {
413 InSequence seq;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100414 triggerFactoryMock
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100415 .expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100416 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
417 EXPECT_CALL(triggerMock, Die());
418 EXPECT_CALL(checkPoint, Call("end"));
419 }
420
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100421 addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100422 sut->removeTrigger(&triggerMock);
423 checkPoint.Call("end");
424}
425
426TEST_F(TestTriggerManager, removingTriggerThatIsNotInContainerHasNoEffect)
427{
428 {
429 InSequence seq;
430 EXPECT_CALL(checkPoint, Call("end"));
431 EXPECT_CALL(triggerMock, Die());
432 }
433
434 sut->removeTrigger(&triggerMock);
435 checkPoint.Call("end");
436}
437
438TEST_F(TestTriggerManager, removingSameTriggerTwiceHasNoSideEffect)
439{
440 {
441 InSequence seq;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100442 triggerFactoryMock
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100443 .expectMake(TriggerParams(), Ref(*sut), Ref(storageMock))
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100444 .WillOnce(Return(ByMove(std::move(triggerMockPtr))));
445 EXPECT_CALL(triggerMock, Die());
446 EXPECT_CALL(checkPoint, Call("end"));
447 }
448
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100449 addTrigger(TriggerParams());
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100450 sut->removeTrigger(&triggerMock);
451 sut->removeTrigger(&triggerMock);
452 checkPoint.Call("end");
453}
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100454class TestTriggerManagerStorage : public TestTriggerManager
455{
456 public:
457 using FilePath = interfaces::JsonStorage::FilePath;
458 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
459
460 void SetUp() override
461 {
462 ON_CALL(storageMock, list())
463 .WillByDefault(Return(std::vector<FilePath>{
464 {FilePath("trigger1")}, {FilePath("trigger2")}}));
465
466 ON_CALL(storageMock, load(FilePath("trigger1")))
467 .WillByDefault(InvokeWithoutArgs([this] { return data1; }));
468
Szymon Dompkee28aa532021-10-27 12:33:12 +0200469 data2["Id"] = "Trigger2";
470 data2["Name"] = "Second Trigger";
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100471 ON_CALL(storageMock, load(FilePath("trigger2")))
472 .WillByDefault(InvokeWithoutArgs([this] { return data2; }));
473 }
474
475 nlohmann::json data1 = nlohmann::json{
476 {"Version", Trigger::triggerVersion},
Szymon Dompkee28aa532021-10-27 12:33:12 +0200477 {"Id", TriggerParams().id()},
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100478 {"Name", TriggerParams().name()},
479 {"ThresholdParamsDiscriminator",
480 TriggerParams().thresholdParams().index()},
Patrick Williamsc7935fa2023-10-20 11:19:30 -0500481 {"TriggerActions", utils::transform(TriggerParams().triggerActions(),
482 [](const auto& action) {
Patrick Williams583ba442025-02-03 14:28:19 -0500483 return actionToString(action);
484 })},
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100485 {"ThresholdParams", utils::labeledThresholdParamsToJson(
486 TriggerParams().thresholdParams())},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100487 {"ReportIds", TriggerParams().reportIds()},
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100488 {"Sensors", TriggerParams().sensors()}};
489
490 nlohmann::json data2 = data1;
491};
492
493TEST_F(TestTriggerManagerStorage, triggerManagerCtorAddTriggerFromStorage)
494{
495 triggerFactoryMock.expectMake(TriggerParams(), _, Ref(storageMock));
Szymon Dompkee28aa532021-10-27 12:33:12 +0200496 triggerFactoryMock.expectMake(
497 TriggerParams().id("Trigger2").name("Second Trigger"), _,
498 Ref(storageMock));
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100499 EXPECT_CALL(storageMock, remove(_)).Times(0);
500
501 sut = makeTriggerManager();
502}
503
504TEST_F(TestTriggerManagerStorage,
505 triggerManagerCtorRemoveDiscreteTriggerFromStorage)
506{
507 LabeledTriggerThresholdParams thresholdParams =
508 std::vector<discrete::LabeledThresholdParam>{
Szymon Dompke9f346792021-07-14 21:07:11 +0200509 {"userId1", discrete::Severity::warning, 15, "10.0"},
510 {"userId2", discrete::Severity::critical, 5, "20.0"}};
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100511
512 data1["ThresholdParamsDiscriminator"] = thresholdParams.index();
513
514 data1["ThresholdParams"] =
515 utils::labeledThresholdParamsToJson(thresholdParams);
516
517 EXPECT_CALL(storageMock, remove(FilePath("trigger1"))).Times(0);
518
519 sut = makeTriggerManager();
520}
521
522TEST_F(TestTriggerManagerStorage,
523 triggerManagerCtorRemoveDiscreteTriggerFromStorage2)
524{
525 data1["IsDiscrete"] = true;
526
527 EXPECT_CALL(storageMock, remove(FilePath("trigger1"))).Times(0);
528
529 sut = makeTriggerManager();
530}
531
532TEST_F(TestTriggerManagerStorage,
533 triggerManagerCtorAddProperRemoveInvalidTriggerFromStorage)
534{
535 data1["Version"] = Trigger::triggerVersion - 1;
536
Szymon Dompkee28aa532021-10-27 12:33:12 +0200537 triggerFactoryMock.expectMake(
538 TriggerParams().id("Trigger2").name("Second Trigger"), _,
539 Ref(storageMock));
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100540 EXPECT_CALL(storageMock, remove(FilePath("trigger1")));
541
542 sut = makeTriggerManager();
543}