| #include "network_adapter.hpp" |
| |
| #include <memory> |
| #include <vector> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| #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::DBusInteracesMap; |
| using ::dbus::utility::DBusPropertiesMap; |
| using ::dbus::utility::DbusVariantType; |
| using ::dbus::utility::ManagedObjectType; |
| using ::dbus::utility::MapperGetSubTreePathsResponse; |
| using ::managedStore::KeyType; |
| using ::managedStore::ManagedType; |
| using ::managedStore::ValueType; |
| using ::testing::Contains; |
| |
| MapperGetSubTreePathsResponse CreateMockNcsiSubTree() { |
| return MapperGetSubTreePathsResponse( |
| {"/xyz/openbmc_project/inventory/system/cable/NcsiCable/ncsi"}); |
| } |
| |
| TEST_F(SnapshotFixture, GetNetworkAdaptersReturnsCorrectResponse) { |
| handleChassisNetworkAdapterCollectionGetSysfs(share_async_resp_, |
| "chassis1V2ND"); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters"); |
| EXPECT_EQ(json["@odata.type"], |
| "#NetworkAdapterCollection.NetworkAdapterCollection"); |
| EXPECT_EQ(json["Name"], |
| "Network adapter Collection for chassis chassis1V2ND"); |
| EXPECT_THAT(json["Members"], |
| Contains(nlohmann::json( |
| {{"@odata.id", |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0"}}))); |
| EXPECT_EQ(json["Members@odata.count"], 1); |
| } |
| |
| TEST_F(SnapshotFixture, GetNetworkAdapterReturnsCorrectResponse) { |
| handleChassisNetworkAdapterGetSysfs(share_async_resp_, "chassis1V2ND", "0"); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0"); |
| EXPECT_EQ(json["@odata.type"], "#NetworkAdapter.NetworkAdapter"); |
| EXPECT_EQ(json["Name"], "Network adapter"); |
| EXPECT_EQ(json["Ports"]["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports"); |
| } |
| |
| TEST_F(SnapshotFixture, GetPortCollectionReturnsCorrectResponse) { |
| handleNetworkPortCollectionGetSysfs(share_async_resp_, "chassis1V2ND", "0"); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports"); |
| EXPECT_EQ(json["@odata.type"], "#PortCollection.PortCollection"); |
| EXPECT_THAT(json["Members"], |
| Contains(nlohmann::json({{"@odata.id", |
| "/redfish/v1/Chassis/chassis1V2ND/" |
| "NetworkAdapters/0/Ports/ncsi"}}))); |
| EXPECT_THAT(json["Members"], |
| Contains(nlohmann::json({{"@odata.id", |
| "/redfish/v1/Chassis/chassis1V2ND/" |
| "NetworkAdapters/0/Ports/gusbem0"}}))); |
| EXPECT_THAT(json["Members"], |
| Contains(nlohmann::json({{"@odata.id", |
| "/redfish/v1/Chassis/chassis1V2ND/" |
| "NetworkAdapters/0/Ports/front"}}))); |
| EXPECT_THAT( |
| json["Members"], |
| Contains(nlohmann::json({{"@odata.id", |
| "/redfish/v1/Chassis/chassis1V2ND/" |
| "NetworkAdapters/0/Ports/enu1u1u1u1"}}))); |
| EXPECT_EQ(json["Members@odata.count"], 4); |
| EXPECT_EQ(json["Name"], "Network ports"); |
| } |
| |
| TEST_F(SnapshotFixture, GetPortsReturnsCorrectResponse1) { |
| KeyType key(ManagedType::kManagedSubtreePaths, |
| "/xyz/openbmc_project/inventory/system/cable/", 0, |
| {"xyz.openbmc_project.Configuration.Port"}); |
| std::shared_ptr<ValueType> mockNcsiSubTreeResponse = |
| managedStore::MockManagedStoreTest::CreateValueType( |
| CreateMockNcsiSubTree()); |
| ASSERT_TRUE( |
| dynamic_cast<managedStore::MockSerializedManagedObjectStore*>( |
| managedStore::GetManagedObjectStore()) |
| ->upsertMockObjectIntoManagedStore(key, mockNcsiSubTreeResponse) |
| .ok()); |
| |
| handleNetworkPortGetSysfs(share_async_resp_, "chassis1V2ND", "0", "ncsi"); |
| |
| RunIoUntilDone(); |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/ncsi"); |
| EXPECT_EQ(json["@odata.type"], "#Port.Port"); |
| EXPECT_EQ(json["Id"], "ncsi"); |
| EXPECT_EQ(json["CurrentSpeedGbps"], 0.1); |
| EXPECT_EQ(json["Name"], "ncsi"); |
| EXPECT_THAT(json["Ethernet"]["AssociatedMACAddresses"], |
| Contains("24:95:2f:8f:18:0c")); |
| EXPECT_EQ(json["Ethernet"]["AssociatedMACAddresses"].size(), 1); |
| EXPECT_EQ(json["LinkState"], "Enabled"); |
| EXPECT_EQ(json["LinkStatus"], "LinkUp"); |
| EXPECT_EQ(json["Oem"]["Google"]["ConnectionPath"], "SIDE"); |
| EXPECT_EQ(json["Location"]["PartLocation"]["ServiceLabel"], "NCSI"); |
| EXPECT_EQ(json["Location"]["Oem"]["Google"]["Devpath"], "/phys/NCSI"); |
| EXPECT_EQ( |
| json["Metrics"]["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/ncsi/Metrics"); |
| } |
| |
| TEST_F(SnapshotFixture, GetPortsReturnsCorrectResponse2) { |
| handleNetworkPortGetSysfs(share_async_resp_, "chassis1V2ND", "0", "gusbem0"); |
| RunIoUntilDone(); |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/gusbem0"); |
| EXPECT_EQ(json["@odata.type"], "#Port.Port"); |
| EXPECT_EQ(json["Id"], "gusbem0"); |
| EXPECT_EQ(json["CurrentSpeedGbps"], 0.0); |
| EXPECT_EQ(json["Name"], "gusbem0"); |
| EXPECT_THAT(json["Ethernet"]["AssociatedMACAddresses"], |
| Contains("3a:1b:f6:ef:56:62")); |
| EXPECT_EQ(json["Ethernet"]["AssociatedMACAddresses"].size(), 1); |
| EXPECT_EQ(json["LinkState"], "Enabled"); |
| EXPECT_EQ(json["LinkStatus"], "LinkUp"); |
| EXPECT_EQ(json["Metrics"]["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/gusbem0/" |
| "Metrics"); |
| } |
| |
| TEST_F(SnapshotFixture, GetPortsReturnsCorrectResponse3) { |
| KeyType key( |
| ManagedType::kManagedProperty, "xyz.openbmc_project.EntityManager", |
| sdbusplus::message::object_path( |
| "/xyz/openbmc_project/inventory/system/board/chassis1V2ND/BmcNet"), |
| "xyz.openbmc_project.Configuration.BmcNet", "LocationCode"); |
| std::shared_ptr<ValueType> mockBmcNetLocation = |
| managedStore::MockManagedStoreTest::CreateValueType("1G_LAN"); |
| ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>( |
| managedStore::GetManagedObjectStore()) |
| ->upsertMockObjectIntoManagedStore(key, mockBmcNetLocation) |
| .ok()); |
| |
| handleNetworkPortGetSysfs(share_async_resp_, "chassis1V2ND", "0", "front"); |
| RunIoUntilDone(); |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/front"); |
| EXPECT_EQ(json["@odata.type"], "#Port.Port"); |
| EXPECT_EQ(json["Id"], "front"); |
| EXPECT_EQ(json["CurrentSpeedGbps"], 1); |
| EXPECT_EQ(json["Name"], "front"); |
| EXPECT_THAT(json["Ethernet"]["AssociatedMACAddresses"], |
| Contains("24:95:2f:8f:18:0c")); |
| EXPECT_EQ(json["Ethernet"]["AssociatedMACAddresses"].size(), 1); |
| EXPECT_EQ(json["LinkState"], "Enabled"); |
| EXPECT_EQ(json["LinkStatus"], "LinkUp"); |
| EXPECT_EQ(json["Oem"]["Google"]["ConnectionPath"], "DIRECT"); |
| EXPECT_EQ(json["Location"]["PartLocation"]["ServiceLabel"], "1G_LAN"); |
| EXPECT_EQ(json["Location"]["Oem"]["Google"]["Devpath"], |
| "/phys/DC_SCM/1G_LAN"); |
| EXPECT_EQ( |
| json["Metrics"]["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/front/Metrics"); |
| } |
| |
| TEST_F(SnapshotFixture, GetPortsReturnsCorrectResponse4) { |
| auto* mockStore = |
| dynamic_cast<managedStore::MockSerializedManagedObjectStore*>( |
| managedStore::GetManagedObjectStore()); |
| |
| // Mock BmcNet Side Configuration for ConnectionPath |
| managedStore::KeyType bmcNetSideKey( |
| ManagedType::kManagedPropertyMap, "xyz.openbmc_project.EntityManager", |
| sdbusplus::message::object_path("/xyz/openbmc_project/inventory/system/" |
| "board/chassis1V2ND/enu1u1u1u1"), |
| "xyz.openbmc_project.Configuration.BmcNet_Side", ""); |
| dbus::utility::DBusPropertiesMap bmcNetSideProperties; |
| bmcNetSideProperties.emplace_back( |
| "LocationCode", dbus::utility::DbusVariantType("SIDEBAND_LOC")); |
| bmcNetSideProperties.emplace_back( |
| "PartLocationContext", |
| dbus::utility::DbusVariantType("SIDEBAND_CONTEXT")); |
| EXPECT_TRUE(mockStore |
| ->upsertMockObjectIntoManagedStore( |
| bmcNetSideKey, |
| managedStore::MockManagedStoreTest::CreateValueType( |
| bmcNetSideProperties)) |
| .ok()); |
| |
| handleNetworkPortGetSysfs(share_async_resp_, "chassis1V2ND", "0", |
| "enu1u1u1u1"); |
| |
| RunIoUntilDone(); |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["Id"], "enu1u1u1u1"); |
| EXPECT_EQ(json["Oem"]["Google"]["ConnectionPath"], "SIDEBAND"); |
| EXPECT_EQ(json["Location"]["PartLocation"]["ServiceLabel"], "SIDEBAND_LOC"); |
| EXPECT_EQ(json["Location"]["PartLocationContext"], "SIDEBAND_CONTEXT"); |
| } |
| |
| TEST_F(SnapshotFixture, GetNetworkPortMetricReturnsCorrectResponse1) { |
| handleNetworkPortMetricGetSysfs(share_async_resp_, "chassis1V2ND", "0", |
| "ncsi"); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ( |
| json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/ncsi/Metrics"); |
| EXPECT_EQ(json["@odata.type"], "#PortMetrics.PortMetrics"); |
| EXPECT_EQ(json["Name"], "Network port metrics"); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["CarrierChanges"], 1); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["RXCRCErrors"], 4); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["RXErrors"], 4); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["ReceivedPackets"], 3016523); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["ReceivedPacketsDropped"], 0); |
| } |
| |
| TEST_F(SnapshotFixture, GetNetworkPortMetricReturnsCorrectResponse2) { |
| handleNetworkPortMetricGetSysfs(share_async_resp_, "chassis1V2ND", "0", |
| "gusbem0"); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ(json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/gusbem0/" |
| "Metrics"); |
| EXPECT_EQ(json["@odata.type"], "#PortMetrics.PortMetrics"); |
| EXPECT_EQ(json["Name"], "Network port metrics"); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["CarrierChanges"], 4); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["RXCRCErrors"], 0); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["RXErrors"], 0); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["ReceivedPackets"], 13218); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["ReceivedPacketsDropped"], 0); |
| } |
| |
| TEST_F(SnapshotFixture, GetNetworkPortMetricReturnsCorrectResponse3) { |
| handleNetworkPortMetricGetSysfs(share_async_resp_, "chassis1V2ND", "0", |
| "front"); |
| |
| nlohmann::json& json = share_async_resp_->res.jsonValue; |
| EXPECT_EQ( |
| json["@odata.id"], |
| "/redfish/v1/Chassis/chassis1V2ND/NetworkAdapters/0/Ports/front/Metrics"); |
| EXPECT_EQ(json["@odata.type"], "#PortMetrics.PortMetrics"); |
| EXPECT_EQ(json["Name"], "Network port metrics"); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["CarrierChanges"], 1); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["RXCRCErrors"], 0); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["RXErrors"], 0); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["ReceivedPackets"], 458937); |
| EXPECT_EQ(json["Oem"]["Google"]["Networking"]["ReceivedPacketsDropped"], 0); |
| } |
| |
| } // namespace |
| } // namespace redfish |