blob: ba71dc2caa7aa3f00997aa5c81ffb1267853b1cc [file] [log] [blame]
Matt Spinlercb6b0592019-07-16 15:58:51 -05001#include "extensions/openpower-pels/pel.hpp"
2#include "pel_utils.hpp"
3
4#include <filesystem>
5#include <fstream>
6
7#include <gtest/gtest.h>
8
9namespace fs = std::filesystem;
10using namespace openpower::pels;
11
12class PELTest : public CleanLogID
13{
14};
15
16TEST_F(PELTest, FlattenTest)
17{
18 auto data = pelDataFactory(TestPelType::pelSimple);
19 auto pel = std::make_unique<PEL>(*data);
20
21 // Check a few fields
22 EXPECT_TRUE(pel->valid());
23 EXPECT_EQ(pel->id(), 0x80818283);
24 EXPECT_EQ(pel->plid(), 0x50515253);
25 EXPECT_EQ(pel->userHeader()->subsystem(), 0x10);
26 EXPECT_EQ(pel->userHeader()->actionFlags(), 0x80C0);
27
28 // Test that data in == data out
29 auto flattenedData = pel->data();
30 ASSERT_EQ(*data, flattenedData);
31}
32
33TEST_F(PELTest, CommitTimeTest)
34{
35 auto data = pelDataFactory(TestPelType::pelSimple);
36 auto pel = std::make_unique<PEL>(*data);
37
38 auto origTime = pel->commitTime();
39 pel->setCommitTime();
40 auto newTime = pel->commitTime();
41
42 ASSERT_NE(origTime, newTime);
43
44 // Make a new PEL and check new value is still there
45 auto newData = pel->data();
46 auto newPel = std::make_unique<PEL>(newData);
47 ASSERT_EQ(newTime, newPel->commitTime());
48}
49
50TEST_F(PELTest, AssignIDTest)
51{
52 auto data = pelDataFactory(TestPelType::pelSimple);
53 auto pel = std::make_unique<PEL>(*data);
54
55 auto origID = pel->id();
56 pel->assignID();
57 auto newID = pel->id();
58
59 ASSERT_NE(origID, newID);
60
61 // Make a new PEL and check new value is still there
62 auto newData = pel->data();
63 auto newPel = std::make_unique<PEL>(newData);
64 ASSERT_EQ(newID, newPel->id());
65}
66
67TEST_F(PELTest, WithLogIDTest)
68{
69 auto data = pelDataFactory(TestPelType::pelSimple);
70 auto pel = std::make_unique<PEL>(*data, 0x42);
71
72 EXPECT_TRUE(pel->valid());
73 EXPECT_EQ(pel->obmcLogID(), 0x42);
74}
75
76TEST_F(PELTest, InvalidPELTest)
77{
78 auto data = pelDataFactory(TestPelType::pelSimple);
79
80 // Too small
81 data->resize(PrivateHeader::flattenedSize());
82
83 auto pel = std::make_unique<PEL>(*data);
84
85 EXPECT_TRUE(pel->privateHeader()->valid());
86 EXPECT_FALSE(pel->userHeader()->valid());
87 EXPECT_FALSE(pel->valid());
88
89 // Ensure we can still flatten bad data
90 auto newData = pel->data();
91 EXPECT_EQ(*data, newData);
92
93 // Now corrupt the private header
94 data = pelDataFactory(TestPelType::pelSimple);
95 data->at(0) = 0;
96 pel = std::make_unique<PEL>(*data);
97
98 EXPECT_FALSE(pel->privateHeader()->valid());
99 EXPECT_TRUE(pel->userHeader()->valid());
100 EXPECT_FALSE(pel->valid());
101}
102
103TEST_F(PELTest, EmptyDataTest)
104{
105 std::vector<uint8_t> data;
106 auto pel = std::make_unique<PEL>(data);
107
108 EXPECT_FALSE(pel->privateHeader()->valid());
109 EXPECT_FALSE(pel->userHeader()->valid());
110 EXPECT_FALSE(pel->valid());
111}