blob: 7eb455d4b3452e62ce1bdea314310b4e261c801e [file]
#include "network_adapter.hpp"
#include <cstdint>
#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);
}
TEST_F(SnapshotFixture, GetNetworkPortMetricDBusReturnsCorrectResponse) {
auto* mockStore =
dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
managedStore::GetManagedObjectStore());
// 1. Mock port Inventory SubTree
managedStore::KeyType portSubTreeKey(
ManagedType::kManagedSubtree, "/xyz/openbmc_project/inventory", 0,
{"xyz.openbmc_project.Inventory.Item.Port"});
dbus::utility::MapperGetSubTreeResponse portSubTree = {
{"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1",
{{"xyz.openbmc_project.NSM",
{"xyz.openbmc_project.Inventory.Item.Port"}}}}};
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
portSubTreeKey,
managedStore::MockManagedStoreTest::CreateValueType(portSubTree))
.ok());
// 2. Mock PortECC properties
managedStore::KeyType eccKey(
ManagedType::kManagedPropertyMap, "xyz.openbmc_project.NSM",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1"),
"xyz.openbmc_project.Metrics.PortECC", "");
dbus::utility::DBusPropertiesMap eccProperties;
eccProperties.emplace_back("CorrectedBits",
dbus::utility::DbusVariantType(uint64_t{42}));
eccProperties.emplace_back("SymbolErrorRXBytes",
dbus::utility::DbusVariantType(uint64_t{7}));
std::vector<uint32_t> perLaneCounters = {10, 20, 30, 40};
eccProperties.emplace_back("RawErrorsPerLane",
dbus::utility::DbusVariantType(perLaneCounters));
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
eccKey, managedStore::MockManagedStoreTest::CreateValueType(
eccProperties))
.ok());
// 3. Mock PortPacketCounters properties
managedStore::KeyType packetKey(
ManagedType::kManagedPropertyMap, "xyz.openbmc_project.NSM",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1"),
"xyz.openbmc_project.Metrics.PortPacketCounters", "");
dbus::utility::DBusPropertiesMap packetProperties;
packetProperties.emplace_back("RXBroadcastPkts",
dbus::utility::DbusVariantType(uint64_t{100}));
packetProperties.emplace_back("RXMulticastPkts",
dbus::utility::DbusVariantType(uint64_t{200}));
packetProperties.emplace_back("RXUnicastPkts",
dbus::utility::DbusVariantType(uint64_t{300}));
packetProperties.emplace_back("TXBroadcastPkts",
dbus::utility::DbusVariantType(uint64_t{400}));
packetProperties.emplace_back("TXMulticastPkts",
dbus::utility::DbusVariantType(uint64_t{500}));
packetProperties.emplace_back("TXUnicastPkts",
dbus::utility::DbusVariantType(uint64_t{600}));
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
packetKey, managedStore::MockManagedStoreTest::CreateValueType(
packetProperties))
.ok());
// 4. Mock EthPort properties
managedStore::KeyType ethKey(
ManagedType::kManagedPropertyMap, "xyz.openbmc_project.NSM",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1"),
"xyz.openbmc_project.Metrics.EthPort", "");
dbus::utility::DBusPropertiesMap ethProperties;
ethProperties.emplace_back("RXFCSErrors",
dbus::utility::DbusVariantType(uint64_t{3}));
ethProperties.emplace_back("RXAlignmentErrors",
dbus::utility::DbusVariantType(uint64_t{1}));
ethProperties.emplace_back("PauseXOFFFramesReceived",
dbus::utility::DbusVariantType(uint64_t{5}));
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
ethKey, managedStore::MockManagedStoreTest::CreateValueType(
ethProperties))
.ok());
// 5. Mock IBPort properties
managedStore::KeyType ibKey(
ManagedType::kManagedPropertyMap, "xyz.openbmc_project.NSM",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1"),
"xyz.openbmc_project.Metrics.IBPort", "");
dbus::utility::DBusPropertiesMap ibProperties;
ibProperties.emplace_back("BitErrorRate",
dbus::utility::DbusVariantType(double{1e-12}));
ibProperties.emplace_back("LinkDownCount",
dbus::utility::DbusVariantType(uint64_t{2}));
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
ibKey,
managedStore::MockManagedStoreTest::CreateValueType(ibProperties))
.ok());
// 6. Mock PortMetricsOem2 properties
managedStore::KeyType oem2Key(
ManagedType::kManagedPropertyMap, "xyz.openbmc_project.NSM",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1"),
"xyz.openbmc_project.Metrics.PortMetricsOem2", "");
dbus::utility::DBusPropertiesMap oem2Properties;
oem2Properties.emplace_back(
"RXBytes", dbus::utility::DbusVariantType(uint64_t{1048576}));
oem2Properties.emplace_back(
"TXBytes", dbus::utility::DbusVariantType(uint64_t{2097152}));
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
oem2Key, managedStore::MockManagedStoreTest::CreateValueType(
oem2Properties))
.ok());
// 7. Mock PCIeECC properties
managedStore::KeyType pcieKey(
ManagedType::kManagedPropertyMap, "xyz.openbmc_project.NSM",
sdbusplus::message::object_path(
"/xyz/openbmc_project/inventory/system/chassis/CX9_0/NetworkAdapters/"
"CX9_0_NIC_1/Ports/Port_1"),
"xyz.openbmc_project.PCIe.PCIeECC", "");
dbus::utility::DBusPropertiesMap pcieProperties;
pcieProperties.emplace_back("ceCount",
dbus::utility::DbusVariantType(uint64_t{9}));
pcieProperties.emplace_back("ueCount",
dbus::utility::DbusVariantType(uint64_t{0}));
EXPECT_TRUE(
mockStore
->upsertMockObjectIntoManagedStore(
pcieKey, managedStore::MockManagedStoreTest::CreateValueType(
pcieProperties))
.ok());
handleNetworkPortMetricGetDBus(share_async_resp_, "CX9_0", "CX9_0_NIC_1",
"Port_1");
RunIoUntilDone();
nlohmann::json& json = share_async_resp_->res.jsonValue;
EXPECT_EQ(
json["@odata.id"],
"/redfish/v1/Chassis/CX9_0/NetworkAdapters/CX9_0_NIC_1/Ports/Port_1/"
"Metrics");
EXPECT_EQ(json["@odata.type"], "#PortMetrics.v1_3_0.PortMetrics");
EXPECT_EQ(json["Name"], "Port_1 Metrics");
EXPECT_EQ(json["Id"], "Metrics");
EXPECT_EQ(json["CorrectableBitErrors"], 42);
EXPECT_EQ(json["SymbolErrors"], 7);
EXPECT_EQ(json["RXBroadcastPackets"], 100);
EXPECT_EQ(json["RXMulticastPackets"], 200);
EXPECT_EQ(json["RXUnicastPackets"], 300);
EXPECT_EQ(json["TXBroadcastPackets"], 400);
EXPECT_EQ(json["TXMulticastPackets"], 500);
EXPECT_EQ(json["TXUnicastPackets"], 600);
EXPECT_EQ(json["RXFCSErrors"], 3);
EXPECT_EQ(json["RXAlignmentErrors"], 1);
EXPECT_EQ(json["RXBytes"], 1048576);
EXPECT_EQ(json["TXBytes"], 2097152);
EXPECT_EQ(json["Oem"]["Google"]["TransceiverTelemetry"]["FECCorrectedCount"],
42);
EXPECT_EQ(
json["Oem"]["Google"]["TransceiverTelemetry"]["FECUncorrectableCount"],
7);
EXPECT_EQ(json["Oem"]["Google"]["TransceiverTelemetry"]["PerLaneFECCounters"],
(std::vector<uint64_t>{10, 20, 30, 40}));
EXPECT_DOUBLE_EQ(json["Oem"]["Google"]["TransceiverTelemetry"]["BitErrorRate"]
.get<double>(),
1e-12);
EXPECT_EQ(json["LinkDownCount"], 2);
EXPECT_EQ(json["Oem"]["Google"]["PCIeErrors"]["ceCount"], 9);
EXPECT_EQ(json["Oem"]["Google"]["PCIeErrors"]["ueCount"], 0);
}
} // namespace
} // namespace redfish