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" 5*6ccfcbf5SKrzysztof Grobelny #include "printers.hpp" 6e2362796SWludzik, Jozef #include "report.hpp" 72f9f9b87SWludzik, Jozef #include "report_manager.hpp" 8e2362796SWludzik, Jozef #include "utils/transform.hpp" 92f9f9b87SWludzik, Jozef 102f9f9b87SWludzik, Jozef using namespace testing; 11e2362796SWludzik, Jozef using namespace std::chrono_literals; 122f9f9b87SWludzik, Jozef 132f9f9b87SWludzik, Jozef class TestReportManager : public Test 142f9f9b87SWludzik, Jozef { 152f9f9b87SWludzik, Jozef public: 16e2362796SWludzik, Jozef ReportParams reportParams; 172f9f9b87SWludzik, Jozef 182f9f9b87SWludzik, Jozef std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr = 192f9f9b87SWludzik, Jozef std::make_unique<StrictMock<ReportFactoryMock>>(); 202f9f9b87SWludzik, Jozef ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr; 21e2362796SWludzik, Jozef 22e2362796SWludzik, Jozef std::unique_ptr<StorageMock> storageMockPtr = 23e2362796SWludzik, Jozef std::make_unique<NiceMock<StorageMock>>(); 24e2362796SWludzik, Jozef StorageMock& storageMock = *storageMockPtr; 25e2362796SWludzik, Jozef 26e2362796SWludzik, Jozef std::unique_ptr<ReportManager> sut; 272f9f9b87SWludzik, Jozef 282f9f9b87SWludzik, Jozef MockFunction<void(std::string)> checkPoint; 292f9f9b87SWludzik, Jozef 30e2362796SWludzik, Jozef void SetUp() override 31e2362796SWludzik, Jozef { 32e2362796SWludzik, Jozef sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 33e2362796SWludzik, Jozef std::move(storageMockPtr), 34e2362796SWludzik, Jozef DbusEnvironment::getObjServer()); 35e2362796SWludzik, Jozef } 36e2362796SWludzik, Jozef 372f9f9b87SWludzik, Jozef void TearDown() override 382f9f9b87SWludzik, Jozef { 392f9f9b87SWludzik, Jozef DbusEnvironment::synchronizeIoc(); 402f9f9b87SWludzik, Jozef } 412f9f9b87SWludzik, Jozef 422f9f9b87SWludzik, Jozef std::pair<boost::system::error_code, std::string> 43e2362796SWludzik, Jozef addReport(const ReportParams& params) 442f9f9b87SWludzik, Jozef { 452f9f9b87SWludzik, Jozef std::promise<std::pair<boost::system::error_code, std::string>> 462f9f9b87SWludzik, Jozef addReportPromise; 472f9f9b87SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 482f9f9b87SWludzik, Jozef [&addReportPromise](boost::system::error_code ec, 492f9f9b87SWludzik, Jozef const std::string& path) { 502f9f9b87SWludzik, Jozef addReportPromise.set_value({ec, path}); 512f9f9b87SWludzik, Jozef }, 522f9f9b87SWludzik, Jozef DbusEnvironment::serviceName(), ReportManager::reportManagerPath, 53e2362796SWludzik, Jozef ReportManager::reportManagerIfaceName, "AddReport", 54e2362796SWludzik, Jozef params.reportName(), params.reportingType(), 55e2362796SWludzik, Jozef params.emitReadingUpdate(), params.logToMetricReportCollection(), 56e2362796SWludzik, Jozef static_cast<uint64_t>(params.interval().count()), 57e2362796SWludzik, Jozef params.readingParameters()); 58f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(addReportPromise.get_future()); 592f9f9b87SWludzik, Jozef } 602f9f9b87SWludzik, Jozef 612f9f9b87SWludzik, Jozef template <class T> 622f9f9b87SWludzik, Jozef static T getProperty(std::string property) 632f9f9b87SWludzik, Jozef { 642f9f9b87SWludzik, Jozef std::promise<T> propertyPromise; 652f9f9b87SWludzik, Jozef sdbusplus::asio::getProperty<T>( 662f9f9b87SWludzik, Jozef *DbusEnvironment::getBus(), DbusEnvironment::serviceName(), 672f9f9b87SWludzik, Jozef ReportManager::reportManagerPath, 682f9f9b87SWludzik, Jozef ReportManager::reportManagerIfaceName, property, 692f9f9b87SWludzik, Jozef [&propertyPromise](boost::system::error_code ec) { 702f9f9b87SWludzik, Jozef EXPECT_THAT(static_cast<bool>(ec), ::testing::Eq(false)); 712f9f9b87SWludzik, Jozef propertyPromise.set_value(T{}); 722f9f9b87SWludzik, Jozef }, 732f9f9b87SWludzik, Jozef [&propertyPromise](T t) { propertyPromise.set_value(t); }); 74f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(propertyPromise.get_future()); 752f9f9b87SWludzik, Jozef } 762f9f9b87SWludzik, Jozef }; 772f9f9b87SWludzik, Jozef 782f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval) 792f9f9b87SWludzik, Jozef { 802f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint64_t>("MinInterval"), 812f9f9b87SWludzik, Jozef Eq(static_cast<uint64_t>(ReportManager::minInterval.count()))); 822f9f9b87SWludzik, Jozef } 832f9f9b87SWludzik, Jozef 842f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports) 852f9f9b87SWludzik, Jozef { 862f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint32_t>("MaxReports"), 872f9f9b87SWludzik, Jozef Eq(ReportManager::maxReports)); 882f9f9b87SWludzik, Jozef } 892f9f9b87SWludzik, Jozef 902f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 912f9f9b87SWludzik, Jozef { 922f9f9b87SWludzik, Jozef auto reportMockPtr = 93e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 942f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 952f9f9b87SWludzik, Jozef 962f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 97e2362796SWludzik, Jozef make(_, reportParams.reportName(), reportParams.reportingType(), 98e2362796SWludzik, Jozef reportParams.emitReadingUpdate(), 99e2362796SWludzik, Jozef reportParams.logToMetricReportCollection(), 100e2362796SWludzik, Jozef reportParams.interval(), reportParams.readingParameters(), 101e2362796SWludzik, Jozef Ref(*sut), Ref(storageMock))) 1022f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1032f9f9b87SWludzik, Jozef 104e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1052f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1062f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 1072f9f9b87SWludzik, Jozef } 1082f9f9b87SWludzik, Jozef 109e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice) 1102f9f9b87SWludzik, Jozef { 111e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _, _, _)); 1122f9f9b87SWludzik, Jozef 113e2362796SWludzik, Jozef addReport(reportParams); 1142f9f9b87SWludzik, Jozef 115e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1162f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 1172f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1182f9f9b87SWludzik, Jozef } 1192f9f9b87SWludzik, Jozef 120e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval) 1212f9f9b87SWludzik, Jozef { 122e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make).Times(0); 1232f9f9b87SWludzik, Jozef 124e2362796SWludzik, Jozef reportParams.interval(reportParams.interval() - 1ms); 1252f9f9b87SWludzik, Jozef 126e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1272f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 1282f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1292f9f9b87SWludzik, Jozef } 1302f9f9b87SWludzik, Jozef 131e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached) 1322f9f9b87SWludzik, Jozef { 133e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _, _, _)) 1342f9f9b87SWludzik, Jozef .Times(ReportManager::maxReports); 1352f9f9b87SWludzik, Jozef 1362f9f9b87SWludzik, Jozef for (size_t i = 0; i < ReportManager::maxReports; i++) 1372f9f9b87SWludzik, Jozef { 138e2362796SWludzik, Jozef reportParams.reportName(reportParams.reportName() + std::to_string(i)); 1392f9f9b87SWludzik, Jozef 140e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1412f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1422f9f9b87SWludzik, Jozef } 1432f9f9b87SWludzik, Jozef 144e2362796SWludzik, Jozef reportParams.reportName(reportParams.reportName() + 145e2362796SWludzik, Jozef std::to_string(ReportManager::maxReports)); 146e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1472f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open)); 1482f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1492f9f9b87SWludzik, Jozef } 1502f9f9b87SWludzik, Jozef 1512f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport) 1522f9f9b87SWludzik, Jozef { 1532f9f9b87SWludzik, Jozef auto reportMockPtr = 154e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 1552f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 1562f9f9b87SWludzik, Jozef 1572f9f9b87SWludzik, Jozef { 1582f9f9b87SWludzik, Jozef InSequence seq; 159e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _, _, _)) 1602f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1612f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1622f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1632f9f9b87SWludzik, Jozef } 1642f9f9b87SWludzik, Jozef 165e2362796SWludzik, Jozef addReport(reportParams); 166e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1672f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1682f9f9b87SWludzik, Jozef } 1692f9f9b87SWludzik, Jozef 1702f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 1712f9f9b87SWludzik, Jozef { 1722f9f9b87SWludzik, Jozef auto reportMockPtr = 173e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 1742f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 1752f9f9b87SWludzik, Jozef 1762f9f9b87SWludzik, Jozef { 1772f9f9b87SWludzik, Jozef InSequence seq; 1782f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1792f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1802f9f9b87SWludzik, Jozef } 1812f9f9b87SWludzik, Jozef 182e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1832f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1842f9f9b87SWludzik, Jozef } 1852f9f9b87SWludzik, Jozef 1862f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 1872f9f9b87SWludzik, Jozef { 1882f9f9b87SWludzik, Jozef auto reportMockPtr = 189e2362796SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 1902f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 1912f9f9b87SWludzik, Jozef 1922f9f9b87SWludzik, Jozef { 1932f9f9b87SWludzik, Jozef InSequence seq; 1942f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 195e2362796SWludzik, Jozef make(_, reportParams.reportName(), _, _, _, _, _, _, _)) 1962f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1972f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1982f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1992f9f9b87SWludzik, Jozef } 2002f9f9b87SWludzik, Jozef 201e2362796SWludzik, Jozef addReport(reportParams); 202e2362796SWludzik, Jozef sut->removeReport(&reportMock); 203e2362796SWludzik, Jozef sut->removeReport(&reportMock); 2042f9f9b87SWludzik, Jozef checkPoint.Call("end"); 2052f9f9b87SWludzik, Jozef } 206e2362796SWludzik, Jozef 207e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager 208e2362796SWludzik, Jozef { 209e2362796SWludzik, Jozef public: 210e2362796SWludzik, Jozef using FilePath = interfaces::JsonStorage::FilePath; 211e2362796SWludzik, Jozef using DirectoryPath = interfaces::JsonStorage::DirectoryPath; 212e2362796SWludzik, Jozef 213e2362796SWludzik, Jozef void SetUp() override 214e2362796SWludzik, Jozef { 215e2362796SWludzik, Jozef ON_CALL(storageMock, list()) 216e2362796SWludzik, Jozef .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")})); 217e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))) 218*6ccfcbf5SKrzysztof Grobelny .WillByDefault(InvokeWithoutArgs([this] { return data; })); 219e2362796SWludzik, Jozef } 220e2362796SWludzik, Jozef 221e2362796SWludzik, Jozef void makeReportManager() 222e2362796SWludzik, Jozef { 223e2362796SWludzik, Jozef sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 224e2362796SWludzik, Jozef std::move(storageMockPtr), 225e2362796SWludzik, Jozef DbusEnvironment::getObjServer()); 226e2362796SWludzik, Jozef } 227e2362796SWludzik, Jozef 228e2362796SWludzik, Jozef nlohmann::json data = nlohmann::json{ 229e2362796SWludzik, Jozef {"Version", Report::reportVersion}, 230e2362796SWludzik, Jozef {"Name", reportParams.reportName()}, 231e2362796SWludzik, Jozef {"ReportingType", reportParams.reportingType()}, 232e2362796SWludzik, Jozef {"EmitsReadingsUpdate", reportParams.emitReadingUpdate()}, 233e2362796SWludzik, Jozef {"LogToMetricReportsCollection", 234e2362796SWludzik, Jozef reportParams.logToMetricReportCollection()}, 235e2362796SWludzik, Jozef {"Interval", reportParams.interval().count()}, 236e2362796SWludzik, Jozef {"ReadingParameters", 237e2362796SWludzik, Jozef utils::transform(reportParams.readingParameters(), 238e2362796SWludzik, Jozef [](const auto& item) { 239e2362796SWludzik, Jozef return LabeledReadingParameter::to_json(item); 240e2362796SWludzik, Jozef })}}; 241e2362796SWludzik, Jozef }; 242e2362796SWludzik, Jozef 243e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage) 244e2362796SWludzik, Jozef { 245e2362796SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 246e2362796SWludzik, Jozef make(_, reportParams.reportName(), reportParams.reportingType(), 247e2362796SWludzik, Jozef reportParams.emitReadingUpdate(), 248e2362796SWludzik, Jozef reportParams.logToMetricReportCollection(), 249e2362796SWludzik, Jozef reportParams.interval(), reportParams.readingParameters(), 250e2362796SWludzik, Jozef _, Ref(storageMock))); 251e2362796SWludzik, Jozef 252e2362796SWludzik, Jozef makeReportManager(); 253e2362796SWludzik, Jozef } 254e2362796SWludzik, Jozef 255e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 256e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfVersionDoesNotMatch) 257e2362796SWludzik, Jozef { 258e2362796SWludzik, Jozef data["Version"] = Report::reportVersion - 1; 259e2362796SWludzik, Jozef 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 EXPECT_CALL(storageMock, remove(FilePath("report1"))); 271e2362796SWludzik, Jozef 272e2362796SWludzik, Jozef makeReportManager(); 273e2362796SWludzik, Jozef } 274