blob: eca1357f62924ca5178c9ed0a16041cfd8576244 [file]
#include "common/utils.hpp"
#include "platform-mc/dbus_impl_fru.hpp"
#include "platform-mc/terminus.hpp"
#include <libpldm/entity.h>
#include <sdbusplus/bus.hpp>
#include <gtest/gtest.h>
TEST(TerminusTest, supportedTypeTest)
{
auto event = sdeventplus::Event::get_default();
auto t1 = pldm::platform_mc::Terminus(1, 1 << PLDM_BASE, event);
auto t2 = pldm::platform_mc::Terminus(
2, 1 << PLDM_BASE | 1 << PLDM_PLATFORM, event);
EXPECT_EQ(true, t1.doesSupportType(PLDM_BASE));
EXPECT_EQ(false, t1.doesSupportType(PLDM_PLATFORM));
EXPECT_EQ(true, t2.doesSupportType(PLDM_BASE));
EXPECT_EQ(true, t2.doesSupportType(PLDM_PLATFORM));
}
TEST(TerminusTest, getTidTest)
{
auto event = sdeventplus::Event::get_default();
const pldm_tid_t tid = 1;
auto t1 = pldm::platform_mc::Terminus(tid, 1 << PLDM_BASE, event);
EXPECT_EQ(tid, t1.getTid());
}
TEST(TerminusTest, parseSensorAuxiliaryNamesPDRTest)
{
auto event = sdeventplus::Event::get_default();
auto t1 = pldm::platform_mc::Terminus(
1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM, event);
std::vector<uint8_t> pdr1{
0x0,
0x0,
0x0,
0x1, // record handle
0x1, // PDRHeaderVersion
PLDM_SENSOR_AUXILIARY_NAMES_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
0x0,
21, // dataLength
0,
0x0, // PLDMTerminusHandle
0x1,
0x0, // sensorID
0x1, // sensorCount
0x1, // nameStringCount
'e',
'n',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'1',
0x0,
0x0 // sensorName
};
std::vector<uint8_t> pdr2{
0x1, 0x0, 0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
0x1,
0x0, // recordChangeNumber
0x11,
0, // dataLength
/* Entity Auxiliary Names PDR Data*/
3,
0x80, // entityType system software
0x1,
0x0, // Entity instance number =1
0,
0, // Overall system
0, // shared Name Count one name only
01, // nameStringCount
0x65, 0x6e, 0x00,
0x00, // Language Tag "en"
0x53, 0x00, 0x30, 0x00,
0x00 // Entity Name "S0"
};
t1.pdrs.emplace_back(pdr1);
t1.pdrs.emplace_back(pdr2);
t1.parseTerminusPDRs();
auto sensorAuxNames = t1.getSensorAuxiliaryNames(0);
EXPECT_EQ(nullptr, sensorAuxNames);
sensorAuxNames = t1.getSensorAuxiliaryNames(1);
EXPECT_NE(nullptr, sensorAuxNames);
const auto& [sensorId, sensorCnt, names] = *sensorAuxNames;
EXPECT_EQ(1, sensorId);
EXPECT_EQ(1, sensorCnt);
EXPECT_EQ(1, names.size());
EXPECT_EQ(1, names[0].size());
EXPECT_EQ("en", names[0][0].first);
EXPECT_EQ("TEMP1", names[0][0].second);
EXPECT_EQ(2, t1.pdrs.size());
EXPECT_EQ("S0", t1.getTerminusName().value());
}
TEST(TerminusTest, parseSensorAuxiliaryMultiNamesPDRTest)
{
auto event = sdeventplus::Event::get_default();
auto t1 = pldm::platform_mc::Terminus(
1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM, event);
std::vector<uint8_t> pdr1{
0x0,
0x0,
0x0,
0x1, // record handle
0x1, // PDRHeaderVersion
PLDM_SENSOR_AUXILIARY_NAMES_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
0x0,
53, // dataLength
0,
0x0, // PLDMTerminusHandle
0x1,
0x0, // sensorID
0x1, // sensorCount
0x3, // nameStringCount
'e',
'n',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'1',
0x0,
0x0, // sensorName Temp1
'f',
'r',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'2',
0x0,
0x0, // sensorName Temp2
'f',
'r',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'1',
0x0,
'2',
0x0,
0x0 // sensorName Temp12
};
std::vector<uint8_t> pdr2{
0x1, 0x0, 0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
0x1,
0x0, // recordChangeNumber
0x11,
0, // dataLength
/* Entity Auxiliary Names PDR Data*/
3,
0x80, // entityType system software
0x1,
0x0, // Entity instance number =1
0,
0, // Overall system
0, // shared Name Count one name only
01, // nameStringCount
0x65, 0x6e, 0x00,
0x00, // Language Tag "en"
0x53, 0x00, 0x30, 0x00,
0x00 // Entity Name "S0"
};
t1.pdrs.emplace_back(pdr1);
t1.pdrs.emplace_back(pdr2);
t1.parseTerminusPDRs();
auto sensorAuxNames = t1.getSensorAuxiliaryNames(0);
EXPECT_EQ(nullptr, sensorAuxNames);
sensorAuxNames = t1.getSensorAuxiliaryNames(1);
EXPECT_NE(nullptr, sensorAuxNames);
const auto& [sensorId, sensorCnt, names] = *sensorAuxNames;
EXPECT_EQ(1, sensorId);
EXPECT_EQ(1, sensorCnt);
EXPECT_EQ(1, names.size());
EXPECT_EQ(3, names[0].size());
EXPECT_EQ("en", names[0][0].first);
EXPECT_EQ("TEMP1", names[0][0].second);
EXPECT_EQ("fr", names[0][1].first);
EXPECT_EQ("TEMP2", names[0][1].second);
EXPECT_EQ("fr", names[0][2].first);
EXPECT_EQ("TEMP12", names[0][2].second);
EXPECT_EQ(2, t1.pdrs.size());
EXPECT_EQ("S0", t1.getTerminusName().value());
}
TEST(TerminusTest, parseSensorAuxiliaryNamesMultiSensorsPDRTest)
{
auto event = sdeventplus::Event::get_default();
auto t1 = pldm::platform_mc::Terminus(
1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM, event);
std::vector<uint8_t> pdr1{
0x0,
0x0,
0x0,
0x1, // record handle
0x1, // PDRHeaderVersion
PLDM_SENSOR_AUXILIARY_NAMES_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
0x0,
54, // dataLength
0,
0x0, // PLDMTerminusHandle
0x1,
0x0, // sensorID
0x2, // sensorCount
0x1, // nameStringCount
'e',
'n',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'1',
0x0,
0x0, // sensorName Temp1
0x2, // nameStringCount
'f',
'r',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'2',
0x0,
0x0, // sensorName Temp2
'f',
'r',
0x0, // nameLanguageTag
0x0,
'T',
0x0,
'E',
0x0,
'M',
0x0,
'P',
0x0,
'1',
0x0,
'2',
0x0,
0x0 // sensorName Temp12
};
std::vector<uint8_t> pdr2{
0x1, 0x0, 0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
0x1,
0x0, // recordChangeNumber
0x11,
0, // dataLength
/* Entity Auxiliary Names PDR Data*/
3,
0x80, // entityType system software
0x1,
0x0, // Entity instance number =1
0,
0, // Overall system
0, // shared Name Count one name only
01, // nameStringCount
0x65, 0x6e, 0x00,
0x00, // Language Tag "en"
0x53, 0x00, 0x30, 0x00,
0x00 // Entity Name "S0"
};
t1.pdrs.emplace_back(pdr1);
t1.pdrs.emplace_back(pdr2);
t1.parseTerminusPDRs();
auto sensorAuxNames = t1.getSensorAuxiliaryNames(0);
EXPECT_EQ(nullptr, sensorAuxNames);
sensorAuxNames = t1.getSensorAuxiliaryNames(1);
EXPECT_NE(nullptr, sensorAuxNames);
const auto& [sensorId, sensorCnt, names] = *sensorAuxNames;
EXPECT_EQ(1, sensorId);
EXPECT_EQ(2, sensorCnt);
EXPECT_EQ(2, names.size());
EXPECT_EQ(1, names[0].size());
EXPECT_EQ("en", names[0][0].first);
EXPECT_EQ("TEMP1", names[0][0].second);
EXPECT_EQ(2, names[1].size());
EXPECT_EQ("fr", names[1][0].first);
EXPECT_EQ("TEMP2", names[1][0].second);
EXPECT_EQ("fr", names[1][1].first);
EXPECT_EQ("TEMP12", names[1][1].second);
EXPECT_EQ(2, t1.pdrs.size());
EXPECT_EQ("S0", t1.getTerminusName().value());
}
TEST(TerminusTest, createPldmEntityTest)
{
auto& bus = pldm::utils::DBusHandler::getBus();
std::string basePath = "/xyz/openbmc_project/inventory/test/";
// Test all 7 entity type mappings produce non-null entities
struct EntityTestCase
{
uint16_t entityType;
const char* description;
};
// clang-format off
std::array<EntityTestCase, 10> testCases = {{
{PLDM_ENTITY_SYSTEM_CHASSIS, "chassis"},
{PLDM_ENTITY_PROC, "cpu"},
{PLDM_ENTITY_MEMORY_MODULE, "dimm"},
{PLDM_ENTITY_FAN, "fan"},
{PLDM_ENTITY_POWER_SUPPLY, "powersupply"},
{PLDM_ENTITY_GPU, "gpu/accelerator"},
{PLDM_ENTITY_ACCELERATOR, "accelerator"},
{PLDM_ENTITY_BOARD, "board"},
{PLDM_ENTITY_SYS_BOARD, "sysboard/board"},
{PLDM_ENTITY_CARD, "card/board"},
}};
// clang-format on
for (size_t i = 0; i < testCases.size(); i++)
{
auto path = basePath + std::to_string(i);
auto entity = pldm::dbus_api::createPldmEntity(bus, path,
testCases[i].entityType);
EXPECT_NE(entity, nullptr) << "Failed for " << testCases[i].description;
}
// Unknown entity type falls back to Board
auto fallback =
pldm::dbus_api::createPldmEntity(bus, basePath + "unknown", 0xFFFF);
EXPECT_NE(fallback, nullptr) << "Failed for unknown/default entity type";
// Verify property setters work through the abstract base
auto entity = pldm::dbus_api::createPldmEntity(bus, basePath + "prop_test",
PLDM_ENTITY_PROC);
ASSERT_NE(entity, nullptr);
EXPECT_EQ("SN123", entity->serialNumber("SN123"));
EXPECT_EQ("PN456", entity->partNumber("PN456"));
EXPECT_EQ("TestMfg", entity->manufacturer("TestMfg"));
}
TEST(TerminusTest, parsePDRTestNoSensorPDR)
{
auto event = sdeventplus::Event::get_default();
auto t1 = pldm::platform_mc::Terminus(
1, 1 << PLDM_BASE | 1 << PLDM_PLATFORM, event);
std::vector<uint8_t> pdr1{
0x1, 0x0, 0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
0x1,
0x0, // recordChangeNumber
0x11,
0, // dataLength
/* Entity Auxiliary Names PDR Data*/
3,
0x80, // entityType system software
0x1,
0x0, // Entity instance number =1
0,
0, // Overall system
0, // shared Name Count one name only
01, // nameStringCount
0x65, 0x6e, 0x00,
0x00, // Language Tag "en"
0x53, 0x00, 0x30, 0x00,
0x00 // Entity Name "S0"
};
t1.pdrs.emplace_back(pdr1);
t1.parseTerminusPDRs();
auto sensorAuxNames = t1.getSensorAuxiliaryNames(1);
EXPECT_EQ(nullptr, sensorAuxNames);
}