blob: bee64c70132938560024eacaef70947fd3c27d78 [file] [log] [blame]
James Feist75eb7692019-02-25 12:50:02 -08001#include "conf.hpp"
Patrick Venture0ef1faf2018-06-13 12:50:53 -07002#include "dbus/dbuspassive.hpp"
James Zheng6df8bb52024-11-27 23:38:47 +00003#include "failsafeloggers/builder.hpp"
4#include "failsafeloggers/failsafe_logger.hpp"
5#include "failsafeloggers/failsafe_logger_utility.hpp"
Patrick Ventureda4a5dd2018-08-31 09:42:48 -07006#include "test/dbushelper_mock.hpp"
Patrick Venture0ef1faf2018-06-13 12:50:53 -07007
Patrick Venture0ef1faf2018-06-13 12:50:53 -07008#include <sdbusplus/test/sdbus_mock.hpp>
Patrick Venturea83a3ec2020-08-04 09:52:05 -07009
10#include <functional>
Patrick Venture8729eb92020-08-10 10:38:44 -070011#include <memory>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070012#include <string>
James Feist1f802f52019-02-08 13:51:43 -080013#include <variant>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070014
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070015#include <gmock/gmock.h>
16#include <gtest/gtest.h>
Patrick Venture0ef1faf2018-06-13 12:50:53 -070017
Patrick Venturea0764872020-08-08 07:48:43 -070018namespace pid_control
19{
20namespace
21{
22
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070023using ::testing::_;
Patrick Venture0ef1faf2018-06-13 12:50:53 -070024using ::testing::InSequence;
25using ::testing::Invoke;
26using ::testing::IsNull;
27using ::testing::NotNull;
28using ::testing::Return;
29using ::testing::StrEq;
Patrick Venture0ef1faf2018-06-13 12:50:53 -070030
31std::string SensorIntf = "xyz.openbmc_project.Sensor.Value";
32
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070033TEST(DbusPassiveTest, FactoryFailsWithInvalidType)
34{
Patrick Venture0ef1faf2018-06-13 12:50:53 -070035 // Verify the type is checked by the factory.
36
37 sdbusplus::SdBusMock sdbus_mock;
38 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
39 std::string type = "invalid";
40 std::string id = "id";
41
Patrick Venture8729eb92020-08-10 10:38:44 -070042 auto helper = std::make_unique<DbusHelperMock>();
James Feistf81f2882019-02-26 11:26:36 -080043 auto info = conf::SensorConfig();
Patrick Venture0ef1faf2018-06-13 12:50:53 -070044
James Feist98b704e2019-06-03 16:24:53 -070045 std::unique_ptr<ReadInterface> ri = DbusPassive::createDbusPassive(
Patrick Venture8729eb92020-08-10 10:38:44 -070046 bus_mock, type, id, std::move(helper), &info, nullptr);
Patrick Venture0ef1faf2018-06-13 12:50:53 -070047
48 EXPECT_EQ(ri, nullptr);
49}
50
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070051TEST(DbusPassiveTest, BoringConstructorTest)
52{
Patrick Venturef8cb4642018-10-30 12:02:53 -070053 // Simply build the object, does no error checking.
Patrick Venture0ef1faf2018-06-13 12:50:53 -070054
55 sdbusplus::SdBusMock sdbus_mock;
56 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
57 std::string type = "invalid";
58 std::string id = "id";
59 std::string path = "/xyz/openbmc_project/sensors/unknown/id";
60
Patrick Venture8729eb92020-08-10 10:38:44 -070061 auto helper = std::make_unique<DbusHelperMock>();
Patrick Venture1df9e872020-10-08 15:35:01 -070062 SensorProperties properties;
Patrick Venture0ef1faf2018-06-13 12:50:53 -070063
Patrick Venture8729eb92020-08-10 10:38:44 -070064 DbusPassive(bus_mock, type, id, std::move(helper), properties, false, path,
65 nullptr);
Patrick Venture0ef1faf2018-06-13 12:50:53 -070066 // Success
67}
68
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070069class DbusPassiveTestObj : public ::testing::Test
70{
71 protected:
72 DbusPassiveTestObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -060073 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Patrick Venture8729eb92020-08-10 10:38:44 -070074 helper(std::make_unique<DbusHelperMock>())
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070075 {
Patrick Venture9b936922020-08-10 11:28:39 -070076 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070077 .WillOnce(Return("asdf"));
Patrick Venture0ef1faf2018-06-13 12:50:53 -070078
Patrick Venture8729eb92020-08-10 10:38:44 -070079 EXPECT_CALL(*helper,
Patrick Venture9b936922020-08-10 11:28:39 -070080 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +080081 .WillOnce(Invoke([&]([[maybe_unused]] const std::string& service,
82 [[maybe_unused]] const std::string& path,
83 SensorProperties* prop) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -040084 prop->scale = _scale;
85 prop->value = _value;
86 prop->unit = "x";
87 prop->min = 0;
88 prop->max = 0;
89 prop->available = true;
90 }));
Patrick Venture9b936922020-08-10 11:28:39 -070091 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
James Feist36b7d8e2018-10-05 15:39:01 -070092 .WillOnce(Return(false));
Patrick Venture0ef1faf2018-06-13 12:50:53 -070093
James Feistf81f2882019-02-26 11:26:36 -080094 auto info = conf::SensorConfig();
Alex.Song8f73ad72021-10-07 00:18:27 +080095 info.unavailableAsFailed = true;
Patrick Venture8729eb92020-08-10 10:38:44 -070096 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
97 std::move(helper), &info, nullptr);
Patrick Venturee2ec0f62018-09-04 12:30:27 -070098 passive = reinterpret_cast<DbusPassive*>(ri.get());
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070099 EXPECT_FALSE(passive == nullptr);
100 }
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700101
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700102 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500103 sdbusplus::bus_t bus_mock;
Patrick Venture8729eb92020-08-10 10:38:44 -0700104 std::unique_ptr<DbusHelperMock> helper;
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700105 std::string type = "temp";
106 std::string id = "id";
107 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
108 int64_t _scale = -3;
109 int64_t _value = 10;
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700110
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700111 std::unique_ptr<ReadInterface> ri;
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700112 DbusPassive* passive;
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700113};
114
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700115TEST_F(DbusPassiveTestObj, ReadReturnsExpectedValues)
116{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700117 // Verify read is returning the values.
118 ReadReturn v;
119 v.value = 0.01;
120 // TODO: updated is set when the value is created, so we can range check
121 // it.
122 ReadReturn r = passive->read();
123 EXPECT_EQ(v.value, r.value);
124}
125
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700126TEST_F(DbusPassiveTestObj, SetValueUpdatesValue)
127{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700128 // Verify setvalue does as advertised.
129
130 double value = 0.01;
131 passive->setValue(value);
132
133 // TODO: updated is set when the value is set, so we can range check it.
134 ReadReturn r = passive->read();
135 EXPECT_EQ(value, r.value);
136}
137
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700138TEST_F(DbusPassiveTestObj, GetScaleReturnsExpectedValue)
139{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700140 // Verify the scale is returned as expected.
141 EXPECT_EQ(_scale, passive->getScale());
142}
143
Patrick Venture563a3562018-10-30 09:31:26 -0700144TEST_F(DbusPassiveTestObj, getIDReturnsExpectedValue)
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700145{
Patrick Venture563a3562018-10-30 09:31:26 -0700146 // Verify getID returns the expected value.
147 EXPECT_EQ(id, passive->getID());
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700148}
149
Patrick Venture6b9f5992019-09-10 09:18:28 -0700150TEST_F(DbusPassiveTestObj, GetMinValueReturnsExpectedValue)
151{
152 EXPECT_DOUBLE_EQ(0, passive->getMin());
153}
154
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700155TEST_F(DbusPassiveTestObj, VerifyHandlesDbusSignal)
156{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700157 // The dbus passive sensor listens for updates and if it's the Value
158 // property, it needs to handle it.
159
160 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
161 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500162 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700163
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700164 const char* Value = "Value";
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700165 int64_t xValue = 10000;
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700166 const char* intf = "xyz.openbmc_project.Sensor.Value";
James Feist1f802f52019-02-08 13:51:43 -0800167 // string, std::map<std::string, std::variant<int64_t>>
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700168 // msg.read(msgSensor, msgData);
169
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700170 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800171 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
172 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400173 const char** s = static_cast<const char**>(p);
174 // Read the first parameter, the string.
175 *s = intf;
176 return 0;
177 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800178 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
179 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400180 const char** s = static_cast<const char**>(p);
181 *s = Value;
182 // Read the string in the pair (dictionary).
183 return 0;
184 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700185
186 // std::map
187 EXPECT_CALL(sdbus_mock,
188 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
189 .WillOnce(Return(0));
190
191 // while !at_end()
192 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
193 .WillOnce(Return(0))
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700194 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700195
196 // std::pair
197 EXPECT_CALL(sdbus_mock,
198 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
199 .WillOnce(Return(0));
200
201 EXPECT_CALL(sdbus_mock,
202 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
203 .WillOnce(Return(1));
204 EXPECT_CALL(sdbus_mock,
205 sd_bus_message_enter_container(IsNull(), 'v', StrEq("x")))
206 .WillOnce(Return(0));
207
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700208 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'x', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800209 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
210 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400211 int64_t* s = static_cast<int64_t*>(p);
212 *s = xValue;
213 return 0;
214 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700215
216 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
217 .WillOnce(Return(0)) /* variant. */
218 .WillOnce(Return(0)) /* std::pair */
219 .WillOnce(Return(0)); /* std::map */
220
Patrick Venture7af157b2018-10-30 11:24:40 -0700221 int rv = handleSensorValue(msg, passive);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700222 EXPECT_EQ(rv, 0); // It's always 0.
223
224 ReadReturn r = passive->read();
225 EXPECT_EQ(10, r.value);
226}
227
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700228TEST_F(DbusPassiveTestObj, VerifyIgnoresOtherPropertySignal)
229{
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700230 // The dbus passive sensor listens for updates and if it's the Value
231 // property, it needs to handle it. In this case, it won't be.
232
233 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
234 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500235 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700236
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700237 const char* Scale = "Scale";
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700238 int64_t xScale = -6;
Patrick Venturee2ec0f62018-09-04 12:30:27 -0700239 const char* intf = "xyz.openbmc_project.Sensor.Value";
James Feist1f802f52019-02-08 13:51:43 -0800240 // string, std::map<std::string, std::variant<int64_t>>
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700241 // msg.read(msgSensor, msgData);
242
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700243 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800244 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
245 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400246 const char** s = static_cast<const char**>(p);
247 // Read the first parameter, the string.
248 *s = intf;
249 return 0;
250 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800251 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
252 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400253 const char** s = static_cast<const char**>(p);
254 *s = Scale;
255 // Read the string in the pair (dictionary).
256 return 0;
257 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700258
259 // std::map
260 EXPECT_CALL(sdbus_mock,
261 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
262 .WillOnce(Return(0));
263
264 // while !at_end()
265 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
266 .WillOnce(Return(0))
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700267 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700268
269 // std::pair
270 EXPECT_CALL(sdbus_mock,
271 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
272 .WillOnce(Return(0));
273
274 EXPECT_CALL(sdbus_mock,
275 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
276 .WillOnce(Return(1));
277 EXPECT_CALL(sdbus_mock,
278 sd_bus_message_enter_container(IsNull(), 'v', StrEq("x")))
279 .WillOnce(Return(0));
280
Patrick Ventureda4a5dd2018-08-31 09:42:48 -0700281 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'x', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800282 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
283 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400284 int64_t* s = static_cast<int64_t*>(p);
285 *s = xScale;
286 return 0;
287 }));
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700288
289 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
290 .WillOnce(Return(0)) /* variant. */
291 .WillOnce(Return(0)) /* std::pair */
292 .WillOnce(Return(0)); /* std::map */
293
Patrick Venture7af157b2018-10-30 11:24:40 -0700294 int rv = handleSensorValue(msg, passive);
Patrick Venture0ef1faf2018-06-13 12:50:53 -0700295 EXPECT_EQ(rv, 0); // It's always 0.
296
297 ReadReturn r = passive->read();
298 EXPECT_EQ(0.01, r.value);
299}
Alex.Song8f73ad72021-10-07 00:18:27 +0800300
James Feist36b7d8e2018-10-05 15:39:01 -0700301TEST_F(DbusPassiveTestObj, VerifyCriticalThresholdAssert)
302{
James Feist36b7d8e2018-10-05 15:39:01 -0700303 // Verifies when a threshold is crossed the sensor goes into error state
304 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
305 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500306 sdbusplus::message_t msg(nullptr, &sdbus_mock);
James Feist36b7d8e2018-10-05 15:39:01 -0700307
308 const char* criticalAlarm = "CriticalAlarmHigh";
309 bool alarm = true;
310 const char* intf = "xyz.openbmc_project.Sensor.Threshold.Critical";
311
312 passive->setFailed(false);
313
314 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800315 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
316 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400317 const char** s = static_cast<const char**>(p);
318 // Read the first parameter, the string.
319 *s = intf;
320 return 0;
321 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800322 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
323 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400324 const char** s = static_cast<const char**>(p);
325 *s = criticalAlarm;
326 // Read the string in the pair (dictionary).
327 return 0;
328 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700329
330 // std::map
331 EXPECT_CALL(sdbus_mock,
332 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
333 .WillOnce(Return(0));
334
335 // while !at_end()
336 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
337 .WillOnce(Return(0))
338 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
339
340 // std::pair
341 EXPECT_CALL(sdbus_mock,
342 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
343 .WillOnce(Return(0));
344
345 EXPECT_CALL(sdbus_mock,
346 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
347 .WillOnce(Return(0));
348 EXPECT_CALL(sdbus_mock,
349 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
350 .WillOnce(Return(0));
351 EXPECT_CALL(sdbus_mock,
352 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
353 .WillOnce(Return(1));
354 EXPECT_CALL(sdbus_mock,
355 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
356 .WillOnce(Return(0));
357
358 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800359 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
360 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400361 bool* s = static_cast<bool*>(p);
362 *s = alarm;
363 return 0;
364 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700365
366 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
367 .WillOnce(Return(0)) /* variant. */
368 .WillOnce(Return(0)) /* std::pair */
369 .WillOnce(Return(0)); /* std::map */
370
Patrick Venture7af157b2018-10-30 11:24:40 -0700371 int rv = handleSensorValue(msg, passive);
James Feist36b7d8e2018-10-05 15:39:01 -0700372 EXPECT_EQ(rv, 0); // It's always 0.
373 bool failed = passive->getFailed();
374 EXPECT_EQ(failed, true);
375}
376
377TEST_F(DbusPassiveTestObj, VerifyCriticalThresholdDeassert)
378{
James Feist36b7d8e2018-10-05 15:39:01 -0700379 // Verifies when a threshold is deasserted a failed sensor goes back into
380 // the normal state
381 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
382 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500383 sdbusplus::message_t msg(nullptr, &sdbus_mock);
James Feist36b7d8e2018-10-05 15:39:01 -0700384
385 const char* criticalAlarm = "CriticalAlarmHigh";
386 bool alarm = false;
387 const char* intf = "xyz.openbmc_project.Sensor.Threshold.Critical";
388
389 passive->setFailed(true);
390
391 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800392 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
393 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400394 const char** s = static_cast<const char**>(p);
395 // Read the first parameter, the string.
396 *s = intf;
397 return 0;
398 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800399 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
400 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400401 const char** s = static_cast<const char**>(p);
402 *s = criticalAlarm;
403 // Read the string in the pair (dictionary).
404 return 0;
405 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700406
407 // std::map
408 EXPECT_CALL(sdbus_mock,
409 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
410 .WillOnce(Return(0));
411
412 // while !at_end()
413 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
414 .WillOnce(Return(0))
415 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
416
417 // std::pair
418 EXPECT_CALL(sdbus_mock,
419 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
420 .WillOnce(Return(0));
421
422 EXPECT_CALL(sdbus_mock,
423 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
424 .WillOnce(Return(0));
425 EXPECT_CALL(sdbus_mock,
426 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
427 .WillOnce(Return(0));
428 EXPECT_CALL(sdbus_mock,
429 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
430 .WillOnce(Return(1));
431 EXPECT_CALL(sdbus_mock,
432 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
433 .WillOnce(Return(0));
434
435 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800436 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
437 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400438 bool* s = static_cast<bool*>(p);
439 *s = alarm;
440 return 0;
441 }));
James Feist36b7d8e2018-10-05 15:39:01 -0700442
443 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
444 .WillOnce(Return(0)) /* variant. */
445 .WillOnce(Return(0)) /* std::pair */
446 .WillOnce(Return(0)); /* std::map */
447
Patrick Venture7af157b2018-10-30 11:24:40 -0700448 int rv = handleSensorValue(msg, passive);
James Feist36b7d8e2018-10-05 15:39:01 -0700449 EXPECT_EQ(rv, 0); // It's always 0.
450 bool failed = passive->getFailed();
451 EXPECT_EQ(failed, false);
Patrick Venture563a3562018-10-30 09:31:26 -0700452}
Patrick Venture6b9f5992019-09-10 09:18:28 -0700453
Alex.Song8f73ad72021-10-07 00:18:27 +0800454TEST_F(DbusPassiveTestObj, VerifyAvailableDeassert)
455{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530456 // Verifies when Available is deasserted && unavailableAsFailed == true,
Alex.Song8f73ad72021-10-07 00:18:27 +0800457 // the sensor goes into error state
458 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
459 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500460 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800461
462 const char* property = "Available";
463 bool asserted = false;
464 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
465
466 passive->setAvailable(true);
467
468 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800469 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
470 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400471 const char** s = static_cast<const char**>(p);
472 // Read the first parameter, the string.
473 *s = intf;
474 return 0;
475 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800476 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
477 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400478 const char** s = static_cast<const char**>(p);
479 *s = property;
480 // Read the string in the pair (dictionary).
481 return 0;
482 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800483
484 // std::map
485 EXPECT_CALL(sdbus_mock,
486 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
487 .WillOnce(Return(0));
488
489 // while !at_end()
490 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
491 .WillOnce(Return(0))
492 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
493
494 // std::pair
495 EXPECT_CALL(sdbus_mock,
496 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
497 .WillOnce(Return(0));
498
499 EXPECT_CALL(sdbus_mock,
500 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
501 .WillOnce(Return(0));
502 EXPECT_CALL(sdbus_mock,
503 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
504 .WillOnce(Return(0));
505 EXPECT_CALL(sdbus_mock,
506 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
507 .WillOnce(Return(1));
508 EXPECT_CALL(sdbus_mock,
509 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
510 .WillOnce(Return(0));
511
512 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800513 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
514 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400515 bool* s = static_cast<bool*>(p);
516 *s = asserted;
517 return 0;
518 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800519
520 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
521 .WillOnce(Return(0)) /* variant. */
522 .WillOnce(Return(0)) /* std::pair */
523 .WillOnce(Return(0)); /* std::map */
524
525 int rv = handleSensorValue(msg, passive);
526 EXPECT_EQ(rv, 0); // It's always 0.
527 bool failed = passive->getFailed();
528 EXPECT_EQ(failed, true);
529}
530
531TEST_F(DbusPassiveTestObj, VerifyAvailableAssert)
532{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530533 // Verifies when Available is asserted && unavailableAsFailed == true,
Alex.Song8f73ad72021-10-07 00:18:27 +0800534 // an error sensor goes back to normal state
535 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
536 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500537 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800538
539 const char* property = "Available";
540 bool asserted = true;
541 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
542
543 passive->setAvailable(false);
544 bool failed = passive->getFailed();
545 EXPECT_EQ(failed, true);
546
547 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800548 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
549 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400550 const char** s = static_cast<const char**>(p);
551 // Read the first parameter, the string.
552 *s = intf;
553 return 0;
554 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800555 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
556 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400557 const char** s = static_cast<const char**>(p);
558 *s = property;
559 // Read the string in the pair (dictionary).
560 return 0;
561 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800562
563 // std::map
564 EXPECT_CALL(sdbus_mock,
565 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
566 .WillOnce(Return(0));
567
568 // while !at_end()
569 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
570 .WillOnce(Return(0))
571 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
572
573 // std::pair
574 EXPECT_CALL(sdbus_mock,
575 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
576 .WillOnce(Return(0));
577
578 EXPECT_CALL(sdbus_mock,
579 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
580 .WillOnce(Return(0));
581 EXPECT_CALL(sdbus_mock,
582 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
583 .WillOnce(Return(0));
584 EXPECT_CALL(sdbus_mock,
585 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
586 .WillOnce(Return(1));
587 EXPECT_CALL(sdbus_mock,
588 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
589 .WillOnce(Return(0));
590
591 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800592 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
593 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400594 bool* s = static_cast<bool*>(p);
595 *s = asserted;
596 return 0;
597 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800598
599 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
600 .WillOnce(Return(0)) /* variant. */
601 .WillOnce(Return(0)) /* std::pair */
602 .WillOnce(Return(0)); /* std::map */
603
604 int rv = handleSensorValue(msg, passive);
605 EXPECT_EQ(rv, 0); // It's always 0.
606 failed = passive->getFailed();
607 EXPECT_EQ(failed, false);
608}
609
610class DbusPassiveTestUnaSensorNotAsFailedObj : public ::testing::Test
611{
612 protected:
613 DbusPassiveTestUnaSensorNotAsFailedObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -0600614 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Alex.Song8f73ad72021-10-07 00:18:27 +0800615 helper(std::make_unique<DbusHelperMock>())
616 {
617 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
618 .WillOnce(Return("asdf"));
619
620 EXPECT_CALL(*helper,
621 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800622 .WillOnce(Invoke([&]([[maybe_unused]] const std::string& service,
623 [[maybe_unused]] const std::string& path,
624 SensorProperties* prop) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400625 prop->scale = _scale;
626 prop->value = _value;
627 prop->unit = "x";
628 prop->min = 0;
629 prop->max = 0;
630 prop->available = true;
631 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800632 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
633 .WillOnce(Return(false));
634
635 auto info = conf::SensorConfig();
636 info.unavailableAsFailed = false;
637 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
638 std::move(helper), &info, nullptr);
639 passive = reinterpret_cast<DbusPassive*>(ri.get());
640 EXPECT_FALSE(passive == nullptr);
641 }
642
643 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500644 sdbusplus::bus_t bus_mock;
Alex.Song8f73ad72021-10-07 00:18:27 +0800645 std::unique_ptr<DbusHelperMock> helper;
646 std::string type = "temp";
647 std::string id = "id";
648 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
649 int64_t _scale = -3;
650 int64_t _value = 10;
651
652 std::unique_ptr<ReadInterface> ri;
653 DbusPassive* passive;
654};
655
656TEST_F(DbusPassiveTestUnaSensorNotAsFailedObj, VerifyAvailableDeassert)
657{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530658 // Verifies when Available is deasserted && unavailableAsFailed == false,
Alex.Song8f73ad72021-10-07 00:18:27 +0800659 // the sensor remains at OK state but reading goes to NaN.
660 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
661 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500662 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800663
664 const char* property = "Available";
665 bool asserted = false;
666 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
667
668 passive->setAvailable(true);
669
670 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800671 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
672 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400673 const char** s = static_cast<const char**>(p);
674 // Read the first parameter, the string.
675 *s = intf;
676 return 0;
677 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800678 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
679 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400680 const char** s = static_cast<const char**>(p);
681 *s = property;
682 // Read the string in the pair (dictionary).
683 return 0;
684 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800685
686 // std::map
687 EXPECT_CALL(sdbus_mock,
688 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
689 .WillOnce(Return(0));
690
691 // while !at_end()
692 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
693 .WillOnce(Return(0))
694 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
695
696 // std::pair
697 EXPECT_CALL(sdbus_mock,
698 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
699 .WillOnce(Return(0));
700
701 EXPECT_CALL(sdbus_mock,
702 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
703 .WillOnce(Return(0));
704 EXPECT_CALL(sdbus_mock,
705 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
706 .WillOnce(Return(0));
707 EXPECT_CALL(sdbus_mock,
708 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
709 .WillOnce(Return(1));
710 EXPECT_CALL(sdbus_mock,
711 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
712 .WillOnce(Return(0));
713
714 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800715 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
716 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400717 bool* s = static_cast<bool*>(p);
718 *s = asserted;
719 return 0;
720 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800721
722 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
723 .WillOnce(Return(0)) /* variant. */
724 .WillOnce(Return(0)) /* std::pair */
725 .WillOnce(Return(0)); /* std::map */
726
727 int rv = handleSensorValue(msg, passive);
728 EXPECT_EQ(rv, 0); // It's always 0.
729 bool failed = passive->getFailed();
730 EXPECT_EQ(failed, false);
731 ReadReturn r = passive->read();
732 EXPECT_FALSE(std::isfinite(r.value));
733}
734
735TEST_F(DbusPassiveTestUnaSensorNotAsFailedObj, VerifyAvailableAssert)
736{
Manojkiran Eda7ca88872024-06-17 11:55:48 +0530737 // Verifies when a sensor's state goes from unavailable to available
Alex.Song8f73ad72021-10-07 00:18:27 +0800738 // && unavailableAsFailed == false, this sensor remains at OK state.
739 EXPECT_CALL(sdbus_mock, sd_bus_message_ref(IsNull()))
740 .WillOnce(Return(nullptr));
Patrick Williamsb228bc32022-07-22 19:26:56 -0500741 sdbusplus::message_t msg(nullptr, &sdbus_mock);
Alex.Song8f73ad72021-10-07 00:18:27 +0800742
743 const char* property = "Available";
744 bool asserted = true;
745 const char* intf = "xyz.openbmc_project.State.Decorator.Availability";
746
747 passive->setAvailable(false);
748 bool failed = passive->getFailed();
749 EXPECT_EQ(failed, false);
750
751 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 's', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800752 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
753 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400754 const char** s = static_cast<const char**>(p);
755 // Read the first parameter, the string.
756 *s = intf;
757 return 0;
758 }))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800759 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
760 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400761 const char** s = static_cast<const char**>(p);
762 *s = property;
763 // Read the string in the pair (dictionary).
764 return 0;
765 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800766
767 // std::map
768 EXPECT_CALL(sdbus_mock,
769 sd_bus_message_enter_container(IsNull(), 'a', StrEq("{sv}")))
770 .WillOnce(Return(0));
771
772 // while !at_end()
773 EXPECT_CALL(sdbus_mock, sd_bus_message_at_end(IsNull(), 0))
774 .WillOnce(Return(0))
775 .WillOnce(Return(1)); // So it exits the loop after reading one pair.
776
777 // std::pair
778 EXPECT_CALL(sdbus_mock,
779 sd_bus_message_enter_container(IsNull(), 'e', StrEq("sv")))
780 .WillOnce(Return(0));
781
782 EXPECT_CALL(sdbus_mock,
783 sd_bus_message_verify_type(IsNull(), 'v', StrEq("x")))
784 .WillOnce(Return(0));
785 EXPECT_CALL(sdbus_mock,
786 sd_bus_message_verify_type(IsNull(), 'v', StrEq("d")))
787 .WillOnce(Return(0));
788 EXPECT_CALL(sdbus_mock,
789 sd_bus_message_verify_type(IsNull(), 'v', StrEq("b")))
790 .WillOnce(Return(1));
791 EXPECT_CALL(sdbus_mock,
792 sd_bus_message_enter_container(IsNull(), 'v', StrEq("b")))
793 .WillOnce(Return(0));
794
795 EXPECT_CALL(sdbus_mock, sd_bus_message_read_basic(IsNull(), 'b', NotNull()))
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800796 .WillOnce(Invoke([&]([[maybe_unused]] sd_bus_message* m,
797 [[maybe_unused]] char type, void* p) {
Patrick Williamsbd63bca2024-08-16 15:21:10 -0400798 bool* s = static_cast<bool*>(p);
799 *s = asserted;
800 return 0;
801 }));
Alex.Song8f73ad72021-10-07 00:18:27 +0800802
803 EXPECT_CALL(sdbus_mock, sd_bus_message_exit_container(IsNull()))
804 .WillOnce(Return(0)) /* variant. */
805 .WillOnce(Return(0)) /* std::pair */
806 .WillOnce(Return(0)); /* std::map */
807
808 int rv = handleSensorValue(msg, passive);
809 EXPECT_EQ(rv, 0); // It's always 0.
810 failed = passive->getFailed();
811 EXPECT_EQ(failed, false);
812}
813
Harvey.Wua1ae4fa2022-10-28 17:38:35 +0800814void GetPropertiesMax3k([[maybe_unused]] const std::string& service,
815 [[maybe_unused]] const std::string& path,
Patrick Venture9b936922020-08-10 11:28:39 -0700816 SensorProperties* prop)
Patrick Venture6b9f5992019-09-10 09:18:28 -0700817{
818 prop->scale = -3;
819 prop->value = 10;
820 prop->unit = "x";
821 prop->min = 0;
822 prop->max = 3000;
823}
824
Patrick Venture9b936922020-08-10 11:28:39 -0700825using GetPropertiesFunction = std::function<void(
826 const std::string&, const std::string&, SensorProperties*)>;
Patrick Venture6b9f5992019-09-10 09:18:28 -0700827
828// TODO: There is definitely a cleaner way to do this.
829class DbusPassiveTest3kMaxObj : public ::testing::Test
830{
831 protected:
832 DbusPassiveTest3kMaxObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -0600833 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Patrick Venture8729eb92020-08-10 10:38:44 -0700834 helper(std::make_unique<DbusHelperMock>())
Patrick Venture6b9f5992019-09-10 09:18:28 -0700835 {
Patrick Venture9b936922020-08-10 11:28:39 -0700836 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700837 .WillOnce(Return("asdf"));
838
Patrick Venture8729eb92020-08-10 10:38:44 -0700839 EXPECT_CALL(*helper,
Patrick Venture9b936922020-08-10 11:28:39 -0700840 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700841 .WillOnce(_getProps);
Patrick Venture9b936922020-08-10 11:28:39 -0700842 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700843 .WillOnce(Return(false));
844
845 auto info = conf::SensorConfig();
Patrick Venture8729eb92020-08-10 10:38:44 -0700846 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
847 std::move(helper), &info, nullptr);
Patrick Venture6b9f5992019-09-10 09:18:28 -0700848 passive = reinterpret_cast<DbusPassive*>(ri.get());
849 EXPECT_FALSE(passive == nullptr);
850 }
851
852 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500853 sdbusplus::bus_t bus_mock;
Patrick Venture8729eb92020-08-10 10:38:44 -0700854 std::unique_ptr<DbusHelperMock> helper;
Patrick Venture6b9f5992019-09-10 09:18:28 -0700855 std::string type = "temp";
856 std::string id = "id";
857 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
858 int64_t _scale = -3;
859 int64_t _value = 10;
860
861 std::unique_ptr<ReadInterface> ri;
862 DbusPassive* passive;
863 GetPropertiesFunction _getProps = &GetPropertiesMax3k;
864};
865
866TEST_F(DbusPassiveTest3kMaxObj, ReadMinAndMaxReturnsExpected)
867{
868 EXPECT_DOUBLE_EQ(0, passive->getMin());
869 EXPECT_DOUBLE_EQ(3, passive->getMax());
870}
871
872class DbusPassiveTest3kMaxIgnoredObj : public ::testing::Test
873{
874 protected:
875 DbusPassiveTest3kMaxIgnoredObj() :
Jayanth Othayoth2922eeb2024-12-08 07:47:37 -0600876 sdbus_mock(), bus_mock(sdbusplus::get_mocked_new(&sdbus_mock)),
Patrick Venture8729eb92020-08-10 10:38:44 -0700877 helper(std::make_unique<DbusHelperMock>())
Patrick Venture6b9f5992019-09-10 09:18:28 -0700878 {
Patrick Venture9b936922020-08-10 11:28:39 -0700879 EXPECT_CALL(*helper, getService(StrEq(SensorIntf), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700880 .WillOnce(Return("asdf"));
881
Patrick Venture8729eb92020-08-10 10:38:44 -0700882 EXPECT_CALL(*helper,
Patrick Venture9b936922020-08-10 11:28:39 -0700883 getProperties(StrEq("asdf"), StrEq(path), NotNull()))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700884 .WillOnce(_getProps);
Patrick Venture9b936922020-08-10 11:28:39 -0700885 EXPECT_CALL(*helper, thresholdsAsserted(StrEq("asdf"), StrEq(path)))
Patrick Venture6b9f5992019-09-10 09:18:28 -0700886 .WillOnce(Return(false));
887
888 auto info = conf::SensorConfig();
889 info.ignoreDbusMinMax = true;
Patrick Venture8729eb92020-08-10 10:38:44 -0700890 ri = DbusPassive::createDbusPassive(bus_mock, type, id,
891 std::move(helper), &info, nullptr);
Patrick Venture6b9f5992019-09-10 09:18:28 -0700892 passive = reinterpret_cast<DbusPassive*>(ri.get());
893 EXPECT_FALSE(passive == nullptr);
894 }
895
896 sdbusplus::SdBusMock sdbus_mock;
Patrick Williamsb228bc32022-07-22 19:26:56 -0500897 sdbusplus::bus_t bus_mock;
Patrick Venture8729eb92020-08-10 10:38:44 -0700898 std::unique_ptr<DbusHelperMock> helper;
Patrick Venture6b9f5992019-09-10 09:18:28 -0700899 std::string type = "temp";
900 std::string id = "id";
901 std::string path = "/xyz/openbmc_project/sensors/temperature/id";
902 int64_t _scale = -3;
903 int64_t _value = 10;
904
905 std::unique_ptr<ReadInterface> ri;
906 DbusPassive* passive;
907 GetPropertiesFunction _getProps = &GetPropertiesMax3k;
908};
909
910TEST_F(DbusPassiveTest3kMaxIgnoredObj, ReadMinAndMaxReturnsExpected)
911{
912 EXPECT_DOUBLE_EQ(0, passive->getMin());
913 EXPECT_DOUBLE_EQ(0, passive->getMax());
914}
Patrick Venturea0764872020-08-08 07:48:43 -0700915
916} // namespace
917} // namespace pid_control