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