blob: de52845a0927ef518c569410a24630c131cb1942 [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"
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
Bob King73eacee2020-10-23 13:58:02 +080040 // Create mock services.
41 MockServices services{};
42
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060043 // Create Device and add to IDMap
44 std::unique_ptr<i2c::I2CInterface> i2cInterface =
45 i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
Bob Kinga76898f2020-10-13 15:08:33 +080046 Device reg1{
47 "regulator1", true,
48 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
49 std::move(i2cInterface)};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050050 idMap.addDevice(reg1);
51
52 // Verify object state after constructor
53 try
54 {
Bob King73eacee2020-10-23 13:58:02 +080055 ActionEnvironment env{idMap, "regulator1", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050056 EXPECT_EQ(env.getDevice().getID(), "regulator1");
57 EXPECT_EQ(env.getDeviceID(), "regulator1");
58 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney0fd07d72020-03-06 17:16:24 -060059 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -050060 }
61 catch (const std::exception& error)
62 {
63 ADD_FAILURE() << "Should not have caught exception.";
64 }
65}
66
67TEST(ActionEnvironmentTests, DecrementRuleDepth)
68{
69 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +080070 MockServices services{};
71 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050072 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -060073 env.incrementRuleDepth("set_voltage_rule");
74 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -050075 EXPECT_EQ(env.getRuleDepth(), 2);
76 env.decrementRuleDepth();
77 EXPECT_EQ(env.getRuleDepth(), 1);
78 env.decrementRuleDepth();
79 EXPECT_EQ(env.getRuleDepth(), 0);
80 env.decrementRuleDepth();
81 EXPECT_EQ(env.getRuleDepth(), 0);
82}
83
84TEST(ActionEnvironmentTests, GetDevice)
85{
86 // Create IDMap
87 IDMap idMap{};
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060088
Bob King73eacee2020-10-23 13:58:02 +080089 // Create mock services.
90 MockServices services{};
91
Shawn McCarneyafb7fc32019-12-11 19:42:03 -060092 // Create Device and add to IDMap
93 std::unique_ptr<i2c::I2CInterface> i2cInterface =
94 i2c::create(1, 0x70, i2c::I2CInterface::InitialState::CLOSED);
Bob Kinga76898f2020-10-13 15:08:33 +080095 Device reg1{
96 "regulator1", true,
97 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
98 std::move(i2cInterface)};
Shawn McCarneyc69a2752019-10-30 17:37:30 -050099 idMap.addDevice(reg1);
100
Bob King73eacee2020-10-23 13:58:02 +0800101 ActionEnvironment env{idMap, "regulator1", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500102
103 // Test where current device ID is in the IDMap
104 try
105 {
106 Device& device = env.getDevice();
107 EXPECT_EQ(device.getID(), "regulator1");
108 EXPECT_EQ(&device, &reg1);
109 }
110 catch (const std::exception& error)
111 {
112 ADD_FAILURE() << "Should not have caught exception.";
113 }
114
115 // Test where current device ID is not in the IDMap
116 env.setDeviceID("regulator2");
117 try
118 {
119 env.getDevice();
120 ADD_FAILURE() << "Should not have reached this line.";
121 }
122 catch (const std::invalid_argument& ia_error)
123 {
124 EXPECT_STREQ(ia_error.what(),
125 "Unable to find device with ID \"regulator2\"");
126 }
127 catch (const std::exception& error)
128 {
129 ADD_FAILURE() << "Should not have caught exception.";
130 }
131}
132
133TEST(ActionEnvironmentTests, GetDeviceID)
134{
135 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800136 MockServices services{};
137 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500138 EXPECT_EQ(env.getDeviceID(), "");
139 env.setDeviceID("regulator1");
140 EXPECT_EQ(env.getDeviceID(), "regulator1");
141}
142
143TEST(ActionEnvironmentTests, GetRule)
144{
145 // Create IDMap
146 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800147
148 // Create mock services.
149 MockServices services{};
150
Shawn McCarney9fc08e72019-11-07 13:18:55 -0600151 Rule setVoltageRule{"set_voltage_rule",
152 std::vector<std::unique_ptr<Action>>{}};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500153 idMap.addRule(setVoltageRule);
154
Bob King73eacee2020-10-23 13:58:02 +0800155 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500156
157 // Test where rule ID is in the IDMap
158 try
159 {
160 Rule& rule = env.getRule("set_voltage_rule");
161 EXPECT_EQ(rule.getID(), "set_voltage_rule");
162 EXPECT_EQ(&rule, &setVoltageRule);
163 }
164 catch (const std::exception& error)
165 {
166 ADD_FAILURE() << "Should not have caught exception.";
167 }
168
169 // Test where rule ID is not in the IDMap
170 try
171 {
172 env.getRule("set_voltage_rule2");
173 ADD_FAILURE() << "Should not have reached this line.";
174 }
175 catch (const std::invalid_argument& ia_error)
176 {
177 EXPECT_STREQ(ia_error.what(),
178 "Unable to find rule with ID \"set_voltage_rule2\"");
179 }
180 catch (const std::exception& error)
181 {
182 ADD_FAILURE() << "Should not have caught exception.";
183 }
184}
185
186TEST(ActionEnvironmentTests, GetRuleDepth)
187{
188 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800189 MockServices services{};
190 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500191 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600192 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500193 EXPECT_EQ(env.getRuleDepth(), 1);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600194 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500195 EXPECT_EQ(env.getRuleDepth(), 2);
196 env.decrementRuleDepth();
197 EXPECT_EQ(env.getRuleDepth(), 1);
198 env.decrementRuleDepth();
199 EXPECT_EQ(env.getRuleDepth(), 0);
200}
201
Bob King73eacee2020-10-23 13:58:02 +0800202TEST(ActionEnvironmentTests, GetServices)
203{
204 IDMap idMap{};
205 MockServices services{};
206 ActionEnvironment env{idMap, "", services};
207 EXPECT_EQ(&(env.getServices()), &services);
208}
209
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500210TEST(ActionEnvironmentTests, GetVolts)
211{
212 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800213 MockServices services{};
214 ActionEnvironment env{idMap, "", services};
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600215 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500216 env.setVolts(1.31);
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600217 EXPECT_EQ(env.getVolts().has_value(), true);
218 EXPECT_EQ(env.getVolts().value(), 1.31);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500219}
220
221TEST(ActionEnvironmentTests, IncrementRuleDepth)
222{
223 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800224 MockServices services{};
225 ActionEnvironment env{idMap, "", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500226 EXPECT_EQ(env.getRuleDepth(), 0);
227
228 // Test where rule depth has not exceeded maximum
229 try
230 {
231 for (size_t i = 1; i <= env.maxRuleDepth; ++i)
232 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600233 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500234 EXPECT_EQ(env.getRuleDepth(), i);
235 }
236 }
237 catch (const std::exception& error)
238 {
239 ADD_FAILURE() << "Should not have caught exception.";
240 }
241
242 // Test where rule depth has exceeded maximum
243 try
244 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600245 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500246 }
247 catch (const std::runtime_error& r_error)
248 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600249 EXPECT_STREQ(r_error.what(),
250 "Maximum rule depth exceeded by rule set_voltage_rule.");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500251 }
252 catch (const std::exception& error)
253 {
254 ADD_FAILURE() << "Should not have caught exception.";
255 }
256}
257
258TEST(ActionEnvironmentTests, SetDeviceID)
259{
260 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800261 MockServices services{};
262 ActionEnvironment env{idMap, "regulator1", services};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500263 EXPECT_EQ(env.getDeviceID(), "regulator1");
264 env.setDeviceID("regulator2");
265 EXPECT_EQ(env.getDeviceID(), "regulator2");
266}
267
268TEST(ActionEnvironmentTests, SetVolts)
269{
270 try
271 {
272 IDMap idMap{};
Bob King73eacee2020-10-23 13:58:02 +0800273 MockServices services{};
274 ActionEnvironment env{idMap, "", services};
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600275 EXPECT_EQ(env.getVolts().has_value(), false);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500276 env.setVolts(2.35);
Shawn McCarney0fd07d72020-03-06 17:16:24 -0600277 EXPECT_EQ(env.getVolts().has_value(), true);
278 EXPECT_EQ(env.getVolts().value(), 2.35);
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500279 }
280 catch (const std::exception& error)
281 {
282 ADD_FAILURE() << "Should not have caught exception.";
283 }
284}