blob: 1f9917a337d68ccb6b466ba9bf141be9be43e590 [file] [log] [blame]
Matt Spinlerb8323632019-09-20 15:11:04 -05001#include "elog_entry.hpp"
Matt Spinler131870c2019-09-25 13:29:04 -05002#include "extensions/openpower-pels/generic.hpp"
Matt Spinlercb6b0592019-07-16 15:58:51 -05003#include "extensions/openpower-pels/pel.hpp"
4#include "pel_utils.hpp"
5
6#include <filesystem>
7#include <fstream>
8
9#include <gtest/gtest.h>
10
11namespace fs = std::filesystem;
12using namespace openpower::pels;
13
14class PELTest : public CleanLogID
15{
16};
17
18TEST_F(PELTest, FlattenTest)
19{
Matt Spinler42828bd2019-10-11 10:39:30 -050020 auto data = pelDataFactory(TestPELType::pelSimple);
21 auto origData = data;
22 auto pel = std::make_unique<PEL>(data);
Matt Spinlercb6b0592019-07-16 15:58:51 -050023
24 // Check a few fields
25 EXPECT_TRUE(pel->valid());
26 EXPECT_EQ(pel->id(), 0x80818283);
27 EXPECT_EQ(pel->plid(), 0x50515253);
28 EXPECT_EQ(pel->userHeader()->subsystem(), 0x10);
29 EXPECT_EQ(pel->userHeader()->actionFlags(), 0x80C0);
30
31 // Test that data in == data out
32 auto flattenedData = pel->data();
Matt Spinler07eefc52019-09-26 11:18:26 -050033 ASSERT_EQ(origData, flattenedData);
Matt Spinlercb6b0592019-07-16 15:58:51 -050034}
35
36TEST_F(PELTest, CommitTimeTest)
37{
Matt Spinler42828bd2019-10-11 10:39:30 -050038 auto data = pelDataFactory(TestPELType::pelSimple);
39 auto pel = std::make_unique<PEL>(data);
Matt Spinlercb6b0592019-07-16 15:58:51 -050040
41 auto origTime = pel->commitTime();
42 pel->setCommitTime();
43 auto newTime = pel->commitTime();
44
45 ASSERT_NE(origTime, newTime);
46
47 // Make a new PEL and check new value is still there
48 auto newData = pel->data();
49 auto newPel = std::make_unique<PEL>(newData);
50 ASSERT_EQ(newTime, newPel->commitTime());
51}
52
53TEST_F(PELTest, AssignIDTest)
54{
Matt Spinler42828bd2019-10-11 10:39:30 -050055 auto data = pelDataFactory(TestPELType::pelSimple);
56 auto pel = std::make_unique<PEL>(data);
Matt Spinlercb6b0592019-07-16 15:58:51 -050057
58 auto origID = pel->id();
59 pel->assignID();
60 auto newID = pel->id();
61
62 ASSERT_NE(origID, newID);
63
64 // Make a new PEL and check new value is still there
65 auto newData = pel->data();
66 auto newPel = std::make_unique<PEL>(newData);
67 ASSERT_EQ(newID, newPel->id());
68}
69
70TEST_F(PELTest, WithLogIDTest)
71{
Matt Spinler42828bd2019-10-11 10:39:30 -050072 auto data = pelDataFactory(TestPELType::pelSimple);
73 auto pel = std::make_unique<PEL>(data, 0x42);
Matt Spinlercb6b0592019-07-16 15:58:51 -050074
75 EXPECT_TRUE(pel->valid());
76 EXPECT_EQ(pel->obmcLogID(), 0x42);
77}
78
79TEST_F(PELTest, InvalidPELTest)
80{
Matt Spinler42828bd2019-10-11 10:39:30 -050081 auto data = pelDataFactory(TestPELType::pelSimple);
Matt Spinlercb6b0592019-07-16 15:58:51 -050082
83 // Too small
Matt Spinler42828bd2019-10-11 10:39:30 -050084 data.resize(PrivateHeader::flattenedSize());
Matt Spinlercb6b0592019-07-16 15:58:51 -050085
Matt Spinler42828bd2019-10-11 10:39:30 -050086 auto pel = std::make_unique<PEL>(data);
Matt Spinlercb6b0592019-07-16 15:58:51 -050087
88 EXPECT_TRUE(pel->privateHeader()->valid());
89 EXPECT_FALSE(pel->userHeader()->valid());
90 EXPECT_FALSE(pel->valid());
91
Matt Spinlercb6b0592019-07-16 15:58:51 -050092 // Now corrupt the private header
Matt Spinler42828bd2019-10-11 10:39:30 -050093 data = pelDataFactory(TestPELType::pelSimple);
94 data.at(0) = 0;
95 pel = std::make_unique<PEL>(data);
Matt Spinlercb6b0592019-07-16 15:58:51 -050096
97 EXPECT_FALSE(pel->privateHeader()->valid());
98 EXPECT_TRUE(pel->userHeader()->valid());
99 EXPECT_FALSE(pel->valid());
100}
101
102TEST_F(PELTest, EmptyDataTest)
103{
104 std::vector<uint8_t> data;
105 auto pel = std::make_unique<PEL>(data);
106
107 EXPECT_FALSE(pel->privateHeader()->valid());
108 EXPECT_FALSE(pel->userHeader()->valid());
109 EXPECT_FALSE(pel->valid());
110}
Matt Spinlerb8323632019-09-20 15:11:04 -0500111
112TEST_F(PELTest, CreateFromRegistryTest)
113{
114 message::Entry regEntry;
115 uint64_t timestamp = 5;
116
117 regEntry.name = "test";
118 regEntry.subsystem = 5;
119 regEntry.actionFlags = 0xC000;
Matt Spinlerbd716f02019-10-15 10:54:11 -0500120 regEntry.src.type = 0xBD;
121 regEntry.src.reasonCode = 0x1234;
Matt Spinlerb8323632019-09-20 15:11:04 -0500122
Matt Spinlerbd716f02019-10-15 10:54:11 -0500123 AdditionalData ad;
124
125 PEL pel{regEntry, 42, timestamp, phosphor::logging::Entry::Level::Error,
126 ad};
Matt Spinlerb8323632019-09-20 15:11:04 -0500127
128 EXPECT_TRUE(pel.valid());
129 EXPECT_EQ(pel.privateHeader()->obmcLogID(), 42);
130 EXPECT_EQ(pel.userHeader()->severity(), 0x40);
131
Matt Spinlerbd716f02019-10-15 10:54:11 -0500132 EXPECT_EQ(pel.primarySRC().value()->asciiString(),
133 "BD051234 ");
134
Matt Spinlerb8323632019-09-20 15:11:04 -0500135 // Add more checks as more sections are added
136}
Matt Spinler131870c2019-09-25 13:29:04 -0500137
138// Test that we'll create Generic optional sections for sections that
139// there aren't explicit classes for.
140TEST_F(PELTest, GenericSectionTest)
141{
Matt Spinler42828bd2019-10-11 10:39:30 -0500142 auto data = pelDataFactory(TestPELType::pelSimple);
Matt Spinler131870c2019-09-25 13:29:04 -0500143
144 std::vector<uint8_t> section1{0x58, 0x58, // ID 'XX'
145 0x00, 0x18, // Size
146 0x01, 0x02, // version, subtype
147 0x03, 0x04, // comp ID
148
149 // some data
150 0x20, 0x30, 0x05, 0x09, 0x11, 0x1E, 0x1, 0x63,
151 0x20, 0x31, 0x06, 0x0F, 0x09, 0x22, 0x3A,
152 0x00};
153
154 std::vector<uint8_t> section2{
155 0x59, 0x59, // ID 'YY'
156 0x00, 0x20, // Size
157 0x01, 0x02, // version, subtype
158 0x03, 0x04, // comp ID
159
160 // some data
161 0x20, 0x30, 0x05, 0x09, 0x11, 0x1E, 0x1, 0x63, 0x20, 0x31, 0x06, 0x0F,
162 0x09, 0x22, 0x3A, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
163
164 // Add the new sections at the end
Matt Spinler42828bd2019-10-11 10:39:30 -0500165 data.insert(data.end(), section1.begin(), section1.end());
166 data.insert(data.end(), section2.begin(), section2.end());
Matt Spinler131870c2019-09-25 13:29:04 -0500167
168 // Increment the section count
Matt Spinler42828bd2019-10-11 10:39:30 -0500169 data.at(27) += 2;
170 auto origData = data;
Matt Spinler131870c2019-09-25 13:29:04 -0500171
Matt Spinler42828bd2019-10-11 10:39:30 -0500172 PEL pel{data};
Matt Spinler131870c2019-09-25 13:29:04 -0500173
174 const auto& sections = pel.optionalSections();
175
176 bool foundXX = false;
177 bool foundYY = false;
178
179 // Check that we can find these 2 Generic sections
180 for (const auto& section : sections)
181 {
182 if (section->header().id == 0x5858)
183 {
184 foundXX = true;
185 EXPECT_NE(dynamic_cast<Generic*>(section.get()), nullptr);
186 }
187 else if (section->header().id == 0x5959)
188 {
189 foundYY = true;
190 EXPECT_NE(dynamic_cast<Generic*>(section.get()), nullptr);
191 }
192 }
193
194 EXPECT_TRUE(foundXX);
195 EXPECT_TRUE(foundYY);
Matt Spinler07eefc52019-09-26 11:18:26 -0500196
197 // Now flatten and check
198 auto newData = pel.data();
199
200 EXPECT_EQ(origData, newData);
Matt Spinler131870c2019-09-25 13:29:04 -0500201}
202
203// Test that an invalid section will still get a Generic object
204TEST_F(PELTest, InvalidGenericTest)
205{
Matt Spinler42828bd2019-10-11 10:39:30 -0500206 auto data = pelDataFactory(TestPELType::pelSimple);
Matt Spinler131870c2019-09-25 13:29:04 -0500207
208 // Not a valid section
209 std::vector<uint8_t> section1{0x01, 0x02, 0x03};
210
Matt Spinler42828bd2019-10-11 10:39:30 -0500211 data.insert(data.end(), section1.begin(), section1.end());
Matt Spinler131870c2019-09-25 13:29:04 -0500212
213 // Increment the section count
Matt Spinler42828bd2019-10-11 10:39:30 -0500214 data.at(27) += 1;
Matt Spinler131870c2019-09-25 13:29:04 -0500215
Matt Spinler42828bd2019-10-11 10:39:30 -0500216 PEL pel{data};
Matt Spinler131870c2019-09-25 13:29:04 -0500217 EXPECT_FALSE(pel.valid());
218
219 const auto& sections = pel.optionalSections();
220
221 bool foundGeneric = false;
222 for (const auto& section : sections)
223 {
224 if (dynamic_cast<Generic*>(section.get()) != nullptr)
225 {
226 foundGeneric = true;
227 EXPECT_EQ(section->valid(), false);
228 break;
229 }
230 }
231
232 EXPECT_TRUE(foundGeneric);
233}