176833cb5SWludzik, Jozef #include "dbus_environment.hpp" 276833cb5SWludzik, Jozef #include "helpers.hpp" 3a4e67616SCezary Zwolak #include "mocks/json_storage_mock.hpp" 4*b4ef22e4SSzymon Dompke #include "mocks/report_manager_mock.hpp" 594f71c51SSzymon Dompke #include "mocks/sensor_mock.hpp" 694f71c51SSzymon Dompke #include "mocks/threshold_mock.hpp" 794f71c51SSzymon Dompke #include "mocks/trigger_factory_mock.hpp" 876833cb5SWludzik, Jozef #include "mocks/trigger_manager_mock.hpp" 976833cb5SWludzik, Jozef #include "params/trigger_params.hpp" 1076833cb5SWludzik, Jozef #include "trigger.hpp" 11e28aa53dSSzymon Dompke #include "trigger_manager.hpp" 124416fce6SCezary Zwolak #include "utils/conversion_trigger.hpp" 134416fce6SCezary Zwolak #include "utils/transform.hpp" 144416fce6SCezary Zwolak #include "utils/tstring.hpp" 154416fce6SCezary Zwolak 164416fce6SCezary Zwolak #include <boost/range/combine.hpp> 1776833cb5SWludzik, Jozef 1876833cb5SWludzik, Jozef using namespace testing; 1976833cb5SWludzik, Jozef using namespace std::literals::string_literals; 2076833cb5SWludzik, Jozef 2194f71c51SSzymon Dompke static constexpr size_t expectedTriggerVersion = 1; 22a4e67616SCezary Zwolak 2376833cb5SWludzik, Jozef class TestTrigger : public Test 2476833cb5SWludzik, Jozef { 2576833cb5SWludzik, Jozef public: 2676833cb5SWludzik, Jozef TriggerParams triggerParams; 274416fce6SCezary Zwolak TriggerParams triggerDiscreteParams = 284416fce6SCezary Zwolak TriggerParams() 29e28aa53dSSzymon Dompke .id("DiscreteTrigger") 30e28aa53dSSzymon Dompke .name("My Discrete Trigger") 314416fce6SCezary Zwolak .thresholdParams(std::vector<discrete::LabeledThresholdParam>{ 324416fce6SCezary Zwolak discrete::LabeledThresholdParam{ 334416fce6SCezary Zwolak "userId", discrete::Severity::warning, 34dcc4e193SKrzysztof Grobelny Milliseconds(10).count(), "15.2"}, 354416fce6SCezary Zwolak discrete::LabeledThresholdParam{ 364416fce6SCezary Zwolak "userId_2", discrete::Severity::critical, 37dcc4e193SKrzysztof Grobelny Milliseconds(5).count(), "32.7"}, 384416fce6SCezary Zwolak }); 3976833cb5SWludzik, Jozef 40*b4ef22e4SSzymon Dompke std::unique_ptr<ReportManagerMock> reportManagerMockPtr = 41*b4ef22e4SSzymon Dompke std::make_unique<NiceMock<ReportManagerMock>>(); 4276833cb5SWludzik, Jozef std::unique_ptr<TriggerManagerMock> triggerManagerMockPtr = 4376833cb5SWludzik, Jozef std::make_unique<NiceMock<TriggerManagerMock>>(); 4494f71c51SSzymon Dompke std::unique_ptr<TriggerFactoryMock> triggerFactoryMockPtr = 4594f71c51SSzymon Dompke std::make_unique<NiceMock<TriggerFactoryMock>>(); 46a4e67616SCezary Zwolak testing::NiceMock<StorageMock> storageMock; 4794f71c51SSzymon Dompke std::vector<std::shared_ptr<interfaces::Threshold>> thresholdMocks; 4876833cb5SWludzik, Jozef std::unique_ptr<Trigger> sut; 4976833cb5SWludzik, Jozef 5076833cb5SWludzik, Jozef void SetUp() override 5176833cb5SWludzik, Jozef { 52a4e67616SCezary Zwolak sut = makeTrigger(triggerParams); 53a4e67616SCezary Zwolak } 54a4e67616SCezary Zwolak 554416fce6SCezary Zwolak static std::vector<LabeledSensorInfo> 564416fce6SCezary Zwolak convertToLabeledSensor(const SensorsInfo& sensorsInfo) 574416fce6SCezary Zwolak { 584416fce6SCezary Zwolak return utils::transform(sensorsInfo, [](const auto& sensorInfo) { 594416fce6SCezary Zwolak const auto& [sensorPath, sensorMetadata] = sensorInfo; 604416fce6SCezary Zwolak return LabeledSensorInfo("service1", sensorPath, sensorMetadata); 614416fce6SCezary Zwolak }); 624416fce6SCezary Zwolak } 634416fce6SCezary Zwolak 64a4e67616SCezary Zwolak std::unique_ptr<Trigger> makeTrigger(const TriggerParams& params) 65a4e67616SCezary Zwolak { 6694f71c51SSzymon Dompke thresholdMocks = 6794f71c51SSzymon Dompke ThresholdMock::makeThresholds(params.thresholdParams()); 6894f71c51SSzymon Dompke 69a4e67616SCezary Zwolak return std::make_unique<Trigger>( 7076833cb5SWludzik, Jozef DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(), 71e28aa53dSSzymon Dompke params.id(), params.name(), params.triggerActions(), 7294f71c51SSzymon Dompke std::make_shared<std::vector<std::string>>( 7394f71c51SSzymon Dompke params.reportIds().begin(), params.reportIds().end()), 7494f71c51SSzymon Dompke std::vector<std::shared_ptr<interfaces::Threshold>>(thresholdMocks), 7594f71c51SSzymon Dompke *triggerManagerMockPtr, storageMock, *triggerFactoryMockPtr, 76*b4ef22e4SSzymon Dompke SensorMock::makeSensorMocks(params.sensors()), 77*b4ef22e4SSzymon Dompke *reportManagerMockPtr); 78a4e67616SCezary Zwolak } 79a4e67616SCezary Zwolak 80a4e67616SCezary Zwolak static interfaces::JsonStorage::FilePath to_file_path(std::string name) 81a4e67616SCezary Zwolak { 82a4e67616SCezary Zwolak return interfaces::JsonStorage::FilePath( 83a4e67616SCezary Zwolak std::to_string(std::hash<std::string>{}(name))); 8476833cb5SWludzik, Jozef } 8576833cb5SWludzik, Jozef 8676833cb5SWludzik, Jozef template <class T> 8776833cb5SWludzik, Jozef static T getProperty(const std::string& path, const std::string& property) 8876833cb5SWludzik, Jozef { 89e28aa53dSSzymon Dompke return DbusEnvironment::getProperty<T>(path, Trigger::triggerIfaceName, 90e28aa53dSSzymon Dompke property); 9176833cb5SWludzik, Jozef } 9276833cb5SWludzik, Jozef 93a4e67616SCezary Zwolak template <class T> 94a4e67616SCezary Zwolak static boost::system::error_code setProperty(const std::string& path, 95a4e67616SCezary Zwolak const std::string& property, 96a4e67616SCezary Zwolak const T& newValue) 97a4e67616SCezary Zwolak { 98e28aa53dSSzymon Dompke return DbusEnvironment::setProperty<T>(path, Trigger::triggerIfaceName, 99e28aa53dSSzymon Dompke property, newValue); 100a4e67616SCezary Zwolak } 101a4e67616SCezary Zwolak 10276833cb5SWludzik, Jozef boost::system::error_code deleteTrigger(const std::string& path) 10376833cb5SWludzik, Jozef { 10476833cb5SWludzik, Jozef std::promise<boost::system::error_code> methodPromise; 10576833cb5SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 10676833cb5SWludzik, Jozef [&methodPromise](boost::system::error_code ec) { 10776833cb5SWludzik, Jozef methodPromise.set_value(ec); 10876833cb5SWludzik, Jozef }, 10976833cb5SWludzik, Jozef DbusEnvironment::serviceName(), path, Trigger::deleteIfaceName, 11076833cb5SWludzik, Jozef "Delete"); 11176833cb5SWludzik, Jozef return DbusEnvironment::waitForFuture(methodPromise.get_future()); 11276833cb5SWludzik, Jozef } 11376833cb5SWludzik, Jozef }; 11476833cb5SWludzik, Jozef 11576833cb5SWludzik, Jozef TEST_F(TestTrigger, checkIfPropertiesAreSet) 11676833cb5SWludzik, Jozef { 117e28aa53dSSzymon Dompke EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"), 118e28aa53dSSzymon Dompke Eq(triggerParams.name())); 119a4e67616SCezary Zwolak EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(true)); 1202001301aSSzymon Dompke EXPECT_THAT( 1212001301aSSzymon Dompke getProperty<std::vector<std::string>>(sut->getPath(), "TriggerActions"), 12294f71c51SSzymon Dompke Eq(utils::transform( 12394f71c51SSzymon Dompke triggerParams.triggerActions(), 12494f71c51SSzymon Dompke [](const auto& action) { return actionToString(action); }))); 1254416fce6SCezary Zwolak EXPECT_THAT((getProperty<SensorsInfo>(sut->getPath(), "Sensors")), 1264416fce6SCezary Zwolak Eq(utils::fromLabeledSensorsInfo(triggerParams.sensors()))); 12776833cb5SWludzik, Jozef EXPECT_THAT( 12876833cb5SWludzik, Jozef getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"), 129b8cc78ddSKrzysztof Grobelny Eq(triggerParams.reportIds())); 13076833cb5SWludzik, Jozef EXPECT_THAT( 13194f71c51SSzymon Dompke getProperty<bool>(sut->getPath(), "Discrete"), 13294f71c51SSzymon Dompke Eq(isTriggerThresholdDiscrete(triggerParams.thresholdParams()))); 13394f71c51SSzymon Dompke EXPECT_THAT( 13476833cb5SWludzik, Jozef getProperty<TriggerThresholdParams>(sut->getPath(), "Thresholds"), 1354416fce6SCezary Zwolak Eq(std::visit(utils::FromLabeledThresholdParamConversion(), 1364416fce6SCezary Zwolak triggerParams.thresholdParams()))); 1374416fce6SCezary Zwolak } 1384416fce6SCezary Zwolak 139*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, checkBasicGetters) 140*b4ef22e4SSzymon Dompke { 141*b4ef22e4SSzymon Dompke EXPECT_THAT(sut->getId(), Eq(triggerParams.id())); 142*b4ef22e4SSzymon Dompke EXPECT_THAT(sut->getPath(), Eq(Trigger::triggerDir + triggerParams.id())); 143*b4ef22e4SSzymon Dompke EXPECT_THAT(sut->getReportIds(), Eq(triggerParams.reportIds())); 144*b4ef22e4SSzymon Dompke } 145*b4ef22e4SSzymon Dompke 146e28aa53dSSzymon Dompke TEST_F(TestTrigger, setPropertyNameToCorrectValue) 147e28aa53dSSzymon Dompke { 148e28aa53dSSzymon Dompke std::string name = "custom name 1234 %^#5"; 149e28aa53dSSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Name", name), 150e28aa53dSSzymon Dompke Eq(boost::system::errc::success)); 151e28aa53dSSzymon Dompke EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"), Eq(name)); 152e28aa53dSSzymon Dompke } 153e28aa53dSSzymon Dompke 15494f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyReportNames) 15594f71c51SSzymon Dompke { 15694f71c51SSzymon Dompke std::vector<std::string> newNames = {"abc", "one", "two"}; 15794f71c51SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newNames), 15894f71c51SSzymon Dompke Eq(boost::system::errc::success)); 15994f71c51SSzymon Dompke EXPECT_THAT( 16094f71c51SSzymon Dompke getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"), 16194f71c51SSzymon Dompke Eq(newNames)); 162*b4ef22e4SSzymon Dompke EXPECT_THAT( 163*b4ef22e4SSzymon Dompke getProperty<std::vector<std::string>>(sut->getPath(), "ReportNames"), 164*b4ef22e4SSzymon Dompke Eq(sut->getReportIds())); 165*b4ef22e4SSzymon Dompke } 166*b4ef22e4SSzymon Dompke 167*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, settingPropertyReportNamesUptadesTriggerIdsInReports) 168*b4ef22e4SSzymon Dompke { 169*b4ef22e4SSzymon Dompke std::vector<std::string> newPropertyVal = {"abc", "one", "two"}; 170*b4ef22e4SSzymon Dompke 171*b4ef22e4SSzymon Dompke for (const auto& reportId : newPropertyVal) 172*b4ef22e4SSzymon Dompke { 173*b4ef22e4SSzymon Dompke EXPECT_CALL( 174*b4ef22e4SSzymon Dompke *reportManagerMockPtr, 175*b4ef22e4SSzymon Dompke updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Add)); 176*b4ef22e4SSzymon Dompke } 177*b4ef22e4SSzymon Dompke for (const auto& reportId : triggerParams.reportIds()) 178*b4ef22e4SSzymon Dompke { 179*b4ef22e4SSzymon Dompke EXPECT_CALL( 180*b4ef22e4SSzymon Dompke *reportManagerMockPtr, 181*b4ef22e4SSzymon Dompke updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Remove)); 182*b4ef22e4SSzymon Dompke } 183*b4ef22e4SSzymon Dompke 184*b4ef22e4SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal), 185*b4ef22e4SSzymon Dompke Eq(boost::system::errc::success)); 186*b4ef22e4SSzymon Dompke } 187*b4ef22e4SSzymon Dompke 188*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, settingPropertyReportNamesWillNotRemoveTriggerIdsInReports) 189*b4ef22e4SSzymon Dompke { 190*b4ef22e4SSzymon Dompke std::vector<std::string> newPropertyVal = triggerParams.reportIds(); 191*b4ef22e4SSzymon Dompke std::vector<std::string> newNames{"abc", "one", "two"}; 192*b4ef22e4SSzymon Dompke newPropertyVal.insert(newPropertyVal.end(), newNames.begin(), 193*b4ef22e4SSzymon Dompke newNames.end()); 194*b4ef22e4SSzymon Dompke 195*b4ef22e4SSzymon Dompke for (const auto& reportId : newNames) 196*b4ef22e4SSzymon Dompke { 197*b4ef22e4SSzymon Dompke EXPECT_CALL( 198*b4ef22e4SSzymon Dompke *reportManagerMockPtr, 199*b4ef22e4SSzymon Dompke updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Add)); 200*b4ef22e4SSzymon Dompke } 201*b4ef22e4SSzymon Dompke 202*b4ef22e4SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal), 203*b4ef22e4SSzymon Dompke Eq(boost::system::errc::success)); 204*b4ef22e4SSzymon Dompke } 205*b4ef22e4SSzymon Dompke 206*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, 207*b4ef22e4SSzymon Dompke settingPropertyReportNamesToSameValueWillNotUpdateTriggerIdsInReports) 208*b4ef22e4SSzymon Dompke { 209*b4ef22e4SSzymon Dompke std::vector<std::string> newPropertyVal = triggerParams.reportIds(); 210*b4ef22e4SSzymon Dompke 211*b4ef22e4SSzymon Dompke EXPECT_CALL(*reportManagerMockPtr, updateTriggerIds(_, _, _)).Times(0); 212*b4ef22e4SSzymon Dompke 213*b4ef22e4SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal), 214*b4ef22e4SSzymon Dompke Eq(boost::system::errc::success)); 215*b4ef22e4SSzymon Dompke } 216*b4ef22e4SSzymon Dompke 217*b4ef22e4SSzymon Dompke TEST_F(TestTrigger, 218*b4ef22e4SSzymon Dompke DISABLED_settingPropertyReportNamesThrowsExceptionWhenDuplicateReportIds) 219*b4ef22e4SSzymon Dompke { 220*b4ef22e4SSzymon Dompke std::vector<std::string> newPropertyVal{"trigger1", "trigger2", "trigger1"}; 221*b4ef22e4SSzymon Dompke 222*b4ef22e4SSzymon Dompke EXPECT_CALL(*reportManagerMockPtr, updateTriggerIds(_, _, _)).Times(0); 223*b4ef22e4SSzymon Dompke 224*b4ef22e4SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "ReportNames", newPropertyVal), 225*b4ef22e4SSzymon Dompke Eq(boost::system::errc::invalid_argument)); 22694f71c51SSzymon Dompke } 22794f71c51SSzymon Dompke 22894f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertySensors) 22994f71c51SSzymon Dompke { 23094f71c51SSzymon Dompke EXPECT_CALL(*triggerFactoryMockPtr, updateSensors(_, _)); 23194f71c51SSzymon Dompke for (const auto& threshold : thresholdMocks) 23294f71c51SSzymon Dompke { 23394f71c51SSzymon Dompke auto thresholdMockPtr = 23494f71c51SSzymon Dompke std::dynamic_pointer_cast<NiceMock<ThresholdMock>>(threshold); 23594f71c51SSzymon Dompke EXPECT_CALL(*thresholdMockPtr, updateSensors(_)); 23694f71c51SSzymon Dompke } 23794f71c51SSzymon Dompke SensorsInfo newSensors({std::make_pair( 23894f71c51SSzymon Dompke sdbusplus::message::object_path("/abc/def"), "metadata")}); 23994f71c51SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Sensors", newSensors), 24094f71c51SSzymon Dompke Eq(boost::system::errc::success)); 24194f71c51SSzymon Dompke } 24294f71c51SSzymon Dompke 24394f71c51SSzymon Dompke TEST_F(TestTrigger, setPropertyThresholds) 24494f71c51SSzymon Dompke { 24594f71c51SSzymon Dompke EXPECT_CALL(*triggerFactoryMockPtr, updateThresholds(_, _, _, _, _)); 24694f71c51SSzymon Dompke TriggerThresholdParams newThresholds = 24794f71c51SSzymon Dompke std::vector<discrete::ThresholdParam>( 24894f71c51SSzymon Dompke {std::make_tuple("discrete threshold", "OK", 10, "12.3")}); 24994f71c51SSzymon Dompke EXPECT_THAT(setProperty(sut->getPath(), "Thresholds", newThresholds), 25094f71c51SSzymon Dompke Eq(boost::system::errc::success)); 25194f71c51SSzymon Dompke } 25294f71c51SSzymon Dompke 2534416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfNumericCoversionsAreGood) 2544416fce6SCezary Zwolak { 2554416fce6SCezary Zwolak const auto& labeledParamsBase = 2564416fce6SCezary Zwolak std::get<std::vector<numeric::LabeledThresholdParam>>( 2574416fce6SCezary Zwolak triggerParams.thresholdParams()); 2584416fce6SCezary Zwolak const auto paramsToCheck = 2594416fce6SCezary Zwolak std::visit(utils::FromLabeledThresholdParamConversion(), 2604416fce6SCezary Zwolak triggerParams.thresholdParams()); 2614416fce6SCezary Zwolak const auto labeledParamsToCheck = 2624416fce6SCezary Zwolak std::get<std::vector<numeric::LabeledThresholdParam>>(std::visit( 2634416fce6SCezary Zwolak utils::ToLabeledThresholdParamConversion(), paramsToCheck)); 2644416fce6SCezary Zwolak 2654416fce6SCezary Zwolak for (const auto& [tocheck, base] : 2664416fce6SCezary Zwolak boost::combine(labeledParamsToCheck, labeledParamsBase)) 2674416fce6SCezary Zwolak { 2684416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::Type>(), 2694416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::Type>())); 2704416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::Direction>(), 2714416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::Direction>())); 2724416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(), 2734416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::DwellTime>())); 2744416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(), 2754416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::ThresholdValue>())); 2764416fce6SCezary Zwolak } 2774416fce6SCezary Zwolak } 2784416fce6SCezary Zwolak 2794416fce6SCezary Zwolak TEST_F(TestTrigger, checkIfDiscreteCoversionsAreGood) 2804416fce6SCezary Zwolak { 2814416fce6SCezary Zwolak const auto& labeledParamsBase = 2824416fce6SCezary Zwolak std::get<std::vector<discrete::LabeledThresholdParam>>( 2834416fce6SCezary Zwolak triggerDiscreteParams.thresholdParams()); 2844416fce6SCezary Zwolak const auto paramsToCheck = 2854416fce6SCezary Zwolak std::visit(utils::FromLabeledThresholdParamConversion(), 2864416fce6SCezary Zwolak triggerDiscreteParams.thresholdParams()); 2874416fce6SCezary Zwolak const auto labeledParamsToCheck = 2884416fce6SCezary Zwolak std::get<std::vector<discrete::LabeledThresholdParam>>(std::visit( 2894416fce6SCezary Zwolak utils::ToLabeledThresholdParamConversion(), paramsToCheck)); 2904416fce6SCezary Zwolak 2914416fce6SCezary Zwolak for (const auto& [tocheck, base] : 2924416fce6SCezary Zwolak boost::combine(labeledParamsToCheck, labeledParamsBase)) 2934416fce6SCezary Zwolak { 2944416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::UserId>(), 2954416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::UserId>())); 2964416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::Severity>(), 2974416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::Severity>())); 2984416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::DwellTime>(), 2994416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::DwellTime>())); 3004416fce6SCezary Zwolak EXPECT_THAT(tocheck.at_label<utils::tstring::ThresholdValue>(), 3014416fce6SCezary Zwolak Eq(base.at_label<utils::tstring::ThresholdValue>())); 3024416fce6SCezary Zwolak } 30376833cb5SWludzik, Jozef } 30476833cb5SWludzik, Jozef 30576833cb5SWludzik, Jozef TEST_F(TestTrigger, deleteTrigger) 30676833cb5SWludzik, Jozef { 307e28aa53dSSzymon Dompke EXPECT_CALL(storageMock, remove(to_file_path(sut->getId()))); 30876833cb5SWludzik, Jozef EXPECT_CALL(*triggerManagerMockPtr, removeTrigger(sut.get())); 309*b4ef22e4SSzymon Dompke for (const auto& reportId : triggerParams.reportIds()) 310*b4ef22e4SSzymon Dompke { 311*b4ef22e4SSzymon Dompke EXPECT_CALL( 312*b4ef22e4SSzymon Dompke *reportManagerMockPtr, 313*b4ef22e4SSzymon Dompke updateTriggerIds(reportId, sut->getId(), TriggerIdUpdate::Remove)); 314*b4ef22e4SSzymon Dompke } 31576833cb5SWludzik, Jozef auto ec = deleteTrigger(sut->getPath()); 31676833cb5SWludzik, Jozef EXPECT_THAT(ec, Eq(boost::system::errc::success)); 31776833cb5SWludzik, Jozef } 31876833cb5SWludzik, Jozef 31976833cb5SWludzik, Jozef TEST_F(TestTrigger, deletingNonExistingTriggerReturnInvalidRequestDescriptor) 32076833cb5SWludzik, Jozef { 32176833cb5SWludzik, Jozef auto ec = deleteTrigger(Trigger::triggerDir + "NonExisting"s); 32276833cb5SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(EBADR)); 32376833cb5SWludzik, Jozef } 324a4e67616SCezary Zwolak 3254416fce6SCezary Zwolak TEST_F(TestTrigger, settingPersistencyToFalseRemovesTriggerFromStorage) 326a4e67616SCezary Zwolak { 327e28aa53dSSzymon Dompke EXPECT_CALL(storageMock, remove(to_file_path(sut->getId()))); 328a4e67616SCezary Zwolak 329a4e67616SCezary Zwolak bool persistent = false; 3304416fce6SCezary Zwolak EXPECT_THAT(setProperty(sut->getPath(), "Persistent", persistent), 331a4e67616SCezary Zwolak Eq(boost::system::errc::success)); 332a4e67616SCezary Zwolak EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), 333a4e67616SCezary Zwolak Eq(persistent)); 334a4e67616SCezary Zwolak } 335a4e67616SCezary Zwolak 336*b4ef22e4SSzymon Dompke class TestTriggerInitialization : public TestTrigger 337a4e67616SCezary Zwolak { 338a4e67616SCezary Zwolak public: 339a4e67616SCezary Zwolak void SetUp() override 340a4e67616SCezary Zwolak {} 341a4e67616SCezary Zwolak 342a4e67616SCezary Zwolak nlohmann::json storedConfiguration; 343a4e67616SCezary Zwolak }; 344a4e67616SCezary Zwolak 345*b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, 346*b4ef22e4SSzymon Dompke exceptionDuringTriggerStoreDisablesPersistency) 347a4e67616SCezary Zwolak { 348a4e67616SCezary Zwolak EXPECT_CALL(storageMock, store(_, _)) 349a4e67616SCezary Zwolak .WillOnce(Throw(std::runtime_error("Generic error!"))); 350a4e67616SCezary Zwolak 351a4e67616SCezary Zwolak sut = makeTrigger(triggerParams); 352a4e67616SCezary Zwolak 353a4e67616SCezary Zwolak EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistent"), Eq(false)); 354a4e67616SCezary Zwolak } 355a4e67616SCezary Zwolak 356*b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerThrowsExceptionWhenIdIsInvalid) 357a4e67616SCezary Zwolak { 358a4e67616SCezary Zwolak EXPECT_CALL(storageMock, store(_, _)).Times(0); 359a4e67616SCezary Zwolak 360e28aa53dSSzymon Dompke EXPECT_THROW(makeTrigger(triggerParams.id("inv?lidId")), 361a4e67616SCezary Zwolak sdbusplus::exception::SdBusError); 362a4e67616SCezary Zwolak } 363a4e67616SCezary Zwolak 364*b4ef22e4SSzymon Dompke TEST_F(TestTriggerInitialization, creatingTriggerUpdatesTriggersIdsInReports) 365*b4ef22e4SSzymon Dompke { 366*b4ef22e4SSzymon Dompke for (const auto& reportId : triggerParams.reportIds()) 367*b4ef22e4SSzymon Dompke { 368*b4ef22e4SSzymon Dompke EXPECT_CALL(*reportManagerMockPtr, 369*b4ef22e4SSzymon Dompke updateTriggerIds(reportId, triggerParams.id(), 370*b4ef22e4SSzymon Dompke TriggerIdUpdate::Add)); 371*b4ef22e4SSzymon Dompke } 372*b4ef22e4SSzymon Dompke 373*b4ef22e4SSzymon Dompke sut = makeTrigger(triggerParams); 374*b4ef22e4SSzymon Dompke } 375*b4ef22e4SSzymon Dompke 376a4e67616SCezary Zwolak class TestTriggerStore : public TestTrigger 377a4e67616SCezary Zwolak { 378a4e67616SCezary Zwolak public: 3794416fce6SCezary Zwolak nlohmann::json storedConfiguration; 3804416fce6SCezary Zwolak nlohmann::json storedDiscreteConfiguration; 3814416fce6SCezary Zwolak std::unique_ptr<Trigger> sutDiscrete; 3824416fce6SCezary Zwolak 383a4e67616SCezary Zwolak void SetUp() override 384a4e67616SCezary Zwolak { 385a4e67616SCezary Zwolak ON_CALL(storageMock, store(_, _)) 386a4e67616SCezary Zwolak .WillByDefault(SaveArg<1>(&storedConfiguration)); 387a4e67616SCezary Zwolak sut = makeTrigger(triggerParams); 388a4e67616SCezary Zwolak 3894416fce6SCezary Zwolak ON_CALL(storageMock, store(_, _)) 3904416fce6SCezary Zwolak .WillByDefault(SaveArg<1>(&storedDiscreteConfiguration)); 3914416fce6SCezary Zwolak sutDiscrete = makeTrigger(triggerDiscreteParams); 3924416fce6SCezary Zwolak } 393a4e67616SCezary Zwolak }; 394a4e67616SCezary Zwolak 395a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerVersion) 396a4e67616SCezary Zwolak { 397a4e67616SCezary Zwolak ASSERT_THAT(storedConfiguration.at("Version"), Eq(expectedTriggerVersion)); 398a4e67616SCezary Zwolak } 399a4e67616SCezary Zwolak 400e28aa53dSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerId) 401e28aa53dSSzymon Dompke { 402e28aa53dSSzymon Dompke ASSERT_THAT(storedConfiguration.at("Id"), Eq(triggerParams.id())); 403e28aa53dSSzymon Dompke } 404e28aa53dSSzymon Dompke 405a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerName) 406a4e67616SCezary Zwolak { 407a4e67616SCezary Zwolak ASSERT_THAT(storedConfiguration.at("Name"), Eq(triggerParams.name())); 408a4e67616SCezary Zwolak } 409a4e67616SCezary Zwolak 4102001301aSSzymon Dompke TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerTriggerActions) 411a4e67616SCezary Zwolak { 4122001301aSSzymon Dompke ASSERT_THAT(storedConfiguration.at("TriggerActions"), 41394f71c51SSzymon Dompke Eq(utils::transform(triggerParams.triggerActions(), 41494f71c51SSzymon Dompke [](const auto& action) { 41594f71c51SSzymon Dompke return actionToString(action); 41694f71c51SSzymon Dompke }))); 417a4e67616SCezary Zwolak } 418a4e67616SCezary Zwolak 419b8cc78ddSKrzysztof Grobelny TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerReportIds) 420a4e67616SCezary Zwolak { 421b8cc78ddSKrzysztof Grobelny ASSERT_THAT(storedConfiguration.at("ReportIds"), 422b8cc78ddSKrzysztof Grobelny Eq(triggerParams.reportIds())); 423a4e67616SCezary Zwolak } 424a4e67616SCezary Zwolak 425a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerSensors) 426a4e67616SCezary Zwolak { 427a4e67616SCezary Zwolak nlohmann::json expectedItem; 4284416fce6SCezary Zwolak expectedItem["service"] = "service1"; 42994f71c51SSzymon Dompke expectedItem["path"] = "/xyz/openbmc_project/sensors/temperature/BMC_Temp"; 430b8cc78ddSKrzysztof Grobelny expectedItem["metadata"] = "metadata1"; 431a4e67616SCezary Zwolak 432a4e67616SCezary Zwolak ASSERT_THAT(storedConfiguration.at("Sensors"), ElementsAre(expectedItem)); 433a4e67616SCezary Zwolak } 434a4e67616SCezary Zwolak 435a4e67616SCezary Zwolak TEST_F(TestTriggerStore, settingPersistencyToTrueStoresTriggerThresholdParams) 436a4e67616SCezary Zwolak { 437a4e67616SCezary Zwolak nlohmann::json expectedItem0; 438a4e67616SCezary Zwolak expectedItem0["type"] = 0; 439a4e67616SCezary Zwolak expectedItem0["dwellTime"] = 10; 440a4e67616SCezary Zwolak expectedItem0["direction"] = 1; 4414416fce6SCezary Zwolak expectedItem0["thresholdValue"] = 0.5; 442a4e67616SCezary Zwolak 443a4e67616SCezary Zwolak nlohmann::json expectedItem1; 444a4e67616SCezary Zwolak expectedItem1["type"] = 3; 445a4e67616SCezary Zwolak expectedItem1["dwellTime"] = 10; 446a4e67616SCezary Zwolak expectedItem1["direction"] = 2; 4474416fce6SCezary Zwolak expectedItem1["thresholdValue"] = 90.2; 448a4e67616SCezary Zwolak 4494416fce6SCezary Zwolak ASSERT_THAT(storedConfiguration.at("ThresholdParamsDiscriminator"), Eq(0)); 450a4e67616SCezary Zwolak ASSERT_THAT(storedConfiguration.at("ThresholdParams"), 451a4e67616SCezary Zwolak ElementsAre(expectedItem0, expectedItem1)); 452a4e67616SCezary Zwolak } 4534416fce6SCezary Zwolak 4544416fce6SCezary Zwolak TEST_F(TestTriggerStore, 4554416fce6SCezary Zwolak settingPersistencyToTrueStoresDiscreteTriggerThresholdParams) 4564416fce6SCezary Zwolak { 4574416fce6SCezary Zwolak nlohmann::json expectedItem0; 4584416fce6SCezary Zwolak expectedItem0["userId"] = "userId"; 4594416fce6SCezary Zwolak expectedItem0["severity"] = discrete::Severity::warning; 4604416fce6SCezary Zwolak expectedItem0["dwellTime"] = 10; 4619f346790SSzymon Dompke expectedItem0["thresholdValue"] = "15.2"; 4624416fce6SCezary Zwolak 4634416fce6SCezary Zwolak nlohmann::json expectedItem1; 4644416fce6SCezary Zwolak expectedItem1["userId"] = "userId_2"; 4654416fce6SCezary Zwolak expectedItem1["severity"] = discrete::Severity::critical; 4664416fce6SCezary Zwolak expectedItem1["dwellTime"] = 5; 4679f346790SSzymon Dompke expectedItem1["thresholdValue"] = "32.7"; 4684416fce6SCezary Zwolak 4694416fce6SCezary Zwolak ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParamsDiscriminator"), 4704416fce6SCezary Zwolak Eq(1)); 4714416fce6SCezary Zwolak ASSERT_THAT(storedDiscreteConfiguration.at("ThresholdParams"), 4724416fce6SCezary Zwolak ElementsAre(expectedItem0, expectedItem1)); 4734416fce6SCezary Zwolak } 474