blob: d83ab666f7aa2242bd5051ccd44b690240552188 [file] [log] [blame]
Andrew Jefferya607a0d2018-05-23 16:15:26 +09301#include "physical.hpp"
2
Andrew Jeffery280afaf2018-05-24 16:15:46 +09303#include <sys/param.h>
4
Andrew Jefferya607a0d2018-05-23 16:15:26 +09305#include <sdbusplus/bus.hpp>
6
Andrew Jeffery280afaf2018-05-24 16:15:46 +09307#include <gmock/gmock.h>
Andrew Jefferya607a0d2018-05-23 16:15:26 +09308#include <gtest/gtest.h>
9
10constexpr auto LED_OBJ = "/foo/bar/led";
Andrew Jefferya607a0d2018-05-23 16:15:26 +093011
12using Action = sdbusplus::xyz::openbmc_project::Led::server::Physical::Action;
George Liu45eba6f2021-05-18 14:32:20 +080013namespace fs = std::filesystem;
Andrew Jefferya607a0d2018-05-23 16:15:26 +093014
Andrew Jeffery280afaf2018-05-24 16:15:46 +093015fs::path create_sandbox()
16{
17 /* If your tests need to touch the filesystem, always use mkdtemp() or
18 * mkstemp() for creating directories and files. Tests can be run in
19 * parallel with `make -j`, and if use the same path in multiple tests they
20 * will stomp on eachother and likely fail.
21 */
22 static constexpr auto tmplt = "/tmp/MockLed.XXXXXX";
23 char buffer[MAXPATHLEN] = {0};
24
25 strncpy(buffer, tmplt, sizeof(buffer) - 1);
26 auto dir = mkdtemp(buffer);
27 if (!dir)
28 {
29 throw std::system_error(errno, std::system_category());
30 }
31
32 /* We want to limit behaviours to mocks, and if methods aren't mocked they
33 * may fall back to their base class implementation. Stop read/write to
34 * directory to prevent streams from creating files.
35 */
36 if (chmod(dir, S_IXUSR | S_IXGRP) == -1)
37 {
38 throw std::system_error(errno, std::system_category());
39 }
40
41 return fs::path(dir);
42}
43
44class MockLed : public phosphor::led::SysfsLed
45{
46 public:
47 /* Use a no-args ctor here to avoid headaches with {Nice,Strict}Mock */
48 MockLed() : SysfsLed(create_sandbox())
George Liu61b90632020-06-22 10:55:13 +080049 {}
Andrew Jeffery280afaf2018-05-24 16:15:46 +093050
51 virtual ~MockLed()
52 {
53 chmod(root.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
54 fs::remove_all(root);
55 }
56
57 MOCK_METHOD0(getBrightness, unsigned long());
58 MOCK_METHOD1(setBrightness, void(unsigned long value));
59 MOCK_METHOD0(getMaxBrightness, unsigned long());
60 MOCK_METHOD0(getTrigger, std::string());
61 MOCK_METHOD1(setTrigger, void(const std::string& trigger));
62 MOCK_METHOD0(getDelayOn, unsigned long());
63 MOCK_METHOD1(setDelayOn, void(unsigned long ms));
64 MOCK_METHOD0(getDelayOff, unsigned long());
65 MOCK_METHOD1(setDelayOff, void(unsigned long ms));
66};
67
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +093068using ::testing::InSequence;
Andrew Jeffery280afaf2018-05-24 16:15:46 +093069using ::testing::NiceMock;
70using ::testing::Return;
71using ::testing::Throw;
72
Andrew Jeffery56692702018-05-25 11:41:43 +093073TEST(Physical, ctor_none_trigger)
Andrew Jefferya607a0d2018-05-23 16:15:26 +093074{
Patrick Williamsff3d5382022-07-22 19:26:55 -050075 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Andrew Jeffery280afaf2018-05-24 16:15:46 +093076 /* NiceMock ignores calls to methods with no expectations defined */
77 NiceMock<MockLed> led;
78 ON_CALL(led, getTrigger()).WillByDefault(Return("none"));
Andrew Jeffery42e02d32018-05-24 13:34:05 +093079 phosphor::led::Physical phy(bus, LED_OBJ, led);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -050080 EXPECT_EQ(phy.state(), Action::Off);
Andrew Jefferya607a0d2018-05-23 16:15:26 +093081}
82
Vishwanatha Subbannaa8a275f2021-03-26 00:33:34 -050083TEST(Physical, ctor_maxbrightness_and_brightness_read_127)
84{
Patrick Williamsff3d5382022-07-22 19:26:55 -050085 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Vishwanatha Subbannaa8a275f2021-03-26 00:33:34 -050086 /* NiceMock ignores calls to methods with no expectations defined */
87 NiceMock<MockLed> led;
88 EXPECT_CALL(led, getTrigger()).WillRepeatedly(Return("none"));
89 EXPECT_CALL(led, getBrightness()).WillOnce(Return(127));
90 EXPECT_CALL(led, getMaxBrightness()).WillOnce(Return(127));
91 phosphor::led::Physical phy(bus, LED_OBJ, led);
92 EXPECT_EQ(phy.state(), Action::On);
93}
94
95TEST(Physical, ctor_maxbrightness_and_brightness_read_0)
96{
Patrick Williamsff3d5382022-07-22 19:26:55 -050097 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Vishwanatha Subbannaa8a275f2021-03-26 00:33:34 -050098 /* NiceMock ignores calls to methods with no expectations defined */
99 NiceMock<MockLed> led;
100 EXPECT_CALL(led, getTrigger()).WillRepeatedly(Return("none"));
101 EXPECT_CALL(led, getBrightness()).WillOnce(Return(0));
102 EXPECT_CALL(led, getMaxBrightness()).WillOnce(Return(0));
103 phosphor::led::Physical phy(bus, LED_OBJ, led);
104 EXPECT_EQ(phy.state(), Action::Off);
105}
106
107TEST(Physical, ctor_only_maxbrightness_read_127)
108{
Patrick Williamsff3d5382022-07-22 19:26:55 -0500109 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Vishwanatha Subbannaa8a275f2021-03-26 00:33:34 -0500110 /* NiceMock ignores calls to methods with no expectations defined */
111 NiceMock<MockLed> led;
112 EXPECT_CALL(led, getTrigger()).WillRepeatedly(Return("none"));
113 EXPECT_CALL(led, getBrightness()).WillOnce(Return(0));
114 EXPECT_CALL(led, getMaxBrightness()).WillOnce(Return(127));
115 phosphor::led::Physical phy(bus, LED_OBJ, led);
116 EXPECT_EQ(phy.state(), Action::Off);
117}
118
119TEST(Physical, ctor_only_brightness_read_127)
120{
Patrick Williamsff3d5382022-07-22 19:26:55 -0500121 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Vishwanatha Subbannaa8a275f2021-03-26 00:33:34 -0500122 /* NiceMock ignores calls to methods with no expectations defined */
123 NiceMock<MockLed> led;
124 EXPECT_CALL(led, getTrigger()).WillRepeatedly(Return("none"));
125 EXPECT_CALL(led, getBrightness()).WillOnce(Return(127));
126 EXPECT_CALL(led, getMaxBrightness()).WillOnce(Return(0));
127 phosphor::led::Physical phy(bus, LED_OBJ, led);
128 EXPECT_EQ(phy.state(), Action::Off);
129}
130
Andrew Jeffery56692702018-05-25 11:41:43 +0930131TEST(Physical, ctor_timer_trigger)
132{
Patrick Williamsff3d5382022-07-22 19:26:55 -0500133 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Andrew Jeffery56692702018-05-25 11:41:43 +0930134 NiceMock<MockLed> led;
135 EXPECT_CALL(led, getTrigger()).WillOnce(Return("timer"));
136 EXPECT_CALL(led, getDelayOn()).WillOnce(Return(500));
137 EXPECT_CALL(led, getDelayOff()).WillOnce(Return(500));
138 phosphor::led::Physical phy(bus, LED_OBJ, led);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500139 EXPECT_EQ(phy.state(), Action::Off);
Andrew Jeffery56692702018-05-25 11:41:43 +0930140}
141
Andrew Jefferya607a0d2018-05-23 16:15:26 +0930142TEST(Physical, off)
143{
Patrick Williamsff3d5382022-07-22 19:26:55 -0500144 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Andrew Jeffery280afaf2018-05-24 16:15:46 +0930145 NiceMock<MockLed> led;
Andrew Jeffery30726a02018-05-25 15:03:04 +0930146 ON_CALL(led, getMaxBrightness()).WillByDefault(Return(127));
147 EXPECT_CALL(led, getTrigger()).WillOnce(Return("none"));
Andrew Jeffery8e852282023-02-06 19:29:43 +1030148 EXPECT_CALL(led, getBrightness())
149 .WillOnce(Return(phosphor::led::deasserted));
150 EXPECT_CALL(led, setBrightness(phosphor::led::deasserted)).Times(0);
Andrew Jeffery42e02d32018-05-24 13:34:05 +0930151 phosphor::led::Physical phy(bus, LED_OBJ, led);
152 phy.state(Action::Off);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500153 EXPECT_EQ(phy.state(), Action::Off);
Andrew Jefferya607a0d2018-05-23 16:15:26 +0930154}
155
156TEST(Physical, on)
157{
Andrew Jeffery5b1417b2019-03-18 17:20:37 +1030158 constexpr unsigned long asserted = 127;
159
Patrick Williamsff3d5382022-07-22 19:26:55 -0500160 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Andrew Jeffery280afaf2018-05-24 16:15:46 +0930161 NiceMock<MockLed> led;
Andrew Jeffery5b1417b2019-03-18 17:20:37 +1030162 ON_CALL(led, getMaxBrightness()).WillByDefault(Return(asserted));
Andrew Jeffery30726a02018-05-25 15:03:04 +0930163 EXPECT_CALL(led, getTrigger()).WillOnce(Return("none"));
164 EXPECT_CALL(led, setTrigger("none"));
Andrew Jeffery5b1417b2019-03-18 17:20:37 +1030165 EXPECT_CALL(led, setBrightness(asserted));
Andrew Jeffery42e02d32018-05-24 13:34:05 +0930166 phosphor::led::Physical phy(bus, LED_OBJ, led);
167 phy.state(Action::On);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500168 EXPECT_EQ(phy.state(), Action::On);
Andrew Jefferya607a0d2018-05-23 16:15:26 +0930169}
170
171TEST(Physical, blink)
172{
Patrick Williamsff3d5382022-07-22 19:26:55 -0500173 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Andrew Jeffery280afaf2018-05-24 16:15:46 +0930174 NiceMock<MockLed> led;
Andrew Jeffery861e5622018-05-25 14:51:45 +0930175 EXPECT_CALL(led, getTrigger()).WillOnce(Return("none"));
176 EXPECT_CALL(led, setTrigger("timer"));
177 EXPECT_CALL(led, setDelayOn(500));
178 EXPECT_CALL(led, setDelayOff(500));
Andrew Jeffery42e02d32018-05-24 13:34:05 +0930179 phosphor::led::Physical phy(bus, LED_OBJ, led);
180 phy.state(Action::Blink);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500181 EXPECT_EQ(phy.state(), Action::Blink);
Andrew Jefferya607a0d2018-05-23 16:15:26 +0930182}
Andrew Jeffery04275e02018-05-25 13:04:39 +0930183
184TEST(Physical, ctor_none_trigger_asserted_brightness)
185{
Patrick Williamsff3d5382022-07-22 19:26:55 -0500186 sdbusplus::bus_t bus = sdbusplus::bus::new_default();
Andrew Jeffery04275e02018-05-25 13:04:39 +0930187 NiceMock<MockLed> led;
188 EXPECT_CALL(led, getTrigger()).WillRepeatedly(Return("none"));
Andrew Jeffery5b1417b2019-03-18 17:20:37 +1030189 EXPECT_CALL(led, getBrightness()).WillRepeatedly(Return(127));
Andrew Jeffery04275e02018-05-25 13:04:39 +0930190 phosphor::led::Physical phy(bus, LED_OBJ, led);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500191 EXPECT_EQ(phy.state(), Action::Off);
Andrew Jeffery04275e02018-05-25 13:04:39 +0930192}
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930193
194TEST(Physical, on_to_off)
195{
196 InSequence s;
Andrew Jeffery5b1417b2019-03-18 17:20:37 +1030197 constexpr unsigned long asserted = 127;
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930198
199 auto bus = sdbusplus::bus::new_default();
200 NiceMock<MockLed> led;
Andrew Jeffery5b1417b2019-03-18 17:20:37 +1030201 ON_CALL(led, getMaxBrightness()).WillByDefault(Return(asserted));
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930202 EXPECT_CALL(led, getTrigger()).Times(1).WillOnce(Return("none"));
Andrew Jeffery8e852282023-02-06 19:29:43 +1030203 constexpr auto deasserted = phosphor::led::deasserted;
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930204 EXPECT_CALL(led, getBrightness()).WillOnce(Return(deasserted));
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930205 EXPECT_CALL(led, setBrightness(asserted));
206 EXPECT_CALL(led, setBrightness(deasserted));
207 phosphor::led::Physical phy(bus, LED_OBJ, led);
208 phy.state(Action::On);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500209 EXPECT_EQ(phy.state(), Action::On);
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930210 phy.state(Action::Off);
Vishwanatha Subbannadb21bc02021-03-26 00:32:46 -0500211 EXPECT_EQ(phy.state(), Action::Off);
Andrew Jefferyaee9c2c2018-05-25 14:05:40 +0930212}