blob: 82bbbac9170ee95281c9a46710cda366004ed56e [file] [log] [blame]
Shawn McCarneya2461b32019-10-24 18:53:01 -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 */
Shawn McCarney4bf310e2020-03-10 17:48:11 -050016#include "action.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050017#include "chassis.hpp"
Shawn McCarney4bf310e2020-03-10 17:48:11 -050018#include "configuration.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050019#include "device.hpp"
20#include "i2c_interface.hpp"
Shawn McCarney4bf310e2020-03-10 17:48:11 -050021#include "mock_action.hpp"
Shawn McCarney2ccf9612021-05-14 11:09:17 -050022#include "mock_error_logging.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050023#include "mock_journal.hpp"
Shawn McCarney17bac892021-05-08 07:55:52 -050024#include "mock_sensors.hpp"
Bob King23243f82020-07-29 10:38:57 +080025#include "mock_services.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050026#include "mocked_i2c_interface.hpp"
Shawn McCarney32252592021-09-08 15:29:36 -050027#include "phase_fault_detection.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050028#include "presence_detection.hpp"
Shawn McCarneya2461b32019-10-24 18:53:01 -050029#include "rail.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050030#include "rule.hpp"
Shawn McCarney4bf310e2020-03-10 17:48:11 -050031#include "sensor_monitoring.hpp"
Shawn McCarney2f9e14f2021-04-29 02:45:18 -050032#include "sensors.hpp"
Shawn McCarney779b9562020-04-13 17:05:45 -050033#include "system.hpp"
Shawn McCarney2ccf9612021-05-14 11:09:17 -050034#include "test_sdbus_error.hpp"
Shawn McCarney4bf310e2020-03-10 17:48:11 -050035
36#include <memory>
37#include <optional>
38#include <utility>
39#include <vector>
Shawn McCarneya2461b32019-10-24 18:53:01 -050040
Shawn McCarneyeb7bec42020-04-14 09:38:15 -050041#include <gmock/gmock.h>
Shawn McCarneya2461b32019-10-24 18:53:01 -050042#include <gtest/gtest.h>
43
44using namespace phosphor::power::regulators;
45
Bob King7b743432020-06-22 17:35:04 +080046using ::testing::A;
Shawn McCarney779b9562020-04-13 17:05:45 -050047using ::testing::Return;
Shawn McCarney2ccf9612021-05-14 11:09:17 -050048using ::testing::Throw;
Bob King7b743432020-06-22 17:35:04 +080049using ::testing::TypedEq;
Shawn McCarney779b9562020-04-13 17:05:45 -050050
Shawn McCarneycb3f6a62021-04-30 10:54:30 -050051static const std::string chassisInvPath{
52 "/xyz/openbmc_project/inventory/system/chassis"};
53
Shawn McCarneya2461b32019-10-24 18:53:01 -050054TEST(RailTests, Constructor)
55{
Shawn McCarney4bf310e2020-03-10 17:48:11 -050056 // Test where only required parameters are specified
57 {
58 Rail rail{"vdd0"};
59 EXPECT_EQ(rail.getID(), "vdd0");
60 EXPECT_EQ(rail.getConfiguration(), nullptr);
61 EXPECT_EQ(rail.getSensorMonitoring(), nullptr);
62 }
63
64 // Test where all parameters are specified
65 {
66 // Create Configuration
67 std::optional<double> volts{1.3};
68 std::vector<std::unique_ptr<Action>> actions{};
69 actions.push_back(std::make_unique<MockAction>());
70 actions.push_back(std::make_unique<MockAction>());
71 std::unique_ptr<Configuration> configuration =
72 std::make_unique<Configuration>(volts, std::move(actions));
73
74 // Create SensorMonitoring
75 actions.clear();
76 actions.push_back(std::make_unique<MockAction>());
77 std::unique_ptr<SensorMonitoring> sensorMonitoring =
78 std::make_unique<SensorMonitoring>(std::move(actions));
79
80 // Create Rail
81 Rail rail{"vddr1", std::move(configuration),
82 std::move(sensorMonitoring)};
83 EXPECT_EQ(rail.getID(), "vddr1");
84 EXPECT_NE(rail.getConfiguration(), nullptr);
85 EXPECT_EQ(rail.getConfiguration()->getVolts().has_value(), true);
86 EXPECT_EQ(rail.getConfiguration()->getVolts().value(), 1.3);
87 EXPECT_EQ(rail.getConfiguration()->getActions().size(), 2);
88 EXPECT_NE(rail.getSensorMonitoring(), nullptr);
89 EXPECT_EQ(rail.getSensorMonitoring()->getActions().size(), 1);
90 }
91}
92
Shawn McCarney2ccf9612021-05-14 11:09:17 -050093TEST(RailTests, ClearErrorHistory)
94{
95 // Create SensorMonitoring. Will fail with a DBus exception.
96 std::unique_ptr<MockAction> action = std::make_unique<MockAction>();
97 EXPECT_CALL(*action, execute)
98 .WillRepeatedly(Throw(TestSDBusError{"Unable to set sensor value"}));
99 std::vector<std::unique_ptr<Action>> actions{};
100 actions.emplace_back(std::move(action));
101 std::unique_ptr<SensorMonitoring> sensorMonitoring =
102 std::make_unique<SensorMonitoring>(std::move(actions));
103
104 // Create Rail
105 std::unique_ptr<Configuration> configuration{};
106 std::unique_ptr<Rail> rail = std::make_unique<Rail>(
107 "vddr1", std::move(configuration), std::move(sensorMonitoring));
108 Rail* railPtr = rail.get();
109
110 // Create Device that contains Rail
111 std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
112 std::make_unique<i2c::MockedI2CInterface>();
113 std::unique_ptr<PresenceDetection> presenceDetection{};
114 std::unique_ptr<Configuration> deviceConfiguration{};
Shawn McCarney32252592021-09-08 15:29:36 -0500115 std::unique_ptr<PhaseFaultDetection> phaseFaultDetection{};
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500116 std::vector<std::unique_ptr<Rail>> rails{};
117 rails.emplace_back(std::move(rail));
118 std::unique_ptr<Device> device = std::make_unique<Device>(
119 "reg1", true,
120 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
121 std::move(i2cInterface), std::move(presenceDetection),
Shawn McCarney32252592021-09-08 15:29:36 -0500122 std::move(deviceConfiguration), std::move(phaseFaultDetection),
123 std::move(rails));
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500124 Device* devicePtr = device.get();
125
126 // Create Chassis that contains Device
127 std::vector<std::unique_ptr<Device>> devices{};
128 devices.emplace_back(std::move(device));
129 std::unique_ptr<Chassis> chassis =
130 std::make_unique<Chassis>(1, chassisInvPath, std::move(devices));
131 Chassis* chassisPtr = chassis.get();
132
133 // Create System that contains Chassis
134 std::vector<std::unique_ptr<Rule>> rules{};
135 std::vector<std::unique_ptr<Chassis>> chassisVec{};
136 chassisVec.emplace_back(std::move(chassis));
137 System system{std::move(rules), std::move(chassisVec)};
138
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500139 // Create lambda that sets MockServices expectations. The lambda allows
140 // us to set expectations multiple times without duplicate code.
141 auto setExpectations = [](MockServices& services) {
142 // Expect Sensors service to be called 10 times
143 MockSensors& sensors = services.getMockSensors();
144 EXPECT_CALL(sensors, startRail).Times(10);
145 EXPECT_CALL(sensors, setValue).Times(0);
146 EXPECT_CALL(sensors, endRail(true)).Times(10);
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500147
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500148 // Expect Journal service to be called 6 times to log error messages
149 MockJournal& journal = services.getMockJournal();
150 EXPECT_CALL(journal, logError(A<const std::vector<std::string>&>()))
151 .Times(6);
152 EXPECT_CALL(journal, logError(A<const std::string&>())).Times(6);
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500153
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500154 // Expect ErrorLogging service to be called once to log a DBus error
155 MockErrorLogging& errorLogging = services.getMockErrorLogging();
156 EXPECT_CALL(errorLogging, logDBusError).Times(1);
157 };
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500158
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500159 // Monitor sensors 10 times. Verify errors logged.
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500160 {
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500161 // Create mock services. Set expectations via lambda.
162 MockServices services{};
163 setExpectations(services);
164
165 for (int i = 1; i <= 10; ++i)
166 {
167 railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
168 }
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500169 }
170
171 // Clear error history
172 railPtr->clearErrorHistory();
173
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500174 // Monitor sensors 10 more times. Verify errors logged again.
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500175 {
Shawn McCarneyfa2734d2022-03-30 21:16:40 -0500176 // Create mock services. Set expectations via lambda.
177 MockServices services{};
178 setExpectations(services);
179
180 for (int i = 1; i <= 10; ++i)
181 {
182 railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
183 }
Shawn McCarney2ccf9612021-05-14 11:09:17 -0500184 }
185}
186
Shawn McCarney779b9562020-04-13 17:05:45 -0500187TEST(RailTests, Configure)
188{
189 // Test where Configuration was not specified in constructor
190 {
Bob King5cfe5102020-07-30 16:26:18 +0800191 // Create mock services. No logging should occur.
Bob King23243f82020-07-29 10:38:57 +0800192 MockServices services{};
Bob King5cfe5102020-07-30 16:26:18 +0800193 MockJournal& journal = services.getMockJournal();
194 EXPECT_CALL(journal, logDebug(A<const std::string&>())).Times(0);
195 EXPECT_CALL(journal, logError(A<const std::string&>())).Times(0);
Bob King23243f82020-07-29 10:38:57 +0800196
Shawn McCarney779b9562020-04-13 17:05:45 -0500197 // Create Rail
198 std::unique_ptr<Rail> rail = std::make_unique<Rail>("vdd0");
199 Rail* railPtr = rail.get();
200
201 // Create Device that contains Rail
202 std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
203 std::make_unique<i2c::MockedI2CInterface>();
204 std::unique_ptr<PresenceDetection> presenceDetection{};
205 std::unique_ptr<Configuration> deviceConfiguration{};
Shawn McCarney32252592021-09-08 15:29:36 -0500206 std::unique_ptr<PhaseFaultDetection> phaseFaultDetection{};
Shawn McCarney779b9562020-04-13 17:05:45 -0500207 std::vector<std::unique_ptr<Rail>> rails{};
208 rails.emplace_back(std::move(rail));
209 std::unique_ptr<Device> device = std::make_unique<Device>(
Bob Kinga76898f2020-10-13 15:08:33 +0800210 "reg1", true,
211 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
Shawn McCarney779b9562020-04-13 17:05:45 -0500212 std::move(i2cInterface), std::move(presenceDetection),
Shawn McCarney32252592021-09-08 15:29:36 -0500213 std::move(deviceConfiguration), std::move(phaseFaultDetection),
214 std::move(rails));
Shawn McCarney779b9562020-04-13 17:05:45 -0500215 Device* devicePtr = device.get();
216
217 // Create Chassis that contains Device
218 std::vector<std::unique_ptr<Device>> devices{};
219 devices.emplace_back(std::move(device));
220 std::unique_ptr<Chassis> chassis =
Shawn McCarneycb3f6a62021-04-30 10:54:30 -0500221 std::make_unique<Chassis>(1, chassisInvPath, std::move(devices));
Shawn McCarney779b9562020-04-13 17:05:45 -0500222 Chassis* chassisPtr = chassis.get();
223
224 // Create System that contains Chassis
225 std::vector<std::unique_ptr<Rule>> rules{};
226 std::vector<std::unique_ptr<Chassis>> chassisVec{};
227 chassisVec.emplace_back(std::move(chassis));
228 System system{std::move(rules), std::move(chassisVec)};
229
Bob King5cfe5102020-07-30 16:26:18 +0800230 // Call configure().
Bob King23243f82020-07-29 10:38:57 +0800231 railPtr->configure(services, system, *chassisPtr, *devicePtr);
Shawn McCarney779b9562020-04-13 17:05:45 -0500232 }
233
234 // Test where Configuration was specified in constructor
235 {
Bob King5cfe5102020-07-30 16:26:18 +0800236 // Create mock services. Expect logDebug() to be called.
Bob King23243f82020-07-29 10:38:57 +0800237 MockServices services{};
Bob King5cfe5102020-07-30 16:26:18 +0800238 MockJournal& journal = services.getMockJournal();
239 EXPECT_CALL(journal, logDebug("Configuring vddr1: volts=1.300000"))
240 .Times(1);
241 EXPECT_CALL(journal, logError(A<const std::string&>())).Times(0);
Bob King23243f82020-07-29 10:38:57 +0800242
Shawn McCarney779b9562020-04-13 17:05:45 -0500243 // Create Configuration
244 std::optional<double> volts{1.3};
245 std::unique_ptr<MockAction> action = std::make_unique<MockAction>();
246 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
247 std::vector<std::unique_ptr<Action>> actions{};
248 actions.emplace_back(std::move(action));
249 std::unique_ptr<Configuration> configuration =
250 std::make_unique<Configuration>(volts, std::move(actions));
251
252 // Create Rail
253 std::unique_ptr<Rail> rail =
254 std::make_unique<Rail>("vddr1", std::move(configuration));
255 Rail* railPtr = rail.get();
256
257 // Create Device that contains Rail
258 std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
259 std::make_unique<i2c::MockedI2CInterface>();
260 std::unique_ptr<PresenceDetection> presenceDetection{};
261 std::unique_ptr<Configuration> deviceConfiguration{};
Shawn McCarney32252592021-09-08 15:29:36 -0500262 std::unique_ptr<PhaseFaultDetection> phaseFaultDetection{};
Shawn McCarney779b9562020-04-13 17:05:45 -0500263 std::vector<std::unique_ptr<Rail>> rails{};
264 rails.emplace_back(std::move(rail));
265 std::unique_ptr<Device> device = std::make_unique<Device>(
Bob Kinga76898f2020-10-13 15:08:33 +0800266 "reg1", true,
267 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
Shawn McCarney779b9562020-04-13 17:05:45 -0500268 std::move(i2cInterface), std::move(presenceDetection),
Shawn McCarney32252592021-09-08 15:29:36 -0500269 std::move(deviceConfiguration), std::move(phaseFaultDetection),
270 std::move(rails));
Shawn McCarney779b9562020-04-13 17:05:45 -0500271 Device* devicePtr = device.get();
272
273 // Create Chassis that contains Device
274 std::vector<std::unique_ptr<Device>> devices{};
275 devices.emplace_back(std::move(device));
276 std::unique_ptr<Chassis> chassis =
Shawn McCarneycb3f6a62021-04-30 10:54:30 -0500277 std::make_unique<Chassis>(1, chassisInvPath, std::move(devices));
Shawn McCarney779b9562020-04-13 17:05:45 -0500278 Chassis* chassisPtr = chassis.get();
279
280 // Create System that contains Chassis
281 std::vector<std::unique_ptr<Rule>> rules{};
282 std::vector<std::unique_ptr<Chassis>> chassisVec{};
283 chassisVec.emplace_back(std::move(chassis));
284 System system{std::move(rules), std::move(chassisVec)};
285
Bob King5cfe5102020-07-30 16:26:18 +0800286 // Call configure().
Bob King23243f82020-07-29 10:38:57 +0800287 railPtr->configure(services, system, *chassisPtr, *devicePtr);
Shawn McCarney779b9562020-04-13 17:05:45 -0500288 }
289}
290
Shawn McCarney4bf310e2020-03-10 17:48:11 -0500291TEST(RailTests, GetConfiguration)
292{
293 // Test where Configuration was not specified in constructor
294 {
295 Rail rail{"vdd0"};
296 EXPECT_EQ(rail.getConfiguration(), nullptr);
297 }
298
299 // Test where Configuration was specified in constructor
300 {
301 // Create Configuration
302 std::optional<double> volts{3.2};
303 std::vector<std::unique_ptr<Action>> actions{};
304 actions.push_back(std::make_unique<MockAction>());
305 std::unique_ptr<Configuration> configuration =
306 std::make_unique<Configuration>(volts, std::move(actions));
307
308 // Create Rail
309 Rail rail{"vddr1", std::move(configuration)};
310 EXPECT_NE(rail.getConfiguration(), nullptr);
311 EXPECT_EQ(rail.getConfiguration()->getVolts().has_value(), true);
312 EXPECT_EQ(rail.getConfiguration()->getVolts().value(), 3.2);
313 EXPECT_EQ(rail.getConfiguration()->getActions().size(), 1);
314 }
Shawn McCarneya2461b32019-10-24 18:53:01 -0500315}
316
Shawn McCarney4afb2852019-10-27 18:28:53 -0500317TEST(RailTests, GetID)
Shawn McCarneya2461b32019-10-24 18:53:01 -0500318{
Shawn McCarney4bf310e2020-03-10 17:48:11 -0500319 Rail rail{"vio2"};
Shawn McCarney4afb2852019-10-27 18:28:53 -0500320 EXPECT_EQ(rail.getID(), "vio2");
Shawn McCarneya2461b32019-10-24 18:53:01 -0500321}
Shawn McCarney4bf310e2020-03-10 17:48:11 -0500322
Bob King7b743432020-06-22 17:35:04 +0800323TEST(RailTests, MonitorSensors)
324{
325 // Test where SensorMonitoring was not specified in constructor
326 {
Shawn McCarney17bac892021-05-08 07:55:52 -0500327 // Create mock services. No Sensors methods should be called.
Bob King8a552922020-08-05 17:02:31 +0800328 MockServices services{};
Shawn McCarney17bac892021-05-08 07:55:52 -0500329 MockSensors& sensors = services.getMockSensors();
330 EXPECT_CALL(sensors, startRail).Times(0);
331 EXPECT_CALL(sensors, setValue).Times(0);
332 EXPECT_CALL(sensors, endRail).Times(0);
Bob King7b743432020-06-22 17:35:04 +0800333
334 // Create Rail
335 std::unique_ptr<Rail> rail = std::make_unique<Rail>("vdd0");
336 Rail* railPtr = rail.get();
337
338 // Create Device that contains Rail
Shawn McCarney17bac892021-05-08 07:55:52 -0500339 std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
340 std::make_unique<i2c::MockedI2CInterface>();
Bob King7b743432020-06-22 17:35:04 +0800341 std::unique_ptr<PresenceDetection> presenceDetection{};
342 std::unique_ptr<Configuration> deviceConfiguration{};
Shawn McCarney32252592021-09-08 15:29:36 -0500343 std::unique_ptr<PhaseFaultDetection> phaseFaultDetection{};
Bob King7b743432020-06-22 17:35:04 +0800344 std::vector<std::unique_ptr<Rail>> rails{};
345 rails.emplace_back(std::move(rail));
346 std::unique_ptr<Device> device = std::make_unique<Device>(
Bob Kinga76898f2020-10-13 15:08:33 +0800347 "reg1", true,
348 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
Bob King7b743432020-06-22 17:35:04 +0800349 std::move(i2cInterface), std::move(presenceDetection),
Shawn McCarney32252592021-09-08 15:29:36 -0500350 std::move(deviceConfiguration), std::move(phaseFaultDetection),
351 std::move(rails));
Bob King7b743432020-06-22 17:35:04 +0800352 Device* devicePtr = device.get();
353
354 // Create Chassis that contains Device
355 std::vector<std::unique_ptr<Device>> devices{};
356 devices.emplace_back(std::move(device));
357 std::unique_ptr<Chassis> chassis =
Shawn McCarneycb3f6a62021-04-30 10:54:30 -0500358 std::make_unique<Chassis>(1, chassisInvPath, std::move(devices));
Bob King7b743432020-06-22 17:35:04 +0800359 Chassis* chassisPtr = chassis.get();
360
361 // Create System that contains Chassis
362 std::vector<std::unique_ptr<Rule>> rules{};
363 std::vector<std::unique_ptr<Chassis>> chassisVec{};
364 chassisVec.emplace_back(std::move(chassis));
365 System system{std::move(rules), std::move(chassisVec)};
366
Shawn McCarney17bac892021-05-08 07:55:52 -0500367 // Call monitorSensors()
Bob King8a552922020-08-05 17:02:31 +0800368 railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
Bob King7b743432020-06-22 17:35:04 +0800369 }
370
371 // Test where SensorMonitoring was specified in constructor
372 {
Shawn McCarney17bac892021-05-08 07:55:52 -0500373 // Create mock services. Set Sensors service expectations.
Bob King8a552922020-08-05 17:02:31 +0800374 MockServices services{};
Shawn McCarney17bac892021-05-08 07:55:52 -0500375 MockSensors& sensors = services.getMockSensors();
376 EXPECT_CALL(sensors,
377 startRail("vddr1",
378 "/xyz/openbmc_project/inventory/system/chassis/"
379 "motherboard/reg1",
380 chassisInvPath))
Bob King7b743432020-06-22 17:35:04 +0800381 .Times(1);
Shawn McCarney17bac892021-05-08 07:55:52 -0500382 EXPECT_CALL(sensors, setValue).Times(0);
383 EXPECT_CALL(sensors, endRail(false)).Times(1);
Bob King7b743432020-06-22 17:35:04 +0800384
385 // Create SensorMonitoring
Shawn McCarney17bac892021-05-08 07:55:52 -0500386 std::unique_ptr<MockAction> action = std::make_unique<MockAction>();
387 EXPECT_CALL(*action, execute).Times(1).WillOnce(Return(true));
Bob King7b743432020-06-22 17:35:04 +0800388 std::vector<std::unique_ptr<Action>> actions{};
389 actions.emplace_back(std::move(action));
390 std::unique_ptr<SensorMonitoring> sensorMonitoring =
391 std::make_unique<SensorMonitoring>(std::move(actions));
392
393 // Create Rail
394 std::unique_ptr<Configuration> configuration{};
395 std::unique_ptr<Rail> rail = std::make_unique<Rail>(
396 "vddr1", std::move(configuration), std::move(sensorMonitoring));
397 Rail* railPtr = rail.get();
398
399 // Create Device that contains Rail
Shawn McCarney17bac892021-05-08 07:55:52 -0500400 std::unique_ptr<i2c::MockedI2CInterface> i2cInterface =
401 std::make_unique<i2c::MockedI2CInterface>();
Bob King7b743432020-06-22 17:35:04 +0800402 std::unique_ptr<PresenceDetection> presenceDetection{};
403 std::unique_ptr<Configuration> deviceConfiguration{};
Shawn McCarney32252592021-09-08 15:29:36 -0500404 std::unique_ptr<PhaseFaultDetection> phaseFaultDetection{};
Bob King7b743432020-06-22 17:35:04 +0800405 std::vector<std::unique_ptr<Rail>> rails{};
406 rails.emplace_back(std::move(rail));
407 std::unique_ptr<Device> device = std::make_unique<Device>(
Bob Kinga76898f2020-10-13 15:08:33 +0800408 "reg1", true,
409 "/xyz/openbmc_project/inventory/system/chassis/motherboard/reg1",
Bob King7b743432020-06-22 17:35:04 +0800410 std::move(i2cInterface), std::move(presenceDetection),
Shawn McCarney32252592021-09-08 15:29:36 -0500411 std::move(deviceConfiguration), std::move(phaseFaultDetection),
412 std::move(rails));
Bob King7b743432020-06-22 17:35:04 +0800413 Device* devicePtr = device.get();
414
415 // Create Chassis that contains Device
416 std::vector<std::unique_ptr<Device>> devices{};
417 devices.emplace_back(std::move(device));
418 std::unique_ptr<Chassis> chassis =
Shawn McCarneycb3f6a62021-04-30 10:54:30 -0500419 std::make_unique<Chassis>(1, chassisInvPath, std::move(devices));
Bob King7b743432020-06-22 17:35:04 +0800420 Chassis* chassisPtr = chassis.get();
421
422 // Create System that contains Chassis
423 std::vector<std::unique_ptr<Rule>> rules{};
424 std::vector<std::unique_ptr<Chassis>> chassisVec{};
425 chassisVec.emplace_back(std::move(chassis));
426 System system{std::move(rules), std::move(chassisVec)};
427
Shawn McCarney17bac892021-05-08 07:55:52 -0500428 // Call monitorSensors()
Bob King8a552922020-08-05 17:02:31 +0800429 railPtr->monitorSensors(services, system, *chassisPtr, *devicePtr);
Bob King7b743432020-06-22 17:35:04 +0800430 }
431}
432
Shawn McCarney4bf310e2020-03-10 17:48:11 -0500433TEST(RailTests, GetSensorMonitoring)
434{
435 // Test where SensorMonitoring was not specified in constructor
436 {
437 Rail rail{"vdd0", nullptr, nullptr};
438 EXPECT_EQ(rail.getSensorMonitoring(), nullptr);
439 }
440
441 // Test where SensorMonitoring was specified in constructor
442 {
443 std::unique_ptr<Configuration> configuration{};
444
445 // Create SensorMonitoring
446 std::vector<std::unique_ptr<Action>> actions{};
447 actions.push_back(std::make_unique<MockAction>());
448 actions.push_back(std::make_unique<MockAction>());
449 std::unique_ptr<SensorMonitoring> sensorMonitoring =
450 std::make_unique<SensorMonitoring>(std::move(actions));
451
452 // Create Rail
453 Rail rail{"vddr1", std::move(configuration),
454 std::move(sensorMonitoring)};
455 EXPECT_NE(rail.getSensorMonitoring(), nullptr);
456 EXPECT_EQ(rail.getSensorMonitoring()->getActions().size(), 2);
457 }
458}