xref: /openbmc/telemetry/tests/src/test_report_manager.cpp (revision f7ea2997ae6b4fad0dc35f9afa9b488d774f2ee1)
12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp"
2d2238194SKrzysztof Grobelny #include "helpers.hpp"
3b4ef22e4SSzymon Dompke #include "interfaces/trigger_manager.hpp"
4e2362796SWludzik, Jozef #include "mocks/json_storage_mock.hpp"
52f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp"
6b4ef22e4SSzymon Dompke #include "mocks/trigger_manager_mock.hpp"
7e2362796SWludzik, Jozef #include "params/report_params.hpp"
8e2362796SWludzik, Jozef #include "report.hpp"
92f9f9b87SWludzik, Jozef #include "report_manager.hpp"
10e8fc5751SKrzysztof Grobelny #include "utils/conversion.hpp"
11e2362796SWludzik, Jozef #include "utils/transform.hpp"
122f9f9b87SWludzik, Jozef 
132f9f9b87SWludzik, Jozef using namespace testing;
14e8fc5751SKrzysztof Grobelny using namespace std::string_literals;
15e2362796SWludzik, Jozef using namespace std::chrono_literals;
162f9f9b87SWludzik, Jozef 
172f9f9b87SWludzik, Jozef class TestReportManager : public Test
182f9f9b87SWludzik, Jozef {
192f9f9b87SWludzik, Jozef   public:
20e2362796SWludzik, Jozef     ReportParams reportParams;
212f9f9b87SWludzik, Jozef 
222f9f9b87SWludzik, Jozef     std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr =
232f9f9b87SWludzik, Jozef         std::make_unique<StrictMock<ReportFactoryMock>>();
242f9f9b87SWludzik, Jozef     ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr;
25e2362796SWludzik, Jozef 
26e2362796SWludzik, Jozef     std::unique_ptr<StorageMock> storageMockPtr =
27e2362796SWludzik, Jozef         std::make_unique<NiceMock<StorageMock>>();
28e2362796SWludzik, Jozef     StorageMock& storageMock = *storageMockPtr;
29e2362796SWludzik, Jozef 
30d2238194SKrzysztof Grobelny     std::unique_ptr<ReportMock> reportMockPtr =
31b8cc78ddSKrzysztof Grobelny         std::make_unique<NiceMock<ReportMock>>(reportParams.reportId());
32d2238194SKrzysztof Grobelny     ReportMock& reportMock = *reportMockPtr;
33d2238194SKrzysztof Grobelny 
34e2362796SWludzik, Jozef     std::unique_ptr<ReportManager> sut;
352f9f9b87SWludzik, Jozef 
362f9f9b87SWludzik, Jozef     MockFunction<void(std::string)> checkPoint;
372f9f9b87SWludzik, Jozef 
38e2362796SWludzik, Jozef     void SetUp() override
39e2362796SWludzik, Jozef     {
40dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _))
41dcc4e193SKrzysztof Grobelny             .Times(AnyNumber());
42dcc4e193SKrzysztof Grobelny 
43e6d48874SKrzysztof Grobelny         sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
44e6d48874SKrzysztof Grobelny                                               std::move(storageMockPtr),
45e6d48874SKrzysztof Grobelny                                               DbusEnvironment::getObjServer());
46e2362796SWludzik, Jozef     }
47e2362796SWludzik, Jozef 
482f9f9b87SWludzik, Jozef     void TearDown() override
492f9f9b87SWludzik, Jozef     {
502f9f9b87SWludzik, Jozef         DbusEnvironment::synchronizeIoc();
512f9f9b87SWludzik, Jozef     }
522f9f9b87SWludzik, Jozef 
5351497a0cSKrzysztof Grobelny     template <class... Args>
5451497a0cSKrzysztof Grobelny     requires(sizeof...(Args) > 1)
5551497a0cSKrzysztof Grobelny         std::pair<boost::system::error_code, std::string> addReport(
5651497a0cSKrzysztof Grobelny             Args&&... args)
572f9f9b87SWludzik, Jozef     {
582f9f9b87SWludzik, Jozef         std::promise<std::pair<boost::system::error_code, std::string>>
592f9f9b87SWludzik, Jozef             addReportPromise;
602f9f9b87SWludzik, Jozef         DbusEnvironment::getBus()->async_method_call(
612f9f9b87SWludzik, Jozef             [&addReportPromise](boost::system::error_code ec,
622f9f9b87SWludzik, Jozef                                 const std::string& path) {
632f9f9b87SWludzik, Jozef                 addReportPromise.set_value({ec, path});
642f9f9b87SWludzik, Jozef             },
652f9f9b87SWludzik, Jozef             DbusEnvironment::serviceName(), ReportManager::reportManagerPath,
66dcc4e193SKrzysztof Grobelny             ReportManager::reportManagerIfaceName, "AddReportFutureVersion",
6751497a0cSKrzysztof Grobelny             std::forward<Args>(args)...);
68f32f6fefSKrzysztof Grobelny         return DbusEnvironment::waitForFuture(addReportPromise.get_future());
692f9f9b87SWludzik, Jozef     }
702f9f9b87SWludzik, Jozef 
7151497a0cSKrzysztof Grobelny     auto addReport(const ReportParams& params)
7251497a0cSKrzysztof Grobelny     {
73b8cc78ddSKrzysztof Grobelny         return addReport(params.reportId(), params.reportName(),
74b8cc78ddSKrzysztof Grobelny                          utils::enumToString(params.reportingType()),
75b8cc78ddSKrzysztof Grobelny                          utils::enumToString(params.reportUpdates()),
76b8cc78ddSKrzysztof Grobelny                          params.appendLimit(),
77b8cc78ddSKrzysztof Grobelny                          utils::transform(params.reportActions(),
78b8cc78ddSKrzysztof Grobelny                                           [](const auto v) {
79b8cc78ddSKrzysztof Grobelny                                               return utils::enumToString(v);
80b8cc78ddSKrzysztof Grobelny                                           }),
8151497a0cSKrzysztof Grobelny                          params.interval().count(),
8251497a0cSKrzysztof Grobelny                          toReadingParameters(params.metricParameters()));
8351497a0cSKrzysztof Grobelny     }
8451497a0cSKrzysztof Grobelny 
852f9f9b87SWludzik, Jozef     template <class T>
86e28aa53dSSzymon Dompke     static T getProperty(const std::string& property)
872f9f9b87SWludzik, Jozef     {
88e28aa53dSSzymon Dompke         return DbusEnvironment::getProperty<T>(
892f9f9b87SWludzik, Jozef             ReportManager::reportManagerPath,
90e28aa53dSSzymon Dompke             ReportManager::reportManagerIfaceName, property);
9132859b63SKarol Niczyj     }
922f9f9b87SWludzik, Jozef };
932f9f9b87SWludzik, Jozef 
942f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval)
952f9f9b87SWludzik, Jozef {
962f9f9b87SWludzik, Jozef     EXPECT_THAT(getProperty<uint64_t>("MinInterval"),
97dcc4e193SKrzysztof Grobelny                 Eq(ReportManager::minInterval.count()));
982f9f9b87SWludzik, Jozef }
992f9f9b87SWludzik, Jozef 
1002f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports)
1012f9f9b87SWludzik, Jozef {
102503c1589SWludzik, Jozef     EXPECT_THAT(getProperty<size_t>("MaxReports"),
1032f9f9b87SWludzik, Jozef                 Eq(ReportManager::maxReports));
1042f9f9b87SWludzik, Jozef }
1052f9f9b87SWludzik, Jozef 
10660fee077SKrzysztof Grobelny TEST_F(TestReportManager, returnsPropertySupportedOperationTypes)
10760fee077SKrzysztof Grobelny {
10860fee077SKrzysztof Grobelny     EXPECT_THAT(
10960fee077SKrzysztof Grobelny         getProperty<std::vector<std::string>>("SupportedOperationTypes"),
11060fee077SKrzysztof Grobelny         UnorderedElementsAre("Maximum", "Minimum", "Average", "Summation"));
11160fee077SKrzysztof Grobelny }
11260fee077SKrzysztof Grobelny 
1132f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport)
1142f9f9b87SWludzik, Jozef {
115dcc4e193SKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
116dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
1172f9f9b87SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1182f9f9b87SWludzik, Jozef 
119e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
1202f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
1212f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(reportMock.getPath()));
1222f9f9b87SWludzik, Jozef }
1232f9f9b87SWludzik, Jozef 
124*f7ea2997SKrzysztof Grobelny TEST_F(TestReportManager, addOnChangeReport)
125*f7ea2997SKrzysztof Grobelny {
126*f7ea2997SKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
127*f7ea2997SKrzysztof Grobelny     reportFactoryMock
128*f7ea2997SKrzysztof Grobelny         .expectMake(reportParams.reportingType(ReportingType::onChange),
129*f7ea2997SKrzysztof Grobelny                     Ref(*sut), Ref(storageMock))
130*f7ea2997SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
131*f7ea2997SKrzysztof Grobelny 
132*f7ea2997SKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
133*f7ea2997SKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
134*f7ea2997SKrzysztof Grobelny     EXPECT_THAT(path, Eq(reportMock.getPath()));
135*f7ea2997SKrzysztof Grobelny }
136*f7ea2997SKrzysztof Grobelny 
137b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
13832859b63SKarol Niczyj {
139b8cc78ddSKrzysztof Grobelny     reportParams.reportId("ReportName");
140b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
141b8cc78ddSKrzysztof Grobelny 
142b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
143b8cc78ddSKrzysztof Grobelny 
144b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId(""));
145b8cc78ddSKrzysztof Grobelny 
146b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
147b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/ReportName"));
148b8cc78ddSKrzysztof Grobelny }
149b8cc78ddSKrzysztof Grobelny 
150b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
151b8cc78ddSKrzysztof Grobelny {
152b8cc78ddSKrzysztof Grobelny     reportParams.reportId("Prefix/ReportName");
153b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
154b8cc78ddSKrzysztof Grobelny 
155b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
156b8cc78ddSKrzysztof Grobelny 
157b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
158b8cc78ddSKrzysztof Grobelny 
159b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
160b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/Prefix/ReportName"));
161b8cc78ddSKrzysztof Grobelny }
162b8cc78ddSKrzysztof Grobelny 
163b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId)
164b8cc78ddSKrzysztof Grobelny {
165b8cc78ddSKrzysztof Grobelny     std::string reportId(ReportManager::maxReportIdLength, 'z');
166b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportId);
167dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
16832859b63SKarol Niczyj 
16932859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
17032859b63SKarol Niczyj 
17132859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
172b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportId));
17332859b63SKarol Niczyj }
17432859b63SKarol Niczyj 
17532859b63SKarol Niczyj TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
17632859b63SKarol Niczyj {
177dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
17832859b63SKarol Niczyj         .Times(0);
17932859b63SKarol Niczyj 
180b8cc78ddSKrzysztof Grobelny     reportParams.reportId(
181b8cc78ddSKrzysztof Grobelny         std::string(ReportManager::maxReportIdLength + 1, 'z'));
18232859b63SKarol Niczyj 
18332859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
18432859b63SKarol Niczyj 
18532859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
18632859b63SKarol Niczyj     EXPECT_THAT(path, Eq(std::string()));
18732859b63SKarol Niczyj }
18832859b63SKarol Niczyj 
189e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
1902f9f9b87SWludzik, Jozef {
191dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
192d2238194SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1932f9f9b87SWludzik, Jozef 
194e2362796SWludzik, Jozef     addReport(reportParams);
1952f9f9b87SWludzik, Jozef 
196e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
19732859b63SKarol Niczyj 
1982f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
1992f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
2002f9f9b87SWludzik, Jozef }
2012f9f9b87SWludzik, Jozef 
202e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
2032f9f9b87SWludzik, Jozef {
204dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
205d2238194SKrzysztof Grobelny         .Times(0);
2062f9f9b87SWludzik, Jozef 
20751497a0cSKrzysztof Grobelny     reportParams.reportingType(ReportingType::periodic);
208e2362796SWludzik, Jozef     reportParams.interval(reportParams.interval() - 1ms);
2092f9f9b87SWludzik, Jozef 
210e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
21132859b63SKarol Niczyj 
2122f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
2132f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
2142f9f9b87SWludzik, Jozef }
2152f9f9b87SWludzik, Jozef 
216bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
217bc766b4dSWludzik, Jozef {
218dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
219bc766b4dSWludzik, Jozef         .Times(0);
220bc766b4dSWludzik, Jozef 
22151497a0cSKrzysztof Grobelny     auto [ec, path] = addReport(
22251497a0cSKrzysztof Grobelny         reportParams.reportName(), "InvalidReportingType",
22351497a0cSKrzysztof Grobelny         utils::transform(reportParams.reportActions(),
22451497a0cSKrzysztof Grobelny                          [](const auto v) { return utils::enumToString(v); }),
22551497a0cSKrzysztof Grobelny         reportParams.interval().count(),
22651497a0cSKrzysztof Grobelny         toReadingParameters(reportParams.metricParameters()));
22732859b63SKarol Niczyj 
228bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
229bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
230bc766b4dSWludzik, Jozef }
231bc766b4dSWludzik, Jozef 
232cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager,
233cd5b0b7eSAnkita Vilas Gawade        DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
234bc766b4dSWludzik, Jozef {
235dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
236bc766b4dSWludzik, Jozef         .Times(0);
237bc766b4dSWludzik, Jozef 
238cd5b0b7eSAnkita Vilas Gawade     reportParams.metricParameters(
239cd5b0b7eSAnkita Vilas Gawade         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
24094f71c51SSzymon Dompke             {LabeledSensorInfo{"Service",
241cd5b0b7eSAnkita Vilas Gawade                                "/xyz/openbmc_project/sensors/power/p1",
242cd5b0b7eSAnkita Vilas Gawade                                "Metadata1"}},
24360fee077SKrzysztof Grobelny             OperationType::avg,
244cd5b0b7eSAnkita Vilas Gawade             "MetricId1",
245cd5b0b7eSAnkita Vilas Gawade             CollectionTimeScope::point,
246cd5b0b7eSAnkita Vilas Gawade             CollectionDuration(Milliseconds(0u))}}});
247cd5b0b7eSAnkita Vilas Gawade 
248dcc4e193SKrzysztof Grobelny     auto metricParams = reportParams.metricParameters();
249cd5b0b7eSAnkita Vilas Gawade     auto& metricParamsVec =
250cd5b0b7eSAnkita Vilas Gawade         metricParams[0].at_label<utils::tstring::SensorPath>();
251cd5b0b7eSAnkita Vilas Gawade 
252cd5b0b7eSAnkita Vilas Gawade     for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
253bc766b4dSWludzik, Jozef     {
25494f71c51SSzymon Dompke         metricParamsVec.emplace_back(LabeledSensorInfo{
255cd5b0b7eSAnkita Vilas Gawade             "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
256bc766b4dSWludzik, Jozef     }
257cd5b0b7eSAnkita Vilas Gawade 
258dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(std::move(metricParams));
259bc766b4dSWludzik, Jozef 
260bc766b4dSWludzik, Jozef     auto [ec, path] = addReport(reportParams);
26132859b63SKarol Niczyj 
262bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
263bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
264bc766b4dSWludzik, Jozef }
265bc766b4dSWludzik, Jozef 
266cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
267cd5b0b7eSAnkita Vilas Gawade {
268cd5b0b7eSAnkita Vilas Gawade     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
269cd5b0b7eSAnkita Vilas Gawade         .Times(0);
270cd5b0b7eSAnkita Vilas Gawade 
271cd5b0b7eSAnkita Vilas Gawade     auto metricParams = std::vector<LabeledMetricParameters>{};
272cd5b0b7eSAnkita Vilas Gawade 
273cd5b0b7eSAnkita Vilas Gawade     for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
274cd5b0b7eSAnkita Vilas Gawade     {
275cd5b0b7eSAnkita Vilas Gawade         metricParams.emplace_back(
276cd5b0b7eSAnkita Vilas Gawade             LabeledMetricParameters{{},
27760fee077SKrzysztof Grobelny                                     OperationType::avg,
278cd5b0b7eSAnkita Vilas Gawade                                     "MetricId1",
279cd5b0b7eSAnkita Vilas Gawade                                     CollectionTimeScope::point,
280cd5b0b7eSAnkita Vilas Gawade                                     CollectionDuration(Milliseconds(0u))});
281cd5b0b7eSAnkita Vilas Gawade     }
282cd5b0b7eSAnkita Vilas Gawade 
283cd5b0b7eSAnkita Vilas Gawade     reportParams.metricParameters(std::move(metricParams));
284cd5b0b7eSAnkita Vilas Gawade 
285cd5b0b7eSAnkita Vilas Gawade     auto [ec, path] = addReport(reportParams);
286cd5b0b7eSAnkita Vilas Gawade 
287cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
288cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(path, Eq(std::string()));
289cd5b0b7eSAnkita Vilas Gawade }
290cd5b0b7eSAnkita Vilas Gawade 
291cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
292cd5b0b7eSAnkita Vilas Gawade {
293cd5b0b7eSAnkita Vilas Gawade     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
294cd5b0b7eSAnkita Vilas Gawade         .Times(0);
295cd5b0b7eSAnkita Vilas Gawade 
296cd5b0b7eSAnkita Vilas Gawade     reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
297cd5b0b7eSAnkita Vilas Gawade 
298cd5b0b7eSAnkita Vilas Gawade     auto [ec, path] = addReport(reportParams);
299cd5b0b7eSAnkita Vilas Gawade 
300cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
301cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(path, Eq(std::string()));
302cd5b0b7eSAnkita Vilas Gawade }
303cd5b0b7eSAnkita Vilas Gawade 
304e6c417cfSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
305e6c417cfSKrzysztof Grobelny {
306e6c417cfSKrzysztof Grobelny     reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
307e6c417cfSKrzysztof Grobelny 
308e6c417cfSKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
309e6c417cfSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
310e6c417cfSKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
311e6c417cfSKrzysztof Grobelny 
312e6c417cfSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
313e6c417cfSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
314e6c417cfSKrzysztof Grobelny     EXPECT_THAT(path, Eq(reportMock.getPath()));
315e6c417cfSKrzysztof Grobelny }
316e6c417cfSKrzysztof Grobelny 
317e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
3182f9f9b87SWludzik, Jozef {
319dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
3202f9f9b87SWludzik, Jozef         .Times(ReportManager::maxReports);
3212f9f9b87SWludzik, Jozef 
3222f9f9b87SWludzik, Jozef     for (size_t i = 0; i < ReportManager::maxReports; i++)
3232f9f9b87SWludzik, Jozef     {
324b8cc78ddSKrzysztof Grobelny         reportParams.reportId(reportParams.reportName() + std::to_string(i));
3252f9f9b87SWludzik, Jozef 
326e2362796SWludzik, Jozef         auto [ec, path] = addReport(reportParams);
3272f9f9b87SWludzik, Jozef         EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
3282f9f9b87SWludzik, Jozef     }
3292f9f9b87SWludzik, Jozef 
330b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportParams.reportName() +
331e2362796SWludzik, Jozef                           std::to_string(ReportManager::maxReports));
332e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
33332859b63SKarol Niczyj 
3342f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
3352f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
3362f9f9b87SWludzik, Jozef }
3372f9f9b87SWludzik, Jozef 
3382f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport)
3392f9f9b87SWludzik, Jozef {
3402f9f9b87SWludzik, Jozef     {
3412f9f9b87SWludzik, Jozef         InSequence seq;
342dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
343dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
3442f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
3452f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
3462f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
3472f9f9b87SWludzik, Jozef     }
3482f9f9b87SWludzik, Jozef 
349e2362796SWludzik, Jozef     addReport(reportParams);
350e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
3512f9f9b87SWludzik, Jozef     checkPoint.Call("end");
3522f9f9b87SWludzik, Jozef }
3532f9f9b87SWludzik, Jozef 
3542f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
3552f9f9b87SWludzik, Jozef {
3562f9f9b87SWludzik, Jozef     {
3572f9f9b87SWludzik, Jozef         InSequence seq;
3582f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
3592f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
3602f9f9b87SWludzik, Jozef     }
3612f9f9b87SWludzik, Jozef 
362e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
3632f9f9b87SWludzik, Jozef     checkPoint.Call("end");
3642f9f9b87SWludzik, Jozef }
3652f9f9b87SWludzik, Jozef 
3662f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
3672f9f9b87SWludzik, Jozef {
3682f9f9b87SWludzik, Jozef     {
3692f9f9b87SWludzik, Jozef         InSequence seq;
370dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
371dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
3722f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
3732f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
3742f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
3752f9f9b87SWludzik, Jozef     }
3762f9f9b87SWludzik, Jozef 
377e2362796SWludzik, Jozef     addReport(reportParams);
378e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
379e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
3802f9f9b87SWludzik, Jozef     checkPoint.Call("end");
3812f9f9b87SWludzik, Jozef }
382e2362796SWludzik, Jozef 
383e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType :
384e8fc5751SKrzysztof Grobelny     public TestReportManager,
385e8fc5751SKrzysztof Grobelny     public WithParamInterface<OperationType>
386e8fc5751SKrzysztof Grobelny {
387e8fc5751SKrzysztof Grobelny   public:
388e8fc5751SKrzysztof Grobelny     OperationType operationType = GetParam();
389e8fc5751SKrzysztof Grobelny };
390e8fc5751SKrzysztof Grobelny 
391e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
39260fee077SKrzysztof Grobelny                          Values(OperationType::max, OperationType::min,
39360fee077SKrzysztof Grobelny                                 OperationType::avg, OperationType::sum));
394e8fc5751SKrzysztof Grobelny 
395e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType,
396e8fc5751SKrzysztof Grobelny        addReportWithDifferentOperationTypes)
397e8fc5751SKrzysztof Grobelny {
398dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(
399dcc4e193SKrzysztof Grobelny         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
40094f71c51SSzymon Dompke             {LabeledSensorInfo{"Service",
401b8cc78ddSKrzysztof Grobelny                                "/xyz/openbmc_project/sensors/power/p1",
402b8cc78ddSKrzysztof Grobelny                                "Metadata1"}},
403dcc4e193SKrzysztof Grobelny             operationType,
404e8fc5751SKrzysztof Grobelny             "MetricId1",
405dcc4e193SKrzysztof Grobelny             CollectionTimeScope::point,
406dcc4e193SKrzysztof Grobelny             CollectionDuration(Milliseconds(0u))}}});
407e8fc5751SKrzysztof Grobelny 
408dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
409e8fc5751SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
410e8fc5751SKrzysztof Grobelny 
411e8fc5751SKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
41232859b63SKarol Niczyj 
413e8fc5751SKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
414b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
415e8fc5751SKrzysztof Grobelny }
416e8fc5751SKrzysztof Grobelny 
417e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager
418e2362796SWludzik, Jozef {
419e2362796SWludzik, Jozef   public:
420e2362796SWludzik, Jozef     using FilePath = interfaces::JsonStorage::FilePath;
421e2362796SWludzik, Jozef     using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
422e2362796SWludzik, Jozef 
423e2362796SWludzik, Jozef     void SetUp() override
424e2362796SWludzik, Jozef     {
425dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
426dcc4e193SKrzysztof Grobelny 
427e2362796SWludzik, Jozef         ON_CALL(storageMock, list())
428e2362796SWludzik, Jozef             .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
429e2362796SWludzik, Jozef         ON_CALL(storageMock, load(FilePath("report1")))
4306ccfcbf5SKrzysztof Grobelny             .WillByDefault(InvokeWithoutArgs([this] { return data; }));
431e2362796SWludzik, Jozef     }
432e2362796SWludzik, Jozef 
433e2362796SWludzik, Jozef     void makeReportManager()
434e2362796SWludzik, Jozef     {
435e6d48874SKrzysztof Grobelny         sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
436e6d48874SKrzysztof Grobelny                                               std::move(storageMockPtr),
437e6d48874SKrzysztof Grobelny                                               DbusEnvironment::getObjServer());
438e2362796SWludzik, Jozef     }
439e2362796SWludzik, Jozef 
440e2362796SWludzik, Jozef     nlohmann::json data = nlohmann::json{
4417e098e93SLukasz Kazmierczak         {"Enabled", reportParams.enabled()},
442e2362796SWludzik, Jozef         {"Version", Report::reportVersion},
443b8cc78ddSKrzysztof Grobelny         {"Id", reportParams.reportId()},
444e2362796SWludzik, Jozef         {"Name", reportParams.reportName()},
44551497a0cSKrzysztof Grobelny         {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
44651497a0cSKrzysztof Grobelny         {"ReportActions", reportParams.reportActions()},
447e2362796SWludzik, Jozef         {"Interval", reportParams.interval().count()},
44851497a0cSKrzysztof Grobelny         {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
4493eb56865SSzymon Dompke         {"AppendLimit", reportParams.appendLimit()},
450dcc4e193SKrzysztof Grobelny         {"ReadingParameters", reportParams.metricParameters()}};
451e2362796SWludzik, Jozef };
452e2362796SWludzik, Jozef 
453e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
454e2362796SWludzik, Jozef {
455dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
456e2362796SWludzik, Jozef 
457e2362796SWludzik, Jozef     makeReportManager();
458e2362796SWludzik, Jozef }
459e2362796SWludzik, Jozef 
460e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
461e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfVersionDoesNotMatch)
462e2362796SWludzik, Jozef {
463e2362796SWludzik, Jozef     data["Version"] = Report::reportVersion - 1;
464e2362796SWludzik, Jozef 
465e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
466e2362796SWludzik, Jozef 
467e2362796SWludzik, Jozef     makeReportManager();
468e2362796SWludzik, Jozef }
469e2362796SWludzik, Jozef 
470e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
471e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfIntervalHasWrongType)
472e2362796SWludzik, Jozef {
473e2362796SWludzik, Jozef     data["Interval"] = "1000";
474e2362796SWludzik, Jozef 
475e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
476e2362796SWludzik, Jozef 
477e2362796SWludzik, Jozef     makeReportManager();
478e2362796SWludzik, Jozef }
479