blob: c5eb4b9c99ab9be617c818c18ff8a6aabd63992b [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 Grobelny51f0fd52021-12-28 16:32:08 +010028constexpr Milliseconds systemTimestamp = 55ms;
29
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +010030namespace
31{
32
33ReportParams defaultParams()
34{
35 return ReportParams();
36}
37
38ReportParams defaultOnChangeParams()
39{
40 return defaultParams().reportingType(ReportingType::onChange);
41}
42
43} // namespace
44
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020045class TestReport : public Test
46{
47 public:
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +020048 std::unique_ptr<ReportManagerMock> reportManagerMock =
Wludzik, Jozefe2362792020-10-27 17:23:55 +010049 std::make_unique<NiceMock<ReportManagerMock>>();
Szymon Dompkefdb06a12022-02-11 11:04:44 +010050 std::unique_ptr<ReportFactoryMock> reportFactoryMock =
51 std::make_unique<NiceMock<ReportFactoryMock>>();
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +010052 nlohmann::json storedConfiguration;
Szymon Dompkefdb06a12022-02-11 11:04:44 +010053 NiceMock<StorageMock> storageMock;
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000054 std::vector<std::shared_ptr<MetricMock>> metricMocks;
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010055 std::unique_ptr<ClockFake> clockFakePtr = std::make_unique<ClockFake>();
56 ClockFake& clockFake = *clockFakePtr;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020057 std::unique_ptr<Report> sut;
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +010058 utils::Messanger messanger;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +020059
Wludzik, Jozefe2362792020-10-27 17:23:55 +010060 MockFunction<void()> checkPoint;
61
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +010062 TestReport() : messanger(DbusEnvironment::getIoc())
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010063 {
64 clockFake.system.set(systemTimestamp);
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +010065 ON_CALL(storageMock, store(to_file_path(ReportParams().reportId()), _))
66 .WillByDefault(SaveArg<1>(&storedConfiguration));
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010067 }
68
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000069 void initMetricMocks(
70 const std::vector<LabeledMetricParameters>& metricParameters)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010071 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000072 for (auto i = metricMocks.size(); i < metricParameters.size(); ++i)
Wludzik, Jozefe2362792020-10-27 17:23:55 +010073 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000074 metricMocks.emplace_back(std::make_shared<NiceMock<MetricMock>>());
75 }
76 metricMocks.resize(metricParameters.size());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000077
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000078 std::vector<MetricValue> readings{{MetricValue{"a", "b", 17.1, 114},
79 MetricValue{"aa", "bb", 42.0, 74}}};
80 readings.resize(metricParameters.size());
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000081
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000082 for (size_t i = 0; i < metricParameters.size(); ++i)
83 {
Krzysztof Grobelny9e8da542022-02-17 10:40:16 +010084 ON_CALL(*metricMocks[i], getUpdatedReadings())
85 .WillByDefault(ReturnRefOfCopy(std::vector({readings[i]})));
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +000086 ON_CALL(*metricMocks[i], dumpConfiguration())
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000087 .WillByDefault(Return(metricParameters[i]));
Wludzik, Jozefe2362792020-10-27 17:23:55 +010088 }
89 }
90
Szymon Dompkefdb06a12022-02-11 11:04:44 +010091 std::vector<std::shared_ptr<interfaces::Metric>>
92 getMetricsFromReadingParams(const ReadingParameters& params)
93 {
94 const auto metricParameters =
95 reportFactoryMock->convertMetricParams(params);
96 std::vector<std::shared_ptr<MetricMock>> metricMocks;
97
98 for (size_t i = 0; i < metricParameters.size(); ++i)
99 {
100 metricMocks.emplace_back(std::make_shared<NiceMock<MetricMock>>());
101 ON_CALL(*metricMocks[i], dumpConfiguration())
102 .WillByDefault(Return(metricParameters[i]));
103 }
104
105 return utils::convContainer<std::shared_ptr<interfaces::Metric>>(
106 metricMocks);
107 }
108
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200109 void SetUp() override
110 {
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100111 sut = makeReport(defaultParams());
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200112 }
113
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100114 static interfaces::JsonStorage::FilePath to_file_path(std::string id)
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100115 {
116 return interfaces::JsonStorage::FilePath(
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100117 std::to_string(std::hash<std::string>{}(id)));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100118 }
119
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200120 std::unique_ptr<Report> makeReport(const ReportParams& params)
121 {
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000122 initMetricMocks(params.metricParameters());
123
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200124 return std::make_unique<Report>(
125 DbusEnvironment::getIoc(), DbusEnvironment::getObjServer(),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100126 params.reportId(), params.reportName(), params.reportingType(),
127 params.reportActions(), params.interval(), params.appendLimit(),
128 params.reportUpdates(), *reportManagerMock, storageMock,
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200129 utils::convContainer<std::shared_ptr<interfaces::Metric>>(
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200130 metricMocks),
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100131 *reportFactoryMock, params.enabled(), std::move(clockFakePtr),
132 params.readings());
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200133 }
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200134
135 template <class T>
136 static T getProperty(const std::string& path, const std::string& property)
137 {
Szymon Dompkee28aa532021-10-27 12:33:12 +0200138 return DbusEnvironment::getProperty<T>(path, Report::reportIfaceName,
139 property);
140 }
141
142 template <class T>
143 static boost::system::error_code setProperty(const std::string& path,
144 const std::string& property,
145 const T& newValue)
146 {
147 return DbusEnvironment::setProperty<T>(path, Report::reportIfaceName,
148 property, newValue);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100149 }
150
151 boost::system::error_code call(const std::string& path,
152 const std::string& interface,
153 const std::string& method)
154 {
155 std::promise<boost::system::error_code> methodPromise;
156 DbusEnvironment::getBus()->async_method_call(
157 [&methodPromise](boost::system::error_code ec) {
158 methodPromise.set_value(ec);
159 },
160 DbusEnvironment::serviceName(), path, interface, method);
161 return DbusEnvironment::waitForFuture(methodPromise.get_future());
162 }
163
164 boost::system::error_code update(const std::string& path)
165 {
166 return call(path, Report::reportIfaceName, "Update");
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200167 }
168
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200169 boost::system::error_code deleteReport(const std::string& path)
170 {
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100171 return call(path, Report::deleteIfaceName, "Delete");
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200172 }
173};
174
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100175TEST_F(TestReport, returnsId)
176{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100177 EXPECT_THAT(sut->getId(), Eq(defaultParams().reportId()));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100178}
179
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200180TEST_F(TestReport, verifyIfPropertiesHaveValidValue)
181{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200182 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100183 Eq(defaultParams().enabled()));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200184 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100185 Eq(defaultParams().interval().count()));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100186 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistency"), Eq(true));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100187 EXPECT_THAT(
188 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100189 Eq(utils::transform(defaultParams().reportActions(), [](const auto v) {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100190 return utils::enumToString(v);
191 })));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200192 EXPECT_THAT(getProperty<bool>(sut->getPath(), "EmitsReadingsUpdate"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100193 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100194 ReportAction::emitsReadingsUpdate)));
Szymon Dompke3eb56862021-09-20 15:32:04 +0200195 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "AppendLimit"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100196 Eq(defaultParams().appendLimit()));
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100197 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportingType"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100198 Eq(utils::enumToString(defaultParams().reportingType())));
Szymon Dompke3eb56862021-09-20 15:32:04 +0200199 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportUpdates"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100200 Eq(utils::enumToString(defaultParams().reportUpdates())));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200201 EXPECT_THAT(
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200202 getProperty<bool>(sut->getPath(), "LogToMetricReportsCollection"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100203 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100204 ReportAction::logToMetricReportsCollection)));
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000205 EXPECT_THAT(getProperty<ReadingParameters>(
206 sut->getPath(), "ReadingParametersFutureVersion"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100207 Eq(toReadingParameters(defaultParams().metricParameters())));
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100208 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "Name"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100209 Eq(defaultParams().reportName()));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100210 EXPECT_THAT(
211 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
212 Eq(std::vector<std::string>()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200213}
214
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200215TEST_F(TestReport, readingsAreInitialyEmpty)
216{
217 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
218 Eq(Readings{}));
219}
220
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100221TEST_F(TestReport, setReadingParametersWithNewParams)
222{
223 ReadingParameters newParams = toReadingParameters(
224 std::vector<LabeledMetricParameters>{{LabeledMetricParameters{
225 {LabeledSensorInfo{"Service",
226 "/xyz/openbmc_project/sensors/power/psu",
227 "NewMetadata123"}},
228 OperationType::avg,
229 "NewMetricId123",
230 CollectionTimeScope::startup,
231 CollectionDuration(250ms)}}});
232 auto metrics = getMetricsFromReadingParams(newParams);
233
234 EXPECT_CALL(*reportFactoryMock, updateMetrics(_, _, _))
235 .WillOnce(SetArgReferee<0>(metrics));
236 EXPECT_THAT(
237 setProperty(sut->getPath(), "ReadingParametersFutureVersion", newParams)
238 .value(),
239 Eq(boost::system::errc::success));
240 EXPECT_THAT(getProperty<ReadingParameters>(
241 sut->getPath(), "ReadingParametersFutureVersion"),
242 Eq(newParams));
243}
244
245TEST_F(TestReport, setReportingTypeWithValidNewType)
246{
247 std::string newType = "Periodic";
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100248 std::string currType = utils::enumToString(defaultParams().reportingType());
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100249
250 EXPECT_THAT(newType, Ne(currType));
251 EXPECT_THAT(setProperty(sut->getPath(), "ReportingType", newType).value(),
252 Eq(boost::system::errc::success));
253 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportingType"),
254 Eq(newType));
255}
256
257TEST_F(TestReport, setReportingTypeWithInvalidType)
258{
259 std::string newType = "Periodic_ABC";
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100260 std::string prevType = utils::enumToString(defaultParams().reportingType());
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100261
262 EXPECT_THAT(setProperty(sut->getPath(), "ReportingType", newType).value(),
263 Eq(boost::system::errc::invalid_argument));
264 EXPECT_THAT(getProperty<std::string>(sut->getPath(), "ReportingType"),
265 Eq(prevType));
266}
267
268TEST_F(TestReport, setReportActionsWithValidNewActions)
269{
270 std::vector<std::string> newActions = {"EmitsReadingsUpdate"};
271 std::vector<std::string> currActions =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100272 utils::transform(defaultParams().reportActions(),
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100273 [](const auto v) { return utils::enumToString(v); });
274
275 EXPECT_THAT(newActions, Ne(currActions));
276 EXPECT_THAT(
277 setProperty(sut->getPath(), "ReportActions", newActions).value(),
278 Eq(boost::system::errc::success));
279 EXPECT_THAT(
280 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
281 UnorderedElementsAre("EmitsReadingsUpdate",
282 "LogToMetricReportsCollection"));
283}
284
285TEST_F(TestReport, setReportActionsWithValidUnsortedActions)
286{
287 std::vector<std::string> newActions = {"LogToMetricReportsCollection",
288 "EmitsReadingsUpdate"};
289 std::vector<std::string> expectedActions = {"EmitsReadingsUpdate",
290 "LogToMetricReportsCollection"};
291 std::vector<std::string> currActions =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100292 utils::transform(defaultParams().reportActions(),
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100293 [](const auto v) { return utils::enumToString(v); });
294
295 EXPECT_THAT(newActions, Ne(currActions));
296 EXPECT_THAT(
297 setProperty(sut->getPath(), "ReportActions", newActions).value(),
298 Eq(boost::system::errc::success));
299 EXPECT_THAT(
300 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
301 Eq(expectedActions));
302}
303
304TEST_F(TestReport, setReportActionsWithEmptyActions)
305{
306 std::vector<std::string> newActions = {};
307 std::vector<std::string> expectedActions = {"LogToMetricReportsCollection"};
308 std::vector<std::string> currActions =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100309 utils::transform(defaultParams().reportActions(),
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100310 [](const auto v) { return utils::enumToString(v); });
311
312 EXPECT_THAT(newActions, Ne(currActions));
313 EXPECT_THAT(
314 setProperty(sut->getPath(), "ReportActions", newActions).value(),
315 Eq(boost::system::errc::success));
316 EXPECT_THAT(
317 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
318 Eq(expectedActions));
319}
320
321TEST_F(TestReport, setReportActionsWithInvalidActions)
322{
323 std::vector<std::string> invalidActions = {"EmitsReadingsUpdate_1"};
324 EXPECT_THAT(
325 setProperty(sut->getPath(), "ReportActions", invalidActions).value(),
326 Eq(boost::system::errc::invalid_argument));
327 EXPECT_THAT(
328 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100329 Eq(utils::transform(defaultParams().reportActions(), [](const auto v) {
Szymon Dompkefdb06a12022-02-11 11:04:44 +0100330 return utils::enumToString(v);
331 })));
332}
333
334TEST_F(TestReport, createReportWithEmptyActions)
335{
336 std::vector<std::string> expectedActions = {"LogToMetricReportsCollection"};
337
338 sut = makeReport(ReportParams().reportId("TestId_1").reportActions({}));
339 EXPECT_THAT(
340 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
341 Eq(expectedActions));
342}
343
344TEST_F(TestReport, createReportWithValidUnsortedActions)
345{
346 std::vector<std::string> newActions = {"LogToMetricReportsCollection",
347 "EmitsReadingsUpdate"};
348 std::vector<std::string> expectedActions = {"EmitsReadingsUpdate",
349 "LogToMetricReportsCollection"};
350
351 sut = makeReport(
352 ReportParams()
353 .reportId("TestId_1")
354 .reportActions(utils::transform(newActions, [](const auto& action) {
355 return utils::toReportAction(action);
356 })));
357 EXPECT_THAT(
358 getProperty<std::vector<std::string>>(sut->getPath(), "ReportActions"),
359 Eq(expectedActions));
360}
361
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200362TEST_F(TestReport, setEnabledWithNewValue)
363{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100364 bool newValue = !defaultParams().enabled();
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200365 EXPECT_THAT(setProperty(sut->getPath(), "Enabled", newValue).value(),
366 Eq(boost::system::errc::success));
367 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Enabled"), Eq(newValue));
368}
369
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200370TEST_F(TestReport, setIntervalWithValidValue)
371{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100372 uint64_t newValue = defaultParams().interval().count() + 1;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200373 EXPECT_THAT(setProperty(sut->getPath(), "Interval", newValue).value(),
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200374 Eq(boost::system::errc::success));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200375 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
376 Eq(newValue));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200377}
378
Szymon Dompke3e2cc9d2021-12-14 12:00:52 +0100379TEST_F(
380 TestReport,
381 settingIntervalWithInvalidValueDoesNotChangePropertyAndReturnsInvalidArgument)
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200382{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100383 uint64_t newValue = defaultParams().interval().count() - 1;
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200384 EXPECT_THAT(setProperty(sut->getPath(), "Interval", newValue).value(),
Szymon Dompke3e2cc9d2021-12-14 12:00:52 +0100385 Eq(boost::system::errc::invalid_argument));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200386 EXPECT_THAT(getProperty<uint64_t>(sut->getPath(), "Interval"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100387 Eq(defaultParams().interval().count()));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100388}
389
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200390TEST_F(TestReport, settingEmitsReadingsUpdateHaveNoEffect)
391{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100392 EXPECT_THAT(
393 setProperty(sut->getPath(), "EmitsReadingsUpdate", true).value(),
394 Eq(boost::system::errc::read_only_file_system));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200395 EXPECT_THAT(getProperty<bool>(sut->getPath(), "EmitsReadingsUpdate"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100396 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100397 ReportAction::emitsReadingsUpdate)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200398}
399
400TEST_F(TestReport, settingLogToMetricReportCollectionHaveNoEffect)
401{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100402 EXPECT_THAT(
403 setProperty(sut->getPath(), "LogToMetricReportsCollection", true)
404 .value(),
405 Eq(boost::system::errc::read_only_file_system));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200406 EXPECT_THAT(
407 getProperty<bool>(sut->getPath(), "LogToMetricReportsCollection"),
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100408 Eq(utils::contains(defaultParams().reportActions(),
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100409 ReportAction::logToMetricReportsCollection)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200410}
411
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100412TEST_F(TestReport, settingPersistencyToFalseRemovesReportFromStorage)
413{
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100414 EXPECT_CALL(storageMock, store(_, _)).Times(0);
415 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())))
416 .Times(AtLeast(1));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100417
418 bool persistency = false;
419 EXPECT_THAT(setProperty(sut->getPath(), "Persistency", persistency).value(),
420 Eq(boost::system::errc::success));
421 EXPECT_THAT(getProperty<bool>(sut->getPath(), "Persistency"),
422 Eq(persistency));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200423}
424
425TEST_F(TestReport, deleteReport)
426{
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200427 EXPECT_CALL(*reportManagerMock, removeReport(sut.get()));
428 auto ec = deleteReport(sut->getPath());
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200429 EXPECT_THAT(ec, Eq(boost::system::errc::success));
430}
431
432TEST_F(TestReport, deletingNonExistingReportReturnInvalidRequestDescriptor)
433{
434 auto ec = deleteReport(Report::reportDir + "NonExisting"s);
435 EXPECT_THAT(ec.value(), Eq(EBADR));
436}
437
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100438TEST_F(TestReport, deleteReportExpectThatFileIsRemoveFromStorage)
439{
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100440 EXPECT_CALL(storageMock, store(_, _)).Times(0);
441 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())))
442 .Times(AtLeast(1));
443
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100444 auto ec = deleteReport(sut->getPath());
445 EXPECT_THAT(ec, Eq(boost::system::errc::success));
446}
447
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100448TEST_F(TestReport, updatesTriggerIdWhenTriggerIsAdded)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100449{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100450 utils::Messanger messanger(DbusEnvironment::getIoc());
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100451
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100452 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100453 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100454 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100455 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100456 messanger.send(messages::TriggerPresenceChangedInd{
457 messages::Presence::Exist, "trigger2", {"someOtherReport"}});
458 messanger.send(messages::TriggerPresenceChangedInd{
459 messages::Presence::Exist,
460 "trigger3",
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100461 {"someOtherReport", defaultParams().reportId()}});
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100462
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100463 EXPECT_THAT(
464 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100465 UnorderedElementsAre("trigger1", "trigger3"));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100466}
467
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100468TEST_F(TestReport, updatesTriggerIdWhenTriggerIsRemoved)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100469{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100470 utils::Messanger messanger(DbusEnvironment::getIoc());
471
472 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100473 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100474 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100475 messages::Presence::Exist, "trigger2", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100476 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100477 messages::Presence::Exist, "trigger3", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100478
479 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100480 messages::Presence::Removed, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100481 messanger.send(messages::TriggerPresenceChangedInd{
482 messages::Presence::Removed, "trigger2", {}});
483 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100484 messages::Presence::Removed, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100485
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100486 EXPECT_THAT(
487 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100488 UnorderedElementsAre("trigger3"));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100489}
490
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100491TEST_F(TestReport, updatesTriggerIdWhenTriggerIsModified)
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100492{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100493 utils::Messanger messanger(DbusEnvironment::getIoc());
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100494
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100495 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100496 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100497 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100498 messages::Presence::Exist, "trigger2", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100499 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100500 messages::Presence::Exist, "trigger3", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100501
502 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100503 messages::Presence::Exist, "trigger1", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100504 messanger.send(messages::TriggerPresenceChangedInd{
505 messages::Presence::Exist, "trigger2", {}});
506 messanger.send(messages::TriggerPresenceChangedInd{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100507 messages::Presence::Exist, "trigger3", {defaultParams().reportId()}});
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100508
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100509 EXPECT_THAT(
510 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100511 UnorderedElementsAre("trigger1", "trigger3"));
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +0100512}
513
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100514class TestReportStore :
515 public TestReport,
516 public WithParamInterface<std::pair<std::string, nlohmann::json>>
517{
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100518 void SetUp() override
519 {}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100520};
521
522INSTANTIATE_TEST_SUITE_P(
523 _, TestReportStore,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100524 Values(
525 std::make_pair("Enabled"s, nlohmann::json(defaultParams().enabled())),
526 std::make_pair("Version"s, nlohmann::json(6)),
527 std::make_pair("Id"s, nlohmann::json(defaultParams().reportId())),
528 std::make_pair("Name"s, nlohmann::json(defaultParams().reportName())),
529 std::make_pair("ReportingType",
530 nlohmann::json(defaultParams().reportingType())),
531 std::make_pair("ReportActions", nlohmann::json(utils::transform(
532 defaultParams().reportActions(),
533 [](const auto v) {
534 return utils::toUnderlying(v);
535 }))),
536 std::make_pair("Interval",
537 nlohmann::json(defaultParams().interval().count())),
538 std::make_pair("AppendLimit",
539 nlohmann::json(ReportParams().appendLimit())),
540 std::make_pair(
541 "ReadingParameters",
542 nlohmann::json(
543 {{{tstring::SensorPath::str(),
544 {{{tstring::Service::str(), "Service"},
545 {tstring::Path::str(),
546 "/xyz/openbmc_project/sensors/power/p1"},
547 {tstring::Metadata::str(), "metadata1"}}}},
548 {tstring::OperationType::str(), OperationType::avg},
549 {tstring::Id::str(), "MetricId1"},
550 {tstring::CollectionTimeScope::str(),
551 CollectionTimeScope::point},
552 {tstring::CollectionDuration::str(), 0}},
553 {{tstring::SensorPath::str(),
554 {{{tstring::Service::str(), "Service"},
555 {tstring::Path::str(),
556 "/xyz/openbmc_project/sensors/power/p2"},
557 {tstring::Metadata::str(), "metadata2"}}}},
558 {tstring::OperationType::str(), OperationType::avg},
559 {tstring::Id::str(), "MetricId2"},
560 {tstring::CollectionTimeScope::str(),
561 CollectionTimeScope::point},
562 {tstring::CollectionDuration::str(), 0}}}))));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100563
564TEST_P(TestReportStore, settingPersistencyToTrueStoresReport)
565{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100566 sut = makeReport(defaultParams());
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100567
568 {
569 InSequence seq;
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100570 EXPECT_CALL(storageMock, remove(to_file_path(sut->getId())));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100571 EXPECT_CALL(checkPoint, Call());
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100572 EXPECT_CALL(storageMock, store(to_file_path(sut->getId()), _));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100573 }
574
575 setProperty(sut->getPath(), "Persistency", false);
576 checkPoint.Call();
577 setProperty(sut->getPath(), "Persistency", true);
578
579 const auto& [key, value] = GetParam();
580
581 ASSERT_THAT(storedConfiguration.at(key), Eq(value));
582}
583
584TEST_P(TestReportStore, reportIsSavedToStorageAfterCreated)
585{
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +0100586 EXPECT_CALL(storageMock,
587 store(to_file_path(defaultParams().reportId()), _));
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100588
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100589 sut = makeReport(defaultParams());
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100590
591 const auto& [key, value] = GetParam();
592
593 ASSERT_THAT(storedConfiguration.at(key), Eq(value));
594}
595
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200596class TestReportValidNames :
597 public TestReport,
598 public WithParamInterface<ReportParams>
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200599{
600 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200601 void SetUp() override
602 {}
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200603};
604
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200605INSTANTIATE_TEST_SUITE_P(
606 ValidNames, TestReportValidNames,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100607 Values(defaultParams().reportName("Valid_1"),
608 defaultParams().reportName("Valid_1/Valid_2"),
609 defaultParams().reportName("Valid_1/Valid_2/Valid_3")));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200610
611TEST_P(TestReportValidNames, reportCtorDoesNotThrowOnValidName)
612{
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200613 EXPECT_NO_THROW(makeReport(GetParam()));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200614}
615
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100616class TestReportInvalidIds :
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200617 public TestReport,
618 public WithParamInterface<ReportParams>
619{
620 public:
621 void SetUp() override
622 {}
623};
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200624
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100625INSTANTIATE_TEST_SUITE_P(InvalidNames, TestReportInvalidIds,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100626 Values(defaultParams().reportId("/"),
627 defaultParams().reportId("/Invalid"),
628 defaultParams().reportId("Invalid/"),
629 defaultParams().reportId("Invalid/Invalid/"),
630 defaultParams().reportId("Invalid?")));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200631
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100632TEST_P(TestReportInvalidIds, failsToCreateReportWithInvalidName)
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100633{
634 EXPECT_CALL(storageMock, store).Times(0);
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +0100635
636 EXPECT_THROW(makeReport(GetParam()), sdbusplus::exception::SdBusError);
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100637}
638
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200639class TestReportAllReportTypes :
640 public TestReport,
641 public WithParamInterface<ReportParams>
642{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200643 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200644 void SetUp() override
645 {
646 sut = makeReport(GetParam());
647 }
648};
649
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100650INSTANTIATE_TEST_SUITE_P(
651 _, TestReportAllReportTypes,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100652 Values(defaultParams().reportingType(ReportingType::onRequest),
653 defaultParams().reportingType(ReportingType::onChange),
654 defaultParams().reportingType(ReportingType::periodic)));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200655
656TEST_P(TestReportAllReportTypes, returnPropertValueOfReportType)
657{
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100658 EXPECT_THAT(utils::toReportingType(
659 getProperty<std::string>(sut->getPath(), "ReportingType")),
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200660 Eq(GetParam().reportingType()));
661}
662
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100663TEST_P(TestReportAllReportTypes, readingsAreUpdated)
664{
665 clockFake.system.advance(10ms);
666
667 messanger.send(messages::UpdateReportInd{{sut->getId()}});
668 const auto [timestamp, readings] =
669 getProperty<Readings>(sut->getPath(), "Readings");
670
671 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
672}
673
674TEST_P(TestReportAllReportTypes, readingsAreNotUpdatedWhenReportIsDisabled)
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200675{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100676 clockFake.system.advance(10ms);
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200677
678 setProperty(sut->getPath(), "Enabled", false);
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100679 messanger.send(messages::UpdateReportInd{{sut->getId()}});
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200680 const auto [timestamp, readings] =
681 getProperty<Readings>(sut->getPath(), "Readings");
682
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100683 EXPECT_THAT(Milliseconds{timestamp}, Eq(0ms));
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200684}
685
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100686TEST_P(TestReportAllReportTypes, readingsAreNotUpdatedWhenReportIdDiffers)
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100687{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100688 clockFake.system.advance(10ms);
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100689
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100690 messanger.send(messages::UpdateReportInd{{sut->getId() + "x"s}});
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100691 const auto [timestamp, readings] =
692 getProperty<Readings>(sut->getPath(), "Readings");
693
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100694 EXPECT_THAT(Milliseconds{timestamp}, Eq(0ms));
Wludzik, Jozefd960e1f2021-01-08 09:25:59 +0100695}
696
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100697class TestReportOnRequestType : public TestReport
698{
699 void SetUp() override
700 {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100701 sut =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100702 makeReport(defaultParams().reportingType(ReportingType::onRequest));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100703 }
704};
705
706TEST_F(TestReportOnRequestType, updatesReadingTimestamp)
707{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100708 clockFake.system.advance(10ms);
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100709
710 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
711
712 const auto [timestamp, readings] =
713 getProperty<Readings>(sut->getPath(), "Readings");
714
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100715 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100716}
717
718TEST_F(TestReportOnRequestType, updatesReadingWhenUpdateIsCalled)
719{
720 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
721
722 const auto [timestamp, readings] =
723 getProperty<Readings>(sut->getPath(), "Readings");
724
725 EXPECT_THAT(readings,
726 ElementsAre(std::make_tuple("a"s, "b"s, 17.1, 114u),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000727 std::make_tuple("aa"s, "bb"s, 42.0, 74u)));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100728}
729
730class TestReportNonOnRequestType :
731 public TestReport,
732 public WithParamInterface<ReportParams>
733{
734 void SetUp() override
735 {
736 sut = makeReport(GetParam());
737 }
738};
739
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100740INSTANTIATE_TEST_SUITE_P(
741 _, TestReportNonOnRequestType,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100742 Values(defaultParams().reportingType(ReportingType::periodic),
743 defaultParams().reportingType(ReportingType::onChange)));
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +0100744
745TEST_P(TestReportNonOnRequestType, readingsAreNotUpdateOnUpdateCall)
746{
747 ASSERT_THAT(update(sut->getPath()), Eq(boost::system::errc::success));
748
749 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
750 Eq(Readings{}));
751}
752
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200753class TestReportNonPeriodicReport :
754 public TestReport,
755 public WithParamInterface<ReportParams>
756{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +0200757 public:
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200758 void SetUp() override
759 {
760 sut = makeReport(GetParam());
761 }
762};
763
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100764INSTANTIATE_TEST_SUITE_P(
765 _, TestReportNonPeriodicReport,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100766 Values(defaultParams().reportingType(ReportingType::onRequest),
767 defaultParams().reportingType(ReportingType::onChange)));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200768
769TEST_P(TestReportNonPeriodicReport, readingsAreNotUpdatedAfterIntervalExpires)
770{
771 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
772
773 EXPECT_THAT(getProperty<Readings>(sut->getPath(), "Readings"),
774 Eq(Readings{}));
775}
776
777class TestReportPeriodicReport : public TestReport
778{
779 void SetUp() override
780 {
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100781 sut =
782 makeReport(defaultParams().reportingType(ReportingType::periodic));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200783 }
784};
785
786TEST_F(TestReportPeriodicReport, readingTimestampIsUpdatedAfterIntervalExpires)
787{
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100788 clockFake.system.advance(10ms);
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200789 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
790
791 const auto [timestamp, readings] =
792 getProperty<Readings>(sut->getPath(), "Readings");
793
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +0100794 EXPECT_THAT(Milliseconds{timestamp}, Eq(systemTimestamp + 10ms));
Krzysztof Grobelnyc8e3a642020-10-23 12:29:16 +0200795}
796
797TEST_F(TestReportPeriodicReport, readingsAreUpdatedAfterIntervalExpires)
798{
799 DbusEnvironment::sleepFor(ReportManager::minInterval + 1ms);
800
801 const auto [timestamp, readings] =
802 getProperty<Readings>(sut->getPath(), "Readings");
803
804 EXPECT_THAT(readings,
805 ElementsAre(std::make_tuple("a"s, "b"s, 17.1, 114u),
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000806 std::make_tuple("aa"s, "bb"s, 42.0, 74u)));
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +0200807}
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100808
Szymon Dompke3eb56862021-09-20 15:32:04 +0200809struct ReportUpdatesReportParams
810{
811 ReportParams reportParams;
812 std::vector<ReadingData> expectedReadings;
813 bool expectedEnabled;
814};
815
816class TestReportWithReportUpdatesAndLimit :
817 public TestReport,
818 public WithParamInterface<ReportUpdatesReportParams>
819{
820 void SetUp() override
821 {
822 sut = makeReport(ReportParams(GetParam().reportParams)
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100823 .reportingType(ReportingType::periodic)
Szymon Dompke3eb56862021-09-20 15:32:04 +0200824 .interval(std::chrono::hours(1000)));
825 }
826};
827
828INSTANTIATE_TEST_SUITE_P(
829 _, TestReportWithReportUpdatesAndLimit,
830 Values(
831 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100832 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100833 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
834 .appendLimit(5),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200835 std::vector<ReadingData>{{std::make_tuple("aa"s, "bb"s, 42.0, 74u),
836 std::make_tuple("a"s, "b"s, 17.1, 114u),
837 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
838 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
839 std::make_tuple("a"s, "b"s, 17.1, 114u)}},
840 true},
841 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100842 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100843 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
844 .appendLimit(4),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200845 std::vector<ReadingData>{
846 {std::make_tuple("a"s, "b"s, 17.1, 114u),
847 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
848 std::make_tuple("a"s, "b"s, 17.1, 114u),
849 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
850 true},
851 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100852 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100853 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
854 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200855 std::vector<ReadingData>{}, true},
856 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100857 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100858 .reportUpdates(ReportUpdates::appendStopsWhenFull)
859 .appendLimit(10),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200860 std::vector<ReadingData>{
861 {std::make_tuple("a"s, "b"s, 17.1, 114u),
862 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
863 std::make_tuple("a"s, "b"s, 17.1, 114u),
864 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
865 std::make_tuple("a"s, "b"s, 17.1, 114u),
866 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
867 std::make_tuple("a"s, "b"s, 17.1, 114u),
868 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
869 true},
870 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100871 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100872 .reportUpdates(ReportUpdates::appendStopsWhenFull)
873 .appendLimit(5),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200874 std::vector<ReadingData>{{std::make_tuple("a"s, "b"s, 17.1, 114u),
875 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
876 std::make_tuple("a"s, "b"s, 17.1, 114u),
877 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
878 std::make_tuple("a"s, "b"s, 17.1, 114u)}},
879 false},
880 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100881 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100882 .reportUpdates(ReportUpdates::appendStopsWhenFull)
883 .appendLimit(4),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200884 std::vector<ReadingData>{
885 {std::make_tuple("a"s, "b"s, 17.1, 114u),
886 std::make_tuple("aa"s, "bb"s, 42.0, 74u),
887 std::make_tuple("a"s, "b"s, 17.1, 114u),
888 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
889 false},
890 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100891 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100892 .reportUpdates(ReportUpdates::appendStopsWhenFull)
893 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200894 std::vector<ReadingData>{}, false},
895 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100896 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100897 .reportUpdates(ReportUpdates::overwrite)
898 .appendLimit(500),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200899 std::vector<ReadingData>{
900 {std::make_tuple("a"s, "b"s, 17.1, 114u),
901 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
902 true},
903 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100904 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100905 .reportUpdates(ReportUpdates::overwrite)
906 .appendLimit(1),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200907 std::vector<ReadingData>{
908 {std::make_tuple("a"s, "b"s, 17.1, 114u),
909 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
910 true},
911 ReportUpdatesReportParams{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100912 defaultParams()
Krzysztof Grobelny51497a02021-11-09 14:56:22 +0100913 .reportUpdates(ReportUpdates::overwrite)
914 .appendLimit(0),
Szymon Dompke3eb56862021-09-20 15:32:04 +0200915 std::vector<ReadingData>{
916 {std::make_tuple("a"s, "b"s, 17.1, 114u),
917 std::make_tuple("aa"s, "bb"s, 42.0, 74u)}},
918 true}));
919
920TEST_P(TestReportWithReportUpdatesAndLimit,
921 readingsAreUpdatedAfterIntervalExpires)
922{
923 for (int i = 0; i < 4; i++)
924 {
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +0100925 messanger.send(messages::UpdateReportInd{{sut->getId()}});
Szymon Dompke3eb56862021-09-20 15:32:04 +0200926 }
927
928 const auto [timestamp, readings] =
929 getProperty<Readings>(sut->getPath(), "Readings");
930 const auto enabled = getProperty<bool>(sut->getPath(), "Enabled");
931
932 EXPECT_THAT(readings, ElementsAreArray(GetParam().expectedReadings));
933 EXPECT_EQ(enabled, GetParam().expectedEnabled);
934}
935
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100936class TestReportInitialization : public TestReport
937{
938 public:
939 void SetUp() override
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100940 {
941 initMetricMocks(defaultParams().metricParameters());
942 }
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100943
944 void monitorProc(sdbusplus::message::message& msg)
945 {
946 std::string iface;
947 std::vector<std::pair<std::string, std::variant<Readings>>>
948 changed_properties;
949 std::vector<std::string> invalidated_properties;
950
951 msg.read(iface, changed_properties, invalidated_properties);
952
953 if (iface == Report::reportIfaceName)
954 {
955 for (const auto& [name, value] : changed_properties)
956 {
957 if (name == "Readings")
958 {
959 readingsUpdated.Call();
960 }
961 }
962 }
963 }
964
965 void makeMonitor()
966 {
Patrick Williams3a62ee12021-12-03 10:13:25 -0600967 monitor = std::make_unique<sdbusplus::bus::match_t>(
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100968 *DbusEnvironment::getBus(),
969 sdbusplus::bus::match::rules::propertiesChanged(
970 sut->getPath(), Report::reportIfaceName),
971 [this](auto& msg) { monitorProc(msg); });
972 }
973
Patrick Williams3a62ee12021-12-03 10:13:25 -0600974 std::unique_ptr<sdbusplus::bus::match_t> monitor;
Wludzik, Jozefe2362792020-10-27 17:23:55 +0100975 MockFunction<void()> readingsUpdated;
976};
977
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200978TEST_F(TestReportInitialization,
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100979 registersForMetricUpdatesWhenOnChangeReportCreated)
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100980{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100981 std::vector<const interfaces::MetricListener*> args;
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100982 for (auto& metric : metricMocks)
983 {
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100984 EXPECT_CALL(*metric, registerForUpdates(_))
985 .WillOnce(Invoke([&args](const interfaces::MetricListener& report) {
986 args.emplace_back(&report);
987 }));
988 ;
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +0100989 }
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100990
991 sut = makeReport(defaultParams().reportingType(ReportingType::onChange));
992
993 EXPECT_THAT(args, SizeIs(metricMocks.size()));
994 for (const auto* reportPtr : args)
995 {
996 EXPECT_THAT(reportPtr, Eq(sut.get()));
997 }
998}
999
1000TEST_F(TestReportInitialization,
1001 deregistersForMetricUpdatesWhenOnChangeReportDestroyed)
1002{
1003 sut = makeReport(defaultParams().reportingType(ReportingType::onChange));
1004
1005 for (auto& metric : metricMocks)
1006 {
1007 EXPECT_CALL(*metric,
1008 unregisterFromUpdates(Ref(
1009 static_cast<interfaces::MetricListener&>(*sut.get()))));
1010 }
1011
1012 sut = nullptr;
1013}
1014
1015TEST_F(TestReportInitialization,
1016 metricsAreInitializedWhenEnabledReportConstructed)
1017{
1018 for (auto& metric : metricMocks)
1019 {
1020 EXPECT_CALL(*metric, initialize());
1021 }
1022 sut = makeReport(defaultParams().enabled(true));
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001023}
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001024
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001025TEST_F(TestReportInitialization,
1026 metricsAreNotInitializedWhenDisabledReportConstructed)
1027{
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +02001028 for (auto& metric : metricMocks)
1029 {
1030 EXPECT_CALL(*metric, initialize()).Times(0);
1031 }
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001032 sut = makeReport(defaultParams().enabled(false));
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +01001033}
1034
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001035TEST_F(TestReportInitialization,
1036 emitReadingsUpdateIsTrueReadingsPropertiesChangedSingalEmits)
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001037{
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001038 EXPECT_CALL(readingsUpdated, Call())
1039 .WillOnce(
1040 InvokeWithoutArgs(DbusEnvironment::setPromise("readingsUpdated")));
1041
1042 const auto elapsed = DbusEnvironment::measureTime([this] {
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001043 sut =
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001044 makeReport(defaultParams()
1045 .reportingType(ReportingType::periodic)
Krzysztof Grobelny51497a02021-11-09 14:56:22 +01001046 .reportActions({ReportAction::emitsReadingsUpdate}));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001047 makeMonitor();
1048 EXPECT_TRUE(DbusEnvironment::waitForFuture("readingsUpdated"));
1049 });
1050
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001051 EXPECT_THAT(elapsed, AllOf(Ge(defaultParams().interval()),
1052 Lt(defaultParams().interval() * 2)));
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +02001053}
1054
1055TEST_F(TestReportInitialization,
1056 emitReadingsUpdateIsFalseReadingsPropertiesChangesSigalDoesNotEmits)
1057{
1058 EXPECT_CALL(readingsUpdated, Call()).Times(0);
1059
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001060 sut = makeReport(defaultParams()
1061 .reportingType(ReportingType::periodic)
1062 .reportActions({}));
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001063 makeMonitor();
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001064 DbusEnvironment::sleepFor(defaultParams().interval() * 2);
Wludzik, Jozefe2362792020-10-27 17:23:55 +01001065}
Szymon Dompke3eb56862021-09-20 15:32:04 +02001066
1067TEST_F(TestReportInitialization, appendLimitDeducedProperly)
1068{
1069 sut = makeReport(
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001070 defaultParams().appendLimit(std::numeric_limits<uint64_t>::max()));
Szymon Dompke3eb56862021-09-20 15:32:04 +02001071 auto appendLimit = getProperty<uint64_t>(sut->getPath(), "AppendLimit");
1072 EXPECT_EQ(appendLimit, 2ull);
1073}
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +01001074
1075TEST_F(TestReportInitialization, appendLimitSetToUintMaxIsStoredCorrectly)
1076{
Krzysztof Grobelnye6c417c2022-02-02 17:25:53 +01001077 sut = makeReport(
1078 ReportParams().appendLimit(std::numeric_limits<uint64_t>::max()));
1079
1080 ASSERT_THAT(storedConfiguration.at("AppendLimit"),
1081 Eq(std::numeric_limits<uint64_t>::max()));
1082}
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +01001083
1084TEST_F(TestReportInitialization, triggerIdsPropertyIsInitialzed)
1085{
Krzysztof Grobelnye6d48872022-02-08 13:41:30 +01001086 for (const auto& triggerId : {"trigger1", "trigger2"})
1087 {
1088 messanger.on_receive<messages::CollectTriggerIdReq>(
1089 [&](const auto& msg) {
1090 messanger.send(messages::CollectTriggerIdResp{triggerId});
1091 });
1092 }
1093
1094 sut = makeReport(ReportParams());
Szymon Dompkeb4ef22e2022-02-07 15:15:12 +01001095
1096 EXPECT_THAT(
1097 getProperty<std::vector<std::string>>(sut->getPath(), "TriggerIds"),
1098 UnorderedElementsAre("trigger1", "trigger2"));
1099}
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001100
Krzysztof Grobelny493e62e2022-02-14 10:55:50 +01001101TEST_F(TestReportInitialization,
1102 metricValuesAreNotStoredForReportUpdatesDifferentThanAppendStopsWhenFull)
1103{
1104 sut = makeReport(ReportParams()
1105 .reportingType(ReportingType::periodic)
1106 .interval(1h)
1107 .reportUpdates(ReportUpdates::appendWrapsWhenFull)
1108 .readings(Readings{{}, {{}}}));
1109
1110 ASSERT_THAT(storedConfiguration.find("MetricValues"),
1111 Eq(storedConfiguration.end()));
1112}
1113
1114TEST_F(TestReportInitialization, metricValuesAreNotStoredForOnRequestReport)
1115{
1116 sut = makeReport(ReportParams()
1117 .reportingType(ReportingType::onRequest)
1118 .reportUpdates(ReportUpdates::appendStopsWhenFull)
1119 .readings(Readings{{}, {{}}}));
1120
1121 ASSERT_THAT(storedConfiguration.find("MetricValues"),
1122 Eq(storedConfiguration.end()));
1123}
1124
1125TEST_F(TestReportInitialization,
1126 metricValuesAreStoredForNonOnRequestReportWithAppendStopsWhenFull)
1127{
1128 const auto readings = Readings{{}, {{}}};
1129
1130 sut = makeReport(ReportParams()
1131 .reportingType(ReportingType::periodic)
1132 .interval(1h)
1133 .reportUpdates(ReportUpdates::appendStopsWhenFull)
1134 .readings(readings));
1135
1136 ASSERT_THAT(storedConfiguration.at("MetricValues").get<LabeledReadings>(),
1137 Eq(utils::toLabeledReadings(readings)));
1138}
1139
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +01001140class TestReportInitializationOnChangeReport : public TestReportInitialization
1141{
1142 public:
1143 void SetUp() override
1144 {
1145 initMetricMocks(params.metricParameters());
1146 }
1147
1148 ReportParams params = defaultOnChangeParams();
1149};
1150
1151TEST_F(TestReportInitializationOnChangeReport,
1152 doesntUpdateReadingsWhenNotRequired)
1153{
1154 EXPECT_CALL(*metricMocks[0], updateReadings(_)).Times(0);
1155
1156 ON_CALL(*metricMocks[0], isTimerRequired()).WillByDefault(Return(false));
1157
1158 sut = makeReport(params);
1159
1160 DbusEnvironment::sleepFor(500ms);
1161}
1162
1163TEST_F(TestReportInitializationOnChangeReport, updatesReadingsWhenRequired)
1164{
1165 EXPECT_CALL(*metricMocks[0], updateReadings(_))
1166 .WillOnce(Return())
1167 .WillOnce(
1168 InvokeWithoutArgs(DbusEnvironment::setPromise("readingsUpdated")))
1169 .WillRepeatedly(Return());
1170
1171 ON_CALL(*metricMocks[0], isTimerRequired()).WillByDefault(Return(true));
1172
1173 sut = makeReport(params);
1174
1175 DbusEnvironment::waitForFuture("readingsUpdated");
1176}