xref: /openbmc/telemetry/tests/src/test_report_manager.cpp (revision 32305f14d8a7560980735c04fbb2067d633e08d8)
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"
11*32305f14SSzymon Dompke #include "utils/dbus_path_utils.hpp"
12*32305f14SSzymon Dompke #include "utils/string_utils.hpp"
13e2362796SWludzik, Jozef #include "utils/transform.hpp"
14*32305f14SSzymon Dompke #include "utils/tstring.hpp"
152f9f9b87SWludzik, Jozef 
162f9f9b87SWludzik, Jozef using namespace testing;
17e8fc5751SKrzysztof Grobelny using namespace std::string_literals;
18e2362796SWludzik, Jozef using namespace std::chrono_literals;
192f9f9b87SWludzik, Jozef 
202f9f9b87SWludzik, Jozef class TestReportManager : public Test
212f9f9b87SWludzik, Jozef {
222f9f9b87SWludzik, Jozef   public:
23e2362796SWludzik, Jozef     ReportParams reportParams;
242f9f9b87SWludzik, Jozef 
252f9f9b87SWludzik, Jozef     std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr =
262f9f9b87SWludzik, Jozef         std::make_unique<StrictMock<ReportFactoryMock>>();
272f9f9b87SWludzik, Jozef     ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr;
28e2362796SWludzik, Jozef 
29e2362796SWludzik, Jozef     std::unique_ptr<StorageMock> storageMockPtr =
30e2362796SWludzik, Jozef         std::make_unique<NiceMock<StorageMock>>();
31e2362796SWludzik, Jozef     StorageMock& storageMock = *storageMockPtr;
32e2362796SWludzik, Jozef 
33d2238194SKrzysztof Grobelny     std::unique_ptr<ReportMock> reportMockPtr =
34b8cc78ddSKrzysztof Grobelny         std::make_unique<NiceMock<ReportMock>>(reportParams.reportId());
35d2238194SKrzysztof Grobelny     ReportMock& reportMock = *reportMockPtr;
36d2238194SKrzysztof Grobelny 
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 
46e6d48874SKrzysztof Grobelny         sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
47e6d48874SKrzysztof Grobelny                                               std::move(storageMockPtr),
48e6d48874SKrzysztof Grobelny                                               DbusEnvironment::getObjServer());
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 
10960fee077SKrzysztof Grobelny TEST_F(TestReportManager, returnsPropertySupportedOperationTypes)
11060fee077SKrzysztof Grobelny {
11160fee077SKrzysztof Grobelny     EXPECT_THAT(
11260fee077SKrzysztof Grobelny         getProperty<std::vector<std::string>>("SupportedOperationTypes"),
11360fee077SKrzysztof Grobelny         UnorderedElementsAre("Maximum", "Minimum", "Average", "Summation"));
11460fee077SKrzysztof Grobelny }
11560fee077SKrzysztof Grobelny 
1162f9f9b87SWludzik, Jozef TEST_F(TestReportManager, addReport)
1172f9f9b87SWludzik, Jozef {
118dcc4e193SKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
119dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
1202f9f9b87SWludzik, Jozef         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
1212f9f9b87SWludzik, Jozef 
122e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
1232f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
1242f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(reportMock.getPath()));
1252f9f9b87SWludzik, Jozef }
1262f9f9b87SWludzik, Jozef 
127f7ea2997SKrzysztof Grobelny TEST_F(TestReportManager, addOnChangeReport)
128f7ea2997SKrzysztof Grobelny {
129f7ea2997SKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
130f7ea2997SKrzysztof Grobelny     reportFactoryMock
131f7ea2997SKrzysztof Grobelny         .expectMake(reportParams.reportingType(ReportingType::onChange),
132f7ea2997SKrzysztof Grobelny                     Ref(*sut), Ref(storageMock))
133f7ea2997SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
134f7ea2997SKrzysztof Grobelny 
135f7ea2997SKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
136f7ea2997SKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
137f7ea2997SKrzysztof Grobelny     EXPECT_THAT(path, Eq(reportMock.getPath()));
138f7ea2997SKrzysztof Grobelny }
139f7ea2997SKrzysztof Grobelny 
140b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
14132859b63SKarol Niczyj {
142b8cc78ddSKrzysztof Grobelny     reportParams.reportId("ReportName");
143b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
144b8cc78ddSKrzysztof Grobelny 
145b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
146b8cc78ddSKrzysztof Grobelny 
147b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId(""));
148b8cc78ddSKrzysztof Grobelny 
149b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
150b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/ReportName"));
151b8cc78ddSKrzysztof Grobelny }
152b8cc78ddSKrzysztof Grobelny 
153b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
154b8cc78ddSKrzysztof Grobelny {
155b8cc78ddSKrzysztof Grobelny     reportParams.reportId("Prefix/ReportName");
156b8cc78ddSKrzysztof Grobelny     reportParams.reportName("ReportName");
157b8cc78ddSKrzysztof Grobelny 
158b8cc78ddSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
159b8cc78ddSKrzysztof Grobelny 
160b8cc78ddSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
161b8cc78ddSKrzysztof Grobelny 
162b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
163b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/Prefix/ReportName"));
164b8cc78ddSKrzysztof Grobelny }
165b8cc78ddSKrzysztof Grobelny 
166b8cc78ddSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithMaxLengthId)
167b8cc78ddSKrzysztof Grobelny {
168*32305f14SSzymon Dompke     std::string reportId = utils::string_utils::getMaxId();
169b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportId);
170dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
17132859b63SKarol Niczyj 
17232859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
17332859b63SKarol Niczyj 
17432859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
175b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportId));
17632859b63SKarol Niczyj }
17732859b63SKarol Niczyj 
178*32305f14SSzymon Dompke TEST_F(TestReportManager, addReportWithMaxLengthPrefix)
179*32305f14SSzymon Dompke {
180*32305f14SSzymon Dompke     std::string reportId = utils::string_utils::getMaxPrefix() + "/MyId";
181*32305f14SSzymon Dompke     reportParams.reportId(reportId);
182*32305f14SSzymon Dompke     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
183*32305f14SSzymon Dompke 
184*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
185*32305f14SSzymon Dompke 
186*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
187*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq("/"s + reportId));
188*32305f14SSzymon Dompke }
189*32305f14SSzymon Dompke 
190*32305f14SSzymon Dompke TEST_F(TestReportManager, addReportWithMaxLengthName)
191*32305f14SSzymon Dompke {
192*32305f14SSzymon Dompke     reportParams.reportName(utils::string_utils::getMaxName());
193*32305f14SSzymon Dompke     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
194*32305f14SSzymon Dompke 
195*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
196*32305f14SSzymon Dompke 
197*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
198*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
199*32305f14SSzymon Dompke }
200*32305f14SSzymon Dompke 
201*32305f14SSzymon Dompke TEST_F(TestReportManager, addReportWithMaxLengthMetricId)
202*32305f14SSzymon Dompke {
203*32305f14SSzymon Dompke     namespace ts = utils::tstring;
204*32305f14SSzymon Dompke     std::vector<LabeledMetricParameters> newMetricParams{
205*32305f14SSzymon Dompke         {LabeledMetricParameters{
206*32305f14SSzymon Dompke             {LabeledSensorInfo{"Service",
207*32305f14SSzymon Dompke                                "/xyz/openbmc_project/sensors/power/p1",
208*32305f14SSzymon Dompke                                "metadata1"}},
209*32305f14SSzymon Dompke             OperationType::avg,
210*32305f14SSzymon Dompke             utils::string_utils::getMaxId(),
211*32305f14SSzymon Dompke             CollectionTimeScope::point,
212*32305f14SSzymon Dompke             CollectionDuration(Milliseconds(0u))}}};
213*32305f14SSzymon Dompke 
214*32305f14SSzymon Dompke     reportParams.metricParameters(newMetricParams);
215*32305f14SSzymon Dompke     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
216*32305f14SSzymon Dompke 
217*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
218*32305f14SSzymon Dompke 
219*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
220*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
221*32305f14SSzymon Dompke }
222*32305f14SSzymon Dompke 
223*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongFullId)
22432859b63SKarol Niczyj {
225dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
22632859b63SKarol Niczyj         .Times(0);
22732859b63SKarol Niczyj 
228b8cc78ddSKrzysztof Grobelny     reportParams.reportId(
229*32305f14SSzymon Dompke         std::string(utils::constants::maxReportFullIdLength + 1, 'z'));
230*32305f14SSzymon Dompke 
231*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
232*32305f14SSzymon Dompke 
233*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
234*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq(std::string()));
235*32305f14SSzymon Dompke }
236*32305f14SSzymon Dompke 
237*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongId)
238*32305f14SSzymon Dompke {
239*32305f14SSzymon Dompke     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
240*32305f14SSzymon Dompke         .Times(0);
241*32305f14SSzymon Dompke 
242*32305f14SSzymon Dompke     reportParams.reportId(utils::string_utils::getTooLongId());
243*32305f14SSzymon Dompke 
244*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
245*32305f14SSzymon Dompke 
246*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
247*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq(std::string()));
248*32305f14SSzymon Dompke }
249*32305f14SSzymon Dompke 
250*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongPrefix)
251*32305f14SSzymon Dompke {
252*32305f14SSzymon Dompke     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
253*32305f14SSzymon Dompke         .Times(0);
254*32305f14SSzymon Dompke 
255*32305f14SSzymon Dompke     reportParams.reportId(utils::string_utils::getTooLongPrefix() + "/MyId");
256*32305f14SSzymon Dompke 
257*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
258*32305f14SSzymon Dompke 
259*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
260*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq(std::string()));
261*32305f14SSzymon Dompke }
262*32305f14SSzymon Dompke 
263*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooManyPrefixes)
264*32305f14SSzymon Dompke {
265*32305f14SSzymon Dompke     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
266*32305f14SSzymon Dompke         .Times(0);
267*32305f14SSzymon Dompke 
268*32305f14SSzymon Dompke     std::string reportId;
269*32305f14SSzymon Dompke     for (size_t i = 0; i < utils::constants::maxPrefixesInId + 1; i++)
270*32305f14SSzymon Dompke     {
271*32305f14SSzymon Dompke         reportId += "prefix/";
272*32305f14SSzymon Dompke     }
273*32305f14SSzymon Dompke     reportId += "MyId";
274*32305f14SSzymon Dompke 
275*32305f14SSzymon Dompke     reportParams.reportId(reportId);
276*32305f14SSzymon Dompke 
277*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
278*32305f14SSzymon Dompke 
279*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
280*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq(std::string()));
281*32305f14SSzymon Dompke }
282*32305f14SSzymon Dompke 
283*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
284*32305f14SSzymon Dompke {
285*32305f14SSzymon Dompke     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
286*32305f14SSzymon Dompke         .Times(0);
287*32305f14SSzymon Dompke 
288*32305f14SSzymon Dompke     reportParams.reportName(utils::string_utils::getTooLongName());
289*32305f14SSzymon Dompke 
290*32305f14SSzymon Dompke     auto [ec, path] = addReport(reportParams);
291*32305f14SSzymon Dompke 
292*32305f14SSzymon Dompke     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
293*32305f14SSzymon Dompke     EXPECT_THAT(path, Eq(std::string()));
294*32305f14SSzymon Dompke }
295*32305f14SSzymon Dompke 
296*32305f14SSzymon Dompke TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongMetricId)
297*32305f14SSzymon Dompke {
298*32305f14SSzymon Dompke     namespace ts = utils::tstring;
299*32305f14SSzymon Dompke 
300*32305f14SSzymon Dompke     std::vector<LabeledMetricParameters> newMetricParams{
301*32305f14SSzymon Dompke         {LabeledMetricParameters{
302*32305f14SSzymon Dompke             {LabeledSensorInfo{"Service",
303*32305f14SSzymon Dompke                                "/xyz/openbmc_project/sensors/power/p1",
304*32305f14SSzymon Dompke                                "metadata1"}},
305*32305f14SSzymon Dompke             OperationType::avg,
306*32305f14SSzymon Dompke             utils::string_utils::getTooLongId(),
307*32305f14SSzymon Dompke             CollectionTimeScope::point,
308*32305f14SSzymon Dompke             CollectionDuration(Milliseconds(0u))}}};
309*32305f14SSzymon Dompke 
310*32305f14SSzymon Dompke     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
311*32305f14SSzymon Dompke         .Times(0);
312*32305f14SSzymon Dompke 
313*32305f14SSzymon Dompke     reportParams.metricParameters(newMetricParams);
31432859b63SKarol Niczyj 
31532859b63SKarol Niczyj     auto [ec, path] = addReport(reportParams);
31632859b63SKarol Niczyj 
31732859b63SKarol Niczyj     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
31832859b63SKarol Niczyj     EXPECT_THAT(path, Eq(std::string()));
31932859b63SKarol Niczyj }
32032859b63SKarol Niczyj 
321e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
3222f9f9b87SWludzik, Jozef {
323dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
324d2238194SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
3252f9f9b87SWludzik, Jozef 
326e2362796SWludzik, Jozef     addReport(reportParams);
3272f9f9b87SWludzik, Jozef 
328e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
32932859b63SKarol Niczyj 
3302f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
3312f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
3322f9f9b87SWludzik, Jozef }
3332f9f9b87SWludzik, Jozef 
334e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
3352f9f9b87SWludzik, Jozef {
336dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
337d2238194SKrzysztof Grobelny         .Times(0);
3382f9f9b87SWludzik, Jozef 
33951497a0cSKrzysztof Grobelny     reportParams.reportingType(ReportingType::periodic);
340973b4bb0SKrzysztof Grobelny     reportParams.interval(ReportManager::minInterval - 1ms);
3412f9f9b87SWludzik, Jozef 
342e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
34332859b63SKarol Niczyj 
3442f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
3452f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
3462f9f9b87SWludzik, Jozef }
3472f9f9b87SWludzik, Jozef 
348bc766b4dSWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
349bc766b4dSWludzik, Jozef {
350dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
351bc766b4dSWludzik, Jozef         .Times(0);
352bc766b4dSWludzik, Jozef 
35351497a0cSKrzysztof Grobelny     auto [ec, path] = addReport(
35451497a0cSKrzysztof Grobelny         reportParams.reportName(), "InvalidReportingType",
35551497a0cSKrzysztof Grobelny         utils::transform(reportParams.reportActions(),
35651497a0cSKrzysztof Grobelny                          [](const auto v) { return utils::enumToString(v); }),
35751497a0cSKrzysztof Grobelny         reportParams.interval().count(),
35851497a0cSKrzysztof Grobelny         toReadingParameters(reportParams.metricParameters()));
35932859b63SKarol Niczyj 
360bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
361bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
362bc766b4dSWludzik, Jozef }
363bc766b4dSWludzik, Jozef 
364cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager,
365cd5b0b7eSAnkita Vilas Gawade        DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
366bc766b4dSWludzik, Jozef {
367dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
368bc766b4dSWludzik, Jozef         .Times(0);
369bc766b4dSWludzik, Jozef 
370cd5b0b7eSAnkita Vilas Gawade     reportParams.metricParameters(
371cd5b0b7eSAnkita Vilas Gawade         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
37294f71c51SSzymon Dompke             {LabeledSensorInfo{"Service",
373cd5b0b7eSAnkita Vilas Gawade                                "/xyz/openbmc_project/sensors/power/p1",
374cd5b0b7eSAnkita Vilas Gawade                                "Metadata1"}},
37560fee077SKrzysztof Grobelny             OperationType::avg,
376cd5b0b7eSAnkita Vilas Gawade             "MetricId1",
377cd5b0b7eSAnkita Vilas Gawade             CollectionTimeScope::point,
378cd5b0b7eSAnkita Vilas Gawade             CollectionDuration(Milliseconds(0u))}}});
379cd5b0b7eSAnkita Vilas Gawade 
380dcc4e193SKrzysztof Grobelny     auto metricParams = reportParams.metricParameters();
381cd5b0b7eSAnkita Vilas Gawade     auto& metricParamsVec =
382cd5b0b7eSAnkita Vilas Gawade         metricParams[0].at_label<utils::tstring::SensorPath>();
383cd5b0b7eSAnkita Vilas Gawade 
384cd5b0b7eSAnkita Vilas Gawade     for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
385bc766b4dSWludzik, Jozef     {
38694f71c51SSzymon Dompke         metricParamsVec.emplace_back(LabeledSensorInfo{
387cd5b0b7eSAnkita Vilas Gawade             "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
388bc766b4dSWludzik, Jozef     }
389cd5b0b7eSAnkita Vilas Gawade 
390dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(std::move(metricParams));
391bc766b4dSWludzik, Jozef 
392bc766b4dSWludzik, Jozef     auto [ec, path] = addReport(reportParams);
39332859b63SKarol Niczyj 
394bc766b4dSWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
395bc766b4dSWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
396bc766b4dSWludzik, Jozef }
397bc766b4dSWludzik, Jozef 
398cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
399cd5b0b7eSAnkita Vilas Gawade {
400cd5b0b7eSAnkita Vilas Gawade     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
401cd5b0b7eSAnkita Vilas Gawade         .Times(0);
402cd5b0b7eSAnkita Vilas Gawade 
403cd5b0b7eSAnkita Vilas Gawade     auto metricParams = std::vector<LabeledMetricParameters>{};
404cd5b0b7eSAnkita Vilas Gawade 
405cd5b0b7eSAnkita Vilas Gawade     for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
406cd5b0b7eSAnkita Vilas Gawade     {
407cd5b0b7eSAnkita Vilas Gawade         metricParams.emplace_back(
408cd5b0b7eSAnkita Vilas Gawade             LabeledMetricParameters{{},
40960fee077SKrzysztof Grobelny                                     OperationType::avg,
410cd5b0b7eSAnkita Vilas Gawade                                     "MetricId1",
411cd5b0b7eSAnkita Vilas Gawade                                     CollectionTimeScope::point,
412cd5b0b7eSAnkita Vilas Gawade                                     CollectionDuration(Milliseconds(0u))});
413cd5b0b7eSAnkita Vilas Gawade     }
414cd5b0b7eSAnkita Vilas Gawade 
415cd5b0b7eSAnkita Vilas Gawade     reportParams.metricParameters(std::move(metricParams));
416cd5b0b7eSAnkita Vilas Gawade 
417cd5b0b7eSAnkita Vilas Gawade     auto [ec, path] = addReport(reportParams);
418cd5b0b7eSAnkita Vilas Gawade 
419cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
420cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(path, Eq(std::string()));
421cd5b0b7eSAnkita Vilas Gawade }
422cd5b0b7eSAnkita Vilas Gawade 
423cd5b0b7eSAnkita Vilas Gawade TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
424cd5b0b7eSAnkita Vilas Gawade {
425cd5b0b7eSAnkita Vilas Gawade     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
426cd5b0b7eSAnkita Vilas Gawade         .Times(0);
427cd5b0b7eSAnkita Vilas Gawade 
428cd5b0b7eSAnkita Vilas Gawade     reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
429cd5b0b7eSAnkita Vilas Gawade 
430cd5b0b7eSAnkita Vilas Gawade     auto [ec, path] = addReport(reportParams);
431cd5b0b7eSAnkita Vilas Gawade 
432cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
433cd5b0b7eSAnkita Vilas Gawade     EXPECT_THAT(path, Eq(std::string()));
434cd5b0b7eSAnkita Vilas Gawade }
435cd5b0b7eSAnkita Vilas Gawade 
436e6c417cfSKrzysztof Grobelny TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
437e6c417cfSKrzysztof Grobelny {
438e6c417cfSKrzysztof Grobelny     reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
439e6c417cfSKrzysztof Grobelny 
440e6c417cfSKrzysztof Grobelny     EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
441e6c417cfSKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
442e6c417cfSKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
443e6c417cfSKrzysztof Grobelny 
444e6c417cfSKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
445e6c417cfSKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
446e6c417cfSKrzysztof Grobelny     EXPECT_THAT(path, Eq(reportMock.getPath()));
447e6c417cfSKrzysztof Grobelny }
448e6c417cfSKrzysztof Grobelny 
449e2362796SWludzik, Jozef TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
4502f9f9b87SWludzik, Jozef {
451dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
4522f9f9b87SWludzik, Jozef         .Times(ReportManager::maxReports);
4532f9f9b87SWludzik, Jozef 
4542f9f9b87SWludzik, Jozef     for (size_t i = 0; i < ReportManager::maxReports; i++)
4552f9f9b87SWludzik, Jozef     {
456b8cc78ddSKrzysztof Grobelny         reportParams.reportId(reportParams.reportName() + std::to_string(i));
4572f9f9b87SWludzik, Jozef 
458e2362796SWludzik, Jozef         auto [ec, path] = addReport(reportParams);
4592f9f9b87SWludzik, Jozef         EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
4602f9f9b87SWludzik, Jozef     }
4612f9f9b87SWludzik, Jozef 
462b8cc78ddSKrzysztof Grobelny     reportParams.reportId(reportParams.reportName() +
463e2362796SWludzik, Jozef                           std::to_string(ReportManager::maxReports));
464e2362796SWludzik, Jozef     auto [ec, path] = addReport(reportParams);
46532859b63SKarol Niczyj 
4662f9f9b87SWludzik, Jozef     EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
4672f9f9b87SWludzik, Jozef     EXPECT_THAT(path, Eq(std::string()));
4682f9f9b87SWludzik, Jozef }
4692f9f9b87SWludzik, Jozef 
4702f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removeReport)
4712f9f9b87SWludzik, Jozef {
4722f9f9b87SWludzik, Jozef     {
4732f9f9b87SWludzik, Jozef         InSequence seq;
474dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
475dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
4762f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
4772f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
4782f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
4792f9f9b87SWludzik, Jozef     }
4802f9f9b87SWludzik, Jozef 
481e2362796SWludzik, Jozef     addReport(reportParams);
482e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
4832f9f9b87SWludzik, Jozef     checkPoint.Call("end");
4842f9f9b87SWludzik, Jozef }
4852f9f9b87SWludzik, Jozef 
4862f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
4872f9f9b87SWludzik, Jozef {
4882f9f9b87SWludzik, Jozef     {
4892f9f9b87SWludzik, Jozef         InSequence seq;
4902f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
4912f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
4922f9f9b87SWludzik, Jozef     }
4932f9f9b87SWludzik, Jozef 
494e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
4952f9f9b87SWludzik, Jozef     checkPoint.Call("end");
4962f9f9b87SWludzik, Jozef }
4972f9f9b87SWludzik, Jozef 
4982f9f9b87SWludzik, Jozef TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
4992f9f9b87SWludzik, Jozef {
5002f9f9b87SWludzik, Jozef     {
5012f9f9b87SWludzik, Jozef         InSequence seq;
502dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
503dcc4e193SKrzysztof Grobelny         reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
5042f9f9b87SWludzik, Jozef             .WillOnce(Return(ByMove(std::move(reportMockPtr))));
5052f9f9b87SWludzik, Jozef         EXPECT_CALL(reportMock, Die());
5062f9f9b87SWludzik, Jozef         EXPECT_CALL(checkPoint, Call("end"));
5072f9f9b87SWludzik, Jozef     }
5082f9f9b87SWludzik, Jozef 
509e2362796SWludzik, Jozef     addReport(reportParams);
510e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
511e2362796SWludzik, Jozef     sut->removeReport(&reportMock);
5122f9f9b87SWludzik, Jozef     checkPoint.Call("end");
5132f9f9b87SWludzik, Jozef }
514e2362796SWludzik, Jozef 
515e8fc5751SKrzysztof Grobelny class TestReportManagerWithAggregationOperationType :
516e8fc5751SKrzysztof Grobelny     public TestReportManager,
517e8fc5751SKrzysztof Grobelny     public WithParamInterface<OperationType>
518e8fc5751SKrzysztof Grobelny {
519e8fc5751SKrzysztof Grobelny   public:
520e8fc5751SKrzysztof Grobelny     OperationType operationType = GetParam();
521e8fc5751SKrzysztof Grobelny };
522e8fc5751SKrzysztof Grobelny 
523e8fc5751SKrzysztof Grobelny INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
52460fee077SKrzysztof Grobelny                          Values(OperationType::max, OperationType::min,
52560fee077SKrzysztof Grobelny                                 OperationType::avg, OperationType::sum));
526e8fc5751SKrzysztof Grobelny 
527e8fc5751SKrzysztof Grobelny TEST_P(TestReportManagerWithAggregationOperationType,
528e8fc5751SKrzysztof Grobelny        addReportWithDifferentOperationTypes)
529e8fc5751SKrzysztof Grobelny {
530dcc4e193SKrzysztof Grobelny     reportParams.metricParameters(
531dcc4e193SKrzysztof Grobelny         std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
53294f71c51SSzymon Dompke             {LabeledSensorInfo{"Service",
533b8cc78ddSKrzysztof Grobelny                                "/xyz/openbmc_project/sensors/power/p1",
534b8cc78ddSKrzysztof Grobelny                                "Metadata1"}},
535dcc4e193SKrzysztof Grobelny             operationType,
536e8fc5751SKrzysztof Grobelny             "MetricId1",
537dcc4e193SKrzysztof Grobelny             CollectionTimeScope::point,
538dcc4e193SKrzysztof Grobelny             CollectionDuration(Milliseconds(0u))}}});
539e8fc5751SKrzysztof Grobelny 
540dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
541e8fc5751SKrzysztof Grobelny         .WillOnce(Return(ByMove(std::move(reportMockPtr))));
542e8fc5751SKrzysztof Grobelny 
543e8fc5751SKrzysztof Grobelny     auto [ec, path] = addReport(reportParams);
54432859b63SKarol Niczyj 
545e8fc5751SKrzysztof Grobelny     EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
546b8cc78ddSKrzysztof Grobelny     EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
547e8fc5751SKrzysztof Grobelny }
548e8fc5751SKrzysztof Grobelny 
549e2362796SWludzik, Jozef class TestReportManagerStorage : public TestReportManager
550e2362796SWludzik, Jozef {
551e2362796SWludzik, Jozef   public:
552e2362796SWludzik, Jozef     using FilePath = interfaces::JsonStorage::FilePath;
553e2362796SWludzik, Jozef     using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
554e2362796SWludzik, Jozef 
555e2362796SWludzik, Jozef     void SetUp() override
556e2362796SWludzik, Jozef     {
557dcc4e193SKrzysztof Grobelny         EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
558dcc4e193SKrzysztof Grobelny 
559e2362796SWludzik, Jozef         ON_CALL(storageMock, list())
560e2362796SWludzik, Jozef             .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
561e2362796SWludzik, Jozef         ON_CALL(storageMock, load(FilePath("report1")))
5626ccfcbf5SKrzysztof Grobelny             .WillByDefault(InvokeWithoutArgs([this] { return data; }));
563e2362796SWludzik, Jozef     }
564e2362796SWludzik, Jozef 
565e2362796SWludzik, Jozef     void makeReportManager()
566e2362796SWludzik, Jozef     {
567e6d48874SKrzysztof Grobelny         sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
568e6d48874SKrzysztof Grobelny                                               std::move(storageMockPtr),
569e6d48874SKrzysztof Grobelny                                               DbusEnvironment::getObjServer());
570e2362796SWludzik, Jozef     }
571e2362796SWludzik, Jozef 
572e2362796SWludzik, Jozef     nlohmann::json data = nlohmann::json{
5737e098e93SLukasz Kazmierczak         {"Enabled", reportParams.enabled()},
574e2362796SWludzik, Jozef         {"Version", Report::reportVersion},
575b8cc78ddSKrzysztof Grobelny         {"Id", reportParams.reportId()},
576e2362796SWludzik, Jozef         {"Name", reportParams.reportName()},
57751497a0cSKrzysztof Grobelny         {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
57851497a0cSKrzysztof Grobelny         {"ReportActions", reportParams.reportActions()},
579e2362796SWludzik, Jozef         {"Interval", reportParams.interval().count()},
58051497a0cSKrzysztof Grobelny         {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
5813eb56865SSzymon Dompke         {"AppendLimit", reportParams.appendLimit()},
582dcc4e193SKrzysztof Grobelny         {"ReadingParameters", reportParams.metricParameters()}};
583e2362796SWludzik, Jozef };
584e2362796SWludzik, Jozef 
585e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
586e2362796SWludzik, Jozef {
587dcc4e193SKrzysztof Grobelny     reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
588e2362796SWludzik, Jozef 
589e2362796SWludzik, Jozef     makeReportManager();
590e2362796SWludzik, Jozef }
591e2362796SWludzik, Jozef 
592e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
593e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfVersionDoesNotMatch)
594e2362796SWludzik, Jozef {
595e2362796SWludzik, Jozef     data["Version"] = Report::reportVersion - 1;
596e2362796SWludzik, Jozef 
597e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
598e2362796SWludzik, Jozef 
599e2362796SWludzik, Jozef     makeReportManager();
600e2362796SWludzik, Jozef }
601e2362796SWludzik, Jozef 
602e2362796SWludzik, Jozef TEST_F(TestReportManagerStorage,
603e2362796SWludzik, Jozef        reportManagerCtorRemoveFileIfIntervalHasWrongType)
604e2362796SWludzik, Jozef {
605e2362796SWludzik, Jozef     data["Interval"] = "1000";
606e2362796SWludzik, Jozef 
607e2362796SWludzik, Jozef     EXPECT_CALL(storageMock, remove(FilePath("report1")));
608e2362796SWludzik, Jozef 
609e2362796SWludzik, Jozef     makeReportManager();
610e2362796SWludzik, Jozef }
611