blob: c7e13462edd79979eef4e144fc1d6fbe9ca1fd17 [file] [log] [blame]
James Feist75eb7692019-02-25 12:50:02 -08001#include "conf.hpp"
Ed Tanousf8b6e552025-06-27 13:27:50 -07002#include "dbus/dbushelper_interface.hpp"
Patrick Venture0ef1faf2018-06-13 12:50:53 -07003#include "dbus/dbuspassive.hpp"
Ed Tanousf8b6e552025-06-27 13:27:50 -07004#include "interfaces.hpp"
Patrick Ventureda4a5dd2018-08-31 09:42:48 -07005#include "test/dbushelper_mock.hpp"
Patrick Venture0ef1faf2018-06-13 12:50:53 -07006
Ed Tanousf8b6e552025-06-27 13:27:50 -07007#include <systemd/sd-bus.h>
8
9#include <sdbusplus/bus.hpp>
10#include <sdbusplus/message.hpp>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070011#include <sdbusplus/test/sdbus_mock.hpp>
Patrick Venturea83a3ec2020-08-04 09:52:05 -070012
Ed Tanousf8b6e552025-06-27 13:27:50 -070013#include <cmath>
14#include <cstdint>
Patrick Venturea83a3ec2020-08-04 09:52:05 -070015#include <functional>
Patrick Venture8729eb92020-08-10 10:38:44 -070016#include <memory>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070017#include <string>
Ed Tanousf8b6e552025-06-27 13:27:50 -070018#include <utility>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070019
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070020#include <gmock/gmock.h>
21#include <gtest/gtest.h>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070022
Patrick Venturea0764872020-08-08 07:48:43 -070023namespace pid_control
24{
25namespace
26{
27
Patrick Venture0ef1faf2018-06-13 12:50:53 -070028using ::testing::Invoke;
29using ::testing::IsNull;
30using ::testing::NotNull;
31using ::testing::Return;
32using ::testing::StrEq;
Patrick Venture0ef1faf2018-06-13 12:50:53 -070033
34std::string SensorIntf = "xyz.openbmc_project.Sensor.Value";
35
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070036TEST(DbusPassiveTest, FactoryFailsWithInvalidType)
37{
Patrick Venture0ef1faf2018-06-13 12:50:53 -070038 // Verify the type is checked by the factory.
39
40 sdbusplus::SdBusMock sdbus_mock;
41 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
42 std::string type = "invalid";
43 std::string id = "id";
44
Patrick Venture8729eb92020-08-10 10:38:44 -070045 auto helper = std::make_unique<DbusHelperMock>();
James Feistf81f2882019-02-26 11:26:36 -080046 auto info = conf::SensorConfig();
Patrick Venture0ef1faf2018-06-13 12:50:53 -070047
James Feist98b704e2019-06-03 16:24:53 -070048 std::unique_ptr<ReadInterface> ri = DbusPassive::createDbusPassive(
Patrick Venture8729eb92020-08-10 10:38:44 -070049 bus_mock, type, id, std::move(helper), &info, nullptr);
Patrick Venture0ef1faf2018-06-13 12:50:53 -070050
51 EXPECT_EQ(ri, nullptr);
52}
53
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070054TEST(DbusPassiveTest, BoringConstructorTest)
55{
Patrick Venturef8cb4642018-10-30 12:02:53 -070056 // Simply build the object, does no error checking.
Patrick Venture0ef1faf2018-06-13 12:50:53 -070057
58 sdbusplus::SdBusMock sdbus_mock;
59 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
60 std::string type = "invalid";
61 std::string id = "id";
62 std::string path = "/xyz/openbmc_project/sensors/unknown/id";
63
Patrick Venture8729eb92020-08-10 10:38:44 -070064 auto helper = std::make_unique<DbusHelperMock>();
Patrick Venture1df9e872020-10-08 15:35:01 -070065 SensorProperties properties;
Patrick Venture0ef1faf2018-06-13 12:50:53 -070066
Patrick Venture8729eb92020-08-10 10:38:44 -070067 DbusPassive(bus_mock, type, id, std::move(helper), properties, false, path,
68 nullptr);
Patrick Venture0ef1faf2018-06-13 12:50:53 -070069 // Success
70}
71
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070072class DbusPassiveTestObj : public ::testing::Test
73{
74 protected:
75 DbusPassiveTestObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -060076 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Patrick Venture8729eb92020-08-10 10:38:44 -070077 helper(std::make_unique<DbusHelperMock>())
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070078 {
Patrick Venture9b936922020-08-10 11:28:39 -070079 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070080 .WillOnce(Return("asdf"));
Patrick Venture0ef1faf2018-06-13 12:50:53 -070081
Patrick Venture8729eb92020-08-10 10:38:44 -070082 EXPECT_CALL(*helper,
Patrick Venture9b936922020-08-10 11:28:39 -070083 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +080084 .WillOnce(Invoke([&]([[maybe_unused]] const std::string& service,
85 [[maybe_unused]] const std::string& path,
86 SensorProperties* prop) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -040087 prop->scale = _scale;
88 prop->value = _value;
89 prop->unit = "x";
90 prop->min = 0;
91 prop->max = 0;
92 prop->available = true;
93 }));
Patrick Venture9b936922020-08-10 11:28:39 -070094 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
James Feist36b7d8e2018-10-05 15:39:01 -070095 .WillOnce(Return(false));
Patrick Venture0ef1faf2018-06-13 12:50:53 -070096
James Feistf81f2882019-02-26 11:26:36 -080097 auto info = conf::SensorConfig();
Alex.Song8f73ad72021-10-07 00:18:27 +080098 info.unavailableAsFailed = true;
Patrick Venture8729eb92020-08-10 10:38:44 -070099 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
100 std::move(helper), &info, nullptr);
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700101 passive = reinterpret_cast<DbusPassive*>(ri.get());
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700102 EXPECT_FALSE(passive == nullptr);
103 }
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700104
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700105 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500106 sdbusplus::bus_t bus_mock;
Patrick Venture8729eb92020-08-10 10:38:44 -0700107 std::unique_ptr<DbusHelperMock> helper;
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700108 std::string type = "temp";
109 std::string id = "id";
110 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
111 int64_t _scale = -3;
112 int64_t _value = 10;
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700113
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700114 std::unique_ptr<ReadInterface> ri;
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700115 DbusPassive* passive;
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700116};
117
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700118TEST_F(DbusPassiveTestObj, ReadReturnsExpectedValues)
119{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700120 // Verify read is returning the values.
121 ReadReturn v;
122 v.value = 0.01;
123 // TODO: updated is set when the value is created, so we can range check
124 // it.
125 ReadReturn r = passive->read();
126 EXPECT_EQ(v.value, r.value);
127}
128
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700129TEST_F(DbusPassiveTestObj, SetValueUpdatesValue)
130{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700131 // Verify setvalue does as advertised.
132
133 double value = 0.01;
134 passive->setValue(value);
135
136 // TODO: updated is set when the value is set, so we can range check it.
137 ReadReturn r = passive->read();
138 EXPECT_EQ(value, r.value);
139}
140
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700141TEST_F(DbusPassiveTestObj, GetScaleReturnsExpectedValue)
142{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700143 // Verify the scale is returned as expected.
144 EXPECT_EQ(_scale, passive->getScale());
145}
146
Patrick Venture563a3562018-10-30 09:31:26 -0700147TEST_F(DbusPassiveTestObj, getIDReturnsExpectedValue)
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700148{
Patrick Venture563a3562018-10-30 09:31:26 -0700149 // Verify getID returns the expected value.
150 EXPECT_EQ(id, passive->getID());
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700151}
152
Patrick Venture6b9f5992019-09-10 09:18:28 -0700153TEST_F(DbusPassiveTestObj, GetMinValueReturnsExpectedValue)
154{
155 EXPECT_DOUBLE_EQ(0, passive->getMin());
156}
157
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700158TEST_F(DbusPassiveTestObj, VerifyHandlesDbusSignal)
159{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700160 // The dbus passive sensor listens for updates and if it's the Value
161 // property, it needs to handle it.
162
163 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
164 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500165 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700166
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700167 const char* Value = "Value";
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700168 int64_t xValue = 10000;
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700169 const char* intf = "xyz.openbmc_project.Sensor.Value";
James Feist1f802f52019-02-08 13:51:43 -0800170 // string, std::map<std::string, std::variant<int64_t>>
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700171 // msg.read(msgSensor, msgData);
172
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700173 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800174 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
175 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400176 const char** s = static_cast<const char**>(p);
177 // Read the first parameter, the string.
178 *s = intf;
179 return 0;
180 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800181 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
182 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400183 const char** s = static_cast<const char**>(p);
184 *s = Value;
185 // Read the string in the pair (dictionary).
186 return 0;
187 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700188
189 // std::map
190 EXPECT_CALL(sdbus_mock,
191 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
192 .WillOnce(Return(0));
193
194 // while !at_end()
195 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
196 .WillOnce(Return(0))
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700197 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700198
199 // std::pair
200 EXPECT_CALL(sdbus_mock,
201 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
202 .WillOnce(Return(0));
203
204 EXPECT_CALL(sdbus_mock,
205 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
206 .WillOnce(Return(1));
207 EXPECT_CALL(sdbus_mock,
208 sd_bus_message_enter_container(IsNull(), 'v', StrEq("x")))
209 .WillOnce(Return(0));
210
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700211 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'x', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800212 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
213 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400214 int64_t* s = static_cast<int64_t*>(p);
215 *s = xValue;
216 return 0;
217 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700218
219 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
220 .WillOnce(Return(0)) /* variant. */
221 .WillOnce(Return(0)) /* std::pair */
222 .WillOnce(Return(0)); /* std::map */
223
Patrick Venture7af157b2018-10-30 11:24:40 -0700224 int rv = handleSensorValue(msg, passive);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700225 EXPECT_EQ(rv, 0); // It's always 0.
226
227 ReadReturn r = passive->read();
228 EXPECT_EQ(10, r.value);
229}
230
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700231TEST_F(DbusPassiveTestObj, VerifyIgnoresOtherPropertySignal)
232{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700233 // The dbus passive sensor listens for updates and if it's the Value
234 // property, it needs to handle it. In this case, it won't be.
235
236 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
237 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500238 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700239
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700240 const char* Scale = "Scale";
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700241 int64_t xScale = -6;
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700242 const char* intf = "xyz.openbmc_project.Sensor.Value";
James Feist1f802f52019-02-08 13:51:43 -0800243 // string, std::map<std::string, std::variant<int64_t>>
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700244 // msg.read(msgSensor, msgData);
245
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700246 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800247 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
248 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400249 const char** s = static_cast<const char**>(p);
250 // Read the first parameter, the string.
251 *s = intf;
252 return 0;
253 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800254 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
255 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400256 const char** s = static_cast<const char**>(p);
257 *s = Scale;
258 // Read the string in the pair (dictionary).
259 return 0;
260 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700261
262 // std::map
263 EXPECT_CALL(sdbus_mock,
264 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
265 .WillOnce(Return(0));
266
267 // while !at_end()
268 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
269 .WillOnce(Return(0))
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700270 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700271
272 // std::pair
273 EXPECT_CALL(sdbus_mock,
274 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
275 .WillOnce(Return(0));
276
277 EXPECT_CALL(sdbus_mock,
278 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
279 .WillOnce(Return(1));
280 EXPECT_CALL(sdbus_mock,
281 sd_bus_message_enter_container(IsNull(), 'v', StrEq("x")))
282 .WillOnce(Return(0));
283
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700284 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'x', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800285 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
286 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400287 int64_t* s = static_cast<int64_t*>(p);
288 *s = xScale;
289 return 0;
290 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700291
292 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
293 .WillOnce(Return(0)) /* variant. */
294 .WillOnce(Return(0)) /* std::pair */
295 .WillOnce(Return(0)); /* std::map */
296
Patrick Venture7af157b2018-10-30 11:24:40 -0700297 int rv = handleSensorValue(msg, passive);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700298 EXPECT_EQ(rv, 0); // It's always 0.
299
300 ReadReturn r = passive->read();
301 EXPECT_EQ(0.01, r.value);
302}
Alex.Song8f73ad72021-10-07 00:18:27 +0800303
James Feist36b7d8e2018-10-05 15:39:01 -0700304TEST_F(DbusPassiveTestObj, VerifyCriticalThresholdAssert)
305{
James Feist36b7d8e2018-10-05 15:39:01 -0700306 // Verifies when a threshold is crossed the sensor goes into error state
307 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
308 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500309 sdbusplus::message_t msg(nullptr, &sdbus_mock);
James Feist36b7d8e2018-10-05 15:39:01 -0700310
311 const char* criticalAlarm = "CriticalAlarmHigh";
312 bool alarm = true;
313 const char* intf = "xyz.openbmc_project.Sensor.Threshold.Critical";
314
315 passive->setFailed(false);
316
317 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800318 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
319 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400320 const char** s = static_cast<const char**>(p);
321 // Read the first parameter, the string.
322 *s = intf;
323 return 0;
324 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800325 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
326 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400327 const char** s = static_cast<const char**>(p);
328 *s = criticalAlarm;
329 // Read the string in the pair (dictionary).
330 return 0;
331 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700332
333 // std::map
334 EXPECT_CALL(sdbus_mock,
335 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
336 .WillOnce(Return(0));
337
338 // while !at_end()
339 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
340 .WillOnce(Return(0))
341 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
342
343 // std::pair
344 EXPECT_CALL(sdbus_mock,
345 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
346 .WillOnce(Return(0));
347
348 EXPECT_CALL(sdbus_mock,
349 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
350 .WillOnce(Return(0));
351 EXPECT_CALL(sdbus_mock,
352 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
353 .WillOnce(Return(0));
354 EXPECT_CALL(sdbus_mock,
355 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
356 .WillOnce(Return(1));
357 EXPECT_CALL(sdbus_mock,
358 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
359 .WillOnce(Return(0));
360
361 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800362 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
363 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400364 bool* s = static_cast<bool*>(p);
365 *s = alarm;
366 return 0;
367 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700368
369 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
370 .WillOnce(Return(0)) /* variant. */
371 .WillOnce(Return(0)) /* std::pair */
372 .WillOnce(Return(0)); /* std::map */
373
Patrick Venture7af157b2018-10-30 11:24:40 -0700374 int rv = handleSensorValue(msg, passive);
James Feist36b7d8e2018-10-05 15:39:01 -0700375 EXPECT_EQ(rv, 0); // It's always 0.
376 bool failed = passive->getFailed();
377 EXPECT_EQ(failed, true);
378}
379
380TEST_F(DbusPassiveTestObj, VerifyCriticalThresholdDeassert)
381{
James Feist36b7d8e2018-10-05 15:39:01 -0700382 // Verifies when a threshold is deasserted a failed sensor goes back into
383 // the normal state
384 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
385 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500386 sdbusplus::message_t msg(nullptr, &sdbus_mock);
James Feist36b7d8e2018-10-05 15:39:01 -0700387
388 const char* criticalAlarm = "CriticalAlarmHigh";
389 bool alarm = false;
390 const char* intf = "xyz.openbmc_project.Sensor.Threshold.Critical";
391
392 passive->setFailed(true);
393
394 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800395 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
396 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400397 const char** s = static_cast<const char**>(p);
398 // Read the first parameter, the string.
399 *s = intf;
400 return 0;
401 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800402 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
403 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400404 const char** s = static_cast<const char**>(p);
405 *s = criticalAlarm;
406 // Read the string in the pair (dictionary).
407 return 0;
408 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700409
410 // std::map
411 EXPECT_CALL(sdbus_mock,
412 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
413 .WillOnce(Return(0));
414
415 // while !at_end()
416 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
417 .WillOnce(Return(0))
418 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
419
420 // std::pair
421 EXPECT_CALL(sdbus_mock,
422 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
423 .WillOnce(Return(0));
424
425 EXPECT_CALL(sdbus_mock,
426 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
427 .WillOnce(Return(0));
428 EXPECT_CALL(sdbus_mock,
429 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
430 .WillOnce(Return(0));
431 EXPECT_CALL(sdbus_mock,
432 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
433 .WillOnce(Return(1));
434 EXPECT_CALL(sdbus_mock,
435 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
436 .WillOnce(Return(0));
437
438 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800439 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
440 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400441 bool* s = static_cast<bool*>(p);
442 *s = alarm;
443 return 0;
444 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700445
446 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
447 .WillOnce(Return(0)) /* variant. */
448 .WillOnce(Return(0)) /* std::pair */
449 .WillOnce(Return(0)); /* std::map */
450
Patrick Venture7af157b2018-10-30 11:24:40 -0700451 int rv = handleSensorValue(msg, passive);
James Feist36b7d8e2018-10-05 15:39:01 -0700452 EXPECT_EQ(rv, 0); // It's always 0.
453 bool failed = passive->getFailed();
454 EXPECT_EQ(failed, false);
Patrick Venture563a3562018-10-30 09:31:26 -0700455}
Patrick Venture6b9f5992019-09-10 09:18:28 -0700456
Alex.Song8f73ad72021-10-07 00:18:27 +0800457TEST_F(DbusPassiveTestObj, VerifyAvailableDeassert)
458{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530459 // Verifies when Available is deasserted && unavailableAsFailed == true,
Alex.Song8f73ad72021-10-07 00:18:27 +0800460 // the sensor goes into error state
461 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
462 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500463 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800464
465 const char* property = "Available";
466 bool asserted = false;
467 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
468
469 passive->setAvailable(true);
470
471 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800472 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
473 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400474 const char** s = static_cast<const char**>(p);
475 // Read the first parameter, the string.
476 *s = intf;
477 return 0;
478 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800479 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
480 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400481 const char** s = static_cast<const char**>(p);
482 *s = property;
483 // Read the string in the pair (dictionary).
484 return 0;
485 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800486
487 // std::map
488 EXPECT_CALL(sdbus_mock,
489 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
490 .WillOnce(Return(0));
491
492 // while !at_end()
493 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
494 .WillOnce(Return(0))
495 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
496
497 // std::pair
498 EXPECT_CALL(sdbus_mock,
499 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
500 .WillOnce(Return(0));
501
502 EXPECT_CALL(sdbus_mock,
503 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
504 .WillOnce(Return(0));
505 EXPECT_CALL(sdbus_mock,
506 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
507 .WillOnce(Return(0));
508 EXPECT_CALL(sdbus_mock,
509 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
510 .WillOnce(Return(1));
511 EXPECT_CALL(sdbus_mock,
512 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
513 .WillOnce(Return(0));
514
515 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800516 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
517 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400518 bool* s = static_cast<bool*>(p);
519 *s = asserted;
520 return 0;
521 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800522
523 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
524 .WillOnce(Return(0)) /* variant. */
525 .WillOnce(Return(0)) /* std::pair */
526 .WillOnce(Return(0)); /* std::map */
527
528 int rv = handleSensorValue(msg, passive);
529 EXPECT_EQ(rv, 0); // It's always 0.
530 bool failed = passive->getFailed();
531 EXPECT_EQ(failed, true);
532}
533
534TEST_F(DbusPassiveTestObj, VerifyAvailableAssert)
535{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530536 // Verifies when Available is asserted && unavailableAsFailed == true,
Alex.Song8f73ad72021-10-07 00:18:27 +0800537 // an error sensor goes back to normal state
538 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
539 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500540 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800541
542 const char* property = "Available";
543 bool asserted = true;
544 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
545
546 passive->setAvailable(false);
547 bool failed = passive->getFailed();
548 EXPECT_EQ(failed, true);
549
550 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800551 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
552 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400553 const char** s = static_cast<const char**>(p);
554 // Read the first parameter, the string.
555 *s = intf;
556 return 0;
557 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800558 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
559 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400560 const char** s = static_cast<const char**>(p);
561 *s = property;
562 // Read the string in the pair (dictionary).
563 return 0;
564 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800565
566 // std::map
567 EXPECT_CALL(sdbus_mock,
568 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
569 .WillOnce(Return(0));
570
571 // while !at_end()
572 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
573 .WillOnce(Return(0))
574 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
575
576 // std::pair
577 EXPECT_CALL(sdbus_mock,
578 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
579 .WillOnce(Return(0));
580
581 EXPECT_CALL(sdbus_mock,
582 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
583 .WillOnce(Return(0));
584 EXPECT_CALL(sdbus_mock,
585 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
586 .WillOnce(Return(0));
587 EXPECT_CALL(sdbus_mock,
588 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
589 .WillOnce(Return(1));
590 EXPECT_CALL(sdbus_mock,
591 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
592 .WillOnce(Return(0));
593
594 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800595 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
596 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400597 bool* s = static_cast<bool*>(p);
598 *s = asserted;
599 return 0;
600 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800601
602 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
603 .WillOnce(Return(0)) /* variant. */
604 .WillOnce(Return(0)) /* std::pair */
605 .WillOnce(Return(0)); /* std::map */
606
607 int rv = handleSensorValue(msg, passive);
608 EXPECT_EQ(rv, 0); // It's always 0.
609 failed = passive->getFailed();
610 EXPECT_EQ(failed, false);
611}
612
613class DbusPassiveTestUnaSensorNotAsFailedObj : public ::testing::Test
614{
615 protected:
616 DbusPassiveTestUnaSensorNotAsFailedObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -0600617 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Alex.Song8f73ad72021-10-07 00:18:27 +0800618 helper(std::make_unique<DbusHelperMock>())
619 {
620 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
621 .WillOnce(Return("asdf"));
622
623 EXPECT_CALL(*helper,
624 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800625 .WillOnce(Invoke([&]([[maybe_unused]] const std::string& service,
626 [[maybe_unused]] const std::string& path,
627 SensorProperties* prop) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400628 prop->scale = _scale;
629 prop->value = _value;
630 prop->unit = "x";
631 prop->min = 0;
632 prop->max = 0;
633 prop->available = true;
634 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800635 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
636 .WillOnce(Return(false));
637
638 auto info = conf::SensorConfig();
639 info.unavailableAsFailed = false;
640 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
641 std::move(helper), &info, nullptr);
642 passive = reinterpret_cast<DbusPassive*>(ri.get());
643 EXPECT_FALSE(passive == nullptr);
644 }
645
646 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500647 sdbusplus::bus_t bus_mock;
Alex.Song8f73ad72021-10-07 00:18:27 +0800648 std::unique_ptr<DbusHelperMock> helper;
649 std::string type = "temp";
650 std::string id = "id";
651 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
652 int64_t _scale = -3;
653 int64_t _value = 10;
654
655 std::unique_ptr<ReadInterface> ri;
656 DbusPassive* passive;
657};
658
659TEST_F(DbusPassiveTestUnaSensorNotAsFailedObj, VerifyAvailableDeassert)
660{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530661 // Verifies when Available is deasserted && unavailableAsFailed == false,
Alex.Song8f73ad72021-10-07 00:18:27 +0800662 // the sensor remains at OK state but reading goes to NaN.
663 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
664 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500665 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800666
667 const char* property = "Available";
668 bool asserted = false;
669 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
670
671 passive->setAvailable(true);
672
673 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800674 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
675 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400676 const char** s = static_cast<const char**>(p);
677 // Read the first parameter, the string.
678 *s = intf;
679 return 0;
680 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800681 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
682 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400683 const char** s = static_cast<const char**>(p);
684 *s = property;
685 // Read the string in the pair (dictionary).
686 return 0;
687 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800688
689 // std::map
690 EXPECT_CALL(sdbus_mock,
691 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
692 .WillOnce(Return(0));
693
694 // while !at_end()
695 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
696 .WillOnce(Return(0))
697 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
698
699 // std::pair
700 EXPECT_CALL(sdbus_mock,
701 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
702 .WillOnce(Return(0));
703
704 EXPECT_CALL(sdbus_mock,
705 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
706 .WillOnce(Return(0));
707 EXPECT_CALL(sdbus_mock,
708 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
709 .WillOnce(Return(0));
710 EXPECT_CALL(sdbus_mock,
711 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
712 .WillOnce(Return(1));
713 EXPECT_CALL(sdbus_mock,
714 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
715 .WillOnce(Return(0));
716
717 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800718 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
719 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400720 bool* s = static_cast<bool*>(p);
721 *s = asserted;
722 return 0;
723 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800724
725 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
726 .WillOnce(Return(0)) /* variant. */
727 .WillOnce(Return(0)) /* std::pair */
728 .WillOnce(Return(0)); /* std::map */
729
730 int rv = handleSensorValue(msg, passive);
731 EXPECT_EQ(rv, 0); // It's always 0.
732 bool failed = passive->getFailed();
733 EXPECT_EQ(failed, false);
734 ReadReturn r = passive->read();
735 EXPECT_FALSE(std::isfinite(r.value));
736}
737
738TEST_F(DbusPassiveTestUnaSensorNotAsFailedObj, VerifyAvailableAssert)
739{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530740 // Verifies when a sensor's state goes from unavailable to available
Alex.Song8f73ad72021-10-07 00:18:27 +0800741 // && unavailableAsFailed == false, this sensor remains at OK state.
742 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
743 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500744 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800745
746 const char* property = "Available";
747 bool asserted = true;
748 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
749
750 passive->setAvailable(false);
751 bool failed = passive->getFailed();
752 EXPECT_EQ(failed, false);
753
754 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800755 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
756 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400757 const char** s = static_cast<const char**>(p);
758 // Read the first parameter, the string.
759 *s = intf;
760 return 0;
761 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800762 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
763 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400764 const char** s = static_cast<const char**>(p);
765 *s = property;
766 // Read the string in the pair (dictionary).
767 return 0;
768 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800769
770 // std::map
771 EXPECT_CALL(sdbus_mock,
772 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
773 .WillOnce(Return(0));
774
775 // while !at_end()
776 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
777 .WillOnce(Return(0))
778 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
779
780 // std::pair
781 EXPECT_CALL(sdbus_mock,
782 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
783 .WillOnce(Return(0));
784
785 EXPECT_CALL(sdbus_mock,
786 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
787 .WillOnce(Return(0));
788 EXPECT_CALL(sdbus_mock,
789 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
790 .WillOnce(Return(0));
791 EXPECT_CALL(sdbus_mock,
792 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
793 .WillOnce(Return(1));
794 EXPECT_CALL(sdbus_mock,
795 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
796 .WillOnce(Return(0));
797
798 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800799 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
800 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400801 bool* s = static_cast<bool*>(p);
802 *s = asserted;
803 return 0;
804 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800805
806 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
807 .WillOnce(Return(0)) /* variant. */
808 .WillOnce(Return(0)) /* std::pair */
809 .WillOnce(Return(0)); /* std::map */
810
811 int rv = handleSensorValue(msg, passive);
812 EXPECT_EQ(rv, 0); // It's always 0.
813 failed = passive->getFailed();
814 EXPECT_EQ(failed, false);
815}
816
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800817void GetPropertiesMax3k([[maybe_unused]] const std::string& service,
818 [[maybe_unused]] const std::string& path,
Patrick Venture9b936922020-08-10 11:28:39 -0700819 SensorProperties* prop)
Patrick Venture6b9f5992019-09-10 09:18:28 -0700820{
821 prop->scale = -3;
822 prop->value = 10;
823 prop->unit = "x";
824 prop->min = 0;
825 prop->max = 3000;
826}
827
Patrick Venture9b936922020-08-10 11:28:39 -0700828using GetPropertiesFunction = std::function<void(
829 const std::string&, const std::string&, SensorProperties*)>;
Patrick Venture6b9f5992019-09-10 09:18:28 -0700830
831// TODO: There is definitely a cleaner way to do this.
832class DbusPassiveTest3kMaxObj : public ::testing::Test
833{
834 protected:
835 DbusPassiveTest3kMaxObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -0600836 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Patrick Venture8729eb92020-08-10 10:38:44 -0700837 helper(std::make_unique<DbusHelperMock>())
Patrick Venture6b9f5992019-09-10 09:18:28 -0700838 {
Patrick Venture9b936922020-08-10 11:28:39 -0700839 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700840 .WillOnce(Return("asdf"));
841
Patrick Venture8729eb92020-08-10 10:38:44 -0700842 EXPECT_CALL(*helper,
Patrick Venture9b936922020-08-10 11:28:39 -0700843 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700844 .WillOnce(_getProps);
Patrick Venture9b936922020-08-10 11:28:39 -0700845 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700846 .WillOnce(Return(false));
847
848 auto info = conf::SensorConfig();
Patrick Venture8729eb92020-08-10 10:38:44 -0700849 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
850 std::move(helper), &info, nullptr);
Patrick Venture6b9f5992019-09-10 09:18:28 -0700851 passive = reinterpret_cast<DbusPassive*>(ri.get());
852 EXPECT_FALSE(passive == nullptr);
853 }
854
855 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500856 sdbusplus::bus_t bus_mock;
Patrick Venture8729eb92020-08-10 10:38:44 -0700857 std::unique_ptr<DbusHelperMock> helper;
Patrick Venture6b9f5992019-09-10 09:18:28 -0700858 std::string type = "temp";
859 std::string id = "id";
860 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
861 int64_t _scale = -3;
862 int64_t _value = 10;
863
864 std::unique_ptr<ReadInterface> ri;
865 DbusPassive* passive;
866 GetPropertiesFunction _getProps = &GetPropertiesMax3k;
867};
868
869TEST_F(DbusPassiveTest3kMaxObj, ReadMinAndMaxReturnsExpected)
870{
871 EXPECT_DOUBLE_EQ(0, passive->getMin());
872 EXPECT_DOUBLE_EQ(3, passive->getMax());
873}
874
875class DbusPassiveTest3kMaxIgnoredObj : public ::testing::Test
876{
877 protected:
878 DbusPassiveTest3kMaxIgnoredObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -0600879 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Patrick Venture8729eb92020-08-10 10:38:44 -0700880 helper(std::make_unique<DbusHelperMock>())
Patrick Venture6b9f5992019-09-10 09:18:28 -0700881 {
Patrick Venture9b936922020-08-10 11:28:39 -0700882 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700883 .WillOnce(Return("asdf"));
884
Patrick Venture8729eb92020-08-10 10:38:44 -0700885 EXPECT_CALL(*helper,
Patrick Venture9b936922020-08-10 11:28:39 -0700886 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700887 .WillOnce(_getProps);
Patrick Venture9b936922020-08-10 11:28:39 -0700888 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700889 .WillOnce(Return(false));
890
891 auto info = conf::SensorConfig();
892 info.ignoreDbusMinMax = true;
Patrick Venture8729eb92020-08-10 10:38:44 -0700893 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
894 std::move(helper), &info, nullptr);
Patrick Venture6b9f5992019-09-10 09:18:28 -0700895 passive = reinterpret_cast<DbusPassive*>(ri.get());
896 EXPECT_FALSE(passive == nullptr);
897 }
898
899 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500900 sdbusplus::bus_t bus_mock;
Patrick Venture8729eb92020-08-10 10:38:44 -0700901 std::unique_ptr<DbusHelperMock> helper;
Patrick Venture6b9f5992019-09-10 09:18:28 -0700902 std::string type = "temp";
903 std::string id = "id";
904 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
905 int64_t _scale = -3;
906 int64_t _value = 10;
907
908 std::unique_ptr<ReadInterface> ri;
909 DbusPassive* passive;
910 GetPropertiesFunction _getProps = &GetPropertiesMax3k;
911};
912
913TEST_F(DbusPassiveTest3kMaxIgnoredObj, ReadMinAndMaxReturnsExpected)
914{
915 EXPECT_DOUBLE_EQ(0, passive->getMin());
916 EXPECT_DOUBLE_EQ(0, passive->getMax());
917}
Patrick Venturea0764872020-08-08 07:48:43 -0700918
919} // namespace
920} // namespace pid_control