blob: 8226f66eecfa29822df7f49600b374fc00811718 [file] [log] [blame]
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02001#include "dbus_environment.hpp"
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +01002#include "fakes/clock_fake.hpp"
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +00003#include "helpers.hpp"
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +01004#include "messages/collect_trigger_id.hpp"
5#include "messages/trigger_presence_changed_ind.hpp"
6#include "messages/update_report_ind.hpp"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01007#include "mocks/json_storage_mock.hpp"
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +02008#include "mocks/metric_mock.hpp"
Szymon Dompkefdb06a12022-02-11 11:04:44 +01009#include "mocks/report_factory_mock.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020010#include "mocks/report_manager_mock.hpp"
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020011#include "params/report_params.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020012#include "report.hpp"
13#include "report_manager.hpp"
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010014#include "utils/clock.hpp"
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010015#include "utils/contains.hpp"
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020016#include "utils/conv_container.hpp"
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +010017#include "utils/messanger.hpp"
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010018#include "utils/transform.hpp"
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000019#include "utils/tstring.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020020
21#include <sdbusplus/exception.hpp>
22
23using namespace testing;
24using namespace std::literals::string_literals;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020025using namespace std::chrono_literals;
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000026namespace tstring = utils::tstring;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020027
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +020028using ErrorMessageDbusType = std::tuple<std::string, std::string>;
29using ErrorMessagesDbusType = std::vector<ErrorMessageDbusType>;
30
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010031constexpr Milliseconds systemTimestamp = 55ms;
32
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +010033namespace
34{
35
36ReportParams defaultParams()
37{
38 return ReportParams();
39}
40
41ReportParams defaultOnChangeParams()
42{
43 return defaultParams().reportingType(ReportingType::onChange);
44}
45
46} // namespace
47
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020048class TestReport : public Test
49{
50 public:
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020051 std::unique_ptr<ReportManagerMock> reportManagerMock =
Wludzik, Jozefe2362792020-10-27 17:23:55 +010052 std::make_unique<NiceMock<ReportManagerMock>>();
Szymon Dompkefdb06a12022-02-11 11:04:44 +010053 std::unique_ptr<ReportFactoryMock> reportFactoryMock =
54 std::make_unique<NiceMock<ReportFactoryMock>>();
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +010055 nlohmann::json storedConfiguration;
Szymon Dompkefdb06a12022-02-11 11:04:44 +010056 NiceMock<StorageMock> storageMock;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000057 std::vector<std::shared_ptr<MetricMock>> metricMocks;
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010058 std::unique_ptr<ClockFake> clockFakePtr = std::make_unique<ClockFake>();
59 ClockFake& clockFake = *clockFakePtr;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020060 std::unique_ptr<Report> sut;
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +010061 utils::Messanger messanger;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020062
Wludzik, Jozefe2362792020-10-27 17:23:55 +010063 MockFunction<void()> checkPoint;
64
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +010065 TestReport() : messanger(DbusEnvironment::getIoc())
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010066 {
67 clockFake.system.set(systemTimestamp);
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +010068 ON_CALL(storageMock, store(to_file_path(ReportParams().reportId()), _))
69 .WillByDefault(SaveArg<1>(&storedConfiguration));
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010070 }
71
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000072 void initMetricMocks(
73 const std::vector<LabeledMetricParameters>& metricParameters)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010074 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000075 for (auto i = metricMocks.size(); i < metricParameters.size(); ++i)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010076 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000077 metricMocks.emplace_back(std::make_shared<NiceMock<MetricMock>>());
78 }
79 metricMocks.resize(metricParameters.size());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000080
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000081 std::vector<MetricValue> readings{{MetricValue{"a", "b", 17.1, 114},
82 MetricValue{"aa", "bb", 42.0, 74}}};
83 readings.resize(metricParameters.size());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000084
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000085 for (size_t i = 0; i < metricParameters.size(); ++i)
86 {
Krzysztof Grobelny9e8da542022-02-17 10:40:16 +010087 ON_CALL(*metricMocks[i], getUpdatedReadings())
88 .WillByDefault(ReturnRefOfCopy(std::vector({readings[i]})));
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000089 ON_CALL(*metricMocks[i], dumpConfiguration())
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000090 .WillByDefault(Return(metricParameters[i]));
Wludzik, Jozefe2362792020-10-27 17:23:55 +010091 }
92 }
93
Szymon Dompkefdb06a12022-02-11 11:04:44 +010094 std::vector<std::shared_ptr<interfaces::Metric>>
95 getMetricsFromReadingParams(const ReadingParameters& params)
96 {
97 const auto metricParameters =
98 reportFactoryMock->convertMetricParams(params);
99 std::vector<std::shared_ptr<MetricMock>> metricMocks;
100
101 for (size_t i = 0; i < metricParameters.size(); ++i)
102 {
103 metricMocks.emplace_back(std::make_shared<NiceMock<MetricMock>>());
104 ON_CALL(*metricMocks[i], dumpConfiguration())
105 .WillByDefault(Return(metricParameters[i]));
106 }
107
108 return utils::convContainer<std::shared_ptr<interfaces::Metric>>(
109 metricMocks);
110 }
111
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200112 void SetUp() override
113 {
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100114 sut = makeReport(defaultParams());
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200115 }
116
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100117 static interfaces::JsonStorage::FilePath to_file_path(std::string id)
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100118 {
119 return interfaces::JsonStorage::FilePath(
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100120 std::to_string(std::hash<std::string>{}(id)));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100121 }
122
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200123 std::unique_ptr<Report> makeReport(const ReportParams& params)
124 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000125 initMetricMocks(params.metricParameters());
126
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200127 return std::make_unique<Report>(
128 DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100129 params.reportId(), params.reportName(), params.reportingType(),
130 params.reportActions(), params.interval(), params.appendLimit(),
131 params.reportUpdates(), *reportManagerMock, storageMock,
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200132 utils::convContainer<std::shared_ptr<interfaces::Metric>>(
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200133 metricMocks),
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100134 *reportFactoryMock, params.enabled(), std::move(clockFakePtr),
135 params.readings());
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200136 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200137
138 template <class T>
139 static T getProperty(const std::string& path, const std::string& property)
140 {
Szymon Dompkee28aa532021-10-27 12:33:12 +0200141 return DbusEnvironment::getProperty<T>(path, Report::reportIfaceName,
142 property);
143 }
144
145 template <class T>
146 static boost::system::error_code setProperty(const std::string& path,
147 const std::string& property,
148 const T& newValue)
149 {
150 return DbusEnvironment::setProperty<T>(path, Report::reportIfaceName,
151 property, newValue);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100152 }
153
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200154 template <class T>
155 struct ChangePropertyParams
156 {
157 Matcher<T> valueBefore = _;
158 T newValue;
159 Matcher<boost::system::error_code> ec =
160 Eq(boost::system::errc::success);
161 Matcher<T> valueAfter = Eq(newValue);
162 };
163
164 template <class T>
165 static void changeProperty(const std::string& path,
166 const std::string& property,
167 ChangePropertyParams<T> p)
168 {
169 ASSERT_THAT(getProperty<T>(path, property), p.valueBefore);
170 ASSERT_THAT(setProperty<T>(path, property, p.newValue), p.ec);
171 EXPECT_THAT(getProperty<T>(path, property), p.valueAfter);
172 }
173
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100174 boost::system::error_code call(const std::string& path,
175 const std::string& interface,
176 const std::string& method)
177 {
178 std::promise<boost::system::error_code> methodPromise;
179 DbusEnvironment::getBus()->async_method_call(
180 [&methodPromise](boost::system::error_code ec) {
181 methodPromise.set_value(ec);
182 },
183 DbusEnvironment::serviceName(), path, interface, method);
184 return DbusEnvironment::waitForFuture(methodPromise.get_future());
185 }
186
187 boost::system::error_code update(const std::string& path)
188 {
189 return call(path, Report::reportIfaceName, "Update");
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200190 }
191
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200192 boost::system::error_code deleteReport(const std::string& path)
193 {
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100194 return call(path, Report::deleteIfaceName, "Delete");
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200195 }
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200196
197 static std::pair<std::string, std::vector<std::string>>
198 makeStateDetail(const std::string& detailType,
199 std::vector<std::string> detailArgs)
200 {
201 return make_pair(detailType, detailArgs);
202 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200203};
204
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100205TEST_F(TestReport, returnsId)
206{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100207 EXPECT_THAT(sut->getId(), Eq(defaultParams().reportId()));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100208}
209
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200210TEST_F(TestReport, verifyIfPropertiesHaveValidValue)
211{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200212 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100213 Eq(defaultParams().enabled()));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200214 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100215 Eq(defaultParams().interval().count()));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100216 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistency"), Eq(true));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100217 EXPECT_THAT(
218 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100219 Eq(utils::transform(defaultParams().reportActions(), [](const auto v) {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100220 return utils::enumToString(v);
221 })));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200222 EXPECT_THAT(getProperty<bool>(sut->getPath(), "EmitsReadingsUpdate"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100223 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100224 ReportAction::emitsReadingsUpdate)));
Szymon Dompke3eb56862021-09-20 15:32:04 +0200225 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "AppendLimit"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100226 Eq(defaultParams().appendLimit()));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100227 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportingType"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100228 Eq(utils::enumToString(defaultParams().reportingType())));
Szymon Dompke3eb56862021-09-20 15:32:04 +0200229 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportUpdates"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100230 Eq(utils::enumToString(defaultParams().reportUpdates())));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200231 EXPECT_THAT(
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200232 getProperty<bool>(sut->getPath(), "LogToMetricReportsCollection"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100233 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100234 ReportAction::logToMetricReportsCollection)));
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000235 EXPECT_THAT(getProperty<ReadingParameters>(
236 sut->getPath(), "ReadingParametersFutureVersion"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100237 Eq(toReadingParameters(defaultParams().metricParameters())));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100238 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100239 Eq(defaultParams().reportName()));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100240 EXPECT_THAT(
241 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200242 IsEmpty());
243 EXPECT_THAT(
244 getProperty<ErrorMessagesDbusType>(sut->getPath(), "ErrorMessages"),
245 IsEmpty());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200246}
247
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200248TEST_F(TestReport, readingsAreInitialyEmpty)
249{
250 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
251 Eq(Readings{}));
252}
253
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100254TEST_F(TestReport, setReadingParametersWithNewParams)
255{
256 ReadingParameters newParams = toReadingParameters(
257 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
258 {LabeledSensorInfo{"Service",
259 "/xyz/openbmc_project/sensors/power/psu",
260 "NewMetadata123"}},
261 OperationType::avg,
262 "NewMetricId123",
263 CollectionTimeScope::startup,
264 CollectionDuration(250ms)}}});
265 auto metrics = getMetricsFromReadingParams(newParams);
266
267 EXPECT_CALL(*reportFactoryMock, updateMetrics(_, _, _))
268 .WillOnce(SetArgReferee<0>(metrics));
269 EXPECT_THAT(
270 setProperty(sut->getPath(), "ReadingParametersFutureVersion", newParams)
271 .value(),
272 Eq(boost::system::errc::success));
273 EXPECT_THAT(getProperty<ReadingParameters>(
274 sut->getPath(), "ReadingParametersFutureVersion"),
275 Eq(newParams));
276}
277
278TEST_F(TestReport, setReportingTypeWithValidNewType)
279{
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200280 changeProperty<std::string>(
281 sut->getPath(), "ReportingType",
282 {.valueBefore = Not(Eq(utils::enumToString(ReportingType::onRequest))),
283 .newValue = utils::enumToString(ReportingType::onRequest)});
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100284}
285
286TEST_F(TestReport, setReportingTypeWithInvalidType)
287{
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200288 const std::string currentValue =
289 utils::enumToString(defaultParams().reportingType());
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100290
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200291 changeProperty<std::string>(
292 sut->getPath(), "ReportingType",
293 {.valueBefore = Eq(currentValue),
294 .newValue = "Periodic_ABC",
295 .ec = Eq(boost::system::errc::invalid_argument),
296 .valueAfter = Eq(currentValue)});
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100297}
298
299TEST_F(TestReport, setReportActionsWithValidNewActions)
300{
301 std::vector<std::string> newActions = {"EmitsReadingsUpdate"};
302 std::vector<std::string> currActions =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100303 utils::transform(defaultParams().reportActions(),
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100304 [](const auto v) { return utils::enumToString(v); });
305
306 EXPECT_THAT(newActions, Ne(currActions));
307 EXPECT_THAT(
308 setProperty(sut->getPath(), "ReportActions", newActions).value(),
309 Eq(boost::system::errc::success));
310 EXPECT_THAT(
311 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
312 UnorderedElementsAre("EmitsReadingsUpdate",
313 "LogToMetricReportsCollection"));
314}
315
316TEST_F(TestReport, setReportActionsWithValidUnsortedActions)
317{
318 std::vector<std::string> newActions = {"LogToMetricReportsCollection",
319 "EmitsReadingsUpdate"};
320 std::vector<std::string> expectedActions = {"EmitsReadingsUpdate",
321 "LogToMetricReportsCollection"};
322 std::vector<std::string> currActions =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100323 utils::transform(defaultParams().reportActions(),
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100324 [](const auto v) { return utils::enumToString(v); });
325
326 EXPECT_THAT(newActions, Ne(currActions));
327 EXPECT_THAT(
328 setProperty(sut->getPath(), "ReportActions", newActions).value(),
329 Eq(boost::system::errc::success));
330 EXPECT_THAT(
331 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
332 Eq(expectedActions));
333}
334
335TEST_F(TestReport, setReportActionsWithEmptyActions)
336{
337 std::vector<std::string> newActions = {};
338 std::vector<std::string> expectedActions = {"LogToMetricReportsCollection"};
339 std::vector<std::string> currActions =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100340 utils::transform(defaultParams().reportActions(),
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100341 [](const auto v) { return utils::enumToString(v); });
342
343 EXPECT_THAT(newActions, Ne(currActions));
344 EXPECT_THAT(
345 setProperty(sut->getPath(), "ReportActions", newActions).value(),
346 Eq(boost::system::errc::success));
347 EXPECT_THAT(
348 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
349 Eq(expectedActions));
350}
351
352TEST_F(TestReport, setReportActionsWithInvalidActions)
353{
354 std::vector<std::string> invalidActions = {"EmitsReadingsUpdate_1"};
355 EXPECT_THAT(
356 setProperty(sut->getPath(), "ReportActions", invalidActions).value(),
357 Eq(boost::system::errc::invalid_argument));
358 EXPECT_THAT(
359 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100360 Eq(utils::transform(defaultParams().reportActions(), [](const auto v) {
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100361 return utils::enumToString(v);
362 })));
363}
364
365TEST_F(TestReport, createReportWithEmptyActions)
366{
367 std::vector<std::string> expectedActions = {"LogToMetricReportsCollection"};
368
369 sut = makeReport(ReportParams().reportId("TestId_1").reportActions({}));
370 EXPECT_THAT(
371 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
372 Eq(expectedActions));
373}
374
375TEST_F(TestReport, createReportWithValidUnsortedActions)
376{
377 std::vector<std::string> newActions = {"LogToMetricReportsCollection",
378 "EmitsReadingsUpdate"};
379 std::vector<std::string> expectedActions = {"EmitsReadingsUpdate",
380 "LogToMetricReportsCollection"};
381
382 sut = makeReport(
383 ReportParams()
384 .reportId("TestId_1")
385 .reportActions(utils::transform(newActions, [](const auto& action) {
386 return utils::toReportAction(action);
387 })));
388 EXPECT_THAT(
389 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
390 Eq(expectedActions));
391}
392
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200393TEST_F(TestReport, setEnabledWithNewValue)
394{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100395 bool newValue = !defaultParams().enabled();
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200396 EXPECT_THAT(setProperty(sut->getPath(), "Enabled", newValue).value(),
397 Eq(boost::system::errc::success));
398 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"), Eq(newValue));
399}
400
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200401TEST_F(TestReport, setIntervalWithValidValue)
402{
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200403 uint64_t newValue = ReportManager::minInterval.count() * 42;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200404 EXPECT_THAT(setProperty(sut->getPath(), "Interval", newValue).value(),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200405 Eq(boost::system::errc::success));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200406 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
407 Eq(newValue));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200408}
409
Szymon Dompke3e2cc9d2021-12-14 12:00:52 +0100410TEST_F(
411 TestReport,
412 settingIntervalWithInvalidValueDoesNotChangePropertyAndReturnsInvalidArgument)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200413{
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200414 uint64_t newValue = ReportManager::minInterval.count() - 1;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200415 EXPECT_THAT(setProperty(sut->getPath(), "Interval", newValue).value(),
Szymon Dompke3e2cc9d2021-12-14 12:00:52 +0100416 Eq(boost::system::errc::invalid_argument));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200417 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100418 Eq(defaultParams().interval().count()));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100419}
420
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200421TEST_F(TestReport, settingInvalidReportingTypeCreatesErrorMessage)
422{
423 auto report = makeReport(defaultParams()
424 .reportId("report2")
425 .reportingType(ReportingType::onRequest)
426 .interval(Milliseconds{0}));
427
428 EXPECT_THAT(
429 setProperty<std::string>(report->getPath(), "ReportingType", "Periodic")
430 .value(),
431 Eq(boost::system::errc::success));
432
433 EXPECT_THAT(getProperty<std::string>(report->getPath(), "ReportingType"),
434 Eq("Periodic"));
435 EXPECT_THAT(
436 getProperty<ErrorMessagesDbusType>(report->getPath(), "ErrorMessages"),
437 UnorderedElementsAre(
438 ErrorMessageDbusType(
439 utils::enumToString(ErrorType::propertyConflict), "Interval"),
440 ErrorMessageDbusType(
441 utils::enumToString(ErrorType::propertyConflict),
442 "ReportingType")));
443}
444
445TEST_F(TestReport, settingValidReportingTypeRemovesErrors)
446{
447 auto report = makeReport(defaultParams()
448 .reportId("report2")
449 .reportingType(ReportingType::onRequest)
450 .interval(Milliseconds{0}));
451
452 EXPECT_THAT(
453 setProperty<std::string>(report->getPath(), "ReportingType", "Periodic")
454 .value(),
455 Eq(boost::system::errc::success));
456 EXPECT_THAT(setProperty<std::string>(report->getPath(), "ReportingType",
457 "OnRequest")
458 .value(),
459 Eq(boost::system::errc::success));
460
461 EXPECT_THAT(getProperty<std::string>(report->getPath(), "ReportingType"),
462 Eq("OnRequest"));
463 EXPECT_THAT(
464 getProperty<ErrorMessagesDbusType>(report->getPath(), "ErrorMessages"),
465 IsEmpty());
466}
467
468TEST_F(TestReport, settingInvalidIntervalDisablesReport)
469{
470 auto report = makeReport(defaultParams()
471 .reportId("report2")
472 .reportingType(ReportingType::periodic)
473 .interval(ReportManager::minInterval));
474
475 EXPECT_THAT(setProperty<uint64_t>(report->getPath(), "Interval", 0).value(),
476 Eq(boost::system::errc::success));
477
478 EXPECT_THAT(getProperty<uint64_t>(report->getPath(), "Interval"), Eq(0u));
479 EXPECT_THAT(
480 getProperty<ErrorMessagesDbusType>(report->getPath(), "ErrorMessages"),
481 UnorderedElementsAre(
482 ErrorMessageDbusType(
483 utils::enumToString(ErrorType::propertyConflict), "Interval"),
484 ErrorMessageDbusType(
485 utils::enumToString(ErrorType::propertyConflict),
486 "ReportingType")));
487}
488
489TEST_F(TestReport, settingValidIntervalEnablesReport)
490{
491 auto report = makeReport(defaultParams()
492 .reportId("report2")
493 .reportingType(ReportingType::periodic)
494 .interval(ReportManager::minInterval));
495
496 EXPECT_THAT(setProperty<uint64_t>(report->getPath(), "Interval", 0).value(),
497 Eq(boost::system::errc::success));
498 EXPECT_THAT(setProperty<uint64_t>(report->getPath(), "Interval",
499 ReportManager::minInterval.count())
500 .value(),
501 Eq(boost::system::errc::success));
502
503 EXPECT_THAT(getProperty<uint64_t>(report->getPath(), "Interval"),
504 Eq(ReportManager::minInterval.count()));
505 EXPECT_THAT(
506 getProperty<ErrorMessagesDbusType>(report->getPath(), "ErrorMessages"),
507 IsEmpty());
508}
509
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200510TEST_F(TestReport, settingEmitsReadingsUpdateHaveNoEffect)
511{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100512 EXPECT_THAT(
513 setProperty(sut->getPath(), "EmitsReadingsUpdate", true).value(),
514 Eq(boost::system::errc::read_only_file_system));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200515 EXPECT_THAT(getProperty<bool>(sut->getPath(), "EmitsReadingsUpdate"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100516 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100517 ReportAction::emitsReadingsUpdate)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200518}
519
520TEST_F(TestReport, settingLogToMetricReportCollectionHaveNoEffect)
521{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100522 EXPECT_THAT(
523 setProperty(sut->getPath(), "LogToMetricReportsCollection", true)
524 .value(),
525 Eq(boost::system::errc::read_only_file_system));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200526 EXPECT_THAT(
527 getProperty<bool>(sut->getPath(), "LogToMetricReportsCollection"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100528 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100529 ReportAction::logToMetricReportsCollection)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200530}
531
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100532TEST_F(TestReport, settingPersistencyToFalseRemovesReportFromStorage)
533{
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100534 EXPECT_CALL(storageMock, store(_, _)).Times(0);
535 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())))
536 .Times(AtLeast(1));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100537
538 bool persistency = false;
539 EXPECT_THAT(setProperty(sut->getPath(), "Persistency", persistency).value(),
540 Eq(boost::system::errc::success));
541 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistency"),
542 Eq(persistency));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200543}
544
545TEST_F(TestReport, deleteReport)
546{
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200547 EXPECT_CALL(*reportManagerMock, removeReport(sut.get()));
548 auto ec = deleteReport(sut->getPath());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200549 EXPECT_THAT(ec, Eq(boost::system::errc::success));
550}
551
552TEST_F(TestReport, deletingNonExistingReportReturnInvalidRequestDescriptor)
553{
554 auto ec = deleteReport(Report::reportDir + "NonExisting"s);
555 EXPECT_THAT(ec.value(), Eq(EBADR));
556}
557
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100558TEST_F(TestReport, deleteReportExpectThatFileIsRemoveFromStorage)
559{
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100560 EXPECT_CALL(storageMock, store(_, _)).Times(0);
561 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())))
562 .Times(AtLeast(1));
563
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100564 auto ec = deleteReport(sut->getPath());
565 EXPECT_THAT(ec, Eq(boost::system::errc::success));
566}
567
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100568TEST_F(TestReport, updatesTriggerIdWhenTriggerIsAdded)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100569{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100570 utils::Messanger messanger(DbusEnvironment::getIoc());
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100571
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100572 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100573 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100574 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100575 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100576 messanger.send(messages::TriggerPresenceChangedInd{
577 messages::Presence::Exist, "trigger2", {"someOtherReport"}});
578 messanger.send(messages::TriggerPresenceChangedInd{
579 messages::Presence::Exist,
580 "trigger3",
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100581 {"someOtherReport", defaultParams().reportId()}});
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100582
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100583 EXPECT_THAT(
584 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100585 UnorderedElementsAre("trigger1", "trigger3"));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100586}
587
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100588TEST_F(TestReport, updatesTriggerIdWhenTriggerIsRemoved)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100589{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100590 utils::Messanger messanger(DbusEnvironment::getIoc());
591
592 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100593 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100594 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100595 messages::Presence::Exist, "trigger2", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100596 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100597 messages::Presence::Exist, "trigger3", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100598
599 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100600 messages::Presence::Removed, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100601 messanger.send(messages::TriggerPresenceChangedInd{
602 messages::Presence::Removed, "trigger2", {}});
603 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100604 messages::Presence::Removed, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100605
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100606 EXPECT_THAT(
607 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100608 UnorderedElementsAre("trigger3"));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100609}
610
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100611TEST_F(TestReport, updatesTriggerIdWhenTriggerIsModified)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100612{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100613 utils::Messanger messanger(DbusEnvironment::getIoc());
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100614
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100615 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100616 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100617 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100618 messages::Presence::Exist, "trigger2", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100619 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100620 messages::Presence::Exist, "trigger3", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100621
622 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100623 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100624 messanger.send(messages::TriggerPresenceChangedInd{
625 messages::Presence::Exist, "trigger2", {}});
626 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100627 messages::Presence::Exist, "trigger3", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100628
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100629 EXPECT_THAT(
630 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100631 UnorderedElementsAre("trigger1", "trigger3"));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100632}
633
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100634class TestReportStore :
635 public TestReport,
636 public WithParamInterface<std::pair<std::string, nlohmann::json>>
637{
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100638 void SetUp() override
639 {}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100640};
641
642INSTANTIATE_TEST_SUITE_P(
643 _, TestReportStore,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100644 Values(
645 std::make_pair("Enabled"s, nlohmann::json(defaultParams().enabled())),
646 std::make_pair("Version"s, nlohmann::json(6)),
647 std::make_pair("Id"s, nlohmann::json(defaultParams().reportId())),
648 std::make_pair("Name"s, nlohmann::json(defaultParams().reportName())),
649 std::make_pair("ReportingType",
650 nlohmann::json(defaultParams().reportingType())),
651 std::make_pair("ReportActions", nlohmann::json(utils::transform(
652 defaultParams().reportActions(),
653 [](const auto v) {
654 return utils::toUnderlying(v);
655 }))),
656 std::make_pair("Interval",
657 nlohmann::json(defaultParams().interval().count())),
658 std::make_pair("AppendLimit",
659 nlohmann::json(ReportParams().appendLimit())),
660 std::make_pair(
661 "ReadingParameters",
662 nlohmann::json(
663 {{{tstring::SensorPath::str(),
664 {{{tstring::Service::str(), "Service"},
665 {tstring::Path::str(),
666 "/xyz/openbmc_project/sensors/power/p1"},
667 {tstring::Metadata::str(), "metadata1"}}}},
668 {tstring::OperationType::str(), OperationType::avg},
669 {tstring::Id::str(), "MetricId1"},
670 {tstring::CollectionTimeScope::str(),
671 CollectionTimeScope::point},
672 {tstring::CollectionDuration::str(), 0}},
673 {{tstring::SensorPath::str(),
674 {{{tstring::Service::str(), "Service"},
675 {tstring::Path::str(),
676 "/xyz/openbmc_project/sensors/power/p2"},
677 {tstring::Metadata::str(), "metadata2"}}}},
678 {tstring::OperationType::str(), OperationType::avg},
679 {tstring::Id::str(), "MetricId2"},
680 {tstring::CollectionTimeScope::str(),
681 CollectionTimeScope::point},
682 {tstring::CollectionDuration::str(), 0}}}))));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100683
684TEST_P(TestReportStore, settingPersistencyToTrueStoresReport)
685{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100686 sut = makeReport(defaultParams());
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100687
688 {
689 InSequence seq;
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100690 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100691 EXPECT_CALL(checkPoint, Call());
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100692 EXPECT_CALL(storageMock, store(to_file_path(sut->getId()), _));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100693 }
694
695 setProperty(sut->getPath(), "Persistency", false);
696 checkPoint.Call();
697 setProperty(sut->getPath(), "Persistency", true);
698
699 const auto& [key, value] = GetParam();
700
701 ASSERT_THAT(storedConfiguration.at(key), Eq(value));
702}
703
704TEST_P(TestReportStore, reportIsSavedToStorageAfterCreated)
705{
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100706 EXPECT_CALL(storageMock,
707 store(to_file_path(defaultParams().reportId()), _));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100708
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100709 sut = makeReport(defaultParams());
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100710
711 const auto& [key, value] = GetParam();
712
713 ASSERT_THAT(storedConfiguration.at(key), Eq(value));
714}
715
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200716class TestReportValidNames :
717 public TestReport,
718 public WithParamInterface<ReportParams>
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200719{
720 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200721 void SetUp() override
722 {}
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200723};
724
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200725INSTANTIATE_TEST_SUITE_P(
726 ValidNames, TestReportValidNames,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100727 Values(defaultParams().reportName("Valid_1"),
728 defaultParams().reportName("Valid_1/Valid_2"),
729 defaultParams().reportName("Valid_1/Valid_2/Valid_3")));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200730
731TEST_P(TestReportValidNames, reportCtorDoesNotThrowOnValidName)
732{
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200733 EXPECT_NO_THROW(makeReport(GetParam()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200734}
735
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100736class TestReportInvalidIds :
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200737 public TestReport,
738 public WithParamInterface<ReportParams>
739{
740 public:
741 void SetUp() override
742 {}
743};
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200744
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100745INSTANTIATE_TEST_SUITE_P(InvalidNames, TestReportInvalidIds,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100746 Values(defaultParams().reportId("/"),
747 defaultParams().reportId("/Invalid"),
748 defaultParams().reportId("Invalid/"),
749 defaultParams().reportId("Invalid/Invalid/"),
750 defaultParams().reportId("Invalid?")));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200751
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100752TEST_P(TestReportInvalidIds, failsToCreateReportWithInvalidName)
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100753{
754 EXPECT_CALL(storageMock, store).Times(0);
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100755
756 EXPECT_THROW(makeReport(GetParam()), sdbusplus::exception::SdBusError);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100757}
758
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200759class TestReportAllReportTypes :
760 public TestReport,
761 public WithParamInterface<ReportParams>
762{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200763 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200764 void SetUp() override
765 {
766 sut = makeReport(GetParam());
767 }
768};
769
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100770INSTANTIATE_TEST_SUITE_P(
771 _, TestReportAllReportTypes,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100772 Values(defaultParams().reportingType(ReportingType::onRequest),
773 defaultParams().reportingType(ReportingType::onChange),
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200774 defaultParams()
775 .reportingType(ReportingType::periodic)
776 .interval(ReportManager::minInterval)));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200777
778TEST_P(TestReportAllReportTypes, returnPropertValueOfReportType)
779{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100780 EXPECT_THAT(utils::toReportingType(
781 getProperty<std::string>(sut->getPath(), "ReportingType")),
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200782 Eq(GetParam().reportingType()));
783}
784
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100785TEST_P(TestReportAllReportTypes, readingsAreUpdated)
786{
787 clockFake.system.advance(10ms);
788
789 messanger.send(messages::UpdateReportInd{{sut->getId()}});
790 const auto [timestamp, readings] =
791 getProperty<Readings>(sut->getPath(), "Readings");
792
793 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
794}
795
796TEST_P(TestReportAllReportTypes, readingsAreNotUpdatedWhenReportIsDisabled)
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200797{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100798 clockFake.system.advance(10ms);
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200799
800 setProperty(sut->getPath(), "Enabled", false);
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100801 messanger.send(messages::UpdateReportInd{{sut->getId()}});
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200802 const auto [timestamp, readings] =
803 getProperty<Readings>(sut->getPath(), "Readings");
804
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100805 EXPECT_THAT(Milliseconds{timestamp}, Eq(0ms));
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200806}
807
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100808TEST_P(TestReportAllReportTypes, readingsAreNotUpdatedWhenReportIdDiffers)
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100809{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100810 clockFake.system.advance(10ms);
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100811
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100812 messanger.send(messages::UpdateReportInd{{sut->getId() + "x"s}});
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100813 const auto [timestamp, readings] =
814 getProperty<Readings>(sut->getPath(), "Readings");
815
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100816 EXPECT_THAT(Milliseconds{timestamp}, Eq(0ms));
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100817}
818
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100819class TestReportOnRequestType : public TestReport
820{
821 void SetUp() override
822 {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100823 sut =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100824 makeReport(defaultParams().reportingType(ReportingType::onRequest));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100825 }
826};
827
828TEST_F(TestReportOnRequestType, updatesReadingTimestamp)
829{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100830 clockFake.system.advance(10ms);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100831
832 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
833
834 const auto [timestamp, readings] =
835 getProperty<Readings>(sut->getPath(), "Readings");
836
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100837 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100838}
839
840TEST_F(TestReportOnRequestType, updatesReadingWhenUpdateIsCalled)
841{
842 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
843
844 const auto [timestamp, readings] =
845 getProperty<Readings>(sut->getPath(), "Readings");
846
847 EXPECT_THAT(readings,
848 ElementsAre(std::make_tuple("a"s, "b"s, 17.1, 114u),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000849 std::make_tuple("aa"s, "bb"s, 42.0, 74u)));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100850}
851
852class TestReportNonOnRequestType :
853 public TestReport,
854 public WithParamInterface<ReportParams>
855{
856 void SetUp() override
857 {
858 sut = makeReport(GetParam());
859 }
860};
861
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100862INSTANTIATE_TEST_SUITE_P(
863 _, TestReportNonOnRequestType,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100864 Values(defaultParams().reportingType(ReportingType::periodic),
865 defaultParams().reportingType(ReportingType::onChange)));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100866
867TEST_P(TestReportNonOnRequestType, readingsAreNotUpdateOnUpdateCall)
868{
869 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
870
871 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
872 Eq(Readings{}));
873}
874
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200875class TestReportNonPeriodicReport :
876 public TestReport,
877 public WithParamInterface<ReportParams>
878{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200879 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200880 void SetUp() override
881 {
882 sut = makeReport(GetParam());
883 }
884};
885
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100886INSTANTIATE_TEST_SUITE_P(
887 _, TestReportNonPeriodicReport,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100888 Values(defaultParams().reportingType(ReportingType::onRequest),
889 defaultParams().reportingType(ReportingType::onChange)));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200890
891TEST_P(TestReportNonPeriodicReport, readingsAreNotUpdatedAfterIntervalExpires)
892{
893 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
894
895 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
896 Eq(Readings{}));
897}
898
899class TestReportPeriodicReport : public TestReport
900{
901 void SetUp() override
902 {
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +0200903 sut = makeReport(defaultParams()
904 .reportingType(ReportingType::periodic)
905 .interval(ReportManager::minInterval));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200906 }
907};
908
909TEST_F(TestReportPeriodicReport, readingTimestampIsUpdatedAfterIntervalExpires)
910{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100911 clockFake.system.advance(10ms);
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200912 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
913
914 const auto [timestamp, readings] =
915 getProperty<Readings>(sut->getPath(), "Readings");
916
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100917 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200918}
919
920TEST_F(TestReportPeriodicReport, readingsAreUpdatedAfterIntervalExpires)
921{
922 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
923
924 const auto [timestamp, readings] =
925 getProperty<Readings>(sut->getPath(), "Readings");
926
927 EXPECT_THAT(readings,
928 ElementsAre(std::make_tuple("a"s, "b"s, 17.1, 114u),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000929 std::make_tuple("aa"s, "bb"s, 42.0, 74u)));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200930}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100931
Szymon Dompke3eb56862021-09-20 15:32:04 +0200932struct ReportUpdatesReportParams
933{
934 ReportParams reportParams;
935 std::vector<ReadingData> expectedReadings;
936 bool expectedEnabled;
937};
938
939class TestReportWithReportUpdatesAndLimit :
940 public TestReport,
941 public WithParamInterface<ReportUpdatesReportParams>
942{
943 void SetUp() override
944 {
945 sut = makeReport(ReportParams(GetParam().reportParams)
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100946 .reportingType(ReportingType::periodic)
Szymon Dompke3eb56862021-09-20 15:32:04 +0200947 .interval(std::chrono::hours(1000)));
948 }
949};
950
951INSTANTIATE_TEST_SUITE_P(
952 _, TestReportWithReportUpdatesAndLimit,
953 Values(
954 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100955 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100956 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
957 .appendLimit(5),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200958 std::vector<ReadingData>{{std::make_tuple("aa"s, "bb"s, 42.0, 74u),
959 std::make_tuple("a"s, "b"s, 17.1, 114u),
960 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
961 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
962 std::make_tuple("a"s, "b"s, 17.1, 114u)}},
963 true},
964 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100965 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100966 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
967 .appendLimit(4),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200968 std::vector<ReadingData>{
969 {std::make_tuple("a"s, "b"s, 17.1, 114u),
970 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
971 std::make_tuple("a"s, "b"s, 17.1, 114u),
972 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
973 true},
974 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100975 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100976 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
977 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200978 std::vector<ReadingData>{}, true},
979 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100980 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100981 .reportUpdates(ReportUpdates::appendStopsWhenFull)
982 .appendLimit(10),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200983 std::vector<ReadingData>{
984 {std::make_tuple("a"s, "b"s, 17.1, 114u),
985 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
986 std::make_tuple("a"s, "b"s, 17.1, 114u),
987 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
988 std::make_tuple("a"s, "b"s, 17.1, 114u),
989 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
990 std::make_tuple("a"s, "b"s, 17.1, 114u),
991 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
992 true},
993 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100994 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100995 .reportUpdates(ReportUpdates::appendStopsWhenFull)
996 .appendLimit(5),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200997 std::vector<ReadingData>{{std::make_tuple("a"s, "b"s, 17.1, 114u),
998 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
999 std::make_tuple("a"s, "b"s, 17.1, 114u),
1000 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
1001 std::make_tuple("a"s, "b"s, 17.1, 114u)}},
1002 false},
1003 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001004 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001005 .reportUpdates(ReportUpdates::appendStopsWhenFull)
1006 .appendLimit(4),
Szymon Dompke3eb56862021-09-20 15:32:04 +02001007 std::vector<ReadingData>{
1008 {std::make_tuple("a"s, "b"s, 17.1, 114u),
1009 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
1010 std::make_tuple("a"s, "b"s, 17.1, 114u),
1011 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
1012 false},
1013 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001014 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001015 .reportUpdates(ReportUpdates::appendStopsWhenFull)
1016 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +02001017 std::vector<ReadingData>{}, false},
1018 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001019 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001020 .reportUpdates(ReportUpdates::overwrite)
1021 .appendLimit(500),
Szymon Dompke3eb56862021-09-20 15:32:04 +02001022 std::vector<ReadingData>{
1023 {std::make_tuple("a"s, "b"s, 17.1, 114u),
1024 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
1025 true},
1026 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001027 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001028 .reportUpdates(ReportUpdates::overwrite)
1029 .appendLimit(1),
Szymon Dompke3eb56862021-09-20 15:32:04 +02001030 std::vector<ReadingData>{
1031 {std::make_tuple("a"s, "b"s, 17.1, 114u),
1032 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
1033 true},
1034 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001035 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001036 .reportUpdates(ReportUpdates::overwrite)
1037 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +02001038 std::vector<ReadingData>{
1039 {std::make_tuple("a"s, "b"s, 17.1, 114u),
1040 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
1041 true}));
1042
1043TEST_P(TestReportWithReportUpdatesAndLimit,
1044 readingsAreUpdatedAfterIntervalExpires)
1045{
1046 for (int i = 0; i < 4; i++)
1047 {
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +01001048 messanger.send(messages::UpdateReportInd{{sut->getId()}});
Szymon Dompke3eb56862021-09-20 15:32:04 +02001049 }
1050
1051 const auto [timestamp, readings] =
1052 getProperty<Readings>(sut->getPath(), "Readings");
1053 const auto enabled = getProperty<bool>(sut->getPath(), "Enabled");
1054
1055 EXPECT_THAT(readings, ElementsAreArray(GetParam().expectedReadings));
1056 EXPECT_EQ(enabled, GetParam().expectedEnabled);
1057}
1058
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001059class TestReportInitialization : public TestReport
1060{
1061 public:
1062 void SetUp() override
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001063 {
1064 initMetricMocks(defaultParams().metricParameters());
1065 }
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001066
1067 void monitorProc(sdbusplus::message::message& msg)
1068 {
1069 std::string iface;
1070 std::vector<std::pair<std::string, std::variant<Readings>>>
1071 changed_properties;
1072 std::vector<std::string> invalidated_properties;
1073
1074 msg.read(iface, changed_properties, invalidated_properties);
1075
1076 if (iface == Report::reportIfaceName)
1077 {
1078 for (const auto& [name, value] : changed_properties)
1079 {
1080 if (name == "Readings")
1081 {
1082 readingsUpdated.Call();
1083 }
1084 }
1085 }
1086 }
1087
1088 void makeMonitor()
1089 {
Patrick Williams3a62ee12021-12-03 10:13:25 -06001090 monitor = std::make_unique<sdbusplus::bus::match_t>(
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001091 *DbusEnvironment::getBus(),
1092 sdbusplus::bus::match::rules::propertiesChanged(
1093 sut->getPath(), Report::reportIfaceName),
1094 [this](auto& msg) { monitorProc(msg); });
1095 }
1096
Patrick Williams3a62ee12021-12-03 10:13:25 -06001097 std::unique_ptr<sdbusplus::bus::match_t> monitor;
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001098 MockFunction<void()> readingsUpdated;
1099};
1100
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001101TEST_F(TestReportInitialization,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001102 registersForMetricUpdatesWhenOnChangeReportCreated)
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001103{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001104 std::vector<const interfaces::MetricListener*> args;
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001105 for (auto& metric : metricMocks)
1106 {
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001107 EXPECT_CALL(*metric, registerForUpdates(_))
1108 .WillOnce(Invoke([&args](const interfaces::MetricListener& report) {
1109 args.emplace_back(&report);
1110 }));
1111 ;
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001112 }
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001113
1114 sut = makeReport(defaultParams().reportingType(ReportingType::onChange));
1115
1116 EXPECT_THAT(args, SizeIs(metricMocks.size()));
1117 for (const auto* reportPtr : args)
1118 {
1119 EXPECT_THAT(reportPtr, Eq(sut.get()));
1120 }
1121}
1122
1123TEST_F(TestReportInitialization,
1124 deregistersForMetricUpdatesWhenOnChangeReportDestroyed)
1125{
1126 sut = makeReport(defaultParams().reportingType(ReportingType::onChange));
1127
1128 for (auto& metric : metricMocks)
1129 {
1130 EXPECT_CALL(*metric,
1131 unregisterFromUpdates(Ref(
1132 static_cast<interfaces::MetricListener&>(*sut.get()))));
1133 }
1134
1135 sut = nullptr;
1136}
1137
1138TEST_F(TestReportInitialization,
1139 metricsAreInitializedWhenEnabledReportConstructed)
1140{
1141 for (auto& metric : metricMocks)
1142 {
1143 EXPECT_CALL(*metric, initialize());
1144 }
1145 sut = makeReport(defaultParams().enabled(true));
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001146}
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001147
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001148TEST_F(TestReportInitialization,
1149 metricsAreNotInitializedWhenDisabledReportConstructed)
1150{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001151 for (auto& metric : metricMocks)
1152 {
1153 EXPECT_CALL(*metric, initialize()).Times(0);
1154 }
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001155 sut = makeReport(defaultParams().enabled(false));
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001156}
1157
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001158TEST_F(TestReportInitialization,
1159 emitReadingsUpdateIsTrueReadingsPropertiesChangedSingalEmits)
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001160{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001161 EXPECT_CALL(readingsUpdated, Call())
1162 .WillOnce(
1163 InvokeWithoutArgs(DbusEnvironment::setPromise("readingsUpdated")));
1164
1165 const auto elapsed = DbusEnvironment::measureTime([this] {
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +02001166 sut = makeReport(defaultParams()
1167 .reportingType(ReportingType::periodic)
1168 .reportActions({ReportAction::emitsReadingsUpdate})
1169 .interval(ReportManager::minInterval));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001170 makeMonitor();
1171 EXPECT_TRUE(DbusEnvironment::waitForFuture("readingsUpdated"));
1172 });
1173
Krzysztof Grobelny973b4bb2022-04-25 17:07:27 +02001174 EXPECT_THAT(elapsed, AllOf(Ge(ReportManager::minInterval),
1175 Lt(ReportManager::minInterval * 2)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001176}
1177
1178TEST_F(TestReportInitialization,
1179 emitReadingsUpdateIsFalseReadingsPropertiesChangesSigalDoesNotEmits)
1180{
1181 EXPECT_CALL(readingsUpdated, Call()).Times(0);
1182
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001183 sut = makeReport(defaultParams()
1184 .reportingType(ReportingType::periodic)
1185 .reportActions({}));
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001186 makeMonitor();
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001187 DbusEnvironment::sleepFor(defaultParams().interval() * 2);
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001188}
Szymon Dompke3eb56862021-09-20 15:32:04 +02001189
1190TEST_F(TestReportInitialization, appendLimitDeducedProperly)
1191{
1192 sut = makeReport(
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001193 defaultParams().appendLimit(std::numeric_limits<uint64_t>::max()));
Szymon Dompke3eb56862021-09-20 15:32:04 +02001194 auto appendLimit = getProperty<uint64_t>(sut->getPath(), "AppendLimit");
1195 EXPECT_EQ(appendLimit, 2ull);
1196}
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +01001197
1198TEST_F(TestReportInitialization, appendLimitSetToUintMaxIsStoredCorrectly)
1199{
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +01001200 sut = makeReport(
1201 ReportParams().appendLimit(std::numeric_limits<uint64_t>::max()));
1202
1203 ASSERT_THAT(storedConfiguration.at("AppendLimit"),
1204 Eq(std::numeric_limits<uint64_t>::max()));
1205}
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +01001206
1207TEST_F(TestReportInitialization, triggerIdsPropertyIsInitialzed)
1208{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +01001209 for (const auto& triggerId : {"trigger1", "trigger2"})
1210 {
1211 messanger.on_receive<messages::CollectTriggerIdReq>(
Szymon Dompkee0ed5082022-05-20 10:54:25 +02001212 [this, triggerId](const auto& msg) {
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +01001213 messanger.send(messages::CollectTriggerIdResp{triggerId});
1214 });
1215 }
1216
1217 sut = makeReport(ReportParams());
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +01001218
1219 EXPECT_THAT(
1220 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
1221 UnorderedElementsAre("trigger1", "trigger2"));
1222}
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001223
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +01001224TEST_F(TestReportInitialization,
1225 metricValuesAreNotStoredForReportUpdatesDifferentThanAppendStopsWhenFull)
1226{
1227 sut = makeReport(ReportParams()
1228 .reportingType(ReportingType::periodic)
1229 .interval(1h)
1230 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
1231 .readings(Readings{{}, {{}}}));
1232
1233 ASSERT_THAT(storedConfiguration.find("MetricValues"),
1234 Eq(storedConfiguration.end()));
1235}
1236
1237TEST_F(TestReportInitialization, metricValuesAreNotStoredForOnRequestReport)
1238{
1239 sut = makeReport(ReportParams()
1240 .reportingType(ReportingType::onRequest)
1241 .reportUpdates(ReportUpdates::appendStopsWhenFull)
1242 .readings(Readings{{}, {{}}}));
1243
1244 ASSERT_THAT(storedConfiguration.find("MetricValues"),
1245 Eq(storedConfiguration.end()));
1246}
1247
1248TEST_F(TestReportInitialization,
1249 metricValuesAreStoredForNonOnRequestReportWithAppendStopsWhenFull)
1250{
1251 const auto readings = Readings{{}, {{}}};
1252
1253 sut = makeReport(ReportParams()
1254 .reportingType(ReportingType::periodic)
1255 .interval(1h)
1256 .reportUpdates(ReportUpdates::appendStopsWhenFull)
1257 .readings(readings));
1258
1259 ASSERT_THAT(storedConfiguration.at("MetricValues").get<LabeledReadings>(),
1260 Eq(utils::toLabeledReadings(readings)));
1261}
1262
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001263class TestReportInitializationOnChangeReport : public TestReportInitialization
1264{
1265 public:
1266 void SetUp() override
1267 {
1268 initMetricMocks(params.metricParameters());
1269 }
1270
1271 ReportParams params = defaultOnChangeParams();
1272};
1273
1274TEST_F(TestReportInitializationOnChangeReport,
1275 doesntUpdateReadingsWhenNotRequired)
1276{
1277 EXPECT_CALL(*metricMocks[0], updateReadings(_)).Times(0);
1278
1279 ON_CALL(*metricMocks[0], isTimerRequired()).WillByDefault(Return(false));
1280
1281 sut = makeReport(params);
1282
1283 DbusEnvironment::sleepFor(500ms);
1284}
1285
1286TEST_F(TestReportInitializationOnChangeReport, updatesReadingsWhenRequired)
1287{
1288 EXPECT_CALL(*metricMocks[0], updateReadings(_))
1289 .WillOnce(Return())
1290 .WillOnce(
1291 InvokeWithoutArgs(DbusEnvironment::setPromise("readingsUpdated")))
1292 .WillRepeatedly(Return());
1293
1294 ON_CALL(*metricMocks[0], isTimerRequired()).WillByDefault(Return(true));
1295
1296 sut = makeReport(params);
1297
1298 DbusEnvironment::waitForFuture("readingsUpdated");
1299}