1 #include "extensions/openpower-pels/paths.hpp"
2 
3 #include <filesystem>
4 #include <memory>
5 #include <vector>
6 
7 #include <gtest/gtest.h>
8 
9 /**
10  * @brief Test fixture to remove the pelID file that PELs use.
11  */
12 class CleanLogID : public ::testing::Test
13 {
14   protected:
SetUpTestCase()15     static void SetUpTestCase()
16     {
17         pelIDFile = openpower::pels::getPELIDFile();
18     }
19 
TearDownTestCase()20     static void TearDownTestCase()
21     {
22         std::filesystem::remove_all(
23             std::filesystem::path{pelIDFile}.parent_path());
24     }
25 
26     static std::filesystem::path pelIDFile;
27 };
28 
29 class CleanPELFiles : public ::testing::Test
30 {
31   protected:
SetUp()32     void SetUp() override
33     {
34         pelIDFile = openpower::pels::getPELIDFile();
35         repoPath = openpower::pels::getPELRepoPath();
36         registryPath = openpower::pels::getPELReadOnlyDataPath();
37     }
38 
TearDown()39     void TearDown() override
40     {
41         std::filesystem::remove_all(
42             std::filesystem::path{pelIDFile}.parent_path());
43         std::filesystem::remove_all(repoPath);
44         std::filesystem::remove_all(registryPath);
45     }
46 
47     static std::filesystem::path pelIDFile;
48     static std::filesystem::path repoPath;
49     static std::filesystem::path registryPath;
50 };
51 
52 /**
53  * @brief Tells the factory which PEL to create
54  */
55 enum class TestPELType
56 {
57     pelSimple,
58     privateHeaderSection,
59     userHeaderSection,
60     primarySRCSection,
61     primarySRCSection2Callouts,
62     failingMTMSSection,
63     extendedUserDataSection
64 };
65 
66 /**
67  * @brief Tells the SRC factory which data to create
68  */
69 enum class TestSRCType
70 {
71     fruIdentityStructure,
72     pceIdentityStructure,
73     mruStructure,
74     calloutStructureA,
75     calloutStructureB,
76     calloutSection2Callouts
77 };
78 
79 /**
80  * @brief PEL data factory, for testing
81  *
82  * @param[in] type - the type of data to create
83  *
84  * @return std::vector<uint8_t> - the PEL data
85  */
86 std::vector<uint8_t> pelDataFactory(TestPELType type);
87 
88 /**
89  * @brief PEL factory to create a PEL with the specified fields.
90  *
91  * The size is obtained by adding a UserData section of
92  * the size necessary after adding the 5 required sections.
93  *
94  * @param[in] id - The desired PEL ID
95  * @param[in] creatorID - The desired creator ID
96  * @param[in] severity - The desired severity
97  * @param[in] actionFlags - The desired action flags
98  * @param[in] size - The desired size.
99  *                   Must be:
100  *                     * 4B aligned
101  *                     * min 276 (size of the 5 required sections)
102  *                     * max 16834
103  *
104  * @return std::vector<uint8_t> - The PEL data
105  */
106 std::vector<uint8_t> pelFactory(uint32_t id, char creatorID, uint8_t severity,
107                                 uint16_t actionFlags, size_t size);
108 
109 /**
110  * @brief SRC data factory, for testing
111  *
112  * Provides pieces of the SRC PEL section, such as a callout.
113  *
114  * @param[in] type - the type of data to create
115  *
116  * @return std::vector<uint8_t> - The SRC data
117  */
118 std::vector<uint8_t> srcDataFactory(TestSRCType type);
119 
120 /**
121  * @brief Helper function to read raw PEL data from a file
122  *
123  * @param[in] path - the path to read
124  *
125  * @return std::unique_ptr<std::vector<uint8_t>> - the data from the file
126  */
127 std::unique_ptr<std::vector<uint8_t>>
128     readPELFile(const std::filesystem::path& path);
129