blob: 2f2b770fc05ed7c7469f59177f87a6c26b576db5 [file]
#include "pcie_slots.hpp"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include <gtest/gtest.h>
#include "absl/log/log.h"
#include "boost/beast/http/status.hpp" // NOLINT
#include "http_response.hpp"
#include "dbus_utility.hpp"
#include "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::DBusPropertiesMap;
using ::dbus::utility::DbusVariantType;
using ::dbus::utility::MapperGetSubTreeResponse;
using ::dbus::utility::MapperServiceMap;
using ::managedStore::KeyType;
using ::managedStore::ManagedType;
using ::managedStore::ValueType;
std::shared_ptr<ValueType> CreateMockSubtreeResponse() {
MapperGetSubTreeResponse mockSubtreeResponse{{std::make_pair(
"/xyz/openbmc_project/inventory/system/chassis/motherboard/pcieslot9",
MapperServiceMap{{std::make_pair(
"xyz.openbmc_project.Smbios.MDR_V2",
std::vector<std::string>{
"xyz.openbmc_project.Inventory.Item.PCIeSlot",
"xyz.openbmc_project.Inventory.Connector.Embedded",
"xyz.openbmc_project.Inventory.Decorator.LocationCode",
"xyz.openbmc_project.Inventory.Item",
"xyz.openbmc_project.Association.Definitions"})}})}};
return managedStore::MockManagedStoreTest::CreateValueType(
std::move(mockSubtreeResponse));
}
std::shared_ptr<ValueType> CreateAssociatedSubtreeResponse() {
MapperGetSubTreeResponse mockSubtreeResponse{{std::make_pair(
"/xyz/openbmc_project/inventory/system/board/platform1",
MapperServiceMap{{std::make_pair(
"xyz.openbmc_project.EntityManager",
std::vector<std::string>{
"xyz.openbmc_project.Inventory.Decorator.Asset",
"xyz.openbmc_project.EntityManager",
"xyz.openbmc_project.Inventory.Item.System",
"xyz.openbmc_project.Inventory.Item.Board.Motherboard",
"xyz.openbmc_project.Inventory.Item",
"xyz.openbmc_project.Inventory.Item.Board"})}})}};
return managedStore::MockManagedStoreTest::CreateValueType(
std::move(mockSubtreeResponse));
}
DBusPropertiesMap CreateSlotTypeDBusPropertiesMap() {
return DBusPropertiesMap({std::make_pair(
"SlotType",
DbusVariantType(
"xyz.openbmc_project.Inventory.Item.PCIeSlot.SlotTypes.M_2"))});
}
TEST_F(SnapshotFixture, GetPCIeSlotsReturnsCorrectResponse) {
std::string chassisId = "platform1";
std::string path =
"/xyz/openbmc_project/inventory/system/chassis/motherboard/pcieslot9";
// Looking for Key:
// kManagedSubtree|/xyz/openbmc_project/inventory|0|xyz.openbmc_project.Inventory.Item.PCIeSlot
KeyType key(ManagedType::kManagedSubtree, "/xyz/openbmc_project/inventory", 0,
{"xyz.openbmc_project.Inventory.Item.PCIeSlot"});
ASSERT_TRUE(
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(key, CreateMockSubtreeResponse())
.ok());
KeyType associationkey(ManagedType::kManagedProperty,
"xyz.openbmc_project.ObjectMapper",
sdbusplus::message::object_path(path + "/chassis"),
"xyz.openbmc_project.Association", "endpoints");
std::shared_ptr<ValueType> mockAssociationEndpoint =
managedStore::MockManagedStoreTest::CreateValueType<
dbus::utility::DbusVariantType>(std::vector<std::string>{
"/xyz/openbmc_project/inventory/system/board/platform1"});
ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(associationkey,
mockAssociationEndpoint)
.ok());
std::string locationCode = "M2_0";
KeyType locationkey(
ManagedType::kManagedProperty, "xyz.openbmc_project.Smbios.MDR_V2",
sdbusplus::message::object_path(path),
"xyz.openbmc_project.Inventory.Decorator.LocationCode", "LocationCode");
std::shared_ptr<ValueType> mockLocationCode =
managedStore::MockManagedStoreTest::CreateValueType(locationCode);
ASSERT_TRUE(
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(locationkey, mockLocationCode)
.ok());
bool present = true;
KeyType presencekey(ManagedType::kManagedProperty,
"xyz.openbmc_project.Smbios.MDR_V2",
sdbusplus::message::object_path(path),
"xyz.openbmc_project.Inventory.Item", "Present");
std::shared_ptr<ValueType> mockPresence =
managedStore::MockManagedStoreTest::CreateValueType(present);
ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(presencekey, mockPresence)
.ok());
KeyType keySlot(ManagedType::kManagedPropertyMap,
"xyz.openbmc_project.Smbios.MDR_V2",
sdbusplus::message::object_path(path),
"xyz.openbmc_project.Inventory.Item.PCIeSlot", "SlotType");
std::shared_ptr<ValueType> slotType =
CreateValueType(CreateSlotTypeDBusPropertiesMap());
EXPECT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(keySlot, slotType)
.ok());
KeyType getAssociatedSubTreeKey(
ManagedType::kManagedAssociatedSubtree, path + "/chassis",
"/xyz/openbmc_project/inventory", 0,
{"xyz.openbmc_project.Inventory.Item.Board",
"xyz.openbmc_project.Inventory.Item.Chassis"});
ASSERT_TRUE(
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore())
->upsertMockObjectIntoManagedStore(getAssociatedSubTreeKey,
CreateAssociatedSubtreeResponse())
.ok());
handlePCIeSlotCollectionGet(app_, CreateRequest(), share_async_resp_,
chassisId);
RunIoUntilDone();
LOG(INFO) << share_async_resp_->res.jsonValue.dump(2);
EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
nlohmann::json& json = share_async_resp_->res.jsonValue;
EXPECT_EQ(json["@odata.id"],
"/redfish/v1/Chassis/" + chassisId + "/PCIeSlots");
EXPECT_EQ(json["@odata.type"], "#PCIeSlots.v1_4_1.PCIeSlots");
EXPECT_EQ(json["Name"], "PCIe Slot Information");
EXPECT_EQ(json["Id"], "1");
EXPECT_TRUE(json["Slots"].is_array());
EXPECT_EQ(json["Slots"][0]["Status"]["State"], "Enabled");
EXPECT_EQ(json["Slots"][0]["Location"]["PartLocation"]["ServiceLabel"],
"M2_0");
}
} // namespace
} // namespace redfish