xref: /openbmc/phosphor-logging/test/openpower-pels/extended_user_header_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_header.hpp"
5 #include "mocks.hpp"
6 #include "pel_utils.hpp"
7 
8 #include <gtest/gtest.h>
9 
10 using namespace openpower::pels;
11 using ::testing::Return;
12 
13 const 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
48 const size_t baseSectionSize = 76;
49 
TEST(ExtUserHeaderTest,StreamConstructorTest)50 TEST(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
TEST(ExtUserHeaderTest,StreamConstructorNoIDTest)82 TEST(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 
TEST(ExtUserHeaderTest,ConstructorTest)117 TEST(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 
TEST(ExtUserHeaderTest,BadDataTest)280 TEST(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 }
290