platform-mc: discovery FRU data from terminus
As [1], `pldmd` will host Fru D-Bus inventory object path and Fru
`xyz.openbmc_project.Inventory.Decorator.*` D-Bus interfaces of one PLDM
terminus.
[1] https://github.com/openbmc/docs/blob/master/designs/pldm-stack.md#processing-pldm-fru-information-sent-down-by-the-host-firmware
Support getting FRU data from terminus in the terminus discovery phase
and expose FRU data to the Fru D-Bus properties in
`xyz.openbmc_project.Inventory.Decorator.Asset`,
`xyz.openbmc_project.Inventory.Decorator.AssetTag`,
`xyz.openbmc_project.Inventory.Decorator.Compatible` and
`xyz.openbmc_project.Inventory.Decorator.Revision` interfaces of
`xyz/openbmc_project/FruPldm/<Terminus_Name>` D-Bus object path which is
created by `xyz.openbmc_project.PLDM` D-Bus service. The object path
will be available until the endpoint EID is removed from the MCTP
D-Bus.
```
busctl introspect xyz.openbmc_project.PLDM /xyz/openbmc_project/inventory/system/board/S0
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -
xyz.openbmc_project.Inventory.Decorator.Asset interface - - -
.BuildDate property s "" emits-change writable
.Manufacturer property s "" emits-change writable
.Model property s "00014003" emits-change writable
.PartNumber property s "" emits-change writable
.SerialNumber property s "000000218" emits-change writable
.SparePartNumber property s "" emits-change writable
.SubModel property s "" emits-change writable
xyz.openbmc_project.Inventory.Decorator.AssetTag interface - - -
.AssetTag property s "" emits-change writable
xyz.openbmc_project.Inventory.Decorator.Compatible interface - - -
.Names property as 0 emits-change writable
xyz.openbmc_project.Inventory.Decorator.Revision interface - - -
.Version property s "x.x.00008.004" emits-change writable
xyz.openbmc_project.Inventory.Item.Board interface - - -
```
Signed-off-by: Dung Cao <dung@os.amperecomputing.com>
Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com>
Change-Id: I4f8869f8fee0fc0f8a5a5670d9a42fc7f48cc798
diff --git a/common/test/pldm_utils_test.cpp b/common/test/pldm_utils_test.cpp
index 545e542..20eedc3 100644
--- a/common/test/pldm_utils_test.cpp
+++ b/common/test/pldm_utils_test.cpp
@@ -1156,3 +1156,37 @@
nullptr);
EXPECT_EQ(false, ret);
}
+
+TEST(FruFieldValuestring, goodTest)
+{
+ std::vector<uint8_t> data = {0x41, 0x6d, 0x70, 0x65, 0x72, 0x65};
+ std::string expectedString = "Ampere";
+ auto result = fruFieldValuestring(data.data(), data.size());
+ EXPECT_EQ(expectedString, result);
+}
+
+TEST(FruFieldValuestring, BadTest)
+{
+ std::vector<uint8_t> data = {0x41, 0x6d, 0x70, 0x65, 0x72, 0x65};
+ auto result = fruFieldValuestring(data.data(), 0);
+ EXPECT_EQ(std::nullopt, result);
+ result = fruFieldValuestring(nullptr, data.size());
+ EXPECT_EQ(std::nullopt, result);
+}
+
+TEST(fruFieldParserU32, goodTest)
+{
+ std::vector<uint8_t> data = {0x10, 0x12, 0x14, 0x25};
+ uint32_t expectedU32 = 0x25141210;
+ auto result = fruFieldParserU32(data.data(), data.size());
+ EXPECT_EQ(expectedU32, result.value());
+}
+
+TEST(fruFieldParserU32, BadTest)
+{
+ std::vector<uint8_t> data = {0x10, 0x12, 0x14, 0x25};
+ auto result = fruFieldParserU32(data.data(), data.size() - 1);
+ EXPECT_EQ(std::nullopt, result);
+ result = fruFieldParserU32(nullptr, data.size());
+ EXPECT_EQ(std::nullopt, result);
+}