PEL: Add a Generic section object

This object will be created when unflattening a PEL when there is no
other class to use for that section.  It just contains a vector<uint8_t>
for its data.

This is done so that the code can always have objects for all PEL
sections, which helps in validating (can at least ensure every section
has a valid header and size), printing (will always have an object to
get its data to at least hex dump), and re-flattening (no need to keep
around the original data buffer).

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I2b79feb4abc0f44179bdb8eab950f0d274e4e472
diff --git a/test/openpower-pels/Makefile.include b/test/openpower-pels/Makefile.include
index e6f08e2..611a2fa 100644
--- a/test/openpower-pels/Makefile.include
+++ b/test/openpower-pels/Makefile.include
@@ -4,6 +4,7 @@
 	additional_data_test \
 	bcd_time_test \
 	failing_mtms_test \
+	generic_section_test \
 	log_id_test \
 	mtms_test \
 	pel_test \
@@ -155,3 +156,12 @@
 	$(test_ldflags) \
 	$(top_builddir)/extensions/openpower-pels/pel_values.o
 pel_values_test_LDFLAGS = $(test_ldflags)
+
+generic_section_test_SOURCES = \
+	%reldir%/generic_section_test.cpp %reldir%/pel_utils.cpp
+generic_section_test_CPPFLAGS = $(test_cppflags)
+generic_section_test_CXXFLAGS = $(test_cxxflags)
+generic_section_test_LDADD = \
+	$(test_ldadd) \
+	$(top_builddir)/extensions/openpower-pels/generic.o
+generic_section_test_LDFLAGS = $(test_ldflags)
diff --git a/test/openpower-pels/generic_section_test.cpp b/test/openpower-pels/generic_section_test.cpp
new file mode 100644
index 0000000..9fb6d9a
--- /dev/null
+++ b/test/openpower-pels/generic_section_test.cpp
@@ -0,0 +1,49 @@
+#include "extensions/openpower-pels/generic.hpp"
+#include "pel_utils.hpp"
+
+#include <gtest/gtest.h>
+
+using namespace openpower::pels;
+
+TEST(GenericSectionTest, UnflattenFlattenTest)
+{
+    // Use the private header data
+    auto data = pelDataFactory(TestPelType::privateHeaderSimple);
+
+    Stream stream(*data);
+    Generic section(stream);
+
+    EXPECT_EQ(section.header().id, 0x5048);
+    EXPECT_EQ(section.header().size, data->size());
+    EXPECT_EQ(section.header().version, 0x01);
+    EXPECT_EQ(section.header().subType, 0x02);
+    EXPECT_EQ(section.header().componentID, 0x0304);
+
+    const auto& sectionData = section.data();
+
+    // The data itself starts after the header
+    EXPECT_EQ(sectionData.size(), data->size() - 8);
+
+    for (size_t i = 0; i < sectionData.size(); i++)
+    {
+        EXPECT_EQ(sectionData[i], (*data)[i + 8]);
+    }
+
+    // Now flatten
+    std::vector<uint8_t> newData;
+    Stream newStream(newData);
+    section.flatten(newStream);
+
+    EXPECT_EQ(*data, newData);
+}
+
+TEST(GenericSectionTest, BadDataTest)
+{
+    // Use the private header data to start with
+    auto data = pelDataFactory(TestPelType::privateHeaderSimple);
+    data->resize(4);
+
+    Stream stream(*data);
+    Generic section(stream);
+    ASSERT_FALSE(section.valid());
+}