blob: d861a25fa50446d151882268e297351a07a574ff [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"
18#include "id_map.hpp"
19#include "rule.hpp"
20
21#include <cstddef> // for size_t
22#include <exception>
Shawn McCarney2134ca62019-11-11 13:06:18 -060023#include <memory>
Shawn McCarneyc69a2752019-10-30 17:37:30 -050024#include <stdexcept>
Shawn McCarney2134ca62019-11-11 13:06:18 -060025#include <vector>
Shawn McCarneyc69a2752019-10-30 17:37:30 -050026
27#include <gtest/gtest.h>
28
29using namespace phosphor::power::regulators;
30
31TEST(ActionEnvironmentTests, Constructor)
32{
33 // Create IDMap
34 IDMap idMap{};
35 Device reg1{"regulator1"};
36 idMap.addDevice(reg1);
37
38 // Verify object state after constructor
39 try
40 {
41 ActionEnvironment env{idMap, "regulator1"};
42 EXPECT_EQ(env.getDevice().getID(), "regulator1");
43 EXPECT_EQ(env.getDeviceID(), "regulator1");
44 EXPECT_EQ(env.getRuleDepth(), 0);
45 EXPECT_THROW(env.getVolts(), std::logic_error);
46 EXPECT_EQ(env.hasVolts(), false);
47 }
48 catch (const std::exception& error)
49 {
50 ADD_FAILURE() << "Should not have caught exception.";
51 }
52}
53
54TEST(ActionEnvironmentTests, DecrementRuleDepth)
55{
56 IDMap idMap{};
57 ActionEnvironment env{idMap, ""};
58 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -060059 env.incrementRuleDepth("set_voltage_rule");
60 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -050061 EXPECT_EQ(env.getRuleDepth(), 2);
62 env.decrementRuleDepth();
63 EXPECT_EQ(env.getRuleDepth(), 1);
64 env.decrementRuleDepth();
65 EXPECT_EQ(env.getRuleDepth(), 0);
66 env.decrementRuleDepth();
67 EXPECT_EQ(env.getRuleDepth(), 0);
68}
69
70TEST(ActionEnvironmentTests, GetDevice)
71{
72 // Create IDMap
73 IDMap idMap{};
74 Device reg1{"regulator1"};
75 idMap.addDevice(reg1);
76
77 ActionEnvironment env{idMap, "regulator1"};
78
79 // Test where current device ID is in the IDMap
80 try
81 {
82 Device& device = env.getDevice();
83 EXPECT_EQ(device.getID(), "regulator1");
84 EXPECT_EQ(&device, &reg1);
85 }
86 catch (const std::exception& error)
87 {
88 ADD_FAILURE() << "Should not have caught exception.";
89 }
90
91 // Test where current device ID is not in the IDMap
92 env.setDeviceID("regulator2");
93 try
94 {
95 env.getDevice();
96 ADD_FAILURE() << "Should not have reached this line.";
97 }
98 catch (const std::invalid_argument& ia_error)
99 {
100 EXPECT_STREQ(ia_error.what(),
101 "Unable to find device with ID \"regulator2\"");
102 }
103 catch (const std::exception& error)
104 {
105 ADD_FAILURE() << "Should not have caught exception.";
106 }
107}
108
109TEST(ActionEnvironmentTests, GetDeviceID)
110{
111 IDMap idMap{};
112 ActionEnvironment env{idMap, ""};
113 EXPECT_EQ(env.getDeviceID(), "");
114 env.setDeviceID("regulator1");
115 EXPECT_EQ(env.getDeviceID(), "regulator1");
116}
117
118TEST(ActionEnvironmentTests, GetRule)
119{
120 // Create IDMap
121 IDMap idMap{};
Shawn McCarney9fc08e72019-11-07 13:18:55 -0600122 Rule setVoltageRule{"set_voltage_rule",
123 std::vector<std::unique_ptr<Action>>{}};
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500124 idMap.addRule(setVoltageRule);
125
126 ActionEnvironment env{idMap, ""};
127
128 // Test where rule ID is in the IDMap
129 try
130 {
131 Rule& rule = env.getRule("set_voltage_rule");
132 EXPECT_EQ(rule.getID(), "set_voltage_rule");
133 EXPECT_EQ(&rule, &setVoltageRule);
134 }
135 catch (const std::exception& error)
136 {
137 ADD_FAILURE() << "Should not have caught exception.";
138 }
139
140 // Test where rule ID is not in the IDMap
141 try
142 {
143 env.getRule("set_voltage_rule2");
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 rule with ID \"set_voltage_rule2\"");
150 }
151 catch (const std::exception& error)
152 {
153 ADD_FAILURE() << "Should not have caught exception.";
154 }
155}
156
157TEST(ActionEnvironmentTests, GetRuleDepth)
158{
159 IDMap idMap{};
160 ActionEnvironment env{idMap, ""};
161 EXPECT_EQ(env.getRuleDepth(), 0);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600162 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500163 EXPECT_EQ(env.getRuleDepth(), 1);
Shawn McCarney2134ca62019-11-11 13:06:18 -0600164 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500165 EXPECT_EQ(env.getRuleDepth(), 2);
166 env.decrementRuleDepth();
167 EXPECT_EQ(env.getRuleDepth(), 1);
168 env.decrementRuleDepth();
169 EXPECT_EQ(env.getRuleDepth(), 0);
170}
171
172TEST(ActionEnvironmentTests, GetVolts)
173{
174 IDMap idMap{};
175 ActionEnvironment env{idMap, ""};
176 EXPECT_EQ(env.hasVolts(), false);
177
178 // Test where a volts value has not been set
179 try
180 {
181 env.getVolts();
182 }
183 catch (const std::logic_error& l_error)
184 {
185 EXPECT_STREQ(l_error.what(), "No volts value has been set.");
186 }
187 catch (const std::exception& error)
188 {
189 ADD_FAILURE() << "Should not have caught exception.";
190 }
191
192 // Test where a volts value has been set
193 env.setVolts(1.31);
194 try
195 {
196 double volts = env.getVolts();
197 EXPECT_EQ(volts, 1.31);
198 }
199 catch (const std::exception& error)
200 {
201 ADD_FAILURE() << "Should not have caught exception.";
202 }
203}
204
205TEST(ActionEnvironmentTests, HasVolts)
206{
207 IDMap idMap{};
208 ActionEnvironment env{idMap, ""};
209 EXPECT_EQ(env.hasVolts(), false);
210 env.setVolts(1.31);
211 EXPECT_EQ(env.hasVolts(), true);
212}
213
214TEST(ActionEnvironmentTests, IncrementRuleDepth)
215{
216 IDMap idMap{};
217 ActionEnvironment env{idMap, ""};
218 EXPECT_EQ(env.getRuleDepth(), 0);
219
220 // Test where rule depth has not exceeded maximum
221 try
222 {
223 for (size_t i = 1; i <= env.maxRuleDepth; ++i)
224 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600225 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500226 EXPECT_EQ(env.getRuleDepth(), i);
227 }
228 }
229 catch (const std::exception& error)
230 {
231 ADD_FAILURE() << "Should not have caught exception.";
232 }
233
234 // Test where rule depth has exceeded maximum
235 try
236 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600237 env.incrementRuleDepth("set_voltage_rule");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500238 }
239 catch (const std::runtime_error& r_error)
240 {
Shawn McCarney2134ca62019-11-11 13:06:18 -0600241 EXPECT_STREQ(r_error.what(),
242 "Maximum rule depth exceeded by rule set_voltage_rule.");
Shawn McCarneyc69a2752019-10-30 17:37:30 -0500243 }
244 catch (const std::exception& error)
245 {
246 ADD_FAILURE() << "Should not have caught exception.";
247 }
248}
249
250TEST(ActionEnvironmentTests, SetDeviceID)
251{
252 IDMap idMap{};
253 Device reg1{"regulator1"};
254 idMap.addDevice(reg1);
255 ActionEnvironment env{idMap, "regulator1"};
256
257 EXPECT_EQ(env.getDeviceID(), "regulator1");
258 env.setDeviceID("regulator2");
259 EXPECT_EQ(env.getDeviceID(), "regulator2");
260}
261
262TEST(ActionEnvironmentTests, SetVolts)
263{
264 try
265 {
266 IDMap idMap{};
267 ActionEnvironment env{idMap, ""};
268 EXPECT_EQ(env.hasVolts(), false);
269 env.setVolts(2.35);
270 EXPECT_EQ(env.hasVolts(), true);
271 EXPECT_EQ(env.getVolts(), 2.35);
272 }
273 catch (const std::exception& error)
274 {
275 ADD_FAILURE() << "Should not have caught exception.";
276 }
277}