xref: /openbmc/telemetry/tests/src/test_trigger.cpp (revision 583ba441654657bb4ba9d051b747144a7258c159)
176833cb5SWludzik, Jozef #include "dbus_environment.hpp"
276833cb5SWludzik, Jozef #include "helpers.hpp"
3e6d48874SKrzysztof Grobelny #include "messages/collect_trigger_id.hpp"
4e6d48874SKrzysztof Grobelny #include "messages/trigger_presence_changed_ind.hpp"
5a4e67616SCezary Zwolak #include "mocks/json_storage_mock.hpp"
6b4ef22e4SSzymon Dompke #include "mocks/report_manager_mock.hpp"
794f71c51SSzymon Dompke #include "mocks/sensor_mock.hpp"
894f71c51SSzymon Dompke #include "mocks/threshold_mock.hpp"
994f71c51SSzymon Dompke #include "mocks/trigger_factory_mock.hpp"
1076833cb5SWludzik, Jozef #include "mocks/trigger_manager_mock.hpp"
1176833cb5SWludzik, Jozef #include "params/trigger_params.hpp"
1276833cb5SWludzik, Jozef #include "trigger.hpp"
13e28aa53dSSzymon Dompke #include "trigger_manager.hpp"
144416fce6SCezary Zwolak #include "utils/conversion_trigger.hpp"
1532305f14SSzymon Dompke #include "utils/dbus_path_utils.hpp"
16e6d48874SKrzysztof Grobelny #include "utils/messanger.hpp"
1732305f14SSzymon Dompke #include "utils/string_utils.hpp"
184416fce6SCezary Zwolak #include "utils/transform.hpp"
194416fce6SCezary Zwolak #include "utils/tstring.hpp"
204416fce6SCezary Zwolak 
214416fce6SCezary Zwolak #include <boost/range/combine.hpp>
2276833cb5SWludzik, Jozef 
2376833cb5SWludzik, Jozef using namespace testing;
2476833cb5SWludzik, Jozef using namespace std::literals::string_literals;
251cdd7e4fSSzymon Dompke using sdbusplus::message::object_path;
2676833cb5SWludzik, Jozef 
27b7b7e1b6SSzymon Dompke static constexpr size_t expectedTriggerVersion = 2;
28a4e67616SCezary Zwolak 
2976833cb5SWludzik, Jozef class TestTrigger : public Test
3076833cb5SWludzik, Jozef {
3176833cb5SWludzik, Jozef   public:
3276833cb5SWludzik, Jozef     TriggerParams triggerParams;
334416fce6SCezary Zwolak     TriggerParams triggerDiscreteParams =
344416fce6SCezary Zwolak         TriggerParams()
35e28aa53dSSzymon Dompke             .id("DiscreteTrigger")
36e28aa53dSSzymon Dompke             .name("My Discrete Trigger")
374416fce6SCezary Zwolak             .thresholdParams(std::vector<discrete::LabeledThresholdParam>{
384416fce6SCezary Zwolak                 discrete::LabeledThresholdParam{
394416fce6SCezary Zwolak                     "userId", discrete::Severity::warning,
40dcc4e193SKrzysztof Grobelny                     Milliseconds(10).count(), "15.2"},
414416fce6SCezary Zwolak                 discrete::LabeledThresholdParam{
424416fce6SCezary Zwolak                     "userId_2", discrete::Severity::critical,
43dcc4e193SKrzysztof Grobelny                     Milliseconds(5).count(), "32.7"},
444416fce6SCezary Zwolak             });
4576833cb5SWludzik, Jozef 
46b4ef22e4SSzymon Dompke     std::unique_ptr<ReportManagerMock> reportManagerMockPtr =
47b4ef22e4SSzymon Dompke         std::make_unique<NiceMock<ReportManagerMock>>();
4876833cb5SWludzik, Jozef     std::unique_ptr<TriggerManagerMock> triggerManagerMockPtr =
4976833cb5SWludzik, Jozef         std::make_unique<NiceMock<TriggerManagerMock>>();
5094f71c51SSzymon Dompke     std::unique_ptr<TriggerFactoryMock> triggerFactoryMockPtr =
5194f71c51SSzymon Dompke         std::make_unique<NiceMock<TriggerFactoryMock>>();
52a4e67616SCezary Zwolak     testing::NiceMock<StorageMock> storageMock;
53e6d48874SKrzysztof Grobelny     NiceMock<MockFunction<void(const messages::TriggerPresenceChangedInd)>>
54e6d48874SKrzysztof Grobelny         triggerPresenceChanged;
5594f71c51SSzymon Dompke     std::vector<std::shared_ptr<interfaces::Threshold>> thresholdMocks;
56e6d48874SKrzysztof Grobelny     utils::Messanger messanger;
5776833cb5SWludzik, Jozef     std::unique_ptr<Trigger> sut;
5876833cb5SWludzik, Jozef 
TestTrigger()59e6d48874SKrzysztof Grobelny     TestTrigger() : messanger(DbusEnvironment::getIoc())
60e6d48874SKrzysztof Grobelny     {
61e6d48874SKrzysztof Grobelny         messanger.on_receive<messages::TriggerPresenceChangedInd>(
62e6d48874SKrzysztof Grobelny             [this](const auto& msg) { triggerPresenceChanged.Call(msg); });
63e6d48874SKrzysztof Grobelny     }
64e6d48874SKrzysztof Grobelny 
SetUp()6576833cb5SWludzik, Jozef     void SetUp() override
6676833cb5SWludzik, Jozef     {
67a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
68a4e67616SCezary Zwolak     }
69a4e67616SCezary Zwolak 
convertToLabeledSensor(const SensorsInfo & sensorsInfo)70*583ba441SPatrick Williams     static std::vector<LabeledSensorInfo> convertToLabeledSensor(
71*583ba441SPatrick Williams         const SensorsInfo& sensorsInfo)
724416fce6SCezary Zwolak     {
734416fce6SCezary Zwolak         return utils::transform(sensorsInfo, [](const auto& sensorInfo) {
744416fce6SCezary Zwolak             const auto& [sensorPath, sensorMetadata] = sensorInfo;
754416fce6SCezary Zwolak             return LabeledSensorInfo("service1", sensorPath, sensorMetadata);
764416fce6SCezary Zwolak         });
774416fce6SCezary Zwolak     }
784416fce6SCezary Zwolak 
makeTrigger(const TriggerParams & params)79a4e67616SCezary Zwolak     std::unique_ptr<Trigger> makeTrigger(const TriggerParams& params)
80a4e67616SCezary Zwolak     {
8194f71c51SSzymon Dompke         thresholdMocks =
8294f71c51SSzymon Dompke             ThresholdMock::makeThresholds(params.thresholdParams());
8394f71c51SSzymon Dompke 
84b7b7e1b6SSzymon Dompke         auto id = std::make_unique<const std::string>(params.id());
85b7b7e1b6SSzymon Dompke 
86a4e67616SCezary Zwolak         return std::make_unique<Trigger>(
8776833cb5SWludzik, Jozef             DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(),
88b7b7e1b6SSzymon Dompke             std::move(id), params.name(), params.triggerActions(),
8994f71c51SSzymon Dompke             std::make_shared<std::vector<std::string>>(
9094f71c51SSzymon Dompke                 params.reportIds().begin(), params.reportIds().end()),
9194f71c51SSzymon Dompke             std::vector<std::shared_ptr<interfaces::Threshold>>(thresholdMocks),
9294f71c51SSzymon Dompke             *triggerManagerMockPtr, storageMock, *triggerFactoryMockPtr,
93e6d48874SKrzysztof Grobelny             SensorMock::makeSensorMocks(params.sensors()));
94a4e67616SCezary Zwolak     }
95a4e67616SCezary Zwolak 
to_file_path(std::string name)96a4e67616SCezary Zwolak     static interfaces::JsonStorage::FilePath to_file_path(std::string name)
97a4e67616SCezary Zwolak     {
98a4e67616SCezary Zwolak         return interfaces::JsonStorage::FilePath(
99a4e67616SCezary Zwolak             std::to_string(std::hash<std::string>{}(name)));
10076833cb5SWludzik, Jozef     }
10176833cb5SWludzik, Jozef 
10276833cb5SWludzik, Jozef     template <class T>
getProperty(const std::string & path,const std::string & property)10376833cb5SWludzik, Jozef     static T getProperty(const std::string& path, const std::string& property)
10476833cb5SWludzik, Jozef     {
105e28aa53dSSzymon Dompke         return DbusEnvironment::getProperty<T>(path, Trigger::triggerIfaceName,
106e28aa53dSSzymon Dompke                                                property);
10776833cb5SWludzik, Jozef     }
10876833cb5SWludzik, Jozef 
109a4e67616SCezary Zwolak     template <class T>
setProperty(const std::string & path,const std::string & property,const T & newValue)110*583ba441SPatrick Williams     static boost::system::error_code setProperty(
111*583ba441SPatrick Williams         const std::string& path, const std::string& property, const T& newValue)
112a4e67616SCezary Zwolak     {
113e28aa53dSSzymon Dompke         return DbusEnvironment::setProperty<T>(path, Trigger::triggerIfaceName,
114e28aa53dSSzymon Dompke                                                property, newValue);
115a4e67616SCezary Zwolak     }
116a4e67616SCezary Zwolak 
11732305f14SSzymon Dompke     template <class T>
11832305f14SSzymon Dompke     struct ChangePropertyParams
11932305f14SSzymon Dompke     {
12032305f14SSzymon Dompke         Matcher<T> valueBefore = _;
12132305f14SSzymon Dompke         T newValue;
12232305f14SSzymon Dompke         Matcher<boost::system::error_code> ec =
12332305f14SSzymon Dompke             Eq(boost::system::errc::success);
12432305f14SSzymon Dompke         Matcher<T> valueAfter = Eq(newValue);
12532305f14SSzymon Dompke     };
12632305f14SSzymon Dompke 
12732305f14SSzymon Dompke     template <class T>
changeProperty(const std::string & path,const std::string & property,ChangePropertyParams<T> p)12832305f14SSzymon Dompke     static void changeProperty(const std::string& path,
12932305f14SSzymon Dompke                                const std::string& property,
13032305f14SSzymon Dompke                                ChangePropertyParams<T> p)
13132305f14SSzymon Dompke     {
13232305f14SSzymon Dompke         ASSERT_THAT(getProperty<T>(path, property), p.valueBefore);
13332305f14SSzymon Dompke         ASSERT_THAT(setProperty<T>(path, property, p.newValue), p.ec);
13432305f14SSzymon Dompke         EXPECT_THAT(getProperty<T>(path, property), p.valueAfter);
13532305f14SSzymon Dompke     }
13632305f14SSzymon Dompke 
deleteTrigger(const std::string & path)13776833cb5SWludzik, Jozef     boost::system::error_code deleteTrigger(const std::string& path)
13876833cb5SWludzik, Jozef     {
13976833cb5SWludzik, Jozef         std::promise<boost::system::error_code> methodPromise;
14076833cb5SWludzik, Jozef         DbusEnvironment::getBus()->async_method_call(
14176833cb5SWludzik, Jozef             [&methodPromise](boost::system::error_code ec) {
14276833cb5SWludzik, Jozef                 methodPromise.set_value(ec);
143*583ba441SPatrick Williams             },
144*583ba441SPatrick Williams             DbusEnvironment::serviceName(), path, Trigger::deleteIfaceName,
14576833cb5SWludzik, Jozef             "Delete");
14676833cb5SWludzik, Jozef         return DbusEnvironment::waitForFuture(methodPromise.get_future());
14776833cb5SWludzik, Jozef     }
14876833cb5SWludzik, Jozef };
14976833cb5SWludzik, Jozef 
TEST_F(TestTrigger,checkIfPropertiesAreSet)15076833cb5SWludzik, Jozef TEST_F(TestTrigger, checkIfPropertiesAreSet)
15176833cb5SWludzik, Jozef {
152e28aa53dSSzymon Dompke     EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"),
153e28aa53dSSzymon Dompke                 Eq(triggerParams.name()));
154a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(true));
1552001301aSSzymon Dompke     EXPECT_THAT(
1562001301aSSzymon Dompke         getProperty<std::vector<std::string>>(sut->getPath(), "TriggerActions"),
157c7935fa1SPatrick Williams         Eq(utils::transform(
158c7935fa1SPatrick Williams             triggerParams.triggerActions(),
159c7935fa1SPatrick Williams             [](const auto& action) { return actionToString(action); })));
1604416fce6SCezary Zwolak     EXPECT_THAT((getProperty<SensorsInfo>(sut->getPath(), "Sensors")),
1614416fce6SCezary Zwolak                 Eq(utils::fromLabeledSensorsInfo(triggerParams.sensors())));
16276833cb5SWludzik, Jozef     EXPECT_THAT(
1631cdd7e4fSSzymon Dompke         getProperty<std::vector<object_path>>(sut->getPath(), "Reports"),
1641cdd7e4fSSzymon Dompke         Eq(triggerParams.reports()));
16576833cb5SWludzik, Jozef     EXPECT_THAT(
16694f71c51SSzymon Dompke         getProperty<bool>(sut->getPath(), "Discrete"),
16794f71c51SSzymon Dompke         Eq(isTriggerThresholdDiscrete(triggerParams.thresholdParams())));
1682efa95d8SEd Tanous 
1692efa95d8SEd Tanous     EXPECT_THAT(getProperty<std::vector<numeric::ThresholdParam>>(
1702efa95d8SEd Tanous                     sut->getPath(), "NumericThresholds"),
1712efa95d8SEd Tanous                 Eq(std::get<0>(utils::FromLabeledThresholdParamConversion()(
1722efa95d8SEd Tanous                     triggerParams.numericThresholdParams()))));
1732efa95d8SEd Tanous 
1742efa95d8SEd Tanous     EXPECT_THAT(getProperty<std::vector<discrete::ThresholdParam>>(
1752efa95d8SEd Tanous                     sut->getPath(), "DiscreteThresholds"),
1762efa95d8SEd Tanous                 Eq(std::get<1>(utils::FromLabeledThresholdParamConversion()(
1772efa95d8SEd Tanous                     triggerParams.discreteThresholdParams()))));
1784416fce6SCezary Zwolak }
1794416fce6SCezary Zwolak 
TEST_F(TestTrigger,checkBasicGetters)180b4ef22e4SSzymon Dompke TEST_F(TestTrigger, checkBasicGetters)
181b4ef22e4SSzymon Dompke {
182b4ef22e4SSzymon Dompke     EXPECT_THAT(sut->getId(), Eq(triggerParams.id()));
1831cdd7e4fSSzymon Dompke     EXPECT_THAT(sut->getPath(),
1841cdd7e4fSSzymon Dompke                 Eq(utils::constants::triggerDirPath.str + triggerParams.id()));
185b4ef22e4SSzymon Dompke }
186b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,setPropertyNameToCorrectValue)187e28aa53dSSzymon Dompke TEST_F(TestTrigger, setPropertyNameToCorrectValue)
188e28aa53dSSzymon Dompke {
189e28aa53dSSzymon Dompke     std::string name = "custom name 1234 %^#5";
190e28aa53dSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Name", name),
191e28aa53dSSzymon Dompke                 Eq(boost::system::errc::success));
192e28aa53dSSzymon Dompke     EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"), Eq(name));
193e28aa53dSSzymon Dompke }
194e28aa53dSSzymon Dompke 
TEST_F(TestTrigger,setPropertyReportNames)19594f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyReportNames)
19694f71c51SSzymon Dompke {
1971cdd7e4fSSzymon Dompke     std::vector<object_path> newNames = {
1981cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "abc",
1991cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "one",
2001cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "prefix" / "two"};
2011cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newNames),
20294f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
20394f71c51SSzymon Dompke     EXPECT_THAT(
2041cdd7e4fSSzymon Dompke         getProperty<std::vector<object_path>>(sut->getPath(), "Reports"),
20594f71c51SSzymon Dompke         Eq(newNames));
206b4ef22e4SSzymon Dompke }
207b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,sendsUpdateWhenReportNamesChanges)208e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendsUpdateWhenReportNamesChanges)
209b4ef22e4SSzymon Dompke {
2101cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal = {
2111cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "abc",
2121cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "one",
2131cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "two"};
214b4ef22e4SSzymon Dompke 
215e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged,
216e6d48874SKrzysztof Grobelny                 Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
2171cdd7e4fSSzymon Dompke                                UnorderedElementsAre("abc", "one", "two"))));
218b4ef22e4SSzymon Dompke 
2191cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
220b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
221b4ef22e4SSzymon Dompke }
222b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,sendsUpdateWhenReportNamesChangesToSameValue)223e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendsUpdateWhenReportNamesChangesToSameValue)
224b4ef22e4SSzymon Dompke {
2251cdd7e4fSSzymon Dompke     const std::vector<object_path> newPropertyVal = triggerParams.reports();
226b4ef22e4SSzymon Dompke 
227b4ef22e4SSzymon Dompke     EXPECT_CALL(
228e6d48874SKrzysztof Grobelny         triggerPresenceChanged,
229e6d48874SKrzysztof Grobelny         Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
230e6d48874SKrzysztof Grobelny                        UnorderedElementsAreArray(triggerParams.reportIds()))));
231b4ef22e4SSzymon Dompke 
2321cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
233b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
234b4ef22e4SSzymon Dompke }
235b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds)236b4ef22e4SSzymon Dompke TEST_F(TestTrigger,
237b47b7db4SMichal Orzel        settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds)
238b4ef22e4SSzymon Dompke {
2391cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal{
2401cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "report1",
2411cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "report2",
2421cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "report1"};
243b4ef22e4SSzymon Dompke 
244e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
245b4ef22e4SSzymon Dompke 
2461cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
2471cdd7e4fSSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
2481cdd7e4fSSzymon Dompke }
2491cdd7e4fSSzymon Dompke 
TEST_F(TestTrigger,settingPropertyReportNamesThrowsExceptionWhenReportWithTooManyPrefixes)250b47b7db4SMichal Orzel TEST_F(TestTrigger,
251b47b7db4SMichal Orzel        settingPropertyReportNamesThrowsExceptionWhenReportWithTooManyPrefixes)
2521cdd7e4fSSzymon Dompke {
2531cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal{
2541cdd7e4fSSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/P1/P2/MyReport")};
2551cdd7e4fSSzymon Dompke 
2561cdd7e4fSSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
2571cdd7e4fSSzymon Dompke 
2581cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
2591cdd7e4fSSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
2601cdd7e4fSSzymon Dompke }
2611cdd7e4fSSzymon Dompke 
TEST_F(TestTrigger,settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongPrefix)262b47b7db4SMichal Orzel TEST_F(TestTrigger,
263b47b7db4SMichal Orzel        settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongPrefix)
26432305f14SSzymon Dompke {
26532305f14SSzymon Dompke     std::vector<object_path> newPropertyVal{
26632305f14SSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/" +
26732305f14SSzymon Dompke                     utils::string_utils::getTooLongPrefix() + "/MyReport")};
26832305f14SSzymon Dompke 
26932305f14SSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
27032305f14SSzymon Dompke 
27132305f14SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
27232305f14SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
27332305f14SSzymon Dompke }
27432305f14SSzymon Dompke 
TEST_F(TestTrigger,settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongId)275b47b7db4SMichal Orzel TEST_F(TestTrigger,
276b47b7db4SMichal Orzel        settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongId)
27732305f14SSzymon Dompke {
27832305f14SSzymon Dompke     std::vector<object_path> newPropertyVal{
27932305f14SSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/Prefix/" +
28032305f14SSzymon Dompke                     utils::string_utils::getTooLongId())};
28132305f14SSzymon Dompke 
28232305f14SSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
28332305f14SSzymon Dompke 
28432305f14SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
28532305f14SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
28632305f14SSzymon Dompke }
28732305f14SSzymon Dompke 
TEST_F(TestTrigger,settingPropertyReportNamesThrowsExceptionWhenReportWithBadPath)2881cdd7e4fSSzymon Dompke TEST_F(TestTrigger,
289b47b7db4SMichal Orzel        settingPropertyReportNamesThrowsExceptionWhenReportWithBadPath)
2901cdd7e4fSSzymon Dompke {
2911cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal{
2921cdd7e4fSSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/NotReports/MyReport")};
2931cdd7e4fSSzymon Dompke 
2941cdd7e4fSSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
2951cdd7e4fSSzymon Dompke 
2961cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
297b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
29894f71c51SSzymon Dompke }
29994f71c51SSzymon Dompke 
TEST_F(TestTrigger,setPropertySensors)30094f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertySensors)
30194f71c51SSzymon Dompke {
30294f71c51SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateSensors(_, _));
30394f71c51SSzymon Dompke     for (const auto& threshold : thresholdMocks)
30494f71c51SSzymon Dompke     {
30594f71c51SSzymon Dompke         auto thresholdMockPtr =
30694f71c51SSzymon Dompke             std::dynamic_pointer_cast<NiceMock<ThresholdMock>>(threshold);
30794f71c51SSzymon Dompke         EXPECT_CALL(*thresholdMockPtr, updateSensors(_));
30894f71c51SSzymon Dompke     }
3091cdd7e4fSSzymon Dompke     SensorsInfo newSensors(
3101cdd7e4fSSzymon Dompke         {std::make_pair(object_path("/abc/def"), "metadata")});
31194f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Sensors", newSensors),
31294f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
31394f71c51SSzymon Dompke }
31494f71c51SSzymon Dompke 
TEST_F(TestTrigger,setPropertyThresholds)31594f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyThresholds)
31694f71c51SSzymon Dompke {
317b7b7e1b6SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateThresholds(_, _, _, _, _, _));
31894f71c51SSzymon Dompke     TriggerThresholdParams newThresholds =
319cff70c14SKrzysztof Grobelny         std::vector<discrete::ThresholdParam>({std::make_tuple(
320cff70c14SKrzysztof Grobelny             "discrete threshold", utils::enumToString(discrete::Severity::ok),
321cff70c14SKrzysztof Grobelny             10, "12.3")});
32294f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Thresholds", newThresholds),
32394f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
32494f71c51SSzymon Dompke }
32594f71c51SSzymon Dompke 
TEST_F(TestTrigger,setThresholdParamsWithTooLongDiscreteName)32632305f14SSzymon Dompke TEST_F(TestTrigger, setThresholdParamsWithTooLongDiscreteName)
32732305f14SSzymon Dompke {
32832305f14SSzymon Dompke     const TriggerThresholdParams currentValue =
32932305f14SSzymon Dompke         std::visit(utils::FromLabeledThresholdParamConversion(),
33032305f14SSzymon Dompke                    triggerParams.thresholdParams());
33132305f14SSzymon Dompke 
33232305f14SSzymon Dompke     TriggerThresholdParams newThresholds =
33332305f14SSzymon Dompke         std::vector<discrete::ThresholdParam>({std::make_tuple(
334cff70c14SKrzysztof Grobelny             utils::string_utils::getTooLongName(),
335cff70c14SKrzysztof Grobelny             utils::enumToString(discrete::Severity::ok), 10, "12.3")});
33632305f14SSzymon Dompke 
33732305f14SSzymon Dompke     changeProperty<TriggerThresholdParams>(
33832305f14SSzymon Dompke         sut->getPath(), "Thresholds",
33932305f14SSzymon Dompke         {.valueBefore = Eq(currentValue),
34032305f14SSzymon Dompke          .newValue = newThresholds,
34132305f14SSzymon Dompke          .ec = Eq(boost::system::errc::invalid_argument),
34232305f14SSzymon Dompke          .valueAfter = Eq(currentValue)});
34332305f14SSzymon Dompke }
34432305f14SSzymon Dompke 
TEST_F(TestTrigger,setNameTooLong)34532305f14SSzymon Dompke TEST_F(TestTrigger, setNameTooLong)
34632305f14SSzymon Dompke {
34732305f14SSzymon Dompke     std::string currentValue = TriggerParams().name();
34832305f14SSzymon Dompke 
34932305f14SSzymon Dompke     changeProperty<std::string>(
35032305f14SSzymon Dompke         sut->getPath(), "Name",
35132305f14SSzymon Dompke         {.valueBefore = Eq(currentValue),
35232305f14SSzymon Dompke          .newValue = utils::string_utils::getTooLongName(),
35332305f14SSzymon Dompke          .ec = Eq(boost::system::errc::invalid_argument),
35432305f14SSzymon Dompke          .valueAfter = Eq(currentValue)});
35532305f14SSzymon Dompke }
35632305f14SSzymon Dompke 
TEST_F(TestTrigger,checkIfNumericCoversionsAreGood)3574416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfNumericCoversionsAreGood)
3584416fce6SCezary Zwolak {
3594416fce6SCezary Zwolak     const auto& labeledParamsBase =
3604416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(
3614416fce6SCezary Zwolak             triggerParams.thresholdParams());
3624416fce6SCezary Zwolak     const auto paramsToCheck =
3634416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
3644416fce6SCezary Zwolak                    triggerParams.thresholdParams());
3654416fce6SCezary Zwolak     const auto labeledParamsToCheck =
3664416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit(
3674416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
3684416fce6SCezary Zwolak 
3694416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
3704416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
3714416fce6SCezary Zwolak     {
3724416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(),
3734416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Type>()));
3744416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(),
3754416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Direction>()));
3764416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
3774416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
3784416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
3794416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
3804416fce6SCezary Zwolak     }
3814416fce6SCezary Zwolak }
3824416fce6SCezary Zwolak 
TEST_F(TestTrigger,checkIfDiscreteCoversionsAreGood)3834416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood)
3844416fce6SCezary Zwolak {
3854416fce6SCezary Zwolak     const auto& labeledParamsBase =
3864416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(
3874416fce6SCezary Zwolak             triggerDiscreteParams.thresholdParams());
3884416fce6SCezary Zwolak     const auto paramsToCheck =
3894416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
3904416fce6SCezary Zwolak                    triggerDiscreteParams.thresholdParams());
3914416fce6SCezary Zwolak     const auto labeledParamsToCheck =
3924416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit(
3934416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
3944416fce6SCezary Zwolak 
3954416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
3964416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
3974416fce6SCezary Zwolak     {
3984416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(),
3994416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::UserId>()));
4004416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(),
4014416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Severity>()));
4024416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
4034416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
4044416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
4054416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
4064416fce6SCezary Zwolak     }
40776833cb5SWludzik, Jozef }
40876833cb5SWludzik, Jozef 
TEST_F(TestTrigger,deleteTrigger)40976833cb5SWludzik, Jozef TEST_F(TestTrigger, deleteTrigger)
41076833cb5SWludzik, Jozef {
411e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
41276833cb5SWludzik, Jozef     EXPECT_CALL(*triggerManagerMockPtr, removeTrigger(sut.get()));
413e6d48874SKrzysztof Grobelny 
414e6d48874SKrzysztof Grobelny     auto ec = deleteTrigger(sut->getPath());
415e6d48874SKrzysztof Grobelny     EXPECT_THAT(ec, Eq(boost::system::errc::success));
416b4ef22e4SSzymon Dompke }
417e6d48874SKrzysztof Grobelny 
TEST_F(TestTrigger,sendUpdateWhenTriggerIsDeleted)418e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendUpdateWhenTriggerIsDeleted)
419e6d48874SKrzysztof Grobelny {
420e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged,
421e6d48874SKrzysztof Grobelny                 Call(FieldsAre(messages::Presence::Removed, triggerParams.id(),
422e6d48874SKrzysztof Grobelny                                UnorderedElementsAre())));
423e6d48874SKrzysztof Grobelny 
42476833cb5SWludzik, Jozef     auto ec = deleteTrigger(sut->getPath());
42576833cb5SWludzik, Jozef     EXPECT_THAT(ec, Eq(boost::system::errc::success));
42676833cb5SWludzik, Jozef }
42776833cb5SWludzik, Jozef 
TEST_F(TestTrigger,deletingNonExistingTriggerReturnInvalidRequestDescriptor)42876833cb5SWludzik, Jozef TEST_F(TestTrigger, deletingNonExistingTriggerReturnInvalidRequestDescriptor)
42976833cb5SWludzik, Jozef {
4301cdd7e4fSSzymon Dompke     auto ec =
4311cdd7e4fSSzymon Dompke         deleteTrigger(utils::constants::triggerDirPath.str + "NonExisting"s);
43276833cb5SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(EBADR));
43376833cb5SWludzik, Jozef }
434a4e67616SCezary Zwolak 
TEST_F(TestTrigger,settingPersistencyToFalseRemovesTriggerFromStorage)4354416fce6SCezary Zwolak TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage)
436a4e67616SCezary Zwolak {
437e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
438a4e67616SCezary Zwolak 
439a4e67616SCezary Zwolak     bool persistent = false;
4404416fce6SCezary Zwolak     EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent),
441a4e67616SCezary Zwolak                 Eq(boost::system::errc::success));
442a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"),
443a4e67616SCezary Zwolak                 Eq(persistent));
444a4e67616SCezary Zwolak }
445a4e67616SCezary Zwolak 
446b4ef22e4SSzymon Dompke class TestTriggerInitialization : public TestTrigger
447a4e67616SCezary Zwolak {
448a4e67616SCezary Zwolak   public:
SetUp()4493a1c297aSPatrick Williams     void SetUp() override {}
450a4e67616SCezary Zwolak 
451a4e67616SCezary Zwolak     nlohmann::json storedConfiguration;
452a4e67616SCezary Zwolak };
453a4e67616SCezary Zwolak 
TEST_F(TestTriggerInitialization,exceptionDuringTriggerStoreDisablesPersistency)454b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization,
455b4ef22e4SSzymon Dompke        exceptionDuringTriggerStoreDisablesPersistency)
456a4e67616SCezary Zwolak {
457a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _))
458a4e67616SCezary Zwolak         .WillOnce(Throw(std::runtime_error("Generic error!")));
459a4e67616SCezary Zwolak 
460a4e67616SCezary Zwolak     sut = makeTrigger(triggerParams);
461a4e67616SCezary Zwolak 
462a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(false));
463a4e67616SCezary Zwolak }
464a4e67616SCezary Zwolak 
TEST_F(TestTriggerInitialization,creatingTriggerThrowsExceptionWhenIdIsInvalid)465b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerThrowsExceptionWhenIdIsInvalid)
466a4e67616SCezary Zwolak {
467a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _)).Times(0);
468a4e67616SCezary Zwolak 
469e28aa53dSSzymon Dompke     EXPECT_THROW(makeTrigger(triggerParams.id("inv?lidId")),
470a4e67616SCezary Zwolak                  sdbusplus::exception::SdBusError);
471a4e67616SCezary Zwolak }
472a4e67616SCezary Zwolak 
TEST_F(TestTriggerInitialization,creatingTriggerUpdatesTriggersIdsInReports)473b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerUpdatesTriggersIdsInReports)
474b4ef22e4SSzymon Dompke {
475e6d48874SKrzysztof Grobelny     EXPECT_CALL(
476e6d48874SKrzysztof Grobelny         triggerPresenceChanged,
477e6d48874SKrzysztof Grobelny         Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
478e6d48874SKrzysztof Grobelny                        UnorderedElementsAreArray(triggerParams.reportIds()))));
479b4ef22e4SSzymon Dompke 
480b4ef22e4SSzymon Dompke     sut = makeTrigger(triggerParams);
481b4ef22e4SSzymon Dompke }
482b4ef22e4SSzymon Dompke 
483a4e67616SCezary Zwolak class TestTriggerStore : public TestTrigger
484a4e67616SCezary Zwolak {
485a4e67616SCezary Zwolak   public:
4864416fce6SCezary Zwolak     nlohmann::json storedConfiguration;
4874416fce6SCezary Zwolak     nlohmann::json storedDiscreteConfiguration;
4884416fce6SCezary Zwolak     std::unique_ptr<Trigger> sutDiscrete;
4894416fce6SCezary Zwolak 
SetUp()490a4e67616SCezary Zwolak     void SetUp() override
491a4e67616SCezary Zwolak     {
492a4e67616SCezary Zwolak         ON_CALL(storageMock, store(_, _))
493a4e67616SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedConfiguration));
494a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
495a4e67616SCezary Zwolak 
4964416fce6SCezary Zwolak         ON_CALL(storageMock, store(_, _))
4974416fce6SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedDiscreteConfiguration));
4984416fce6SCezary Zwolak         sutDiscrete = makeTrigger(triggerDiscreteParams);
4994416fce6SCezary Zwolak     }
500a4e67616SCezary Zwolak };
501a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerVersion)502a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerVersion)
503a4e67616SCezary Zwolak {
504a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Version"), Eq(expectedTriggerVersion));
505a4e67616SCezary Zwolak }
506a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerId)507e28aa53dSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerId)
508e28aa53dSSzymon Dompke {
509e28aa53dSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("Id"), Eq(triggerParams.id()));
510e28aa53dSSzymon Dompke }
511e28aa53dSSzymon Dompke 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerName)512a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerName)
513a4e67616SCezary Zwolak {
514a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Name"), Eq(triggerParams.name()));
515a4e67616SCezary Zwolak }
516a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerTriggerActions)5172001301aSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerTriggerActions)
518a4e67616SCezary Zwolak {
5192001301aSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("TriggerActions"),
52094f71c51SSzymon Dompke                 Eq(utils::transform(triggerParams.triggerActions(),
52194f71c51SSzymon Dompke                                     [](const auto& action) {
52294f71c51SSzymon Dompke                                         return actionToString(action);
52394f71c51SSzymon Dompke                                     })));
524a4e67616SCezary Zwolak }
525a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerReportIds)526b8cc78ddSKrzysztof Grobelny TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerReportIds)
527a4e67616SCezary Zwolak {
528b8cc78ddSKrzysztof Grobelny     ASSERT_THAT(storedConfiguration.at("ReportIds"),
529b8cc78ddSKrzysztof Grobelny                 Eq(triggerParams.reportIds()));
530a4e67616SCezary Zwolak }
531a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerSensors)532a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerSensors)
533a4e67616SCezary Zwolak {
534a4e67616SCezary Zwolak     nlohmann::json expectedItem;
5354416fce6SCezary Zwolak     expectedItem["service"] = "service1";
53694f71c51SSzymon Dompke     expectedItem["path"] = "/xyz/openbmc_project/sensors/temperature/BMC_Temp";
537b8cc78ddSKrzysztof Grobelny     expectedItem["metadata"] = "metadata1";
538a4e67616SCezary Zwolak 
539a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Sensors"), ElementsAre(expectedItem));
540a4e67616SCezary Zwolak }
541a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerThresholdParams)542a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerThresholdParams)
543a4e67616SCezary Zwolak {
544a4e67616SCezary Zwolak     nlohmann::json expectedItem0;
545a4e67616SCezary Zwolak     expectedItem0["type"] = 0;
546a4e67616SCezary Zwolak     expectedItem0["dwellTime"] = 10;
547a4e67616SCezary Zwolak     expectedItem0["direction"] = 1;
5484416fce6SCezary Zwolak     expectedItem0["thresholdValue"] = 0.5;
549a4e67616SCezary Zwolak 
550a4e67616SCezary Zwolak     nlohmann::json expectedItem1;
551a4e67616SCezary Zwolak     expectedItem1["type"] = 3;
552a4e67616SCezary Zwolak     expectedItem1["dwellTime"] = 10;
553a4e67616SCezary Zwolak     expectedItem1["direction"] = 2;
5544416fce6SCezary Zwolak     expectedItem1["thresholdValue"] = 90.2;
555a4e67616SCezary Zwolak 
5564416fce6SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0));
557a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParams"),
558a4e67616SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
559a4e67616SCezary Zwolak }
5604416fce6SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)5614416fce6SCezary Zwolak TEST_F(TestTriggerStore,
5624416fce6SCezary Zwolak        settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)
5634416fce6SCezary Zwolak {
5644416fce6SCezary Zwolak     nlohmann::json expectedItem0;
5654416fce6SCezary Zwolak     expectedItem0["userId"] = "userId";
5664416fce6SCezary Zwolak     expectedItem0["severity"] = discrete::Severity::warning;
5674416fce6SCezary Zwolak     expectedItem0["dwellTime"] = 10;
5689f346790SSzymon Dompke     expectedItem0["thresholdValue"] = "15.2";
5694416fce6SCezary Zwolak 
5704416fce6SCezary Zwolak     nlohmann::json expectedItem1;
5714416fce6SCezary Zwolak     expectedItem1["userId"] = "userId_2";
5724416fce6SCezary Zwolak     expectedItem1["severity"] = discrete::Severity::critical;
5734416fce6SCezary Zwolak     expectedItem1["dwellTime"] = 5;
5749f346790SSzymon Dompke     expectedItem1["thresholdValue"] = "32.7";
5754416fce6SCezary Zwolak 
5764416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParamsDiscriminator"),
5774416fce6SCezary Zwolak                 Eq(1));
5784416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParams"),
5794416fce6SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
5804416fce6SCezary Zwolak }
581