blob: 693a63f0dcf7f9ad50889eb4f4296b67e21a51f3 [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 Spinlerfdb6a202019-09-20 14:09:20 -05004#include "elog_entry.hpp"
5#include "extensions/openpower-pels/pel_types.hpp"
Matt Spinler03c1d912019-07-10 14:12:15 -05006#include "extensions/openpower-pels/private_header.hpp"
7#include "extensions/openpower-pels/user_header.hpp"
Matt Spinleraadccc82020-04-10 14:33:42 -05008#include "mocks.hpp"
Matt Spinler03c1d912019-07-10 14:12:15 -05009#include "pel_utils.hpp"
10
11#include <gtest/gtest.h>
12
13using namespace openpower::pels;
Matt Spinleraadccc82020-04-10 14:33:42 -050014using ::testing::Return;
Matt Spinler03c1d912019-07-10 14:12:15 -050015
16TEST(UserHeaderTest, SizeTest)
17{
18 EXPECT_EQ(UserHeader::flattenedSize(), 24);
19}
20
21TEST(UserHeaderTest, UnflattenFlattenTest)
22{
Matt Spinler42828bd2019-10-11 10:39:30 -050023 auto data = pelDataFactory(TestPELType::userHeaderSection);
Matt Spinler03c1d912019-07-10 14:12:15 -050024
Matt Spinler42828bd2019-10-11 10:39:30 -050025 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050026 UserHeader uh(stream);
27 EXPECT_EQ(uh.valid(), true);
28
29 EXPECT_EQ(uh.header().id, 0x5548);
30 EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
31 EXPECT_EQ(uh.header().version, 0x01);
32 EXPECT_EQ(uh.header().subType, 0x0A);
33 EXPECT_EQ(uh.header().componentID, 0x0B0C);
34
35 EXPECT_EQ(uh.subsystem(), 0x10);
36 EXPECT_EQ(uh.scope(), 0x04);
37 EXPECT_EQ(uh.severity(), 0x20);
38 EXPECT_EQ(uh.eventType(), 0x00);
39 EXPECT_EQ(uh.problemDomain(), 0x03);
40 EXPECT_EQ(uh.problemVector(), 0x04);
41 EXPECT_EQ(uh.actionFlags(), 0x80C0);
42
43 // Now flatten into a vector and check that this vector
44 // matches the original one.
45 std::vector<uint8_t> newData;
46 Stream newStream(newData);
47
Matt Spinlercf5a8d02019-09-05 12:58:53 -050048 uh.flatten(newStream);
Matt Spinler42828bd2019-10-11 10:39:30 -050049 EXPECT_EQ(data, newData);
Matt Spinler03c1d912019-07-10 14:12:15 -050050}
51
52TEST(UserHeaderTest, ShortDataTest)
53{
Matt Spinler42828bd2019-10-11 10:39:30 -050054 auto data = pelDataFactory(TestPELType::userHeaderSection);
55 data.resize(data.size() - 1);
Matt Spinler03c1d912019-07-10 14:12:15 -050056
Matt Spinler42828bd2019-10-11 10:39:30 -050057 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050058 UserHeader uh(stream);
59
60 EXPECT_EQ(uh.valid(), false);
61}
62
63TEST(UserHeaderTest, CorruptDataTest1)
64{
Matt Spinler42828bd2019-10-11 10:39:30 -050065 auto data = pelDataFactory(TestPELType::userHeaderSection);
66 data.resize(data.size() - 1);
Matt Spinler03c1d912019-07-10 14:12:15 -050067
Matt Spinler42828bd2019-10-11 10:39:30 -050068 data.at(0) = 0; // corrupt the section ID
Matt Spinler03c1d912019-07-10 14:12:15 -050069
Matt Spinler42828bd2019-10-11 10:39:30 -050070 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050071 UserHeader uh(stream);
72
73 EXPECT_EQ(uh.valid(), false);
74}
75
76TEST(UserHeaderTest, CorruptDataTest2)
77{
Matt Spinler42828bd2019-10-11 10:39:30 -050078 auto data = pelDataFactory(TestPELType::userHeaderSection);
Matt Spinler03c1d912019-07-10 14:12:15 -050079
Matt Spinler42828bd2019-10-11 10:39:30 -050080 data.at(4) = 0x22; // corrupt the version
Matt Spinler03c1d912019-07-10 14:12:15 -050081
Matt Spinler42828bd2019-10-11 10:39:30 -050082 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050083 UserHeader uh(stream);
84
85 EXPECT_EQ(uh.valid(), false);
86}
Matt Spinlerfdb6a202019-09-20 14:09:20 -050087
88// Construct the User Header from the message registry
89TEST(UserHeaderTest, ConstructionTest)
90{
91 using namespace openpower::pels::message;
Matt Spinleraadccc82020-04-10 14:33:42 -050092 {
93 Entry regEntry;
Matt Spinlerfdb6a202019-09-20 14:09:20 -050094
Matt Spinleraadccc82020-04-10 14:33:42 -050095 regEntry.name = "test";
96 regEntry.subsystem = 5;
97 regEntry.severity = {{"", 0x40}};
98 regEntry.actionFlags = 0xC000;
99 regEntry.eventType = 1;
100 regEntry.eventScope = 2;
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500101
Matt Spinleraadccc82020-04-10 14:33:42 -0500102 MockDataInterface dataIface;
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500103 AdditionalData ad;
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500104
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500105 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
Matt Spinleraadccc82020-04-10 14:33:42 -0500106 dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500107
Matt Spinleraadccc82020-04-10 14:33:42 -0500108 ASSERT_TRUE(uh.valid());
109 EXPECT_EQ(uh.header().id, 0x5548);
110 EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
111 EXPECT_EQ(uh.header().version, 0x01);
112 EXPECT_EQ(uh.header().subType, 0x00);
113 EXPECT_EQ(uh.header().componentID,
114 static_cast<uint16_t>(ComponentID::phosphorLogging));
115
Matt Spinler1f93c592020-09-10 10:43:08 -0500116 EXPECT_EQ(uh.subsystem(), 5);
117 EXPECT_EQ(uh.severity(), 0x40);
118 EXPECT_EQ(uh.eventType(), 1);
119 EXPECT_EQ(uh.scope(), 2);
120 EXPECT_EQ(uh.problemDomain(), 0);
121 EXPECT_EQ(uh.problemVector(), 0);
122 EXPECT_EQ(uh.actionFlags(), 0xC000);
123
124 {
125 // The same thing, but as if the action flags weren't specified
126 // in the registry so they are a nullopt. The object should
127 // then set them to 0xFFFF.
Matt Spinler1f93c592020-09-10 10:43:08 -0500128 regEntry.actionFlags = std::nullopt;
129
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500130 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
Matt Spinler1f93c592020-09-10 10:43:08 -0500131 dataIface);
132 EXPECT_EQ(uh.actionFlags(), 0xFFFF);
133 }
Matt Spinleraadccc82020-04-10 14:33:42 -0500134 }
135
136 // Test the system type based severity lookups
137 {
138 Entry regEntry;
139
140 regEntry.name = "test";
141 regEntry.subsystem = 5;
142 regEntry.severity = {{"", 0x20}, {"systemB", 0x10}, {"systemA", 0x00}};
143
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500144 AdditionalData ad;
145
Matt Spinleraadccc82020-04-10 14:33:42 -0500146 MockDataInterface dataIface;
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500147 std::vector<std::string> names1{"systemA"};
148 std::vector<std::string> names2{"systemB"};
149 std::vector<std::string> names3{"systemC"};
150
151 EXPECT_CALL(dataIface, getSystemNames)
Matt Spinler1ab66962020-10-29 13:21:44 -0500152 .WillOnce(Return(names1))
153 .WillOnce(Return(names2))
154 .WillOnce(Return(names3));
Matt Spinleraadccc82020-04-10 14:33:42 -0500155
156 {
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500157 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
Matt Spinleraadccc82020-04-10 14:33:42 -0500158 dataIface);
159
160 EXPECT_EQ(uh.severity(), 0x00);
161 }
162
163 {
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500164 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
Matt Spinleraadccc82020-04-10 14:33:42 -0500165 dataIface);
166
167 EXPECT_EQ(uh.severity(), 0x10);
168 }
169
170 {
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500171 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
Matt Spinleraadccc82020-04-10 14:33:42 -0500172 dataIface);
173
174 EXPECT_EQ(uh.severity(), 0x20);
175 }
176 }
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500177}
178
179// Test that the severity comes from the event log if not
180// in the message registry
181TEST(UserHeaderTest, UseEventLogSevTest)
182{
183 using namespace openpower::pels::message;
184 Entry regEntry;
185
186 regEntry.name = "test";
187 regEntry.subsystem = 5;
188 regEntry.actionFlags = 0xC000;
189 regEntry.eventType = 1;
190 regEntry.eventScope = 2;
191 // Leave off severity
192
Matt Spinleraadccc82020-04-10 14:33:42 -0500193 MockDataInterface dataIface;
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500194 AdditionalData ad;
Matt Spinleraadccc82020-04-10 14:33:42 -0500195
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500196 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
197 dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500198 ASSERT_EQ(uh.severity(), 0x40);
199}
200
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500201// Test that the critical severity comes from the event log if not
202// in the message registry
203TEST(UserHeaderTest, UseEventLogSevCritTest)
204{
205 using namespace openpower::pels::message;
206 Entry regEntry;
207
208 regEntry.name = "test";
209 regEntry.subsystem = 5;
210 regEntry.actionFlags = 0xC000;
211 regEntry.eventType = 1;
212 regEntry.eventScope = 2;
213 // Leave off severity
214
215 MockDataInterface dataIface;
216 AdditionalData ad;
217
218 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Critical, ad,
219 dataIface);
220 ASSERT_EQ(uh.severity(), 0x50);
221}
222
223// Test that the critical severity comes from the event log if not
224// in the message registry and termination condition is set
225TEST(UserHeaderTest, UseEventLogSevCritTermTest)
226{
227 using namespace openpower::pels::message;
228 Entry regEntry;
229
230 regEntry.name = "test";
231 regEntry.subsystem = 5;
232 regEntry.actionFlags = 0xC000;
233 regEntry.eventType = 1;
234 regEntry.eventScope = 2;
235 // Leave off severity
236
237 MockDataInterface dataIface;
Patrick Williamse5940632024-11-22 20:47:58 -0500238 std::map<std::string, std::string> adData{
239 {"SEVERITY_DETAIL", "SYSTEM_TERM"}};
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500240 AdditionalData ad{adData};
241
242 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Critical, ad,
243 dataIface);
244 ASSERT_EQ(uh.severity(), 0x51);
245}
246
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500247// Test that the optional event type & scope fields work
248TEST(UserHeaderTest, DefaultEventTypeScopeTest)
249{
250 using namespace openpower::pels::message;
251 Entry regEntry;
252
253 regEntry.name = "test";
254 regEntry.subsystem = 5;
Matt Spinleraadccc82020-04-10 14:33:42 -0500255 regEntry.severity = {{"", 0x40}};
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500256 regEntry.actionFlags = 0xC000;
257
Matt Spinleraadccc82020-04-10 14:33:42 -0500258 MockDataInterface dataIface;
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500259 AdditionalData ad;
Matt Spinleraadccc82020-04-10 14:33:42 -0500260
Vijay Lobo6b3f3452021-04-15 23:04:42 -0500261 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
262 dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500263
264 ASSERT_EQ(uh.eventType(), 0);
265 ASSERT_EQ(uh.scope(), 0x03);
266}
Sumit Kumar3b8ed7f2021-05-18 12:38:35 -0500267
268// Test that the event severity & action flags override
269// when QuiesceOnHwError is set
270TEST(UserHeaderTest, UseEventLogQuiesceOnErrorTest)
271{
272 using namespace openpower::pels::message;
273 Entry regEntry;
274
275 regEntry.name = "test";
276 regEntry.subsystem = 5;
277 regEntry.actionFlags = 0xC000;
278 regEntry.eventType = 1;
279 regEntry.eventScope = 2;
280 regEntry.severity = {{"", 0x40}, {"systemB", 0x10}, {"systemA", 0x00}};
281
282 // set the value for mfg severity and action flags
283 regEntry.mfgSeverity = {{"systemA", 0x20}};
284 regEntry.mfgActionFlags = 0xF000;
285
286 std::vector<std::string> names{"systemA"};
287
288 MockDataInterface dataIface;
289 AdditionalData ad;
290
291 EXPECT_CALL(dataIface, getSystemNames).WillOnce(Return(names));
292 EXPECT_CALL(dataIface, getQuiesceOnError).WillOnce(Return(true));
293
294 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, ad,
295 dataIface);
296
297 EXPECT_EQ(uh.severity(), 0x20);
298 EXPECT_EQ(uh.actionFlags(), 0xF000);
299}
Sumit Kumar50bfa692022-01-06 06:48:26 -0600300
301// Test that the PEL Subsystem omes from the event log if any
302TEST(UserHeaderTest, UseEventLogPELSubsystem)
303{
304 using namespace openpower::pels::message;
Sumit Kumar50bfa692022-01-06 06:48:26 -0600305
Matt Spinler23970b02022-02-25 16:34:46 -0600306 {
307 Entry regEntry;
Sumit Kumar50bfa692022-01-06 06:48:26 -0600308
Matt Spinler23970b02022-02-25 16:34:46 -0600309 regEntry.name = "test";
310 regEntry.subsystem = 5;
311 regEntry.actionFlags = 0xC000;
312 regEntry.eventType = 1;
313 regEntry.eventScope = 2;
Sumit Kumar50bfa692022-01-06 06:48:26 -0600314
Matt Spinler23970b02022-02-25 16:34:46 -0600315 MockDataInterface dataIface;
Patrick Williamse5940632024-11-22 20:47:58 -0500316 std::map<std::string, std::string> adData{{"PEL_SUBSYSTEM", "0x25"}};
Matt Spinler23970b02022-02-25 16:34:46 -0600317 AdditionalData ad{adData};
318
319 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Critical, ad,
320 dataIface);
321 ASSERT_EQ(uh.subsystem(), 0x25);
322 }
323 {
324 // No subsystem in registry, and invalid PEL_SUBSYSTEM
325 Entry regEntry;
326
327 regEntry.name = "test";
328 regEntry.actionFlags = 0xC000;
329 regEntry.eventType = 1;
330 regEntry.eventScope = 2;
331
332 MockDataInterface dataIface;
Patrick Williamse5940632024-11-22 20:47:58 -0500333 std::map<std::string, std::string> adData{{"PEL_SUBSYSTEM", "0x99"}};
Matt Spinler23970b02022-02-25 16:34:46 -0600334 AdditionalData ad{adData};
335
336 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Critical, ad,
337 dataIface);
338 ASSERT_EQ(uh.subsystem(), 0x70); // others
339 }
340 {
341 // No subsystem in registry or PEL_SUBSYSTEM
342 Entry regEntry;
343
344 regEntry.name = "test";
345 regEntry.actionFlags = 0xC000;
346 regEntry.eventType = 1;
347 regEntry.eventScope = 2;
348
349 MockDataInterface dataIface;
Patrick Williamse5940632024-11-22 20:47:58 -0500350 std::map<std::string, std::string> adData;
Matt Spinler23970b02022-02-25 16:34:46 -0600351 AdditionalData ad{adData};
352
353 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Critical, ad,
354 dataIface);
355 ASSERT_EQ(uh.subsystem(), 0x70); // others
356 }
Sumit Kumar50bfa692022-01-06 06:48:26 -0600357}