1*8a8a6801SShawn McCarney /**
2*8a8a6801SShawn McCarney * Copyright © 2025 IBM Corporation
3*8a8a6801SShawn McCarney *
4*8a8a6801SShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License");
5*8a8a6801SShawn McCarney * you may not use this file except in compliance with the License.
6*8a8a6801SShawn McCarney * You may obtain a copy of the License at
7*8a8a6801SShawn McCarney *
8*8a8a6801SShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0
9*8a8a6801SShawn McCarney *
10*8a8a6801SShawn McCarney * Unless required by applicable law or agreed to in writing, software
11*8a8a6801SShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS,
12*8a8a6801SShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8a8a6801SShawn McCarney * See the License for the specific language governing permissions and
14*8a8a6801SShawn McCarney * limitations under the License.
15*8a8a6801SShawn McCarney */
16*8a8a6801SShawn McCarney
17*8a8a6801SShawn McCarney #include "chassis.hpp"
18*8a8a6801SShawn McCarney #include "mock_services.hpp"
19*8a8a6801SShawn McCarney #include "power_sequencer_device.hpp"
20*8a8a6801SShawn McCarney #include "rail.hpp"
21*8a8a6801SShawn McCarney #include "services.hpp"
22*8a8a6801SShawn McCarney #include "ucd90160_device.hpp"
23*8a8a6801SShawn McCarney
24*8a8a6801SShawn McCarney #include <stddef.h> // for size_t
25*8a8a6801SShawn McCarney
26*8a8a6801SShawn McCarney #include <cstdint>
27*8a8a6801SShawn McCarney #include <memory>
28*8a8a6801SShawn McCarney #include <string>
29*8a8a6801SShawn McCarney #include <utility>
30*8a8a6801SShawn McCarney #include <vector>
31*8a8a6801SShawn McCarney
32*8a8a6801SShawn McCarney #include <gtest/gtest.h>
33*8a8a6801SShawn McCarney
34*8a8a6801SShawn McCarney using namespace phosphor::power::sequencer;
35*8a8a6801SShawn McCarney
36*8a8a6801SShawn McCarney /**
37*8a8a6801SShawn McCarney * Creates a PowerSequencerDevice instance.
38*8a8a6801SShawn McCarney *
39*8a8a6801SShawn McCarney * PowerSequencerDevice is an abstract base class. The actual object type
40*8a8a6801SShawn McCarney * created is a UCD90160Device.
41*8a8a6801SShawn McCarney *
42*8a8a6801SShawn McCarney * @param bus I2C bus for the device
43*8a8a6801SShawn McCarney * @param address I2C address for the device
44*8a8a6801SShawn McCarney * @param services System services like hardware presence and the journal
45*8a8a6801SShawn McCarney * @return PowerSequencerDevice instance
46*8a8a6801SShawn McCarney */
createPowerSequencer(uint8_t bus,uint16_t address,Services & services)47*8a8a6801SShawn McCarney std::unique_ptr<PowerSequencerDevice> createPowerSequencer(
48*8a8a6801SShawn McCarney uint8_t bus, uint16_t address, Services& services)
49*8a8a6801SShawn McCarney {
50*8a8a6801SShawn McCarney std::string powerControlGPIOName{"power-chassis-control"};
51*8a8a6801SShawn McCarney std::string powerGoodGPIOName{"power-chassis-good"};
52*8a8a6801SShawn McCarney std::vector<std::unique_ptr<Rail>> rails;
53*8a8a6801SShawn McCarney return std::make_unique<UCD90160Device>(
54*8a8a6801SShawn McCarney bus, address, powerControlGPIOName, powerGoodGPIOName, std::move(rails),
55*8a8a6801SShawn McCarney services);
56*8a8a6801SShawn McCarney }
57*8a8a6801SShawn McCarney
TEST(ChassisTests,Constructor)58*8a8a6801SShawn McCarney TEST(ChassisTests, Constructor)
59*8a8a6801SShawn McCarney {
60*8a8a6801SShawn McCarney MockServices services;
61*8a8a6801SShawn McCarney
62*8a8a6801SShawn McCarney size_t number{1};
63*8a8a6801SShawn McCarney std::string inventoryPath{"/xyz/openbmc_project/inventory/system/chassis"};
64*8a8a6801SShawn McCarney std::vector<std::unique_ptr<PowerSequencerDevice>> powerSequencers;
65*8a8a6801SShawn McCarney powerSequencers.emplace_back(createPowerSequencer(3, 0x70, services));
66*8a8a6801SShawn McCarney Chassis chassis{number, inventoryPath, std::move(powerSequencers)};
67*8a8a6801SShawn McCarney
68*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getNumber(), number);
69*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getInventoryPath(), inventoryPath);
70*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers().size(), 1);
71*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[0]->getBus(), 3);
72*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[0]->getAddress(), 0x70);
73*8a8a6801SShawn McCarney }
74*8a8a6801SShawn McCarney
TEST(ChassisTests,GetNumber)75*8a8a6801SShawn McCarney TEST(ChassisTests, GetNumber)
76*8a8a6801SShawn McCarney {
77*8a8a6801SShawn McCarney MockServices services;
78*8a8a6801SShawn McCarney
79*8a8a6801SShawn McCarney size_t number{2};
80*8a8a6801SShawn McCarney std::string inventoryPath{"/xyz/openbmc_project/inventory/system/chassis2"};
81*8a8a6801SShawn McCarney std::vector<std::unique_ptr<PowerSequencerDevice>> powerSequencers;
82*8a8a6801SShawn McCarney Chassis chassis{number, inventoryPath, std::move(powerSequencers)};
83*8a8a6801SShawn McCarney
84*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getNumber(), number);
85*8a8a6801SShawn McCarney }
86*8a8a6801SShawn McCarney
TEST(ChassisTests,GetInventoryPath)87*8a8a6801SShawn McCarney TEST(ChassisTests, GetInventoryPath)
88*8a8a6801SShawn McCarney {
89*8a8a6801SShawn McCarney MockServices services;
90*8a8a6801SShawn McCarney
91*8a8a6801SShawn McCarney size_t number{3};
92*8a8a6801SShawn McCarney std::string inventoryPath{
93*8a8a6801SShawn McCarney "/xyz/openbmc_project/inventory/system/chassis_3"};
94*8a8a6801SShawn McCarney std::vector<std::unique_ptr<PowerSequencerDevice>> powerSequencers;
95*8a8a6801SShawn McCarney Chassis chassis{number, inventoryPath, std::move(powerSequencers)};
96*8a8a6801SShawn McCarney
97*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getInventoryPath(), inventoryPath);
98*8a8a6801SShawn McCarney }
99*8a8a6801SShawn McCarney
TEST(ChassisTests,GetPowerSequencers)100*8a8a6801SShawn McCarney TEST(ChassisTests, GetPowerSequencers)
101*8a8a6801SShawn McCarney {
102*8a8a6801SShawn McCarney MockServices services;
103*8a8a6801SShawn McCarney
104*8a8a6801SShawn McCarney size_t number{2};
105*8a8a6801SShawn McCarney std::string inventoryPath{"/xyz/openbmc_project/inventory/system/chassis2"};
106*8a8a6801SShawn McCarney std::vector<std::unique_ptr<PowerSequencerDevice>> powerSequencers;
107*8a8a6801SShawn McCarney powerSequencers.emplace_back(createPowerSequencer(3, 0x70, services));
108*8a8a6801SShawn McCarney powerSequencers.emplace_back(createPowerSequencer(4, 0x32, services));
109*8a8a6801SShawn McCarney powerSequencers.emplace_back(createPowerSequencer(10, 0x16, services));
110*8a8a6801SShawn McCarney Chassis chassis{number, inventoryPath, std::move(powerSequencers)};
111*8a8a6801SShawn McCarney
112*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers().size(), 3);
113*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[0]->getBus(), 3);
114*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[0]->getAddress(), 0x70);
115*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[1]->getBus(), 4);
116*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[1]->getAddress(), 0x32);
117*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[2]->getBus(), 10);
118*8a8a6801SShawn McCarney EXPECT_EQ(chassis.getPowerSequencers()[2]->getAddress(), 0x16);
119*8a8a6801SShawn McCarney }
120