blob: e930d052a4d173a8be87bff670b94e39834194e1 [file]
#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