xref: /openbmc/phosphor-hwmon/test/fanpwm_unittest.cpp (revision 3e6ca8b054242ad789e0ca34509b05f583a0515f)
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