PEL: Add SRC callouts from message registry
When an SRC is being built for a new PEL, it will now also add callouts
from the message registry JSON for that error.
This commit only adds support for callouts of maintenance procedures or
symbolic FRUs. A future commit will add support for calling out a
regular piece of hardware
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I78c0d3440c748f21145d452742e3aa682f26003b
diff --git a/test/openpower-pels/mocks.hpp b/test/openpower-pels/mocks.hpp
index 1654a9d..c003dd8 100644
--- a/test/openpower-pels/mocks.hpp
+++ b/test/openpower-pels/mocks.hpp
@@ -33,6 +33,7 @@
(const std::string&, std::string&, std::string&, std::string&,
std::string&),
(const override));
+ MOCK_METHOD(std::string, getSystemType, (), (const override));
void changeHostState(bool newState)
{
diff --git a/test/openpower-pels/src_test.cpp b/test/openpower-pels/src_test.cpp
index c982ca5..9342050 100644
--- a/test/openpower-pels/src_test.cpp
+++ b/test/openpower-pels/src_test.cpp
@@ -411,3 +411,115 @@
ASSERT_TRUE(src.callouts());
EXPECT_EQ(src.callouts()->callouts().size(), 1);
}
+
+TEST_F(SRCTest, RegistryCalloutTest)
+{
+ message::Entry entry;
+ entry.src.type = 0xBD;
+ entry.src.reasonCode = 0xABCD;
+ entry.subsystem = 0x42;
+ entry.src.powerFault = false;
+
+ entry.callouts = R"(
+ [
+ {
+ "System": "systemA",
+ "CalloutList":
+ [
+ {
+ "Priority": "high",
+ "SymbolicFRU": "service_docs"
+ },
+ {
+ "Priority": "medium",
+ "Procedure": "no_vpd_for_fru"
+ }
+ ]
+ },
+ {
+ "System": "systemB",
+ "CalloutList":
+ [
+ {
+ "Priority": "high",
+ "LocCode": "P0-C8",
+ "SymbolicFRUTrusted": "service_docs"
+ },
+ {
+ "Priority": "medium",
+ "SymbolicFRUTrusted": "service_docs"
+ }
+ ]
+
+ }
+ ])"_json;
+
+ {
+ // Call out a symbolic FRU and a procedure
+ AdditionalData ad;
+ NiceMock<MockDataInterface> dataIface;
+ EXPECT_CALL(dataIface, getSystemType).WillOnce(Return("systemA"));
+
+ SRC src{entry, ad, dataIface};
+
+ auto& callouts = src.callouts()->callouts();
+ ASSERT_EQ(callouts.size(), 2);
+
+ EXPECT_EQ(callouts[0]->locationCodeSize(), 0);
+ EXPECT_EQ(callouts[0]->priority(), 'H');
+
+ EXPECT_EQ(callouts[1]->locationCodeSize(), 0);
+ EXPECT_EQ(callouts[1]->priority(), 'M');
+
+ auto& fru1 = callouts[0]->fruIdentity();
+ EXPECT_EQ(fru1->getPN().value(), "SVCDOCS");
+ EXPECT_EQ(fru1->failingComponentType(), src::FRUIdentity::symbolicFRU);
+ EXPECT_FALSE(fru1->getMaintProc());
+ EXPECT_FALSE(fru1->getSN());
+ EXPECT_FALSE(fru1->getCCIN());
+
+ auto& fru2 = callouts[1]->fruIdentity();
+ EXPECT_EQ(fru2->getMaintProc().value(), "BMCSP01");
+ EXPECT_EQ(fru2->failingComponentType(),
+ src::FRUIdentity::maintenanceProc);
+ EXPECT_FALSE(fru2->getPN());
+ EXPECT_FALSE(fru2->getSN());
+ EXPECT_FALSE(fru2->getCCIN());
+ }
+
+ {
+ // Call out a trusted symbolic FRU with a location code, and
+ // another one without.
+ AdditionalData ad;
+ NiceMock<MockDataInterface> dataIface;
+ EXPECT_CALL(dataIface, getSystemType).WillOnce(Return("systemB"));
+
+ SRC src{entry, ad, dataIface};
+
+ auto& callouts = src.callouts()->callouts();
+ EXPECT_EQ(callouts.size(), 2);
+
+ EXPECT_EQ(callouts[0]->locationCode(), "P0-C8");
+ EXPECT_EQ(callouts[0]->priority(), 'H');
+
+ EXPECT_EQ(callouts[1]->locationCodeSize(), 0);
+ EXPECT_EQ(callouts[1]->priority(), 'M');
+
+ auto& fru1 = callouts[0]->fruIdentity();
+ EXPECT_EQ(fru1->getPN().value(), "SVCDOCS");
+ EXPECT_EQ(fru1->failingComponentType(),
+ src::FRUIdentity::symbolicFRUTrustedLocCode);
+ EXPECT_FALSE(fru1->getMaintProc());
+ EXPECT_FALSE(fru1->getSN());
+ EXPECT_FALSE(fru1->getCCIN());
+
+ // It asked for a trusted symbolic FRU, but no location code
+ // was provided so it is switched back to a normal one
+ auto& fru2 = callouts[1]->fruIdentity();
+ EXPECT_EQ(fru2->getPN().value(), "SVCDOCS");
+ EXPECT_EQ(fru2->failingComponentType(), src::FRUIdentity::symbolicFRU);
+ EXPECT_FALSE(fru2->getMaintProc());
+ EXPECT_FALSE(fru2->getSN());
+ EXPECT_FALSE(fru2->getCCIN());
+ }
+}