12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp" 2*d2238194SKrzysztof Grobelny #include "helpers.hpp" 3e2362796SWludzik, Jozef #include "mocks/json_storage_mock.hpp" 42f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp" 5e2362796SWludzik, Jozef #include "params/report_params.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 26*d2238194SKrzysztof Grobelny std::unique_ptr<ReportMock> reportMockPtr = 27*d2238194SKrzysztof Grobelny std::make_unique<NiceMock<ReportMock>>(reportParams.reportName()); 28*d2238194SKrzysztof Grobelny ReportMock& reportMock = *reportMockPtr; 29*d2238194SKrzysztof Grobelny 30e2362796SWludzik, Jozef std::unique_ptr<ReportManager> sut; 312f9f9b87SWludzik, Jozef 322f9f9b87SWludzik, Jozef MockFunction<void(std::string)> checkPoint; 332f9f9b87SWludzik, Jozef 34e2362796SWludzik, Jozef void SetUp() override 35e2362796SWludzik, Jozef { 36e2362796SWludzik, Jozef sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 37e2362796SWludzik, Jozef std::move(storageMockPtr), 38e2362796SWludzik, Jozef DbusEnvironment::getObjServer()); 39e2362796SWludzik, Jozef } 40e2362796SWludzik, Jozef 412f9f9b87SWludzik, Jozef void TearDown() override 422f9f9b87SWludzik, Jozef { 432f9f9b87SWludzik, Jozef DbusEnvironment::synchronizeIoc(); 442f9f9b87SWludzik, Jozef } 452f9f9b87SWludzik, Jozef 462f9f9b87SWludzik, Jozef std::pair<boost::system::error_code, std::string> 47e2362796SWludzik, Jozef addReport(const ReportParams& params) 482f9f9b87SWludzik, Jozef { 492f9f9b87SWludzik, Jozef std::promise<std::pair<boost::system::error_code, std::string>> 502f9f9b87SWludzik, Jozef addReportPromise; 512f9f9b87SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 522f9f9b87SWludzik, Jozef [&addReportPromise](boost::system::error_code ec, 532f9f9b87SWludzik, Jozef const std::string& path) { 542f9f9b87SWludzik, Jozef addReportPromise.set_value({ec, path}); 552f9f9b87SWludzik, Jozef }, 562f9f9b87SWludzik, Jozef DbusEnvironment::serviceName(), ReportManager::reportManagerPath, 57e2362796SWludzik, Jozef ReportManager::reportManagerIfaceName, "AddReport", 58e2362796SWludzik, Jozef params.reportName(), params.reportingType(), 59e2362796SWludzik, Jozef params.emitReadingUpdate(), params.logToMetricReportCollection(), 60e2362796SWludzik, Jozef static_cast<uint64_t>(params.interval().count()), 61e2362796SWludzik, Jozef params.readingParameters()); 62f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(addReportPromise.get_future()); 632f9f9b87SWludzik, Jozef } 642f9f9b87SWludzik, Jozef 652f9f9b87SWludzik, Jozef template <class T> 662f9f9b87SWludzik, Jozef static T getProperty(std::string property) 672f9f9b87SWludzik, Jozef { 682f9f9b87SWludzik, Jozef std::promise<T> propertyPromise; 692f9f9b87SWludzik, Jozef sdbusplus::asio::getProperty<T>( 702f9f9b87SWludzik, Jozef *DbusEnvironment::getBus(), DbusEnvironment::serviceName(), 712f9f9b87SWludzik, Jozef ReportManager::reportManagerPath, 722f9f9b87SWludzik, Jozef ReportManager::reportManagerIfaceName, property, 732f9f9b87SWludzik, Jozef [&propertyPromise](boost::system::error_code ec) { 742f9f9b87SWludzik, Jozef EXPECT_THAT(static_cast<bool>(ec), ::testing::Eq(false)); 752f9f9b87SWludzik, Jozef propertyPromise.set_value(T{}); 762f9f9b87SWludzik, Jozef }, 772f9f9b87SWludzik, Jozef [&propertyPromise](T t) { propertyPromise.set_value(t); }); 78f32f6fefSKrzysztof Grobelny return DbusEnvironment::waitForFuture(propertyPromise.get_future()); 792f9f9b87SWludzik, Jozef } 802f9f9b87SWludzik, Jozef }; 812f9f9b87SWludzik, Jozef 822f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval) 832f9f9b87SWludzik, Jozef { 842f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint64_t>("MinInterval"), 852f9f9b87SWludzik, Jozef Eq(static_cast<uint64_t>(ReportManager::minInterval.count()))); 862f9f9b87SWludzik, Jozef } 872f9f9b87SWludzik, Jozef 882f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports) 892f9f9b87SWludzik, Jozef { 902f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint32_t>("MaxReports"), 912f9f9b87SWludzik, Jozef Eq(ReportManager::maxReports)); 922f9f9b87SWludzik, Jozef } 932f9f9b87SWludzik, Jozef 942f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 952f9f9b87SWludzik, Jozef { 96*d2238194SKrzysztof Grobelny reportFactoryMock.expectMake(_, reportParams, Ref(*sut), Ref(storageMock)) 972f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 982f9f9b87SWludzik, Jozef 99e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1002f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 1012f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 1022f9f9b87SWludzik, Jozef } 1032f9f9b87SWludzik, Jozef 104e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice) 1052f9f9b87SWludzik, Jozef { 106*d2238194SKrzysztof Grobelny reportFactoryMock.expectMake(_, reportParams, Ref(*sut), Ref(storageMock)) 107*d2238194SKrzysztof Grobelny .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1082f9f9b87SWludzik, Jozef 109e2362796SWludzik, Jozef addReport(reportParams); 1102f9f9b87SWludzik, Jozef 111e2362796SWludzik, Jozef auto [ec, path] = addReport(reportParams); 1122f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 1132f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 1142f9f9b87SWludzik, Jozef } 1152f9f9b87SWludzik, Jozef 116e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval) 1172f9f9b87SWludzik, Jozef { 118*d2238194SKrzysztof Grobelny reportFactoryMock.expectMake(_, std::nullopt, Ref(*sut), Ref(storageMock)) 119*d2238194SKrzysztof Grobelny .Times(0); 120*d2238194SKrzysztof Grobelny reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock), _) 121*d2238194SKrzysztof Grobelny .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 { 132*d2238194SKrzysztof Grobelny reportFactoryMock.expectMake(_, std::nullopt, Ref(*sut), Ref(storageMock)) 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 { 1532f9f9b87SWludzik, Jozef InSequence seq; 154*d2238194SKrzysztof Grobelny reportFactoryMock 155*d2238194SKrzysztof Grobelny .expectMake(_, reportParams, Ref(*sut), Ref(storageMock)) 1562f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1572f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1582f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1592f9f9b87SWludzik, Jozef } 1602f9f9b87SWludzik, Jozef 161e2362796SWludzik, Jozef addReport(reportParams); 162e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1632f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1642f9f9b87SWludzik, Jozef } 1652f9f9b87SWludzik, Jozef 1662f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 1672f9f9b87SWludzik, Jozef { 1682f9f9b87SWludzik, Jozef { 1692f9f9b87SWludzik, Jozef InSequence seq; 1702f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1712f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1722f9f9b87SWludzik, Jozef } 1732f9f9b87SWludzik, Jozef 174e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1752f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1762f9f9b87SWludzik, Jozef } 1772f9f9b87SWludzik, Jozef 1782f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 1792f9f9b87SWludzik, Jozef { 1802f9f9b87SWludzik, Jozef { 1812f9f9b87SWludzik, Jozef InSequence seq; 182*d2238194SKrzysztof Grobelny reportFactoryMock 183*d2238194SKrzysztof Grobelny .expectMake(_, reportParams, Ref(*sut), Ref(storageMock)) 1842f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 1852f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 1862f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 1872f9f9b87SWludzik, Jozef } 1882f9f9b87SWludzik, Jozef 189e2362796SWludzik, Jozef addReport(reportParams); 190e2362796SWludzik, Jozef sut->removeReport(&reportMock); 191e2362796SWludzik, Jozef sut->removeReport(&reportMock); 1922f9f9b87SWludzik, Jozef checkPoint.Call("end"); 1932f9f9b87SWludzik, Jozef } 194e2362796SWludzik, Jozef 195e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager 196e2362796SWludzik, Jozef { 197e2362796SWludzik, Jozef public: 198e2362796SWludzik, Jozef using FilePath = interfaces::JsonStorage::FilePath; 199e2362796SWludzik, Jozef using DirectoryPath = interfaces::JsonStorage::DirectoryPath; 200e2362796SWludzik, Jozef 201e2362796SWludzik, Jozef void SetUp() override 202e2362796SWludzik, Jozef { 203e2362796SWludzik, Jozef ON_CALL(storageMock, list()) 204e2362796SWludzik, Jozef .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")})); 205e2362796SWludzik, Jozef ON_CALL(storageMock, load(FilePath("report1"))) 2066ccfcbf5SKrzysztof Grobelny .WillByDefault(InvokeWithoutArgs([this] { return data; })); 207e2362796SWludzik, Jozef } 208e2362796SWludzik, Jozef 209e2362796SWludzik, Jozef void makeReportManager() 210e2362796SWludzik, Jozef { 211e2362796SWludzik, Jozef sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr), 212e2362796SWludzik, Jozef std::move(storageMockPtr), 213e2362796SWludzik, Jozef DbusEnvironment::getObjServer()); 214e2362796SWludzik, Jozef } 215e2362796SWludzik, Jozef 216*d2238194SKrzysztof Grobelny static std::vector<LabeledMetricParameters> 217*d2238194SKrzysztof Grobelny convertToLabeled(const ReadingParameters& params) 218*d2238194SKrzysztof Grobelny { 219*d2238194SKrzysztof Grobelny return utils::transform(params, [](const auto& item) { 220*d2238194SKrzysztof Grobelny return LabeledMetricParameters( 221*d2238194SKrzysztof Grobelny utils::transform(std::get<0>(item), 222*d2238194SKrzysztof Grobelny [](const auto& elem) { 223*d2238194SKrzysztof Grobelny return LabeledSensorParameters("service", 224*d2238194SKrzysztof Grobelny elem); 225*d2238194SKrzysztof Grobelny }), 226*d2238194SKrzysztof Grobelny std::get<1>(item), std::get<2>(item), std::get<3>(item)); 227*d2238194SKrzysztof Grobelny }); 228*d2238194SKrzysztof Grobelny } 229*d2238194SKrzysztof Grobelny 230e2362796SWludzik, Jozef nlohmann::json data = nlohmann::json{ 231e2362796SWludzik, Jozef {"Version", Report::reportVersion}, 232e2362796SWludzik, Jozef {"Name", reportParams.reportName()}, 233e2362796SWludzik, Jozef {"ReportingType", reportParams.reportingType()}, 234e2362796SWludzik, Jozef {"EmitsReadingsUpdate", reportParams.emitReadingUpdate()}, 235e2362796SWludzik, Jozef {"LogToMetricReportsCollection", 236e2362796SWludzik, Jozef reportParams.logToMetricReportCollection()}, 237e2362796SWludzik, Jozef {"Interval", reportParams.interval().count()}, 238e2362796SWludzik, Jozef {"ReadingParameters", 239*d2238194SKrzysztof Grobelny convertToLabeled(reportParams.readingParameters())}}; 240e2362796SWludzik, Jozef }; 241e2362796SWludzik, Jozef 242e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage) 243e2362796SWludzik, Jozef { 244*d2238194SKrzysztof Grobelny reportFactoryMock.expectMake( 245*d2238194SKrzysztof Grobelny reportParams, _, Ref(storageMock), 246*d2238194SKrzysztof Grobelny ElementsAreArray(convertToLabeled(reportParams.readingParameters()))); 247e2362796SWludzik, Jozef 248e2362796SWludzik, Jozef makeReportManager(); 249e2362796SWludzik, Jozef } 250e2362796SWludzik, Jozef 251e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 252e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfVersionDoesNotMatch) 253e2362796SWludzik, Jozef { 254e2362796SWludzik, Jozef data["Version"] = Report::reportVersion - 1; 255e2362796SWludzik, Jozef 256e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 257e2362796SWludzik, Jozef 258e2362796SWludzik, Jozef makeReportManager(); 259e2362796SWludzik, Jozef } 260e2362796SWludzik, Jozef 261e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, 262e2362796SWludzik, Jozef reportManagerCtorRemoveFileIfIntervalHasWrongType) 263e2362796SWludzik, Jozef { 264e2362796SWludzik, Jozef data["Interval"] = "1000"; 265e2362796SWludzik, Jozef 266e2362796SWludzik, Jozef EXPECT_CALL(storageMock, remove(FilePath("report1"))); 267e2362796SWludzik, Jozef 268e2362796SWludzik, Jozef makeReportManager(); 269e2362796SWludzik, Jozef } 270