xref: /openbmc/telemetry/tests/src/test_report_manager.cpp (revision b8cc78ddf9cc87c83176c7bda575ceef2678d00f)
12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp"
2d2238194SKrzysztof 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"
8e8fc5751SKrzysztof Grobelny #include "utils/conversion.hpp"
9e2362796SWludzik, Jozef #include "utils/transform.hpp"
102f9f9b87SWludzik, Jozef 
112f9f9b87SWludzik, Jozef using namespace testing;
12e8fc5751SKrzysztof Grobelny using namespace std::string_literals;
13e2362796SWludzik, Jozef using namespace std::chrono_literals;
142f9f9b87SWludzik, Jozef 
152f9f9b87SWludzik, Jozef class TestReportManager : public Test
162f9f9b87SWludzik, Jozef {
172f9f9b87SWludzik, Jozef   public:
18e2362796SWludzik, Jozef     ReportParams reportParams;
192f9f9b87SWludzik, Jozef 
202f9f9b87SWludzik, Jozef     std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr =
212f9f9b87SWludzik, Jozef         std::make_unique<StrictMock<ReportFactoryMock>>();
222f9f9b87SWludzik, Jozef     ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr;
23e2362796SWludzik, Jozef 
24e2362796SWludzik, Jozef     std::unique_ptr<StorageMock> storageMockPtr =
25e2362796SWludzik, Jozef         std::make_unique<NiceMock<StorageMock>>();
26e2362796SWludzik, Jozef     StorageMock& storageMock = *storageMockPtr;
27e2362796SWludzik, Jozef 
28d2238194SKrzysztof Grobelny     std::unique_ptr<ReportMock> reportMockPtr =
29*b8cc78ddSKrzysztof Grobelny         std::make_unique<NiceMock<ReportMock>>(reportParams.reportId());
30d2238194SKrzysztof Grobelny     ReportMock& reportMock = *reportMockPtr;
31d2238194SKrzysztof Grobelny 
32e2362796SWludzik, Jozef     std::unique_ptr<ReportManager> sut;
332f9f9b87SWludzik, Jozef 
342f9f9b87SWludzik, Jozef     MockFunction<void(std::string)> checkPoint;
352f9f9b87SWludzik, Jozef 
36e2362796SWludzik, Jozef     void SetUp() override
37e2362796SWludzik, Jozef     {
38dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _))
39dcc4e193SKrzysztof Grobelny             .Times(AnyNumber());
40dcc4e193SKrzysztof Grobelny 
41e2362796SWludzik, Jozef         sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
42e2362796SWludzik, Jozef                                               std::move(storageMockPtr),
43e2362796SWludzik, Jozef                                               DbusEnvironment::getObjServer());
44e2362796SWludzik, Jozef     }
45e2362796SWludzik, Jozef 
462f9f9b87SWludzik, Jozef     void TearDown() override
472f9f9b87SWludzik, Jozef     {
482f9f9b87SWludzik, Jozef         DbusEnvironment::synchronizeIoc();
492f9f9b87SWludzik, Jozef     }
502f9f9b87SWludzik, Jozef 
5151497a0cSKrzysztof Grobelny     template <class... Args>
5251497a0cSKrzysztof Grobelny     requires(sizeof...(Args) > 1)
5351497a0cSKrzysztof Grobelny         std::pair<boost::system::error_code, std::string> addReport(
5451497a0cSKrzysztof Grobelny             Args&&... args)
552f9f9b87SWludzik, Jozef     {
562f9f9b87SWludzik, Jozef         std::promise<std::pair<boost::system::error_code, std::string>>
572f9f9b87SWludzik, Jozef             addReportPromise;
582f9f9b87SWludzik, Jozef         DbusEnvironment::getBus()->async_method_call(
592f9f9b87SWludzik, Jozef             [&addReportPromise](boost::system::error_code ec,
602f9f9b87SWludzik, Jozef                                 const std::string& path) {
612f9f9b87SWludzik, Jozef                 addReportPromise.set_value({ec, path});
622f9f9b87SWludzik, Jozef             },
632f9f9b87SWludzik, Jozef             DbusEnvironment::serviceName(), ReportManager::reportManagerPath,
64dcc4e193SKrzysztof Grobelny             ReportManager::reportManagerIfaceName, "AddReportFutureVersion",
6551497a0cSKrzysztof Grobelny             std::forward<Args>(args)...);
66f32f6fefSKrzysztof Grobelny         return DbusEnvironment::waitForFuture(addReportPromise.get_future());
672f9f9b87SWludzik, Jozef     }
682f9f9b87SWludzik, Jozef 
6951497a0cSKrzysztof Grobelny     auto addReport(const ReportParams& params)
7051497a0cSKrzysztof Grobelny     {
71*b8cc78ddSKrzysztof Grobelny         return addReport(params.reportId(), params.reportName(),
72*b8cc78ddSKrzysztof Grobelny                          utils::enumToString(params.reportingType()),
73*b8cc78ddSKrzysztof Grobelny                          utils::enumToString(params.reportUpdates()),
74*b8cc78ddSKrzysztof Grobelny                          params.appendLimit(),
75*b8cc78ddSKrzysztof Grobelny                          utils::transform(params.reportActions(),
76*b8cc78ddSKrzysztof Grobelny                                           [](const auto v) {
77*b8cc78ddSKrzysztof Grobelny                                               return utils::enumToString(v);
78*b8cc78ddSKrzysztof Grobelny                                           }),
7951497a0cSKrzysztof Grobelny                          params.interval().count(),
8051497a0cSKrzysztof Grobelny                          toReadingParameters(params.metricParameters()));
8151497a0cSKrzysztof Grobelny     }
8251497a0cSKrzysztof Grobelny 
832f9f9b87SWludzik, Jozef     template <class T>
84e28aa53dSSzymon Dompke     static T getProperty(const std::string& property)
852f9f9b87SWludzik, Jozef     {
86e28aa53dSSzymon Dompke         return DbusEnvironment::getProperty<T>(
872f9f9b87SWludzik, Jozef             ReportManager::reportManagerPath,
88e28aa53dSSzymon Dompke             ReportManager::reportManagerIfaceName, property);
8932859b63SKarol Niczyj     }
902f9f9b87SWludzik, Jozef };
912f9f9b87SWludzik, Jozef 
922f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval)
932f9f9b87SWludzik, Jozef {
942f9f9b87SWludzik, Jozef     EXPECT_THAT(getProperty<uint64_t>("MinInterval"),
95dcc4e193SKrzysztof Grobelny                 Eq(ReportManager::minInterval.count()));
962f9f9b87SWludzik, Jozef }
972f9f9b87SWludzik, Jozef 
982f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports)
992f9f9b87SWludzik, Jozef {
100503c1589SWludzik, Jozef     EXPECT_THAT(getProperty<size_t>("MaxReports"),
1012f9f9b87SWludzik, Jozef                 Eq(ReportManager::maxReports));
1022f9f9b87SWludzik, Jozef }
1032f9f9b87SWludzik, Jozef 
1042f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport)
1052f9f9b87SWludzik, Jozef {
106dcc4e193SKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
107dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
1082f9f9b87SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1092f9f9b87SWludzik, Jozef 
110e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
1112f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
1122f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(reportMock.getPath()));
1132f9f9b87SWludzik, Jozef }
1142f9f9b87SWludzik, Jozef 
115*b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
11632859b63SKarol Niczyj {
117*b8cc78ddSKrzysztof Grobelny     reportParams.reportId("ReportName");
118*b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
119*b8cc78ddSKrzysztof Grobelny 
120*b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
121*b8cc78ddSKrzysztof Grobelny 
122*b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId(""));
123*b8cc78ddSKrzysztof Grobelny 
124*b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
125*b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/ReportName"));
126*b8cc78ddSKrzysztof Grobelny }
127*b8cc78ddSKrzysztof Grobelny 
128*b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
129*b8cc78ddSKrzysztof Grobelny {
130*b8cc78ddSKrzysztof Grobelny     reportParams.reportId("Prefix/ReportName");
131*b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
132*b8cc78ddSKrzysztof Grobelny 
133*b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
134*b8cc78ddSKrzysztof Grobelny 
135*b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
136*b8cc78ddSKrzysztof Grobelny 
137*b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
138*b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/Prefix/ReportName"));
139*b8cc78ddSKrzysztof Grobelny }
140*b8cc78ddSKrzysztof Grobelny 
141*b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId)
142*b8cc78ddSKrzysztof Grobelny {
143*b8cc78ddSKrzysztof Grobelny     std::string reportId(ReportManager::maxReportIdLength, 'z');
144*b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportId);
145dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
14632859b63SKarol Niczyj 
14732859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
14832859b63SKarol Niczyj 
14932859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
150*b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportId));
15132859b63SKarol Niczyj }
15232859b63SKarol Niczyj 
15332859b63SKarol Niczyj TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
15432859b63SKarol Niczyj {
155dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
15632859b63SKarol Niczyj         .Times(0);
15732859b63SKarol Niczyj 
158*b8cc78ddSKrzysztof Grobelny     reportParams.reportId(
159*b8cc78ddSKrzysztof Grobelny         std::string(ReportManager::maxReportIdLength + 1, 'z'));
16032859b63SKarol Niczyj 
16132859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
16232859b63SKarol Niczyj 
16332859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
16432859b63SKarol Niczyj     EXPECT_THAT(path, Eq(std::string()));
16532859b63SKarol Niczyj }
16632859b63SKarol Niczyj 
167e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
1682f9f9b87SWludzik, Jozef {
169dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
170d2238194SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1712f9f9b87SWludzik, Jozef 
172e2362796SWludzik, Jozef     addReport(reportParams);
1732f9f9b87SWludzik, Jozef 
174e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
17532859b63SKarol Niczyj 
1762f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
1772f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
1782f9f9b87SWludzik, Jozef }
1792f9f9b87SWludzik, Jozef 
180e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
1812f9f9b87SWludzik, Jozef {
182dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
183d2238194SKrzysztof Grobelny         .Times(0);
1842f9f9b87SWludzik, Jozef 
18551497a0cSKrzysztof Grobelny     reportParams.reportingType(ReportingType::periodic);
186e2362796SWludzik, Jozef     reportParams.interval(reportParams.interval() - 1ms);
1872f9f9b87SWludzik, Jozef 
188e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
18932859b63SKarol Niczyj 
1902f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
1912f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
1922f9f9b87SWludzik, Jozef }
1932f9f9b87SWludzik, Jozef 
194bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
195bc766b4dSWludzik, Jozef {
196dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
197bc766b4dSWludzik, Jozef         .Times(0);
198bc766b4dSWludzik, Jozef 
19951497a0cSKrzysztof Grobelny     auto [ec, path] = addReport(
20051497a0cSKrzysztof Grobelny         reportParams.reportName(), "InvalidReportingType",
20151497a0cSKrzysztof Grobelny         utils::transform(reportParams.reportActions(),
20251497a0cSKrzysztof Grobelny                          [](const auto v) { return utils::enumToString(v); }),
20351497a0cSKrzysztof Grobelny         reportParams.interval().count(),
20451497a0cSKrzysztof Grobelny         toReadingParameters(reportParams.metricParameters()));
20532859b63SKarol Niczyj 
206bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
207bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
208bc766b4dSWludzik, Jozef }
209bc766b4dSWludzik, Jozef 
210bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreSensorsThanExpected)
211bc766b4dSWludzik, Jozef {
212dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
213bc766b4dSWludzik, Jozef         .Times(0);
214bc766b4dSWludzik, Jozef 
215dcc4e193SKrzysztof Grobelny     auto metricParams = reportParams.metricParameters();
216bc766b4dSWludzik, Jozef     for (size_t i = 0; i < ReportManager::maxReadingParams + 1; i++)
217bc766b4dSWludzik, Jozef     {
218dcc4e193SKrzysztof Grobelny         metricParams.push_back(metricParams.front());
219bc766b4dSWludzik, Jozef     }
220dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(std::move(metricParams));
221bc766b4dSWludzik, Jozef 
222bc766b4dSWludzik, Jozef     auto [ec, path] = addReport(reportParams);
22332859b63SKarol Niczyj 
224bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
225bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
226bc766b4dSWludzik, Jozef }
227bc766b4dSWludzik, Jozef 
228e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
2292f9f9b87SWludzik, Jozef {
230dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
2312f9f9b87SWludzik, Jozef         .Times(ReportManager::maxReports);
2322f9f9b87SWludzik, Jozef 
2332f9f9b87SWludzik, Jozef     for (size_t i = 0; i < ReportManager::maxReports; i++)
2342f9f9b87SWludzik, Jozef     {
235*b8cc78ddSKrzysztof Grobelny         reportParams.reportId(reportParams.reportName() + std::to_string(i));
2362f9f9b87SWludzik, Jozef 
237e2362796SWludzik, Jozef         auto [ec, path] = addReport(reportParams);
2382f9f9b87SWludzik, Jozef         EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
2392f9f9b87SWludzik, Jozef     }
2402f9f9b87SWludzik, Jozef 
241*b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportParams.reportName() +
242e2362796SWludzik, Jozef                           std::to_string(ReportManager::maxReports));
243e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
24432859b63SKarol Niczyj 
2452f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
2462f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
2472f9f9b87SWludzik, Jozef }
2482f9f9b87SWludzik, Jozef 
2492f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport)
2502f9f9b87SWludzik, Jozef {
2512f9f9b87SWludzik, Jozef     {
2522f9f9b87SWludzik, Jozef         InSequence seq;
253dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
254dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
2552f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
2562f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
2572f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
2582f9f9b87SWludzik, Jozef     }
2592f9f9b87SWludzik, Jozef 
260e2362796SWludzik, Jozef     addReport(reportParams);
261e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
2622f9f9b87SWludzik, Jozef     checkPoint.Call("end");
2632f9f9b87SWludzik, Jozef }
2642f9f9b87SWludzik, Jozef 
2652f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
2662f9f9b87SWludzik, Jozef {
2672f9f9b87SWludzik, Jozef     {
2682f9f9b87SWludzik, Jozef         InSequence seq;
2692f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
2702f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
2712f9f9b87SWludzik, Jozef     }
2722f9f9b87SWludzik, Jozef 
273e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
2742f9f9b87SWludzik, Jozef     checkPoint.Call("end");
2752f9f9b87SWludzik, Jozef }
2762f9f9b87SWludzik, Jozef 
2772f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
2782f9f9b87SWludzik, Jozef {
2792f9f9b87SWludzik, Jozef     {
2802f9f9b87SWludzik, Jozef         InSequence seq;
281dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
282dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
2832f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
2842f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
2852f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
2862f9f9b87SWludzik, Jozef     }
2872f9f9b87SWludzik, Jozef 
288e2362796SWludzik, Jozef     addReport(reportParams);
289e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
290e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
2912f9f9b87SWludzik, Jozef     checkPoint.Call("end");
2922f9f9b87SWludzik, Jozef }
293e2362796SWludzik, Jozef 
294d960e1f3SWludzik, Jozef TEST_F(TestReportManager, updateReportCallsUpdateReadingsForExistReport)
295d960e1f3SWludzik, Jozef {
296dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
297d960e1f3SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
298d960e1f3SWludzik, Jozef     EXPECT_CALL(reportMock, updateReadings());
299d960e1f3SWludzik, Jozef 
300d960e1f3SWludzik, Jozef     addReport(reportParams);
301*b8cc78ddSKrzysztof Grobelny     sut->updateReport(reportParams.reportId());
302d960e1f3SWludzik, Jozef }
303d960e1f3SWludzik, Jozef 
304d960e1f3SWludzik, Jozef TEST_F(TestReportManager, updateReportDoNothingIfReportDoesNotExist)
305d960e1f3SWludzik, Jozef {
306dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
307d960e1f3SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
308d960e1f3SWludzik, Jozef     EXPECT_CALL(reportMock, updateReadings()).Times(0);
309d960e1f3SWludzik, Jozef 
310d960e1f3SWludzik, Jozef     addReport(reportParams);
311d960e1f3SWludzik, Jozef     sut->updateReport("NotAReport");
312d960e1f3SWludzik, Jozef }
313d960e1f3SWludzik, Jozef 
314e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType :
315e8fc5751SKrzysztof Grobelny     public TestReportManager,
316e8fc5751SKrzysztof Grobelny     public WithParamInterface<OperationType>
317e8fc5751SKrzysztof Grobelny {
318e8fc5751SKrzysztof Grobelny   public:
319e8fc5751SKrzysztof Grobelny     OperationType operationType = GetParam();
320e8fc5751SKrzysztof Grobelny };
321e8fc5751SKrzysztof Grobelny 
322e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
323e8fc5751SKrzysztof Grobelny                          Values(OperationType::single, OperationType::max,
324e8fc5751SKrzysztof Grobelny                                 OperationType::min, OperationType::avg,
325e8fc5751SKrzysztof Grobelny                                 OperationType::sum));
326e8fc5751SKrzysztof Grobelny 
327e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType,
328e8fc5751SKrzysztof Grobelny        addReportWithDifferentOperationTypes)
329e8fc5751SKrzysztof Grobelny {
330dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(
331dcc4e193SKrzysztof Grobelny         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
332dcc4e193SKrzysztof Grobelny             {LabeledSensorParameters{"Service",
333*b8cc78ddSKrzysztof Grobelny                                      "/xyz/openbmc_project/sensors/power/p1",
334*b8cc78ddSKrzysztof Grobelny                                      "Metadata1"}},
335dcc4e193SKrzysztof Grobelny             operationType,
336e8fc5751SKrzysztof Grobelny             "MetricId1",
337dcc4e193SKrzysztof Grobelny             CollectionTimeScope::point,
338dcc4e193SKrzysztof Grobelny             CollectionDuration(Milliseconds(0u))}}});
339e8fc5751SKrzysztof Grobelny 
340dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
341e8fc5751SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
342e8fc5751SKrzysztof Grobelny 
343e8fc5751SKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
34432859b63SKarol Niczyj 
345e8fc5751SKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
346*b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
347e8fc5751SKrzysztof Grobelny }
348e8fc5751SKrzysztof Grobelny 
349e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager
350e2362796SWludzik, Jozef {
351e2362796SWludzik, Jozef   public:
352e2362796SWludzik, Jozef     using FilePath = interfaces::JsonStorage::FilePath;
353e2362796SWludzik, Jozef     using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
354e2362796SWludzik, Jozef 
355e2362796SWludzik, Jozef     void SetUp() override
356e2362796SWludzik, Jozef     {
357dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
358dcc4e193SKrzysztof Grobelny 
359e2362796SWludzik, Jozef         ON_CALL(storageMock, list())
360e2362796SWludzik, Jozef             .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
361e2362796SWludzik, Jozef         ON_CALL(storageMock, load(FilePath("report1")))
3626ccfcbf5SKrzysztof Grobelny             .WillByDefault(InvokeWithoutArgs([this] { return data; }));
363e2362796SWludzik, Jozef     }
364e2362796SWludzik, Jozef 
365e2362796SWludzik, Jozef     void makeReportManager()
366e2362796SWludzik, Jozef     {
367e2362796SWludzik, Jozef         sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
368e2362796SWludzik, Jozef                                               std::move(storageMockPtr),
369e2362796SWludzik, Jozef                                               DbusEnvironment::getObjServer());
370e2362796SWludzik, Jozef     }
371e2362796SWludzik, Jozef 
372e2362796SWludzik, Jozef     nlohmann::json data = nlohmann::json{
3737e098e93SLukasz Kazmierczak         {"Enabled", reportParams.enabled()},
374e2362796SWludzik, Jozef         {"Version", Report::reportVersion},
375*b8cc78ddSKrzysztof Grobelny         {"Id", reportParams.reportId()},
376e2362796SWludzik, Jozef         {"Name", reportParams.reportName()},
37751497a0cSKrzysztof Grobelny         {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
37851497a0cSKrzysztof Grobelny         {"ReportActions", reportParams.reportActions()},
379e2362796SWludzik, Jozef         {"Interval", reportParams.interval().count()},
38051497a0cSKrzysztof Grobelny         {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
3813eb56865SSzymon Dompke         {"AppendLimit", reportParams.appendLimit()},
382dcc4e193SKrzysztof Grobelny         {"ReadingParameters", reportParams.metricParameters()}};
383e2362796SWludzik, Jozef };
384e2362796SWludzik, Jozef 
385e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
386e2362796SWludzik, Jozef {
387dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
388e2362796SWludzik, Jozef 
389e2362796SWludzik, Jozef     makeReportManager();
390e2362796SWludzik, Jozef }
391e2362796SWludzik, Jozef 
392e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
393e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfVersionDoesNotMatch)
394e2362796SWludzik, Jozef {
395e2362796SWludzik, Jozef     data["Version"] = Report::reportVersion - 1;
396e2362796SWludzik, Jozef 
397e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
398e2362796SWludzik, Jozef 
399e2362796SWludzik, Jozef     makeReportManager();
400e2362796SWludzik, Jozef }
401e2362796SWludzik, Jozef 
402e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
403e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfIntervalHasWrongType)
404e2362796SWludzik, Jozef {
405e2362796SWludzik, Jozef     data["Interval"] = "1000";
406e2362796SWludzik, Jozef 
407e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
408e2362796SWludzik, Jozef 
409e2362796SWludzik, Jozef     makeReportManager();
410e2362796SWludzik, Jozef }
411