blob: 4100078a49b782f367e023841a8a788a3c8ba730 [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"
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060020#include "mocked_i2c_interface.hpp"
Bob Kingb1ab1cf2020-05-18 18:26:26 +080021#include "pmbus_utils.hpp"
Shawn McCarneyc69a2752019-10-30 17:37:30 -050022#include "rule.hpp"
23
24#include <cstddef> // for size_t
25#include <exception>
Shawn McCarney2134ca62019-11-11 13:06:18 -060026#include <memory>
Shawn McCarneyc69a2752019-10-30 17:37:30 -050027#include <stdexcept>
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060028#include <utility>
Shawn McCarney2134ca62019-11-11 13:06:18 -060029#include <vector>
Shawn McCarneyc69a2752019-10-30 17:37:30 -050030
31#include <gtest/gtest.h>
32
33using namespace phosphor::power::regulators;
34
35TEST(ActionEnvironmentTests, Constructor)
36{
37 // Create IDMap
38 IDMap idMap{};
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060039
40 // Create Device and add to IDMap
41 std::unique_ptr<i2c::I2CInterface> i2cInterface =
42 i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
43 Device reg1{"regulator1", true, "/system/chassis/motherboard/reg1",
44 std::move(i2cInterface)};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050045 idMap.addDevice(reg1);
46
47 // Verify object state after constructor
48 try
49 {
50 ActionEnvironment env{idMap, "regulator1"};
51 EXPECT_EQ(env.getDevice().getID(), "regulator1");
52 EXPECT_EQ(env.getDeviceID(), "regulator1");
53 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney0fd07d72020-03-06 17:16:24 -060054 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -050055 }
56 catch (const std::exception& error)
57 {
58 ADD_FAILURE() << "Should not have caught exception.";
59 }
60}
61
Bob Kingb1ab1cf2020-05-18 18:26:26 +080062TEST(ActionEnvironmentTests, AddSensorReading)
63{
64 IDMap idMap{};
65 ActionEnvironment env{idMap, ""};
66 pmbus_utils::SensorReading reading;
67 reading.type = pmbus_utils::SensorValueType::iout;
68 reading.value = 1;
69 EXPECT_EQ(env.getSensorReadings().size(), 0);
70 env.addSensorReading(reading);
71 EXPECT_EQ(env.getSensorReadings().size(), 1);
72 EXPECT_EQ(env.getSensorReadings()[0].type,
73 pmbus_utils::SensorValueType::iout);
74 EXPECT_EQ(env.getSensorReadings()[0].value, 1);
75 reading.type = pmbus_utils::SensorValueType::vout;
76 reading.value = 2;
77 env.addSensorReading(reading);
78 EXPECT_EQ(env.getSensorReadings().size(), 2);
79 EXPECT_EQ(env.getSensorReadings()[1].type,
80 pmbus_utils::SensorValueType::vout);
81 EXPECT_EQ(env.getSensorReadings()[1].value, 2);
82}
83
Shawn McCarneyc69a2752019-10-30 17:37:30 -050084TEST(ActionEnvironmentTests, DecrementRuleDepth)
85{
86 IDMap idMap{};
87 ActionEnvironment env{idMap, ""};
88 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -060089 env.incrementRuleDepth("set_voltage_rule");
90 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -050091 EXPECT_EQ(env.getRuleDepth(), 2);
92 env.decrementRuleDepth();
93 EXPECT_EQ(env.getRuleDepth(), 1);
94 env.decrementRuleDepth();
95 EXPECT_EQ(env.getRuleDepth(), 0);
96 env.decrementRuleDepth();
97 EXPECT_EQ(env.getRuleDepth(), 0);
98}
99
100TEST(ActionEnvironmentTests, GetDevice)
101{
102 // Create IDMap
103 IDMap idMap{};
Shawn McCarneyafb7fc32019-12-11 19:42:03 -0600104
105 // Create Device and add to IDMap
106 std::unique_ptr<i2c::I2CInterface> i2cInterface =
107 i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
108 Device reg1{"regulator1", true, "/system/chassis/motherboard/reg1",
109 std::move(i2cInterface)};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500110 idMap.addDevice(reg1);
111
112 ActionEnvironment env{idMap, "regulator1"};
113
114 // Test where current device ID is in the IDMap
115 try
116 {
117 Device& device = env.getDevice();
118 EXPECT_EQ(device.getID(), "regulator1");
119 EXPECT_EQ(&device, &reg1);
120 }
121 catch (const std::exception& error)
122 {
123 ADD_FAILURE() << "Should not have caught exception.";
124 }
125
126 // Test where current device ID is not in the IDMap
127 env.setDeviceID("regulator2");
128 try
129 {
130 env.getDevice();
131 ADD_FAILURE() << "Should not have reached this line.";
132 }
133 catch (const std::invalid_argument& ia_error)
134 {
135 EXPECT_STREQ(ia_error.what(),
136 "Unable to find device with ID \"regulator2\"");
137 }
138 catch (const std::exception& error)
139 {
140 ADD_FAILURE() << "Should not have caught exception.";
141 }
142}
143
144TEST(ActionEnvironmentTests, GetDeviceID)
145{
146 IDMap idMap{};
147 ActionEnvironment env{idMap, ""};
148 EXPECT_EQ(env.getDeviceID(), "");
149 env.setDeviceID("regulator1");
150 EXPECT_EQ(env.getDeviceID(), "regulator1");
151}
152
153TEST(ActionEnvironmentTests, GetRule)
154{
155 // Create IDMap
156 IDMap idMap{};
Shawn McCarney9fc08e72019-11-07 13:18:55 -0600157 Rule setVoltageRule{"set_voltage_rule",
158 std::vector<std::unique_ptr<Action>>{}};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500159 idMap.addRule(setVoltageRule);
160
161 ActionEnvironment env{idMap, ""};
162
163 // Test where rule ID is in the IDMap
164 try
165 {
166 Rule& rule = env.getRule("set_voltage_rule");
167 EXPECT_EQ(rule.getID(), "set_voltage_rule");
168 EXPECT_EQ(&rule, &setVoltageRule);
169 }
170 catch (const std::exception& error)
171 {
172 ADD_FAILURE() << "Should not have caught exception.";
173 }
174
175 // Test where rule ID is not in the IDMap
176 try
177 {
178 env.getRule("set_voltage_rule2");
179 ADD_FAILURE() << "Should not have reached this line.";
180 }
181 catch (const std::invalid_argument& ia_error)
182 {
183 EXPECT_STREQ(ia_error.what(),
184 "Unable to find rule with ID \"set_voltage_rule2\"");
185 }
186 catch (const std::exception& error)
187 {
188 ADD_FAILURE() << "Should not have caught exception.";
189 }
190}
191
192TEST(ActionEnvironmentTests, GetRuleDepth)
193{
194 IDMap idMap{};
195 ActionEnvironment env{idMap, ""};
196 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600197 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500198 EXPECT_EQ(env.getRuleDepth(), 1);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600199 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500200 EXPECT_EQ(env.getRuleDepth(), 2);
201 env.decrementRuleDepth();
202 EXPECT_EQ(env.getRuleDepth(), 1);
203 env.decrementRuleDepth();
204 EXPECT_EQ(env.getRuleDepth(), 0);
205}
206
Bob Kingb1ab1cf2020-05-18 18:26:26 +0800207TEST(ActionEnvironmentTests, GetSensorReadings)
208{
209 IDMap idMap{};
210 ActionEnvironment env{idMap, ""};
211 pmbus_utils::SensorReading reading;
212 reading.type = pmbus_utils::SensorValueType::pout;
213 reading.value = 1.3;
214 EXPECT_EQ(env.getSensorReadings().size(), 0);
215 env.addSensorReading(reading);
216 EXPECT_EQ(env.getSensorReadings().size(), 1);
217 EXPECT_EQ(env.getSensorReadings()[0].type,
218 pmbus_utils::SensorValueType::pout);
219 EXPECT_EQ(env.getSensorReadings()[0].value, 1.3);
220 reading.type = pmbus_utils::SensorValueType::temperature;
221 reading.value = -1;
222 env.addSensorReading(reading);
223 EXPECT_EQ(env.getSensorReadings().size(), 2);
224 EXPECT_EQ(env.getSensorReadings()[1].type,
225 pmbus_utils::SensorValueType::temperature);
226 EXPECT_EQ(env.getSensorReadings()[1].value, -1);
227}
228
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500229TEST(ActionEnvironmentTests, GetVolts)
230{
231 IDMap idMap{};
232 ActionEnvironment env{idMap, ""};
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600233 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500234 env.setVolts(1.31);
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600235 EXPECT_EQ(env.getVolts().has_value(), true);
236 EXPECT_EQ(env.getVolts().value(), 1.31);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500237}
238
239TEST(ActionEnvironmentTests, IncrementRuleDepth)
240{
241 IDMap idMap{};
242 ActionEnvironment env{idMap, ""};
243 EXPECT_EQ(env.getRuleDepth(), 0);
244
245 // Test where rule depth has not exceeded maximum
246 try
247 {
248 for (size_t i = 1; i <= env.maxRuleDepth; ++i)
249 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600250 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500251 EXPECT_EQ(env.getRuleDepth(), i);
252 }
253 }
254 catch (const std::exception& error)
255 {
256 ADD_FAILURE() << "Should not have caught exception.";
257 }
258
259 // Test where rule depth has exceeded maximum
260 try
261 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600262 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500263 }
264 catch (const std::runtime_error& r_error)
265 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600266 EXPECT_STREQ(r_error.what(),
267 "Maximum rule depth exceeded by rule set_voltage_rule.");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500268 }
269 catch (const std::exception& error)
270 {
271 ADD_FAILURE() << "Should not have caught exception.";
272 }
273}
274
275TEST(ActionEnvironmentTests, SetDeviceID)
276{
277 IDMap idMap{};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500278 ActionEnvironment env{idMap, "regulator1"};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500279 EXPECT_EQ(env.getDeviceID(), "regulator1");
280 env.setDeviceID("regulator2");
281 EXPECT_EQ(env.getDeviceID(), "regulator2");
282}
283
284TEST(ActionEnvironmentTests, SetVolts)
285{
286 try
287 {
288 IDMap idMap{};
289 ActionEnvironment env{idMap, ""};
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600290 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500291 env.setVolts(2.35);
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600292 EXPECT_EQ(env.getVolts().has_value(), true);
293 EXPECT_EQ(env.getVolts().value(), 2.35);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500294 }
295 catch (const std::exception& error)
296 {
297 ADD_FAILURE() << "Should not have caught exception.";
298 }
299}