xref: /openbmc/telemetry/tests/src/test_report_manager.cpp (revision b4ef22e4d365bde35a7fce7950033c9271c68ce7)
12f9f9b87SWludzik, Jozef #include "dbus_environment.hpp"
2d2238194SKrzysztof Grobelny #include "helpers.hpp"
3*b4ef22e4SSzymon Dompke #include "interfaces/trigger_manager.hpp"
4e2362796SWludzik, Jozef #include "mocks/json_storage_mock.hpp"
52f9f9b87SWludzik, Jozef #include "mocks/report_factory_mock.hpp"
6*b4ef22e4SSzymon 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 
34*b4ef22e4SSzymon Dompke     std::unique_ptr<interfaces::TriggerManager> triggerManagerMockPtr =
35*b4ef22e4SSzymon Dompke         std::make_unique<NiceMock<TriggerManagerMock>>();
36*b4ef22e4SSzymon Dompke 
37e2362796SWludzik, Jozef     std::unique_ptr<ReportManager> sut;
382f9f9b87SWludzik, Jozef 
392f9f9b87SWludzik, Jozef     MockFunction<void(std::string)> checkPoint;
402f9f9b87SWludzik, Jozef 
41e2362796SWludzik, Jozef     void SetUp() override
42e2362796SWludzik, Jozef     {
43dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _))
44dcc4e193SKrzysztof Grobelny             .Times(AnyNumber());
45dcc4e193SKrzysztof Grobelny 
46*b4ef22e4SSzymon Dompke         sut = std::make_unique<ReportManager>(
47*b4ef22e4SSzymon Dompke             std::move(reportFactoryMockPtr), std::move(storageMockPtr),
48*b4ef22e4SSzymon Dompke             DbusEnvironment::getObjServer(), triggerManagerMockPtr);
49e2362796SWludzik, Jozef     }
50e2362796SWludzik, Jozef 
512f9f9b87SWludzik, Jozef     void TearDown() override
522f9f9b87SWludzik, Jozef     {
532f9f9b87SWludzik, Jozef         DbusEnvironment::synchronizeIoc();
542f9f9b87SWludzik, Jozef     }
552f9f9b87SWludzik, Jozef 
5651497a0cSKrzysztof Grobelny     template <class... Args>
5751497a0cSKrzysztof Grobelny     requires(sizeof...(Args) > 1)
5851497a0cSKrzysztof Grobelny         std::pair<boost::system::error_code, std::string> addReport(
5951497a0cSKrzysztof Grobelny             Args&&... args)
602f9f9b87SWludzik, Jozef     {
612f9f9b87SWludzik, Jozef         std::promise<std::pair<boost::system::error_code, std::string>>
622f9f9b87SWludzik, Jozef             addReportPromise;
632f9f9b87SWludzik, Jozef         DbusEnvironment::getBus()->async_method_call(
642f9f9b87SWludzik, Jozef             [&addReportPromise](boost::system::error_code ec,
652f9f9b87SWludzik, Jozef                                 const std::string& path) {
662f9f9b87SWludzik, Jozef                 addReportPromise.set_value({ec, path});
672f9f9b87SWludzik, Jozef             },
682f9f9b87SWludzik, Jozef             DbusEnvironment::serviceName(), ReportManager::reportManagerPath,
69dcc4e193SKrzysztof Grobelny             ReportManager::reportManagerIfaceName, "AddReportFutureVersion",
7051497a0cSKrzysztof Grobelny             std::forward<Args>(args)...);
71f32f6fefSKrzysztof Grobelny         return DbusEnvironment::waitForFuture(addReportPromise.get_future());
722f9f9b87SWludzik, Jozef     }
732f9f9b87SWludzik, Jozef 
7451497a0cSKrzysztof Grobelny     auto addReport(const ReportParams& params)
7551497a0cSKrzysztof Grobelny     {
76b8cc78ddSKrzysztof Grobelny         return addReport(params.reportId(), params.reportName(),
77b8cc78ddSKrzysztof Grobelny                          utils::enumToString(params.reportingType()),
78b8cc78ddSKrzysztof Grobelny                          utils::enumToString(params.reportUpdates()),
79b8cc78ddSKrzysztof Grobelny                          params.appendLimit(),
80b8cc78ddSKrzysztof Grobelny                          utils::transform(params.reportActions(),
81b8cc78ddSKrzysztof Grobelny                                           [](const auto v) {
82b8cc78ddSKrzysztof Grobelny                                               return utils::enumToString(v);
83b8cc78ddSKrzysztof Grobelny                                           }),
8451497a0cSKrzysztof Grobelny                          params.interval().count(),
8551497a0cSKrzysztof Grobelny                          toReadingParameters(params.metricParameters()));
8651497a0cSKrzysztof Grobelny     }
8751497a0cSKrzysztof Grobelny 
882f9f9b87SWludzik, Jozef     template <class T>
89e28aa53dSSzymon Dompke     static T getProperty(const std::string& property)
902f9f9b87SWludzik, Jozef     {
91e28aa53dSSzymon Dompke         return DbusEnvironment::getProperty<T>(
922f9f9b87SWludzik, Jozef             ReportManager::reportManagerPath,
93e28aa53dSSzymon Dompke             ReportManager::reportManagerIfaceName, property);
9432859b63SKarol Niczyj     }
952f9f9b87SWludzik, Jozef };
962f9f9b87SWludzik, Jozef 
972f9f9b87SWludzik, Jozef TEST_F(TestReportManager, minInterval)
982f9f9b87SWludzik, Jozef {
992f9f9b87SWludzik, Jozef     EXPECT_THAT(getProperty<uint64_t>("MinInterval"),
100dcc4e193SKrzysztof Grobelny                 Eq(ReportManager::minInterval.count()));
1012f9f9b87SWludzik, Jozef }
1022f9f9b87SWludzik, Jozef 
1032f9f9b87SWludzik, Jozef TEST_F(TestReportManager, maxReports)
1042f9f9b87SWludzik, Jozef {
105503c1589SWludzik, Jozef     EXPECT_THAT(getProperty<size_t>("MaxReports"),
1062f9f9b87SWludzik, Jozef                 Eq(ReportManager::maxReports));
1072f9f9b87SWludzik, Jozef }
1082f9f9b87SWludzik, Jozef 
1092f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport)
1102f9f9b87SWludzik, Jozef {
111dcc4e193SKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
112dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
1132f9f9b87SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1142f9f9b87SWludzik, Jozef 
115e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
1162f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
1172f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(reportMock.getPath()));
1182f9f9b87SWludzik, Jozef }
1192f9f9b87SWludzik, Jozef 
120b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
12132859b63SKarol Niczyj {
122b8cc78ddSKrzysztof Grobelny     reportParams.reportId("ReportName");
123b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
124b8cc78ddSKrzysztof Grobelny 
125b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
126b8cc78ddSKrzysztof Grobelny 
127b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId(""));
128b8cc78ddSKrzysztof Grobelny 
129b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
130b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/ReportName"));
131b8cc78ddSKrzysztof Grobelny }
132b8cc78ddSKrzysztof Grobelny 
133b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
134b8cc78ddSKrzysztof Grobelny {
135b8cc78ddSKrzysztof Grobelny     reportParams.reportId("Prefix/ReportName");
136b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
137b8cc78ddSKrzysztof Grobelny 
138b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
139b8cc78ddSKrzysztof Grobelny 
140b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
141b8cc78ddSKrzysztof Grobelny 
142b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
143b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/Prefix/ReportName"));
144b8cc78ddSKrzysztof Grobelny }
145b8cc78ddSKrzysztof Grobelny 
146b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId)
147b8cc78ddSKrzysztof Grobelny {
148b8cc78ddSKrzysztof Grobelny     std::string reportId(ReportManager::maxReportIdLength, 'z');
149b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportId);
150dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
15132859b63SKarol Niczyj 
15232859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
15332859b63SKarol Niczyj 
15432859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
155b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportId));
15632859b63SKarol Niczyj }
15732859b63SKarol Niczyj 
15832859b63SKarol Niczyj TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
15932859b63SKarol Niczyj {
160dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
16132859b63SKarol Niczyj         .Times(0);
16232859b63SKarol Niczyj 
163b8cc78ddSKrzysztof Grobelny     reportParams.reportId(
164b8cc78ddSKrzysztof Grobelny         std::string(ReportManager::maxReportIdLength + 1, 'z'));
16532859b63SKarol Niczyj 
16632859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
16732859b63SKarol Niczyj 
16832859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
16932859b63SKarol Niczyj     EXPECT_THAT(path, Eq(std::string()));
17032859b63SKarol Niczyj }
17132859b63SKarol Niczyj 
172e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
1732f9f9b87SWludzik, Jozef {
174dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
175d2238194SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1762f9f9b87SWludzik, Jozef 
177e2362796SWludzik, Jozef     addReport(reportParams);
1782f9f9b87SWludzik, Jozef 
179e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
18032859b63SKarol Niczyj 
1812f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
1822f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
1832f9f9b87SWludzik, Jozef }
1842f9f9b87SWludzik, Jozef 
185e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
1862f9f9b87SWludzik, Jozef {
187dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
188d2238194SKrzysztof Grobelny         .Times(0);
1892f9f9b87SWludzik, Jozef 
19051497a0cSKrzysztof Grobelny     reportParams.reportingType(ReportingType::periodic);
191e2362796SWludzik, Jozef     reportParams.interval(reportParams.interval() - 1ms);
1922f9f9b87SWludzik, Jozef 
193e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
19432859b63SKarol Niczyj 
1952f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
1962f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
1972f9f9b87SWludzik, Jozef }
1982f9f9b87SWludzik, Jozef 
199bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
200bc766b4dSWludzik, Jozef {
201dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
202bc766b4dSWludzik, Jozef         .Times(0);
203bc766b4dSWludzik, Jozef 
20451497a0cSKrzysztof Grobelny     auto [ec, path] = addReport(
20551497a0cSKrzysztof Grobelny         reportParams.reportName(), "InvalidReportingType",
20651497a0cSKrzysztof Grobelny         utils::transform(reportParams.reportActions(),
20751497a0cSKrzysztof Grobelny                          [](const auto v) { return utils::enumToString(v); }),
20851497a0cSKrzysztof Grobelny         reportParams.interval().count(),
20951497a0cSKrzysztof Grobelny         toReadingParameters(reportParams.metricParameters()));
21032859b63SKarol Niczyj 
211bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
212bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
213bc766b4dSWludzik, Jozef }
214bc766b4dSWludzik, Jozef 
215cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager,
216cd5b0b7eSAnkita Vilas Gawade        DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
217bc766b4dSWludzik, Jozef {
218dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
219bc766b4dSWludzik, Jozef         .Times(0);
220bc766b4dSWludzik, Jozef 
221cd5b0b7eSAnkita Vilas Gawade     reportParams.metricParameters(
222cd5b0b7eSAnkita Vilas Gawade         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
22394f71c51SSzymon Dompke             {LabeledSensorInfo{"Service",
224cd5b0b7eSAnkita Vilas Gawade                                "/xyz/openbmc_project/sensors/power/p1",
225cd5b0b7eSAnkita Vilas Gawade                                "Metadata1"}},
226cd5b0b7eSAnkita Vilas Gawade             OperationType::single,
227cd5b0b7eSAnkita Vilas Gawade             "MetricId1",
228cd5b0b7eSAnkita Vilas Gawade             CollectionTimeScope::point,
229cd5b0b7eSAnkita Vilas Gawade             CollectionDuration(Milliseconds(0u))}}});
230cd5b0b7eSAnkita Vilas Gawade 
231dcc4e193SKrzysztof Grobelny     auto metricParams = reportParams.metricParameters();
232cd5b0b7eSAnkita Vilas Gawade     auto& metricParamsVec =
233cd5b0b7eSAnkita Vilas Gawade         metricParams[0].at_label<utils::tstring::SensorPath>();
234cd5b0b7eSAnkita Vilas Gawade 
235cd5b0b7eSAnkita Vilas Gawade     for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
236bc766b4dSWludzik, Jozef     {
23794f71c51SSzymon Dompke         metricParamsVec.emplace_back(LabeledSensorInfo{
238cd5b0b7eSAnkita Vilas Gawade             "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
239bc766b4dSWludzik, Jozef     }
240cd5b0b7eSAnkita Vilas Gawade 
241dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(std::move(metricParams));
242bc766b4dSWludzik, Jozef 
243bc766b4dSWludzik, Jozef     auto [ec, path] = addReport(reportParams);
24432859b63SKarol Niczyj 
245bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
246bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
247bc766b4dSWludzik, Jozef }
248bc766b4dSWludzik, Jozef 
249cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
250cd5b0b7eSAnkita Vilas Gawade {
251cd5b0b7eSAnkita Vilas Gawade     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
252cd5b0b7eSAnkita Vilas Gawade         .Times(0);
253cd5b0b7eSAnkita Vilas Gawade 
254cd5b0b7eSAnkita Vilas Gawade     auto metricParams = std::vector<LabeledMetricParameters>{};
255cd5b0b7eSAnkita Vilas Gawade 
256cd5b0b7eSAnkita Vilas Gawade     for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
257cd5b0b7eSAnkita Vilas Gawade     {
258cd5b0b7eSAnkita Vilas Gawade         metricParams.emplace_back(
259cd5b0b7eSAnkita Vilas Gawade             LabeledMetricParameters{{},
260cd5b0b7eSAnkita Vilas Gawade                                     OperationType::single,
261cd5b0b7eSAnkita Vilas Gawade                                     "MetricId1",
262cd5b0b7eSAnkita Vilas Gawade                                     CollectionTimeScope::point,
263cd5b0b7eSAnkita Vilas Gawade                                     CollectionDuration(Milliseconds(0u))});
264cd5b0b7eSAnkita Vilas Gawade     }
265cd5b0b7eSAnkita Vilas Gawade 
266cd5b0b7eSAnkita Vilas Gawade     reportParams.metricParameters(std::move(metricParams));
267cd5b0b7eSAnkita Vilas Gawade 
268cd5b0b7eSAnkita Vilas Gawade     auto [ec, path] = addReport(reportParams);
269cd5b0b7eSAnkita Vilas Gawade 
270cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
271cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(path, Eq(std::string()));
272cd5b0b7eSAnkita Vilas Gawade }
273cd5b0b7eSAnkita Vilas Gawade 
274cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
275cd5b0b7eSAnkita Vilas Gawade {
276cd5b0b7eSAnkita Vilas Gawade     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
277cd5b0b7eSAnkita Vilas Gawade         .Times(0);
278cd5b0b7eSAnkita Vilas Gawade 
279cd5b0b7eSAnkita Vilas Gawade     reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
280cd5b0b7eSAnkita Vilas Gawade 
281cd5b0b7eSAnkita Vilas Gawade     auto [ec, path] = addReport(reportParams);
282cd5b0b7eSAnkita Vilas Gawade 
283cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
284cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(path, Eq(std::string()));
285cd5b0b7eSAnkita Vilas Gawade }
286cd5b0b7eSAnkita Vilas Gawade 
287e6c417cfSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
288e6c417cfSKrzysztof Grobelny {
289e6c417cfSKrzysztof Grobelny     reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
290e6c417cfSKrzysztof Grobelny 
291e6c417cfSKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
292e6c417cfSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
293e6c417cfSKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
294e6c417cfSKrzysztof Grobelny 
295e6c417cfSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
296e6c417cfSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
297e6c417cfSKrzysztof Grobelny     EXPECT_THAT(path, Eq(reportMock.getPath()));
298e6c417cfSKrzysztof Grobelny }
299e6c417cfSKrzysztof Grobelny 
300e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
3012f9f9b87SWludzik, Jozef {
302dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
3032f9f9b87SWludzik, Jozef         .Times(ReportManager::maxReports);
3042f9f9b87SWludzik, Jozef 
3052f9f9b87SWludzik, Jozef     for (size_t i = 0; i < ReportManager::maxReports; i++)
3062f9f9b87SWludzik, Jozef     {
307b8cc78ddSKrzysztof Grobelny         reportParams.reportId(reportParams.reportName() + std::to_string(i));
3082f9f9b87SWludzik, Jozef 
309e2362796SWludzik, Jozef         auto [ec, path] = addReport(reportParams);
3102f9f9b87SWludzik, Jozef         EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
3112f9f9b87SWludzik, Jozef     }
3122f9f9b87SWludzik, Jozef 
313b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportParams.reportName() +
314e2362796SWludzik, Jozef                           std::to_string(ReportManager::maxReports));
315e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
31632859b63SKarol Niczyj 
3172f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
3182f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
3192f9f9b87SWludzik, Jozef }
3202f9f9b87SWludzik, Jozef 
3212f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport)
3222f9f9b87SWludzik, Jozef {
3232f9f9b87SWludzik, Jozef     {
3242f9f9b87SWludzik, Jozef         InSequence seq;
325dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
326dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
3272f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
3282f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
3292f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
3302f9f9b87SWludzik, Jozef     }
3312f9f9b87SWludzik, Jozef 
332e2362796SWludzik, Jozef     addReport(reportParams);
333e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
3342f9f9b87SWludzik, Jozef     checkPoint.Call("end");
3352f9f9b87SWludzik, Jozef }
3362f9f9b87SWludzik, Jozef 
3372f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
3382f9f9b87SWludzik, Jozef {
3392f9f9b87SWludzik, Jozef     {
3402f9f9b87SWludzik, Jozef         InSequence seq;
3412f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
3422f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
3432f9f9b87SWludzik, Jozef     }
3442f9f9b87SWludzik, Jozef 
345e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
3462f9f9b87SWludzik, Jozef     checkPoint.Call("end");
3472f9f9b87SWludzik, Jozef }
3482f9f9b87SWludzik, Jozef 
3492f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
3502f9f9b87SWludzik, Jozef {
3512f9f9b87SWludzik, Jozef     {
3522f9f9b87SWludzik, Jozef         InSequence seq;
353dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
354dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
3552f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
3562f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
3572f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
3582f9f9b87SWludzik, Jozef     }
3592f9f9b87SWludzik, Jozef 
360e2362796SWludzik, Jozef     addReport(reportParams);
361e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
362e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
3632f9f9b87SWludzik, Jozef     checkPoint.Call("end");
3642f9f9b87SWludzik, Jozef }
365e2362796SWludzik, Jozef 
366d960e1f3SWludzik, Jozef TEST_F(TestReportManager, updateReportCallsUpdateReadingsForExistReport)
367d960e1f3SWludzik, Jozef {
368dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
369d960e1f3SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
370d960e1f3SWludzik, Jozef     EXPECT_CALL(reportMock, updateReadings());
371d960e1f3SWludzik, Jozef 
372d960e1f3SWludzik, Jozef     addReport(reportParams);
373b8cc78ddSKrzysztof Grobelny     sut->updateReport(reportParams.reportId());
374d960e1f3SWludzik, Jozef }
375d960e1f3SWludzik, Jozef 
376d960e1f3SWludzik, Jozef TEST_F(TestReportManager, updateReportDoNothingIfReportDoesNotExist)
377d960e1f3SWludzik, Jozef {
378dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
379d960e1f3SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
380d960e1f3SWludzik, Jozef     EXPECT_CALL(reportMock, updateReadings()).Times(0);
381d960e1f3SWludzik, Jozef 
382d960e1f3SWludzik, Jozef     addReport(reportParams);
383d960e1f3SWludzik, Jozef     sut->updateReport("NotAReport");
384d960e1f3SWludzik, Jozef }
385d960e1f3SWludzik, Jozef 
386*b4ef22e4SSzymon Dompke TEST_F(TestReportManager, updateTriggerIdsUpdatesThemForExistReport)
387*b4ef22e4SSzymon Dompke {
388*b4ef22e4SSzymon Dompke     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
389*b4ef22e4SSzymon Dompke         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
390*b4ef22e4SSzymon Dompke     EXPECT_CALL(reportMock, updateTriggerIds("Trigger1", TriggerIdUpdate::Add));
391*b4ef22e4SSzymon Dompke     EXPECT_CALL(reportMock,
392*b4ef22e4SSzymon Dompke                 updateTriggerIds("Trigger2", TriggerIdUpdate::Remove));
393*b4ef22e4SSzymon Dompke 
394*b4ef22e4SSzymon Dompke     addReport(reportParams);
395*b4ef22e4SSzymon Dompke     sut->updateTriggerIds(reportParams.reportId(), "Trigger1",
396*b4ef22e4SSzymon Dompke                           TriggerIdUpdate::Add);
397*b4ef22e4SSzymon Dompke 
398*b4ef22e4SSzymon Dompke     sut->updateTriggerIds(reportParams.reportId(), "Trigger2",
399*b4ef22e4SSzymon Dompke                           TriggerIdUpdate::Remove);
400*b4ef22e4SSzymon Dompke }
401*b4ef22e4SSzymon Dompke 
402*b4ef22e4SSzymon Dompke TEST_F(TestReportManager, updateTriggerIdsDoNothingIfReportDoesNotExist)
403*b4ef22e4SSzymon Dompke {
404*b4ef22e4SSzymon Dompke     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
405*b4ef22e4SSzymon Dompke         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
406*b4ef22e4SSzymon Dompke     EXPECT_CALL(reportMock, updateTriggerIds(_, _)).Times(0);
407*b4ef22e4SSzymon Dompke 
408*b4ef22e4SSzymon Dompke     addReport(reportParams);
409*b4ef22e4SSzymon Dompke     sut->updateTriggerIds("NotAReport", "Trigger1", TriggerIdUpdate::Add);
410*b4ef22e4SSzymon Dompke }
411*b4ef22e4SSzymon Dompke 
412e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType :
413e8fc5751SKrzysztof Grobelny     public TestReportManager,
414e8fc5751SKrzysztof Grobelny     public WithParamInterface<OperationType>
415e8fc5751SKrzysztof Grobelny {
416e8fc5751SKrzysztof Grobelny   public:
417e8fc5751SKrzysztof Grobelny     OperationType operationType = GetParam();
418e8fc5751SKrzysztof Grobelny };
419e8fc5751SKrzysztof Grobelny 
420e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
421e8fc5751SKrzysztof Grobelny                          Values(OperationType::single, OperationType::max,
422e8fc5751SKrzysztof Grobelny                                 OperationType::min, OperationType::avg,
423e8fc5751SKrzysztof Grobelny                                 OperationType::sum));
424e8fc5751SKrzysztof Grobelny 
425e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType,
426e8fc5751SKrzysztof Grobelny        addReportWithDifferentOperationTypes)
427e8fc5751SKrzysztof Grobelny {
428dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(
429dcc4e193SKrzysztof Grobelny         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
43094f71c51SSzymon Dompke             {LabeledSensorInfo{"Service",
431b8cc78ddSKrzysztof Grobelny                                "/xyz/openbmc_project/sensors/power/p1",
432b8cc78ddSKrzysztof Grobelny                                "Metadata1"}},
433dcc4e193SKrzysztof Grobelny             operationType,
434e8fc5751SKrzysztof Grobelny             "MetricId1",
435dcc4e193SKrzysztof Grobelny             CollectionTimeScope::point,
436dcc4e193SKrzysztof Grobelny             CollectionDuration(Milliseconds(0u))}}});
437e8fc5751SKrzysztof Grobelny 
438dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
439e8fc5751SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
440e8fc5751SKrzysztof Grobelny 
441e8fc5751SKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
44232859b63SKarol Niczyj 
443e8fc5751SKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
444b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
445e8fc5751SKrzysztof Grobelny }
446e8fc5751SKrzysztof Grobelny 
447e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager
448e2362796SWludzik, Jozef {
449e2362796SWludzik, Jozef   public:
450e2362796SWludzik, Jozef     using FilePath = interfaces::JsonStorage::FilePath;
451e2362796SWludzik, Jozef     using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
452e2362796SWludzik, Jozef 
453e2362796SWludzik, Jozef     void SetUp() override
454e2362796SWludzik, Jozef     {
455dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
456dcc4e193SKrzysztof Grobelny 
457e2362796SWludzik, Jozef         ON_CALL(storageMock, list())
458e2362796SWludzik, Jozef             .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
459e2362796SWludzik, Jozef         ON_CALL(storageMock, load(FilePath("report1")))
4606ccfcbf5SKrzysztof Grobelny             .WillByDefault(InvokeWithoutArgs([this] { return data; }));
461e2362796SWludzik, Jozef     }
462e2362796SWludzik, Jozef 
463e2362796SWludzik, Jozef     void makeReportManager()
464e2362796SWludzik, Jozef     {
465*b4ef22e4SSzymon Dompke         sut = std::make_unique<ReportManager>(
466*b4ef22e4SSzymon Dompke             std::move(reportFactoryMockPtr), std::move(storageMockPtr),
467*b4ef22e4SSzymon Dompke             DbusEnvironment::getObjServer(), triggerManagerMockPtr);
468e2362796SWludzik, Jozef     }
469e2362796SWludzik, Jozef 
470e2362796SWludzik, Jozef     nlohmann::json data = nlohmann::json{
4717e098e93SLukasz Kazmierczak         {"Enabled", reportParams.enabled()},
472e2362796SWludzik, Jozef         {"Version", Report::reportVersion},
473b8cc78ddSKrzysztof Grobelny         {"Id", reportParams.reportId()},
474e2362796SWludzik, Jozef         {"Name", reportParams.reportName()},
47551497a0cSKrzysztof Grobelny         {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
47651497a0cSKrzysztof Grobelny         {"ReportActions", reportParams.reportActions()},
477e2362796SWludzik, Jozef         {"Interval", reportParams.interval().count()},
47851497a0cSKrzysztof Grobelny         {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
4793eb56865SSzymon Dompke         {"AppendLimit", reportParams.appendLimit()},
480dcc4e193SKrzysztof Grobelny         {"ReadingParameters", reportParams.metricParameters()}};
481e2362796SWludzik, Jozef };
482e2362796SWludzik, Jozef 
483e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
484e2362796SWludzik, Jozef {
485dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
486e2362796SWludzik, Jozef 
487e2362796SWludzik, Jozef     makeReportManager();
488e2362796SWludzik, Jozef }
489e2362796SWludzik, Jozef 
490e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
491e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfVersionDoesNotMatch)
492e2362796SWludzik, Jozef {
493e2362796SWludzik, Jozef     data["Version"] = Report::reportVersion - 1;
494e2362796SWludzik, Jozef 
495e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
496e2362796SWludzik, Jozef 
497e2362796SWludzik, Jozef     makeReportManager();
498e2362796SWludzik, Jozef }
499e2362796SWludzik, Jozef 
500e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
501e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfIntervalHasWrongType)
502e2362796SWludzik, Jozef {
503e2362796SWludzik, Jozef     data["Interval"] = "1000";
504e2362796SWludzik, Jozef 
505e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
506e2362796SWludzik, Jozef 
507e2362796SWludzik, Jozef     makeReportManager();
508e2362796SWludzik, Jozef }
509