libpldm: pdr: add API to remove remote PDRs
Add an API that lets the caller delete all remote PDRs from the BMC's
PDR repository.
The PDR record handles are adjusted in order to
continue to remain sequential, by increments of 1, for the remaining
records.
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: Icf260f6335fc537dd7bb9a7d148d30ec4345636e
diff --git a/libpldm/tests/libpldm_pdr_test.cpp b/libpldm/tests/libpldm_pdr_test.cpp
index 622ec32..c0fbe32 100644
--- a/libpldm/tests/libpldm_pdr_test.cpp
+++ b/libpldm/tests/libpldm_pdr_test.cpp
@@ -36,6 +36,176 @@
pldm_pdr_destroy(repo);
}
+TEST(PDRUpdate, testRemove)
+{
+ std::array<uint8_t, 10> data{};
+
+ auto repo = pldm_pdr_init();
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 0);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 6);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 5);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 5);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 5);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 1);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
+ pldm_pdr_destroy(repo);
+
+ repo = pldm_pdr_init();
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ pldm_pdr_remove_remote_pdrs(repo);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 2);
+ auto handle = pldm_pdr_add(repo, data.data(), data.size(), 0, false);
+ EXPECT_EQ(handle, 3);
+ handle = pldm_pdr_add(repo, data.data(), data.size(), 0, true);
+ EXPECT_EQ(handle, 4);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 4);
+ pldm_pdr_destroy(repo);
+}
+
TEST(PDRAccess, testGet)
{
auto repo = pldm_pdr_init();