176833cb5SWludzik, Jozef #include "dbus_environment.hpp"
276833cb5SWludzik, Jozef #include "helpers.hpp"
3a4e67616SCezary Zwolak #include "mocks/json_storage_mock.hpp"
4*b4ef22e4SSzymon Dompke #include "mocks/report_manager_mock.hpp"
594f71c51SSzymon Dompke #include "mocks/sensor_mock.hpp"
694f71c51SSzymon Dompke #include "mocks/threshold_mock.hpp"
794f71c51SSzymon Dompke #include "mocks/trigger_factory_mock.hpp"
876833cb5SWludzik, Jozef #include "mocks/trigger_manager_mock.hpp"
976833cb5SWludzik, Jozef #include "params/trigger_params.hpp"
1076833cb5SWludzik, Jozef #include "trigger.hpp"
11e28aa53dSSzymon Dompke #include "trigger_manager.hpp"
124416fce6SCezary Zwolak #include "utils/conversion_trigger.hpp"
134416fce6SCezary Zwolak #include "utils/transform.hpp"
144416fce6SCezary Zwolak #include "utils/tstring.hpp"
154416fce6SCezary Zwolak 
164416fce6SCezary Zwolak #include <boost/range/combine.hpp>
1776833cb5SWludzik, Jozef 
1876833cb5SWludzik, Jozef using namespace testing;
1976833cb5SWludzik, Jozef using namespace std::literals::string_literals;
2076833cb5SWludzik, Jozef 
2194f71c51SSzymon Dompke static constexpr size_t expectedTriggerVersion = 1;
22a4e67616SCezary Zwolak 
2376833cb5SWludzik, Jozef class TestTrigger : public Test
2476833cb5SWludzik, Jozef {
2576833cb5SWludzik, Jozef   public:
2676833cb5SWludzik, Jozef     TriggerParams triggerParams;
274416fce6SCezary Zwolak     TriggerParams triggerDiscreteParams =
284416fce6SCezary Zwolak         TriggerParams()
29e28aa53dSSzymon Dompke             .id("DiscreteTrigger")
30e28aa53dSSzymon Dompke             .name("My Discrete Trigger")
314416fce6SCezary Zwolak             .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
324416fce6SCezary Zwolak                 discrete::LabeledThresholdParam{
334416fce6SCezary Zwolak                     "userId", discrete::Severity::warning,
34dcc4e193SKrzysztof Grobelny                     Milliseconds(10).count(), "15.2"},
354416fce6SCezary Zwolak                 discrete::LabeledThresholdParam{
364416fce6SCezary Zwolak                     "userId_2", discrete::Severity::critical,
37dcc4e193SKrzysztof Grobelny                     Milliseconds(5).count(), "32.7"},
384416fce6SCezary Zwolak             });
3976833cb5SWludzik, Jozef 
40*b4ef22e4SSzymon Dompke     std::unique_ptr<ReportManagerMock> reportManagerMockPtr =
41*b4ef22e4SSzymon Dompke         std::make_unique<NiceMock<ReportManagerMock>>();
4276833cb5SWludzik, Jozef     std::unique_ptr<TriggerManagerMock> triggerManagerMockPtr =
4376833cb5SWludzik, Jozef         std::make_unique<NiceMock<TriggerManagerMock>>();
4494f71c51SSzymon Dompke     std::unique_ptr<TriggerFactoryMock> triggerFactoryMockPtr =
4594f71c51SSzymon Dompke         std::make_unique<NiceMock<TriggerFactoryMock>>();
46a4e67616SCezary Zwolak     testing::NiceMock<StorageMock> storageMock;
4794f71c51SSzymon Dompke     std::vector<std::shared_ptr<interfaces::Threshold>> thresholdMocks;
4876833cb5SWludzik, Jozef     std::unique_ptr<Trigger> sut;
4976833cb5SWludzik, Jozef 
5076833cb5SWludzik, Jozef     void SetUp() override
5176833cb5SWludzik, Jozef     {
52a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
53a4e67616SCezary Zwolak     }
54a4e67616SCezary Zwolak 
554416fce6SCezary Zwolak     static std::vector<LabeledSensorInfo>
564416fce6SCezary Zwolak         convertToLabeledSensor(const SensorsInfo& sensorsInfo)
574416fce6SCezary Zwolak     {
584416fce6SCezary Zwolak         return utils::transform(sensorsInfo, [](const auto& sensorInfo) {
594416fce6SCezary Zwolak             const auto& [sensorPath, sensorMetadata] = sensorInfo;
604416fce6SCezary Zwolak             return LabeledSensorInfo("service1", sensorPath, sensorMetadata);
614416fce6SCezary Zwolak         });
624416fce6SCezary Zwolak     }
634416fce6SCezary Zwolak 
64a4e67616SCezary Zwolak     std::unique_ptr<Trigger> makeTrigger(const TriggerParams& params)
65a4e67616SCezary Zwolak     {
6694f71c51SSzymon Dompke         thresholdMocks =
6794f71c51SSzymon Dompke             ThresholdMock::makeThresholds(params.thresholdParams());
6894f71c51SSzymon Dompke 
69a4e67616SCezary Zwolak         return std::make_unique<Trigger>(
7076833cb5SWludzik, Jozef             DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(),
71e28aa53dSSzymon Dompke             params.id(), params.name(), params.triggerActions(),
7294f71c51SSzymon Dompke             std::make_shared<std::vector<std::string>>(
7394f71c51SSzymon Dompke                 params.reportIds().begin(), params.reportIds().end()),
7494f71c51SSzymon Dompke             std::vector<std::shared_ptr<interfaces::Threshold>>(thresholdMocks),
7594f71c51SSzymon Dompke             *triggerManagerMockPtr, storageMock, *triggerFactoryMockPtr,
76*b4ef22e4SSzymon Dompke             SensorMock::makeSensorMocks(params.sensors()),
77*b4ef22e4SSzymon Dompke             *reportManagerMockPtr);
78a4e67616SCezary Zwolak     }
79a4e67616SCezary Zwolak 
80a4e67616SCezary Zwolak     static interfaces::JsonStorage::FilePath to_file_path(std::string name)
81a4e67616SCezary Zwolak     {
82a4e67616SCezary Zwolak         return interfaces::JsonStorage::FilePath(
83a4e67616SCezary Zwolak             std::to_string(std::hash<std::string>{}(name)));
8476833cb5SWludzik, Jozef     }
8576833cb5SWludzik, Jozef 
8676833cb5SWludzik, Jozef     template <class T>
8776833cb5SWludzik, Jozef     static T getProperty(const std::string& path, const std::string& property)
8876833cb5SWludzik, Jozef     {
89e28aa53dSSzymon Dompke         return DbusEnvironment::getProperty<T>(path, Trigger::triggerIfaceName,
90e28aa53dSSzymon Dompke                                                property);
9176833cb5SWludzik, Jozef     }
9276833cb5SWludzik, Jozef 
93a4e67616SCezary Zwolak     template <class T>
94a4e67616SCezary Zwolak     static boost::system::error_code setProperty(const std::string& path,
95a4e67616SCezary Zwolak                                                  const std::string& property,
96a4e67616SCezary Zwolak                                                  const T& newValue)
97a4e67616SCezary Zwolak     {
98e28aa53dSSzymon Dompke         return DbusEnvironment::setProperty<T>(path, Trigger::triggerIfaceName,
99e28aa53dSSzymon Dompke                                                property, newValue);
100a4e67616SCezary Zwolak     }
101a4e67616SCezary Zwolak 
10276833cb5SWludzik, Jozef     boost::system::error_code deleteTrigger(const std::string& path)
10376833cb5SWludzik, Jozef     {
10476833cb5SWludzik, Jozef         std::promise<boost::system::error_code> methodPromise;
10576833cb5SWludzik, Jozef         DbusEnvironment::getBus()->async_method_call(
10676833cb5SWludzik, Jozef             [&methodPromise](boost::system::error_code ec) {
10776833cb5SWludzik, Jozef                 methodPromise.set_value(ec);
10876833cb5SWludzik, Jozef             },
10976833cb5SWludzik, Jozef             DbusEnvironment::serviceName(), path, Trigger::deleteIfaceName,
11076833cb5SWludzik, Jozef             "Delete");
11176833cb5SWludzik, Jozef         return DbusEnvironment::waitForFuture(methodPromise.get_future());
11276833cb5SWludzik, Jozef     }
11376833cb5SWludzik, Jozef };
11476833cb5SWludzik, Jozef 
11576833cb5SWludzik, Jozef TEST_F(TestTrigger, checkIfPropertiesAreSet)
11676833cb5SWludzik, Jozef {
117e28aa53dSSzymon Dompke     EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"),
118e28aa53dSSzymon Dompke                 Eq(triggerParams.name()));
119a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(true));
1202001301aSSzymon Dompke     EXPECT_THAT(
1212001301aSSzymon Dompke         getProperty<std::vector<std::string>>(sut->getPath(), "TriggerActions"),
12294f71c51SSzymon Dompke         Eq(utils::transform(
12394f71c51SSzymon Dompke             triggerParams.triggerActions(),
12494f71c51SSzymon Dompke             [](const auto& action) { return actionToString(action); })));
1254416fce6SCezary Zwolak     EXPECT_THAT((getProperty<SensorsInfo>(sut->getPath(), "Sensors")),
1264416fce6SCezary Zwolak                 Eq(utils::fromLabeledSensorsInfo(triggerParams.sensors())));
12776833cb5SWludzik, Jozef     EXPECT_THAT(
12876833cb5SWludzik, Jozef         getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"),
129b8cc78ddSKrzysztof Grobelny         Eq(triggerParams.reportIds()));
13076833cb5SWludzik, Jozef     EXPECT_THAT(
13194f71c51SSzymon Dompke         getProperty<bool>(sut->getPath(), "Discrete"),
13294f71c51SSzymon Dompke         Eq(isTriggerThresholdDiscrete(triggerParams.thresholdParams())));
13394f71c51SSzymon Dompke     EXPECT_THAT(
13476833cb5SWludzik, Jozef         getProperty<TriggerThresholdParams>(sut->getPath(), "Thresholds"),
1354416fce6SCezary Zwolak         Eq(std::visit(utils::FromLabeledThresholdParamConversion(),
1364416fce6SCezary Zwolak                       triggerParams.thresholdParams())));
1374416fce6SCezary Zwolak }
1384416fce6SCezary Zwolak 
139*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, checkBasicGetters)
140*b4ef22e4SSzymon Dompke {
141*b4ef22e4SSzymon Dompke     EXPECT_THAT(sut->getId(), Eq(triggerParams.id()));
142*b4ef22e4SSzymon Dompke     EXPECT_THAT(sut->getPath(), Eq(Trigger::triggerDir + triggerParams.id()));
143*b4ef22e4SSzymon Dompke     EXPECT_THAT(sut->getReportIds(), Eq(triggerParams.reportIds()));
144*b4ef22e4SSzymon Dompke }
145*b4ef22e4SSzymon Dompke 
146e28aa53dSSzymon Dompke TEST_F(TestTrigger, setPropertyNameToCorrectValue)
147e28aa53dSSzymon Dompke {
148e28aa53dSSzymon Dompke     std::string name = "custom name 1234 %^#5";
149e28aa53dSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Name", name),
150e28aa53dSSzymon Dompke                 Eq(boost::system::errc::success));
151e28aa53dSSzymon Dompke     EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"), Eq(name));
152e28aa53dSSzymon Dompke }
153e28aa53dSSzymon Dompke 
15494f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyReportNames)
15594f71c51SSzymon Dompke {
15694f71c51SSzymon Dompke     std::vector<std::string> newNames = {"abc", "one", "two"};
15794f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newNames),
15894f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
15994f71c51SSzymon Dompke     EXPECT_THAT(
16094f71c51SSzymon Dompke         getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"),
16194f71c51SSzymon Dompke         Eq(newNames));
162*b4ef22e4SSzymon Dompke     EXPECT_THAT(
163*b4ef22e4SSzymon Dompke         getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"),
164*b4ef22e4SSzymon Dompke         Eq(sut->getReportIds()));
165*b4ef22e4SSzymon Dompke }
166*b4ef22e4SSzymon Dompke 
167*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, settingPropertyReportNamesUptadesTriggerIdsInReports)
168*b4ef22e4SSzymon Dompke {
169*b4ef22e4SSzymon Dompke     std::vector<std::string> newPropertyVal = {"abc", "one", "two"};
170*b4ef22e4SSzymon Dompke 
171*b4ef22e4SSzymon Dompke     for (const auto& reportId : newPropertyVal)
172*b4ef22e4SSzymon Dompke     {
173*b4ef22e4SSzymon Dompke         EXPECT_CALL(
174*b4ef22e4SSzymon Dompke             *reportManagerMockPtr,
175*b4ef22e4SSzymon Dompke             updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Add));
176*b4ef22e4SSzymon Dompke     }
177*b4ef22e4SSzymon Dompke     for (const auto& reportId : triggerParams.reportIds())
178*b4ef22e4SSzymon Dompke     {
179*b4ef22e4SSzymon Dompke         EXPECT_CALL(
180*b4ef22e4SSzymon Dompke             *reportManagerMockPtr,
181*b4ef22e4SSzymon Dompke             updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Remove));
182*b4ef22e4SSzymon Dompke     }
183*b4ef22e4SSzymon Dompke 
184*b4ef22e4SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal),
185*b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
186*b4ef22e4SSzymon Dompke }
187*b4ef22e4SSzymon Dompke 
188*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, settingPropertyReportNamesWillNotRemoveTriggerIdsInReports)
189*b4ef22e4SSzymon Dompke {
190*b4ef22e4SSzymon Dompke     std::vector<std::string> newPropertyVal = triggerParams.reportIds();
191*b4ef22e4SSzymon Dompke     std::vector<std::string> newNames{"abc", "one", "two"};
192*b4ef22e4SSzymon Dompke     newPropertyVal.insert(newPropertyVal.end(), newNames.begin(),
193*b4ef22e4SSzymon Dompke                           newNames.end());
194*b4ef22e4SSzymon Dompke 
195*b4ef22e4SSzymon Dompke     for (const auto& reportId : newNames)
196*b4ef22e4SSzymon Dompke     {
197*b4ef22e4SSzymon Dompke         EXPECT_CALL(
198*b4ef22e4SSzymon Dompke             *reportManagerMockPtr,
199*b4ef22e4SSzymon Dompke             updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Add));
200*b4ef22e4SSzymon Dompke     }
201*b4ef22e4SSzymon Dompke 
202*b4ef22e4SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal),
203*b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
204*b4ef22e4SSzymon Dompke }
205*b4ef22e4SSzymon Dompke 
206*b4ef22e4SSzymon Dompke TEST_F(TestTrigger,
207*b4ef22e4SSzymon Dompke        settingPropertyReportNamesToSameValueWillNotUpdateTriggerIdsInReports)
208*b4ef22e4SSzymon Dompke {
209*b4ef22e4SSzymon Dompke     std::vector<std::string> newPropertyVal = triggerParams.reportIds();
210*b4ef22e4SSzymon Dompke 
211*b4ef22e4SSzymon Dompke     EXPECT_CALL(*reportManagerMockPtr, updateTriggerIds(_, _, _)).Times(0);
212*b4ef22e4SSzymon Dompke 
213*b4ef22e4SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal),
214*b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
215*b4ef22e4SSzymon Dompke }
216*b4ef22e4SSzymon Dompke 
217*b4ef22e4SSzymon Dompke TEST_F(TestTrigger,
218*b4ef22e4SSzymon Dompke        DISABLED_settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds)
219*b4ef22e4SSzymon Dompke {
220*b4ef22e4SSzymon Dompke     std::vector<std::string> newPropertyVal{"trigger1", "trigger2", "trigger1"};
221*b4ef22e4SSzymon Dompke 
222*b4ef22e4SSzymon Dompke     EXPECT_CALL(*reportManagerMockPtr, updateTriggerIds(_, _, _)).Times(0);
223*b4ef22e4SSzymon Dompke 
224*b4ef22e4SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal),
225*b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
22694f71c51SSzymon Dompke }
22794f71c51SSzymon Dompke 
22894f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertySensors)
22994f71c51SSzymon Dompke {
23094f71c51SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateSensors(_, _));
23194f71c51SSzymon Dompke     for (const auto& threshold : thresholdMocks)
23294f71c51SSzymon Dompke     {
23394f71c51SSzymon Dompke         auto thresholdMockPtr =
23494f71c51SSzymon Dompke             std::dynamic_pointer_cast<NiceMock<ThresholdMock>>(threshold);
23594f71c51SSzymon Dompke         EXPECT_CALL(*thresholdMockPtr, updateSensors(_));
23694f71c51SSzymon Dompke     }
23794f71c51SSzymon Dompke     SensorsInfo newSensors({std::make_pair(
23894f71c51SSzymon Dompke         sdbusplus::message::object_path("/abc/def"), "metadata")});
23994f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Sensors", newSensors),
24094f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
24194f71c51SSzymon Dompke }
24294f71c51SSzymon Dompke 
24394f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyThresholds)
24494f71c51SSzymon Dompke {
24594f71c51SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateThresholds(_, _, _, _, _));
24694f71c51SSzymon Dompke     TriggerThresholdParams newThresholds =
24794f71c51SSzymon Dompke         std::vector<discrete::ThresholdParam>(
24894f71c51SSzymon Dompke             {std::make_tuple("discrete threshold", "OK", 10, "12.3")});
24994f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Thresholds", newThresholds),
25094f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
25194f71c51SSzymon Dompke }
25294f71c51SSzymon Dompke 
2534416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfNumericCoversionsAreGood)
2544416fce6SCezary Zwolak {
2554416fce6SCezary Zwolak     const auto& labeledParamsBase =
2564416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(
2574416fce6SCezary Zwolak             triggerParams.thresholdParams());
2584416fce6SCezary Zwolak     const auto paramsToCheck =
2594416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
2604416fce6SCezary Zwolak                    triggerParams.thresholdParams());
2614416fce6SCezary Zwolak     const auto labeledParamsToCheck =
2624416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit(
2634416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
2644416fce6SCezary Zwolak 
2654416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
2664416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
2674416fce6SCezary Zwolak     {
2684416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(),
2694416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Type>()));
2704416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(),
2714416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Direction>()));
2724416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
2734416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
2744416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
2754416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
2764416fce6SCezary Zwolak     }
2774416fce6SCezary Zwolak }
2784416fce6SCezary Zwolak 
2794416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood)
2804416fce6SCezary Zwolak {
2814416fce6SCezary Zwolak     const auto& labeledParamsBase =
2824416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(
2834416fce6SCezary Zwolak             triggerDiscreteParams.thresholdParams());
2844416fce6SCezary Zwolak     const auto paramsToCheck =
2854416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
2864416fce6SCezary Zwolak                    triggerDiscreteParams.thresholdParams());
2874416fce6SCezary Zwolak     const auto labeledParamsToCheck =
2884416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit(
2894416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
2904416fce6SCezary Zwolak 
2914416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
2924416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
2934416fce6SCezary Zwolak     {
2944416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(),
2954416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::UserId>()));
2964416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(),
2974416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Severity>()));
2984416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
2994416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
3004416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
3014416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
3024416fce6SCezary Zwolak     }
30376833cb5SWludzik, Jozef }
30476833cb5SWludzik, Jozef 
30576833cb5SWludzik, Jozef TEST_F(TestTrigger, deleteTrigger)
30676833cb5SWludzik, Jozef {
307e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
30876833cb5SWludzik, Jozef     EXPECT_CALL(*triggerManagerMockPtr, removeTrigger(sut.get()));
309*b4ef22e4SSzymon Dompke     for (const auto& reportId : triggerParams.reportIds())
310*b4ef22e4SSzymon Dompke     {
311*b4ef22e4SSzymon Dompke         EXPECT_CALL(
312*b4ef22e4SSzymon Dompke             *reportManagerMockPtr,
313*b4ef22e4SSzymon Dompke             updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Remove));
314*b4ef22e4SSzymon Dompke     }
31576833cb5SWludzik, Jozef     auto ec = deleteTrigger(sut->getPath());
31676833cb5SWludzik, Jozef     EXPECT_THAT(ec, Eq(boost::system::errc::success));
31776833cb5SWludzik, Jozef }
31876833cb5SWludzik, Jozef 
31976833cb5SWludzik, Jozef TEST_F(TestTrigger, deletingNonExistingTriggerReturnInvalidRequestDescriptor)
32076833cb5SWludzik, Jozef {
32176833cb5SWludzik, Jozef     auto ec = deleteTrigger(Trigger::triggerDir + "NonExisting"s);
32276833cb5SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(EBADR));
32376833cb5SWludzik, Jozef }
324a4e67616SCezary Zwolak 
3254416fce6SCezary Zwolak TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage)
326a4e67616SCezary Zwolak {
327e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
328a4e67616SCezary Zwolak 
329a4e67616SCezary Zwolak     bool persistent = false;
3304416fce6SCezary Zwolak     EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent),
331a4e67616SCezary Zwolak                 Eq(boost::system::errc::success));
332a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"),
333a4e67616SCezary Zwolak                 Eq(persistent));
334a4e67616SCezary Zwolak }
335a4e67616SCezary Zwolak 
336*b4ef22e4SSzymon Dompke class TestTriggerInitialization : public TestTrigger
337a4e67616SCezary Zwolak {
338a4e67616SCezary Zwolak   public:
339a4e67616SCezary Zwolak     void SetUp() override
340a4e67616SCezary Zwolak     {}
341a4e67616SCezary Zwolak 
342a4e67616SCezary Zwolak     nlohmann::json storedConfiguration;
343a4e67616SCezary Zwolak };
344a4e67616SCezary Zwolak 
345*b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization,
346*b4ef22e4SSzymon Dompke        exceptionDuringTriggerStoreDisablesPersistency)
347a4e67616SCezary Zwolak {
348a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _))
349a4e67616SCezary Zwolak         .WillOnce(Throw(std::runtime_error("Generic error!")));
350a4e67616SCezary Zwolak 
351a4e67616SCezary Zwolak     sut = makeTrigger(triggerParams);
352a4e67616SCezary Zwolak 
353a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(false));
354a4e67616SCezary Zwolak }
355a4e67616SCezary Zwolak 
356*b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerThrowsExceptionWhenIdIsInvalid)
357a4e67616SCezary Zwolak {
358a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _)).Times(0);
359a4e67616SCezary Zwolak 
360e28aa53dSSzymon Dompke     EXPECT_THROW(makeTrigger(triggerParams.id("inv?lidId")),
361a4e67616SCezary Zwolak                  sdbusplus::exception::SdBusError);
362a4e67616SCezary Zwolak }
363a4e67616SCezary Zwolak 
364*b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerUpdatesTriggersIdsInReports)
365*b4ef22e4SSzymon Dompke {
366*b4ef22e4SSzymon Dompke     for (const auto& reportId : triggerParams.reportIds())
367*b4ef22e4SSzymon Dompke     {
368*b4ef22e4SSzymon Dompke         EXPECT_CALL(*reportManagerMockPtr,
369*b4ef22e4SSzymon Dompke                     updateTriggerIds(reportId, triggerParams.id(),
370*b4ef22e4SSzymon Dompke                                      TriggerIdUpdate::Add));
371*b4ef22e4SSzymon Dompke     }
372*b4ef22e4SSzymon Dompke 
373*b4ef22e4SSzymon Dompke     sut = makeTrigger(triggerParams);
374*b4ef22e4SSzymon Dompke }
375*b4ef22e4SSzymon Dompke 
376a4e67616SCezary Zwolak class TestTriggerStore : public TestTrigger
377a4e67616SCezary Zwolak {
378a4e67616SCezary Zwolak   public:
3794416fce6SCezary Zwolak     nlohmann::json storedConfiguration;
3804416fce6SCezary Zwolak     nlohmann::json storedDiscreteConfiguration;
3814416fce6SCezary Zwolak     std::unique_ptr<Trigger> sutDiscrete;
3824416fce6SCezary Zwolak 
383a4e67616SCezary Zwolak     void SetUp() override
384a4e67616SCezary Zwolak     {
385a4e67616SCezary Zwolak         ON_CALL(storageMock, store(_, _))
386a4e67616SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedConfiguration));
387a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
388a4e67616SCezary Zwolak 
3894416fce6SCezary Zwolak         ON_CALL(storageMock, store(_, _))
3904416fce6SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedDiscreteConfiguration));
3914416fce6SCezary Zwolak         sutDiscrete = makeTrigger(triggerDiscreteParams);
3924416fce6SCezary Zwolak     }
393a4e67616SCezary Zwolak };
394a4e67616SCezary Zwolak 
395a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerVersion)
396a4e67616SCezary Zwolak {
397a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Version"), Eq(expectedTriggerVersion));
398a4e67616SCezary Zwolak }
399a4e67616SCezary Zwolak 
400e28aa53dSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerId)
401e28aa53dSSzymon Dompke {
402e28aa53dSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("Id"), Eq(triggerParams.id()));
403e28aa53dSSzymon Dompke }
404e28aa53dSSzymon Dompke 
405a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerName)
406a4e67616SCezary Zwolak {
407a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Name"), Eq(triggerParams.name()));
408a4e67616SCezary Zwolak }
409a4e67616SCezary Zwolak 
4102001301aSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerTriggerActions)
411a4e67616SCezary Zwolak {
4122001301aSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("TriggerActions"),
41394f71c51SSzymon Dompke                 Eq(utils::transform(triggerParams.triggerActions(),
41494f71c51SSzymon Dompke                                     [](const auto& action) {
41594f71c51SSzymon Dompke                                         return actionToString(action);
41694f71c51SSzymon Dompke                                     })));
417a4e67616SCezary Zwolak }
418a4e67616SCezary Zwolak 
419b8cc78ddSKrzysztof Grobelny TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerReportIds)
420a4e67616SCezary Zwolak {
421b8cc78ddSKrzysztof Grobelny     ASSERT_THAT(storedConfiguration.at("ReportIds"),
422b8cc78ddSKrzysztof Grobelny                 Eq(triggerParams.reportIds()));
423a4e67616SCezary Zwolak }
424a4e67616SCezary Zwolak 
425a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerSensors)
426a4e67616SCezary Zwolak {
427a4e67616SCezary Zwolak     nlohmann::json expectedItem;
4284416fce6SCezary Zwolak     expectedItem["service"] = "service1";
42994f71c51SSzymon Dompke     expectedItem["path"] = "/xyz/openbmc_project/sensors/temperature/BMC_Temp";
430b8cc78ddSKrzysztof Grobelny     expectedItem["metadata"] = "metadata1";
431a4e67616SCezary Zwolak 
432a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Sensors"), ElementsAre(expectedItem));
433a4e67616SCezary Zwolak }
434a4e67616SCezary Zwolak 
435a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerThresholdParams)
436a4e67616SCezary Zwolak {
437a4e67616SCezary Zwolak     nlohmann::json expectedItem0;
438a4e67616SCezary Zwolak     expectedItem0["type"] = 0;
439a4e67616SCezary Zwolak     expectedItem0["dwellTime"] = 10;
440a4e67616SCezary Zwolak     expectedItem0["direction"] = 1;
4414416fce6SCezary Zwolak     expectedItem0["thresholdValue"] = 0.5;
442a4e67616SCezary Zwolak 
443a4e67616SCezary Zwolak     nlohmann::json expectedItem1;
444a4e67616SCezary Zwolak     expectedItem1["type"] = 3;
445a4e67616SCezary Zwolak     expectedItem1["dwellTime"] = 10;
446a4e67616SCezary Zwolak     expectedItem1["direction"] = 2;
4474416fce6SCezary Zwolak     expectedItem1["thresholdValue"] = 90.2;
448a4e67616SCezary Zwolak 
4494416fce6SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0));
450a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParams"),
451a4e67616SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
452a4e67616SCezary Zwolak }
4534416fce6SCezary Zwolak 
4544416fce6SCezary Zwolak TEST_F(TestTriggerStore,
4554416fce6SCezary Zwolak        settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)
4564416fce6SCezary Zwolak {
4574416fce6SCezary Zwolak     nlohmann::json expectedItem0;
4584416fce6SCezary Zwolak     expectedItem0["userId"] = "userId";
4594416fce6SCezary Zwolak     expectedItem0["severity"] = discrete::Severity::warning;
4604416fce6SCezary Zwolak     expectedItem0["dwellTime"] = 10;
4619f346790SSzymon Dompke     expectedItem0["thresholdValue"] = "15.2";
4624416fce6SCezary Zwolak 
4634416fce6SCezary Zwolak     nlohmann::json expectedItem1;
4644416fce6SCezary Zwolak     expectedItem1["userId"] = "userId_2";
4654416fce6SCezary Zwolak     expectedItem1["severity"] = discrete::Severity::critical;
4664416fce6SCezary Zwolak     expectedItem1["dwellTime"] = 5;
4679f346790SSzymon Dompke     expectedItem1["thresholdValue"] = "32.7";
4684416fce6SCezary Zwolak 
4694416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParamsDiscriminator"),
4704416fce6SCezary Zwolak                 Eq(1));
4714416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParams"),
4724416fce6SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
4734416fce6SCezary Zwolak }
474