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