blob: 9af5c571588928c15f980e0ec909e01887fa9ded [file] [log] [blame]
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02001#include "dbus_environment.hpp"
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +00002#include "helpers.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01003#include "mocks/json_storage_mock.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02004#include "mocks/report_factory_mock.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01005#include "params/report_params.hpp"
6#include "report.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02007#include "report_manager.hpp"
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +00008#include "utils/conversion.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01009#include "utils/transform.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020010
11using namespace testing;
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000012using namespace std::string_literals;
Wludzik, Jozefe2362792020-10-27 17:23:55 +010013using namespace std::chrono_literals;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020014
15class TestReportManager : public Test
16{
17 public:
Wludzik, Jozefe2362792020-10-27 17:23:55 +010018 ReportParams reportParams;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020019
20 std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr =
21 std::make_unique<StrictMock<ReportFactoryMock>>();
22 ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr;
Wludzik, Jozefe2362792020-10-27 17:23:55 +010023
24 std::unique_ptr<StorageMock> storageMockPtr =
25 std::make_unique<NiceMock<StorageMock>>();
26 StorageMock& storageMock = *storageMockPtr;
27
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000028 std::unique_ptr<ReportMock> reportMockPtr =
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010029 std::make_unique<NiceMock<ReportMock>>(reportParams.reportId());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000030 ReportMock& reportMock = *reportMockPtr;
31
Wludzik, Jozefe2362792020-10-27 17:23:55 +010032 std::unique_ptr<ReportManager> sut;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020033
34 MockFunction<void(std::string)> checkPoint;
35
Wludzik, Jozefe2362792020-10-27 17:23:55 +010036 void SetUp() override
37 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000038 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _))
39 .Times(AnyNumber());
40
Wludzik, Jozefe2362792020-10-27 17:23:55 +010041 sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
42 std::move(storageMockPtr),
43 DbusEnvironment::getObjServer());
44 }
45
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020046 void TearDown() override
47 {
48 DbusEnvironment::synchronizeIoc();
49 }
50
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010051 template <class... Args>
52 requires(sizeof...(Args) > 1)
53 std::pair<boost::system::error_code, std::string> addReport(
54 Args&&... args)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020055 {
56 std::promise<std::pair<boost::system::error_code, std::string>>
57 addReportPromise;
58 DbusEnvironment::getBus()->async_method_call(
59 [&addReportPromise](boost::system::error_code ec,
60 const std::string& path) {
61 addReportPromise.set_value({ec, path});
62 },
63 DbusEnvironment::serviceName(), ReportManager::reportManagerPath,
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000064 ReportManager::reportManagerIfaceName, "AddReportFutureVersion",
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010065 std::forward<Args>(args)...);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +010066 return DbusEnvironment::waitForFuture(addReportPromise.get_future());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020067 }
68
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010069 auto addReport(const ReportParams& params)
70 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010071 return addReport(params.reportId(), params.reportName(),
72 utils::enumToString(params.reportingType()),
73 utils::enumToString(params.reportUpdates()),
74 params.appendLimit(),
75 utils::transform(params.reportActions(),
76 [](const auto v) {
77 return utils::enumToString(v);
78 }),
79 params.interval().count(),
80 toReadingParameters(params.metricParameters()));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010081 }
82
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020083 template <class T>
Szymon Dompkee28aa532021-10-27 12:33:12 +020084 static T getProperty(const std::string& property)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020085 {
Szymon Dompkee28aa532021-10-27 12:33:12 +020086 return DbusEnvironment::getProperty<T>(
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020087 ReportManager::reportManagerPath,
Szymon Dompkee28aa532021-10-27 12:33:12 +020088 ReportManager::reportManagerIfaceName, property);
Karol Niczyj32859b62021-05-19 10:20:46 +020089 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020090};
91
92TEST_F(TestReportManager, minInterval)
93{
94 EXPECT_THAT(getProperty<uint64_t>("MinInterval"),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000095 Eq(ReportManager::minInterval.count()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020096}
97
98TEST_F(TestReportManager, maxReports)
99{
Wludzik, Jozef503c1582020-12-11 14:48:01 +0100100 EXPECT_THAT(getProperty<size_t>("MaxReports"),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200101 Eq(ReportManager::maxReports));
102}
103
104TEST_F(TestReportManager, addReport)
105{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000106 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
107 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200108 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
109
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100110 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200111 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
112 EXPECT_THAT(path, Eq(reportMock.getPath()));
113}
114
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100115TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
Karol Niczyj32859b62021-05-19 10:20:46 +0200116{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100117 reportParams.reportId("ReportName");
118 reportParams.reportName("ReportName");
119
120 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
121
122 auto [ec, path] = addReport(reportParams.reportId(""));
123
124 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
125 EXPECT_THAT(path, Eq("/ReportName"));
126}
127
128TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
129{
130 reportParams.reportId("Prefix/ReportName");
131 reportParams.reportName("ReportName");
132
133 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
134
135 auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
136
137 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
138 EXPECT_THAT(path, Eq("/Prefix/ReportName"));
139}
140
141TEST_F(TestReportManager, addReportWithMaxLengthId)
142{
143 std::string reportId(ReportManager::maxReportIdLength, 'z');
144 reportParams.reportId(reportId);
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000145 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
Karol Niczyj32859b62021-05-19 10:20:46 +0200146
147 auto [ec, path] = addReport(reportParams);
148
149 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100150 EXPECT_THAT(path, Eq("/"s + reportId));
Karol Niczyj32859b62021-05-19 10:20:46 +0200151}
152
153TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
154{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000155 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Karol Niczyj32859b62021-05-19 10:20:46 +0200156 .Times(0);
157
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100158 reportParams.reportId(
159 std::string(ReportManager::maxReportIdLength + 1, 'z'));
Karol Niczyj32859b62021-05-19 10:20:46 +0200160
161 auto [ec, path] = addReport(reportParams);
162
163 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
164 EXPECT_THAT(path, Eq(std::string()));
165}
166
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100167TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200168{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000169 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000170 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200171
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100172 addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200173
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100174 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200175
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200176 EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
177 EXPECT_THAT(path, Eq(std::string()));
178}
179
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100180TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200181{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000182 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000183 .Times(0);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200184
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100185 reportParams.reportingType(ReportingType::periodic);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100186 reportParams.interval(reportParams.interval() - 1ms);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200187
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100188 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200189
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200190 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
191 EXPECT_THAT(path, Eq(std::string()));
192}
193
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100194TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
195{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000196 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100197 .Times(0);
198
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100199 auto [ec, path] = addReport(
200 reportParams.reportName(), "InvalidReportingType",
201 utils::transform(reportParams.reportActions(),
202 [](const auto v) { return utils::enumToString(v); }),
203 reportParams.interval().count(),
204 toReadingParameters(reportParams.metricParameters()));
Karol Niczyj32859b62021-05-19 10:20:46 +0200205
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100206 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
207 EXPECT_THAT(path, Eq(std::string()));
208}
209
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000210TEST_F(TestReportManager,
211 DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100212{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000213 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100214 .Times(0);
215
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000216 reportParams.metricParameters(
217 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
218 {LabeledSensorParameters{"Service",
219 "/xyz/openbmc_project/sensors/power/p1",
220 "Metadata1"}},
221 OperationType::single,
222 "MetricId1",
223 CollectionTimeScope::point,
224 CollectionDuration(Milliseconds(0u))}}});
225
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000226 auto metricParams = reportParams.metricParameters();
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000227 auto& metricParamsVec =
228 metricParams[0].at_label<utils::tstring::SensorPath>();
229
230 for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100231 {
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000232 metricParamsVec.emplace_back(LabeledSensorParameters{
233 "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100234 }
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000235
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000236 reportParams.metricParameters(std::move(metricParams));
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100237
238 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200239
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100240 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
241 EXPECT_THAT(path, Eq(std::string()));
242}
243
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000244TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
245{
246 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
247 .Times(0);
248
249 auto metricParams = std::vector<LabeledMetricParameters>{};
250
251 for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
252 {
253 metricParams.emplace_back(
254 LabeledMetricParameters{{},
255 OperationType::single,
256 "MetricId1",
257 CollectionTimeScope::point,
258 CollectionDuration(Milliseconds(0u))});
259 }
260
261 reportParams.metricParameters(std::move(metricParams));
262
263 auto [ec, path] = addReport(reportParams);
264
265 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
266 EXPECT_THAT(path, Eq(std::string()));
267}
268
269TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
270{
271 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
272 .Times(0);
273
274 reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
275
276 auto [ec, path] = addReport(reportParams);
277
278 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
279 EXPECT_THAT(path, Eq(std::string()));
280}
281
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100282TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200283{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000284 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200285 .Times(ReportManager::maxReports);
286
287 for (size_t i = 0; i < ReportManager::maxReports; i++)
288 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100289 reportParams.reportId(reportParams.reportName() + std::to_string(i));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200290
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100291 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200292 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
293 }
294
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100295 reportParams.reportId(reportParams.reportName() +
296 std::to_string(ReportManager::maxReports));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100297 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200298
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200299 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
300 EXPECT_THAT(path, Eq(std::string()));
301}
302
303TEST_F(TestReportManager, removeReport)
304{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200305 {
306 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000307 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
308 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200309 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
310 EXPECT_CALL(reportMock, Die());
311 EXPECT_CALL(checkPoint, Call("end"));
312 }
313
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100314 addReport(reportParams);
315 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200316 checkPoint.Call("end");
317}
318
319TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
320{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200321 {
322 InSequence seq;
323 EXPECT_CALL(checkPoint, Call("end"));
324 EXPECT_CALL(reportMock, Die());
325 }
326
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100327 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200328 checkPoint.Call("end");
329}
330
331TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
332{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200333 {
334 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000335 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
336 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200337 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
338 EXPECT_CALL(reportMock, Die());
339 EXPECT_CALL(checkPoint, Call("end"));
340 }
341
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100342 addReport(reportParams);
343 sut->removeReport(&reportMock);
344 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200345 checkPoint.Call("end");
346}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100347
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100348TEST_F(TestReportManager, updateReportCallsUpdateReadingsForExistReport)
349{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000350 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100351 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
352 EXPECT_CALL(reportMock, updateReadings());
353
354 addReport(reportParams);
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100355 sut->updateReport(reportParams.reportId());
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100356}
357
358TEST_F(TestReportManager, updateReportDoNothingIfReportDoesNotExist)
359{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000360 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100361 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
362 EXPECT_CALL(reportMock, updateReadings()).Times(0);
363
364 addReport(reportParams);
365 sut->updateReport("NotAReport");
366}
367
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000368class TestReportManagerWithAggregationOperationType :
369 public TestReportManager,
370 public WithParamInterface<OperationType>
371{
372 public:
373 OperationType operationType = GetParam();
374};
375
376INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
377 Values(OperationType::single, OperationType::max,
378 OperationType::min, OperationType::avg,
379 OperationType::sum));
380
381TEST_P(TestReportManagerWithAggregationOperationType,
382 addReportWithDifferentOperationTypes)
383{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000384 reportParams.metricParameters(
385 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
386 {LabeledSensorParameters{"Service",
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100387 "/xyz/openbmc_project/sensors/power/p1",
388 "Metadata1"}},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000389 operationType,
390 "MetricId1",
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000391 CollectionTimeScope::point,
392 CollectionDuration(Milliseconds(0u))}}});
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000393
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000394 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000395 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
396
397 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200398
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000399 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100400 EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000401}
402
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100403class TestReportManagerStorage : public TestReportManager
404{
405 public:
406 using FilePath = interfaces::JsonStorage::FilePath;
407 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
408
409 void SetUp() override
410 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000411 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
412
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100413 ON_CALL(storageMock, list())
414 .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
415 ON_CALL(storageMock, load(FilePath("report1")))
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100416 .WillByDefault(InvokeWithoutArgs([this] { return data; }));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100417 }
418
419 void makeReportManager()
420 {
421 sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
422 std::move(storageMockPtr),
423 DbusEnvironment::getObjServer());
424 }
425
426 nlohmann::json data = nlohmann::json{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200427 {"Enabled", reportParams.enabled()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100428 {"Version", Report::reportVersion},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100429 {"Id", reportParams.reportId()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100430 {"Name", reportParams.reportName()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100431 {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
432 {"ReportActions", reportParams.reportActions()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100433 {"Interval", reportParams.interval().count()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100434 {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
Szymon Dompke3eb56862021-09-20 15:32:04 +0200435 {"AppendLimit", reportParams.appendLimit()},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000436 {"ReadingParameters", reportParams.metricParameters()}};
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100437};
438
439TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
440{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000441 reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100442
443 makeReportManager();
444}
445
446TEST_F(TestReportManagerStorage,
447 reportManagerCtorRemoveFileIfVersionDoesNotMatch)
448{
449 data["Version"] = Report::reportVersion - 1;
450
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100451 EXPECT_CALL(storageMock, remove(FilePath("report1")));
452
453 makeReportManager();
454}
455
456TEST_F(TestReportManagerStorage,
457 reportManagerCtorRemoveFileIfIntervalHasWrongType)
458{
459 data["Interval"] = "1000";
460
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100461 EXPECT_CALL(storageMock, remove(FilePath("report1")));
462
463 makeReportManager();
464}