1 #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 
9 namespace fs = std::filesystem;
10 using namespace openpower::pels;
11 
12 class PELTest : public CleanLogID
13 {
14 };
15 
16 TEST_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 
33 TEST_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 
50 TEST_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 
67 TEST_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 
76 TEST_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 
103 TEST_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 }
112