blob: 3e6b049cb6bb003b554c10d0840adbd65fa88650 [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"
Wludzik, Jozefe2362792020-10-27 17:23:55 +01004#include "mocks/json_storage_mock.hpp"
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +02005#include "mocks/metric_mock.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02006#include "mocks/report_manager_mock.hpp"
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +02007#include "params/report_params.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02008#include "report.hpp"
9#include "report_manager.hpp"
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010010#include "utils/clock.hpp"
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010011#include "utils/contains.hpp"
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020012#include "utils/conv_container.hpp"
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010013#include "utils/transform.hpp"
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000014#include "utils/tstring.hpp"
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020015
16#include <sdbusplus/exception.hpp>
17
18using namespace testing;
19using namespace std::literals::string_literals;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020020using namespace std::chrono_literals;
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +000021namespace tstring = utils::tstring;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020022
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010023constexpr Milliseconds systemTimestamp = 55ms;
24
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020025class TestReport : public Test
26{
27 public:
Wludzik, Jozefe2362792020-10-27 17:23:55 +010028 ReportParams defaultParams;
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020029
30 std::unique_ptr<ReportManagerMock> reportManagerMock =
Wludzik, Jozefe2362792020-10-27 17:23:55 +010031 std::make_unique<NiceMock<ReportManagerMock>>();
32 testing::NiceMock<StorageMock> storageMock;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000033 std::vector<std::shared_ptr<MetricMock>> metricMocks;
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010034 std::unique_ptr<ClockFake> clockFakePtr = std::make_unique<ClockFake>();
35 ClockFake& clockFake = *clockFakePtr;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020036 std::unique_ptr<Report> sut;
37
Wludzik, Jozefe2362792020-10-27 17:23:55 +010038 MockFunction<void()> checkPoint;
39
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010040 TestReport()
41 {
42 clockFake.system.set(systemTimestamp);
43 }
44
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000045 void initMetricMocks(
46 const std::vector<LabeledMetricParameters>& metricParameters)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010047 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000048 for (auto i = metricMocks.size(); i < metricParameters.size(); ++i)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010049 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000050 metricMocks.emplace_back(std::make_shared<NiceMock<MetricMock>>());
51 }
52 metricMocks.resize(metricParameters.size());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000053
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000054 std::vector<MetricValue> readings{{MetricValue{"a", "b", 17.1, 114},
55 MetricValue{"aa", "bb", 42.0, 74}}};
56 readings.resize(metricParameters.size());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000057
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000058 for (size_t i = 0; i < metricParameters.size(); ++i)
59 {
60 ON_CALL(*metricMocks[i], getReadings())
Krzysztof Grobelny80697712021-03-04 09:49:27 +000061 .WillByDefault(Return(std::vector({readings[i]})));
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000062 ON_CALL(*metricMocks[i], dumpConfiguration())
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000063 .WillByDefault(Return(metricParameters[i]));
Wludzik, Jozefe2362792020-10-27 17:23:55 +010064 }
65 }
66
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020067 void SetUp() override
68 {
69 sut = makeReport(ReportParams());
70 }
71
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010072 static interfaces::JsonStorage::FilePath to_file_path(std::string id)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010073 {
74 return interfaces::JsonStorage::FilePath(
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010075 std::to_string(std::hash<std::string>{}(id)));
Wludzik, Jozefe2362792020-10-27 17:23:55 +010076 }
77
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020078 std::unique_ptr<Report> makeReport(const ReportParams& params)
79 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000080 initMetricMocks(params.metricParameters());
81
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020082 return std::make_unique<Report>(
83 DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010084 params.reportId(), params.reportName(), params.reportingType(),
85 params.reportActions(), params.interval(), params.appendLimit(),
86 params.reportUpdates(), *reportManagerMock, storageMock,
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020087 utils::convContainer<std::shared_ptr<interfaces::Metric>>(
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +020088 metricMocks),
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +010089 params.enabled(), std::move(clockFakePtr), params.triggerIds());
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020090 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020091
92 template <class T>
93 static T getProperty(const std::string& path, const std::string& property)
94 {
Szymon Dompkee28aa532021-10-27 12:33:12 +020095 return DbusEnvironment::getProperty<T>(path, Report::reportIfaceName,
96 property);
97 }
98
99 template <class T>
100 static boost::system::error_code setProperty(const std::string& path,
101 const std::string& property,
102 const T& newValue)
103 {
104 return DbusEnvironment::setProperty<T>(path, Report::reportIfaceName,
105 property, newValue);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100106 }
107
108 boost::system::error_code call(const std::string& path,
109 const std::string& interface,
110 const std::string& method)
111 {
112 std::promise<boost::system::error_code> methodPromise;
113 DbusEnvironment::getBus()->async_method_call(
114 [&methodPromise](boost::system::error_code ec) {
115 methodPromise.set_value(ec);
116 },
117 DbusEnvironment::serviceName(), path, interface, method);
118 return DbusEnvironment::waitForFuture(methodPromise.get_future());
119 }
120
121 boost::system::error_code update(const std::string& path)
122 {
123 return call(path, Report::reportIfaceName, "Update");
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200124 }
125
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200126 boost::system::error_code deleteReport(const std::string& path)
127 {
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100128 return call(path, Report::deleteIfaceName, "Delete");
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200129 }
130};
131
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100132TEST_F(TestReport, returnsId)
133{
134 EXPECT_THAT(sut->getId(), Eq(defaultParams.reportId()));
135}
136
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200137TEST_F(TestReport, verifyIfPropertiesHaveValidValue)
138{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200139 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"),
140 Eq(defaultParams.enabled()));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200141 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100142 Eq(defaultParams.interval().count()));
143 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistency"), Eq(true));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100144 EXPECT_THAT(
145 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
146 Eq(utils::transform(defaultParams.reportActions(), [](const auto v) {
147 return utils::enumToString(v);
148 })));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200149 EXPECT_THAT(getProperty<bool>(sut->getPath(), "EmitsReadingsUpdate"),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100150 Eq(utils::contains(defaultParams.reportActions(),
151 ReportAction::emitsReadingsUpdate)));
Szymon Dompke3eb56862021-09-20 15:32:04 +0200152 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "AppendLimit"),
153 Eq(defaultParams.appendLimit()));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100154 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportingType"),
155 Eq(utils::enumToString(defaultParams.reportingType())));
Szymon Dompke3eb56862021-09-20 15:32:04 +0200156 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportUpdates"),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100157 Eq(utils::enumToString(defaultParams.reportUpdates())));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200158 EXPECT_THAT(
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200159 getProperty<bool>(sut->getPath(), "LogToMetricReportsCollection"),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100160 Eq(utils::contains(defaultParams.reportActions(),
161 ReportAction::logToMetricReportsCollection)));
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000162 EXPECT_THAT(getProperty<ReadingParameters>(
163 sut->getPath(), "ReadingParametersFutureVersion"),
164 Eq(toReadingParameters(defaultParams.metricParameters())));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100165 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"),
166 Eq(defaultParams.reportName()));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100167 EXPECT_THAT(
168 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
169 Eq(std::vector<std::string>()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200170}
171
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200172TEST_F(TestReport, readingsAreInitialyEmpty)
173{
174 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
175 Eq(Readings{}));
176}
177
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200178TEST_F(TestReport, setEnabledWithNewValue)
179{
180 bool newValue = !defaultParams.enabled();
181 EXPECT_THAT(setProperty(sut->getPath(), "Enabled", newValue).value(),
182 Eq(boost::system::errc::success));
183 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"), Eq(newValue));
184}
185
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200186TEST_F(TestReport, setIntervalWithValidValue)
187{
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100188 uint64_t newValue = defaultParams.interval().count() + 1;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200189 EXPECT_THAT(setProperty(sut->getPath(), "Interval", newValue).value(),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200190 Eq(boost::system::errc::success));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200191 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
192 Eq(newValue));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200193}
194
Szymon Dompke3e2cc9d2021-12-14 12:00:52 +0100195TEST_F(
196 TestReport,
197 settingIntervalWithInvalidValueDoesNotChangePropertyAndReturnsInvalidArgument)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200198{
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100199 uint64_t newValue = defaultParams.interval().count() - 1;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200200 EXPECT_THAT(setProperty(sut->getPath(), "Interval", newValue).value(),
Szymon Dompke3e2cc9d2021-12-14 12:00:52 +0100201 Eq(boost::system::errc::invalid_argument));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200202 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100203 Eq(defaultParams.interval().count()));
204}
205
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200206TEST_F(TestReport, settingEmitsReadingsUpdateHaveNoEffect)
207{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100208 EXPECT_THAT(
209 setProperty(sut->getPath(), "EmitsReadingsUpdate", true).value(),
210 Eq(boost::system::errc::read_only_file_system));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200211 EXPECT_THAT(getProperty<bool>(sut->getPath(), "EmitsReadingsUpdate"),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100212 Eq(utils::contains(defaultParams.reportActions(),
213 ReportAction::emitsReadingsUpdate)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200214}
215
216TEST_F(TestReport, settingLogToMetricReportCollectionHaveNoEffect)
217{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100218 EXPECT_THAT(
219 setProperty(sut->getPath(), "LogToMetricReportsCollection", true)
220 .value(),
221 Eq(boost::system::errc::read_only_file_system));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200222 EXPECT_THAT(
223 getProperty<bool>(sut->getPath(), "LogToMetricReportsCollection"),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100224 Eq(utils::contains(defaultParams.reportActions(),
225 ReportAction::logToMetricReportsCollection)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200226}
227
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100228TEST_F(TestReport, settingPersistencyToFalseRemovesReportFromStorage)
229{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100230 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100231
232 bool persistency = false;
233 EXPECT_THAT(setProperty(sut->getPath(), "Persistency", persistency).value(),
234 Eq(boost::system::errc::success));
235 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistency"),
236 Eq(persistency));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200237}
238
239TEST_F(TestReport, deleteReport)
240{
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200241 EXPECT_CALL(*reportManagerMock, removeReport(sut.get()));
242 auto ec = deleteReport(sut->getPath());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200243 EXPECT_THAT(ec, Eq(boost::system::errc::success));
244}
245
246TEST_F(TestReport, deletingNonExistingReportReturnInvalidRequestDescriptor)
247{
248 auto ec = deleteReport(Report::reportDir + "NonExisting"s);
249 EXPECT_THAT(ec.value(), Eq(EBADR));
250}
251
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100252TEST_F(TestReport, deleteReportExpectThatFileIsRemoveFromStorage)
253{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100254 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100255 auto ec = deleteReport(sut->getPath());
256 EXPECT_THAT(ec, Eq(boost::system::errc::success));
257}
258
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100259TEST_F(TestReport, triggerIdsAreUpdatedProperly)
260{
261 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Add);
262 EXPECT_THAT(
263 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
264 UnorderedElementsAre("trigger1"));
265
266 sut->updateTriggerIds("trigger2", TriggerIdUpdate::Add);
267 EXPECT_THAT(
268 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
269 UnorderedElementsAre("trigger1", "trigger2"));
270
271 sut->updateTriggerIds("trigger3", TriggerIdUpdate::Add);
272 EXPECT_THAT(
273 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
274 UnorderedElementsAre("trigger1", "trigger2", "trigger3"));
275
276 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Remove);
277 EXPECT_THAT(
278 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
279 UnorderedElementsAre("trigger2", "trigger3"));
280}
281
282TEST_F(TestReport, successWhenRemovingSameTriggerIdMultipleTimes)
283{
284 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Add);
285 sut->updateTriggerIds("trigger2", TriggerIdUpdate::Add);
286 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Remove);
287 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Remove);
288 EXPECT_THAT(
289 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
290 UnorderedElementsAre("trigger2"));
291}
292
293TEST_F(TestReport, successWhenRemovingNonExistingTriggerId)
294{
295 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Add);
296 sut->updateTriggerIds("notTrigger", TriggerIdUpdate::Remove);
297 EXPECT_THAT(
298 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
299 UnorderedElementsAre("trigger1"));
300}
301
302TEST_F(TestReport, noDuplicatesWhenSameTriggerIdIsAdded)
303{
304 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Add);
305 sut->updateTriggerIds("trigger2", TriggerIdUpdate::Add);
306 sut->updateTriggerIds("trigger1", TriggerIdUpdate::Add);
307 EXPECT_THAT(
308 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
309 UnorderedElementsAre("trigger1", "trigger2"));
310}
311
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100312class TestReportStore :
313 public TestReport,
314 public WithParamInterface<std::pair<std::string, nlohmann::json>>
315{
316 public:
317 void SetUp() override
318 {}
319
320 nlohmann::json storedConfiguration;
321};
322
323INSTANTIATE_TEST_SUITE_P(
324 _, TestReportStore,
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200325 Values(std::make_pair("Enabled"s, nlohmann::json(ReportParams().enabled())),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100326 std::make_pair("Version"s, nlohmann::json(6)),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100327 std::make_pair("Id"s, nlohmann::json(ReportParams().reportId())),
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000328 std::make_pair("Name"s, nlohmann::json(ReportParams().reportName())),
329 std::make_pair("ReportingType",
330 nlohmann::json(ReportParams().reportingType())),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100331 std::make_pair("ReportActions", nlohmann::json(utils::transform(
332 ReportParams().reportActions(),
333 [](const auto v) {
334 return utils::toUnderlying(
335 v);
336 }))),
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000337 std::make_pair("Interval",
338 nlohmann::json(ReportParams().interval().count())),
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +0100339 std::make_pair("AppendLimit",
340 nlohmann::json(ReportParams().appendLimit())),
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000341 std::make_pair(
342 "ReadingParameters",
343 nlohmann::json(
344 {{{tstring::SensorPath::str(),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000345 {{{tstring::Service::str(), "Service"},
346 {tstring::Path::str(),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100347 "/xyz/openbmc_project/sensors/power/p1"},
348 {tstring::Metadata::str(), "metadata1"}}}},
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000349 {tstring::OperationType::str(), OperationType::single},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000350 {tstring::Id::str(), "MetricId1"},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000351 {tstring::CollectionTimeScope::str(),
352 CollectionTimeScope::point},
353 {tstring::CollectionDuration::str(), 0}},
Krzysztof Grobelnye8fc5752021-02-05 14:30:45 +0000354 {{tstring::SensorPath::str(),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000355 {{{tstring::Service::str(), "Service"},
356 {tstring::Path::str(),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100357 "/xyz/openbmc_project/sensors/power/p2"},
358 {tstring::Metadata::str(), "metadata2"}}}},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000359 {tstring::OperationType::str(), OperationType::single},
360 {tstring::Id::str(), "MetricId2"},
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000361 {tstring::CollectionTimeScope::str(),
362 CollectionTimeScope::point},
363 {tstring::CollectionDuration::str(), 0}}}))));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100364
365TEST_P(TestReportStore, settingPersistencyToTrueStoresReport)
366{
367 sut = makeReport(ReportParams());
368
369 {
370 InSequence seq;
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100371 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100372 EXPECT_CALL(checkPoint, Call());
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100373 EXPECT_CALL(storageMock, store(to_file_path(sut->getId()), _))
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100374 .WillOnce(SaveArg<1>(&storedConfiguration));
375 }
376
377 setProperty(sut->getPath(), "Persistency", false);
378 checkPoint.Call();
379 setProperty(sut->getPath(), "Persistency", true);
380
381 const auto& [key, value] = GetParam();
382
383 ASSERT_THAT(storedConfiguration.at(key), Eq(value));
384}
385
386TEST_P(TestReportStore, reportIsSavedToStorageAfterCreated)
387{
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100388 EXPECT_CALL(storageMock, store(to_file_path(ReportParams().reportId()), _))
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100389 .WillOnce(SaveArg<1>(&storedConfiguration));
390
391 sut = makeReport(ReportParams());
392
393 const auto& [key, value] = GetParam();
394
395 ASSERT_THAT(storedConfiguration.at(key), Eq(value));
396}
397
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200398class TestReportValidNames :
399 public TestReport,
400 public WithParamInterface<ReportParams>
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200401{
402 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200403 void SetUp() override
404 {}
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200405};
406
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200407INSTANTIATE_TEST_SUITE_P(
408 ValidNames, TestReportValidNames,
409 Values(ReportParams().reportName("Valid_1"),
410 ReportParams().reportName("Valid_1/Valid_2"),
411 ReportParams().reportName("Valid_1/Valid_2/Valid_3")));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200412
413TEST_P(TestReportValidNames, reportCtorDoesNotThrowOnValidName)
414{
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200415 EXPECT_NO_THROW(makeReport(GetParam()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200416}
417
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100418class TestReportInvalidIds :
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200419 public TestReport,
420 public WithParamInterface<ReportParams>
421{
422 public:
423 void SetUp() override
424 {}
425};
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200426
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100427INSTANTIATE_TEST_SUITE_P(InvalidNames, TestReportInvalidIds,
428 Values(ReportParams().reportId("/"),
429 ReportParams().reportId("/Invalid"),
430 ReportParams().reportId("Invalid/"),
431 ReportParams().reportId("Invalid/Invalid/"),
432 ReportParams().reportId("Invalid?")));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200433
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100434TEST_P(TestReportInvalidIds, failsToCreateReportWithInvalidName)
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100435{
436 EXPECT_CALL(storageMock, store).Times(0);
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100437
438 EXPECT_THROW(makeReport(GetParam()), sdbusplus::exception::SdBusError);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100439}
440
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200441class TestReportAllReportTypes :
442 public TestReport,
443 public WithParamInterface<ReportParams>
444{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200445 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200446 void SetUp() override
447 {
448 sut = makeReport(GetParam());
449 }
450};
451
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100452INSTANTIATE_TEST_SUITE_P(
453 _, TestReportAllReportTypes,
454 Values(ReportParams().reportingType(ReportingType::onRequest),
455 ReportParams().reportingType(ReportingType::onChange),
456 ReportParams().reportingType(ReportingType::periodic)));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200457
458TEST_P(TestReportAllReportTypes, returnPropertValueOfReportType)
459{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100460 EXPECT_THAT(utils::toReportingType(
461 getProperty<std::string>(sut->getPath(), "ReportingType")),
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200462 Eq(GetParam().reportingType()));
463}
464
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200465TEST_P(TestReportAllReportTypes, updateReadingsCallEnabledPropertyOff)
466{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100467 clockFake.system.advance(10ms);
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200468
469 setProperty(sut->getPath(), "Enabled", false);
470 sut->updateReadings();
471 const auto [timestamp, readings] =
472 getProperty<Readings>(sut->getPath(), "Readings");
473
474 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"), Eq(false));
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100475 EXPECT_THAT(Milliseconds{timestamp}, Eq(0ms));
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200476}
477
478TEST_P(TestReportAllReportTypes, updateReadingsCallEnabledPropertyOn)
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100479{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100480 clockFake.system.advance(10ms);
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100481
482 sut->updateReadings();
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100483 const auto [timestamp, readings] =
484 getProperty<Readings>(sut->getPath(), "Readings");
485
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200486 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"), Eq(true));
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100487 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100488}
489
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100490class TestReportOnRequestType : public TestReport
491{
492 void SetUp() override
493 {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100494 sut =
495 makeReport(ReportParams().reportingType(ReportingType::onRequest));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100496 }
497};
498
499TEST_F(TestReportOnRequestType, updatesReadingTimestamp)
500{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100501 clockFake.system.advance(10ms);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100502
503 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
504
505 const auto [timestamp, readings] =
506 getProperty<Readings>(sut->getPath(), "Readings");
507
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100508 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100509}
510
511TEST_F(TestReportOnRequestType, updatesReadingWhenUpdateIsCalled)
512{
513 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
514
515 const auto [timestamp, readings] =
516 getProperty<Readings>(sut->getPath(), "Readings");
517
518 EXPECT_THAT(readings,
519 ElementsAre(std::make_tuple("a"s, "b"s, 17.1, 114u),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000520 std::make_tuple("aa"s, "bb"s, 42.0, 74u)));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100521}
522
523class TestReportNonOnRequestType :
524 public TestReport,
525 public WithParamInterface<ReportParams>
526{
527 void SetUp() override
528 {
529 sut = makeReport(GetParam());
530 }
531};
532
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100533INSTANTIATE_TEST_SUITE_P(
534 _, TestReportNonOnRequestType,
535 Values(ReportParams().reportingType(ReportingType::periodic),
536 ReportParams().reportingType(ReportingType::onChange)));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100537
538TEST_P(TestReportNonOnRequestType, readingsAreNotUpdateOnUpdateCall)
539{
540 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
541
542 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
543 Eq(Readings{}));
544}
545
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200546class TestReportNonPeriodicReport :
547 public TestReport,
548 public WithParamInterface<ReportParams>
549{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200550 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200551 void SetUp() override
552 {
553 sut = makeReport(GetParam());
554 }
555};
556
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100557INSTANTIATE_TEST_SUITE_P(
558 _, TestReportNonPeriodicReport,
559 Values(ReportParams().reportingType(ReportingType::onRequest),
560 ReportParams().reportingType(ReportingType::onChange)));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200561
562TEST_P(TestReportNonPeriodicReport, readingsAreNotUpdatedAfterIntervalExpires)
563{
564 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
565
566 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
567 Eq(Readings{}));
568}
569
570class TestReportPeriodicReport : public TestReport
571{
572 void SetUp() override
573 {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100574 sut = makeReport(ReportParams().reportingType(ReportingType::periodic));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200575 }
576};
577
578TEST_F(TestReportPeriodicReport, readingTimestampIsUpdatedAfterIntervalExpires)
579{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100580 clockFake.system.advance(10ms);
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200581 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
582
583 const auto [timestamp, readings] =
584 getProperty<Readings>(sut->getPath(), "Readings");
585
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100586 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200587}
588
589TEST_F(TestReportPeriodicReport, readingsAreUpdatedAfterIntervalExpires)
590{
591 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
592
593 const auto [timestamp, readings] =
594 getProperty<Readings>(sut->getPath(), "Readings");
595
596 EXPECT_THAT(readings,
597 ElementsAre(std::make_tuple("a"s, "b"s, 17.1, 114u),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000598 std::make_tuple("aa"s, "bb"s, 42.0, 74u)));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200599}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100600
Szymon Dompke3eb56862021-09-20 15:32:04 +0200601struct ReportUpdatesReportParams
602{
603 ReportParams reportParams;
604 std::vector<ReadingData> expectedReadings;
605 bool expectedEnabled;
606};
607
608class TestReportWithReportUpdatesAndLimit :
609 public TestReport,
610 public WithParamInterface<ReportUpdatesReportParams>
611{
612 void SetUp() override
613 {
614 sut = makeReport(ReportParams(GetParam().reportParams)
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100615 .reportingType(ReportingType::periodic)
Szymon Dompke3eb56862021-09-20 15:32:04 +0200616 .interval(std::chrono::hours(1000)));
617 }
618};
619
620INSTANTIATE_TEST_SUITE_P(
621 _, TestReportWithReportUpdatesAndLimit,
622 Values(
623 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100624 ReportParams()
625 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
626 .appendLimit(5),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200627 std::vector<ReadingData>{{std::make_tuple("aa"s, "bb"s, 42.0, 74u),
628 std::make_tuple("a"s, "b"s, 17.1, 114u),
629 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
630 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
631 std::make_tuple("a"s, "b"s, 17.1, 114u)}},
632 true},
633 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100634 ReportParams()
635 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
636 .appendLimit(4),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200637 std::vector<ReadingData>{
638 {std::make_tuple("a"s, "b"s, 17.1, 114u),
639 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
640 std::make_tuple("a"s, "b"s, 17.1, 114u),
641 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
642 true},
643 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100644 ReportParams()
645 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
646 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200647 std::vector<ReadingData>{}, true},
648 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100649 ReportParams()
650 .reportUpdates(ReportUpdates::appendStopsWhenFull)
651 .appendLimit(10),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200652 std::vector<ReadingData>{
653 {std::make_tuple("a"s, "b"s, 17.1, 114u),
654 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
655 std::make_tuple("a"s, "b"s, 17.1, 114u),
656 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
657 std::make_tuple("a"s, "b"s, 17.1, 114u),
658 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
659 std::make_tuple("a"s, "b"s, 17.1, 114u),
660 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
661 true},
662 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100663 ReportParams()
664 .reportUpdates(ReportUpdates::appendStopsWhenFull)
665 .appendLimit(5),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200666 std::vector<ReadingData>{{std::make_tuple("a"s, "b"s, 17.1, 114u),
667 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
668 std::make_tuple("a"s, "b"s, 17.1, 114u),
669 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
670 std::make_tuple("a"s, "b"s, 17.1, 114u)}},
671 false},
672 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100673 ReportParams()
674 .reportUpdates(ReportUpdates::appendStopsWhenFull)
675 .appendLimit(4),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200676 std::vector<ReadingData>{
677 {std::make_tuple("a"s, "b"s, 17.1, 114u),
678 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
679 std::make_tuple("a"s, "b"s, 17.1, 114u),
680 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
681 false},
682 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100683 ReportParams()
684 .reportUpdates(ReportUpdates::appendStopsWhenFull)
685 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200686 std::vector<ReadingData>{}, false},
687 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100688 ReportParams()
689 .reportUpdates(ReportUpdates::overwrite)
690 .appendLimit(500),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200691 std::vector<ReadingData>{
692 {std::make_tuple("a"s, "b"s, 17.1, 114u),
693 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
694 true},
695 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100696 ReportParams()
697 .reportUpdates(ReportUpdates::overwrite)
698 .appendLimit(1),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200699 std::vector<ReadingData>{
700 {std::make_tuple("a"s, "b"s, 17.1, 114u),
701 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
702 true},
703 ReportUpdatesReportParams{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100704 ReportParams()
705 .reportUpdates(ReportUpdates::overwrite)
706 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200707 std::vector<ReadingData>{
708 {std::make_tuple("a"s, "b"s, 17.1, 114u),
709 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
710 true}));
711
712TEST_P(TestReportWithReportUpdatesAndLimit,
713 readingsAreUpdatedAfterIntervalExpires)
714{
715 for (int i = 0; i < 4; i++)
716 {
717 sut->updateReadings();
718 }
719
720 const auto [timestamp, readings] =
721 getProperty<Readings>(sut->getPath(), "Readings");
722 const auto enabled = getProperty<bool>(sut->getPath(), "Enabled");
723
724 EXPECT_THAT(readings, ElementsAreArray(GetParam().expectedReadings));
725 EXPECT_EQ(enabled, GetParam().expectedEnabled);
726}
727
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100728class TestReportInitialization : public TestReport
729{
730 public:
731 void SetUp() override
732 {}
733
734 void monitorProc(sdbusplus::message::message& msg)
735 {
736 std::string iface;
737 std::vector<std::pair<std::string, std::variant<Readings>>>
738 changed_properties;
739 std::vector<std::string> invalidated_properties;
740
741 msg.read(iface, changed_properties, invalidated_properties);
742
743 if (iface == Report::reportIfaceName)
744 {
745 for (const auto& [name, value] : changed_properties)
746 {
747 if (name == "Readings")
748 {
749 readingsUpdated.Call();
750 }
751 }
752 }
753 }
754
755 void makeMonitor()
756 {
Patrick Williams3a62ee12021-12-03 10:13:25 -0600757 monitor = std::make_unique<sdbusplus::bus::match_t>(
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100758 *DbusEnvironment::getBus(),
759 sdbusplus::bus::match::rules::propertiesChanged(
760 sut->getPath(), Report::reportIfaceName),
761 [this](auto& msg) { monitorProc(msg); });
762 }
763
Patrick Williams3a62ee12021-12-03 10:13:25 -0600764 std::unique_ptr<sdbusplus::bus::match_t> monitor;
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100765 MockFunction<void()> readingsUpdated;
766};
767
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200768TEST_F(TestReportInitialization,
769 metricsAreInitializedWhenEnabledReportConstructed)
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100770{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200771 initMetricMocks(defaultParams.metricParameters());
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100772 for (auto& metric : metricMocks)
773 {
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200774 EXPECT_CALL(*metric, initialize()).Times(1);
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100775 }
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200776 sut = makeReport(defaultParams.enabled(true));
777}
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100778
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200779TEST_F(TestReportInitialization,
780 metricsAreNotInitializedWhenDisabledReportConstructed)
781{
782 initMetricMocks(defaultParams.metricParameters());
783 for (auto& metric : metricMocks)
784 {
785 EXPECT_CALL(*metric, initialize()).Times(0);
786 }
787 sut = makeReport(defaultParams.enabled(false));
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100788}
789
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200790TEST_F(TestReportInitialization,
791 emitReadingsUpdateIsTrueReadingsPropertiesChangedSingalEmits)
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100792{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200793 EXPECT_CALL(readingsUpdated, Call())
794 .WillOnce(
795 InvokeWithoutArgs(DbusEnvironment::setPromise("readingsUpdated")));
796
797 const auto elapsed = DbusEnvironment::measureTime([this] {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100798 sut =
799 makeReport(defaultParams.reportingType(ReportingType::periodic)
800 .reportActions({ReportAction::emitsReadingsUpdate}));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200801 makeMonitor();
802 EXPECT_TRUE(DbusEnvironment::waitForFuture("readingsUpdated"));
803 });
804
805 EXPECT_THAT(elapsed, AllOf(Ge(defaultParams.interval()),
806 Lt(defaultParams.interval() * 2)));
807}
808
809TEST_F(TestReportInitialization,
810 emitReadingsUpdateIsFalseReadingsPropertiesChangesSigalDoesNotEmits)
811{
812 EXPECT_CALL(readingsUpdated, Call()).Times(0);
813
814 sut = makeReport(
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100815 defaultParams.reportingType(ReportingType::periodic).reportActions({}));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100816 makeMonitor();
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200817 DbusEnvironment::sleepFor(defaultParams.interval() * 2);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100818}
Szymon Dompke3eb56862021-09-20 15:32:04 +0200819
820TEST_F(TestReportInitialization, appendLimitDeducedProperly)
821{
822 sut = makeReport(
823 ReportParams().appendLimit(std::numeric_limits<uint64_t>::max()));
824 auto appendLimit = getProperty<uint64_t>(sut->getPath(), "AppendLimit");
825 EXPECT_EQ(appendLimit, 2ull);
826}
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +0100827
828TEST_F(TestReportInitialization, appendLimitSetToUintMaxIsStoredCorrectly)
829{
830 nlohmann::json storedConfiguration;
831
832 EXPECT_CALL(storageMock, store(to_file_path(ReportParams().reportId()), _))
833 .WillOnce(SaveArg<1>(&storedConfiguration));
834
835 sut = makeReport(
836 ReportParams().appendLimit(std::numeric_limits<uint64_t>::max()));
837
838 ASSERT_THAT(storedConfiguration.at("AppendLimit"),
839 Eq(std::numeric_limits<uint64_t>::max()));
840}
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100841
842TEST_F(TestReportInitialization, triggerIdsPropertyIsInitialzed)
843{
844 sut = makeReport(ReportParams().triggerIds({"trigger1", "trigger2"}));
845
846 EXPECT_THAT(
847 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
848 UnorderedElementsAre("trigger1", "trigger2"));
849}