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