xref: /openbmc/phosphor-logging/test/openpower-pels/extended_user_data_test.cpp (revision 40fb54935ce7367636a7156039396ee91cc4d5e2)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3 
4 #include "extensions/openpower-pels/extended_user_data.hpp"
5 #include "pel_utils.hpp"
6 
7 #include <gtest/gtest.h>
8 
9 using namespace openpower::pels;
10 
TEST(ExtUserDataTest,UnflattenFlattenTest)11 TEST(ExtUserDataTest, UnflattenFlattenTest)
12 {
13     auto eudSectionData = pelDataFactory(TestPELType::extendedUserDataSection);
14     Stream stream(eudSectionData);
15     ExtendedUserData eud(stream);
16 
17     EXPECT_TRUE(eud.valid());
18     EXPECT_EQ(eud.header().id, 0x4544);
19     EXPECT_EQ(eud.header().size, eudSectionData.size());
20     EXPECT_EQ(eud.header().version, 0x01);
21     EXPECT_EQ(eud.header().subType, 0x02);
22     EXPECT_EQ(eud.header().componentID, 0x2000);
23     EXPECT_EQ(eud.creatorID(), 'O');
24 
25     const auto& data = eud.data();
26 
27     // The eudSectionData itself starts 4B after the 8B header
28     EXPECT_EQ(data.size(), eudSectionData.size() - 12);
29 
30     for (size_t i = 0; i < data.size(); i++)
31     {
32         EXPECT_EQ(data[i], eudSectionData[i + 12]);
33     }
34 
35     // Now flatten
36     std::vector<uint8_t> newData;
37     Stream newStream(newData);
38     eud.flatten(newStream);
39 
40     EXPECT_EQ(eudSectionData, newData);
41 }
42 
TEST(ExtUserDataTest,BadDataTest)43 TEST(ExtUserDataTest, BadDataTest)
44 {
45     auto data = pelDataFactory(TestPELType::extendedUserDataSection);
46     data.resize(8); // Too small
47 
48     Stream stream(data);
49     ExtendedUserData eud(stream);
50     EXPECT_FALSE(eud.valid());
51 }
52 
TEST(ExtUserDataTest,BadSizeFieldTest)53 TEST(ExtUserDataTest, BadSizeFieldTest)
54 {
55     auto data = pelDataFactory(TestPELType::extendedUserDataSection);
56 
57     {
58         data[3] = 0xFF; // Set the size field too large
59         Stream stream(data);
60         ExtendedUserData eud(stream);
61         EXPECT_FALSE(eud.valid());
62     }
63     {
64         data[3] = 0x7; // Set the size field too small
65         Stream stream(data);
66         ExtendedUserData eud(stream);
67         EXPECT_FALSE(eud.valid());
68     }
69 }
70 
TEST(ExtUserDataTest,ConstructorTest)71 TEST(ExtUserDataTest, ConstructorTest)
72 {
73     std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
74 
75     ExtendedUserData eud{0x1112, 0x42, 0x01, 'B', data};
76 
77     EXPECT_TRUE(eud.valid());
78     EXPECT_EQ(eud.header().id, 0x4544);
79     EXPECT_EQ(eud.header().size, 20);
80     EXPECT_EQ(eud.header().subType, 0x42);
81     EXPECT_EQ(eud.header().version, 0x01);
82     EXPECT_EQ(eud.header().componentID, 0x1112);
83     EXPECT_EQ(eud.flattenedSize(), 20);
84     EXPECT_EQ(eud.creatorID(), 'B');
85 
86     const auto& d = eud.data();
87 
88     EXPECT_EQ(d, data);
89 }
90 
TEST(ExtUserDataTest,ShrinkTest)91 TEST(ExtUserDataTest, ShrinkTest)
92 {
93     std::vector<uint8_t> data(100, 0xFF);
94 
95     ExtendedUserData eud(0x1112, 0x42, 0x01, 'O', data);
96     EXPECT_TRUE(eud.valid());
97 
98     // 4B aligned
99     EXPECT_TRUE(eud.shrink(88));
100     EXPECT_EQ(eud.flattenedSize(), 88);
101     EXPECT_EQ(eud.header().size, 88);
102 
103     // rounded off
104     EXPECT_TRUE(eud.shrink(87));
105     EXPECT_EQ(eud.flattenedSize(), 84);
106     EXPECT_EQ(eud.header().size, 84);
107 
108     // too big
109     EXPECT_FALSE(eud.shrink(200));
110     EXPECT_EQ(eud.flattenedSize(), 84);
111     EXPECT_EQ(eud.header().size, 84);
112 
113     // way too small
114     EXPECT_FALSE(eud.shrink(3));
115     EXPECT_EQ(eud.flattenedSize(), 84);
116     EXPECT_EQ(eud.header().size, 84);
117 
118     // the smallest it can go
119     EXPECT_TRUE(eud.shrink(16));
120     EXPECT_EQ(eud.flattenedSize(), 16);
121     EXPECT_EQ(eud.header().size, 16);
122 
123     // one too small
124     EXPECT_FALSE(eud.shrink(15));
125     EXPECT_EQ(eud.flattenedSize(), 16);
126     EXPECT_EQ(eud.header().size, 16);
127 }
128