xref: /openbmc/phosphor-logging/test/openpower-pels/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/user_data.hpp"
5 #include "pel_utils.hpp"
6 
7 #include <gtest/gtest.h>
8 
9 using namespace openpower::pels;
10 
11 std::vector<uint8_t> udSectionData{
12     0x55, 0x44, // ID 'UD'
13     0x00, 0x10, // Size
14     0x01, 0x02, // version, subtype
15     0x03, 0x04, // comp ID
16 
17     // Data
18     0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
19 
TEST(UserDataTest,UnflattenFlattenTest)20 TEST(UserDataTest, UnflattenFlattenTest)
21 {
22     Stream stream(udSectionData);
23     UserData ud(stream);
24 
25     EXPECT_TRUE(ud.valid());
26     EXPECT_EQ(ud.header().id, 0x5544);
27     EXPECT_EQ(ud.header().size, udSectionData.size());
28     EXPECT_EQ(ud.header().version, 0x01);
29     EXPECT_EQ(ud.header().subType, 0x02);
30     EXPECT_EQ(ud.header().componentID, 0x0304);
31 
32     const auto& data = ud.data();
33 
34     // The data itself starts after the header
35     EXPECT_EQ(data.size(), udSectionData.size() - 8);
36 
37     for (size_t i = 0; i < data.size(); i++)
38     {
39         EXPECT_EQ(data[i], udSectionData[i + 8]);
40     }
41 
42     // Now flatten
43     std::vector<uint8_t> newData;
44     Stream newStream(newData);
45     ud.flatten(newStream);
46 
47     EXPECT_EQ(udSectionData, newData);
48 }
49 
TEST(UserDataTest,BadDataTest)50 TEST(UserDataTest, BadDataTest)
51 {
52     auto data = udSectionData;
53     data.resize(4);
54 
55     Stream stream(data);
56     UserData ud(stream);
57     EXPECT_FALSE(ud.valid());
58 }
59 
TEST(UserDataTest,BadSizeFieldTest)60 TEST(UserDataTest, BadSizeFieldTest)
61 {
62     auto data = udSectionData;
63 
64     {
65         data[3] = 0xFF; // Set the size field too large
66         Stream stream(data);
67         UserData ud(stream);
68         EXPECT_FALSE(ud.valid());
69     }
70     {
71         data[3] = 0x7; // Set the size field too small
72         Stream stream(data);
73         UserData ud(stream);
74         EXPECT_FALSE(ud.valid());
75     }
76 }
77 
TEST(UserDataTest,ConstructorTest)78 TEST(UserDataTest, ConstructorTest)
79 {
80     std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
81 
82     UserData ud(0x1112, 0x42, 0x01, data);
83     EXPECT_TRUE(ud.valid());
84 
85     EXPECT_EQ(ud.header().id, 0x5544);
86     EXPECT_EQ(ud.header().size, 16);
87     EXPECT_EQ(ud.header().version, 0x01);
88     EXPECT_EQ(ud.header().subType, 0x42);
89     EXPECT_EQ(ud.header().componentID, 0x1112);
90     EXPECT_EQ(ud.flattenedSize(), 16);
91 
92     const auto& d = ud.data();
93 
94     EXPECT_EQ(d, data);
95 }
96 
TEST(UserDataTest,ShrinkTest)97 TEST(UserDataTest, ShrinkTest)
98 {
99     std::vector<uint8_t> data(100, 0xFF);
100 
101     UserData ud(0x1112, 0x42, 0x01, data);
102     EXPECT_TRUE(ud.valid());
103 
104     // 4B aligned
105     EXPECT_TRUE(ud.shrink(88));
106     EXPECT_EQ(ud.flattenedSize(), 88);
107     EXPECT_EQ(ud.header().size, 88);
108 
109     // rounded off
110     EXPECT_TRUE(ud.shrink(87));
111     EXPECT_EQ(ud.flattenedSize(), 84);
112     EXPECT_EQ(ud.header().size, 84);
113 
114     // too big
115     EXPECT_FALSE(ud.shrink(200));
116     EXPECT_EQ(ud.flattenedSize(), 84);
117     EXPECT_EQ(ud.header().size, 84);
118 
119     // way too small
120     EXPECT_FALSE(ud.shrink(3));
121     EXPECT_EQ(ud.flattenedSize(), 84);
122     EXPECT_EQ(ud.header().size, 84);
123 
124     // the smallest it can go
125     EXPECT_TRUE(ud.shrink(12));
126     EXPECT_EQ(ud.flattenedSize(), 12);
127     EXPECT_EQ(ud.header().size, 12);
128 
129     // one too small
130     EXPECT_FALSE(ud.shrink(11));
131     EXPECT_EQ(ud.flattenedSize(), 12);
132     EXPECT_EQ(ud.header().size, 12);
133 }
134