tests: Add instance-id tests
They weren't included on the patch introducing the API. Better late than
never!
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Change-Id: I36b38959f427f4abf9fb3308d6e301a2a692170f
diff --git a/tests/instance-id.cpp b/tests/instance-id.cpp
new file mode 100644
index 0000000..e26563f
--- /dev/null
+++ b/tests/instance-id.cpp
@@ -0,0 +1,196 @@
+#include "libpldm/instance-id.h"
+
+#include <cerrno>
+#include <cstdlib>
+#include <cstring>
+#include <filesystem>
+
+#include "libpldm/base.h"
+
+#include <gtest/gtest.h>
+
+static constexpr auto pldmMaxInstanceIds = 32;
+static const std::filesystem::path nonexistentDb = {"remove-this-file"};
+
+TEST(InstanceId, dbInstanceNullDb)
+{
+ ASSERT_FALSE(std::filesystem::exists(nonexistentDb));
+ EXPECT_EQ(::pldm_instance_db_init(nullptr, nonexistentDb.c_str()), -EINVAL);
+}
+
+TEST(InstanceId, dbInstanceNonNullDerefDb)
+{
+ struct pldm_instance_db* db = (struct pldm_instance_db*)8;
+
+ ASSERT_FALSE(std::filesystem::exists(nonexistentDb));
+ EXPECT_EQ(::pldm_instance_db_init(&db, nonexistentDb.c_str()), -EINVAL);
+}
+
+TEST(InstanceId, dbInstanceInvalidPath)
+{
+ struct pldm_instance_db* db = nullptr;
+
+ EXPECT_NE(::pldm_instance_db_init(&db, ""), 0);
+}
+
+class PldmInstanceDbTest : public ::testing::Test
+{
+ protected:
+ void SetUp() override
+ {
+ static const char dbTmpl[] = "db.XXXXXX";
+ char dbName[sizeof(dbTmpl)] = {};
+ int fd;
+
+ ::strncpy(dbName, dbTmpl, sizeof(dbName));
+ fd = ::mkstemp(dbName);
+ ASSERT_NE(fd, -1);
+
+ dbPath = std::filesystem::path(dbName);
+ std::filesystem::resize_file(
+ dbPath, (uintmax_t)(PLDM_MAX_TIDS)*pldmMaxInstanceIds);
+ }
+
+ void TearDown() override
+ {
+ std::filesystem::remove(dbPath);
+ ::close(fd);
+ }
+
+ std::filesystem::path dbPath;
+
+ private:
+ int fd;
+};
+
+TEST_F(PldmInstanceDbTest, dbInstance)
+{
+ struct pldm_instance_db* db = nullptr;
+
+ EXPECT_EQ(pldm_instance_db_init(&db, dbPath.c_str()), 0);
+ EXPECT_EQ(pldm_instance_db_destroy(db), 0);
+}
+
+TEST_F(PldmInstanceDbTest, allocFreeOne)
+{
+ struct pldm_instance_db* db = nullptr;
+ const pldm_tid_t tid = 1;
+ pldm_instance_id_t iid;
+
+ ASSERT_EQ(pldm_instance_db_init(&db, dbPath.c_str()), 0);
+ EXPECT_EQ(pldm_instance_id_alloc(db, tid, &iid), 0);
+ EXPECT_EQ(pldm_instance_id_free(db, tid, iid), 0);
+ ASSERT_EQ(pldm_instance_db_destroy(db), 0);
+}
+
+TEST_F(PldmInstanceDbTest, allocFreeTwoSerialSameTid)
+{
+ static constexpr pldm_tid_t tid = 1;
+
+ struct pldm_instance_db* db = nullptr;
+ pldm_instance_id_t first;
+ pldm_instance_id_t second;
+
+ ASSERT_EQ(pldm_instance_db_init(&db, dbPath.c_str()), 0);
+ EXPECT_EQ(pldm_instance_id_alloc(db, tid, &first), 0);
+ EXPECT_EQ(pldm_instance_id_free(db, tid, first), 0);
+ EXPECT_EQ(pldm_instance_id_alloc(db, tid, &second), 0);
+ EXPECT_EQ(pldm_instance_id_free(db, tid, second), 0);
+ EXPECT_NE(first, second);
+ ASSERT_EQ(pldm_instance_db_destroy(db), 0);
+}
+
+TEST_F(PldmInstanceDbTest, allocFreeTwoSerialDifferentTid)
+{
+ struct
+ {
+ pldm_tid_t tid;
+ pldm_instance_id_t iid;
+ } instances[] = {
+ {1, 0},
+ {2, 0},
+ };
+
+ struct pldm_instance_db* db = nullptr;
+
+ ASSERT_EQ(pldm_instance_db_init(&db, dbPath.c_str()), 0);
+
+ EXPECT_EQ(pldm_instance_id_alloc(db, instances[0].tid, &instances[0].iid),
+ 0);
+ EXPECT_EQ(pldm_instance_id_alloc(db, instances[1].tid, &instances[1].iid),
+ 0);
+
+ EXPECT_EQ(instances[0].iid, instances[1].iid);
+
+ EXPECT_EQ(pldm_instance_id_free(db, instances[1].tid, instances[1].iid), 0);
+ EXPECT_EQ(pldm_instance_id_free(db, instances[0].tid, instances[0].iid), 0);
+
+ ASSERT_EQ(pldm_instance_db_destroy(db), 0);
+}
+
+TEST_F(PldmInstanceDbTest, allocFreeTwoConcurrentSameTid)
+{
+ static constexpr pldm_tid_t tid = 1;
+
+ struct
+ {
+ struct pldm_instance_db* db;
+ pldm_instance_id_t iid;
+ } connections[] = {
+ {nullptr, 0},
+ {nullptr, 0},
+ };
+
+ ASSERT_EQ(pldm_instance_db_init(&connections[0].db, dbPath.c_str()), 0);
+ EXPECT_EQ(
+ pldm_instance_id_alloc(connections[0].db, tid, &connections[0].iid), 0);
+
+ ASSERT_EQ(pldm_instance_db_init(&connections[1].db, dbPath.c_str()), 0);
+ EXPECT_EQ(
+ pldm_instance_id_alloc(connections[1].db, tid, &connections[1].iid), 0);
+
+ EXPECT_NE(connections[0].iid, connections[1].iid);
+
+ EXPECT_EQ(pldm_instance_id_free(connections[1].db, tid, connections[1].iid),
+ 0);
+ ASSERT_EQ(pldm_instance_db_destroy(connections[1].db), 0);
+
+ EXPECT_EQ(pldm_instance_id_free(connections[0].db, tid, connections[0].iid),
+ 0);
+ ASSERT_EQ(pldm_instance_db_destroy(connections[0].db), 0);
+}
+
+TEST_F(PldmInstanceDbTest, allocFreeTwoConcurrentDifferentTid)
+{
+ struct
+ {
+ struct pldm_instance_db* db;
+ pldm_tid_t tid;
+ pldm_instance_id_t iid;
+ } connections[] = {
+ {nullptr, 1, 0},
+ {nullptr, 2, 0},
+ };
+
+ ASSERT_EQ(pldm_instance_db_init(&connections[0].db, dbPath.c_str()), 0);
+ EXPECT_EQ(pldm_instance_id_alloc(connections[0].db, connections[0].tid,
+ &connections[0].iid),
+ 0);
+
+ ASSERT_EQ(pldm_instance_db_init(&connections[1].db, dbPath.c_str()), 0);
+ EXPECT_EQ(pldm_instance_id_alloc(connections[1].db, connections[1].tid,
+ &connections[1].iid),
+ 0);
+
+ EXPECT_EQ(connections[0].iid, connections[1].iid);
+
+ EXPECT_EQ(pldm_instance_id_free(connections[1].db, connections[1].tid,
+ connections[1].iid),
+ 0);
+ ASSERT_EQ(pldm_instance_db_destroy(connections[1].db), 0);
+
+ EXPECT_EQ(pldm_instance_id_free(connections[0].db, connections[0].tid,
+ connections[0].iid),
+ 0);
+ ASSERT_EQ(pldm_instance_db_destroy(connections[0].db), 0);
+}
diff --git a/tests/meson.build b/tests/meson.build
index aba89bc..c41d8d2 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -14,6 +14,7 @@
tests = [
+ 'instance-id',
'libpldm_base_test',
'libpldm_platform_test',
'libpldm_bios_test',