blob: fca64516efc60bcb068e10f2ef80eabcf24ea40d [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
106TEST_F(TestReportManager, addReport)
107{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000108 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
109 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200110 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
111
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100112 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200113 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
114 EXPECT_THAT(path, Eq(reportMock.getPath()));
115}
116
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100117TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
Karol Niczyj32859b62021-05-19 10:20:46 +0200118{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100119 reportParams.reportId("ReportName");
120 reportParams.reportName("ReportName");
121
122 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
123
124 auto [ec, path] = addReport(reportParams.reportId(""));
125
126 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
127 EXPECT_THAT(path, Eq("/ReportName"));
128}
129
130TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
131{
132 reportParams.reportId("Prefix/ReportName");
133 reportParams.reportName("ReportName");
134
135 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
136
137 auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
138
139 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
140 EXPECT_THAT(path, Eq("/Prefix/ReportName"));
141}
142
143TEST_F(TestReportManager, addReportWithMaxLengthId)
144{
145 std::string reportId(ReportManager::maxReportIdLength, 'z');
146 reportParams.reportId(reportId);
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000147 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
Karol Niczyj32859b62021-05-19 10:20:46 +0200148
149 auto [ec, path] = addReport(reportParams);
150
151 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100152 EXPECT_THAT(path, Eq("/"s + reportId));
Karol Niczyj32859b62021-05-19 10:20:46 +0200153}
154
155TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
156{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000157 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Karol Niczyj32859b62021-05-19 10:20:46 +0200158 .Times(0);
159
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100160 reportParams.reportId(
161 std::string(ReportManager::maxReportIdLength + 1, 'z'));
Karol Niczyj32859b62021-05-19 10:20:46 +0200162
163 auto [ec, path] = addReport(reportParams);
164
165 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
166 EXPECT_THAT(path, Eq(std::string()));
167}
168
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100169TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200170{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000171 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000172 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200173
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100174 addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200175
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100176 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200177
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200178 EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
179 EXPECT_THAT(path, Eq(std::string()));
180}
181
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100182TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200183{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000184 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000185 .Times(0);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200186
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100187 reportParams.reportingType(ReportingType::periodic);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100188 reportParams.interval(reportParams.interval() - 1ms);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200189
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100190 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200191
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200192 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
193 EXPECT_THAT(path, Eq(std::string()));
194}
195
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100196TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
197{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000198 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100199 .Times(0);
200
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100201 auto [ec, path] = addReport(
202 reportParams.reportName(), "InvalidReportingType",
203 utils::transform(reportParams.reportActions(),
204 [](const auto v) { return utils::enumToString(v); }),
205 reportParams.interval().count(),
206 toReadingParameters(reportParams.metricParameters()));
Karol Niczyj32859b62021-05-19 10:20:46 +0200207
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100208 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
209 EXPECT_THAT(path, Eq(std::string()));
210}
211
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000212TEST_F(TestReportManager,
213 DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100214{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000215 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100216 .Times(0);
217
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000218 reportParams.metricParameters(
219 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100220 {LabeledSensorInfo{"Service",
221 "/xyz/openbmc_project/sensors/power/p1",
222 "Metadata1"}},
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000223 OperationType::single,
224 "MetricId1",
225 CollectionTimeScope::point,
226 CollectionDuration(Milliseconds(0u))}}});
227
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000228 auto metricParams = reportParams.metricParameters();
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000229 auto& metricParamsVec =
230 metricParams[0].at_label<utils::tstring::SensorPath>();
231
232 for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100233 {
Szymon Dompke94f71c52021-12-10 07:16:33 +0100234 metricParamsVec.emplace_back(LabeledSensorInfo{
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000235 "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100236 }
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000237
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000238 reportParams.metricParameters(std::move(metricParams));
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100239
240 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200241
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100242 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
243 EXPECT_THAT(path, Eq(std::string()));
244}
245
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000246TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
247{
248 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
249 .Times(0);
250
251 auto metricParams = std::vector<LabeledMetricParameters>{};
252
253 for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
254 {
255 metricParams.emplace_back(
256 LabeledMetricParameters{{},
257 OperationType::single,
258 "MetricId1",
259 CollectionTimeScope::point,
260 CollectionDuration(Milliseconds(0u))});
261 }
262
263 reportParams.metricParameters(std::move(metricParams));
264
265 auto [ec, path] = addReport(reportParams);
266
267 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
268 EXPECT_THAT(path, Eq(std::string()));
269}
270
271TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
272{
273 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
274 .Times(0);
275
276 reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
277
278 auto [ec, path] = addReport(reportParams);
279
280 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
281 EXPECT_THAT(path, Eq(std::string()));
282}
283
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +0100284TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
285{
286 reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
287
288 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
289 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
290 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
291
292 auto [ec, path] = addReport(reportParams);
293 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
294 EXPECT_THAT(path, Eq(reportMock.getPath()));
295}
296
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100297TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200298{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000299 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200300 .Times(ReportManager::maxReports);
301
302 for (size_t i = 0; i < ReportManager::maxReports; i++)
303 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100304 reportParams.reportId(reportParams.reportName() + std::to_string(i));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200305
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100306 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200307 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
308 }
309
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100310 reportParams.reportId(reportParams.reportName() +
311 std::to_string(ReportManager::maxReports));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100312 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200313
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200314 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
315 EXPECT_THAT(path, Eq(std::string()));
316}
317
318TEST_F(TestReportManager, removeReport)
319{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200320 {
321 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000322 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
323 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200324 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
325 EXPECT_CALL(reportMock, Die());
326 EXPECT_CALL(checkPoint, Call("end"));
327 }
328
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100329 addReport(reportParams);
330 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200331 checkPoint.Call("end");
332}
333
334TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
335{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200336 {
337 InSequence seq;
338 EXPECT_CALL(checkPoint, Call("end"));
339 EXPECT_CALL(reportMock, Die());
340 }
341
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100342 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200343 checkPoint.Call("end");
344}
345
346TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
347{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200348 {
349 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000350 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
351 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200352 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
353 EXPECT_CALL(reportMock, Die());
354 EXPECT_CALL(checkPoint, Call("end"));
355 }
356
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100357 addReport(reportParams);
358 sut->removeReport(&reportMock);
359 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200360 checkPoint.Call("end");
361}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100362
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000363class TestReportManagerWithAggregationOperationType :
364 public TestReportManager,
365 public WithParamInterface<OperationType>
366{
367 public:
368 OperationType operationType = GetParam();
369};
370
371INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
372 Values(OperationType::single, OperationType::max,
373 OperationType::min, OperationType::avg,
374 OperationType::sum));
375
376TEST_P(TestReportManagerWithAggregationOperationType,
377 addReportWithDifferentOperationTypes)
378{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000379 reportParams.metricParameters(
380 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100381 {LabeledSensorInfo{"Service",
382 "/xyz/openbmc_project/sensors/power/p1",
383 "Metadata1"}},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000384 operationType,
385 "MetricId1",
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000386 CollectionTimeScope::point,
387 CollectionDuration(Milliseconds(0u))}}});
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000388
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000389 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000390 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
391
392 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200393
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000394 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100395 EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000396}
397
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100398class TestReportManagerStorage : public TestReportManager
399{
400 public:
401 using FilePath = interfaces::JsonStorage::FilePath;
402 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
403
404 void SetUp() override
405 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000406 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
407
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100408 ON_CALL(storageMock, list())
409 .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
410 ON_CALL(storageMock, load(FilePath("report1")))
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100411 .WillByDefault(InvokeWithoutArgs([this] { return data; }));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100412 }
413
414 void makeReportManager()
415 {
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100416 sut = std::make_unique<ReportManager>(std::move(reportFactoryMockPtr),
417 std::move(storageMockPtr),
418 DbusEnvironment::getObjServer());
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100419 }
420
421 nlohmann::json data = nlohmann::json{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200422 {"Enabled", reportParams.enabled()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100423 {"Version", Report::reportVersion},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100424 {"Id", reportParams.reportId()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100425 {"Name", reportParams.reportName()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100426 {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
427 {"ReportActions", reportParams.reportActions()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100428 {"Interval", reportParams.interval().count()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100429 {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
Szymon Dompke3eb56862021-09-20 15:32:04 +0200430 {"AppendLimit", reportParams.appendLimit()},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000431 {"ReadingParameters", reportParams.metricParameters()}};
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100432};
433
434TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
435{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000436 reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100437
438 makeReportManager();
439}
440
441TEST_F(TestReportManagerStorage,
442 reportManagerCtorRemoveFileIfVersionDoesNotMatch)
443{
444 data["Version"] = Report::reportVersion - 1;
445
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100446 EXPECT_CALL(storageMock, remove(FilePath("report1")));
447
448 makeReportManager();
449}
450
451TEST_F(TestReportManagerStorage,
452 reportManagerCtorRemoveFileIfIntervalHasWrongType)
453{
454 data["Interval"] = "1000";
455
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100456 EXPECT_CALL(storageMock, remove(FilePath("report1")));
457
458 makeReportManager();
459}