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