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