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 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 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> 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 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"), 158*3a1c297aSPatrick Williams Eq(utils::transform(triggerParams.triggerActions(), 159*3a1c297aSPatrick Williams [](const auto& action) { 160*3a1c297aSPatrick Williams return actionToString(action); 161*3a1c297aSPatrick Williams }))); 1624416fce6SCezary Zwolak EXPECT_THAT((getProperty<SensorsInfo>(sut->getPath(), "Sensors")), 1634416fce6SCezary Zwolak Eq(utils::fromLabeledSensorsInfo(triggerParams.sensors()))); 16476833cb5SWludzik, Jozef EXPECT_THAT( 1651cdd7e4fSSzymon Dompke getProperty<std::vector<object_path>>(sut->getPath(), "Reports"), 1661cdd7e4fSSzymon Dompke Eq(triggerParams.reports())); 16776833cb5SWludzik, Jozef EXPECT_THAT( 16894f71c51SSzymon Dompke getProperty<bool>(sut->getPath(), "Discrete"), 16994f71c51SSzymon Dompke Eq(isTriggerThresholdDiscrete(triggerParams.thresholdParams()))); 17094f71c51SSzymon Dompke EXPECT_THAT( 17176833cb5SWludzik, Jozef getProperty<TriggerThresholdParams>(sut->getPath(), "Thresholds"), 1724416fce6SCezary Zwolak Eq(std::visit(utils::FromLabeledThresholdParamConversion(), 1734416fce6SCezary Zwolak triggerParams.thresholdParams()))); 1744416fce6SCezary Zwolak } 1754416fce6SCezary Zwolak 176b4ef22e4SSzymon Dompke TEST_F(TestTrigger, checkBasicGetters) 177b4ef22e4SSzymon Dompke { 178b4ef22e4SSzymon Dompke EXPECT_THAT(sut->getId(), Eq(triggerParams.id())); 1791cdd7e4fSSzymon Dompke EXPECT_THAT(sut->getPath(), 1801cdd7e4fSSzymon Dompke Eq(utils::constants::triggerDirPath.str + triggerParams.id())); 181b4ef22e4SSzymon Dompke } 182b4ef22e4SSzymon Dompke 183e28aa53dSSzymon Dompke TEST_F(TestTrigger, setPropertyNameToCorrectValue) 184e28aa53dSSzymon Dompke { 185e28aa53dSSzymon Dompke std::string name = "custom name 1234 %^#5"; 186e28aa53dSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Name", name), 187e28aa53dSSzymon Dompke Eq(boost::system::errc::success)); 188e28aa53dSSzymon Dompke EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"), Eq(name)); 189e28aa53dSSzymon Dompke } 190e28aa53dSSzymon Dompke 19194f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyReportNames) 19294f71c51SSzymon Dompke { 1931cdd7e4fSSzymon Dompke std::vector<object_path> newNames = { 1941cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "abc", 1951cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "one", 1961cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "prefix" / "two"}; 1971cdd7e4fSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newNames), 19894f71c51SSzymon Dompke Eq(boost::system::errc::success)); 19994f71c51SSzymon Dompke EXPECT_THAT( 2001cdd7e4fSSzymon Dompke getProperty<std::vector<object_path>>(sut->getPath(), "Reports"), 20194f71c51SSzymon Dompke Eq(newNames)); 202b4ef22e4SSzymon Dompke } 203b4ef22e4SSzymon Dompke 204e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendsUpdateWhenReportNamesChanges) 205b4ef22e4SSzymon Dompke { 2061cdd7e4fSSzymon Dompke std::vector<object_path> newPropertyVal = { 2071cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "abc", 2081cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "one", 2091cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "two"}; 210b4ef22e4SSzymon Dompke 211e6d48874SKrzysztof Grobelny EXPECT_CALL(triggerPresenceChanged, 212e6d48874SKrzysztof Grobelny Call(FieldsAre(messages::Presence::Exist, triggerParams.id(), 2131cdd7e4fSSzymon Dompke UnorderedElementsAre("abc", "one", "two")))); 214b4ef22e4SSzymon Dompke 2151cdd7e4fSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 216b4ef22e4SSzymon Dompke Eq(boost::system::errc::success)); 217b4ef22e4SSzymon Dompke } 218b4ef22e4SSzymon Dompke 219e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendsUpdateWhenReportNamesChangesToSameValue) 220b4ef22e4SSzymon Dompke { 2211cdd7e4fSSzymon Dompke const std::vector<object_path> newPropertyVal = triggerParams.reports(); 222b4ef22e4SSzymon Dompke 223b4ef22e4SSzymon Dompke EXPECT_CALL( 224e6d48874SKrzysztof Grobelny triggerPresenceChanged, 225e6d48874SKrzysztof Grobelny Call(FieldsAre(messages::Presence::Exist, triggerParams.id(), 226e6d48874SKrzysztof Grobelny UnorderedElementsAreArray(triggerParams.reportIds())))); 227b4ef22e4SSzymon Dompke 2281cdd7e4fSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 229b4ef22e4SSzymon Dompke Eq(boost::system::errc::success)); 230b4ef22e4SSzymon Dompke } 231b4ef22e4SSzymon Dompke 232b4ef22e4SSzymon Dompke TEST_F(TestTrigger, 233b4ef22e4SSzymon Dompke DISABLED_settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds) 234b4ef22e4SSzymon Dompke { 2351cdd7e4fSSzymon Dompke std::vector<object_path> newPropertyVal{ 2361cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "report1", 2371cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "report2", 2381cdd7e4fSSzymon Dompke utils::constants::reportDirPath / "report1"}; 239b4ef22e4SSzymon Dompke 240e6d48874SKrzysztof Grobelny EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0); 241b4ef22e4SSzymon Dompke 2421cdd7e4fSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 2431cdd7e4fSSzymon Dompke Eq(boost::system::errc::invalid_argument)); 2441cdd7e4fSSzymon Dompke } 2451cdd7e4fSSzymon Dompke 2461cdd7e4fSSzymon Dompke TEST_F( 2471cdd7e4fSSzymon Dompke TestTrigger, 2481cdd7e4fSSzymon Dompke DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooManyPrefixes) 2491cdd7e4fSSzymon Dompke { 2501cdd7e4fSSzymon Dompke std::vector<object_path> newPropertyVal{ 2511cdd7e4fSSzymon Dompke object_path("/xyz/openbmc_project/Telemetry/Reports/P1/P2/MyReport")}; 2521cdd7e4fSSzymon Dompke 2531cdd7e4fSSzymon Dompke EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0); 2541cdd7e4fSSzymon Dompke 2551cdd7e4fSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 2561cdd7e4fSSzymon Dompke Eq(boost::system::errc::invalid_argument)); 2571cdd7e4fSSzymon Dompke } 2581cdd7e4fSSzymon Dompke 25932305f14SSzymon Dompke TEST_F( 26032305f14SSzymon Dompke TestTrigger, 26132305f14SSzymon Dompke DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongPrefix) 26232305f14SSzymon Dompke { 26332305f14SSzymon Dompke std::vector<object_path> newPropertyVal{ 26432305f14SSzymon Dompke object_path("/xyz/openbmc_project/Telemetry/Reports/" + 26532305f14SSzymon Dompke utils::string_utils::getTooLongPrefix() + "/MyReport")}; 26632305f14SSzymon Dompke 26732305f14SSzymon Dompke EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0); 26832305f14SSzymon Dompke 26932305f14SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 27032305f14SSzymon Dompke Eq(boost::system::errc::invalid_argument)); 27132305f14SSzymon Dompke } 27232305f14SSzymon Dompke 27332305f14SSzymon Dompke TEST_F( 27432305f14SSzymon Dompke TestTrigger, 27532305f14SSzymon Dompke DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithTooLongId) 27632305f14SSzymon Dompke { 27732305f14SSzymon Dompke std::vector<object_path> newPropertyVal{ 27832305f14SSzymon Dompke object_path("/xyz/openbmc_project/Telemetry/Reports/Prefix/" + 27932305f14SSzymon Dompke utils::string_utils::getTooLongId())}; 28032305f14SSzymon Dompke 28132305f14SSzymon Dompke EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0); 28232305f14SSzymon Dompke 28332305f14SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 28432305f14SSzymon Dompke Eq(boost::system::errc::invalid_argument)); 28532305f14SSzymon Dompke } 28632305f14SSzymon Dompke 2871cdd7e4fSSzymon Dompke TEST_F(TestTrigger, 2881cdd7e4fSSzymon Dompke DISABLED_settingPropertyReportNamesThrowsExceptionWhenReportWithBadPath) 2891cdd7e4fSSzymon Dompke { 2901cdd7e4fSSzymon Dompke std::vector<object_path> newPropertyVal{ 2911cdd7e4fSSzymon Dompke object_path("/xyz/openbmc_project/Telemetry/NotReports/MyReport")}; 2921cdd7e4fSSzymon Dompke 2931cdd7e4fSSzymon Dompke EXPECT_CALL(triggerPresenceChanged, Call(_)).Times(0); 2941cdd7e4fSSzymon Dompke 2951cdd7e4fSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Reports", newPropertyVal), 296b4ef22e4SSzymon Dompke Eq(boost::system::errc::invalid_argument)); 29794f71c51SSzymon Dompke } 29894f71c51SSzymon Dompke 29994f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertySensors) 30094f71c51SSzymon Dompke { 30194f71c51SSzymon Dompke EXPECT_CALL(*triggerFactoryMockPtr, updateSensors(_, _)); 30294f71c51SSzymon Dompke for (const auto& threshold : thresholdMocks) 30394f71c51SSzymon Dompke { 30494f71c51SSzymon Dompke auto thresholdMockPtr = 30594f71c51SSzymon Dompke std::dynamic_pointer_cast<NiceMock<ThresholdMock>>(threshold); 30694f71c51SSzymon Dompke EXPECT_CALL(*thresholdMockPtr, updateSensors(_)); 30794f71c51SSzymon Dompke } 3081cdd7e4fSSzymon Dompke SensorsInfo newSensors( 3091cdd7e4fSSzymon Dompke {std::make_pair(object_path("/abc/def"), "metadata")}); 31094f71c51SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Sensors", newSensors), 31194f71c51SSzymon Dompke Eq(boost::system::errc::success)); 31294f71c51SSzymon Dompke } 31394f71c51SSzymon Dompke 31494f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyThresholds) 31594f71c51SSzymon Dompke { 316b7b7e1b6SSzymon Dompke EXPECT_CALL(*triggerFactoryMockPtr, updateThresholds(_, _, _, _, _, _)); 31794f71c51SSzymon Dompke TriggerThresholdParams newThresholds = 31894f71c51SSzymon Dompke std::vector<discrete::ThresholdParam>( 31994f71c51SSzymon Dompke {std::make_tuple("discrete threshold", "OK", 10, "12.3")}); 32094f71c51SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Thresholds", newThresholds), 32194f71c51SSzymon Dompke Eq(boost::system::errc::success)); 32294f71c51SSzymon Dompke } 32394f71c51SSzymon Dompke 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( 33232305f14SSzymon Dompke utils::string_utils::getTooLongName(), "OK", 10, "12.3")}); 33332305f14SSzymon Dompke 33432305f14SSzymon Dompke changeProperty<TriggerThresholdParams>( 33532305f14SSzymon Dompke sut->getPath(), "Thresholds", 33632305f14SSzymon Dompke {.valueBefore = Eq(currentValue), 33732305f14SSzymon Dompke .newValue = newThresholds, 33832305f14SSzymon Dompke .ec = Eq(boost::system::errc::invalid_argument), 33932305f14SSzymon Dompke .valueAfter = Eq(currentValue)}); 34032305f14SSzymon Dompke } 34132305f14SSzymon Dompke 34232305f14SSzymon Dompke TEST_F(TestTrigger, setNameTooLong) 34332305f14SSzymon Dompke { 34432305f14SSzymon Dompke std::string currentValue = TriggerParams().name(); 34532305f14SSzymon Dompke 34632305f14SSzymon Dompke changeProperty<std::string>( 34732305f14SSzymon Dompke sut->getPath(), "Name", 34832305f14SSzymon Dompke {.valueBefore = Eq(currentValue), 34932305f14SSzymon Dompke .newValue = utils::string_utils::getTooLongName(), 35032305f14SSzymon Dompke .ec = Eq(boost::system::errc::invalid_argument), 35132305f14SSzymon Dompke .valueAfter = Eq(currentValue)}); 35232305f14SSzymon Dompke } 35332305f14SSzymon Dompke 3544416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfNumericCoversionsAreGood) 3554416fce6SCezary Zwolak { 3564416fce6SCezary Zwolak const auto& labeledParamsBase = 3574416fce6SCezary Zwolak std::get<std::vector<numeric::LabeledThresholdParam>>( 3584416fce6SCezary Zwolak triggerParams.thresholdParams()); 3594416fce6SCezary Zwolak const auto paramsToCheck = 3604416fce6SCezary Zwolak std::visit(utils::FromLabeledThresholdParamConversion(), 3614416fce6SCezary Zwolak triggerParams.thresholdParams()); 3624416fce6SCezary Zwolak const auto labeledParamsToCheck = 3634416fce6SCezary Zwolak std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit( 3644416fce6SCezary Zwolak utils::ToLabeledThresholdParamConversion(), paramsToCheck)); 3654416fce6SCezary Zwolak 3664416fce6SCezary Zwolak for (const auto& [tocheck, base] : 3674416fce6SCezary Zwolak boost::combine(labeledParamsToCheck, labeledParamsBase)) 3684416fce6SCezary Zwolak { 3694416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(), 3704416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::Type>())); 3714416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(), 3724416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::Direction>())); 3734416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(), 3744416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::DwellTime>())); 3754416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(), 3764416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::ThresholdValue>())); 3774416fce6SCezary Zwolak } 3784416fce6SCezary Zwolak } 3794416fce6SCezary Zwolak 3804416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood) 3814416fce6SCezary Zwolak { 3824416fce6SCezary Zwolak const auto& labeledParamsBase = 3834416fce6SCezary Zwolak std::get<std::vector<discrete::LabeledThresholdParam>>( 3844416fce6SCezary Zwolak triggerDiscreteParams.thresholdParams()); 3854416fce6SCezary Zwolak const auto paramsToCheck = 3864416fce6SCezary Zwolak std::visit(utils::FromLabeledThresholdParamConversion(), 3874416fce6SCezary Zwolak triggerDiscreteParams.thresholdParams()); 3884416fce6SCezary Zwolak const auto labeledParamsToCheck = 3894416fce6SCezary Zwolak std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit( 3904416fce6SCezary Zwolak utils::ToLabeledThresholdParamConversion(), paramsToCheck)); 3914416fce6SCezary Zwolak 3924416fce6SCezary Zwolak for (const auto& [tocheck, base] : 3934416fce6SCezary Zwolak boost::combine(labeledParamsToCheck, labeledParamsBase)) 3944416fce6SCezary Zwolak { 3954416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(), 3964416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::UserId>())); 3974416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(), 3984416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::Severity>())); 3994416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(), 4004416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::DwellTime>())); 4014416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(), 4024416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::ThresholdValue>())); 4034416fce6SCezary Zwolak } 40476833cb5SWludzik, Jozef } 40576833cb5SWludzik, Jozef 40676833cb5SWludzik, Jozef TEST_F(TestTrigger, deleteTrigger) 40776833cb5SWludzik, Jozef { 408e28aa53dSSzymon Dompke EXPECT_CALL(storageMock, remove(to_file_path(sut->getId()))); 40976833cb5SWludzik, Jozef EXPECT_CALL(*triggerManagerMockPtr, removeTrigger(sut.get())); 410e6d48874SKrzysztof Grobelny 411e6d48874SKrzysztof Grobelny auto ec = deleteTrigger(sut->getPath()); 412e6d48874SKrzysztof Grobelny EXPECT_THAT(ec, Eq(boost::system::errc::success)); 413b4ef22e4SSzymon Dompke } 414e6d48874SKrzysztof Grobelny 415e6d48874SKrzysztof Grobelny TEST_F(TestTrigger, sendUpdateWhenTriggerIsDeleted) 416e6d48874SKrzysztof Grobelny { 417e6d48874SKrzysztof Grobelny EXPECT_CALL(triggerPresenceChanged, 418e6d48874SKrzysztof Grobelny Call(FieldsAre(messages::Presence::Removed, triggerParams.id(), 419e6d48874SKrzysztof Grobelny UnorderedElementsAre()))); 420e6d48874SKrzysztof Grobelny 42176833cb5SWludzik, Jozef auto ec = deleteTrigger(sut->getPath()); 42276833cb5SWludzik, Jozef EXPECT_THAT(ec, Eq(boost::system::errc::success)); 42376833cb5SWludzik, Jozef } 42476833cb5SWludzik, Jozef 42576833cb5SWludzik, Jozef TEST_F(TestTrigger, deletingNonExistingTriggerReturnInvalidRequestDescriptor) 42676833cb5SWludzik, Jozef { 4271cdd7e4fSSzymon Dompke auto ec = 4281cdd7e4fSSzymon Dompke deleteTrigger(utils::constants::triggerDirPath.str + "NonExisting"s); 42976833cb5SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(EBADR)); 43076833cb5SWludzik, Jozef } 431a4e67616SCezary Zwolak 4324416fce6SCezary Zwolak TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage) 433a4e67616SCezary Zwolak { 434e28aa53dSSzymon Dompke EXPECT_CALL(storageMock, remove(to_file_path(sut->getId()))); 435a4e67616SCezary Zwolak 436a4e67616SCezary Zwolak bool persistent = false; 4374416fce6SCezary Zwolak EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent), 438a4e67616SCezary Zwolak Eq(boost::system::errc::success)); 439a4e67616SCezary Zwolak EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), 440a4e67616SCezary Zwolak Eq(persistent)); 441a4e67616SCezary Zwolak } 442a4e67616SCezary Zwolak 443b4ef22e4SSzymon Dompke class TestTriggerInitialization : public TestTrigger 444a4e67616SCezary Zwolak { 445a4e67616SCezary Zwolak public: 446*3a1c297aSPatrick Williams void SetUp() override {} 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