blob: c041c636871405ff3ca68a8b4ad1055f55850b59 [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 Spinlerc63e2e82019-12-02 15:50:12 -06004#include "extensions/openpower-pels/extended_user_header.hpp"
5#include "mocks.hpp"
6#include "pel_utils.hpp"
7
8#include <gtest/gtest.h>
9
10using namespace openpower::pels;
11using ::testing::Return;
12
13const std::vector<uint8_t> sectionData{
14 // section header
15 'E', 'H', 0x00, 0x60, // ID and Size
16 0x01, 0x00, // version, subtype
17 0x03, 0x04, // comp ID
18
19 // MTMS
20 'T', 'T', 'T', 'T', '-', 'M', 'M', 'M', '1', '2', '3', '4', '5', '6', '7',
21 '8', '9', 'A', 'B', 'C',
22
23 // Server FW version
24 'S', 'E', 'R', 'V', 'E', 'R', '_', 'V', 'E', 'R', 'S', 'I', 'O', 'N', '\0',
25 '\0',
26
27 // Subsystem FW Version
28 'B', 'M', 'C', '_', 'V', 'E', 'R', 'S', 'I', 'O', 'N', '\0', '\0', '\0',
29 '\0', '\0',
30
31 // Reserved
32 0x00, 0x00, 0x00, 0x00,
33
34 // Reference time
35 0x20, 0x25, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60,
36
37 // Reserved
38 0x00, 0x00, 0x00,
39
40 // SymptomID length
41 20,
42
43 // SymptomID
44 'B', 'D', '8', 'D', '4', '2', '0', '0', '_', '1', '2', '3', '4', '5', '6',
45 '7', '8', '\0', '\0', '\0'};
46
47// The section size without the symptom ID
48const size_t baseSectionSize = 76;
49
50TEST(ExtUserHeaderTest, StreamConstructorTest)
51{
52 auto data = sectionData;
53 Stream stream{data};
54 ExtendedUserHeader euh{stream};
55
56 EXPECT_EQ(euh.valid(), true);
57 EXPECT_EQ(euh.header().id, 0x4548); // EH
58 EXPECT_EQ(euh.header().size, sectionData.size());
59 EXPECT_EQ(euh.header().version, 0x01);
60 EXPECT_EQ(euh.header().subType, 0x00);
61 EXPECT_EQ(euh.header().componentID, 0x0304);
62
63 EXPECT_EQ(euh.flattenedSize(), sectionData.size());
64 EXPECT_EQ(euh.machineTypeModel(), "TTTT-MMM");
65 EXPECT_EQ(euh.machineSerialNumber(), "123456789ABC");
66 EXPECT_EQ(euh.serverFWVersion(), "SERVER_VERSION");
67 EXPECT_EQ(euh.subsystemFWVersion(), "BMC_VERSION");
68 EXPECT_EQ(euh.symptomID(), "BD8D4200_12345678");
69
70 BCDTime time{0x20, 0x25, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60};
71 EXPECT_EQ(time, euh.refTime());
72
73 // Flatten it and make sure nothing changes
74 std::vector<uint8_t> newData;
75 Stream newStream{newData};
76
77 euh.flatten(newStream);
78 EXPECT_EQ(sectionData, newData);
79}
80
81// Same as above, with with symptom ID empty
82TEST(ExtUserHeaderTest, StreamConstructorNoIDTest)
83{
84 auto data = sectionData;
85 data.resize(baseSectionSize);
86 data[3] = baseSectionSize; // The size in the header
87 data.back() = 0; // Symptom ID length
88
89 Stream stream{data};
90 ExtendedUserHeader euh{stream};
91
92 EXPECT_EQ(euh.valid(), true);
93 EXPECT_EQ(euh.header().id, 0x4548); // EH
94 EXPECT_EQ(euh.header().size, baseSectionSize);
95 EXPECT_EQ(euh.header().version, 0x01);
96 EXPECT_EQ(euh.header().subType, 0x00);
97 EXPECT_EQ(euh.header().componentID, 0x0304);
98
99 EXPECT_EQ(euh.flattenedSize(), baseSectionSize);
100 EXPECT_EQ(euh.machineTypeModel(), "TTTT-MMM");
101 EXPECT_EQ(euh.machineSerialNumber(), "123456789ABC");
102 EXPECT_EQ(euh.serverFWVersion(), "SERVER_VERSION");
103 EXPECT_EQ(euh.subsystemFWVersion(), "BMC_VERSION");
104 EXPECT_EQ(euh.symptomID(), "");
105
106 BCDTime time{0x20, 0x25, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60};
107 EXPECT_EQ(time, euh.refTime());
108
109 // Flatten it and make sure nothing changes
110 std::vector<uint8_t> newData;
111 Stream newStream{newData};
112
113 euh.flatten(newStream);
114 EXPECT_EQ(data, newData);
115}
116
117TEST(ExtUserHeaderTest, ConstructorTest)
118{
119 auto srcData = pelDataFactory(TestPELType::primarySRCSection);
120 Stream srcStream{srcData};
121 SRC src{srcStream};
122
123 message::Entry entry; // Empty Symptom ID vector
124
125 {
126 MockDataInterface dataIface;
127
128 EXPECT_CALL(dataIface, getMachineTypeModel())
129 .WillOnce(Return("AAAA-BBB"));
130
131 EXPECT_CALL(dataIface, getMachineSerialNumber())
132 .WillOnce(Return("123456789ABC"));
133
134 EXPECT_CALL(dataIface, getServerFWVersion())
135 .WillOnce(Return("SERVER_VERSION"));
136
137 EXPECT_CALL(dataIface, getBMCFWVersion())
138 .WillOnce(Return("BMC_VERSION"));
139
140 ExtendedUserHeader euh{dataIface, entry, src};
141
142 EXPECT_EQ(euh.valid(), true);
143 EXPECT_EQ(euh.header().id, 0x4548); // EH
144
145 // The symptom ID accounts for the extra 20 bytes
146 EXPECT_EQ(euh.header().size, baseSectionSize + 20);
147 EXPECT_EQ(euh.header().version, 0x01);
148 EXPECT_EQ(euh.header().subType, 0x00);
149 EXPECT_EQ(euh.header().componentID, 0x2000);
150
151 EXPECT_EQ(euh.flattenedSize(), baseSectionSize + 20);
152 EXPECT_EQ(euh.machineTypeModel(), "AAAA-BBB");
153 EXPECT_EQ(euh.machineSerialNumber(), "123456789ABC");
154 EXPECT_EQ(euh.serverFWVersion(), "SERVER_VERSION");
155 EXPECT_EQ(euh.subsystemFWVersion(), "BMC_VERSION");
156
157 // The default symptom ID is the ascii string + word 3
158 EXPECT_EQ(euh.symptomID(), "BD8D5678_03030310");
159
160 BCDTime time;
161 EXPECT_EQ(time, euh.refTime());
162 }
163
164 {
165 MockDataInterface dataIface;
166
167 // These 4 items are too long and will get truncated
168 // in the section.
169 EXPECT_CALL(dataIface, getMachineTypeModel())
170 .WillOnce(Return("AAAA-BBBBBBBBBBB"));
171
172 EXPECT_CALL(dataIface, getMachineSerialNumber())
173 .WillOnce(Return("123456789ABC123456789"));
174
175 EXPECT_CALL(dataIface, getServerFWVersion())
176 .WillOnce(Return("SERVER_VERSION_WAY_TOO_LONG"));
177
178 EXPECT_CALL(dataIface, getBMCFWVersion())
179 .WillOnce(Return("BMC_VERSION_WAY_TOO_LONG"));
180
181 // Use SRC words 3 through 9
182 entry.src.symptomID = {3, 4, 5, 6, 7, 8, 9};
183 ExtendedUserHeader euh{dataIface, entry, src};
184
185 EXPECT_EQ(euh.valid(), true);
186 EXPECT_EQ(euh.header().id, 0x4548); // EH
187 EXPECT_EQ(euh.header().size, baseSectionSize + 72);
188 EXPECT_EQ(euh.header().version, 0x01);
189 EXPECT_EQ(euh.header().subType, 0x00);
190 EXPECT_EQ(euh.header().componentID, 0x2000);
191
192 EXPECT_EQ(euh.flattenedSize(), baseSectionSize + 72);
193 EXPECT_EQ(euh.machineTypeModel(), "AAAA-BBB");
194 EXPECT_EQ(euh.machineSerialNumber(), "123456789ABC");
195 EXPECT_EQ(euh.serverFWVersion(), "SERVER_VERSION_");
196 EXPECT_EQ(euh.subsystemFWVersion(), "BMC_VERSION_WAY");
197
198 EXPECT_EQ(euh.symptomID(), "BD8D5678_03030310_04040404_05050505_"
199 "06060606_07070707_08080808_09090909");
200 BCDTime time;
201 EXPECT_EQ(time, euh.refTime());
202 }
203
204 {
205 MockDataInterface dataIface;
206
207 // Empty fields
208 EXPECT_CALL(dataIface, getMachineTypeModel()).WillOnce(Return(""));
209
210 EXPECT_CALL(dataIface, getMachineSerialNumber()).WillOnce(Return(""));
211
212 EXPECT_CALL(dataIface, getServerFWVersion()).WillOnce(Return(""));
213
214 EXPECT_CALL(dataIface, getBMCFWVersion()).WillOnce(Return(""));
215
216 entry.src.symptomID = {8, 9};
217 ExtendedUserHeader euh{dataIface, entry, src};
218
219 EXPECT_EQ(euh.valid(), true);
220 EXPECT_EQ(euh.header().id, 0x4548); // EH
221 EXPECT_EQ(euh.header().size, baseSectionSize + 28);
222 EXPECT_EQ(euh.header().version, 0x01);
223 EXPECT_EQ(euh.header().subType, 0x00);
224 EXPECT_EQ(euh.header().componentID, 0x2000);
225
226 EXPECT_EQ(euh.flattenedSize(), baseSectionSize + 28);
227 EXPECT_EQ(euh.machineTypeModel(), "");
228 EXPECT_EQ(euh.machineSerialNumber(), "");
229 EXPECT_EQ(euh.serverFWVersion(), "");
230 EXPECT_EQ(euh.subsystemFWVersion(), "");
231
232 EXPECT_EQ(euh.symptomID(), "BD8D5678_08080808_09090909");
233
234 BCDTime time;
235 EXPECT_EQ(time, euh.refTime());
236 }
237
238 {
239 MockDataInterface dataIface;
240
241 EXPECT_CALL(dataIface, getMachineTypeModel())
242 .WillOnce(Return("AAAA-BBB"));
243
244 EXPECT_CALL(dataIface, getMachineSerialNumber())
245 .WillOnce(Return("123456789ABC"));
246
247 EXPECT_CALL(dataIface, getServerFWVersion())
248 .WillOnce(Return("SERVER_VERSION"));
249
250 EXPECT_CALL(dataIface, getBMCFWVersion())
251 .WillOnce(Return("BMC_VERSION"));
252
253 // Way too long, will be truncated
254 entry.src.symptomID = {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
255
256 ExtendedUserHeader euh{dataIface, entry, src};
257
258 EXPECT_EQ(euh.valid(), true);
259 EXPECT_EQ(euh.header().id, 0x4548); // EH
260 EXPECT_EQ(euh.header().size, baseSectionSize + 80);
261 EXPECT_EQ(euh.header().version, 0x01);
262 EXPECT_EQ(euh.header().subType, 0x00);
263 EXPECT_EQ(euh.header().componentID, 0x2000);
264
265 EXPECT_EQ(euh.flattenedSize(), baseSectionSize + 80);
266 EXPECT_EQ(euh.machineTypeModel(), "AAAA-BBB");
267 EXPECT_EQ(euh.machineSerialNumber(), "123456789ABC");
268 EXPECT_EQ(euh.serverFWVersion(), "SERVER_VERSION");
269 EXPECT_EQ(euh.subsystemFWVersion(), "BMC_VERSION");
270
271 EXPECT_EQ(euh.symptomID(),
272 "BD8D5678_09090909_09090909_09090909_09090909_09090909_"
273 "09090909_09090909_0909090");
274
275 BCDTime time;
276 EXPECT_EQ(time, euh.refTime());
277 }
278}
279
280TEST(ExtUserHeaderTest, BadDataTest)
281{
282 auto data = sectionData;
283 data.resize(20);
284
285 Stream stream{data};
286 ExtendedUserHeader euh{stream};
287
288 EXPECT_EQ(euh.valid(), false);
289}