summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorMatt Spinler <spinler@us.ibm.com>2019-10-09 12:48:25 -0500
committerMatt Spinler <spinler@us.ibm.com>2019-10-22 14:09:56 +0000
commit32f13c915fa4b27520ca0aea476804c37f5516b9 (patch)
tree87e6af31872b305f86d37f83670fa94524b95d99 /test
parent6c9662c9a269a3fcf6e6ccee51b2ab76b1679fb0 (diff)
downloadphosphor-logging-32f13c915fa4b27520ca0aea476804c37f5516b9.tar.gz
phosphor-logging-32f13c915fa4b27520ca0aea476804c37f5516b9.zip
PEL: SRC callouts subsection object
This Callouts class represents the optional subsection of an SRC PEL section that contains FRU callouts. It is only present in the SRC when there are callouts, and it comes at the end of the section. It is basically just a container for the Callout objects that represent the actual callouts. Signed-off-by: Matt Spinler <spinler@us.ibm.com> Change-Id: I1d4d95b82f9b4943728d7939e3bf89e4a7bcbb75
Diffstat (limited to 'test')
-rw-r--r--test/openpower-pels/Makefile.include16
-rw-r--r--test/openpower-pels/pel_utils.cpp34
-rw-r--r--test/openpower-pels/pel_utils.hpp2
-rw-r--r--test/openpower-pels/src_callouts_test.cpp76
4 files changed, 128 insertions, 0 deletions
diff --git a/test/openpower-pels/Makefile.include b/test/openpower-pels/Makefile.include
index ccd5d26..3bc760f 100644
--- a/test/openpower-pels/Makefile.include
+++ b/test/openpower-pels/Makefile.include
@@ -21,6 +21,7 @@ check_PROGRAMS += \
section_header_test \
severity_test \
src_callout_test \
+ src_callouts_test \
stream_test \
user_data_test \
user_header_test
@@ -242,3 +243,18 @@ src_callout_test_LDADD = \
$(top_builddir)/extensions/openpower-pels/mtms.o \
$(top_builddir)/extensions/openpower-pels/pce_identity.o
src_callout_test_LDFLAGS = $(test_ldflags)
+
+src_callouts_test_SOURCES = \
+ %reldir%/src_callouts_test.cpp \
+ %reldir%/pel_utils.cpp
+src_callouts_test_CPPFLAGS = $(test_cppflags)
+src_callouts_test_CXXFLAGS = $(test_cxxflags)
+src_callouts_test_LDADD = \
+ $(test_ldadd) \
+ $(top_builddir)/extensions/openpower-pels/callout.o \
+ $(top_builddir)/extensions/openpower-pels/callouts.o \
+ $(top_builddir)/extensions/openpower-pels/fru_identity.o \
+ $(top_builddir)/extensions/openpower-pels/mru.o \
+ $(top_builddir)/extensions/openpower-pels/mtms.o \
+ $(top_builddir)/extensions/openpower-pels/pce_identity.o
+src_callouts_test_LDFLAGS = $(test_ldflags)
diff --git a/test/openpower-pels/pel_utils.cpp b/test/openpower-pels/pel_utils.cpp
index 3610dd7..f7c9150 100644
--- a/test/openpower-pels/pel_utils.cpp
+++ b/test/openpower-pels/pel_utils.cpp
@@ -113,6 +113,40 @@ std::vector<uint8_t> srcDataFactory(TestSRCType type)
case TestSRCType::mruStructure:
return srcMRUCallout;
+
+ case TestSRCType::calloutStructureA:
+ {
+ // Add just the FRU identity substructure to the base structure
+ std::vector<uint8_t> data{
+ 0xFF, 0x28, 'H', 4, // size, flags, priority, LC length
+ 'U', '4', '2', 0x00 // LC
+ };
+
+ data.insert(data.end(), srcFRUIdentityCallout.begin(),
+ srcFRUIdentityCallout.end());
+
+ // The final size
+ data[0] = data.size();
+ return data;
+ }
+ case TestSRCType::calloutStructureB:
+ {
+ // Add all 3 substructures to the base structure
+
+ std::vector<uint8_t> data{
+ 0xFF, 0x2F, 'L', 8, // size, flags, priority, LC length
+ 'U', '1', '2', '-', 'P', '1', 0x00, 0x00 // LC
+ };
+ data.insert(data.end(), srcFRUIdentityCallout.begin(),
+ srcFRUIdentityCallout.end());
+ data.insert(data.end(), srcPCEIdentityCallout.begin(),
+ srcPCEIdentityCallout.end());
+ data.insert(data.end(), srcMRUCallout.begin(), srcMRUCallout.end());
+
+ // The final size
+ data[0] = data.size();
+ return data;
+ }
}
return {};
}
diff --git a/test/openpower-pels/pel_utils.hpp b/test/openpower-pels/pel_utils.hpp
index 2d40033..7416c31 100644
--- a/test/openpower-pels/pel_utils.hpp
+++ b/test/openpower-pels/pel_utils.hpp
@@ -67,6 +67,8 @@ enum class TestSRCType
fruIdentityStructure,
pceIdentityStructure,
mruStructure,
+ calloutStructureA,
+ calloutStructureB
};
/**
diff --git a/test/openpower-pels/src_callouts_test.cpp b/test/openpower-pels/src_callouts_test.cpp
new file mode 100644
index 0000000..88dd721
--- /dev/null
+++ b/test/openpower-pels/src_callouts_test.cpp
@@ -0,0 +1,76 @@
+#include "extensions/openpower-pels/callouts.hpp"
+#include "pel_utils.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace openpower::pels;
+using namespace openpower::pels::src;
+
+TEST(CalloutsTest, UnflattenFlattenTest)
+{
+ std::vector<uint8_t> data{0xC0, 0x00, 0x00,
+ 0x00}; // ID, flags, length in words
+
+ // Add 2 callouts
+ auto callout = srcDataFactory(TestSRCType::calloutStructureA);
+ data.insert(data.end(), callout.begin(), callout.end());
+
+ callout = srcDataFactory(TestSRCType::calloutStructureB);
+ data.insert(data.end(), callout.begin(), callout.end());
+
+ Stream stream{data};
+
+ // Set the actual word length value at offset 2
+ uint16_t wordLength = data.size() / 4;
+ stream.offset(2);
+ stream << wordLength;
+ stream.offset(0);
+
+ Callouts callouts{stream};
+
+ EXPECT_EQ(callouts.flattenedSize(), data.size());
+ EXPECT_EQ(callouts.callouts().size(), 2);
+
+ // spot check that each callout has the right substructures
+ EXPECT_TRUE(callouts.callouts().front()->fruIdentity());
+ EXPECT_FALSE(callouts.callouts().front()->pceIdentity());
+ EXPECT_FALSE(callouts.callouts().front()->mru());
+
+ EXPECT_TRUE(callouts.callouts().back()->fruIdentity());
+ EXPECT_TRUE(callouts.callouts().back()->pceIdentity());
+ EXPECT_TRUE(callouts.callouts().back()->mru());
+
+ // Flatten
+ std::vector<uint8_t> newData;
+ Stream newStream{newData};
+
+ callouts.flatten(newStream);
+ EXPECT_EQ(data, newData);
+}
+
+TEST(CalloutsTest, BadDataTest)
+{
+ // Start out with a valid 2 callout object, then truncate it.
+ std::vector<uint8_t> data{0xC0, 0x00, 0x00,
+ 0x00}; // ID, flags, length in words
+
+ // Add 2 callouts
+ auto callout = srcDataFactory(TestSRCType::calloutStructureA);
+ data.insert(data.end(), callout.begin(), callout.end());
+
+ callout = srcDataFactory(TestSRCType::calloutStructureB);
+ data.insert(data.end(), callout.begin(), callout.end());
+
+ Stream stream{data};
+
+ // Set the actual word length value at offset 2
+ uint16_t wordLength = data.size() / 4;
+ stream.offset(2);
+ stream << wordLength;
+ stream.offset(0);
+
+ // Shorten the data by an arbitrary amount so unflattening goes awry.
+ data.resize(data.size() - 37);
+
+ EXPECT_THROW(Callouts callouts{stream}, std::out_of_range);
+}
OpenPOWER on IntegriCloud