PEL: Add function to generate unique PEL IDs
Create generatePELID() to return a unique 4B PEL ID every time it is
called. It will start at a base value, and then increment by 1 each
time. It uses a file to save the next value to use.
This will be used by the PEL handling code to create unique values
for the error log ID field in the Private Header section.
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I841a8dcc5dc48e2b663004be3dccfb114ba366f2
diff --git a/test/openpower-pels/Makefile.include b/test/openpower-pels/Makefile.include
index f860db2..0e0257c 100644
--- a/test/openpower-pels/Makefile.include
+++ b/test/openpower-pels/Makefile.include
@@ -3,6 +3,7 @@
check_PROGRAMS += \
additional_data_test \
bcd_time_test \
+ log_id_test \
private_header_test \
section_header_test \
stream_test \
@@ -58,3 +59,12 @@
$(test_ldadd) \
$(pel_objects)
user_header_test_LDFLAGS = $(test_ldflags)
+
+log_id_test_SOURCES = \
+ %reldir%/log_id_test.cpp %reldir%/paths.cpp
+log_id_test_CPPFLAGS = $(test_cppflags)
+log_id_test_CXXFLAGS = $(test_cxxflags)
+log_id_test_LDADD = \
+ $(test_ldadd) \
+ $(top_builddir)/extensions/openpower-pels/log_id.o
+log_id_test_LDFLAGS = $(test_ldflags)
diff --git a/test/openpower-pels/log_id_test.cpp b/test/openpower-pels/log_id_test.cpp
new file mode 100644
index 0000000..e5f2632
--- /dev/null
+++ b/test/openpower-pels/log_id_test.cpp
@@ -0,0 +1,42 @@
+#include "extensions/openpower-pels/log_id.hpp"
+#include "extensions/openpower-pels/paths.hpp"
+
+#include <arpa/inet.h>
+
+#include <filesystem>
+
+#include <gtest/gtest.h>
+
+using namespace openpower::pels;
+namespace fs = std::filesystem;
+
+TEST(LogIdTest, TimeBasedIDTest)
+{
+ uint32_t lastID = 0;
+ for (int i = 0; i < 10; i++)
+ {
+ auto id = detail::getTimeBasedLogID();
+
+ EXPECT_EQ(id & 0xFF000000, 0x50000000);
+ EXPECT_NE(id, lastID);
+ lastID = id;
+ }
+}
+
+TEST(LogIdTest, IDTest)
+{
+ EXPECT_EQ(generatePELID(), 0x50000001);
+ EXPECT_EQ(generatePELID(), 0x50000002);
+ EXPECT_EQ(generatePELID(), 0x50000003);
+ EXPECT_EQ(generatePELID(), 0x50000004);
+ EXPECT_EQ(generatePELID(), 0x50000005);
+ EXPECT_EQ(generatePELID(), 0x50000006);
+
+ auto backingFile = getPELIDFile();
+ fs::remove(backingFile);
+ EXPECT_EQ(generatePELID(), 0x50000001);
+ EXPECT_EQ(generatePELID(), 0x50000002);
+ EXPECT_EQ(generatePELID(), 0x50000003);
+
+ fs::remove_all(fs::path{backingFile}.parent_path());
+}
diff --git a/test/openpower-pels/paths.cpp b/test/openpower-pels/paths.cpp
new file mode 100644
index 0000000..464b92c
--- /dev/null
+++ b/test/openpower-pels/paths.cpp
@@ -0,0 +1,26 @@
+#include "extensions/openpower-pels/paths.hpp"
+
+#include <filesystem>
+
+namespace openpower
+{
+namespace pels
+{
+
+// Use paths that work in unit tests.
+
+std::filesystem::path getPELIDFile()
+{
+ static std::string idFile;
+
+ if (idFile.empty())
+ {
+ char templ[] = "/tmp/logidtestXXXXXX";
+ std::filesystem::path dir = mkdtemp(templ);
+ idFile = dir / "logid";
+ }
+ return idFile;
+}
+
+} // namespace pels
+} // namespace openpower