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