blob: d4e1c8216e5c5e09bbcd8997ebd65e1bbbba5105 [file] [log] [blame]
Alexander Hansen40fb5492025-10-28 17:56:12 +01001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3
Matt Spinler386a61e2020-08-13 15:51:12 -05004#include "extensions/openpower-pels/extended_user_data.hpp"
5#include "pel_utils.hpp"
6
7#include <gtest/gtest.h>
8
9using namespace openpower::pels;
10
11TEST(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
43TEST(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
53TEST(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
71TEST(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
91TEST(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}