blob: d3eedfcbd1ff7509f07434ecaf92a174eb21d15a [file] [log] [blame]
#include "elog_entry.hpp"
#include "extensions/openpower-pels/pel_types.hpp"
#include "extensions/openpower-pels/private_header.hpp"
#include "extensions/openpower-pels/user_header.hpp"
#include "pel_utils.hpp"
#include <gtest/gtest.h>
using namespace openpower::pels;
TEST(UserHeaderTest, SizeTest)
{
EXPECT_EQ(UserHeader::flattenedSize(), 24);
}
TEST(UserHeaderTest, UnflattenFlattenTest)
{
auto data = pelDataFactory(TestPelType::userHeaderSimple);
Stream stream(*data);
UserHeader uh(stream);
EXPECT_EQ(uh.valid(), true);
EXPECT_EQ(uh.header().id, 0x5548);
EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
EXPECT_EQ(uh.header().version, 0x01);
EXPECT_EQ(uh.header().subType, 0x0A);
EXPECT_EQ(uh.header().componentID, 0x0B0C);
EXPECT_EQ(uh.subsystem(), 0x10);
EXPECT_EQ(uh.scope(), 0x04);
EXPECT_EQ(uh.severity(), 0x20);
EXPECT_EQ(uh.eventType(), 0x00);
EXPECT_EQ(uh.problemDomain(), 0x03);
EXPECT_EQ(uh.problemVector(), 0x04);
EXPECT_EQ(uh.actionFlags(), 0x80C0);
// Now flatten into a vector and check that this vector
// matches the original one.
std::vector<uint8_t> newData;
Stream newStream(newData);
uh.flatten(newStream);
EXPECT_EQ(*data, newData);
// Change a field, then flatten and unflatten again
uh.subsystem() = 0x44;
newStream.offset(0);
newData.clear();
uh.flatten(newStream);
EXPECT_NE(*data, newData);
newStream.offset(0);
UserHeader newUH(newStream);
EXPECT_TRUE(newUH.valid());
EXPECT_EQ(newUH.subsystem(), 0x44);
}
TEST(UserHeaderTest, ShortDataTest)
{
auto data = pelDataFactory(TestPelType::userHeaderSimple);
data->resize(data->size() - 1);
Stream stream(*data);
UserHeader uh(stream);
EXPECT_EQ(uh.valid(), false);
}
TEST(UserHeaderTest, CorruptDataTest1)
{
auto data = pelDataFactory(TestPelType::userHeaderSimple);
data->resize(data->size() - 1);
data->at(0) = 0; // corrupt the section ID
Stream stream(*data);
UserHeader uh(stream);
EXPECT_EQ(uh.valid(), false);
}
TEST(UserHeaderTest, CorruptDataTest2)
{
auto data = pelDataFactory(TestPelType::userHeaderSimple);
data->at(4) = 0x22; // corrupt the version
Stream stream(*data);
UserHeader uh(stream);
EXPECT_EQ(uh.valid(), false);
}
// Construct the User Header from the message registry
TEST(UserHeaderTest, ConstructionTest)
{
using namespace openpower::pels::message;
Entry regEntry;
regEntry.name = "test";
regEntry.subsystem = 5;
regEntry.severity = 0x40;
regEntry.actionFlags = 0xC000;
regEntry.eventType = 1;
regEntry.eventScope = 2;
UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error);
ASSERT_TRUE(uh.valid());
EXPECT_EQ(uh.header().id, 0x5548);
EXPECT_EQ(uh.header().size, UserHeader::flattenedSize());
EXPECT_EQ(uh.header().version, 0x01);
EXPECT_EQ(uh.header().subType, 0x00);
EXPECT_EQ(uh.header().componentID,
static_cast<uint16_t>(ComponentID::phosphorLogging));
ASSERT_EQ(uh.subsystem(), 5);
ASSERT_EQ(uh.severity(), 0x40);
ASSERT_EQ(uh.eventType(), 1);
ASSERT_EQ(uh.scope(), 2);
ASSERT_EQ(uh.problemDomain(), 0);
ASSERT_EQ(uh.problemVector(), 0);
ASSERT_EQ(uh.actionFlags(), 0xC000);
}
// Test that the severity comes from the event log if not
// in the message registry
TEST(UserHeaderTest, UseEventLogSevTest)
{
using namespace openpower::pels::message;
Entry regEntry;
regEntry.name = "test";
regEntry.subsystem = 5;
regEntry.actionFlags = 0xC000;
regEntry.eventType = 1;
regEntry.eventScope = 2;
// Leave off severity
UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error);
ASSERT_EQ(uh.severity(), 0x40);
}
// Test that the optional event type & scope fields work
TEST(UserHeaderTest, DefaultEventTypeScopeTest)
{
using namespace openpower::pels::message;
Entry regEntry;
regEntry.name = "test";
regEntry.subsystem = 5;
regEntry.severity = 0x40;
regEntry.actionFlags = 0xC000;
UserHeader uh(regEntry, phosphor::logging::Entry::Level::Error);
ASSERT_EQ(uh.eventType(), 0);
ASSERT_EQ(uh.scope(), 0x03);
}