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"
15*32305f14SSzymon Dompke #include "utils/dbus_path_utils.hpp"
16e6d48874SKrzysztof Grobelny #include "utils/messanger.hpp"
17*32305f14SSzymon 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 
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 
6576833cb5SWludzik, Jozef     void SetUp() override
6676833cb5SWludzik, Jozef     {
67a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
68a4e67616SCezary Zwolak     }
69a4e67616SCezary Zwolak 
704416fce6SCezary Zwolak     static std::vector<LabeledSensorInfo>
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 
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 
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>
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>
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 
118*32305f14SSzymon Dompke     template <class T>
119*32305f14SSzymon Dompke     struct ChangePropertyParams
120*32305f14SSzymon Dompke     {
121*32305f14SSzymon Dompke         Matcher<T> valueBefore = _;
122*32305f14SSzymon Dompke         T newValue;
123*32305f14SSzymon Dompke         Matcher<boost::system::error_code> ec =
124*32305f14SSzymon Dompke             Eq(boost::system::errc::success);
125*32305f14SSzymon Dompke         Matcher<T> valueAfter = Eq(newValue);
126*32305f14SSzymon Dompke     };
127*32305f14SSzymon Dompke 
128*32305f14SSzymon Dompke     template <class T>
129*32305f14SSzymon Dompke     static void changeProperty(const std::string& path,
130*32305f14SSzymon Dompke                                const std::string& property,
131*32305f14SSzymon Dompke                                ChangePropertyParams<T> p)
132*32305f14SSzymon Dompke     {
133*32305f14SSzymon Dompke         ASSERT_THAT(getProperty<T>(path, property), p.valueBefore);
134*32305f14SSzymon Dompke         ASSERT_THAT(setProperty<T>(path, property, p.newValue), p.ec);
135*32305f14SSzymon Dompke         EXPECT_THAT(getProperty<T>(path, property), p.valueAfter);
136*32305f14SSzymon Dompke     }
137*32305f14SSzymon Dompke 
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 
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"),
15894f71c51SSzymon Dompke         Eq(utils::transform(
15994f71c51SSzymon Dompke             triggerParams.triggerActions(),
16094f71c51SSzymon Dompke             [](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 
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 
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 
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 
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 
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 
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 
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 
258*32305f14SSzymon Dompke TEST_F(
259*32305f14SSzymon Dompke     TestTrigger,
260*32305f14SSzymon Dompke     DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongPrefix)
261*32305f14SSzymon Dompke {
262*32305f14SSzymon Dompke     std::vector<object_path> newPropertyVal{
263*32305f14SSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/" +
264*32305f14SSzymon Dompke                     utils::string_utils::getTooLongPrefix() + "/MyReport")};
265*32305f14SSzymon Dompke 
266*32305f14SSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
267*32305f14SSzymon Dompke 
268*32305f14SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
269*32305f14SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
270*32305f14SSzymon Dompke }
271*32305f14SSzymon Dompke 
272*32305f14SSzymon Dompke TEST_F(
273*32305f14SSzymon Dompke     TestTrigger,
274*32305f14SSzymon Dompke     DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongId)
275*32305f14SSzymon Dompke {
276*32305f14SSzymon Dompke     std::vector<object_path> newPropertyVal{
277*32305f14SSzymon Dompke         object_path("/xyz/openbmc_project/Telemetry/Reports/Prefix/" +
278*32305f14SSzymon Dompke                     utils::string_utils::getTooLongId())};
279*32305f14SSzymon Dompke 
280*32305f14SSzymon Dompke     EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0);
281*32305f14SSzymon Dompke 
282*32305f14SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal),
283*32305f14SSzymon Dompke                 Eq(boost::system::errc::invalid_argument));
284*32305f14SSzymon Dompke }
285*32305f14SSzymon Dompke 
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 
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 
31394f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyThresholds)
31494f71c51SSzymon Dompke {
315b7b7e1b6SSzymon Dompke     EXPECT_CALL(*triggerFactoryMockPtr, updateThresholds(_, _, _, _, _, _));
31694f71c51SSzymon Dompke     TriggerThresholdParams newThresholds =
31794f71c51SSzymon Dompke         std::vector<discrete::ThresholdParam>(
31894f71c51SSzymon Dompke             {std::make_tuple("discrete threshold", "OK", 10, "12.3")});
31994f71c51SSzymon Dompke     EXPECT_THAT(setProperty(sut->getPath(), "Thresholds", newThresholds),
32094f71c51SSzymon Dompke                 Eq(boost::system::errc::success));
32194f71c51SSzymon Dompke }
32294f71c51SSzymon Dompke 
323*32305f14SSzymon Dompke TEST_F(TestTrigger, setThresholdParamsWithTooLongDiscreteName)
324*32305f14SSzymon Dompke {
325*32305f14SSzymon Dompke     const TriggerThresholdParams currentValue =
326*32305f14SSzymon Dompke         std::visit(utils::FromLabeledThresholdParamConversion(),
327*32305f14SSzymon Dompke                    triggerParams.thresholdParams());
328*32305f14SSzymon Dompke 
329*32305f14SSzymon Dompke     TriggerThresholdParams newThresholds =
330*32305f14SSzymon Dompke         std::vector<discrete::ThresholdParam>({std::make_tuple(
331*32305f14SSzymon Dompke             utils::string_utils::getTooLongName(), "OK", 10, "12.3")});
332*32305f14SSzymon Dompke 
333*32305f14SSzymon Dompke     changeProperty<TriggerThresholdParams>(
334*32305f14SSzymon Dompke         sut->getPath(), "Thresholds",
335*32305f14SSzymon Dompke         {.valueBefore = Eq(currentValue),
336*32305f14SSzymon Dompke          .newValue = newThresholds,
337*32305f14SSzymon Dompke          .ec = Eq(boost::system::errc::invalid_argument),
338*32305f14SSzymon Dompke          .valueAfter = Eq(currentValue)});
339*32305f14SSzymon Dompke }
340*32305f14SSzymon Dompke 
341*32305f14SSzymon Dompke TEST_F(TestTrigger, setNameTooLong)
342*32305f14SSzymon Dompke {
343*32305f14SSzymon Dompke     std::string currentValue = TriggerParams().name();
344*32305f14SSzymon Dompke 
345*32305f14SSzymon Dompke     changeProperty<std::string>(
346*32305f14SSzymon Dompke         sut->getPath(), "Name",
347*32305f14SSzymon Dompke         {.valueBefore = Eq(currentValue),
348*32305f14SSzymon Dompke          .newValue = utils::string_utils::getTooLongName(),
349*32305f14SSzymon Dompke          .ec = Eq(boost::system::errc::invalid_argument),
350*32305f14SSzymon Dompke          .valueAfter = Eq(currentValue)});
351*32305f14SSzymon Dompke }
352*32305f14SSzymon Dompke 
3534416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfNumericCoversionsAreGood)
3544416fce6SCezary Zwolak {
3554416fce6SCezary Zwolak     const auto& labeledParamsBase =
3564416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(
3574416fce6SCezary Zwolak             triggerParams.thresholdParams());
3584416fce6SCezary Zwolak     const auto paramsToCheck =
3594416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
3604416fce6SCezary Zwolak                    triggerParams.thresholdParams());
3614416fce6SCezary Zwolak     const auto labeledParamsToCheck =
3624416fce6SCezary Zwolak         std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit(
3634416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
3644416fce6SCezary Zwolak 
3654416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
3664416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
3674416fce6SCezary Zwolak     {
3684416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(),
3694416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Type>()));
3704416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(),
3714416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Direction>()));
3724416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
3734416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
3744416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
3754416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
3764416fce6SCezary Zwolak     }
3774416fce6SCezary Zwolak }
3784416fce6SCezary Zwolak 
3794416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood)
3804416fce6SCezary Zwolak {
3814416fce6SCezary Zwolak     const auto& labeledParamsBase =
3824416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(
3834416fce6SCezary Zwolak             triggerDiscreteParams.thresholdParams());
3844416fce6SCezary Zwolak     const auto paramsToCheck =
3854416fce6SCezary Zwolak         std::visit(utils::FromLabeledThresholdParamConversion(),
3864416fce6SCezary Zwolak                    triggerDiscreteParams.thresholdParams());
3874416fce6SCezary Zwolak     const auto labeledParamsToCheck =
3884416fce6SCezary Zwolak         std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit(
3894416fce6SCezary Zwolak             utils::ToLabeledThresholdParamConversion(), paramsToCheck));
3904416fce6SCezary Zwolak 
3914416fce6SCezary Zwolak     for (const auto& [tocheck, base] :
3924416fce6SCezary Zwolak          boost::combine(labeledParamsToCheck, labeledParamsBase))
3934416fce6SCezary Zwolak     {
3944416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(),
3954416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::UserId>()));
3964416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(),
3974416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::Severity>()));
3984416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(),
3994416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::DwellTime>()));
4004416fce6SCezary Zwolak         EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(),
4014416fce6SCezary Zwolak                     Eq(base.at_label<utils::tstring::ThresholdValue>()));
4024416fce6SCezary Zwolak     }
40376833cb5SWludzik, Jozef }
40476833cb5SWludzik, Jozef 
40576833cb5SWludzik, Jozef TEST_F(TestTrigger, deleteTrigger)
40676833cb5SWludzik, Jozef {
407e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
40876833cb5SWludzik, Jozef     EXPECT_CALL(*triggerManagerMockPtr, removeTrigger(sut.get()));
409e6d48874SKrzysztof Grobelny 
410e6d48874SKrzysztof Grobelny     auto ec = deleteTrigger(sut->getPath());
411e6d48874SKrzysztof Grobelny     EXPECT_THAT(ec, Eq(boost::system::errc::success));
412b4ef22e4SSzymon Dompke }
413e6d48874SKrzysztof Grobelny 
414e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendUpdateWhenTriggerIsDeleted)
415e6d48874SKrzysztof Grobelny {
416e6d48874SKrzysztof Grobelny     EXPECT_CALL(triggerPresenceChanged,
417e6d48874SKrzysztof Grobelny                 Call(FieldsAre(messages::Presence::Removed, triggerParams.id(),
418e6d48874SKrzysztof Grobelny                                UnorderedElementsAre())));
419e6d48874SKrzysztof Grobelny 
42076833cb5SWludzik, Jozef     auto ec = deleteTrigger(sut->getPath());
42176833cb5SWludzik, Jozef     EXPECT_THAT(ec, Eq(boost::system::errc::success));
42276833cb5SWludzik, Jozef }
42376833cb5SWludzik, Jozef 
42476833cb5SWludzik, Jozef TEST_F(TestTrigger, deletingNonExistingTriggerReturnInvalidRequestDescriptor)
42576833cb5SWludzik, Jozef {
4261cdd7e4fSSzymon Dompke     auto ec =
4271cdd7e4fSSzymon Dompke         deleteTrigger(utils::constants::triggerDirPath.str + "NonExisting"s);
42876833cb5SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(EBADR));
42976833cb5SWludzik, Jozef }
430a4e67616SCezary Zwolak 
4314416fce6SCezary Zwolak TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage)
432a4e67616SCezary Zwolak {
433e28aa53dSSzymon Dompke     EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
434a4e67616SCezary Zwolak 
435a4e67616SCezary Zwolak     bool persistent = false;
4364416fce6SCezary Zwolak     EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent),
437a4e67616SCezary Zwolak                 Eq(boost::system::errc::success));
438a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"),
439a4e67616SCezary Zwolak                 Eq(persistent));
440a4e67616SCezary Zwolak }
441a4e67616SCezary Zwolak 
442b4ef22e4SSzymon Dompke class TestTriggerInitialization : public TestTrigger
443a4e67616SCezary Zwolak {
444a4e67616SCezary Zwolak   public:
445a4e67616SCezary Zwolak     void SetUp() override
446a4e67616SCezary Zwolak     {}
447a4e67616SCezary Zwolak 
448a4e67616SCezary Zwolak     nlohmann::json storedConfiguration;
449a4e67616SCezary Zwolak };
450a4e67616SCezary Zwolak 
451b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization,
452b4ef22e4SSzymon Dompke        exceptionDuringTriggerStoreDisablesPersistency)
453a4e67616SCezary Zwolak {
454a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _))
455a4e67616SCezary Zwolak         .WillOnce(Throw(std::runtime_error("Generic error!")));
456a4e67616SCezary Zwolak 
457a4e67616SCezary Zwolak     sut = makeTrigger(triggerParams);
458a4e67616SCezary Zwolak 
459a4e67616SCezary Zwolak     EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(false));
460a4e67616SCezary Zwolak }
461a4e67616SCezary Zwolak 
462b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerThrowsExceptionWhenIdIsInvalid)
463a4e67616SCezary Zwolak {
464a4e67616SCezary Zwolak     EXPECT_CALL(storageMock, store(_, _)).Times(0);
465a4e67616SCezary Zwolak 
466e28aa53dSSzymon Dompke     EXPECT_THROW(makeTrigger(triggerParams.id("inv?lidId")),
467a4e67616SCezary Zwolak                  sdbusplus::exception::SdBusError);
468a4e67616SCezary Zwolak }
469a4e67616SCezary Zwolak 
470b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerUpdatesTriggersIdsInReports)
471b4ef22e4SSzymon Dompke {
472e6d48874SKrzysztof Grobelny     EXPECT_CALL(
473e6d48874SKrzysztof Grobelny         triggerPresenceChanged,
474e6d48874SKrzysztof Grobelny         Call(FieldsAre(messages::Presence::Exist, triggerParams.id(),
475e6d48874SKrzysztof Grobelny                        UnorderedElementsAreArray(triggerParams.reportIds()))));
476b4ef22e4SSzymon Dompke 
477b4ef22e4SSzymon Dompke     sut = makeTrigger(triggerParams);
478b4ef22e4SSzymon Dompke }
479b4ef22e4SSzymon Dompke 
480a4e67616SCezary Zwolak class TestTriggerStore : public TestTrigger
481a4e67616SCezary Zwolak {
482a4e67616SCezary Zwolak   public:
4834416fce6SCezary Zwolak     nlohmann::json storedConfiguration;
4844416fce6SCezary Zwolak     nlohmann::json storedDiscreteConfiguration;
4854416fce6SCezary Zwolak     std::unique_ptr<Trigger> sutDiscrete;
4864416fce6SCezary Zwolak 
487a4e67616SCezary Zwolak     void SetUp() override
488a4e67616SCezary Zwolak     {
489a4e67616SCezary Zwolak         ON_CALL(storageMock, store(_, _))
490a4e67616SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedConfiguration));
491a4e67616SCezary Zwolak         sut = makeTrigger(triggerParams);
492a4e67616SCezary Zwolak 
4934416fce6SCezary Zwolak         ON_CALL(storageMock, store(_, _))
4944416fce6SCezary Zwolak             .WillByDefault(SaveArg<1>(&storedDiscreteConfiguration));
4954416fce6SCezary Zwolak         sutDiscrete = makeTrigger(triggerDiscreteParams);
4964416fce6SCezary Zwolak     }
497a4e67616SCezary Zwolak };
498a4e67616SCezary Zwolak 
499a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerVersion)
500a4e67616SCezary Zwolak {
501a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Version"), Eq(expectedTriggerVersion));
502a4e67616SCezary Zwolak }
503a4e67616SCezary Zwolak 
504e28aa53dSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerId)
505e28aa53dSSzymon Dompke {
506e28aa53dSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("Id"), Eq(triggerParams.id()));
507e28aa53dSSzymon Dompke }
508e28aa53dSSzymon Dompke 
509a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerName)
510a4e67616SCezary Zwolak {
511a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Name"), Eq(triggerParams.name()));
512a4e67616SCezary Zwolak }
513a4e67616SCezary Zwolak 
5142001301aSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerTriggerActions)
515a4e67616SCezary Zwolak {
5162001301aSSzymon Dompke     ASSERT_THAT(storedConfiguration.at("TriggerActions"),
51794f71c51SSzymon Dompke                 Eq(utils::transform(triggerParams.triggerActions(),
51894f71c51SSzymon Dompke                                     [](const auto& action) {
51994f71c51SSzymon Dompke                                         return actionToString(action);
52094f71c51SSzymon Dompke                                     })));
521a4e67616SCezary Zwolak }
522a4e67616SCezary Zwolak 
523b8cc78ddSKrzysztof Grobelny TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerReportIds)
524a4e67616SCezary Zwolak {
525b8cc78ddSKrzysztof Grobelny     ASSERT_THAT(storedConfiguration.at("ReportIds"),
526b8cc78ddSKrzysztof Grobelny                 Eq(triggerParams.reportIds()));
527a4e67616SCezary Zwolak }
528a4e67616SCezary Zwolak 
529a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerSensors)
530a4e67616SCezary Zwolak {
531a4e67616SCezary Zwolak     nlohmann::json expectedItem;
5324416fce6SCezary Zwolak     expectedItem["service"] = "service1";
53394f71c51SSzymon Dompke     expectedItem["path"] = "/xyz/openbmc_project/sensors/temperature/BMC_Temp";
534b8cc78ddSKrzysztof Grobelny     expectedItem["metadata"] = "metadata1";
535a4e67616SCezary Zwolak 
536a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("Sensors"), ElementsAre(expectedItem));
537a4e67616SCezary Zwolak }
538a4e67616SCezary Zwolak 
539a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerThresholdParams)
540a4e67616SCezary Zwolak {
541a4e67616SCezary Zwolak     nlohmann::json expectedItem0;
542a4e67616SCezary Zwolak     expectedItem0["type"] = 0;
543a4e67616SCezary Zwolak     expectedItem0["dwellTime"] = 10;
544a4e67616SCezary Zwolak     expectedItem0["direction"] = 1;
5454416fce6SCezary Zwolak     expectedItem0["thresholdValue"] = 0.5;
546a4e67616SCezary Zwolak 
547a4e67616SCezary Zwolak     nlohmann::json expectedItem1;
548a4e67616SCezary Zwolak     expectedItem1["type"] = 3;
549a4e67616SCezary Zwolak     expectedItem1["dwellTime"] = 10;
550a4e67616SCezary Zwolak     expectedItem1["direction"] = 2;
5514416fce6SCezary Zwolak     expectedItem1["thresholdValue"] = 90.2;
552a4e67616SCezary Zwolak 
5534416fce6SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0));
554a4e67616SCezary Zwolak     ASSERT_THAT(storedConfiguration.at("ThresholdParams"),
555a4e67616SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
556a4e67616SCezary Zwolak }
5574416fce6SCezary Zwolak 
5584416fce6SCezary Zwolak TEST_F(TestTriggerStore,
5594416fce6SCezary Zwolak        settingPersistencyToTrueStoresDiscreteTriggerThresholdParams)
5604416fce6SCezary Zwolak {
5614416fce6SCezary Zwolak     nlohmann::json expectedItem0;
5624416fce6SCezary Zwolak     expectedItem0["userId"] = "userId";
5634416fce6SCezary Zwolak     expectedItem0["severity"] = discrete::Severity::warning;
5644416fce6SCezary Zwolak     expectedItem0["dwellTime"] = 10;
5659f346790SSzymon Dompke     expectedItem0["thresholdValue"] = "15.2";
5664416fce6SCezary Zwolak 
5674416fce6SCezary Zwolak     nlohmann::json expectedItem1;
5684416fce6SCezary Zwolak     expectedItem1["userId"] = "userId_2";
5694416fce6SCezary Zwolak     expectedItem1["severity"] = discrete::Severity::critical;
5704416fce6SCezary Zwolak     expectedItem1["dwellTime"] = 5;
5719f346790SSzymon Dompke     expectedItem1["thresholdValue"] = "32.7";
5724416fce6SCezary Zwolak 
5734416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParamsDiscriminator"),
5744416fce6SCezary Zwolak                 Eq(1));
5754416fce6SCezary Zwolak     ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParams"),
5764416fce6SCezary Zwolak                 ElementsAre(expectedItem0, expectedItem1));
5774416fce6SCezary Zwolak }
578