blob: bf76efcba1f496992943f392de5533ff956bfee2 [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
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +010034 std::unique_ptr<interfaces::TriggerManager> triggerManagerMockPtr =
35 std::make_unique<NiceMock<TriggerManagerMock>>();
36
Wludzik, Jozefe2362792020-10-27 17:23:55 +010037 std::unique_ptr<ReportManager> sut;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020038
39 MockFunction<void(std::string)> checkPoint;
40
Wludzik, Jozefe2362792020-10-27 17:23:55 +010041 void SetUp() override
42 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000043 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _))
44 .Times(AnyNumber());
45
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +010046 sut = std::make_unique<ReportManager>(
47 std::move(reportFactoryMockPtr), std::move(storageMockPtr),
48 DbusEnvironment::getObjServer(), triggerManagerMockPtr);
Wludzik, Jozefe2362792020-10-27 17:23:55 +010049 }
50
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020051 void TearDown() override
52 {
53 DbusEnvironment::synchronizeIoc();
54 }
55
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010056 template <class... Args>
57 requires(sizeof...(Args) > 1)
58 std::pair<boost::system::error_code, std::string> addReport(
59 Args&&... args)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020060 {
61 std::promise<std::pair<boost::system::error_code, std::string>>
62 addReportPromise;
63 DbusEnvironment::getBus()->async_method_call(
64 [&addReportPromise](boost::system::error_code ec,
65 const std::string& path) {
66 addReportPromise.set_value({ec, path});
67 },
68 DbusEnvironment::serviceName(), ReportManager::reportManagerPath,
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000069 ReportManager::reportManagerIfaceName, "AddReportFutureVersion",
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010070 std::forward<Args>(args)...);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +010071 return DbusEnvironment::waitForFuture(addReportPromise.get_future());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020072 }
73
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010074 auto addReport(const ReportParams& params)
75 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010076 return addReport(params.reportId(), params.reportName(),
77 utils::enumToString(params.reportingType()),
78 utils::enumToString(params.reportUpdates()),
79 params.appendLimit(),
80 utils::transform(params.reportActions(),
81 [](const auto v) {
82 return utils::enumToString(v);
83 }),
84 params.interval().count(),
85 toReadingParameters(params.metricParameters()));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010086 }
87
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020088 template <class T>
Szymon Dompkee28aa532021-10-27 12:33:12 +020089 static T getProperty(const std::string& property)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020090 {
Szymon Dompkee28aa532021-10-27 12:33:12 +020091 return DbusEnvironment::getProperty<T>(
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020092 ReportManager::reportManagerPath,
Szymon Dompkee28aa532021-10-27 12:33:12 +020093 ReportManager::reportManagerIfaceName, property);
Karol Niczyj32859b62021-05-19 10:20:46 +020094 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020095};
96
97TEST_F(TestReportManager, minInterval)
98{
99 EXPECT_THAT(getProperty<uint64_t>("MinInterval"),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000100 Eq(ReportManager::minInterval.count()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200101}
102
103TEST_F(TestReportManager, maxReports)
104{
Wludzik, Jozef503c1582020-12-11 14:48:01 +0100105 EXPECT_THAT(getProperty<size_t>("MaxReports"),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200106 Eq(ReportManager::maxReports));
107}
108
109TEST_F(TestReportManager, addReport)
110{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000111 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
112 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200113 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
114
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100115 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200116 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
117 EXPECT_THAT(path, Eq(reportMock.getPath()));
118}
119
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100120TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsEmptyInAddReport)
Karol Niczyj32859b62021-05-19 10:20:46 +0200121{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100122 reportParams.reportId("ReportName");
123 reportParams.reportName("ReportName");
124
125 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
126
127 auto [ec, path] = addReport(reportParams.reportId(""));
128
129 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
130 EXPECT_THAT(path, Eq("/ReportName"));
131}
132
133TEST_F(TestReportManager, nameIsUsedToGenerateIdWhenIdIsNamespace)
134{
135 reportParams.reportId("Prefix/ReportName");
136 reportParams.reportName("ReportName");
137
138 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
139
140 auto [ec, path] = addReport(reportParams.reportId("Prefix/"));
141
142 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
143 EXPECT_THAT(path, Eq("/Prefix/ReportName"));
144}
145
146TEST_F(TestReportManager, addReportWithMaxLengthId)
147{
148 std::string reportId(ReportManager::maxReportIdLength, 'z');
149 reportParams.reportId(reportId);
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000150 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock));
Karol Niczyj32859b62021-05-19 10:20:46 +0200151
152 auto [ec, path] = addReport(reportParams);
153
154 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100155 EXPECT_THAT(path, Eq("/"s + reportId));
Karol Niczyj32859b62021-05-19 10:20:46 +0200156}
157
158TEST_F(TestReportManager, DISABLED_failToAddReportWithTooLongName)
159{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000160 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Karol Niczyj32859b62021-05-19 10:20:46 +0200161 .Times(0);
162
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100163 reportParams.reportId(
164 std::string(ReportManager::maxReportIdLength + 1, 'z'));
Karol Niczyj32859b62021-05-19 10:20:46 +0200165
166 auto [ec, path] = addReport(reportParams);
167
168 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
169 EXPECT_THAT(path, Eq(std::string()));
170}
171
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100172TEST_F(TestReportManager, DISABLED_failToAddReportTwice)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200173{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000174 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000175 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200176
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100177 addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200178
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100179 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200180
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200181 EXPECT_THAT(ec.value(), Eq(boost::system::errc::file_exists));
182 EXPECT_THAT(path, Eq(std::string()));
183}
184
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100185TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidInterval)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200186{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000187 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +0000188 .Times(0);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200189
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100190 reportParams.reportingType(ReportingType::periodic);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100191 reportParams.interval(reportParams.interval() - 1ms);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200192
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100193 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200194
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200195 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
196 EXPECT_THAT(path, Eq(std::string()));
197}
198
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100199TEST_F(TestReportManager, DISABLED_failToAddReportWithInvalidReportingType)
200{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000201 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100202 .Times(0);
203
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100204 auto [ec, path] = addReport(
205 reportParams.reportName(), "InvalidReportingType",
206 utils::transform(reportParams.reportActions(),
207 [](const auto v) { return utils::enumToString(v); }),
208 reportParams.interval().count(),
209 toReadingParameters(reportParams.metricParameters()));
Karol Niczyj32859b62021-05-19 10:20:46 +0200210
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100211 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
212 EXPECT_THAT(path, Eq(std::string()));
213}
214
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000215TEST_F(TestReportManager,
216 DISABLED_failToAddReportWithMoreMetricPropertiesThanExpected)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100217{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000218 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100219 .Times(0);
220
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000221 reportParams.metricParameters(
222 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100223 {LabeledSensorInfo{"Service",
224 "/xyz/openbmc_project/sensors/power/p1",
225 "Metadata1"}},
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000226 OperationType::single,
227 "MetricId1",
228 CollectionTimeScope::point,
229 CollectionDuration(Milliseconds(0u))}}});
230
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000231 auto metricParams = reportParams.metricParameters();
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000232 auto& metricParamsVec =
233 metricParams[0].at_label<utils::tstring::SensorPath>();
234
235 for (size_t i = 0; i < ReportManager::maxNumberMetrics; i++)
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100236 {
Szymon Dompke94f71c52021-12-10 07:16:33 +0100237 metricParamsVec.emplace_back(LabeledSensorInfo{
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000238 "Service", "/xyz/openbmc_project/sensors/power/p1", "Metadata1"});
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100239 }
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000240
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000241 reportParams.metricParameters(std::move(metricParams));
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100242
243 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200244
Wludzik, Jozefbc766b42020-12-08 16:06:22 +0100245 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
246 EXPECT_THAT(path, Eq(std::string()));
247}
248
Ankita Vilas Gawadecd5b0b72022-01-20 20:55:04 +0000249TEST_F(TestReportManager, DISABLED_failToAddReportWithMoreMetricsThanExpected)
250{
251 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
252 .Times(0);
253
254 auto metricParams = std::vector<LabeledMetricParameters>{};
255
256 for (size_t i = 0; i < ReportManager::maxNumberMetrics + 1; i++)
257 {
258 metricParams.emplace_back(
259 LabeledMetricParameters{{},
260 OperationType::single,
261 "MetricId1",
262 CollectionTimeScope::point,
263 CollectionDuration(Milliseconds(0u))});
264 }
265
266 reportParams.metricParameters(std::move(metricParams));
267
268 auto [ec, path] = addReport(reportParams);
269
270 EXPECT_THAT(ec.value(), Eq(boost::system::errc::argument_list_too_long));
271 EXPECT_THAT(path, Eq(std::string()));
272}
273
274TEST_F(TestReportManager, DISABLED_failToAddReportWithAppendLimitGreaterThanMax)
275{
276 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
277 .Times(0);
278
279 reportParams.appendLimit(ReportManager::maxAppendLimit + 1);
280
281 auto [ec, path] = addReport(reportParams);
282
283 EXPECT_THAT(ec.value(), Eq(boost::system::errc::invalid_argument));
284 EXPECT_THAT(path, Eq(std::string()));
285}
286
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +0100287TEST_F(TestReportManager, addReportWithAppendLimitEqualToUint64MaxIsAllowed)
288{
289 reportParams.appendLimit(std::numeric_limits<uint64_t>::max());
290
291 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
292 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
293 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
294
295 auto [ec, path] = addReport(reportParams);
296 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
297 EXPECT_THAT(path, Eq(reportMock.getPath()));
298}
299
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100300TEST_F(TestReportManager, DISABLED_failToAddReportWhenMaxReportIsReached)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200301{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000302 reportFactoryMock.expectMake(std::nullopt, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200303 .Times(ReportManager::maxReports);
304
305 for (size_t i = 0; i < ReportManager::maxReports; i++)
306 {
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100307 reportParams.reportId(reportParams.reportName() + std::to_string(i));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200308
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100309 auto [ec, path] = addReport(reportParams);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200310 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
311 }
312
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100313 reportParams.reportId(reportParams.reportName() +
314 std::to_string(ReportManager::maxReports));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100315 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200316
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200317 EXPECT_THAT(ec.value(), Eq(boost::system::errc::too_many_files_open));
318 EXPECT_THAT(path, Eq(std::string()));
319}
320
321TEST_F(TestReportManager, removeReport)
322{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200323 {
324 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000325 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
326 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200327 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
328 EXPECT_CALL(reportMock, Die());
329 EXPECT_CALL(checkPoint, Call("end"));
330 }
331
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100332 addReport(reportParams);
333 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200334 checkPoint.Call("end");
335}
336
337TEST_F(TestReportManager, removingReportThatIsNotInContainerHasNoEffect)
338{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200339 {
340 InSequence seq;
341 EXPECT_CALL(checkPoint, Call("end"));
342 EXPECT_CALL(reportMock, Die());
343 }
344
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100345 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200346 checkPoint.Call("end");
347}
348
349TEST_F(TestReportManager, removingSameReportTwiceHasNoSideEffect)
350{
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200351 {
352 InSequence seq;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000353 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _));
354 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200355 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
356 EXPECT_CALL(reportMock, Die());
357 EXPECT_CALL(checkPoint, Call("end"));
358 }
359
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100360 addReport(reportParams);
361 sut->removeReport(&reportMock);
362 sut->removeReport(&reportMock);
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200363 checkPoint.Call("end");
364}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100365
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100366TEST_F(TestReportManager, updateReportCallsUpdateReadingsForExistReport)
367{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000368 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100369 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
370 EXPECT_CALL(reportMock, updateReadings());
371
372 addReport(reportParams);
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100373 sut->updateReport(reportParams.reportId());
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100374}
375
376TEST_F(TestReportManager, updateReportDoNothingIfReportDoesNotExist)
377{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000378 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100379 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
380 EXPECT_CALL(reportMock, updateReadings()).Times(0);
381
382 addReport(reportParams);
383 sut->updateReport("NotAReport");
384}
385
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100386TEST_F(TestReportManager, updateTriggerIdsUpdatesThemForExistReport)
387{
388 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
389 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
390 EXPECT_CALL(reportMock, updateTriggerIds("Trigger1", TriggerIdUpdate::Add));
391 EXPECT_CALL(reportMock,
392 updateTriggerIds("Trigger2", TriggerIdUpdate::Remove));
393
394 addReport(reportParams);
395 sut->updateTriggerIds(reportParams.reportId(), "Trigger1",
396 TriggerIdUpdate::Add);
397
398 sut->updateTriggerIds(reportParams.reportId(), "Trigger2",
399 TriggerIdUpdate::Remove);
400}
401
402TEST_F(TestReportManager, updateTriggerIdsDoNothingIfReportDoesNotExist)
403{
404 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
405 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
406 EXPECT_CALL(reportMock, updateTriggerIds(_, _)).Times(0);
407
408 addReport(reportParams);
409 sut->updateTriggerIds("NotAReport", "Trigger1", TriggerIdUpdate::Add);
410}
411
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000412class TestReportManagerWithAggregationOperationType :
413 public TestReportManager,
414 public WithParamInterface<OperationType>
415{
416 public:
417 OperationType operationType = GetParam();
418};
419
420INSTANTIATE_TEST_SUITE_P(_, TestReportManagerWithAggregationOperationType,
421 Values(OperationType::single, OperationType::max,
422 OperationType::min, OperationType::avg,
423 OperationType::sum));
424
425TEST_P(TestReportManagerWithAggregationOperationType,
426 addReportWithDifferentOperationTypes)
427{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000428 reportParams.metricParameters(
429 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
Szymon Dompke94f71c52021-12-10 07:16:33 +0100430 {LabeledSensorInfo{"Service",
431 "/xyz/openbmc_project/sensors/power/p1",
432 "Metadata1"}},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000433 operationType,
434 "MetricId1",
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000435 CollectionTimeScope::point,
436 CollectionDuration(Milliseconds(0u))}}});
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000437
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000438 reportFactoryMock.expectMake(reportParams, Ref(*sut), Ref(storageMock))
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000439 .WillOnce(Return(ByMove(std::move(reportMockPtr))));
440
441 auto [ec, path] = addReport(reportParams);
Karol Niczyj32859b62021-05-19 10:20:46 +0200442
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000443 EXPECT_THAT(ec.value(), Eq(boost::system::errc::success));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100444 EXPECT_THAT(path, Eq("/"s + reportParams.reportId()));
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000445}
446
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100447class TestReportManagerStorage : public TestReportManager
448{
449 public:
450 using FilePath = interfaces::JsonStorage::FilePath;
451 using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
452
453 void SetUp() override
454 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000455 EXPECT_CALL(reportFactoryMock, convertMetricParams(_, _)).Times(0);
456
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100457 ON_CALL(storageMock, list())
458 .WillByDefault(Return(std::vector<FilePath>{FilePath("report1")}));
459 ON_CALL(storageMock, load(FilePath("report1")))
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100460 .WillByDefault(InvokeWithoutArgs([this] { return data; }));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100461 }
462
463 void makeReportManager()
464 {
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100465 sut = std::make_unique<ReportManager>(
466 std::move(reportFactoryMockPtr), std::move(storageMockPtr),
467 DbusEnvironment::getObjServer(), triggerManagerMockPtr);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100468 }
469
470 nlohmann::json data = nlohmann::json{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200471 {"Enabled", reportParams.enabled()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100472 {"Version", Report::reportVersion},
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100473 {"Id", reportParams.reportId()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100474 {"Name", reportParams.reportName()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100475 {"ReportingType", utils::toUnderlying(reportParams.reportingType())},
476 {"ReportActions", reportParams.reportActions()},
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100477 {"Interval", reportParams.interval().count()},
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100478 {"ReportUpdates", utils::toUnderlying(reportParams.reportUpdates())},
Szymon Dompke3eb56862021-09-20 15:32:04 +0200479 {"AppendLimit", reportParams.appendLimit()},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000480 {"ReadingParameters", reportParams.metricParameters()}};
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100481};
482
483TEST_F(TestReportManagerStorage, reportManagerCtorAddReportFromStorage)
484{
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000485 reportFactoryMock.expectMake(reportParams, _, Ref(storageMock));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100486
487 makeReportManager();
488}
489
490TEST_F(TestReportManagerStorage,
491 reportManagerCtorRemoveFileIfVersionDoesNotMatch)
492{
493 data["Version"] = Report::reportVersion - 1;
494
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100495 EXPECT_CALL(storageMock, remove(FilePath("report1")));
496
497 makeReportManager();
498}
499
500TEST_F(TestReportManagerStorage,
501 reportManagerCtorRemoveFileIfIntervalHasWrongType)
502{
503 data["Interval"] = "1000";
504
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100505 EXPECT_CALL(storageMock, remove(FilePath("report1")));
506
507 makeReportManager();
508}