blob: 88ac9a5fee7f03ccc0146938a3ec1c9d76cdc13e [file] [log] [blame]
Matt Spinlerfdb6a202019-09-20 14:09:20 -05001#include "elog_entry.hpp"
2#include "extensions/openpower-pels/pel_types.hpp"
Matt Spinler03c1d912019-07-10 14:12:15 -05003#include "extensions/openpower-pels/private_header.hpp"
4#include "extensions/openpower-pels/user_header.hpp"
5#include "pel_utils.hpp"
6
7#include <gtest/gtest.h>
8
9using namespace openpower::pels;
10
11TEST(UserHeaderTest, SizeTest)
12{
13 EXPECT_EQ(UserHeader::flattenedSize(), 24);
14}
15
16TEST(UserHeaderTest, UnflattenFlattenTest)
17{
Matt Spinler42828bd2019-10-11 10:39:30 -050018 auto data = pelDataFactory(TestPELType::userHeaderSection);
Matt Spinler03c1d912019-07-10 14:12:15 -050019
Matt Spinler42828bd2019-10-11 10:39:30 -050020 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050021 UserHeader uh(stream);
22 EXPECT_EQ(uh.valid(), true);
23
24 EXPECT_EQ(uh.header().id, 0x5548);
25 EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
26 EXPECT_EQ(uh.header().version, 0x01);
27 EXPECT_EQ(uh.header().subType, 0x0A);
28 EXPECT_EQ(uh.header().componentID, 0x0B0C);
29
30 EXPECT_EQ(uh.subsystem(), 0x10);
31 EXPECT_EQ(uh.scope(), 0x04);
32 EXPECT_EQ(uh.severity(), 0x20);
33 EXPECT_EQ(uh.eventType(), 0x00);
34 EXPECT_EQ(uh.problemDomain(), 0x03);
35 EXPECT_EQ(uh.problemVector(), 0x04);
36 EXPECT_EQ(uh.actionFlags(), 0x80C0);
37
38 // Now flatten into a vector and check that this vector
39 // matches the original one.
40 std::vector<uint8_t> newData;
41 Stream newStream(newData);
42
Matt Spinlercf5a8d02019-09-05 12:58:53 -050043 uh.flatten(newStream);
Matt Spinler42828bd2019-10-11 10:39:30 -050044 EXPECT_EQ(data, newData);
Matt Spinler03c1d912019-07-10 14:12:15 -050045
46 // Change a field, then flatten and unflatten again
47 uh.subsystem() = 0x44;
48
49 newStream.offset(0);
50 newData.clear();
Matt Spinlercf5a8d02019-09-05 12:58:53 -050051 uh.flatten(newStream);
Matt Spinler42828bd2019-10-11 10:39:30 -050052 EXPECT_NE(data, newData);
Matt Spinler03c1d912019-07-10 14:12:15 -050053
54 newStream.offset(0);
55 UserHeader newUH(newStream);
56
57 EXPECT_TRUE(newUH.valid());
58 EXPECT_EQ(newUH.subsystem(), 0x44);
59}
60
61TEST(UserHeaderTest, ShortDataTest)
62{
Matt Spinler42828bd2019-10-11 10:39:30 -050063 auto data = pelDataFactory(TestPELType::userHeaderSection);
64 data.resize(data.size() - 1);
Matt Spinler03c1d912019-07-10 14:12:15 -050065
Matt Spinler42828bd2019-10-11 10:39:30 -050066 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050067 UserHeader uh(stream);
68
69 EXPECT_EQ(uh.valid(), false);
70}
71
72TEST(UserHeaderTest, CorruptDataTest1)
73{
Matt Spinler42828bd2019-10-11 10:39:30 -050074 auto data = pelDataFactory(TestPELType::userHeaderSection);
75 data.resize(data.size() - 1);
Matt Spinler03c1d912019-07-10 14:12:15 -050076
Matt Spinler42828bd2019-10-11 10:39:30 -050077 data.at(0) = 0; // corrupt the section ID
Matt Spinler03c1d912019-07-10 14:12:15 -050078
Matt Spinler42828bd2019-10-11 10:39:30 -050079 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050080 UserHeader uh(stream);
81
82 EXPECT_EQ(uh.valid(), false);
83}
84
85TEST(UserHeaderTest, CorruptDataTest2)
86{
Matt Spinler42828bd2019-10-11 10:39:30 -050087 auto data = pelDataFactory(TestPELType::userHeaderSection);
Matt Spinler03c1d912019-07-10 14:12:15 -050088
Matt Spinler42828bd2019-10-11 10:39:30 -050089 data.at(4) = 0x22; // corrupt the version
Matt Spinler03c1d912019-07-10 14:12:15 -050090
Matt Spinler42828bd2019-10-11 10:39:30 -050091 Stream stream(data);
Matt Spinler03c1d912019-07-10 14:12:15 -050092 UserHeader uh(stream);
93
94 EXPECT_EQ(uh.valid(), false);
95}
Matt Spinlerfdb6a202019-09-20 14:09:20 -050096
97// Construct the User Header from the message registry
98TEST(UserHeaderTest, ConstructionTest)
99{
100 using namespace openpower::pels::message;
101 Entry regEntry;
102
103 regEntry.name = "test";
104 regEntry.subsystem = 5;
105 regEntry.severity = 0x40;
106 regEntry.actionFlags = 0xC000;
107 regEntry.eventType = 1;
108 regEntry.eventScope = 2;
109
110 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error);
111
112 ASSERT_TRUE(uh.valid());
113 EXPECT_EQ(uh.header().id, 0x5548);
114 EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
115 EXPECT_EQ(uh.header().version, 0x01);
116 EXPECT_EQ(uh.header().subType, 0x00);
117 EXPECT_EQ(uh.header().componentID,
118 static_cast<uint16_t>(ComponentID::phosphorLogging));
119
120 ASSERT_EQ(uh.subsystem(), 5);
121 ASSERT_EQ(uh.severity(), 0x40);
122 ASSERT_EQ(uh.eventType(), 1);
123 ASSERT_EQ(uh.scope(), 2);
124 ASSERT_EQ(uh.problemDomain(), 0);
125 ASSERT_EQ(uh.problemVector(), 0);
126 ASSERT_EQ(uh.actionFlags(), 0xC000);
127}
128
129// Test that the severity comes from the event log if not
130// in the message registry
131TEST(UserHeaderTest, UseEventLogSevTest)
132{
133 using namespace openpower::pels::message;
134 Entry regEntry;
135
136 regEntry.name = "test";
137 regEntry.subsystem = 5;
138 regEntry.actionFlags = 0xC000;
139 regEntry.eventType = 1;
140 regEntry.eventScope = 2;
141 // Leave off severity
142
143 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error);
144 ASSERT_EQ(uh.severity(), 0x40);
145}
146
147// Test that the optional event type & scope fields work
148TEST(UserHeaderTest, DefaultEventTypeScopeTest)
149{
150 using namespace openpower::pels::message;
151 Entry regEntry;
152
153 regEntry.name = "test";
154 regEntry.subsystem = 5;
155 regEntry.severity = 0x40;
156 regEntry.actionFlags = 0xC000;
157
158 UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error);
159
160 ASSERT_EQ(uh.eventType(), 0);
161 ASSERT_EQ(uh.scope(), 0x03);
162}