| #include "pcie.hpp" |
| |
| #include <cstddef> |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #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 "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.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::MapperGetSubTreePathsResponse; |
| using ::dbus::utility::MapperGetSubTreeResponse; |
| using ::managedStore::KeyType; |
| using ::managedStore::ValueType; |
| using ::managedStore::ManagedType::kManagedPropertyMap; |
| using ::managedStore::ManagedType::kManagedSubtreePaths; |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, GetPCIeDeviceSuccess) { |
| handleSystemPCIeDeviceGet(app_, CreateRequest(), share_async_resp_, "system", |
| "chassis8_1_Link_0"); |
| |
| RunIoUntilDone(); |
| |
| LOG(INFO) << share_async_resp_->res.jsonValue.dump(2); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Systems/system/PCIeDevices/chassis8_1_Link_0"); |
| EXPECT_EQ(json["@odata.type"], "#PCIeDevice.v1_4_0.PCIeDevice"); |
| EXPECT_EQ(json["Id"], "chassis8_1_Link_0"); |
| EXPECT_EQ(json["Name"], "PCIe Device"); |
| EXPECT_EQ(json["Manufacturer"], "Manufacturer"); |
| EXPECT_EQ(json["DeviceType"], "SingleFunction"); |
| |
| nlohmann::json& functions = json["PCIeFunctions"]; |
| EXPECT_EQ( |
| functions["@odata.id"], |
| "/redfish/v1/Systems/system/PCIeDevices/chassis8_1_Link_0/PCIeFunctions"); |
| |
| nlohmann::json& interface = json["PCIeInterface"]; |
| EXPECT_EQ(interface.size(), 2); |
| EXPECT_EQ(interface["PCIeType"], "Gen5"); |
| EXPECT_EQ(interface["LanesInUse"], 8); |
| |
| nlohmann::json& chassis = json["Links"]["Chassis"]; |
| EXPECT_EQ(chassis.size(), 1); |
| EXPECT_EQ(chassis["@odata.id"], "/redfish/v1/Chassis/chassis8_1"); |
| |
| EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok); |
| } |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, GetPCIeDeviceZeroLanesInUse) { |
| KeyType key(kManagedPropertyMap, "xyz.openbmc_project.Hb16Manager", |
| sdbusplus::message::object_path( |
| "/xyz/openbmc_project/inventory/pcie/chassis8_1_Link_0"), |
| "xyz.openbmc_project.Inventory.Item.PCIeDevice"); |
| ASSERT_TRUE( |
| dynamic_cast<managedStore::MockSerializedManagedObjectStore*>( |
| managedStore::GetManagedObjectStore()) |
| ->upsertMockObjectIntoManagedStore( |
| key, |
| managedStore::MockManagedStoreTest::CreateValueType( |
| DBusPropertiesMap({ |
| std::make_pair("Manufacturer", |
| DbusVariantType("Manufacturer")), |
| std::make_pair("DeviceType", |
| DbusVariantType("SingleFunction")), |
| std::make_pair("LanesInUse", |
| DbusVariantType(static_cast<size_t>(0))), |
| std::make_pair( |
| "GenerationInUse", |
| DbusVariantType("xyz.openbmc_project.Inventory.Item." |
| "PCIeSlot.Generations.Gen5")), |
| }))) |
| .ok()); |
| |
| handleSystemPCIeDeviceGet(app_, CreateRequest(), share_async_resp_, "system", |
| "chassis8_1_Link_0"); |
| |
| RunIoUntilDone(); |
| |
| LOG(INFO) << share_async_resp_->res.jsonValue.dump(2); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json, nlohmann::json::parse(R"({ |
| "@odata.id": "/redfish/v1/Systems/system/PCIeDevices/chassis8_1_Link_0", |
| "@odata.type": "#PCIeDevice.v1_4_0.PCIeDevice", |
| "DeviceType": "SingleFunction", |
| "Id": "chassis8_1_Link_0", |
| "Links": { |
| "Chassis": { |
| "@odata.id": "/redfish/v1/Chassis/chassis8_1" |
| } |
| }, |
| "Manufacturer": "Manufacturer", |
| "Name": "PCIe Device", |
| "PCIeFunctions": { |
| "@odata.id": "/redfish/v1/Systems/system/PCIeDevices/chassis8_1_Link_0/PCIeFunctions" |
| }, |
| "PCIeInterface": { |
| "LanesInUse": 0, |
| "PCIeType": "Gen5" |
| } |
| })")); |
| |
| EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok); |
| } |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, GetPCIeDeviceMissing) { |
| handleSystemPCIeDeviceGet(app_, CreateRequest(), share_async_resp_, "system", |
| "missing"); |
| |
| RunIoUntilDone(); |
| |
| LOG(INFO) << share_async_resp_->res.jsonValue.dump(2); |
| |
| EXPECT_EQ(share_async_resp_->res.result(), |
| boost::beast::http::status::not_found); |
| } |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, GetPCIeDeviceWrongSystem) { |
| handleSystemPCIeDeviceGet(app_, CreateRequest(), share_async_resp_, "asdf", |
| "chassis8_1_Link_0"); |
| |
| RunIoUntilDone(); |
| |
| LOG(INFO) << share_async_resp_->res.jsonValue.dump(2); |
| |
| EXPECT_EQ(share_async_resp_->res.result(), |
| boost::beast::http::status::not_found); |
| } |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, getPCIeFunctionCollectionAvailable) { |
| handleSystemPCIeFunctionCollectionGet( |
| app_, CreateRequest(), share_async_resp_, "system", "chassis8_1_Link_0"); |
| RunIoUntilDone(); |
| |
| LOG(INFO) << share_async_resp_->res.jsonValue.dump(2); |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ( |
| json["@odata.id"], |
| "/redfish/v1/Systems/system/PCIeDevices/chassis8_1_Link_0/PCIeFunctions"); |
| EXPECT_EQ(json["@odata.type"], |
| "#PCIeFunctionCollection.PCIeFunctionCollection"); |
| EXPECT_EQ(json["Name"], "PCIe Function Collection"); |
| |
| EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok); |
| } |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, getPCIeFunctionGet) { |
| KeyType key(kManagedPropertyMap, "xyz.openbmc_project.Hb16Manager", |
| sdbusplus::message::object_path( |
| "/xyz/openbmc_project/inventory/pcie/chassis8_1_Link_0"), |
| "xyz.openbmc_project.Inventory.Item.PCIeDevice"); |
| ASSERT_TRUE( |
| dynamic_cast<managedStore::MockSerializedManagedObjectStore*>( |
| managedStore::GetManagedObjectStore()) |
| ->upsertMockObjectIntoManagedStore( |
| key, managedStore::MockManagedStoreTest::CreateValueType( |
| DBusPropertiesMap({std::make_pair( |
| "Function1DeviceId", DbusVariantType("OK"))}))) |
| .ok()); |
| |
| handleSystemPCIeFunctionGet(app_, CreateRequest(), share_async_resp_, |
| "system", "chassis8_1_Link_0", "1"); |
| RunIoUntilDone(); |
| |
| LOG(INFO) << share_async_resp_->res.jsonValue.dump(2); |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Systems/system/PCIeDevices/chassis8_1_Link_0/" |
| "PCIeFunctions/1"); |
| EXPECT_EQ(json["@odata.type"], "#PCIeFunction.v1_2_0.PCIeFunction"); |
| EXPECT_EQ(json["Name"], "PCIe Function"); |
| |
| EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok); |
| } |
| |
| MapperGetSubTreePathsResponse CreateMockSystemSubTree() { |
| return MapperGetSubTreePathsResponse( |
| {"/xyz/openbmc_project/inventory/system/board/platform5/system1", |
| "/xyz/openbmc_project/inventory/system/board/platform5/system2"}); |
| } |
| |
| TEST_F(SnapshotFixture_Platform5_Config7, GetMultiHostsPCIeDeviceSuccess) { |
| std::string systemName = "system1"; |
| |
| KeyType key1(kManagedSubtreePaths, "/", 0, |
| {"xyz.openbmc_project.Inventory.Item.System"}); |
| std::shared_ptr<ValueType> mockSystemSubTreeResponse = |
| managedStore::MockManagedStoreTest::CreateValueType( |
| CreateMockSystemSubTree()); |
| ASSERT_TRUE( |
| dynamic_cast<managedStore::MockSerializedManagedObjectStore*>( |
| managedStore::GetManagedObjectStore()) |
| ->upsertMockObjectIntoManagedStore(key1, mockSystemSubTreeResponse) |
| .ok()); |
| |
| handlePCIeDeviceCollectionGet(app_, CreateRequest(), share_async_resp_, |
| systemName); |
| |
| 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/Systems/system1/PCIeDevices"); |
| EXPECT_EQ(json["@odata.type"], "#PCIeDeviceCollection.PCIeDeviceCollection"); |
| EXPECT_EQ(json["Name"], "PCIe Device Collection"); |
| } |
| |
| } // namespace |
| } // namespace redfish |