1*2f9f9b87SWludzik, Jozef #include "dbus_environment.hpp" 2*2f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp" 3*2f9f9b87SWludzik, Jozef #include "report_manager.hpp" 4*2f9f9b87SWludzik, Jozef 5*2f9f9b87SWludzik, Jozef using namespace testing; 6*2f9f9b87SWludzik, Jozef 7*2f9f9b87SWludzik, Jozef class TestReportManager : public Test 8*2f9f9b87SWludzik, Jozef { 9*2f9f9b87SWludzik, Jozef public: 10*2f9f9b87SWludzik, Jozef std::string defaultReportName = "TestReport"; 11*2f9f9b87SWludzik, Jozef std::string defaultReportType = "Periodic"; 12*2f9f9b87SWludzik, Jozef bool defaultEmitReadingSignal = true; 13*2f9f9b87SWludzik, Jozef bool defaultLogToMetricReportCollection = true; 14*2f9f9b87SWludzik, Jozef uint64_t defaultInterval = ReportManager::minInterval.count(); 15*2f9f9b87SWludzik, Jozef ReadingParameters defaultReadingParams = {}; 16*2f9f9b87SWludzik, Jozef 17*2f9f9b87SWludzik, Jozef std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr = 18*2f9f9b87SWludzik, Jozef std::make_unique<StrictMock<ReportFactoryMock>>(); 19*2f9f9b87SWludzik, Jozef ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr; 20*2f9f9b87SWludzik, Jozef ReportManager sut = ReportManager(std::move(reportFactoryMockPtr), 21*2f9f9b87SWludzik, Jozef DbusEnvironment::getObjServer()); 22*2f9f9b87SWludzik, Jozef 23*2f9f9b87SWludzik, Jozef MockFunction<void(std::string)> checkPoint; 24*2f9f9b87SWludzik, Jozef 25*2f9f9b87SWludzik, Jozef void TearDown() override 26*2f9f9b87SWludzik, Jozef { 27*2f9f9b87SWludzik, Jozef DbusEnvironment::synchronizeIoc(); 28*2f9f9b87SWludzik, Jozef } 29*2f9f9b87SWludzik, Jozef 30*2f9f9b87SWludzik, Jozef std::pair<boost::system::error_code, std::string> 31*2f9f9b87SWludzik, Jozef addReport(const std::string& reportName, 32*2f9f9b87SWludzik, Jozef uint64_t interval = ReportManager::minInterval.count()) 33*2f9f9b87SWludzik, Jozef { 34*2f9f9b87SWludzik, Jozef std::promise<std::pair<boost::system::error_code, std::string>> 35*2f9f9b87SWludzik, Jozef addReportPromise; 36*2f9f9b87SWludzik, Jozef DbusEnvironment::getBus()->async_method_call( 37*2f9f9b87SWludzik, Jozef [&addReportPromise](boost::system::error_code ec, 38*2f9f9b87SWludzik, Jozef const std::string& path) { 39*2f9f9b87SWludzik, Jozef addReportPromise.set_value({ec, path}); 40*2f9f9b87SWludzik, Jozef }, 41*2f9f9b87SWludzik, Jozef DbusEnvironment::serviceName(), ReportManager::reportManagerPath, 42*2f9f9b87SWludzik, Jozef ReportManager::reportManagerIfaceName, "AddReport", reportName, 43*2f9f9b87SWludzik, Jozef defaultReportType, defaultEmitReadingSignal, 44*2f9f9b87SWludzik, Jozef defaultLogToMetricReportCollection, interval, defaultReadingParams); 45*2f9f9b87SWludzik, Jozef return DbusEnvironment::waitForFuture(addReportPromise.get_future()) 46*2f9f9b87SWludzik, Jozef .value_or(std::pair<boost::system::error_code, std::string>{}); 47*2f9f9b87SWludzik, Jozef } 48*2f9f9b87SWludzik, Jozef 49*2f9f9b87SWludzik, Jozef template <class T> 50*2f9f9b87SWludzik, Jozef static T getProperty(std::string property) 51*2f9f9b87SWludzik, Jozef { 52*2f9f9b87SWludzik, Jozef std::promise<T> propertyPromise; 53*2f9f9b87SWludzik, Jozef sdbusplus::asio::getProperty<T>( 54*2f9f9b87SWludzik, Jozef *DbusEnvironment::getBus(), DbusEnvironment::serviceName(), 55*2f9f9b87SWludzik, Jozef ReportManager::reportManagerPath, 56*2f9f9b87SWludzik, Jozef ReportManager::reportManagerIfaceName, property, 57*2f9f9b87SWludzik, Jozef [&propertyPromise](boost::system::error_code ec) { 58*2f9f9b87SWludzik, Jozef EXPECT_THAT(static_cast<bool>(ec), ::testing::Eq(false)); 59*2f9f9b87SWludzik, Jozef propertyPromise.set_value(T{}); 60*2f9f9b87SWludzik, Jozef }, 61*2f9f9b87SWludzik, Jozef [&propertyPromise](T t) { propertyPromise.set_value(t); }); 62*2f9f9b87SWludzik, Jozef return DbusEnvironment::waitForFuture(propertyPromise.get_future()) 63*2f9f9b87SWludzik, Jozef .value_or(T{}); 64*2f9f9b87SWludzik, Jozef } 65*2f9f9b87SWludzik, Jozef }; 66*2f9f9b87SWludzik, Jozef 67*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval) 68*2f9f9b87SWludzik, Jozef { 69*2f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint64_t>("MinInterval"), 70*2f9f9b87SWludzik, Jozef Eq(static_cast<uint64_t>(ReportManager::minInterval.count()))); 71*2f9f9b87SWludzik, Jozef } 72*2f9f9b87SWludzik, Jozef 73*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports) 74*2f9f9b87SWludzik, Jozef { 75*2f9f9b87SWludzik, Jozef EXPECT_THAT(getProperty<uint32_t>("MaxReports"), 76*2f9f9b87SWludzik, Jozef Eq(ReportManager::maxReports)); 77*2f9f9b87SWludzik, Jozef } 78*2f9f9b87SWludzik, Jozef 79*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport) 80*2f9f9b87SWludzik, Jozef { 81*2f9f9b87SWludzik, Jozef auto reportMockPtr = 82*2f9f9b87SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(defaultReportName); 83*2f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 84*2f9f9b87SWludzik, Jozef 85*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 86*2f9f9b87SWludzik, Jozef make(defaultReportName, defaultReportType, 87*2f9f9b87SWludzik, Jozef defaultEmitReadingSignal, 88*2f9f9b87SWludzik, Jozef defaultLogToMetricReportCollection, 89*2f9f9b87SWludzik, Jozef std::chrono::milliseconds{defaultInterval}, 90*2f9f9b87SWludzik, Jozef defaultReadingParams, Ref(sut))) 91*2f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 92*2f9f9b87SWludzik, Jozef 93*2f9f9b87SWludzik, Jozef auto [ec, path] = addReport(defaultReportName); 94*2f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 95*2f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(reportMock.getPath())); 96*2f9f9b87SWludzik, Jozef } 97*2f9f9b87SWludzik, Jozef 98*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, failToAddReportTwice) 99*2f9f9b87SWludzik, Jozef { 100*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _)); 101*2f9f9b87SWludzik, Jozef 102*2f9f9b87SWludzik, Jozef addReport(defaultReportName); 103*2f9f9b87SWludzik, Jozef 104*2f9f9b87SWludzik, Jozef auto [ec, path] = addReport(defaultReportName); 105*2f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists)); 106*2f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 107*2f9f9b87SWludzik, Jozef } 108*2f9f9b87SWludzik, Jozef 109*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, failToAddReportWithInvalidInterval) 110*2f9f9b87SWludzik, Jozef { 111*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _)).Times(0); 112*2f9f9b87SWludzik, Jozef 113*2f9f9b87SWludzik, Jozef uint64_t interval = defaultInterval - 1; 114*2f9f9b87SWludzik, Jozef 115*2f9f9b87SWludzik, Jozef auto [ec, path] = addReport(defaultReportName, interval); 116*2f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument)); 117*2f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 118*2f9f9b87SWludzik, Jozef } 119*2f9f9b87SWludzik, Jozef 120*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, failToAddReportWhenMaxReportIsReached) 121*2f9f9b87SWludzik, Jozef { 122*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _)) 123*2f9f9b87SWludzik, Jozef .Times(ReportManager::maxReports); 124*2f9f9b87SWludzik, Jozef 125*2f9f9b87SWludzik, Jozef for (size_t i = 0; i < ReportManager::maxReports; i++) 126*2f9f9b87SWludzik, Jozef { 127*2f9f9b87SWludzik, Jozef std::string reportName = defaultReportName + std::to_string(i); 128*2f9f9b87SWludzik, Jozef 129*2f9f9b87SWludzik, Jozef auto [ec, path] = addReport(reportName); 130*2f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::success)); 131*2f9f9b87SWludzik, Jozef } 132*2f9f9b87SWludzik, Jozef 133*2f9f9b87SWludzik, Jozef std::string reportName = 134*2f9f9b87SWludzik, Jozef defaultReportName + std::to_string(ReportManager::maxReports); 135*2f9f9b87SWludzik, Jozef auto [ec, path] = addReport(reportName); 136*2f9f9b87SWludzik, Jozef EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open)); 137*2f9f9b87SWludzik, Jozef EXPECT_THAT(path, Eq(std::string())); 138*2f9f9b87SWludzik, Jozef } 139*2f9f9b87SWludzik, Jozef 140*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport) 141*2f9f9b87SWludzik, Jozef { 142*2f9f9b87SWludzik, Jozef auto reportMockPtr = 143*2f9f9b87SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(defaultReportName); 144*2f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 145*2f9f9b87SWludzik, Jozef 146*2f9f9b87SWludzik, Jozef { 147*2f9f9b87SWludzik, Jozef InSequence seq; 148*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, make(_, _, _, _, _, _, _)) 149*2f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 150*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 151*2f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 152*2f9f9b87SWludzik, Jozef } 153*2f9f9b87SWludzik, Jozef 154*2f9f9b87SWludzik, Jozef addReport(defaultReportName); 155*2f9f9b87SWludzik, Jozef sut.removeReport(&reportMock); 156*2f9f9b87SWludzik, Jozef checkPoint.Call("end"); 157*2f9f9b87SWludzik, Jozef } 158*2f9f9b87SWludzik, Jozef 159*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect) 160*2f9f9b87SWludzik, Jozef { 161*2f9f9b87SWludzik, Jozef auto reportMockPtr = 162*2f9f9b87SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(defaultReportName); 163*2f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 164*2f9f9b87SWludzik, Jozef 165*2f9f9b87SWludzik, Jozef { 166*2f9f9b87SWludzik, Jozef InSequence seq; 167*2f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 168*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 169*2f9f9b87SWludzik, Jozef } 170*2f9f9b87SWludzik, Jozef 171*2f9f9b87SWludzik, Jozef sut.removeReport(&reportMock); 172*2f9f9b87SWludzik, Jozef checkPoint.Call("end"); 173*2f9f9b87SWludzik, Jozef } 174*2f9f9b87SWludzik, Jozef 175*2f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect) 176*2f9f9b87SWludzik, Jozef { 177*2f9f9b87SWludzik, Jozef auto reportMockPtr = 178*2f9f9b87SWludzik, Jozef std::make_unique<NiceMock<ReportMock>>(defaultReportName); 179*2f9f9b87SWludzik, Jozef auto& reportMock = *reportMockPtr; 180*2f9f9b87SWludzik, Jozef 181*2f9f9b87SWludzik, Jozef { 182*2f9f9b87SWludzik, Jozef InSequence seq; 183*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportFactoryMock, 184*2f9f9b87SWludzik, Jozef make(defaultReportName, _, _, _, _, _, _)) 185*2f9f9b87SWludzik, Jozef .WillOnce(Return(ByMove(std::move(reportMockPtr)))); 186*2f9f9b87SWludzik, Jozef EXPECT_CALL(reportMock, Die()); 187*2f9f9b87SWludzik, Jozef EXPECT_CALL(checkPoint, Call("end")); 188*2f9f9b87SWludzik, Jozef } 189*2f9f9b87SWludzik, Jozef 190*2f9f9b87SWludzik, Jozef addReport(defaultReportName); 191*2f9f9b87SWludzik, Jozef sut.removeReport(&reportMock); 192*2f9f9b87SWludzik, Jozef sut.removeReport(&reportMock); 193*2f9f9b87SWludzik, Jozef checkPoint.Call("end"); 194*2f9f9b87SWludzik, Jozef } 195