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