12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp" 2d2238194SKrzysztof Grobelny #include "helpers.hpp" 3b4ef22e4SSzymon Dompke #include "interfaces/trigger_manager.hpp" 4e2362796SWludzik, Jozef #include "mocks/json_storage_mock.hpp" 52f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp" 6b4ef22e4SSzymon 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 34e2362796SWludzik, Jozef std::unique_ptr<ReportManager> sut; 352f9f9b87SWludzik, Jozef 362f9f9b87SWludzik, Jozef MockFunction<void(std::string)> checkPoint; 372f9f9b87SWludzik, Jozef 38e2362796SWludzik, Jozef void SetUp() override 39e2362796SWludzik, Jozef { 40dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)) 41dcc4e193SKrzysztof Grobelny .Times(AnyNumber()); 42dcc4e193SKrzysztof Grobelny 43e6d48874SKrzysztof Grobelny sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 44e6d48874SKrzysztof Grobelny std::move(storageMockPtr), 45e6d48874SKrzysztof Grobelny DbusEnvironment::getObjServer()); 46e2362796SWludzik, Jozef } 47e2362796SWludzik, Jozef 482f9f9b87SWludzik, Jozef void TearDown() override 492f9f9b87SWludzik, Jozef { 502f9f9b87SWludzik, Jozef DbusEnvironment::synchronizeIoc(); 512f9f9b87SWludzik, Jozef } 522f9f9b87SWludzik, Jozef 5351497a0cSKrzysztof Grobelny template <class... Args> 5451497a0cSKrzysztof Grobelny requires(sizeof...(Args) > 1) 5551497a0cSKrzysztof Grobelny std::pair<boost::system::error_code, std::string> addReport( 5651497a0cSKrzysztof Grobelny Args&&... args) 572f9f9b87SWludzik, Jozef { 582f9f9b87SWludzik, Jozef std::promise<std::pair<boost::system::error_code, std::string>> 592f9f9b87SWludzik, Jozef addReportPromise; 602f9f9b87SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 612f9f9b87SWludzik, Jozef [&addReportPromise](boost::system::error_code ec, 622f9f9b87SWludzik, Jozef const std::string& path) { 632f9f9b87SWludzik, Jozef addReportPromise.set_value({ec, path}); 642f9f9b87SWludzik, Jozef }, 652f9f9b87SWludzik, Jozef DbusEnvironment::serviceName(), ReportManager::reportManagerPath, 66dcc4e193SKrzysztof Grobelny ReportManager::reportManagerIfaceName, "AddReportFutureVersion", 6751497a0cSKrzysztof Grobelny std::forward<Args>(args)...); 68f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(addReportPromise.get_future()); 692f9f9b87SWludzik, Jozef } 702f9f9b87SWludzik, Jozef 7151497a0cSKrzysztof Grobelny auto addReport(const ReportParams& params) 7251497a0cSKrzysztof Grobelny { 73b8cc78ddSKrzysztof Grobelny return addReport(params.reportId(), params.reportName(), 74b8cc78ddSKrzysztof Grobelny utils::enumToString(params.reportingType()), 75b8cc78ddSKrzysztof Grobelny utils::enumToString(params.reportUpdates()), 76b8cc78ddSKrzysztof Grobelny params.appendLimit(), 77b8cc78ddSKrzysztof Grobelny utils::transform(params.reportActions(), 78b8cc78ddSKrzysztof Grobelny [](const auto v) { 79b8cc78ddSKrzysztof Grobelny return utils::enumToString(v); 80b8cc78ddSKrzysztof Grobelny }), 8151497a0cSKrzysztof Grobelny params.interval().count(), 8251497a0cSKrzysztof Grobelny toReadingParameters(params.metricParameters())); 8351497a0cSKrzysztof Grobelny } 8451497a0cSKrzysztof Grobelny 852f9f9b87SWludzik, Jozef template <class T> 86e28aa53dSSzymon Dompke static T getProperty(const std::string& property) 872f9f9b87SWludzik, Jozef { 88e28aa53dSSzymon Dompke return DbusEnvironment::getProperty<T>( 892f9f9b87SWludzik, Jozef ReportManager::reportManagerPath, 90e28aa53dSSzymon Dompke ReportManager::reportManagerIfaceName, property); 9132859b63SKarol Niczyj } 922f9f9b87SWludzik, Jozef }; 932f9f9b87SWludzik, Jozef 942f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval) 952f9f9b87SWludzik, Jozef { 962f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint64_t>("MinInterval"), 97dcc4e193SKrzysztof Grobelny Eq(ReportManager::minInterval.count())); 982f9f9b87SWludzik, Jozef } 992f9f9b87SWludzik, Jozef 1002f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports) 1012f9f9b87SWludzik, Jozef { 102503c1589SWludzik, Jozef EXPECT_THAT(getProperty<size_t>("MaxReports"), 1032f9f9b87SWludzik, Jozef Eq(ReportManager::maxReports)); 1042f9f9b87SWludzik, Jozef } 1052f9f9b87SWludzik, Jozef 10660fee077SKrzysztof Grobelny TEST_F(TestReportManager, returnsPropertySupportedOperationTypes) 10760fee077SKrzysztof Grobelny { 10860fee077SKrzysztof Grobelny EXPECT_THAT( 10960fee077SKrzysztof Grobelny getProperty<std::vector<std::string>>("SupportedOperationTypes"), 11060fee077SKrzysztof Grobelny UnorderedElementsAre("Maximum", "Minimum", "Average", "Summation")); 11160fee077SKrzysztof Grobelny } 11260fee077SKrzysztof Grobelny 1132f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 1142f9f9b87SWludzik, Jozef { 115dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 116dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 1172f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1182f9f9b87SWludzik, Jozef 119e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1202f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1212f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 1222f9f9b87SWludzik, Jozef } 1232f9f9b87SWludzik, Jozef 124f7ea2997SKrzysztof Grobelny TEST_F(TestReportManager, addOnChangeReport) 125f7ea2997SKrzysztof Grobelny { 126f7ea2997SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 127f7ea2997SKrzysztof Grobelny reportFactoryMock 128f7ea2997SKrzysztof Grobelny .expectMake(reportParams.reportingType(ReportingType::onChange), 129f7ea2997SKrzysztof Grobelny Ref(*sut), Ref(storageMock)) 130f7ea2997SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 131f7ea2997SKrzysztof Grobelny 132f7ea2997SKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 133f7ea2997SKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 134f7ea2997SKrzysztof Grobelny EXPECT_THAT(path, Eq(reportMock.getPath())); 135f7ea2997SKrzysztof Grobelny } 136f7ea2997SKrzysztof Grobelny 137b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport) 13832859b63SKarol Niczyj { 139b8cc78ddSKrzysztof Grobelny reportParams.reportId("ReportName"); 140b8cc78ddSKrzysztof Grobelny reportParams.reportName("ReportName"); 141b8cc78ddSKrzysztof Grobelny 142b8cc78ddSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 143b8cc78ddSKrzysztof Grobelny 144b8cc78ddSKrzysztof Grobelny auto [ec, path] = addReport(reportParams.reportId("")); 145b8cc78ddSKrzysztof Grobelny 146b8cc78ddSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 147b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/ReportName")); 148b8cc78ddSKrzysztof Grobelny } 149b8cc78ddSKrzysztof Grobelny 150b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace) 151b8cc78ddSKrzysztof Grobelny { 152b8cc78ddSKrzysztof Grobelny reportParams.reportId("Prefix/ReportName"); 153b8cc78ddSKrzysztof Grobelny reportParams.reportName("ReportName"); 154b8cc78ddSKrzysztof Grobelny 155b8cc78ddSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 156b8cc78ddSKrzysztof Grobelny 157b8cc78ddSKrzysztof Grobelny auto [ec, path] = addReport(reportParams.reportId("Prefix/")); 158b8cc78ddSKrzysztof Grobelny 159b8cc78ddSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 160b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/Prefix/ReportName")); 161b8cc78ddSKrzysztof Grobelny } 162b8cc78ddSKrzysztof Grobelny 163b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId) 164b8cc78ddSKrzysztof Grobelny { 165b8cc78ddSKrzysztof Grobelny std::string reportId(ReportManager::maxReportIdLength, 'z'); 166b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportId); 167dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 16832859b63SKarol Niczyj 16932859b63SKarol Niczyj auto [ec, path] = addReport(reportParams); 17032859b63SKarol Niczyj 17132859b63SKarol Niczyj EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 172b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/"s + reportId)); 17332859b63SKarol Niczyj } 17432859b63SKarol Niczyj 17532859b63SKarol Niczyj TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName) 17632859b63SKarol Niczyj { 177dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 17832859b63SKarol Niczyj .Times(0); 17932859b63SKarol Niczyj 180b8cc78ddSKrzysztof Grobelny reportParams.reportId( 181b8cc78ddSKrzysztof Grobelny std::string(ReportManager::maxReportIdLength + 1, 'z')); 18232859b63SKarol Niczyj 18332859b63SKarol Niczyj auto [ec, path] = addReport(reportParams); 18432859b63SKarol Niczyj 18532859b63SKarol Niczyj EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 18632859b63SKarol Niczyj EXPECT_THAT(path, Eq(std::string())); 18732859b63SKarol Niczyj } 18832859b63SKarol Niczyj 189e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice) 1902f9f9b87SWludzik, Jozef { 191dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 192d2238194SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1932f9f9b87SWludzik, Jozef 194e2362796SWludzik, Jozef addReport(reportParams); 1952f9f9b87SWludzik, Jozef 196e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 19732859b63SKarol Niczyj 1982f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 1992f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 2002f9f9b87SWludzik, Jozef } 2012f9f9b87SWludzik, Jozef 202e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval) 2032f9f9b87SWludzik, Jozef { 204dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 205d2238194SKrzysztof Grobelny .Times(0); 2062f9f9b87SWludzik, Jozef 20751497a0cSKrzysztof Grobelny reportParams.reportingType(ReportingType::periodic); 208*973b4bb0SKrzysztof Grobelny reportParams.interval(ReportManager::minInterval - 1ms); 2092f9f9b87SWludzik, Jozef 210e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 21132859b63SKarol Niczyj 2122f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 2132f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 2142f9f9b87SWludzik, Jozef } 2152f9f9b87SWludzik, Jozef 216bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType) 217bc766b4dSWludzik, Jozef { 218dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 219bc766b4dSWludzik, Jozef .Times(0); 220bc766b4dSWludzik, Jozef 22151497a0cSKrzysztof Grobelny auto [ec, path] = addReport( 22251497a0cSKrzysztof Grobelny reportParams.reportName(), "InvalidReportingType", 22351497a0cSKrzysztof Grobelny utils::transform(reportParams.reportActions(), 22451497a0cSKrzysztof Grobelny [](const auto v) { return utils::enumToString(v); }), 22551497a0cSKrzysztof Grobelny reportParams.interval().count(), 22651497a0cSKrzysztof Grobelny toReadingParameters(reportParams.metricParameters())); 22732859b63SKarol Niczyj 228bc766b4dSWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 229bc766b4dSWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 230bc766b4dSWludzik, Jozef } 231bc766b4dSWludzik, Jozef 232cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, 233cd5b0b7eSAnkita Vilas Gawade DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected) 234bc766b4dSWludzik, Jozef { 235dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 236bc766b4dSWludzik, Jozef .Times(0); 237bc766b4dSWludzik, Jozef 238cd5b0b7eSAnkita Vilas Gawade reportParams.metricParameters( 239cd5b0b7eSAnkita Vilas Gawade std::vector<LabeledMetricParameters>{{LabeledMetricParameters{ 24094f71c51SSzymon Dompke {LabeledSensorInfo{"Service", 241cd5b0b7eSAnkita Vilas Gawade "/xyz/openbmc_project/sensors/power/p1", 242cd5b0b7eSAnkita Vilas Gawade "Metadata1"}}, 24360fee077SKrzysztof Grobelny OperationType::avg, 244cd5b0b7eSAnkita Vilas Gawade "MetricId1", 245cd5b0b7eSAnkita Vilas Gawade CollectionTimeScope::point, 246cd5b0b7eSAnkita Vilas Gawade CollectionDuration(Milliseconds(0u))}}}); 247cd5b0b7eSAnkita Vilas Gawade 248dcc4e193SKrzysztof Grobelny auto metricParams = reportParams.metricParameters(); 249cd5b0b7eSAnkita Vilas Gawade auto& metricParamsVec = 250cd5b0b7eSAnkita Vilas Gawade metricParams[0].at_label<utils::tstring::SensorPath>(); 251cd5b0b7eSAnkita Vilas Gawade 252cd5b0b7eSAnkita Vilas Gawade for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++) 253bc766b4dSWludzik, Jozef { 25494f71c51SSzymon Dompke metricParamsVec.emplace_back(LabeledSensorInfo{ 255cd5b0b7eSAnkita Vilas Gawade "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"}); 256bc766b4dSWludzik, Jozef } 257cd5b0b7eSAnkita Vilas Gawade 258dcc4e193SKrzysztof Grobelny reportParams.metricParameters(std::move(metricParams)); 259bc766b4dSWludzik, Jozef 260bc766b4dSWludzik, Jozef auto [ec, path] = addReport(reportParams); 26132859b63SKarol Niczyj 262bc766b4dSWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long)); 263bc766b4dSWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 264bc766b4dSWludzik, Jozef } 265bc766b4dSWludzik, Jozef 266cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected) 267cd5b0b7eSAnkita Vilas Gawade { 268cd5b0b7eSAnkita Vilas Gawade reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 269cd5b0b7eSAnkita Vilas Gawade .Times(0); 270cd5b0b7eSAnkita Vilas Gawade 271cd5b0b7eSAnkita Vilas Gawade auto metricParams = std::vector<LabeledMetricParameters>{}; 272cd5b0b7eSAnkita Vilas Gawade 273cd5b0b7eSAnkita Vilas Gawade for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++) 274cd5b0b7eSAnkita Vilas Gawade { 275cd5b0b7eSAnkita Vilas Gawade metricParams.emplace_back( 276cd5b0b7eSAnkita Vilas Gawade LabeledMetricParameters{{}, 27760fee077SKrzysztof Grobelny OperationType::avg, 278cd5b0b7eSAnkita Vilas Gawade "MetricId1", 279cd5b0b7eSAnkita Vilas Gawade CollectionTimeScope::point, 280cd5b0b7eSAnkita Vilas Gawade CollectionDuration(Milliseconds(0u))}); 281cd5b0b7eSAnkita Vilas Gawade } 282cd5b0b7eSAnkita Vilas Gawade 283cd5b0b7eSAnkita Vilas Gawade reportParams.metricParameters(std::move(metricParams)); 284cd5b0b7eSAnkita Vilas Gawade 285cd5b0b7eSAnkita Vilas Gawade auto [ec, path] = addReport(reportParams); 286cd5b0b7eSAnkita Vilas Gawade 287cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long)); 288cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(path, Eq(std::string())); 289cd5b0b7eSAnkita Vilas Gawade } 290cd5b0b7eSAnkita Vilas Gawade 291cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax) 292cd5b0b7eSAnkita Vilas Gawade { 293cd5b0b7eSAnkita Vilas Gawade reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 294cd5b0b7eSAnkita Vilas Gawade .Times(0); 295cd5b0b7eSAnkita Vilas Gawade 296cd5b0b7eSAnkita Vilas Gawade reportParams.appendLimit(ReportManager::maxAppendLimit + 1); 297cd5b0b7eSAnkita Vilas Gawade 298cd5b0b7eSAnkita Vilas Gawade auto [ec, path] = addReport(reportParams); 299cd5b0b7eSAnkita Vilas Gawade 300cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 301cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(path, Eq(std::string())); 302cd5b0b7eSAnkita Vilas Gawade } 303cd5b0b7eSAnkita Vilas Gawade 304e6c417cfSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed) 305e6c417cfSKrzysztof Grobelny { 306e6c417cfSKrzysztof Grobelny reportParams.appendLimit(std::numeric_limits<uint64_t>::max()); 307e6c417cfSKrzysztof Grobelny 308e6c417cfSKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 309e6c417cfSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 310e6c417cfSKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 311e6c417cfSKrzysztof Grobelny 312e6c417cfSKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 313e6c417cfSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 314e6c417cfSKrzysztof Grobelny EXPECT_THAT(path, Eq(reportMock.getPath())); 315e6c417cfSKrzysztof Grobelny } 316e6c417cfSKrzysztof Grobelny 317e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached) 3182f9f9b87SWludzik, Jozef { 319dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 3202f9f9b87SWludzik, Jozef .Times(ReportManager::maxReports); 3212f9f9b87SWludzik, Jozef 3222f9f9b87SWludzik, Jozef for (size_t i = 0; i < ReportManager::maxReports; i++) 3232f9f9b87SWludzik, Jozef { 324b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportParams.reportName() + std::to_string(i)); 3252f9f9b87SWludzik, Jozef 326e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 3272f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 3282f9f9b87SWludzik, Jozef } 3292f9f9b87SWludzik, Jozef 330b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportParams.reportName() + 331e2362796SWludzik, Jozef std::to_string(ReportManager::maxReports)); 332e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 33332859b63SKarol Niczyj 3342f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open)); 3352f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 3362f9f9b87SWludzik, Jozef } 3372f9f9b87SWludzik, Jozef 3382f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport) 3392f9f9b87SWludzik, Jozef { 3402f9f9b87SWludzik, Jozef { 3412f9f9b87SWludzik, Jozef InSequence seq; 342dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 343dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 3442f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 3452f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 3462f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 3472f9f9b87SWludzik, Jozef } 3482f9f9b87SWludzik, Jozef 349e2362796SWludzik, Jozef addReport(reportParams); 350e2362796SWludzik, Jozef sut->removeReport(&reportMock); 3512f9f9b87SWludzik, Jozef checkPoint.Call("end"); 3522f9f9b87SWludzik, Jozef } 3532f9f9b87SWludzik, Jozef 3542f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 3552f9f9b87SWludzik, Jozef { 3562f9f9b87SWludzik, Jozef { 3572f9f9b87SWludzik, Jozef InSequence seq; 3582f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 3592f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 3602f9f9b87SWludzik, Jozef } 3612f9f9b87SWludzik, Jozef 362e2362796SWludzik, Jozef sut->removeReport(&reportMock); 3632f9f9b87SWludzik, Jozef checkPoint.Call("end"); 3642f9f9b87SWludzik, Jozef } 3652f9f9b87SWludzik, Jozef 3662f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 3672f9f9b87SWludzik, Jozef { 3682f9f9b87SWludzik, Jozef { 3692f9f9b87SWludzik, Jozef InSequence seq; 370dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 371dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 3722f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 3732f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 3742f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 3752f9f9b87SWludzik, Jozef } 3762f9f9b87SWludzik, Jozef 377e2362796SWludzik, Jozef addReport(reportParams); 378e2362796SWludzik, Jozef sut->removeReport(&reportMock); 379e2362796SWludzik, Jozef sut->removeReport(&reportMock); 3802f9f9b87SWludzik, Jozef checkPoint.Call("end"); 3812f9f9b87SWludzik, Jozef } 382e2362796SWludzik, Jozef 383e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType : 384e8fc5751SKrzysztof Grobelny public TestReportManager, 385e8fc5751SKrzysztof Grobelny public WithParamInterface<OperationType> 386e8fc5751SKrzysztof Grobelny { 387e8fc5751SKrzysztof Grobelny public: 388e8fc5751SKrzysztof Grobelny OperationType operationType = GetParam(); 389e8fc5751SKrzysztof Grobelny }; 390e8fc5751SKrzysztof Grobelny 391e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType, 39260fee077SKrzysztof Grobelny Values(OperationType::max, OperationType::min, 39360fee077SKrzysztof Grobelny OperationType::avg, OperationType::sum)); 394e8fc5751SKrzysztof Grobelny 395e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType, 396e8fc5751SKrzysztof Grobelny addReportWithDifferentOperationTypes) 397e8fc5751SKrzysztof Grobelny { 398dcc4e193SKrzysztof Grobelny reportParams.metricParameters( 399dcc4e193SKrzysztof Grobelny std::vector<LabeledMetricParameters>{{LabeledMetricParameters{ 40094f71c51SSzymon Dompke {LabeledSensorInfo{"Service", 401b8cc78ddSKrzysztof Grobelny "/xyz/openbmc_project/sensors/power/p1", 402b8cc78ddSKrzysztof Grobelny "Metadata1"}}, 403dcc4e193SKrzysztof Grobelny operationType, 404e8fc5751SKrzysztof Grobelny "MetricId1", 405dcc4e193SKrzysztof Grobelny CollectionTimeScope::point, 406dcc4e193SKrzysztof Grobelny CollectionDuration(Milliseconds(0u))}}}); 407e8fc5751SKrzysztof Grobelny 408dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 409e8fc5751SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 410e8fc5751SKrzysztof Grobelny 411e8fc5751SKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 41232859b63SKarol Niczyj 413e8fc5751SKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 414b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/"s + reportParams.reportId())); 415e8fc5751SKrzysztof Grobelny } 416e8fc5751SKrzysztof Grobelny 417e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager 418e2362796SWludzik, Jozef { 419e2362796SWludzik, Jozef public: 420e2362796SWludzik, Jozef using FilePath = interfaces::JsonStorage::FilePath; 421e2362796SWludzik, Jozef using DirectoryPath = interfaces::JsonStorage::DirectoryPath; 422e2362796SWludzik, Jozef 423e2362796SWludzik, Jozef void SetUp() override 424e2362796SWludzik, Jozef { 425dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0); 426dcc4e193SKrzysztof Grobelny 427e2362796SWludzik, Jozef ON_CALL(storageMock, list()) 428e2362796SWludzik, Jozef .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")})); 429e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))) 4306ccfcbf5SKrzysztof Grobelny .WillByDefault(InvokeWithoutArgs([this] { return data; })); 431e2362796SWludzik, Jozef } 432e2362796SWludzik, Jozef 433e2362796SWludzik, Jozef void makeReportManager() 434e2362796SWludzik, Jozef { 435e6d48874SKrzysztof Grobelny sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 436e6d48874SKrzysztof Grobelny std::move(storageMockPtr), 437e6d48874SKrzysztof Grobelny DbusEnvironment::getObjServer()); 438e2362796SWludzik, Jozef } 439e2362796SWludzik, Jozef 440e2362796SWludzik, Jozef nlohmann::json data = nlohmann::json{ 4417e098e93SLukasz Kazmierczak {"Enabled", reportParams.enabled()}, 442e2362796SWludzik, Jozef {"Version", Report::reportVersion}, 443b8cc78ddSKrzysztof Grobelny {"Id", reportParams.reportId()}, 444e2362796SWludzik, Jozef {"Name", reportParams.reportName()}, 44551497a0cSKrzysztof Grobelny {"ReportingType", utils::toUnderlying(reportParams.reportingType())}, 44651497a0cSKrzysztof Grobelny {"ReportActions", reportParams.reportActions()}, 447e2362796SWludzik, Jozef {"Interval", reportParams.interval().count()}, 44851497a0cSKrzysztof Grobelny {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())}, 4493eb56865SSzymon Dompke {"AppendLimit", reportParams.appendLimit()}, 450dcc4e193SKrzysztof Grobelny {"ReadingParameters", reportParams.metricParameters()}}; 451e2362796SWludzik, Jozef }; 452e2362796SWludzik, Jozef 453e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage) 454e2362796SWludzik, Jozef { 455dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, _, Ref(storageMock)); 456e2362796SWludzik, Jozef 457e2362796SWludzik, Jozef makeReportManager(); 458e2362796SWludzik, Jozef } 459e2362796SWludzik, Jozef 460e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 461e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfVersionDoesNotMatch) 462e2362796SWludzik, Jozef { 463e2362796SWludzik, Jozef data["Version"] = Report::reportVersion - 1; 464e2362796SWludzik, Jozef 465e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 466e2362796SWludzik, Jozef 467e2362796SWludzik, Jozef makeReportManager(); 468e2362796SWludzik, Jozef } 469e2362796SWludzik, Jozef 470e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 471e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfIntervalHasWrongType) 472e2362796SWludzik, Jozef { 473e2362796SWludzik, Jozef data["Interval"] = "1000"; 474e2362796SWludzik, Jozef 475e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 476e2362796SWludzik, Jozef 477e2362796SWludzik, Jozef makeReportManager(); 478e2362796SWludzik, Jozef } 479