12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp" 2e2362796SWludzik, Jozef #include "mocks/json_storage_mock.hpp" 32f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp" 4e2362796SWludzik, Jozef #include "params/report_params.hpp" 5e2362796SWludzik, Jozef #include "report.hpp" 62f9f9b87SWludzik, Jozef #include "report_manager.hpp" 7e2362796SWludzik, Jozef #include "utils/transform.hpp" 82f9f9b87SWludzik, Jozef 92f9f9b87SWludzik, Jozef using namespace testing; 10e2362796SWludzik, Jozef using namespace std::chrono_literals; 112f9f9b87SWludzik, Jozef 122f9f9b87SWludzik, Jozef class TestReportManager : public Test 132f9f9b87SWludzik, Jozef { 142f9f9b87SWludzik, Jozef public: 15e2362796SWludzik, Jozef ReportParams reportParams; 162f9f9b87SWludzik, Jozef 172f9f9b87SWludzik, Jozef std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr = 182f9f9b87SWludzik, Jozef std::make_unique<StrictMock<ReportFactoryMock>>(); 192f9f9b87SWludzik, Jozef ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr; 20e2362796SWludzik, Jozef 21e2362796SWludzik, Jozef std::unique_ptr<StorageMock> storageMockPtr = 22e2362796SWludzik, Jozef std::make_unique<NiceMock<StorageMock>>(); 23e2362796SWludzik, Jozef StorageMock& storageMock = *storageMockPtr; 24e2362796SWludzik, Jozef 25e2362796SWludzik, Jozef std::unique_ptr<ReportManager> sut; 262f9f9b87SWludzik, Jozef 272f9f9b87SWludzik, Jozef MockFunction<void(std::string)> checkPoint; 282f9f9b87SWludzik, Jozef 29e2362796SWludzik, Jozef void SetUp() override 30e2362796SWludzik, Jozef { 31e2362796SWludzik, Jozef sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 32e2362796SWludzik, Jozef std::move(storageMockPtr), 33e2362796SWludzik, Jozef DbusEnvironment::getObjServer()); 34e2362796SWludzik, Jozef } 35e2362796SWludzik, Jozef 362f9f9b87SWludzik, Jozef void TearDown() override 372f9f9b87SWludzik, Jozef { 382f9f9b87SWludzik, Jozef DbusEnvironment::synchronizeIoc(); 392f9f9b87SWludzik, Jozef } 402f9f9b87SWludzik, Jozef 412f9f9b87SWludzik, Jozef std::pair<boost::system::error_code, std::string> 42e2362796SWludzik, Jozef addReport(const ReportParams& params) 432f9f9b87SWludzik, Jozef { 442f9f9b87SWludzik, Jozef std::promise<std::pair<boost::system::error_code, std::string>> 452f9f9b87SWludzik, Jozef addReportPromise; 462f9f9b87SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 472f9f9b87SWludzik, Jozef [&addReportPromise](boost::system::error_code ec, 482f9f9b87SWludzik, Jozef const std::string& path) { 492f9f9b87SWludzik, Jozef addReportPromise.set_value({ec, path}); 502f9f9b87SWludzik, Jozef }, 512f9f9b87SWludzik, Jozef DbusEnvironment::serviceName(), ReportManager::reportManagerPath, 52e2362796SWludzik, Jozef ReportManager::reportManagerIfaceName, "AddReport", 53e2362796SWludzik, Jozef params.reportName(), params.reportingType(), 54e2362796SWludzik, Jozef params.emitReadingUpdate(), params.logToMetricReportCollection(), 55e2362796SWludzik, Jozef static_cast<uint64_t>(params.interval().count()), 56e2362796SWludzik, Jozef params.readingParameters()); 57*f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(addReportPromise.get_future()); 582f9f9b87SWludzik, Jozef } 592f9f9b87SWludzik, Jozef 602f9f9b87SWludzik, Jozef template <class T> 612f9f9b87SWludzik, Jozef static T getProperty(std::string property) 622f9f9b87SWludzik, Jozef { 632f9f9b87SWludzik, Jozef std::promise<T> propertyPromise; 642f9f9b87SWludzik, Jozef sdbusplus::asio::getProperty<T>( 652f9f9b87SWludzik, Jozef *DbusEnvironment::getBus(), DbusEnvironment::serviceName(), 662f9f9b87SWludzik, Jozef ReportManager::reportManagerPath, 672f9f9b87SWludzik, Jozef ReportManager::reportManagerIfaceName, property, 682f9f9b87SWludzik, Jozef [&propertyPromise](boost::system::error_code ec) { 692f9f9b87SWludzik, Jozef EXPECT_THAT(static_cast<bool>(ec), ::testing::Eq(false)); 702f9f9b87SWludzik, Jozef propertyPromise.set_value(T{}); 712f9f9b87SWludzik, Jozef }, 722f9f9b87SWludzik, Jozef [&propertyPromise](T t) { propertyPromise.set_value(t); }); 73*f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(propertyPromise.get_future()); 742f9f9b87SWludzik, Jozef } 752f9f9b87SWludzik, Jozef }; 762f9f9b87SWludzik, Jozef 772f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval) 782f9f9b87SWludzik, Jozef { 792f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint64_t>("MinInterval"), 802f9f9b87SWludzik, Jozef Eq(static_cast<uint64_t>(ReportManager::minInterval.count()))); 812f9f9b87SWludzik, Jozef } 822f9f9b87SWludzik, Jozef 832f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports) 842f9f9b87SWludzik, Jozef { 852f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint32_t>("MaxReports"), 862f9f9b87SWludzik, Jozef Eq(ReportManager::maxReports)); 872f9f9b87SWludzik, Jozef } 882f9f9b87SWludzik, Jozef 892f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 902f9f9b87SWludzik, Jozef { 912f9f9b87SWludzik, Jozef auto reportMockPtr = 92e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 932f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 942f9f9b87SWludzik, Jozef 952f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 96e2362796SWludzik, Jozef make(_, reportParams.reportName(), reportParams.reportingType(), 97e2362796SWludzik, Jozef reportParams.emitReadingUpdate(), 98e2362796SWludzik, Jozef reportParams.logToMetricReportCollection(), 99e2362796SWludzik, Jozef reportParams.interval(), reportParams.readingParameters(), 100e2362796SWludzik, Jozef Ref(*sut), Ref(storageMock))) 1012f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1022f9f9b87SWludzik, Jozef 103e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1042f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1052f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 1062f9f9b87SWludzik, Jozef } 1072f9f9b87SWludzik, Jozef 108e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice) 1092f9f9b87SWludzik, Jozef { 110e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _, _, _)); 1112f9f9b87SWludzik, Jozef 112e2362796SWludzik, Jozef addReport(reportParams); 1132f9f9b87SWludzik, Jozef 114e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1152f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 1162f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1172f9f9b87SWludzik, Jozef } 1182f9f9b87SWludzik, Jozef 119e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval) 1202f9f9b87SWludzik, Jozef { 121e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make).Times(0); 1222f9f9b87SWludzik, Jozef 123e2362796SWludzik, Jozef reportParams.interval(reportParams.interval() - 1ms); 1242f9f9b87SWludzik, Jozef 125e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1262f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 1272f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1282f9f9b87SWludzik, Jozef } 1292f9f9b87SWludzik, Jozef 130e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached) 1312f9f9b87SWludzik, Jozef { 132e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _, _, _)) 1332f9f9b87SWludzik, Jozef .Times(ReportManager::maxReports); 1342f9f9b87SWludzik, Jozef 1352f9f9b87SWludzik, Jozef for (size_t i = 0; i < ReportManager::maxReports; i++) 1362f9f9b87SWludzik, Jozef { 137e2362796SWludzik, Jozef reportParams.reportName(reportParams.reportName() + std::to_string(i)); 1382f9f9b87SWludzik, Jozef 139e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1402f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1412f9f9b87SWludzik, Jozef } 1422f9f9b87SWludzik, Jozef 143e2362796SWludzik, Jozef reportParams.reportName(reportParams.reportName() + 144e2362796SWludzik, Jozef std::to_string(ReportManager::maxReports)); 145e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1462f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open)); 1472f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1482f9f9b87SWludzik, Jozef } 1492f9f9b87SWludzik, Jozef 1502f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport) 1512f9f9b87SWludzik, Jozef { 1522f9f9b87SWludzik, Jozef auto reportMockPtr = 153e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 1542f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 1552f9f9b87SWludzik, Jozef 1562f9f9b87SWludzik, Jozef { 1572f9f9b87SWludzik, Jozef InSequence seq; 158e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _, _, _)) 1592f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1602f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1612f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1622f9f9b87SWludzik, Jozef } 1632f9f9b87SWludzik, Jozef 164e2362796SWludzik, Jozef addReport(reportParams); 165e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1662f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1672f9f9b87SWludzik, Jozef } 1682f9f9b87SWludzik, Jozef 1692f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 1702f9f9b87SWludzik, Jozef { 1712f9f9b87SWludzik, Jozef auto reportMockPtr = 172e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 1732f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 1742f9f9b87SWludzik, Jozef 1752f9f9b87SWludzik, Jozef { 1762f9f9b87SWludzik, Jozef InSequence seq; 1772f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1782f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1792f9f9b87SWludzik, Jozef } 1802f9f9b87SWludzik, Jozef 181e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1822f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1832f9f9b87SWludzik, Jozef } 1842f9f9b87SWludzik, Jozef 1852f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 1862f9f9b87SWludzik, Jozef { 1872f9f9b87SWludzik, Jozef auto reportMockPtr = 188e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 1892f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 1902f9f9b87SWludzik, Jozef 1912f9f9b87SWludzik, Jozef { 1922f9f9b87SWludzik, Jozef InSequence seq; 1932f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 194e2362796SWludzik, Jozef make(_, reportParams.reportName(), _, _, _, _, _, _, _)) 1952f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1962f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1972f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1982f9f9b87SWludzik, Jozef } 1992f9f9b87SWludzik, Jozef 200e2362796SWludzik, Jozef addReport(reportParams); 201e2362796SWludzik, Jozef sut->removeReport(&reportMock); 202e2362796SWludzik, Jozef sut->removeReport(&reportMock); 2032f9f9b87SWludzik, Jozef checkPoint.Call("end"); 2042f9f9b87SWludzik, Jozef } 205e2362796SWludzik, Jozef 206e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager 207e2362796SWludzik, Jozef { 208e2362796SWludzik, Jozef public: 209e2362796SWludzik, Jozef using FilePath = interfaces::JsonStorage::FilePath; 210e2362796SWludzik, Jozef using DirectoryPath = interfaces::JsonStorage::DirectoryPath; 211e2362796SWludzik, Jozef 212e2362796SWludzik, Jozef void SetUp() override 213e2362796SWludzik, Jozef { 214e2362796SWludzik, Jozef ON_CALL(storageMock, list()) 215e2362796SWludzik, Jozef .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")})); 216e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))) 217e2362796SWludzik, Jozef .WillByDefault(Return(data)); 218e2362796SWludzik, Jozef } 219e2362796SWludzik, Jozef 220e2362796SWludzik, Jozef void makeReportManager() 221e2362796SWludzik, Jozef { 222e2362796SWludzik, Jozef sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 223e2362796SWludzik, Jozef std::move(storageMockPtr), 224e2362796SWludzik, Jozef DbusEnvironment::getObjServer()); 225e2362796SWludzik, Jozef } 226e2362796SWludzik, Jozef 227e2362796SWludzik, Jozef nlohmann::json data = nlohmann::json{ 228e2362796SWludzik, Jozef {"Version", Report::reportVersion}, 229e2362796SWludzik, Jozef {"Name", reportParams.reportName()}, 230e2362796SWludzik, Jozef {"ReportingType", reportParams.reportingType()}, 231e2362796SWludzik, Jozef {"EmitsReadingsUpdate", reportParams.emitReadingUpdate()}, 232e2362796SWludzik, Jozef {"LogToMetricReportsCollection", 233e2362796SWludzik, Jozef reportParams.logToMetricReportCollection()}, 234e2362796SWludzik, Jozef {"Interval", reportParams.interval().count()}, 235e2362796SWludzik, Jozef {"ReadingParameters", 236e2362796SWludzik, Jozef utils::transform(reportParams.readingParameters(), 237e2362796SWludzik, Jozef [](const auto& item) { 238e2362796SWludzik, Jozef return LabeledReadingParameter::to_json(item); 239e2362796SWludzik, Jozef })}}; 240e2362796SWludzik, Jozef }; 241e2362796SWludzik, Jozef 242e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage) 243e2362796SWludzik, Jozef { 244e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 245e2362796SWludzik, Jozef make(_, reportParams.reportName(), reportParams.reportingType(), 246e2362796SWludzik, Jozef reportParams.emitReadingUpdate(), 247e2362796SWludzik, Jozef reportParams.logToMetricReportCollection(), 248e2362796SWludzik, Jozef reportParams.interval(), reportParams.readingParameters(), 249e2362796SWludzik, Jozef _, Ref(storageMock))); 250e2362796SWludzik, Jozef 251e2362796SWludzik, Jozef makeReportManager(); 252e2362796SWludzik, Jozef } 253e2362796SWludzik, Jozef 254e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 255e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfVersionDoesNotMatch) 256e2362796SWludzik, Jozef { 257e2362796SWludzik, Jozef data["Version"] = Report::reportVersion - 1; 258e2362796SWludzik, Jozef 259e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))).WillByDefault(Return(data)); 260e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 261e2362796SWludzik, Jozef 262e2362796SWludzik, Jozef makeReportManager(); 263e2362796SWludzik, Jozef } 264e2362796SWludzik, Jozef 265e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 266e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfIntervalHasWrongType) 267e2362796SWludzik, Jozef { 268e2362796SWludzik, Jozef data["Interval"] = "1000"; 269e2362796SWludzik, Jozef 270e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))).WillByDefault(Return(data)); 271e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 272e2362796SWludzik, Jozef 273e2362796SWludzik, Jozef makeReportManager(); 274e2362796SWludzik, Jozef } 275