blob: ffb75e9454682e2141c946ccdf8d32f1026e6b0e [file] [log] [blame]
Shawn McCarneyc69a2752019-10-30 17:37:30 -05001/**
2 * Copyright © 2019 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include "action_environment.hpp"
17#include "device.hpp"
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060018#include "i2c_interface.hpp"
Shawn McCarneyc69a2752019-10-30 17:37:30 -050019#include "id_map.hpp"
Bob King73eacee2020-10-23 13:58:02 +080020#include "mock_services.hpp"
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060021#include "mocked_i2c_interface.hpp"
Bob Kingb1ab1cf2020-05-18 18:26:26 +080022#include "pmbus_utils.hpp"
Shawn McCarneyc69a2752019-10-30 17:37:30 -050023#include "rule.hpp"
24
25#include <cstddef> // for size_t
26#include <exception>
Shawn McCarney2134ca62019-11-11 13:06:18 -060027#include <memory>
Shawn McCarneyc69a2752019-10-30 17:37:30 -050028#include <stdexcept>
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060029#include <utility>
Shawn McCarney2134ca62019-11-11 13:06:18 -060030#include <vector>
Shawn McCarneyc69a2752019-10-30 17:37:30 -050031
32#include <gtest/gtest.h>
33
34using namespace phosphor::power::regulators;
35
36TEST(ActionEnvironmentTests, Constructor)
37{
38 // Create IDMap
39 IDMap idMap{};
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060040
Bob King73eacee2020-10-23 13:58:02 +080041 // Create mock services.
42 MockServices services{};
43
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060044 // Create Device and add to IDMap
45 std::unique_ptr<i2c::I2CInterface> i2cInterface =
46 i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
Bob Kinga76898f2020-10-13 15:08:33 +080047 Device reg1{
48 "regulator1", true,
49 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
50 std::move(i2cInterface)};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050051 idMap.addDevice(reg1);
52
53 // Verify object state after constructor
54 try
55 {
Bob King73eacee2020-10-23 13:58:02 +080056 ActionEnvironment env{idMap, "regulator1", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050057 EXPECT_EQ(env.getDevice().getID(), "regulator1");
58 EXPECT_EQ(env.getDeviceID(), "regulator1");
59 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney0fd07d72020-03-06 17:16:24 -060060 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -050061 }
62 catch (const std::exception& error)
63 {
64 ADD_FAILURE() << "Should not have caught exception.";
65 }
66}
67
Bob Kingb1ab1cf2020-05-18 18:26:26 +080068TEST(ActionEnvironmentTests, AddSensorReading)
69{
70 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +080071 MockServices services{};
72 ActionEnvironment env{idMap, "", services};
Bob Kingb1ab1cf2020-05-18 18:26:26 +080073 pmbus_utils::SensorReading reading;
74 reading.type = pmbus_utils::SensorValueType::iout;
75 reading.value = 1;
76 EXPECT_EQ(env.getSensorReadings().size(), 0);
77 env.addSensorReading(reading);
78 EXPECT_EQ(env.getSensorReadings().size(), 1);
79 EXPECT_EQ(env.getSensorReadings()[0].type,
80 pmbus_utils::SensorValueType::iout);
81 EXPECT_EQ(env.getSensorReadings()[0].value, 1);
82 reading.type = pmbus_utils::SensorValueType::vout;
83 reading.value = 2;
84 env.addSensorReading(reading);
85 EXPECT_EQ(env.getSensorReadings().size(), 2);
86 EXPECT_EQ(env.getSensorReadings()[1].type,
87 pmbus_utils::SensorValueType::vout);
88 EXPECT_EQ(env.getSensorReadings()[1].value, 2);
89}
90
Shawn McCarneyc69a2752019-10-30 17:37:30 -050091TEST(ActionEnvironmentTests, DecrementRuleDepth)
92{
93 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +080094 MockServices services{};
95 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050096 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -060097 env.incrementRuleDepth("set_voltage_rule");
98 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -050099 EXPECT_EQ(env.getRuleDepth(), 2);
100 env.decrementRuleDepth();
101 EXPECT_EQ(env.getRuleDepth(), 1);
102 env.decrementRuleDepth();
103 EXPECT_EQ(env.getRuleDepth(), 0);
104 env.decrementRuleDepth();
105 EXPECT_EQ(env.getRuleDepth(), 0);
106}
107
108TEST(ActionEnvironmentTests, GetDevice)
109{
110 // Create IDMap
111 IDMap idMap{};
Shawn McCarneyafb7fc32019-12-11 19:42:03 -0600112
Bob King73eacee2020-10-23 13:58:02 +0800113 // Create mock services.
114 MockServices services{};
115
Shawn McCarneyafb7fc32019-12-11 19:42:03 -0600116 // Create Device and add to IDMap
117 std::unique_ptr<i2c::I2CInterface> i2cInterface =
118 i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
Bob Kinga76898f2020-10-13 15:08:33 +0800119 Device reg1{
120 "regulator1", true,
121 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
122 std::move(i2cInterface)};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500123 idMap.addDevice(reg1);
124
Bob King73eacee2020-10-23 13:58:02 +0800125 ActionEnvironment env{idMap, "regulator1", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500126
127 // Test where current device ID is in the IDMap
128 try
129 {
130 Device& device = env.getDevice();
131 EXPECT_EQ(device.getID(), "regulator1");
132 EXPECT_EQ(&device, &reg1);
133 }
134 catch (const std::exception& error)
135 {
136 ADD_FAILURE() << "Should not have caught exception.";
137 }
138
139 // Test where current device ID is not in the IDMap
140 env.setDeviceID("regulator2");
141 try
142 {
143 env.getDevice();
144 ADD_FAILURE() << "Should not have reached this line.";
145 }
146 catch (const std::invalid_argument& ia_error)
147 {
148 EXPECT_STREQ(ia_error.what(),
149 "Unable to find device with ID \"regulator2\"");
150 }
151 catch (const std::exception& error)
152 {
153 ADD_FAILURE() << "Should not have caught exception.";
154 }
155}
156
157TEST(ActionEnvironmentTests, GetDeviceID)
158{
159 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800160 MockServices services{};
161 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500162 EXPECT_EQ(env.getDeviceID(), "");
163 env.setDeviceID("regulator1");
164 EXPECT_EQ(env.getDeviceID(), "regulator1");
165}
166
167TEST(ActionEnvironmentTests, GetRule)
168{
169 // Create IDMap
170 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800171
172 // Create mock services.
173 MockServices services{};
174
Shawn McCarney9fc08e72019-11-07 13:18:55 -0600175 Rule setVoltageRule{"set_voltage_rule",
176 std::vector<std::unique_ptr<Action>>{}};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500177 idMap.addRule(setVoltageRule);
178
Bob King73eacee2020-10-23 13:58:02 +0800179 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500180
181 // Test where rule ID is in the IDMap
182 try
183 {
184 Rule& rule = env.getRule("set_voltage_rule");
185 EXPECT_EQ(rule.getID(), "set_voltage_rule");
186 EXPECT_EQ(&rule, &setVoltageRule);
187 }
188 catch (const std::exception& error)
189 {
190 ADD_FAILURE() << "Should not have caught exception.";
191 }
192
193 // Test where rule ID is not in the IDMap
194 try
195 {
196 env.getRule("set_voltage_rule2");
197 ADD_FAILURE() << "Should not have reached this line.";
198 }
199 catch (const std::invalid_argument& ia_error)
200 {
201 EXPECT_STREQ(ia_error.what(),
202 "Unable to find rule with ID \"set_voltage_rule2\"");
203 }
204 catch (const std::exception& error)
205 {
206 ADD_FAILURE() << "Should not have caught exception.";
207 }
208}
209
210TEST(ActionEnvironmentTests, GetRuleDepth)
211{
212 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800213 MockServices services{};
214 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500215 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600216 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500217 EXPECT_EQ(env.getRuleDepth(), 1);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600218 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500219 EXPECT_EQ(env.getRuleDepth(), 2);
220 env.decrementRuleDepth();
221 EXPECT_EQ(env.getRuleDepth(), 1);
222 env.decrementRuleDepth();
223 EXPECT_EQ(env.getRuleDepth(), 0);
224}
225
Bob Kingb1ab1cf2020-05-18 18:26:26 +0800226TEST(ActionEnvironmentTests, GetSensorReadings)
227{
228 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800229 MockServices services{};
230 ActionEnvironment env{idMap, "", services};
Bob Kingb1ab1cf2020-05-18 18:26:26 +0800231 pmbus_utils::SensorReading reading;
232 reading.type = pmbus_utils::SensorValueType::pout;
233 reading.value = 1.3;
234 EXPECT_EQ(env.getSensorReadings().size(), 0);
235 env.addSensorReading(reading);
236 EXPECT_EQ(env.getSensorReadings().size(), 1);
237 EXPECT_EQ(env.getSensorReadings()[0].type,
238 pmbus_utils::SensorValueType::pout);
239 EXPECT_EQ(env.getSensorReadings()[0].value, 1.3);
240 reading.type = pmbus_utils::SensorValueType::temperature;
241 reading.value = -1;
242 env.addSensorReading(reading);
243 EXPECT_EQ(env.getSensorReadings().size(), 2);
244 EXPECT_EQ(env.getSensorReadings()[1].type,
245 pmbus_utils::SensorValueType::temperature);
246 EXPECT_EQ(env.getSensorReadings()[1].value, -1);
247}
248
Bob King73eacee2020-10-23 13:58:02 +0800249TEST(ActionEnvironmentTests, GetServices)
250{
251 IDMap idMap{};
252 MockServices services{};
253 ActionEnvironment env{idMap, "", services};
254 EXPECT_EQ(&(env.getServices()), &services);
255}
256
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500257TEST(ActionEnvironmentTests, GetVolts)
258{
259 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800260 MockServices services{};
261 ActionEnvironment env{idMap, "", services};
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600262 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500263 env.setVolts(1.31);
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600264 EXPECT_EQ(env.getVolts().has_value(), true);
265 EXPECT_EQ(env.getVolts().value(), 1.31);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500266}
267
268TEST(ActionEnvironmentTests, IncrementRuleDepth)
269{
270 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800271 MockServices services{};
272 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500273 EXPECT_EQ(env.getRuleDepth(), 0);
274
275 // Test where rule depth has not exceeded maximum
276 try
277 {
278 for (size_t i = 1; i <= env.maxRuleDepth; ++i)
279 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600280 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500281 EXPECT_EQ(env.getRuleDepth(), i);
282 }
283 }
284 catch (const std::exception& error)
285 {
286 ADD_FAILURE() << "Should not have caught exception.";
287 }
288
289 // Test where rule depth has exceeded maximum
290 try
291 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600292 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500293 }
294 catch (const std::runtime_error& r_error)
295 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600296 EXPECT_STREQ(r_error.what(),
297 "Maximum rule depth exceeded by rule set_voltage_rule.");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500298 }
299 catch (const std::exception& error)
300 {
301 ADD_FAILURE() << "Should not have caught exception.";
302 }
303}
304
305TEST(ActionEnvironmentTests, SetDeviceID)
306{
307 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800308 MockServices services{};
309 ActionEnvironment env{idMap, "regulator1", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500310 EXPECT_EQ(env.getDeviceID(), "regulator1");
311 env.setDeviceID("regulator2");
312 EXPECT_EQ(env.getDeviceID(), "regulator2");
313}
314
315TEST(ActionEnvironmentTests, SetVolts)
316{
317 try
318 {
319 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800320 MockServices services{};
321 ActionEnvironment env{idMap, "", services};
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600322 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500323 env.setVolts(2.35);
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600324 EXPECT_EQ(env.getVolts().has_value(), true);
325 EXPECT_EQ(env.getVolts().value(), 2.35);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500326 }
327 catch (const std::exception& error)
328 {
329 ADD_FAILURE() << "Should not have caught exception.";
330 }
331}