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" 11*32305f14SSzymon Dompke #include "utils/dbus_path_utils.hpp" 12*32305f14SSzymon Dompke #include "utils/string_utils.hpp" 13e2362796SWludzik, Jozef #include "utils/transform.hpp" 14*32305f14SSzymon Dompke #include "utils/tstring.hpp" 152f9f9b87SWludzik, Jozef 162f9f9b87SWludzik, Jozef using namespace testing; 17e8fc5751SKrzysztof Grobelny using namespace std::string_literals; 18e2362796SWludzik, Jozef using namespace std::chrono_literals; 192f9f9b87SWludzik, Jozef 202f9f9b87SWludzik, Jozef class TestReportManager : public Test 212f9f9b87SWludzik, Jozef { 222f9f9b87SWludzik, Jozef public: 23e2362796SWludzik, Jozef ReportParams reportParams; 242f9f9b87SWludzik, Jozef 252f9f9b87SWludzik, Jozef std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr = 262f9f9b87SWludzik, Jozef std::make_unique<StrictMock<ReportFactoryMock>>(); 272f9f9b87SWludzik, Jozef ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr; 28e2362796SWludzik, Jozef 29e2362796SWludzik, Jozef std::unique_ptr<StorageMock> storageMockPtr = 30e2362796SWludzik, Jozef std::make_unique<NiceMock<StorageMock>>(); 31e2362796SWludzik, Jozef StorageMock& storageMock = *storageMockPtr; 32e2362796SWludzik, Jozef 33d2238194SKrzysztof Grobelny std::unique_ptr<ReportMock> reportMockPtr = 34b8cc78ddSKrzysztof Grobelny std::make_unique<NiceMock<ReportMock>>(reportParams.reportId()); 35d2238194SKrzysztof Grobelny ReportMock& reportMock = *reportMockPtr; 36d2238194SKrzysztof Grobelny 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 46e6d48874SKrzysztof Grobelny sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 47e6d48874SKrzysztof Grobelny std::move(storageMockPtr), 48e6d48874SKrzysztof Grobelny DbusEnvironment::getObjServer()); 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 10960fee077SKrzysztof Grobelny TEST_F(TestReportManager, returnsPropertySupportedOperationTypes) 11060fee077SKrzysztof Grobelny { 11160fee077SKrzysztof Grobelny EXPECT_THAT( 11260fee077SKrzysztof Grobelny getProperty<std::vector<std::string>>("SupportedOperationTypes"), 11360fee077SKrzysztof Grobelny UnorderedElementsAre("Maximum", "Minimum", "Average", "Summation")); 11460fee077SKrzysztof Grobelny } 11560fee077SKrzysztof Grobelny 1162f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 1172f9f9b87SWludzik, Jozef { 118dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 119dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 1202f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1212f9f9b87SWludzik, Jozef 122e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1232f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1242f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 1252f9f9b87SWludzik, Jozef } 1262f9f9b87SWludzik, Jozef 127f7ea2997SKrzysztof Grobelny TEST_F(TestReportManager, addOnChangeReport) 128f7ea2997SKrzysztof Grobelny { 129f7ea2997SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 130f7ea2997SKrzysztof Grobelny reportFactoryMock 131f7ea2997SKrzysztof Grobelny .expectMake(reportParams.reportingType(ReportingType::onChange), 132f7ea2997SKrzysztof Grobelny Ref(*sut), Ref(storageMock)) 133f7ea2997SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 134f7ea2997SKrzysztof Grobelny 135f7ea2997SKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 136f7ea2997SKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 137f7ea2997SKrzysztof Grobelny EXPECT_THAT(path, Eq(reportMock.getPath())); 138f7ea2997SKrzysztof Grobelny } 139f7ea2997SKrzysztof Grobelny 140b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport) 14132859b63SKarol Niczyj { 142b8cc78ddSKrzysztof Grobelny reportParams.reportId("ReportName"); 143b8cc78ddSKrzysztof Grobelny reportParams.reportName("ReportName"); 144b8cc78ddSKrzysztof Grobelny 145b8cc78ddSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 146b8cc78ddSKrzysztof Grobelny 147b8cc78ddSKrzysztof Grobelny auto [ec, path] = addReport(reportParams.reportId("")); 148b8cc78ddSKrzysztof Grobelny 149b8cc78ddSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 150b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/ReportName")); 151b8cc78ddSKrzysztof Grobelny } 152b8cc78ddSKrzysztof Grobelny 153b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace) 154b8cc78ddSKrzysztof Grobelny { 155b8cc78ddSKrzysztof Grobelny reportParams.reportId("Prefix/ReportName"); 156b8cc78ddSKrzysztof Grobelny reportParams.reportName("ReportName"); 157b8cc78ddSKrzysztof Grobelny 158b8cc78ddSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 159b8cc78ddSKrzysztof Grobelny 160b8cc78ddSKrzysztof Grobelny auto [ec, path] = addReport(reportParams.reportId("Prefix/")); 161b8cc78ddSKrzysztof Grobelny 162b8cc78ddSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 163b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/Prefix/ReportName")); 164b8cc78ddSKrzysztof Grobelny } 165b8cc78ddSKrzysztof Grobelny 166b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId) 167b8cc78ddSKrzysztof Grobelny { 168*32305f14SSzymon Dompke std::string reportId = utils::string_utils::getMaxId(); 169b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportId); 170dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 17132859b63SKarol Niczyj 17232859b63SKarol Niczyj auto [ec, path] = addReport(reportParams); 17332859b63SKarol Niczyj 17432859b63SKarol Niczyj EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 175b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/"s + reportId)); 17632859b63SKarol Niczyj } 17732859b63SKarol Niczyj 178*32305f14SSzymon Dompke TEST_F(TestReportManager, addReportWithMaxLengthPrefix) 179*32305f14SSzymon Dompke { 180*32305f14SSzymon Dompke std::string reportId = utils::string_utils::getMaxPrefix() + "/MyId"; 181*32305f14SSzymon Dompke reportParams.reportId(reportId); 182*32305f14SSzymon Dompke reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 183*32305f14SSzymon Dompke 184*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 185*32305f14SSzymon Dompke 186*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 187*32305f14SSzymon Dompke EXPECT_THAT(path, Eq("/"s + reportId)); 188*32305f14SSzymon Dompke } 189*32305f14SSzymon Dompke 190*32305f14SSzymon Dompke TEST_F(TestReportManager, addReportWithMaxLengthName) 191*32305f14SSzymon Dompke { 192*32305f14SSzymon Dompke reportParams.reportName(utils::string_utils::getMaxName()); 193*32305f14SSzymon Dompke reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 194*32305f14SSzymon Dompke 195*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 196*32305f14SSzymon Dompke 197*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 198*32305f14SSzymon Dompke EXPECT_THAT(path, Eq("/"s + reportParams.reportId())); 199*32305f14SSzymon Dompke } 200*32305f14SSzymon Dompke 201*32305f14SSzymon Dompke TEST_F(TestReportManager, addReportWithMaxLengthMetricId) 202*32305f14SSzymon Dompke { 203*32305f14SSzymon Dompke namespace ts = utils::tstring; 204*32305f14SSzymon Dompke std::vector<LabeledMetricParameters> newMetricParams{ 205*32305f14SSzymon Dompke {LabeledMetricParameters{ 206*32305f14SSzymon Dompke {LabeledSensorInfo{"Service", 207*32305f14SSzymon Dompke "/xyz/openbmc_project/sensors/power/p1", 208*32305f14SSzymon Dompke "metadata1"}}, 209*32305f14SSzymon Dompke OperationType::avg, 210*32305f14SSzymon Dompke utils::string_utils::getMaxId(), 211*32305f14SSzymon Dompke CollectionTimeScope::point, 212*32305f14SSzymon Dompke CollectionDuration(Milliseconds(0u))}}}; 213*32305f14SSzymon Dompke 214*32305f14SSzymon Dompke reportParams.metricParameters(newMetricParams); 215*32305f14SSzymon Dompke reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)); 216*32305f14SSzymon Dompke 217*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 218*32305f14SSzymon Dompke 219*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 220*32305f14SSzymon Dompke EXPECT_THAT(path, Eq("/"s + reportParams.reportId())); 221*32305f14SSzymon Dompke } 222*32305f14SSzymon Dompke 223*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongFullId) 22432859b63SKarol Niczyj { 225dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 22632859b63SKarol Niczyj .Times(0); 22732859b63SKarol Niczyj 228b8cc78ddSKrzysztof Grobelny reportParams.reportId( 229*32305f14SSzymon Dompke std::string(utils::constants::maxReportFullIdLength + 1, 'z')); 230*32305f14SSzymon Dompke 231*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 232*32305f14SSzymon Dompke 233*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 234*32305f14SSzymon Dompke EXPECT_THAT(path, Eq(std::string())); 235*32305f14SSzymon Dompke } 236*32305f14SSzymon Dompke 237*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongId) 238*32305f14SSzymon Dompke { 239*32305f14SSzymon Dompke reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 240*32305f14SSzymon Dompke .Times(0); 241*32305f14SSzymon Dompke 242*32305f14SSzymon Dompke reportParams.reportId(utils::string_utils::getTooLongId()); 243*32305f14SSzymon Dompke 244*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 245*32305f14SSzymon Dompke 246*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 247*32305f14SSzymon Dompke EXPECT_THAT(path, Eq(std::string())); 248*32305f14SSzymon Dompke } 249*32305f14SSzymon Dompke 250*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongPrefix) 251*32305f14SSzymon Dompke { 252*32305f14SSzymon Dompke reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 253*32305f14SSzymon Dompke .Times(0); 254*32305f14SSzymon Dompke 255*32305f14SSzymon Dompke reportParams.reportId(utils::string_utils::getTooLongPrefix() + "/MyId"); 256*32305f14SSzymon Dompke 257*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 258*32305f14SSzymon Dompke 259*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 260*32305f14SSzymon Dompke EXPECT_THAT(path, Eq(std::string())); 261*32305f14SSzymon Dompke } 262*32305f14SSzymon Dompke 263*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooManyPrefixes) 264*32305f14SSzymon Dompke { 265*32305f14SSzymon Dompke reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 266*32305f14SSzymon Dompke .Times(0); 267*32305f14SSzymon Dompke 268*32305f14SSzymon Dompke std::string reportId; 269*32305f14SSzymon Dompke for (size_t i = 0; i < utils::constants::maxPrefixesInId + 1; i++) 270*32305f14SSzymon Dompke { 271*32305f14SSzymon Dompke reportId += "prefix/"; 272*32305f14SSzymon Dompke } 273*32305f14SSzymon Dompke reportId += "MyId"; 274*32305f14SSzymon Dompke 275*32305f14SSzymon Dompke reportParams.reportId(reportId); 276*32305f14SSzymon Dompke 277*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 278*32305f14SSzymon Dompke 279*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 280*32305f14SSzymon Dompke EXPECT_THAT(path, Eq(std::string())); 281*32305f14SSzymon Dompke } 282*32305f14SSzymon Dompke 283*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName) 284*32305f14SSzymon Dompke { 285*32305f14SSzymon Dompke reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 286*32305f14SSzymon Dompke .Times(0); 287*32305f14SSzymon Dompke 288*32305f14SSzymon Dompke reportParams.reportName(utils::string_utils::getTooLongName()); 289*32305f14SSzymon Dompke 290*32305f14SSzymon Dompke auto [ec, path] = addReport(reportParams); 291*32305f14SSzymon Dompke 292*32305f14SSzymon Dompke EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 293*32305f14SSzymon Dompke EXPECT_THAT(path, Eq(std::string())); 294*32305f14SSzymon Dompke } 295*32305f14SSzymon Dompke 296*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongMetricId) 297*32305f14SSzymon Dompke { 298*32305f14SSzymon Dompke namespace ts = utils::tstring; 299*32305f14SSzymon Dompke 300*32305f14SSzymon Dompke std::vector<LabeledMetricParameters> newMetricParams{ 301*32305f14SSzymon Dompke {LabeledMetricParameters{ 302*32305f14SSzymon Dompke {LabeledSensorInfo{"Service", 303*32305f14SSzymon Dompke "/xyz/openbmc_project/sensors/power/p1", 304*32305f14SSzymon Dompke "metadata1"}}, 305*32305f14SSzymon Dompke OperationType::avg, 306*32305f14SSzymon Dompke utils::string_utils::getTooLongId(), 307*32305f14SSzymon Dompke CollectionTimeScope::point, 308*32305f14SSzymon Dompke CollectionDuration(Milliseconds(0u))}}}; 309*32305f14SSzymon Dompke 310*32305f14SSzymon Dompke reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 311*32305f14SSzymon Dompke .Times(0); 312*32305f14SSzymon Dompke 313*32305f14SSzymon Dompke reportParams.metricParameters(newMetricParams); 31432859b63SKarol Niczyj 31532859b63SKarol Niczyj auto [ec, path] = addReport(reportParams); 31632859b63SKarol Niczyj 31732859b63SKarol Niczyj EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 31832859b63SKarol Niczyj EXPECT_THAT(path, Eq(std::string())); 31932859b63SKarol Niczyj } 32032859b63SKarol Niczyj 321e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice) 3222f9f9b87SWludzik, Jozef { 323dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 324d2238194SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 3252f9f9b87SWludzik, Jozef 326e2362796SWludzik, Jozef addReport(reportParams); 3272f9f9b87SWludzik, Jozef 328e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 32932859b63SKarol Niczyj 3302f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 3312f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 3322f9f9b87SWludzik, Jozef } 3332f9f9b87SWludzik, Jozef 334e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval) 3352f9f9b87SWludzik, Jozef { 336dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 337d2238194SKrzysztof Grobelny .Times(0); 3382f9f9b87SWludzik, Jozef 33951497a0cSKrzysztof Grobelny reportParams.reportingType(ReportingType::periodic); 340973b4bb0SKrzysztof Grobelny reportParams.interval(ReportManager::minInterval - 1ms); 3412f9f9b87SWludzik, Jozef 342e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 34332859b63SKarol Niczyj 3442f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 3452f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 3462f9f9b87SWludzik, Jozef } 3472f9f9b87SWludzik, Jozef 348bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType) 349bc766b4dSWludzik, Jozef { 350dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 351bc766b4dSWludzik, Jozef .Times(0); 352bc766b4dSWludzik, Jozef 35351497a0cSKrzysztof Grobelny auto [ec, path] = addReport( 35451497a0cSKrzysztof Grobelny reportParams.reportName(), "InvalidReportingType", 35551497a0cSKrzysztof Grobelny utils::transform(reportParams.reportActions(), 35651497a0cSKrzysztof Grobelny [](const auto v) { return utils::enumToString(v); }), 35751497a0cSKrzysztof Grobelny reportParams.interval().count(), 35851497a0cSKrzysztof Grobelny toReadingParameters(reportParams.metricParameters())); 35932859b63SKarol Niczyj 360bc766b4dSWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 361bc766b4dSWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 362bc766b4dSWludzik, Jozef } 363bc766b4dSWludzik, Jozef 364cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, 365cd5b0b7eSAnkita Vilas Gawade DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected) 366bc766b4dSWludzik, Jozef { 367dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 368bc766b4dSWludzik, Jozef .Times(0); 369bc766b4dSWludzik, Jozef 370cd5b0b7eSAnkita Vilas Gawade reportParams.metricParameters( 371cd5b0b7eSAnkita Vilas Gawade std::vector<LabeledMetricParameters>{{LabeledMetricParameters{ 37294f71c51SSzymon Dompke {LabeledSensorInfo{"Service", 373cd5b0b7eSAnkita Vilas Gawade "/xyz/openbmc_project/sensors/power/p1", 374cd5b0b7eSAnkita Vilas Gawade "Metadata1"}}, 37560fee077SKrzysztof Grobelny OperationType::avg, 376cd5b0b7eSAnkita Vilas Gawade "MetricId1", 377cd5b0b7eSAnkita Vilas Gawade CollectionTimeScope::point, 378cd5b0b7eSAnkita Vilas Gawade CollectionDuration(Milliseconds(0u))}}}); 379cd5b0b7eSAnkita Vilas Gawade 380dcc4e193SKrzysztof Grobelny auto metricParams = reportParams.metricParameters(); 381cd5b0b7eSAnkita Vilas Gawade auto& metricParamsVec = 382cd5b0b7eSAnkita Vilas Gawade metricParams[0].at_label<utils::tstring::SensorPath>(); 383cd5b0b7eSAnkita Vilas Gawade 384cd5b0b7eSAnkita Vilas Gawade for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++) 385bc766b4dSWludzik, Jozef { 38694f71c51SSzymon Dompke metricParamsVec.emplace_back(LabeledSensorInfo{ 387cd5b0b7eSAnkita Vilas Gawade "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"}); 388bc766b4dSWludzik, Jozef } 389cd5b0b7eSAnkita Vilas Gawade 390dcc4e193SKrzysztof Grobelny reportParams.metricParameters(std::move(metricParams)); 391bc766b4dSWludzik, Jozef 392bc766b4dSWludzik, Jozef auto [ec, path] = addReport(reportParams); 39332859b63SKarol Niczyj 394bc766b4dSWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long)); 395bc766b4dSWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 396bc766b4dSWludzik, Jozef } 397bc766b4dSWludzik, Jozef 398cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected) 399cd5b0b7eSAnkita Vilas Gawade { 400cd5b0b7eSAnkita Vilas Gawade reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 401cd5b0b7eSAnkita Vilas Gawade .Times(0); 402cd5b0b7eSAnkita Vilas Gawade 403cd5b0b7eSAnkita Vilas Gawade auto metricParams = std::vector<LabeledMetricParameters>{}; 404cd5b0b7eSAnkita Vilas Gawade 405cd5b0b7eSAnkita Vilas Gawade for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++) 406cd5b0b7eSAnkita Vilas Gawade { 407cd5b0b7eSAnkita Vilas Gawade metricParams.emplace_back( 408cd5b0b7eSAnkita Vilas Gawade LabeledMetricParameters{{}, 40960fee077SKrzysztof Grobelny OperationType::avg, 410cd5b0b7eSAnkita Vilas Gawade "MetricId1", 411cd5b0b7eSAnkita Vilas Gawade CollectionTimeScope::point, 412cd5b0b7eSAnkita Vilas Gawade CollectionDuration(Milliseconds(0u))}); 413cd5b0b7eSAnkita Vilas Gawade } 414cd5b0b7eSAnkita Vilas Gawade 415cd5b0b7eSAnkita Vilas Gawade reportParams.metricParameters(std::move(metricParams)); 416cd5b0b7eSAnkita Vilas Gawade 417cd5b0b7eSAnkita Vilas Gawade auto [ec, path] = addReport(reportParams); 418cd5b0b7eSAnkita Vilas Gawade 419cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long)); 420cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(path, Eq(std::string())); 421cd5b0b7eSAnkita Vilas Gawade } 422cd5b0b7eSAnkita Vilas Gawade 423cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax) 424cd5b0b7eSAnkita Vilas Gawade { 425cd5b0b7eSAnkita Vilas Gawade reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 426cd5b0b7eSAnkita Vilas Gawade .Times(0); 427cd5b0b7eSAnkita Vilas Gawade 428cd5b0b7eSAnkita Vilas Gawade reportParams.appendLimit(ReportManager::maxAppendLimit + 1); 429cd5b0b7eSAnkita Vilas Gawade 430cd5b0b7eSAnkita Vilas Gawade auto [ec, path] = addReport(reportParams); 431cd5b0b7eSAnkita Vilas Gawade 432cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 433cd5b0b7eSAnkita Vilas Gawade EXPECT_THAT(path, Eq(std::string())); 434cd5b0b7eSAnkita Vilas Gawade } 435cd5b0b7eSAnkita Vilas Gawade 436e6c417cfSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed) 437e6c417cfSKrzysztof Grobelny { 438e6c417cfSKrzysztof Grobelny reportParams.appendLimit(std::numeric_limits<uint64_t>::max()); 439e6c417cfSKrzysztof Grobelny 440e6c417cfSKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 441e6c417cfSKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 442e6c417cfSKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 443e6c417cfSKrzysztof Grobelny 444e6c417cfSKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 445e6c417cfSKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 446e6c417cfSKrzysztof Grobelny EXPECT_THAT(path, Eq(reportMock.getPath())); 447e6c417cfSKrzysztof Grobelny } 448e6c417cfSKrzysztof Grobelny 449e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached) 4502f9f9b87SWludzik, Jozef { 451dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock)) 4522f9f9b87SWludzik, Jozef .Times(ReportManager::maxReports); 4532f9f9b87SWludzik, Jozef 4542f9f9b87SWludzik, Jozef for (size_t i = 0; i < ReportManager::maxReports; i++) 4552f9f9b87SWludzik, Jozef { 456b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportParams.reportName() + std::to_string(i)); 4572f9f9b87SWludzik, Jozef 458e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 4592f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 4602f9f9b87SWludzik, Jozef } 4612f9f9b87SWludzik, Jozef 462b8cc78ddSKrzysztof Grobelny reportParams.reportId(reportParams.reportName() + 463e2362796SWludzik, Jozef std::to_string(ReportManager::maxReports)); 464e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 46532859b63SKarol Niczyj 4662f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open)); 4672f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 4682f9f9b87SWludzik, Jozef } 4692f9f9b87SWludzik, Jozef 4702f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport) 4712f9f9b87SWludzik, Jozef { 4722f9f9b87SWludzik, Jozef { 4732f9f9b87SWludzik, Jozef InSequence seq; 474dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 475dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 4762f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 4772f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 4782f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 4792f9f9b87SWludzik, Jozef } 4802f9f9b87SWludzik, Jozef 481e2362796SWludzik, Jozef addReport(reportParams); 482e2362796SWludzik, Jozef sut->removeReport(&reportMock); 4832f9f9b87SWludzik, Jozef checkPoint.Call("end"); 4842f9f9b87SWludzik, Jozef } 4852f9f9b87SWludzik, Jozef 4862f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 4872f9f9b87SWludzik, Jozef { 4882f9f9b87SWludzik, Jozef { 4892f9f9b87SWludzik, Jozef InSequence seq; 4902f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 4912f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 4922f9f9b87SWludzik, Jozef } 4932f9f9b87SWludzik, Jozef 494e2362796SWludzik, Jozef sut->removeReport(&reportMock); 4952f9f9b87SWludzik, Jozef checkPoint.Call("end"); 4962f9f9b87SWludzik, Jozef } 4972f9f9b87SWludzik, Jozef 4982f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 4992f9f9b87SWludzik, Jozef { 5002f9f9b87SWludzik, Jozef { 5012f9f9b87SWludzik, Jozef InSequence seq; 502dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)); 503dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 5042f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 5052f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 5062f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 5072f9f9b87SWludzik, Jozef } 5082f9f9b87SWludzik, Jozef 509e2362796SWludzik, Jozef addReport(reportParams); 510e2362796SWludzik, Jozef sut->removeReport(&reportMock); 511e2362796SWludzik, Jozef sut->removeReport(&reportMock); 5122f9f9b87SWludzik, Jozef checkPoint.Call("end"); 5132f9f9b87SWludzik, Jozef } 514e2362796SWludzik, Jozef 515e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType : 516e8fc5751SKrzysztof Grobelny public TestReportManager, 517e8fc5751SKrzysztof Grobelny public WithParamInterface<OperationType> 518e8fc5751SKrzysztof Grobelny { 519e8fc5751SKrzysztof Grobelny public: 520e8fc5751SKrzysztof Grobelny OperationType operationType = GetParam(); 521e8fc5751SKrzysztof Grobelny }; 522e8fc5751SKrzysztof Grobelny 523e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType, 52460fee077SKrzysztof Grobelny Values(OperationType::max, OperationType::min, 52560fee077SKrzysztof Grobelny OperationType::avg, OperationType::sum)); 526e8fc5751SKrzysztof Grobelny 527e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType, 528e8fc5751SKrzysztof Grobelny addReportWithDifferentOperationTypes) 529e8fc5751SKrzysztof Grobelny { 530dcc4e193SKrzysztof Grobelny reportParams.metricParameters( 531dcc4e193SKrzysztof Grobelny std::vector<LabeledMetricParameters>{{LabeledMetricParameters{ 53294f71c51SSzymon Dompke {LabeledSensorInfo{"Service", 533b8cc78ddSKrzysztof Grobelny "/xyz/openbmc_project/sensors/power/p1", 534b8cc78ddSKrzysztof Grobelny "Metadata1"}}, 535dcc4e193SKrzysztof Grobelny operationType, 536e8fc5751SKrzysztof Grobelny "MetricId1", 537dcc4e193SKrzysztof Grobelny CollectionTimeScope::point, 538dcc4e193SKrzysztof Grobelny CollectionDuration(Milliseconds(0u))}}}); 539e8fc5751SKrzysztof Grobelny 540dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock)) 541e8fc5751SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 542e8fc5751SKrzysztof Grobelny 543e8fc5751SKrzysztof Grobelny auto [ec, path] = addReport(reportParams); 54432859b63SKarol Niczyj 545e8fc5751SKrzysztof Grobelny EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 546b8cc78ddSKrzysztof Grobelny EXPECT_THAT(path, Eq("/"s + reportParams.reportId())); 547e8fc5751SKrzysztof Grobelny } 548e8fc5751SKrzysztof Grobelny 549e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager 550e2362796SWludzik, Jozef { 551e2362796SWludzik, Jozef public: 552e2362796SWludzik, Jozef using FilePath = interfaces::JsonStorage::FilePath; 553e2362796SWludzik, Jozef using DirectoryPath = interfaces::JsonStorage::DirectoryPath; 554e2362796SWludzik, Jozef 555e2362796SWludzik, Jozef void SetUp() override 556e2362796SWludzik, Jozef { 557dcc4e193SKrzysztof Grobelny EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0); 558dcc4e193SKrzysztof Grobelny 559e2362796SWludzik, Jozef ON_CALL(storageMock, list()) 560e2362796SWludzik, Jozef .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")})); 561e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))) 5626ccfcbf5SKrzysztof Grobelny .WillByDefault(InvokeWithoutArgs([this] { return data; })); 563e2362796SWludzik, Jozef } 564e2362796SWludzik, Jozef 565e2362796SWludzik, Jozef void makeReportManager() 566e2362796SWludzik, Jozef { 567e6d48874SKrzysztof Grobelny sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 568e6d48874SKrzysztof Grobelny std::move(storageMockPtr), 569e6d48874SKrzysztof Grobelny DbusEnvironment::getObjServer()); 570e2362796SWludzik, Jozef } 571e2362796SWludzik, Jozef 572e2362796SWludzik, Jozef nlohmann::json data = nlohmann::json{ 5737e098e93SLukasz Kazmierczak {"Enabled", reportParams.enabled()}, 574e2362796SWludzik, Jozef {"Version", Report::reportVersion}, 575b8cc78ddSKrzysztof Grobelny {"Id", reportParams.reportId()}, 576e2362796SWludzik, Jozef {"Name", reportParams.reportName()}, 57751497a0cSKrzysztof Grobelny {"ReportingType", utils::toUnderlying(reportParams.reportingType())}, 57851497a0cSKrzysztof Grobelny {"ReportActions", reportParams.reportActions()}, 579e2362796SWludzik, Jozef {"Interval", reportParams.interval().count()}, 58051497a0cSKrzysztof Grobelny {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())}, 5813eb56865SSzymon Dompke {"AppendLimit", reportParams.appendLimit()}, 582dcc4e193SKrzysztof Grobelny {"ReadingParameters", reportParams.metricParameters()}}; 583e2362796SWludzik, Jozef }; 584e2362796SWludzik, Jozef 585e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage) 586e2362796SWludzik, Jozef { 587dcc4e193SKrzysztof Grobelny reportFactoryMock.expectMake(reportParams, _, Ref(storageMock)); 588e2362796SWludzik, Jozef 589e2362796SWludzik, Jozef makeReportManager(); 590e2362796SWludzik, Jozef } 591e2362796SWludzik, Jozef 592e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 593e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfVersionDoesNotMatch) 594e2362796SWludzik, Jozef { 595e2362796SWludzik, Jozef data["Version"] = Report::reportVersion - 1; 596e2362796SWludzik, Jozef 597e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 598e2362796SWludzik, Jozef 599e2362796SWludzik, Jozef makeReportManager(); 600e2362796SWludzik, Jozef } 601e2362796SWludzik, Jozef 602e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 603e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfIntervalHasWrongType) 604e2362796SWludzik, Jozef { 605e2362796SWludzik, Jozef data["Interval"] = "1000"; 606e2362796SWludzik, Jozef 607e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 608e2362796SWludzik, Jozef 609e2362796SWludzik, Jozef makeReportManager(); 610e2362796SWludzik, Jozef } 611