blob: a5fa32431c22b95b49c7cf0bd954c18c27aae50b [file]
#include "power.hpp"
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <gtest/gtest.h>
#include "boost/beast/http/status.hpp" // NOLINT
#include "dbus_utility.hpp"
#include "test/redfish-core/lib/snapshot_fixture.hpp"
#include <nlohmann/json.hpp>
#include "managed_store.hpp"
#include "managed_store_types.hpp"
#include "test/g3/mock_managed_store_test.hpp"
#include "sdbusplus/message/native_types.hpp"
namespace redfish {
namespace {
using ::dbus::utility::MapperGetSubTreePathsResponse;
using ::dbus::utility::MapperGetSubTreeResponse;
using ::managedStore::KeyType;
using ::managedStore::ManagedType;
TEST_F(SnapshotFixture, ChassisPowerStateListTest) {
const std::string chassisId = "platform1";
const std::string powerStatePath =
"/xyz/openbmc_project/inventory/system/powerstate/";
const std::string powerStatePrefix = "PRSNT_";
const int numberOfPowerStates = 100;
std::vector<std::string> powerStates;
std::map<std::string, std::string> expectedState;
for (int i = 0; i < numberOfPowerStates; i++) {
std::string powerStateName = powerStatePrefix + std::to_string(i);
std::string path = powerStatePath + powerStateName;
KeyType key(ManagedType::kManagedProperty,
"xyz.openbmc_project.EntityManager",
sdbusplus::message::object_path(path),
"xyz.openbmc_project.Inventory.Item", "Present");
bool present = (i % 2 == 0);
ASSERT_TRUE(
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(
key,
managedStore::MockManagedStoreTest::CreateValueType(present))
.ok());
expectedState.emplace(powerStateName, present ? "Enabled" : "Absent");
powerStates.push_back(path);
}
KeyType key(ManagedType::kManagedSubtreePaths,
"/xyz/openbmc_project/inventory", 0,
{"xyz.openbmc_project.Inventory.Item.PowerState"});
ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(
key, managedStore::MockManagedStoreTest::CreateValueType(
std::move(powerStates)))
.ok());
KeyType subtree_key(ManagedType::kManagedSubtree, "/xyz/openbmc_project", 0,
{"xyz.openbmc_project.Control.PowerSupplyAttributes"});
MapperGetSubTreeResponse subtree_response = {};
ASSERT_TRUE(
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(
subtree_key, managedStore::MockManagedStoreTest::CreateValueType(
std::move(subtree_response)))
.ok());
handleChassisPowerGet(app_, CreateRequest(), share_async_resp_, chassisId);
RunIoUntilDone();
EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
nlohmann::json& jsonValue = share_async_resp_->res.jsonValue;
EXPECT_TRUE(jsonValue.contains("Oem"));
EXPECT_TRUE(jsonValue["Oem"].contains("Google"));
EXPECT_EQ(jsonValue["Oem"]["Google"]["@odata.type"],
"#GooglePower.v1_0_0.GooglePower");
EXPECT_TRUE(jsonValue["Oem"]["Google"].contains("GooglePowerStates"));
EXPECT_EQ(jsonValue["Oem"]["Google"]["GooglePowerStates"].size(),
numberOfPowerStates);
for (const nlohmann::json& powerState :
jsonValue["Oem"]["Google"]["GooglePowerStates"]) {
EXPECT_TRUE(powerState.contains("Id"));
std::string stateId = powerState["Id"];
EXPECT_EQ(powerState["@odata.id"], "/redfish/v1/Chassis/" + chassisId +
"/Power/Oem/Google/PowerStates/" +
stateId);
EXPECT_EQ(powerState["@odata.type"], "#GooglePowerState.GooglePowerState");
EXPECT_EQ(powerState["Name"], "Power");
EXPECT_TRUE(expectedState.contains(stateId));
EXPECT_TRUE(powerState.contains("Status"));
EXPECT_TRUE(powerState["Status"].contains("State"));
EXPECT_EQ(powerState["Status"]["State"], expectedState[stateId]);
expectedState.erase(stateId);
}
EXPECT_EQ(expectedState.size(), 0);
}
} // namespace
} // namespace redfish