1 #include "fan_pwm.hpp"
2 #include "hwmonio_mock.hpp"
3
4 #include <sdbusplus/test/sdbus_mock.hpp>
5
6 #include <string>
7
8 #include <gmock/gmock.h>
9 #include <gtest/gtest.h>
10
11 using ::testing::_;
12 using ::testing::IsNull;
13 using ::testing::NotNull;
14 using ::testing::Return;
15 using ::testing::StrEq;
16
17 static auto FanPwmIntf = "xyz.openbmc_project.Control.FanPwm";
18 static auto FanPwmProp = "Target";
19
20 // Handle basic expectations we'll need for all these tests, if it's found that
21 // this is helpful for more tests, it can be promoted in scope.
SetupDbusObject(sdbusplus::SdBusMock * sdbus_mock,const std::string & path,const std::string & intf,const std::string property="")22 void SetupDbusObject(sdbusplus::SdBusMock* sdbus_mock, const std::string& path,
23 const std::string& intf, const std::string property = "")
24 {
25 if (property.empty())
26 {
27 EXPECT_CALL(*sdbus_mock,
28 sd_bus_emit_properties_changed_strv(IsNull(), StrEq(path),
29 StrEq(intf), NotNull()))
30 .WillOnce(Return(0));
31 }
32 else
33 {
34 EXPECT_CALL(*sdbus_mock,
35 sd_bus_emit_properties_changed_strv(IsNull(), StrEq(path),
36 StrEq(intf), NotNull()))
37 .WillOnce(
38 [=](sd_bus*, const char*, const char*, const char** names) {
39 EXPECT_STREQ(property.c_str(), names[0]);
40 return 0;
41 });
42 }
43
44 return;
45 }
46
TEST(FanPwmTest,BasicConstructorDeferredTest)47 TEST(FanPwmTest, BasicConstructorDeferredTest)
48 {
49 // Attempt to just instantiate one.
50
51 // NOTE: This test's goal is to figure out what's minimally required to
52 // mock to instantiate this object.
53 sdbusplus::SdBusMock sdbus_mock;
54 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
55
56 std::string instancePath = "";
57 std::string devPath = "";
58 std::string id = "";
59 std::string objPath = "asdf";
60 bool defer = true;
61 uint64_t target = 0x01;
62
63 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock =
64 std::make_unique<hwmonio::HwmonIOMock>();
65
66 SetupDbusObject(&sdbus_mock, objPath, FanPwmIntf, FanPwmProp);
67
68 hwmon::FanPwm f(std::move(hwmonio_mock), devPath, id, bus_mock,
69 objPath.c_str(), defer, target);
70 }
71
TEST(FanPwmTest,BasicConstructorNotDeferredTest)72 TEST(FanPwmTest, BasicConstructorNotDeferredTest)
73 {
74 // Attempt to just instantiate one.
75
76 // NOTE: This test's goal is to figure out what's minimally required to
77 // mock to instantiate this object.
78 sdbusplus::SdBusMock sdbus_mock;
79 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
80
81 std::string instancePath = "";
82 std::string devPath = "";
83 std::string id = "";
84 std::string objPath = "asdf";
85 bool defer = false;
86 uint64_t target = 0x01;
87
88 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock =
89 std::make_unique<hwmonio::HwmonIOMock>();
90
91 SetupDbusObject(&sdbus_mock, objPath, FanPwmIntf, FanPwmProp);
92
93 EXPECT_CALL(sdbus_mock, sd_bus_emit_object_added(IsNull(), StrEq("asdf")))
94 .WillOnce(Return(0));
95
96 EXPECT_CALL(sdbus_mock, sd_bus_emit_object_removed(IsNull(), StrEq("asdf")))
97 .WillOnce(Return(0));
98
99 hwmon::FanPwm f(std::move(hwmonio_mock), devPath, id, bus_mock,
100 objPath.c_str(), defer, target);
101 }
102
TEST(FanPwmTest,WriteTargetValue)103 TEST(FanPwmTest, WriteTargetValue)
104 {
105 // Create a FanPwm and write a value to the object.
106
107 sdbusplus::SdBusMock sdbus_mock;
108 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
109
110 std::string instancePath = "";
111 std::string devPath = "devp";
112 std::string id = "the_id";
113 std::string objPath = "asdf";
114 bool defer = true;
115 uint64_t target = 0x01;
116
117 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock =
118 std::make_unique<hwmonio::HwmonIOMock>();
119
120 SetupDbusObject(&sdbus_mock, objPath, FanPwmIntf, FanPwmProp);
121
122 hwmonio::HwmonIOMock* hwmonio =
123 reinterpret_cast<hwmonio::HwmonIOMock*>(hwmonio_mock.get());
124
125 hwmon::FanPwm f(std::move(hwmonio_mock), devPath, id, bus_mock,
126 objPath.c_str(), defer, target);
127
128 target = 0x64;
129
130 EXPECT_CALL(*hwmonio,
131 write(static_cast<uint32_t>(target), StrEq("pwm"),
132 StrEq("the_id"), _, hwmonio::retries, hwmonio::delay));
133
134 EXPECT_CALL(sdbus_mock,
135 sd_bus_emit_properties_changed_strv(
136 IsNull(), StrEq("asdf"), StrEq(FanPwmIntf), NotNull()))
137 .WillOnce([&](sd_bus*, const char*, const char*, const char** names) {
138 EXPECT_EQ(0, strncmp("Target", names[0], 6));
139 return 0;
140 });
141
142 EXPECT_EQ(target, f.target(target));
143 }
144
TEST(FanPwmTest,WriteTargetValueNoUpdate)145 TEST(FanPwmTest, WriteTargetValueNoUpdate)
146 {
147 // Create a FanPwm and write a value to the object that was the previous
148 // value.
149
150 sdbusplus::SdBusMock sdbus_mock;
151 auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
152
153 std::string instancePath = "";
154 std::string devPath = "devp";
155 std::string id = "the_id";
156 std::string objPath = "asdf";
157 bool defer = true;
158 uint64_t target = 0x01;
159
160 std::unique_ptr<hwmonio::HwmonIOInterface> hwmonio_mock =
161 std::make_unique<hwmonio::HwmonIOMock>();
162
163 SetupDbusObject(&sdbus_mock, objPath, FanPwmIntf, FanPwmProp);
164
165 hwmon::FanPwm f(std::move(hwmonio_mock), devPath, id, bus_mock,
166 objPath.c_str(), defer, target);
167
168 EXPECT_EQ(target, f.target(target));
169 }
170