xref: /openbmc/telemetry/tests/src/test_report_manager.cpp (revision 2f9f9b875ad61666b1308a94fa700ae6e9d5ed1e)
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