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