blob: 526a59e3035b66cdd4fc4c89105fb5c9eebd5699 [file] [log] [blame]
Matt Spinler97f7abc2019-11-06 09:40:23 -06001/**
2 * Copyright © 2019 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Matt Spinlerfdb6a202019-09-20 14:09:20 -050016#include "elog_entry.hpp"
17#include "extensions/openpower-pels/pel_types.hpp"
Matt Spinler03c1d912019-07-10 14:12:15 -050018#include "extensions/openpower-pels/private_header.hpp"
19#include "extensions/openpower-pels/user_header.hpp"
Matt Spinleraadccc82020-04-10 14:33:42 -050020#include "mocks.hpp"
Matt Spinler03c1d912019-07-10 14:12:15 -050021#include "pel_utils.hpp"
22
23#include <gtest/gtest.h>
24
25using namespace openpower::pels;
Matt Spinleraadccc82020-04-10 14:33:42 -050026using ::testing::Return;
Matt Spinler6ea4d5f2020-05-20 13:31:07 -050027using ::testing::ReturnRef;
Matt Spinler03c1d912019-07-10 14:12:15 -050028
29TEST(UserHeaderTest, SizeTest)
30{
31 EXPECT_EQ(UserHeader::flattenedSize(), 24);
32}
33
34TEST(UserHeaderTest, UnflattenFlattenTest)
35{
Matt Spinler42828bd2019-10-11 10:39:30 -050036 auto data = pelDataFactory(TestPELType::userHeaderSection);
Matt Spinler03c1d912019-07-10 14:12:15 -050037
Matt Spinler42828bd2019-10-11 10:39:30 -050038 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050039 UserHeader uh(stream);
40 EXPECT_EQ(uh.valid(), true);
41
42 EXPECT_EQ(uh.header().id, 0x5548);
43 EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
44 EXPECT_EQ(uh.header().version, 0x01);
45 EXPECT_EQ(uh.header().subType, 0x0A);
46 EXPECT_EQ(uh.header().componentID, 0x0B0C);
47
48 EXPECT_EQ(uh.subsystem(), 0x10);
49 EXPECT_EQ(uh.scope(), 0x04);
50 EXPECT_EQ(uh.severity(), 0x20);
51 EXPECT_EQ(uh.eventType(), 0x00);
52 EXPECT_EQ(uh.problemDomain(), 0x03);
53 EXPECT_EQ(uh.problemVector(), 0x04);
54 EXPECT_EQ(uh.actionFlags(), 0x80C0);
55
56 // Now flatten into a vector and check that this vector
57 // matches the original one.
58 std::vector<uint8_t> newData;
59 Stream newStream(newData);
60
Matt Spinlercf5a8d02019-09-05 12:58:53 -050061 uh.flatten(newStream);
Matt Spinler42828bd2019-10-11 10:39:30 -050062 EXPECT_EQ(data, newData);
Matt Spinler03c1d912019-07-10 14:12:15 -050063}
64
65TEST(UserHeaderTest, ShortDataTest)
66{
Matt Spinler42828bd2019-10-11 10:39:30 -050067 auto data = pelDataFactory(TestPELType::userHeaderSection);
68 data.resize(data.size() - 1);
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, CorruptDataTest1)
77{
Matt Spinler42828bd2019-10-11 10:39:30 -050078 auto data = pelDataFactory(TestPELType::userHeaderSection);
79 data.resize(data.size() - 1);
Matt Spinler03c1d912019-07-10 14:12:15 -050080
Matt Spinler42828bd2019-10-11 10:39:30 -050081 data.at(0) = 0; // corrupt the section ID
Matt Spinler03c1d912019-07-10 14:12:15 -050082
Matt Spinler42828bd2019-10-11 10:39:30 -050083 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050084 UserHeader uh(stream);
85
86 EXPECT_EQ(uh.valid(), false);
87}
88
89TEST(UserHeaderTest, CorruptDataTest2)
90{
Matt Spinler42828bd2019-10-11 10:39:30 -050091 auto data = pelDataFactory(TestPELType::userHeaderSection);
Matt Spinler03c1d912019-07-10 14:12:15 -050092
Matt Spinler42828bd2019-10-11 10:39:30 -050093 data.at(4) = 0x22; // corrupt the version
Matt Spinler03c1d912019-07-10 14:12:15 -050094
Matt Spinler42828bd2019-10-11 10:39:30 -050095 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050096 UserHeader uh(stream);
97
98 EXPECT_EQ(uh.valid(), false);
99}
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500100
101// Construct the User Header from the message registry
102TEST(UserHeaderTest, ConstructionTest)
103{
104 using namespace openpower::pels::message;
Matt Spinleraadccc82020-04-10 14:33:42 -0500105 {
106 Entry regEntry;
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500107
Matt Spinleraadccc82020-04-10 14:33:42 -0500108 regEntry.name = "test";
109 regEntry.subsystem = 5;
110 regEntry.severity = {{"", 0x40}};
111 regEntry.actionFlags = 0xC000;
112 regEntry.eventType = 1;
113 regEntry.eventScope = 2;
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500114
Matt Spinleraadccc82020-04-10 14:33:42 -0500115 MockDataInterface dataIface;
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500116 std::vector<std::string> names{"systemA"};
117
118 EXPECT_CALL(dataIface, getSystemNames).WillOnce(ReturnRef(names));
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500119
Matt Spinleraadccc82020-04-10 14:33:42 -0500120 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error,
121 dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500122
Matt Spinleraadccc82020-04-10 14:33:42 -0500123 ASSERT_TRUE(uh.valid());
124 EXPECT_EQ(uh.header().id, 0x5548);
125 EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
126 EXPECT_EQ(uh.header().version, 0x01);
127 EXPECT_EQ(uh.header().subType, 0x00);
128 EXPECT_EQ(uh.header().componentID,
129 static_cast<uint16_t>(ComponentID::phosphorLogging));
130
Matt Spinler1f93c592020-09-10 10:43:08 -0500131 EXPECT_EQ(uh.subsystem(), 5);
132 EXPECT_EQ(uh.severity(), 0x40);
133 EXPECT_EQ(uh.eventType(), 1);
134 EXPECT_EQ(uh.scope(), 2);
135 EXPECT_EQ(uh.problemDomain(), 0);
136 EXPECT_EQ(uh.problemVector(), 0);
137 EXPECT_EQ(uh.actionFlags(), 0xC000);
138
139 {
140 // The same thing, but as if the action flags weren't specified
141 // in the registry so they are a nullopt. The object should
142 // then set them to 0xFFFF.
143 EXPECT_CALL(dataIface, getSystemNames).WillOnce(ReturnRef(names));
144
145 regEntry.actionFlags = std::nullopt;
146
147 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error,
148 dataIface);
149 EXPECT_EQ(uh.actionFlags(), 0xFFFF);
150 }
Matt Spinleraadccc82020-04-10 14:33:42 -0500151 }
152
153 // Test the system type based severity lookups
154 {
155 Entry regEntry;
156
157 regEntry.name = "test";
158 regEntry.subsystem = 5;
159 regEntry.severity = {{"", 0x20}, {"systemB", 0x10}, {"systemA", 0x00}};
160
161 MockDataInterface dataIface;
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500162 std::vector<std::string> names1{"systemA"};
163 std::vector<std::string> names2{"systemB"};
164 std::vector<std::string> names3{"systemC"};
165
166 EXPECT_CALL(dataIface, getSystemNames)
167 .WillOnce(ReturnRef(names1))
168 .WillOnce(ReturnRef(names2))
169 .WillOnce(ReturnRef(names3));
Matt Spinleraadccc82020-04-10 14:33:42 -0500170
171 {
172 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error,
173 dataIface);
174
175 EXPECT_EQ(uh.severity(), 0x00);
176 }
177
178 {
179 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error,
180 dataIface);
181
182 EXPECT_EQ(uh.severity(), 0x10);
183 }
184
185 {
186 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error,
187 dataIface);
188
189 EXPECT_EQ(uh.severity(), 0x20);
190 }
191 }
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500192}
193
194// Test that the severity comes from the event log if not
195// in the message registry
196TEST(UserHeaderTest, UseEventLogSevTest)
197{
198 using namespace openpower::pels::message;
199 Entry regEntry;
200
201 regEntry.name = "test";
202 regEntry.subsystem = 5;
203 regEntry.actionFlags = 0xC000;
204 regEntry.eventType = 1;
205 regEntry.eventScope = 2;
206 // Leave off severity
207
Matt Spinleraadccc82020-04-10 14:33:42 -0500208 MockDataInterface dataIface;
209
210 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500211 ASSERT_EQ(uh.severity(), 0x40);
212}
213
214// Test that the optional event type & scope fields work
215TEST(UserHeaderTest, DefaultEventTypeScopeTest)
216{
217 using namespace openpower::pels::message;
218 Entry regEntry;
219
220 regEntry.name = "test";
221 regEntry.subsystem = 5;
Matt Spinleraadccc82020-04-10 14:33:42 -0500222 regEntry.severity = {{"", 0x40}};
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500223 regEntry.actionFlags = 0xC000;
224
Matt Spinleraadccc82020-04-10 14:33:42 -0500225 MockDataInterface dataIface;
226
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500227 std::vector<std::string> names{"systemA"};
228 EXPECT_CALL(dataIface, getSystemNames).WillOnce(ReturnRef(names));
229
Matt Spinleraadccc82020-04-10 14:33:42 -0500230 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error, dataIface);
Matt Spinlerfdb6a202019-09-20 14:09:20 -0500231
232 ASSERT_EQ(uh.eventType(), 0);
233 ASSERT_EQ(uh.scope(), 0x03);
234}