PEL: Allow shrinking of a UserData section

Add a shrink() function to the UserData class (with a virtual version of
it in the Section base class) that will shrink the class to a new size.

This is done so that when UserData sections are added to PELs the
sections can be shrunk if necessary to keep the PEL under the maximum
size, which is 16KB.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: Iade52dee8a110f7805c40aa50d6e5df45db050bf
diff --git a/test/openpower-pels/user_data_test.cpp b/test/openpower-pels/user_data_test.cpp
index a957a4d..863d36a 100644
--- a/test/openpower-pels/user_data_test.cpp
+++ b/test/openpower-pels/user_data_test.cpp
@@ -99,8 +99,47 @@
     EXPECT_EQ(ud.header().version, 0x01);
     EXPECT_EQ(ud.header().subType, 0x42);
     EXPECT_EQ(ud.header().componentID, 0x1112);
+    EXPECT_EQ(ud.flattenedSize(), 16);
 
     const auto& d = ud.data();
 
     EXPECT_EQ(d, data);
 }
+
+TEST(UserDataTest, ShrinkTest)
+{
+    std::vector<uint8_t> data(100, 0xFF);
+
+    UserData ud(0x1112, 0x42, 0x01, data);
+    EXPECT_TRUE(ud.valid());
+
+    // 4B aligned
+    EXPECT_TRUE(ud.shrink(88));
+    EXPECT_EQ(ud.flattenedSize(), 88);
+    EXPECT_EQ(ud.header().size, 88);
+
+    // rounded off
+    EXPECT_TRUE(ud.shrink(87));
+    EXPECT_EQ(ud.flattenedSize(), 84);
+    EXPECT_EQ(ud.header().size, 84);
+
+    // too big
+    EXPECT_FALSE(ud.shrink(200));
+    EXPECT_EQ(ud.flattenedSize(), 84);
+    EXPECT_EQ(ud.header().size, 84);
+
+    // way too small
+    EXPECT_FALSE(ud.shrink(3));
+    EXPECT_EQ(ud.flattenedSize(), 84);
+    EXPECT_EQ(ud.header().size, 84);
+
+    // the smallest it can go
+    EXPECT_TRUE(ud.shrink(12));
+    EXPECT_EQ(ud.flattenedSize(), 12);
+    EXPECT_EQ(ud.header().size, 12);
+
+    // one too small
+    EXPECT_FALSE(ud.shrink(11));
+    EXPECT_EQ(ud.flattenedSize(), 12);
+    EXPECT_EQ(ud.header().size, 12);
+}