blob: 10b4de9526f4af29aedd1066f6bf9e6bc22e9242 [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{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100218 {LabeledSensorInfo{"Service",
219 "/xyz/openbmc_project/sensors/power/p1",
220 "Metadata1"}},
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000221 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 {
Szymon Dompke94f71c52021-12-10 07:16:33 +0100232 metricParamsVec.emplace_back(LabeledSensorInfo{
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000233 "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
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +0100282TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
283{
284 reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
285
286 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
287 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
288 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
289
290 auto [ec, path] = addReport(reportParams);
291 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
292 EXPECT_THAT(path, Eq(reportMock.getPath()));
293}
294
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100295TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200296{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000297 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200298 .Times(ReportManager::maxReports);
299
300 for (size_t i = 0; i < ReportManager::maxReports; i++)
301 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100302 reportParams.reportId(reportParams.reportName() + std::to_string(i));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200303
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100304 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200305 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
306 }
307
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100308 reportParams.reportId(reportParams.reportName() +
309 std::to_string(ReportManager::maxReports));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100310 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200311
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200312 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
313 EXPECT_THAT(path, Eq(std::string()));
314}
315
316TEST_F(TestReportManager, removeReport)
317{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200318 {
319 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000320 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
321 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200322 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
323 EXPECT_CALL(reportMock, Die());
324 EXPECT_CALL(checkPoint, Call("end"));
325 }
326
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100327 addReport(reportParams);
328 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200329 checkPoint.Call("end");
330}
331
332TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
333{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200334 {
335 InSequence seq;
336 EXPECT_CALL(checkPoint, Call("end"));
337 EXPECT_CALL(reportMock, Die());
338 }
339
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100340 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200341 checkPoint.Call("end");
342}
343
344TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
345{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200346 {
347 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000348 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
349 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200350 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
351 EXPECT_CALL(reportMock, Die());
352 EXPECT_CALL(checkPoint, Call("end"));
353 }
354
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100355 addReport(reportParams);
356 sut->removeReport(&reportMock);
357 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200358 checkPoint.Call("end");
359}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100360
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100361TEST_F(TestReportManager, updateReportCallsUpdateReadingsForExistReport)
362{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000363 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100364 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
365 EXPECT_CALL(reportMock, updateReadings());
366
367 addReport(reportParams);
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100368 sut->updateReport(reportParams.reportId());
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100369}
370
371TEST_F(TestReportManager, updateReportDoNothingIfReportDoesNotExist)
372{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000373 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100374 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
375 EXPECT_CALL(reportMock, updateReadings()).Times(0);
376
377 addReport(reportParams);
378 sut->updateReport("NotAReport");
379}
380
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000381class TestReportManagerWithAggregationOperationType :
382 public TestReportManager,
383 public WithParamInterface<OperationType>
384{
385 public:
386 OperationType operationType = GetParam();
387};
388
389INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
390 Values(OperationType::single, OperationType::max,
391 OperationType::min, OperationType::avg,
392 OperationType::sum));
393
394TEST_P(TestReportManagerWithAggregationOperationType,
395 addReportWithDifferentOperationTypes)
396{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000397 reportParams.metricParameters(
398 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100399 {LabeledSensorInfo{"Service",
400 "/xyz/openbmc_project/sensors/power/p1",
401 "Metadata1"}},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000402 operationType,
403 "MetricId1",
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000404 CollectionTimeScope::point,
405 CollectionDuration(Milliseconds(0u))}}});
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000406
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000407 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000408 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
409
410 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200411
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000412 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100413 EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000414}
415
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100416class TestReportManagerStorage : public TestReportManager
417{
418 public:
419 using FilePath = interfaces::JsonStorage::FilePath;
420 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
421
422 void SetUp() override
423 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000424 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
425
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100426 ON_CALL(storageMock, list())
427 .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
428 ON_CALL(storageMock, load(FilePath("report1")))
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100429 .WillByDefault(InvokeWithoutArgs([this] { return data; }));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100430 }
431
432 void makeReportManager()
433 {
434 sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
435 std::move(storageMockPtr),
436 DbusEnvironment::getObjServer());
437 }
438
439 nlohmann::json data = nlohmann::json{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200440 {"Enabled", reportParams.enabled()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100441 {"Version", Report::reportVersion},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100442 {"Id", reportParams.reportId()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100443 {"Name", reportParams.reportName()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100444 {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
445 {"ReportActions", reportParams.reportActions()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100446 {"Interval", reportParams.interval().count()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100447 {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
Szymon Dompke3eb56862021-09-20 15:32:04 +0200448 {"AppendLimit", reportParams.appendLimit()},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000449 {"ReadingParameters", reportParams.metricParameters()}};
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100450};
451
452TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
453{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000454 reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100455
456 makeReportManager();
457}
458
459TEST_F(TestReportManagerStorage,
460 reportManagerCtorRemoveFileIfVersionDoesNotMatch)
461{
462 data["Version"] = Report::reportVersion - 1;
463
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100464 EXPECT_CALL(storageMock, remove(FilePath("report1")));
465
466 makeReportManager();
467}
468
469TEST_F(TestReportManagerStorage,
470 reportManagerCtorRemoveFileIfIntervalHasWrongType)
471{
472 data["Interval"] = "1000";
473
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100474 EXPECT_CALL(storageMock, remove(FilePath("report1")));
475
476 makeReportManager();
477}