blob: f4ce184ffba48e900527da22c83fce0dd336fa51 [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"
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +01003#include "interfaces/trigger_manager.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01004#include "mocks/json_storage_mock.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02005#include "mocks/report_factory_mock.hpp"
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +01006#include "mocks/trigger_manager_mock.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01007#include "params/report_params.hpp"
8#include "report.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02009#include "report_manager.hpp"
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000010#include "utils/conversion.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +010011#include "utils/transform.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020012
13using namespace testing;
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000014using namespace std::string_literals;
Wludzik, Jozefe2362792020-10-27 17:23:55 +010015using namespace std::chrono_literals;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020016
17class TestReportManager : public Test
18{
19 public:
Wludzik, Jozefe2362792020-10-27 17:23:55 +010020 ReportParams reportParams;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020021
22 std::unique_ptr<ReportFactoryMock> reportFactoryMockPtr =
23 std::make_unique<StrictMock<ReportFactoryMock>>();
24 ReportFactoryMock& reportFactoryMock = *reportFactoryMockPtr;
Wludzik, Jozefe2362792020-10-27 17:23:55 +010025
26 std::unique_ptr<StorageMock> storageMockPtr =
27 std::make_unique<NiceMock<StorageMock>>();
28 StorageMock& storageMock = *storageMockPtr;
29
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000030 std::unique_ptr<ReportMock> reportMockPtr =
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010031 std::make_unique<NiceMock<ReportMock>>(reportParams.reportId());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000032 ReportMock& reportMock = *reportMockPtr;
33
Wludzik, Jozefe2362792020-10-27 17:23:55 +010034 std::unique_ptr<ReportManager> sut;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020035
36 MockFunction<void(std::string)> checkPoint;
37
Wludzik, Jozefe2362792020-10-27 17:23:55 +010038 void SetUp() override
39 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000040 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _))
41 .Times(AnyNumber());
42
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +010043 sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
44 std::move(storageMockPtr),
45 DbusEnvironment::getObjServer());
Wludzik, Jozefe2362792020-10-27 17:23:55 +010046 }
47
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020048 void TearDown() override
49 {
50 DbusEnvironment::synchronizeIoc();
51 }
52
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010053 template <class... Args>
54 requires(sizeof...(Args) > 1)
55 std::pair<boost::system::error_code, std::string> addReport(
56 Args&&... args)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020057 {
58 std::promise<std::pair<boost::system::error_code, std::string>>
59 addReportPromise;
60 DbusEnvironment::getBus()->async_method_call(
61 [&addReportPromise](boost::system::error_code ec,
62 const std::string& path) {
63 addReportPromise.set_value({ec, path});
64 },
65 DbusEnvironment::serviceName(), ReportManager::reportManagerPath,
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000066 ReportManager::reportManagerIfaceName, "AddReportFutureVersion",
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010067 std::forward<Args>(args)...);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +010068 return DbusEnvironment::waitForFuture(addReportPromise.get_future());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020069 }
70
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010071 auto addReport(const ReportParams& params)
72 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010073 return addReport(params.reportId(), params.reportName(),
74 utils::enumToString(params.reportingType()),
75 utils::enumToString(params.reportUpdates()),
76 params.appendLimit(),
77 utils::transform(params.reportActions(),
78 [](const auto v) {
79 return utils::enumToString(v);
80 }),
81 params.interval().count(),
82 toReadingParameters(params.metricParameters()));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010083 }
84
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020085 template <class T>
Szymon Dompkee28aa532021-10-27 12:33:12 +020086 static T getProperty(const std::string& property)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020087 {
Szymon Dompkee28aa532021-10-27 12:33:12 +020088 return DbusEnvironment::getProperty<T>(
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020089 ReportManager::reportManagerPath,
Szymon Dompkee28aa532021-10-27 12:33:12 +020090 ReportManager::reportManagerIfaceName, property);
Karol Niczyj32859b62021-05-19 10:20:46 +020091 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020092};
93
94TEST_F(TestReportManager, minInterval)
95{
96 EXPECT_THAT(getProperty<uint64_t>("MinInterval"),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000097 Eq(ReportManager::minInterval.count()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020098}
99
100TEST_F(TestReportManager, maxReports)
101{
Wludzik, Jozef503c1582020-12-11 14:48:01 +0100102 EXPECT_THAT(getProperty<size_t>("MaxReports"),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200103 Eq(ReportManager::maxReports));
104}
105
Krzysztof Grobelny60fee072022-01-13 16:25:04 +0100106TEST_F(TestReportManager, returnsPropertySupportedOperationTypes)
107{
108 EXPECT_THAT(
109 getProperty<std::vector<std::string>>("SupportedOperationTypes"),
110 UnorderedElementsAre("Maximum", "Minimum", "Average", "Summation"));
111}
112
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200113TEST_F(TestReportManager, addReport)
114{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000115 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
116 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200117 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
118
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100119 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200120 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
121 EXPECT_THAT(path, Eq(reportMock.getPath()));
122}
123
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100124TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
Karol Niczyj32859b62021-05-19 10:20:46 +0200125{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100126 reportParams.reportId("ReportName");
127 reportParams.reportName("ReportName");
128
129 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
130
131 auto [ec, path] = addReport(reportParams.reportId(""));
132
133 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
134 EXPECT_THAT(path, Eq("/ReportName"));
135}
136
137TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
138{
139 reportParams.reportId("Prefix/ReportName");
140 reportParams.reportName("ReportName");
141
142 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
143
144 auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
145
146 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
147 EXPECT_THAT(path, Eq("/Prefix/ReportName"));
148}
149
150TEST_F(TestReportManager, addReportWithMaxLengthId)
151{
152 std::string reportId(ReportManager::maxReportIdLength, 'z');
153 reportParams.reportId(reportId);
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000154 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
Karol Niczyj32859b62021-05-19 10:20:46 +0200155
156 auto [ec, path] = addReport(reportParams);
157
158 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100159 EXPECT_THAT(path, Eq("/"s + reportId));
Karol Niczyj32859b62021-05-19 10:20:46 +0200160}
161
162TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
163{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000164 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Karol Niczyj32859b62021-05-19 10:20:46 +0200165 .Times(0);
166
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100167 reportParams.reportId(
168 std::string(ReportManager::maxReportIdLength + 1, 'z'));
Karol Niczyj32859b62021-05-19 10:20:46 +0200169
170 auto [ec, path] = addReport(reportParams);
171
172 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
173 EXPECT_THAT(path, Eq(std::string()));
174}
175
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100176TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200177{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000178 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000179 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200180
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100181 addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200182
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100183 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200184
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200185 EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
186 EXPECT_THAT(path, Eq(std::string()));
187}
188
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100189TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200190{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000191 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000192 .Times(0);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200193
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100194 reportParams.reportingType(ReportingType::periodic);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100195 reportParams.interval(reportParams.interval() - 1ms);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200196
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100197 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200198
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200199 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
200 EXPECT_THAT(path, Eq(std::string()));
201}
202
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100203TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
204{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000205 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100206 .Times(0);
207
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100208 auto [ec, path] = addReport(
209 reportParams.reportName(), "InvalidReportingType",
210 utils::transform(reportParams.reportActions(),
211 [](const auto v) { return utils::enumToString(v); }),
212 reportParams.interval().count(),
213 toReadingParameters(reportParams.metricParameters()));
Karol Niczyj32859b62021-05-19 10:20:46 +0200214
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100215 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
216 EXPECT_THAT(path, Eq(std::string()));
217}
218
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000219TEST_F(TestReportManager,
220 DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100221{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000222 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100223 .Times(0);
224
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000225 reportParams.metricParameters(
226 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100227 {LabeledSensorInfo{"Service",
228 "/xyz/openbmc_project/sensors/power/p1",
229 "Metadata1"}},
Krzysztof Grobelny60fee072022-01-13 16:25:04 +0100230 OperationType::avg,
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000231 "MetricId1",
232 CollectionTimeScope::point,
233 CollectionDuration(Milliseconds(0u))}}});
234
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000235 auto metricParams = reportParams.metricParameters();
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000236 auto& metricParamsVec =
237 metricParams[0].at_label<utils::tstring::SensorPath>();
238
239 for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100240 {
Szymon Dompke94f71c52021-12-10 07:16:33 +0100241 metricParamsVec.emplace_back(LabeledSensorInfo{
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000242 "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100243 }
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000244
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000245 reportParams.metricParameters(std::move(metricParams));
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100246
247 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200248
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100249 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
250 EXPECT_THAT(path, Eq(std::string()));
251}
252
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000253TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
254{
255 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
256 .Times(0);
257
258 auto metricParams = std::vector<LabeledMetricParameters>{};
259
260 for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
261 {
262 metricParams.emplace_back(
263 LabeledMetricParameters{{},
Krzysztof Grobelny60fee072022-01-13 16:25:04 +0100264 OperationType::avg,
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000265 "MetricId1",
266 CollectionTimeScope::point,
267 CollectionDuration(Milliseconds(0u))});
268 }
269
270 reportParams.metricParameters(std::move(metricParams));
271
272 auto [ec, path] = addReport(reportParams);
273
274 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
275 EXPECT_THAT(path, Eq(std::string()));
276}
277
278TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
279{
280 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
281 .Times(0);
282
283 reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
284
285 auto [ec, path] = addReport(reportParams);
286
287 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
288 EXPECT_THAT(path, Eq(std::string()));
289}
290
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +0100291TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
292{
293 reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
294
295 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
296 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
297 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
298
299 auto [ec, path] = addReport(reportParams);
300 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
301 EXPECT_THAT(path, Eq(reportMock.getPath()));
302}
303
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100304TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200305{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000306 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200307 .Times(ReportManager::maxReports);
308
309 for (size_t i = 0; i < ReportManager::maxReports; i++)
310 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100311 reportParams.reportId(reportParams.reportName() + std::to_string(i));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200312
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100313 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200314 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
315 }
316
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100317 reportParams.reportId(reportParams.reportName() +
318 std::to_string(ReportManager::maxReports));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100319 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200320
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200321 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
322 EXPECT_THAT(path, Eq(std::string()));
323}
324
325TEST_F(TestReportManager, removeReport)
326{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200327 {
328 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000329 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
330 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200331 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
332 EXPECT_CALL(reportMock, Die());
333 EXPECT_CALL(checkPoint, Call("end"));
334 }
335
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100336 addReport(reportParams);
337 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200338 checkPoint.Call("end");
339}
340
341TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
342{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200343 {
344 InSequence seq;
345 EXPECT_CALL(checkPoint, Call("end"));
346 EXPECT_CALL(reportMock, Die());
347 }
348
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100349 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200350 checkPoint.Call("end");
351}
352
353TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
354{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200355 {
356 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000357 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
358 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200359 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
360 EXPECT_CALL(reportMock, Die());
361 EXPECT_CALL(checkPoint, Call("end"));
362 }
363
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100364 addReport(reportParams);
365 sut->removeReport(&reportMock);
366 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200367 checkPoint.Call("end");
368}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100369
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000370class TestReportManagerWithAggregationOperationType :
371 public TestReportManager,
372 public WithParamInterface<OperationType>
373{
374 public:
375 OperationType operationType = GetParam();
376};
377
378INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
Krzysztof Grobelny60fee072022-01-13 16:25:04 +0100379 Values(OperationType::max, OperationType::min,
380 OperationType::avg, OperationType::sum));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000381
382TEST_P(TestReportManagerWithAggregationOperationType,
383 addReportWithDifferentOperationTypes)
384{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000385 reportParams.metricParameters(
386 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100387 {LabeledSensorInfo{"Service",
388 "/xyz/openbmc_project/sensors/power/p1",
389 "Metadata1"}},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000390 operationType,
391 "MetricId1",
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000392 CollectionTimeScope::point,
393 CollectionDuration(Milliseconds(0u))}}});
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000394
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000395 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000396 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
397
398 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200399
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000400 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100401 EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000402}
403
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100404class TestReportManagerStorage : public TestReportManager
405{
406 public:
407 using FilePath = interfaces::JsonStorage::FilePath;
408 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
409
410 void SetUp() override
411 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000412 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
413
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100414 ON_CALL(storageMock, list())
415 .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
416 ON_CALL(storageMock, load(FilePath("report1")))
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100417 .WillByDefault(InvokeWithoutArgs([this] { return data; }));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100418 }
419
420 void makeReportManager()
421 {
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100422 sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
423 std::move(storageMockPtr),
424 DbusEnvironment::getObjServer());
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100425 }
426
427 nlohmann::json data = nlohmann::json{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200428 {"Enabled", reportParams.enabled()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100429 {"Version", Report::reportVersion},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100430 {"Id", reportParams.reportId()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100431 {"Name", reportParams.reportName()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100432 {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
433 {"ReportActions", reportParams.reportActions()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100434 {"Interval", reportParams.interval().count()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100435 {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
Szymon Dompke3eb56862021-09-20 15:32:04 +0200436 {"AppendLimit", reportParams.appendLimit()},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000437 {"ReadingParameters", reportParams.metricParameters()}};
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100438};
439
440TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
441{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000442 reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100443
444 makeReportManager();
445}
446
447TEST_F(TestReportManagerStorage,
448 reportManagerCtorRemoveFileIfVersionDoesNotMatch)
449{
450 data["Version"] = Report::reportVersion - 1;
451
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100452 EXPECT_CALL(storageMock, remove(FilePath("report1")));
453
454 makeReportManager();
455}
456
457TEST_F(TestReportManagerStorage,
458 reportManagerCtorRemoveFileIfIntervalHasWrongType)
459{
460 data["Interval"] = "1000";
461
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100462 EXPECT_CALL(storageMock, remove(FilePath("report1")));
463
464 makeReportManager();
465}