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 
704416fce6SCezary Zwolak     static std::vector<LabeledSensorInfo>
convertToLabeledSensor(const SensorsInfo & sensorsInfo)714416fce6SCezary Zwolak         convertToLabeledSensor(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)110a4e67616SCezary Zwolak     static boost::system::error_code setProperty(const std::string& path,
111a4e67616SCezary Zwolak                                                  const std::string& property,
112a4e67616SCezary Zwolak                                                  const T& newValue)
113a4e67616SCezary Zwolak     {
114e28aa53dSSzymon Dompke         return DbusEnvironment::setProperty<T>(path, Trigger::triggerIfaceName,
115e28aa53dSSzymon Dompke                                                property, newValue);
116a4e67616SCezary Zwolak     }
117a4e67616SCezary Zwolak 
11832305f14SSzymon Dompke     template <class T>
11932305f14SSzymon Dompke     struct ChangePropertyParams
12032305f14SSzymon Dompke     {
12132305f14SSzymon Dompke         Matcher<T> valueBefore = _;
12232305f14SSzymon Dompke         T newValue;
12332305f14SSzymon Dompke         Matcher<boost::system::error_code> ec =
12432305f14SSzymon Dompke             Eq(boost::system::errc::success);
12532305f14SSzymon Dompke         Matcher<T> valueAfter = Eq(newValue);
12632305f14SSzymon Dompke     };
12732305f14SSzymon Dompke 
12832305f14SSzymon Dompke     template <class T>
changeProperty(const std::string & path,const std::string & property,ChangePropertyParams<T> p)12932305f14SSzymon Dompke     static void changeProperty(const std::string& path,
13032305f14SSzymon Dompke                                const std::string& property,
13132305f14SSzymon Dompke                                ChangePropertyParams<T> p)
13232305f14SSzymon Dompke     {
13332305f14SSzymon Dompke         ASSERT_THAT(getProperty<T>(path, property), p.valueBefore);
13432305f14SSzymon Dompke         ASSERT_THAT(setProperty<T>(path, property, p.newValue), p.ec);
13532305f14SSzymon Dompke         EXPECT_THAT(getProperty<T>(path, property), p.valueAfter);
13632305f14SSzymon Dompke     }
13732305f14SSzymon Dompke 
deleteTrigger(const std::string & path)13876833cb5SWludzik, Jozef     boost::system::error_code deleteTrigger(const std::string& path)
13976833cb5SWludzik, Jozef     {
14076833cb5SWludzik, Jozef         std::promise<boost::system::error_code> methodPromise;
14176833cb5SWludzik, Jozef         DbusEnvironment::getBus()->async_method_call(
14276833cb5SWludzik, Jozef             [&methodPromise](boost::system::error_code ec) {
14376833cb5SWludzik, Jozef             methodPromise.set_value(ec);
14476833cb5SWludzik, Jozef         },
14576833cb5SWludzik, Jozef             DbusEnvironment::serviceName(), path, Trigger::deleteIfaceName,
14676833cb5SWludzik, Jozef             "Delete");
14776833cb5SWludzik, Jozef         return DbusEnvironment::waitForFuture(methodPromise.get_future());
14876833cb5SWludzik, Jozef     }
14976833cb5SWludzik, Jozef };
15076833cb5SWludzik, Jozef 
TEST_F(TestTrigger,checkIfPropertiesAreSet)15176833cb5SWludzik, Jozef TEST_F(TestTrigger, checkIfPropertiesAreSet)
15276833cb5SWludzik, Jozef {
153e28aa53dSSzymon Dompke     EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"),
154e28aa53dSSzymon Dompke                 Eq(triggerParams.name()));
155a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(true));
1562001301aSSzymon Dompke     EXPECT_THAT(
1572001301aSSzymon Dompke         getProperty<std::vector<std::string>>(sut->getPath(), "TriggerActions"),
158*c7935fa1SPatrick Williams         Eq(utils::transform(
159*c7935fa1SPatrick Williams             triggerParams.triggerActions(),
160*c7935fa1SPatrick Williams             [](const auto& action) { return actionToString(action); })));
1614416fce6SCezary Zwolak     EXPECT_THAT((getProperty<SensorsInfo>(sut->getPath(), "Sensors")),
1624416fce6SCezary Zwolak                 Eq(utils::fromLabeledSensorsInfo(triggerParams.sensors())));
16376833cb5SWludzik, Jozef     EXPECT_THAT(
1641cdd7e4fSSzymon Dompke         getProperty<std::vector<object_path>>(sut->getPath(), "Reports"),
1651cdd7e4fSSzymon Dompke         Eq(triggerParams.reports()));
16676833cb5SWludzik, Jozef     EXPECT_THAT(
16794f71c51SSzymon Dompke         getProperty<bool>(sut->getPath(), "Discrete"),
16894f71c51SSzymon Dompke         Eq(isTriggerThresholdDiscrete(triggerParams.thresholdParams())));
16994f71c51SSzymon Dompke     EXPECT_THAT(
17076833cb5SWludzik, Jozef         getProperty<TriggerThresholdParams>(sut->getPath(), "Thresholds"),
1714416fce6SCezary Zwolak         Eq(std::visit(utils::FromLabeledThresholdParamConversion(),
1724416fce6SCezary Zwolak                       triggerParams.thresholdParams())));
1734416fce6SCezary Zwolak }
1744416fce6SCezary Zwolak 
TEST_F(TestTrigger,checkBasicGetters)175b4ef22e4SSzymon Dompke TEST_F(TestTrigger, checkBasicGetters)
176b4ef22e4SSzymon Dompke {
177b4ef22e4SSzymon Dompke     EXPECT_THAT(sut->getId(), Eq(triggerParams.id()));
1781cdd7e4fSSzymon Dompke     EXPECT_THAT(sut->getPath(),
1791cdd7e4fSSzymon Dompke                 Eq(utils::constants::triggerDirPath.str + triggerParams.id()));
180b4ef22e4SSzymon Dompke }
181b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,setPropertyNameToCorrectValue)182e28aa53dSSzymon Dompke TEST_F(TestTrigger, setPropertyNameToCorrectValue)
183e28aa53dSSzymon Dompke {
184e28aa53dSSzymon Dompke     std::string name = "custom name 1234 %^#5";
185e28aa53dSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Name", name),
186e28aa53dSSzymon Dompke                 Eq(boost::system::errc::success));
187e28aa53dSSzymon Dompke     EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"), Eq(name));
188e28aa53dSSzymon Dompke }
189e28aa53dSSzymon Dompke 
TEST_F(TestTrigger,setPropertyReportNames)19094f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyReportNames)
19194f71c51SSzymon Dompke {
1921cdd7e4fSSzymon Dompke     std::vector<object_path> newNames = {
1931cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "abc",
1941cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "one",
1951cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "prefix" / "two"};
1961cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newNames),
19794f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
19894f71c51SSzymon Dompke     EXPECT_THAT(
1991cdd7e4fSSzymon Dompke         getProperty<std::vector<object_path>>(sut->getPath(), "Reports"),
20094f71c51SSzymon Dompke         Eq(newNames));
201b4ef22e4SSzymon Dompke }
202b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,sendsUpdateWhenReportNamesChanges)203e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendsUpdateWhenReportNamesChanges)
204b4ef22e4SSzymon Dompke {
2051cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal = {
2061cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "abc",
2071cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "one",
2081cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "two"};
209b4ef22e4SSzymon Dompke 
210e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged,
211e6d48874SKrzysztof Grobelny                 Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
2121cdd7e4fSSzymon Dompke                                UnorderedElementsAre("abc", "one", "two"))));
213b4ef22e4SSzymon Dompke 
2141cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
215b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
216b4ef22e4SSzymon Dompke }
217b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,sendsUpdateWhenReportNamesChangesToSameValue)218e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendsUpdateWhenReportNamesChangesToSameValue)
219b4ef22e4SSzymon Dompke {
2201cdd7e4fSSzymon Dompke     const std::vector<object_path> newPropertyVal = triggerParams.reports();
221b4ef22e4SSzymon Dompke 
222b4ef22e4SSzymon Dompke     EXPECT_CALL(
223e6d48874SKrzysztof Grobelny         triggerPresenceChanged,
224e6d48874SKrzysztof Grobelny         Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
225e6d48874SKrzysztof Grobelny                        UnorderedElementsAreArray(triggerParams.reportIds()))));
226b4ef22e4SSzymon Dompke 
2271cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
228b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::success));
229b4ef22e4SSzymon Dompke }
230b4ef22e4SSzymon Dompke 
TEST_F(TestTrigger,DISABLED_settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds)231b4ef22e4SSzymon Dompke TEST_F(TestTrigger,
232b4ef22e4SSzymon Dompke        DISABLED_settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds)
233b4ef22e4SSzymon Dompke {
2341cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal{
2351cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "report1",
2361cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "report2",
2371cdd7e4fSSzymon Dompke         utils::constants::reportDirPath / "report1"};
238b4ef22e4SSzymon Dompke 
239e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
240b4ef22e4SSzymon Dompke 
2411cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
2421cdd7e4fSSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
2431cdd7e4fSSzymon Dompke }
2441cdd7e4fSSzymon Dompke 
TEST_F(TestTrigger,DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooManyPrefixes)2451cdd7e4fSSzymon Dompke TEST_F(
2461cdd7e4fSSzymon Dompke     TestTrigger,
2471cdd7e4fSSzymon Dompke     DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooManyPrefixes)
2481cdd7e4fSSzymon Dompke {
2491cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal{
2501cdd7e4fSSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/P1/P2/MyReport")};
2511cdd7e4fSSzymon Dompke 
2521cdd7e4fSSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
2531cdd7e4fSSzymon Dompke 
2541cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
2551cdd7e4fSSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
2561cdd7e4fSSzymon Dompke }
2571cdd7e4fSSzymon Dompke 
TEST_F(TestTrigger,DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongPrefix)25832305f14SSzymon Dompke TEST_F(
25932305f14SSzymon Dompke     TestTrigger,
26032305f14SSzymon Dompke     DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongPrefix)
26132305f14SSzymon Dompke {
26232305f14SSzymon Dompke     std::vector<object_path> newPropertyVal{
26332305f14SSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/" +
26432305f14SSzymon Dompke                     utils::string_utils::getTooLongPrefix() + "/MyReport")};
26532305f14SSzymon Dompke 
26632305f14SSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
26732305f14SSzymon Dompke 
26832305f14SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
26932305f14SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
27032305f14SSzymon Dompke }
27132305f14SSzymon Dompke 
TEST_F(TestTrigger,DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongId)27232305f14SSzymon Dompke TEST_F(
27332305f14SSzymon Dompke     TestTrigger,
27432305f14SSzymon Dompke     DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongId)
27532305f14SSzymon Dompke {
27632305f14SSzymon Dompke     std::vector<object_path> newPropertyVal{
27732305f14SSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/Prefix/" +
27832305f14SSzymon Dompke                     utils::string_utils::getTooLongId())};
27932305f14SSzymon Dompke 
28032305f14SSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
28132305f14SSzymon Dompke 
28232305f14SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
28332305f14SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
28432305f14SSzymon Dompke }
28532305f14SSzymon Dompke 
TEST_F(TestTrigger,DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithBadPath)2861cdd7e4fSSzymon Dompke TEST_F(TestTrigger,
2871cdd7e4fSSzymon Dompke        DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithBadPath)
2881cdd7e4fSSzymon Dompke {
2891cdd7e4fSSzymon Dompke     std::vector<object_path> newPropertyVal{
2901cdd7e4fSSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/NotReports/MyReport")};
2911cdd7e4fSSzymon Dompke 
2921cdd7e4fSSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
2931cdd7e4fSSzymon Dompke 
2941cdd7e4fSSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
295b4ef22e4SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
29694f71c51SSzymon Dompke }
29794f71c51SSzymon Dompke 
TEST_F(TestTrigger,setPropertySensors)29894f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertySensors)
29994f71c51SSzymon Dompke {
30094f71c51SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateSensors(_, _));
30194f71c51SSzymon Dompke     for (const auto& threshold : thresholdMocks)
30294f71c51SSzymon Dompke     {
30394f71c51SSzymon Dompke         auto thresholdMockPtr =
30494f71c51SSzymon Dompke             std::dynamic_pointer_cast<NiceMock<ThresholdMock>>(threshold);
30594f71c51SSzymon Dompke         EXPECT_CALL(*thresholdMockPtr, updateSensors(_));
30694f71c51SSzymon Dompke     }
3071cdd7e4fSSzymon Dompke     SensorsInfo newSensors(
3081cdd7e4fSSzymon Dompke         {std::make_pair(object_path("/abc/def"), "metadata")});
30994f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Sensors", newSensors),
31094f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
31194f71c51SSzymon Dompke }
31294f71c51SSzymon Dompke 
TEST_F(TestTrigger,setPropertyThresholds)31394f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyThresholds)
31494f71c51SSzymon Dompke {
315b7b7e1b6SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateThresholds(_, _, _, _, _, _));
31694f71c51SSzymon Dompke     TriggerThresholdParams newThresholds =
317cff70c14SKrzysztof Grobelny         std::vector<discrete::ThresholdParam>({std::make_tuple(
318cff70c14SKrzysztof Grobelny             "discrete threshold", utils::enumToString(discrete::Severity::ok),
319cff70c14SKrzysztof Grobelny             10, "12.3")});
32094f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Thresholds", newThresholds),
32194f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
32294f71c51SSzymon Dompke }
32394f71c51SSzymon Dompke 
TEST_F(TestTrigger,setThresholdParamsWithTooLongDiscreteName)32432305f14SSzymon Dompke TEST_F(TestTrigger, setThresholdParamsWithTooLongDiscreteName)
32532305f14SSzymon Dompke {
32632305f14SSzymon Dompke     const TriggerThresholdParams currentValue =
32732305f14SSzymon Dompke         std::visit(utils::FromLabeledThresholdParamConversion(),
32832305f14SSzymon Dompke                    triggerParams.thresholdParams());
32932305f14SSzymon Dompke 
33032305f14SSzymon Dompke     TriggerThresholdParams newThresholds =
33132305f14SSzymon Dompke         std::vector<discrete::ThresholdParam>({std::make_tuple(
332cff70c14SKrzysztof Grobelny             utils::string_utils::getTooLongName(),
333cff70c14SKrzysztof Grobelny             utils::enumToString(discrete::Severity::ok), 10, "12.3")});
33432305f14SSzymon Dompke 
33532305f14SSzymon Dompke     changeProperty<TriggerThresholdParams>(
33632305f14SSzymon Dompke         sut->getPath(), "Thresholds",
33732305f14SSzymon Dompke         {.valueBefore = Eq(currentValue),
33832305f14SSzymon Dompke          .newValue = newThresholds,
33932305f14SSzymon Dompke          .ec = Eq(boost::system::errc::invalid_argument),
34032305f14SSzymon Dompke          .valueAfter = Eq(currentValue)});
34132305f14SSzymon Dompke }
34232305f14SSzymon Dompke 
TEST_F(TestTrigger,setNameTooLong)34332305f14SSzymon Dompke TEST_F(TestTrigger, setNameTooLong)
34432305f14SSzymon Dompke {
34532305f14SSzymon Dompke     std::string currentValue = TriggerParams().name();
34632305f14SSzymon Dompke 
34732305f14SSzymon Dompke     changeProperty<std::string>(
34832305f14SSzymon Dompke         sut->getPath(), "Name",
34932305f14SSzymon Dompke         {.valueBefore = Eq(currentValue),
35032305f14SSzymon Dompke          .newValue = utils::string_utils::getTooLongName(),
35132305f14SSzymon Dompke          .ec = Eq(boost::system::errc::invalid_argument),
35232305f14SSzymon Dompke          .valueAfter = Eq(currentValue)});
35332305f14SSzymon Dompke }
35432305f14SSzymon Dompke 
TEST_F(TestTrigger,checkIfNumericCoversionsAreGood)3554416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfNumericCoversionsAreGood)
3564416fce6SCezary Zwolak {
3574416fce6SCezary Zwolak     const auto& labeledParamsBase =
3584416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(
3594416fce6SCezary Zwolak             triggerParams.thresholdParams());
3604416fce6SCezary Zwolak     const auto paramsToCheck =
3614416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
3624416fce6SCezary Zwolak                    triggerParams.thresholdParams());
3634416fce6SCezary Zwolak     const auto labeledParamsToCheck =
3644416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit(
3654416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
3664416fce6SCezary Zwolak 
3674416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
3684416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
3694416fce6SCezary Zwolak     {
3704416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(),
3714416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Type>()));
3724416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(),
3734416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Direction>()));
3744416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
3754416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
3764416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
3774416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
3784416fce6SCezary Zwolak     }
3794416fce6SCezary Zwolak }
3804416fce6SCezary Zwolak 
TEST_F(TestTrigger,checkIfDiscreteCoversionsAreGood)3814416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood)
3824416fce6SCezary Zwolak {
3834416fce6SCezary Zwolak     const auto& labeledParamsBase =
3844416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(
3854416fce6SCezary Zwolak             triggerDiscreteParams.thresholdParams());
3864416fce6SCezary Zwolak     const auto paramsToCheck =
3874416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
3884416fce6SCezary Zwolak                    triggerDiscreteParams.thresholdParams());
3894416fce6SCezary Zwolak     const auto labeledParamsToCheck =
3904416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit(
3914416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
3924416fce6SCezary Zwolak 
3934416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
3944416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
3954416fce6SCezary Zwolak     {
3964416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(),
3974416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::UserId>()));
3984416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(),
3994416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Severity>()));
4004416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
4014416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
4024416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
4034416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
4044416fce6SCezary Zwolak     }
40576833cb5SWludzik, Jozef }
40676833cb5SWludzik, Jozef 
TEST_F(TestTrigger,deleteTrigger)40776833cb5SWludzik, Jozef TEST_F(TestTrigger, deleteTrigger)
40876833cb5SWludzik, Jozef {
409e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
41076833cb5SWludzik, Jozef     EXPECT_CALL(*triggerManagerMockPtr, removeTrigger(sut.get()));
411e6d48874SKrzysztof Grobelny 
412e6d48874SKrzysztof Grobelny     auto ec = deleteTrigger(sut->getPath());
413e6d48874SKrzysztof Grobelny     EXPECT_THAT(ec, Eq(boost::system::errc::success));
414b4ef22e4SSzymon Dompke }
415e6d48874SKrzysztof Grobelny 
TEST_F(TestTrigger,sendUpdateWhenTriggerIsDeleted)416e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendUpdateWhenTriggerIsDeleted)
417e6d48874SKrzysztof Grobelny {
418e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged,
419e6d48874SKrzysztof Grobelny                 Call(FieldsAre(messages::Presence::Removed, triggerParams.id(),
420e6d48874SKrzysztof Grobelny                                UnorderedElementsAre())));
421e6d48874SKrzysztof Grobelny 
42276833cb5SWludzik, Jozef     auto ec = deleteTrigger(sut->getPath());
42376833cb5SWludzik, Jozef     EXPECT_THAT(ec, Eq(boost::system::errc::success));
42476833cb5SWludzik, Jozef }
42576833cb5SWludzik, Jozef 
TEST_F(TestTrigger,deletingNonExistingTriggerReturnInvalidRequestDescriptor)42676833cb5SWludzik, Jozef TEST_F(TestTrigger, deletingNonExistingTriggerReturnInvalidRequestDescriptor)
42776833cb5SWludzik, Jozef {
4281cdd7e4fSSzymon Dompke     auto ec =
4291cdd7e4fSSzymon Dompke         deleteTrigger(utils::constants::triggerDirPath.str + "NonExisting"s);
43076833cb5SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(EBADR));
43176833cb5SWludzik, Jozef }
432a4e67616SCezary Zwolak 
TEST_F(TestTrigger,settingPersistencyToFalseRemovesTriggerFromStorage)4334416fce6SCezary Zwolak TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage)
434a4e67616SCezary Zwolak {
435e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
436a4e67616SCezary Zwolak 
437a4e67616SCezary Zwolak     bool persistent = false;
4384416fce6SCezary Zwolak     EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent),
439a4e67616SCezary Zwolak                 Eq(boost::system::errc::success));
440a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"),
441a4e67616SCezary Zwolak                 Eq(persistent));
442a4e67616SCezary Zwolak }
443a4e67616SCezary Zwolak 
444b4ef22e4SSzymon Dompke class TestTriggerInitialization : public TestTrigger
445a4e67616SCezary Zwolak {
446a4e67616SCezary Zwolak   public:
SetUp()4473a1c297aSPatrick Williams     void SetUp() override {}
448a4e67616SCezary Zwolak 
449a4e67616SCezary Zwolak     nlohmann::json storedConfiguration;
450a4e67616SCezary Zwolak };
451a4e67616SCezary Zwolak 
TEST_F(TestTriggerInitialization,exceptionDuringTriggerStoreDisablesPersistency)452b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization,
453b4ef22e4SSzymon Dompke        exceptionDuringTriggerStoreDisablesPersistency)
454a4e67616SCezary Zwolak {
455a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _))
456a4e67616SCezary Zwolak         .WillOnce(Throw(std::runtime_error("Generic error!")));
457a4e67616SCezary Zwolak 
458a4e67616SCezary Zwolak     sut = makeTrigger(triggerParams);
459a4e67616SCezary Zwolak 
460a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(false));
461a4e67616SCezary Zwolak }
462a4e67616SCezary Zwolak 
TEST_F(TestTriggerInitialization,creatingTriggerThrowsExceptionWhenIdIsInvalid)463b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerThrowsExceptionWhenIdIsInvalid)
464a4e67616SCezary Zwolak {
465a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _)).Times(0);
466a4e67616SCezary Zwolak 
467e28aa53dSSzymon Dompke     EXPECT_THROW(makeTrigger(triggerParams.id("inv?lidId")),
468a4e67616SCezary Zwolak                  sdbusplus::exception::SdBusError);
469a4e67616SCezary Zwolak }
470a4e67616SCezary Zwolak 
TEST_F(TestTriggerInitialization,creatingTriggerUpdatesTriggersIdsInReports)471b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerUpdatesTriggersIdsInReports)
472b4ef22e4SSzymon Dompke {
473e6d48874SKrzysztof Grobelny     EXPECT_CALL(
474e6d48874SKrzysztof Grobelny         triggerPresenceChanged,
475e6d48874SKrzysztof Grobelny         Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
476e6d48874SKrzysztof Grobelny                        UnorderedElementsAreArray(triggerParams.reportIds()))));
477b4ef22e4SSzymon Dompke 
478b4ef22e4SSzymon Dompke     sut = makeTrigger(triggerParams);
479b4ef22e4SSzymon Dompke }
480b4ef22e4SSzymon Dompke 
481a4e67616SCezary Zwolak class TestTriggerStore : public TestTrigger
482a4e67616SCezary Zwolak {
483a4e67616SCezary Zwolak   public:
4844416fce6SCezary Zwolak     nlohmann::json storedConfiguration;
4854416fce6SCezary Zwolak     nlohmann::json storedDiscreteConfiguration;
4864416fce6SCezary Zwolak     std::unique_ptr<Trigger> sutDiscrete;
4874416fce6SCezary Zwolak 
SetUp()488a4e67616SCezary Zwolak     void SetUp() override
489a4e67616SCezary Zwolak     {
490a4e67616SCezary Zwolak         ON_CALL(storageMock, store(_, _))
491a4e67616SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedConfiguration));
492a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
493a4e67616SCezary Zwolak 
4944416fce6SCezary Zwolak         ON_CALL(storageMock, store(_, _))
4954416fce6SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedDiscreteConfiguration));
4964416fce6SCezary Zwolak         sutDiscrete = makeTrigger(triggerDiscreteParams);
4974416fce6SCezary Zwolak     }
498a4e67616SCezary Zwolak };
499a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerVersion)500a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerVersion)
501a4e67616SCezary Zwolak {
502a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Version"), Eq(expectedTriggerVersion));
503a4e67616SCezary Zwolak }
504a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerId)505e28aa53dSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerId)
506e28aa53dSSzymon Dompke {
507e28aa53dSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("Id"), Eq(triggerParams.id()));
508e28aa53dSSzymon Dompke }
509e28aa53dSSzymon Dompke 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerName)510a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerName)
511a4e67616SCezary Zwolak {
512a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Name"), Eq(triggerParams.name()));
513a4e67616SCezary Zwolak }
514a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerTriggerActions)5152001301aSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerTriggerActions)
516a4e67616SCezary Zwolak {
5172001301aSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("TriggerActions"),
51894f71c51SSzymon Dompke                 Eq(utils::transform(triggerParams.triggerActions(),
51994f71c51SSzymon Dompke                                     [](const auto& action) {
52094f71c51SSzymon Dompke         return actionToString(action);
52194f71c51SSzymon Dompke     })));
522a4e67616SCezary Zwolak }
523a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerReportIds)524b8cc78ddSKrzysztof Grobelny TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerReportIds)
525a4e67616SCezary Zwolak {
526b8cc78ddSKrzysztof Grobelny     ASSERT_THAT(storedConfiguration.at("ReportIds"),
527b8cc78ddSKrzysztof Grobelny                 Eq(triggerParams.reportIds()));
528a4e67616SCezary Zwolak }
529a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerSensors)530a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerSensors)
531a4e67616SCezary Zwolak {
532a4e67616SCezary Zwolak     nlohmann::json expectedItem;
5334416fce6SCezary Zwolak     expectedItem["service"] = "service1";
53494f71c51SSzymon Dompke     expectedItem["path"] = "/xyz/openbmc_project/sensors/temperature/BMC_Temp";
535b8cc78ddSKrzysztof Grobelny     expectedItem["metadata"] = "metadata1";
536a4e67616SCezary Zwolak 
537a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Sensors"), ElementsAre(expectedItem));
538a4e67616SCezary Zwolak }
539a4e67616SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresTriggerThresholdParams)540a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerThresholdParams)
541a4e67616SCezary Zwolak {
542a4e67616SCezary Zwolak     nlohmann::json expectedItem0;
543a4e67616SCezary Zwolak     expectedItem0["type"] = 0;
544a4e67616SCezary Zwolak     expectedItem0["dwellTime"] = 10;
545a4e67616SCezary Zwolak     expectedItem0["direction"] = 1;
5464416fce6SCezary Zwolak     expectedItem0["thresholdValue"] = 0.5;
547a4e67616SCezary Zwolak 
548a4e67616SCezary Zwolak     nlohmann::json expectedItem1;
549a4e67616SCezary Zwolak     expectedItem1["type"] = 3;
550a4e67616SCezary Zwolak     expectedItem1["dwellTime"] = 10;
551a4e67616SCezary Zwolak     expectedItem1["direction"] = 2;
5524416fce6SCezary Zwolak     expectedItem1["thresholdValue"] = 90.2;
553a4e67616SCezary Zwolak 
5544416fce6SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0));
555a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParams"),
556a4e67616SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
557a4e67616SCezary Zwolak }
5584416fce6SCezary Zwolak 
TEST_F(TestTriggerStore,settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)5594416fce6SCezary Zwolak TEST_F(TestTriggerStore,
5604416fce6SCezary Zwolak        settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)
5614416fce6SCezary Zwolak {
5624416fce6SCezary Zwolak     nlohmann::json expectedItem0;
5634416fce6SCezary Zwolak     expectedItem0["userId"] = "userId";
5644416fce6SCezary Zwolak     expectedItem0["severity"] = discrete::Severity::warning;
5654416fce6SCezary Zwolak     expectedItem0["dwellTime"] = 10;
5669f346790SSzymon Dompke     expectedItem0["thresholdValue"] = "15.2";
5674416fce6SCezary Zwolak 
5684416fce6SCezary Zwolak     nlohmann::json expectedItem1;
5694416fce6SCezary Zwolak     expectedItem1["userId"] = "userId_2";
5704416fce6SCezary Zwolak     expectedItem1["severity"] = discrete::Severity::critical;
5714416fce6SCezary Zwolak     expectedItem1["dwellTime"] = 5;
5729f346790SSzymon Dompke     expectedItem1["thresholdValue"] = "32.7";
5734416fce6SCezary Zwolak 
5744416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParamsDiscriminator"),
5754416fce6SCezary Zwolak                 Eq(1));
5764416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParams"),
5774416fce6SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
5784416fce6SCezary Zwolak }
579