12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp" 2d2238194SKrzysztof Grobelny #include "helpers.hpp" 3*b4ef22e4SSzymon Dompke #include "interfaces/trigger_manager.hpp" 4e2362796SWludzik, Jozef #include "mocks/json_storage_mock.hpp" 52f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp" 6*b4ef22e4SSzymon Dompke #include "mocks/trigger_manager_mock.hpp" 7e2362796SWludzik, Jozef #include "params/report_params.hpp" 8e2362796SWludzik, Jozef #include "report.hpp" 92f9f9b87SWludzik, Jozef #include "report_manager.hpp" 10e8fc5751SKrzysztof Grobelny #include "utils/conversion.hpp" 11e2362796SWludzik, Jozef #include "utils/transform.hpp" 122f9f9b87SWludzik, Jozef 132f9f9b87SWludzik, Jozef using namespace testing; 14e8fc5751SKrzysztof Grobelny using namespace std::string_literals; 15e2362796SWludzik, Jozef using namespace std::chrono_literals; 162f9f9b87SWludzik, Jozef 172f9f9b87SWludzik, Jozef class TestReportManager : public Test 182f9f9b87SWludzik, Jozef { 192f9f9b87SWludzik, Jozef public: 20e2362796SWludzik, Jozef ReportParams reportParams; 212f9f9b87SWludzik, Jozef 222f9f9b87SWludzik, Jozef std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr = 232f9f9b87SWludzik, Jozef std::make_unique<StrictMock<ReportFactoryMock>>(); 242f9f9b87SWludzik, Jozef ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr; 25e2362796SWludzik, Jozef 26e2362796SWludzik, Jozef std::unique_ptr<StorageMock> storageMockPtr = 27e2362796SWludzik, Jozef std::make_unique<NiceMock<StorageMock>>(); 28e2362796SWludzik, Jozef StorageMock& storageMock = *storageMockPtr; 29e2362796SWludzik, Jozef 30d2238194SKrzysztof Grobelny std::unique_ptr<ReportMock> reportMockPtr = 31b8cc78ddSKrzysztof Grobelny std::make_unique<NiceMock<ReportMock>>(reportParams.reportId()); 32d2238194SKrzysztof Grobelny ReportMock& reportMock = *reportMockPtr; 33d2238194SKrzysztof Grobelny 34*b4ef22e4SSzymon Dompke std::unique_ptr<interfaces::TriggerManager> triggerManagerMockPtr = 35*b4ef22e4SSzymon Dompke std::make_unique<NiceMock<TriggerManagerMock>>(); 36*b4ef22e4SSzymon Dompke 37e2362796SWludzik, Jozef std::unique_ptr<ReportManager> sut; 382f9f9b87SWludzik, Jozef 392f9f9b87SWludzik, Jozef MockFunction<void(std::string)> checkPoint; 402f9f9b87SWludzik, Jozef 41e2362796SWludzik, Jozef void SetUp() override 42e2362796SWludzik, Jozef { 43dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)) 44dcc4e193SKrzysztof Grobelny .Times(AnyNumber()); 45dcc4e193SKrzysztof Grobelny 46*b4ef22e4SSzymon Dompke sut = std::make_unique<ReportManager>( 47*b4ef22e4SSzymon Dompke std::move(reportFactoryMockPtr), std::move(storageMockPtr), 48*b4ef22e4SSzymon Dompke DbusEnvironment::getObjServer(), triggerManagerMockPtr); 49e2362796SWludzik, Jozef } 50e2362796SWludzik, Jozef 512f9f9b87SWludzik, Jozef void TearDown() override 522f9f9b87SWludzik, Jozef { 532f9f9b87SWludzik, Jozef DbusEnvironment::synchronizeIoc(); 542f9f9b87SWludzik, Jozef } 552f9f9b87SWludzik, Jozef 5651497a0cSKrzysztof Grobelny template <class... Args> 5751497a0cSKrzysztof Grobelny requires(sizeof...(Args) > 1) 5851497a0cSKrzysztof Grobelny std::pair<boost::system::error_code, std::string> addReport( 5951497a0cSKrzysztof Grobelny Args&&... args) 602f9f9b87SWludzik, Jozef { 612f9f9b87SWludzik, Jozef std::promise<std::pair<boost::system::error_code, std::string>> 622f9f9b87SWludzik, Jozef addReportPromise; 632f9f9b87SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 642f9f9b87SWludzik, Jozef [&addReportPromise](boost::system::error_code ec, 652f9f9b87SWludzik, Jozef const std::string& path) { 662f9f9b87SWludzik, Jozef addReportPromise.set_value({ec, path}); 672f9f9b87SWludzik, Jozef }, 682f9f9b87SWludzik, Jozef DbusEnvironment::serviceName(), ReportManager::reportManagerPath, 69dcc4e193SKrzysztof Grobelny ReportManager::reportManagerIfaceName, "AddReportFutureVersion", 7051497a0cSKrzysztof Grobelny std::forward<Args>(args)...); 71f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(addReportPromise.get_future()); 722f9f9b87SWludzik, Jozef } 732f9f9b87SWludzik, Jozef 7451497a0cSKrzysztof Grobelny auto addReport(const ReportParams& params) 7551497a0cSKrzysztof Grobelny { 76b8cc78ddSKrzysztof Grobelny return addReport(params.reportId(), params.reportName(), 77b8cc78ddSKrzysztof Grobelny utils::enumToString(params.reportingType()), 78b8cc78ddSKrzysztof Grobelny utils::enumToString(params.reportUpdates()), 79b8cc78ddSKrzysztof Grobelny params.appendLimit(), 80b8cc78ddSKrzysztof Grobelny utils::transform(params.reportActions(), 81b8cc78ddSKrzysztof Grobelny [](const auto v) { 82b8cc78ddSKrzysztof Grobelny return utils::enumToString(v); 83b8cc78ddSKrzysztof Grobelny }), 8451497a0cSKrzysztof Grobelny params.interval().count(), 8551497a0cSKrzysztof Grobelny toReadingParameters(params.metricParameters())); 8651497a0cSKrzysztof Grobelny } 8751497a0cSKrzysztof Grobelny 882f9f9b87SWludzik, Jozef template <class T> 89e28aa53dSSzymon Dompke static T getProperty(const std::string& property) 902f9f9b87SWludzik, Jozef { 91e28aa53dSSzymon Dompke return DbusEnvironment::getProperty<T>( 922f9f9b87SWludzik, Jozef ReportManager::reportManagerPath, 93e28aa53dSSzymon Dompke ReportManager::reportManagerIfaceName, property); 9432859b63SKarol Niczyj } 952f9f9b87SWludzik, Jozef }; 962f9f9b87SWludzik, Jozef 972f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval) 982f9f9b87SWludzik, Jozef { 992f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint64_t>("MinInterval"), 100dcc4e193SKrzysztof Grobelny Eq(ReportManager::minInterval.count())); 1012f9f9b87SWludzik, Jozef } 1022f9f9b87SWludzik, Jozef 1032f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports) 1042f9f9b87SWludzik, Jozef { 105503c1589SWludzik, Jozef EXPECT_THAT(getProperty<size_t>("MaxReports"), 1062f9f9b87SWludzik, Jozef Eq(ReportManager::maxReports)); 1072f9f9b87SWludzik, Jozef } 1082f9f9b87SWludzik, Jozef 1092f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 1102f9f9b87SWludzik, Jozef { 111dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 112dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 1132f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1142f9f9b87SWludzik, Jozef 115e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1162f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1172f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 1182f9f9b87SWludzik, Jozef } 1192f9f9b87SWludzik, Jozef 120b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport) 12132859b63SKarol Niczyj { 122b8cc78ddSKrzysztof Grobelny reportParams.reportId("ReportName"); 123b8cc78ddSKrzysztof Grobelny reportParams.reportName("ReportName"); 124b8cc78ddSKrzysztof Grobelny 125b8cc78ddSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 126b8cc78ddSKrzysztof Grobelny 127b8cc78ddSKrzysztof Grobelny auto [ec, path] = addReport(reportParams.reportId("")); 128b8cc78ddSKrzysztof Grobelny 129b8cc78ddSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 130b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/ReportName")); 131b8cc78ddSKrzysztof Grobelny } 132b8cc78ddSKrzysztof Grobelny 133b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace) 134b8cc78ddSKrzysztof Grobelny { 135b8cc78ddSKrzysztof Grobelny reportParams.reportId("Prefix/ReportName"); 136b8cc78ddSKrzysztof Grobelny reportParams.reportName("ReportName"); 137b8cc78ddSKrzysztof Grobelny 138b8cc78ddSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 139b8cc78ddSKrzysztof Grobelny 140b8cc78ddSKrzysztof Grobelny auto [ec, path] = addReport(reportParams.reportId("Prefix/")); 141b8cc78ddSKrzysztof Grobelny 142b8cc78ddSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 143b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/Prefix/ReportName")); 144b8cc78ddSKrzysztof Grobelny } 145b8cc78ddSKrzysztof Grobelny 146b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId) 147b8cc78ddSKrzysztof Grobelny { 148b8cc78ddSKrzysztof Grobelny std::string reportId(ReportManager::maxReportIdLength, 'z'); 149b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportId); 150dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 15132859b63SKarol Niczyj 15232859b63SKarol Niczyj auto [ec, path] = addReport(reportParams); 15332859b63SKarol Niczyj 15432859b63SKarol Niczyj EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 155b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/"s + reportId)); 15632859b63SKarol Niczyj } 15732859b63SKarol Niczyj 15832859b63SKarol Niczyj TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName) 15932859b63SKarol Niczyj { 160dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 16132859b63SKarol Niczyj .Times(0); 16232859b63SKarol Niczyj 163b8cc78ddSKrzysztof Grobelny reportParams.reportId( 164b8cc78ddSKrzysztof Grobelny std::string(ReportManager::maxReportIdLength + 1, 'z')); 16532859b63SKarol Niczyj 16632859b63SKarol Niczyj auto [ec, path] = addReport(reportParams); 16732859b63SKarol Niczyj 16832859b63SKarol Niczyj EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 16932859b63SKarol Niczyj EXPECT_THAT(path, Eq(std::string())); 17032859b63SKarol Niczyj } 17132859b63SKarol Niczyj 172e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice) 1732f9f9b87SWludzik, Jozef { 174dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 175d2238194SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1762f9f9b87SWludzik, Jozef 177e2362796SWludzik, Jozef addReport(reportParams); 1782f9f9b87SWludzik, Jozef 179e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 18032859b63SKarol Niczyj 1812f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 1822f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1832f9f9b87SWludzik, Jozef } 1842f9f9b87SWludzik, Jozef 185e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval) 1862f9f9b87SWludzik, Jozef { 187dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 188d2238194SKrzysztof Grobelny .Times(0); 1892f9f9b87SWludzik, Jozef 19051497a0cSKrzysztof Grobelny reportParams.reportingType(ReportingType::periodic); 191e2362796SWludzik, Jozef reportParams.interval(reportParams.interval() - 1ms); 1922f9f9b87SWludzik, Jozef 193e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 19432859b63SKarol Niczyj 1952f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 1962f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1972f9f9b87SWludzik, Jozef } 1982f9f9b87SWludzik, Jozef 199bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType) 200bc766b4dSWludzik, Jozef { 201dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 202bc766b4dSWludzik, Jozef .Times(0); 203bc766b4dSWludzik, Jozef 20451497a0cSKrzysztof Grobelny auto [ec, path] = addReport( 20551497a0cSKrzysztof Grobelny reportParams.reportName(), "InvalidReportingType", 20651497a0cSKrzysztof Grobelny utils::transform(reportParams.reportActions(), 20751497a0cSKrzysztof Grobelny [](const auto v) { return utils::enumToString(v); }), 20851497a0cSKrzysztof Grobelny reportParams.interval().count(), 20951497a0cSKrzysztof Grobelny toReadingParameters(reportParams.metricParameters())); 21032859b63SKarol Niczyj 211bc766b4dSWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 212bc766b4dSWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 213bc766b4dSWludzik, Jozef } 214bc766b4dSWludzik, Jozef 215cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, 216cd5b0b7eSAnkita Vilas Gawade DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected) 217bc766b4dSWludzik, Jozef { 218dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 219bc766b4dSWludzik, Jozef .Times(0); 220bc766b4dSWludzik, Jozef 221cd5b0b7eSAnkita Vilas Gawade reportParams.metricParameters( 222cd5b0b7eSAnkita Vilas Gawade std::vector<LabeledMetricParameters>{{LabeledMetricParameters{ 22394f71c51SSzymon Dompke {LabeledSensorInfo{"Service", 224cd5b0b7eSAnkita Vilas Gawade "/xyz/openbmc_project/sensors/power/p1", 225cd5b0b7eSAnkita Vilas Gawade "Metadata1"}}, 226cd5b0b7eSAnkita Vilas Gawade OperationType::single, 227cd5b0b7eSAnkita Vilas Gawade "MetricId1", 228cd5b0b7eSAnkita Vilas Gawade CollectionTimeScope::point, 229cd5b0b7eSAnkita Vilas Gawade CollectionDuration(Milliseconds(0u))}}}); 230cd5b0b7eSAnkita Vilas Gawade 231dcc4e193SKrzysztof Grobelny auto metricParams = reportParams.metricParameters(); 232cd5b0b7eSAnkita Vilas Gawade auto& metricParamsVec = 233cd5b0b7eSAnkita Vilas Gawade metricParams[0].at_label<utils::tstring::SensorPath>(); 234cd5b0b7eSAnkita Vilas Gawade 235cd5b0b7eSAnkita Vilas Gawade for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++) 236bc766b4dSWludzik, Jozef { 23794f71c51SSzymon Dompke metricParamsVec.emplace_back(LabeledSensorInfo{ 238cd5b0b7eSAnkita Vilas Gawade "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"}); 239bc766b4dSWludzik, Jozef } 240cd5b0b7eSAnkita Vilas Gawade 241dcc4e193SKrzysztof Grobelny reportParams.metricParameters(std::move(metricParams)); 242bc766b4dSWludzik, Jozef 243bc766b4dSWludzik, Jozef auto [ec, path] = addReport(reportParams); 24432859b63SKarol Niczyj 245bc766b4dSWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long)); 246bc766b4dSWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 247bc766b4dSWludzik, Jozef } 248bc766b4dSWludzik, Jozef 249cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected) 250cd5b0b7eSAnkita Vilas Gawade { 251cd5b0b7eSAnkita Vilas Gawade reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 252cd5b0b7eSAnkita Vilas Gawade .Times(0); 253cd5b0b7eSAnkita Vilas Gawade 254cd5b0b7eSAnkita Vilas Gawade auto metricParams = std::vector<LabeledMetricParameters>{}; 255cd5b0b7eSAnkita Vilas Gawade 256cd5b0b7eSAnkita Vilas Gawade for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++) 257cd5b0b7eSAnkita Vilas Gawade { 258cd5b0b7eSAnkita Vilas Gawade metricParams.emplace_back( 259cd5b0b7eSAnkita Vilas Gawade LabeledMetricParameters{{}, 260cd5b0b7eSAnkita Vilas Gawade OperationType::single, 261cd5b0b7eSAnkita Vilas Gawade "MetricId1", 262cd5b0b7eSAnkita Vilas Gawade CollectionTimeScope::point, 263cd5b0b7eSAnkita Vilas Gawade CollectionDuration(Milliseconds(0u))}); 264cd5b0b7eSAnkita Vilas Gawade } 265cd5b0b7eSAnkita Vilas Gawade 266cd5b0b7eSAnkita Vilas Gawade reportParams.metricParameters(std::move(metricParams)); 267cd5b0b7eSAnkita Vilas Gawade 268cd5b0b7eSAnkita Vilas Gawade auto [ec, path] = addReport(reportParams); 269cd5b0b7eSAnkita Vilas Gawade 270cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long)); 271cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(path, Eq(std::string())); 272cd5b0b7eSAnkita Vilas Gawade } 273cd5b0b7eSAnkita Vilas Gawade 274cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax) 275cd5b0b7eSAnkita Vilas Gawade { 276cd5b0b7eSAnkita Vilas Gawade reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 277cd5b0b7eSAnkita Vilas Gawade .Times(0); 278cd5b0b7eSAnkita Vilas Gawade 279cd5b0b7eSAnkita Vilas Gawade reportParams.appendLimit(ReportManager::maxAppendLimit + 1); 280cd5b0b7eSAnkita Vilas Gawade 281cd5b0b7eSAnkita Vilas Gawade auto [ec, path] = addReport(reportParams); 282cd5b0b7eSAnkita Vilas Gawade 283cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 284cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(path, Eq(std::string())); 285cd5b0b7eSAnkita Vilas Gawade } 286cd5b0b7eSAnkita Vilas Gawade 287e6c417cfSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed) 288e6c417cfSKrzysztof Grobelny { 289e6c417cfSKrzysztof Grobelny reportParams.appendLimit(std::numeric_limits<uint64_t>::max()); 290e6c417cfSKrzysztof Grobelny 291e6c417cfSKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 292e6c417cfSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 293e6c417cfSKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 294e6c417cfSKrzysztof Grobelny 295e6c417cfSKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 296e6c417cfSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 297e6c417cfSKrzysztof Grobelny EXPECT_THAT(path, Eq(reportMock.getPath())); 298e6c417cfSKrzysztof Grobelny } 299e6c417cfSKrzysztof Grobelny 300e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached) 3012f9f9b87SWludzik, Jozef { 302dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 3032f9f9b87SWludzik, Jozef .Times(ReportManager::maxReports); 3042f9f9b87SWludzik, Jozef 3052f9f9b87SWludzik, Jozef for (size_t i = 0; i < ReportManager::maxReports; i++) 3062f9f9b87SWludzik, Jozef { 307b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportParams.reportName() + std::to_string(i)); 3082f9f9b87SWludzik, Jozef 309e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 3102f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 3112f9f9b87SWludzik, Jozef } 3122f9f9b87SWludzik, Jozef 313b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportParams.reportName() + 314e2362796SWludzik, Jozef std::to_string(ReportManager::maxReports)); 315e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 31632859b63SKarol Niczyj 3172f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open)); 3182f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 3192f9f9b87SWludzik, Jozef } 3202f9f9b87SWludzik, Jozef 3212f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport) 3222f9f9b87SWludzik, Jozef { 3232f9f9b87SWludzik, Jozef { 3242f9f9b87SWludzik, Jozef InSequence seq; 325dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 326dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 3272f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 3282f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 3292f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 3302f9f9b87SWludzik, Jozef } 3312f9f9b87SWludzik, Jozef 332e2362796SWludzik, Jozef addReport(reportParams); 333e2362796SWludzik, Jozef sut->removeReport(&reportMock); 3342f9f9b87SWludzik, Jozef checkPoint.Call("end"); 3352f9f9b87SWludzik, Jozef } 3362f9f9b87SWludzik, Jozef 3372f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 3382f9f9b87SWludzik, Jozef { 3392f9f9b87SWludzik, Jozef { 3402f9f9b87SWludzik, Jozef InSequence seq; 3412f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 3422f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 3432f9f9b87SWludzik, Jozef } 3442f9f9b87SWludzik, Jozef 345e2362796SWludzik, Jozef sut->removeReport(&reportMock); 3462f9f9b87SWludzik, Jozef checkPoint.Call("end"); 3472f9f9b87SWludzik, Jozef } 3482f9f9b87SWludzik, Jozef 3492f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 3502f9f9b87SWludzik, Jozef { 3512f9f9b87SWludzik, Jozef { 3522f9f9b87SWludzik, Jozef InSequence seq; 353dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 354dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 3552f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 3562f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 3572f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 3582f9f9b87SWludzik, Jozef } 3592f9f9b87SWludzik, Jozef 360e2362796SWludzik, Jozef addReport(reportParams); 361e2362796SWludzik, Jozef sut->removeReport(&reportMock); 362e2362796SWludzik, Jozef sut->removeReport(&reportMock); 3632f9f9b87SWludzik, Jozef checkPoint.Call("end"); 3642f9f9b87SWludzik, Jozef } 365e2362796SWludzik, Jozef 366d960e1f3SWludzik, Jozef TEST_F(TestReportManager, updateReportCallsUpdateReadingsForExistReport) 367d960e1f3SWludzik, Jozef { 368dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 369d960e1f3SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 370d960e1f3SWludzik, Jozef EXPECT_CALL(reportMock, updateReadings()); 371d960e1f3SWludzik, Jozef 372d960e1f3SWludzik, Jozef addReport(reportParams); 373b8cc78ddSKrzysztof Grobelny sut->updateReport(reportParams.reportId()); 374d960e1f3SWludzik, Jozef } 375d960e1f3SWludzik, Jozef 376d960e1f3SWludzik, Jozef TEST_F(TestReportManager, updateReportDoNothingIfReportDoesNotExist) 377d960e1f3SWludzik, Jozef { 378dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 379d960e1f3SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 380d960e1f3SWludzik, Jozef EXPECT_CALL(reportMock, updateReadings()).Times(0); 381d960e1f3SWludzik, Jozef 382d960e1f3SWludzik, Jozef addReport(reportParams); 383d960e1f3SWludzik, Jozef sut->updateReport("NotAReport"); 384d960e1f3SWludzik, Jozef } 385d960e1f3SWludzik, Jozef 386*b4ef22e4SSzymon Dompke TEST_F(TestReportManager, updateTriggerIdsUpdatesThemForExistReport) 387*b4ef22e4SSzymon Dompke { 388*b4ef22e4SSzymon Dompke reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 389*b4ef22e4SSzymon Dompke .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 390*b4ef22e4SSzymon Dompke EXPECT_CALL(reportMock, updateTriggerIds("Trigger1", TriggerIdUpdate::Add)); 391*b4ef22e4SSzymon Dompke EXPECT_CALL(reportMock, 392*b4ef22e4SSzymon Dompke updateTriggerIds("Trigger2", TriggerIdUpdate::Remove)); 393*b4ef22e4SSzymon Dompke 394*b4ef22e4SSzymon Dompke addReport(reportParams); 395*b4ef22e4SSzymon Dompke sut->updateTriggerIds(reportParams.reportId(), "Trigger1", 396*b4ef22e4SSzymon Dompke TriggerIdUpdate::Add); 397*b4ef22e4SSzymon Dompke 398*b4ef22e4SSzymon Dompke sut->updateTriggerIds(reportParams.reportId(), "Trigger2", 399*b4ef22e4SSzymon Dompke TriggerIdUpdate::Remove); 400*b4ef22e4SSzymon Dompke } 401*b4ef22e4SSzymon Dompke 402*b4ef22e4SSzymon Dompke TEST_F(TestReportManager, updateTriggerIdsDoNothingIfReportDoesNotExist) 403*b4ef22e4SSzymon Dompke { 404*b4ef22e4SSzymon Dompke reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 405*b4ef22e4SSzymon Dompke .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 406*b4ef22e4SSzymon Dompke EXPECT_CALL(reportMock, updateTriggerIds(_, _)).Times(0); 407*b4ef22e4SSzymon Dompke 408*b4ef22e4SSzymon Dompke addReport(reportParams); 409*b4ef22e4SSzymon Dompke sut->updateTriggerIds("NotAReport", "Trigger1", TriggerIdUpdate::Add); 410*b4ef22e4SSzymon Dompke } 411*b4ef22e4SSzymon Dompke 412e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType : 413e8fc5751SKrzysztof Grobelny public TestReportManager, 414e8fc5751SKrzysztof Grobelny public WithParamInterface<OperationType> 415e8fc5751SKrzysztof Grobelny { 416e8fc5751SKrzysztof Grobelny public: 417e8fc5751SKrzysztof Grobelny OperationType operationType = GetParam(); 418e8fc5751SKrzysztof Grobelny }; 419e8fc5751SKrzysztof Grobelny 420e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType, 421e8fc5751SKrzysztof Grobelny Values(OperationType::single, OperationType::max, 422e8fc5751SKrzysztof Grobelny OperationType::min, OperationType::avg, 423e8fc5751SKrzysztof Grobelny OperationType::sum)); 424e8fc5751SKrzysztof Grobelny 425e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType, 426e8fc5751SKrzysztof Grobelny addReportWithDifferentOperationTypes) 427e8fc5751SKrzysztof Grobelny { 428dcc4e193SKrzysztof Grobelny reportParams.metricParameters( 429dcc4e193SKrzysztof Grobelny std::vector<LabeledMetricParameters>{{LabeledMetricParameters{ 43094f71c51SSzymon Dompke {LabeledSensorInfo{"Service", 431b8cc78ddSKrzysztof Grobelny "/xyz/openbmc_project/sensors/power/p1", 432b8cc78ddSKrzysztof Grobelny "Metadata1"}}, 433dcc4e193SKrzysztof Grobelny operationType, 434e8fc5751SKrzysztof Grobelny "MetricId1", 435dcc4e193SKrzysztof Grobelny CollectionTimeScope::point, 436dcc4e193SKrzysztof Grobelny CollectionDuration(Milliseconds(0u))}}}); 437e8fc5751SKrzysztof Grobelny 438dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 439e8fc5751SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 440e8fc5751SKrzysztof Grobelny 441e8fc5751SKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 44232859b63SKarol Niczyj 443e8fc5751SKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 444b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/"s + reportParams.reportId())); 445e8fc5751SKrzysztof Grobelny } 446e8fc5751SKrzysztof Grobelny 447e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager 448e2362796SWludzik, Jozef { 449e2362796SWludzik, Jozef public: 450e2362796SWludzik, Jozef using FilePath = interfaces::JsonStorage::FilePath; 451e2362796SWludzik, Jozef using DirectoryPath = interfaces::JsonStorage::DirectoryPath; 452e2362796SWludzik, Jozef 453e2362796SWludzik, Jozef void SetUp() override 454e2362796SWludzik, Jozef { 455dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0); 456dcc4e193SKrzysztof Grobelny 457e2362796SWludzik, Jozef ON_CALL(storageMock, list()) 458e2362796SWludzik, Jozef .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")})); 459e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))) 4606ccfcbf5SKrzysztof Grobelny .WillByDefault(InvokeWithoutArgs([this] { return data; })); 461e2362796SWludzik, Jozef } 462e2362796SWludzik, Jozef 463e2362796SWludzik, Jozef void makeReportManager() 464e2362796SWludzik, Jozef { 465*b4ef22e4SSzymon Dompke sut = std::make_unique<ReportManager>( 466*b4ef22e4SSzymon Dompke std::move(reportFactoryMockPtr), std::move(storageMockPtr), 467*b4ef22e4SSzymon Dompke DbusEnvironment::getObjServer(), triggerManagerMockPtr); 468e2362796SWludzik, Jozef } 469e2362796SWludzik, Jozef 470e2362796SWludzik, Jozef nlohmann::json data = nlohmann::json{ 4717e098e93SLukasz Kazmierczak {"Enabled", reportParams.enabled()}, 472e2362796SWludzik, Jozef {"Version", Report::reportVersion}, 473b8cc78ddSKrzysztof Grobelny {"Id", reportParams.reportId()}, 474e2362796SWludzik, Jozef {"Name", reportParams.reportName()}, 47551497a0cSKrzysztof Grobelny {"ReportingType", utils::toUnderlying(reportParams.reportingType())}, 47651497a0cSKrzysztof Grobelny {"ReportActions", reportParams.reportActions()}, 477e2362796SWludzik, Jozef {"Interval", reportParams.interval().count()}, 47851497a0cSKrzysztof Grobelny {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())}, 4793eb56865SSzymon Dompke {"AppendLimit", reportParams.appendLimit()}, 480dcc4e193SKrzysztof Grobelny {"ReadingParameters", reportParams.metricParameters()}}; 481e2362796SWludzik, Jozef }; 482e2362796SWludzik, Jozef 483e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage) 484e2362796SWludzik, Jozef { 485dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, _, Ref(storageMock)); 486e2362796SWludzik, Jozef 487e2362796SWludzik, Jozef makeReportManager(); 488e2362796SWludzik, Jozef } 489e2362796SWludzik, Jozef 490e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 491e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfVersionDoesNotMatch) 492e2362796SWludzik, Jozef { 493e2362796SWludzik, Jozef data["Version"] = Report::reportVersion - 1; 494e2362796SWludzik, Jozef 495e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 496e2362796SWludzik, Jozef 497e2362796SWludzik, Jozef makeReportManager(); 498e2362796SWludzik, Jozef } 499e2362796SWludzik, Jozef 500e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 501e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfIntervalHasWrongType) 502e2362796SWludzik, Jozef { 503e2362796SWludzik, Jozef data["Interval"] = "1000"; 504e2362796SWludzik, Jozef 505e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 506e2362796SWludzik, Jozef 507e2362796SWludzik, Jozef makeReportManager(); 508e2362796SWludzik, Jozef } 509