pdr: Add pldm_pdr_delete_by_sensor_id() API
Adds a new libpldm API to delete the PDR record from the PDR repo
based on the sensor ID of the PDR. This API is used when a state
sensor PDR record needs to be deleted based on the sensor ID
and return the corresponding record handle deleted.
Change-Id: Ia78c24467f6460fdcf456a31ac851fa7b0c0b385
Signed-off-by: Pavithra Barithaya <pavithrabarithaya07@gmail.com>
diff --git a/tests/dsp/pdr.cpp b/tests/dsp/pdr.cpp
index 6fe8d9c..0d19de2 100644
--- a/tests/dsp/pdr.cpp
+++ b/tests/dsp/pdr.cpp
@@ -719,6 +719,97 @@
#endif
#ifdef LIBPLDM_API_TESTING
+TEST(PDRAccess, testRemoveBySensorIDDecodeFailure)
+{
+ auto repo = pldm_pdr_init();
+ ASSERT_NE(repo, nullptr);
+
+ // Create a deliberately undersized PDR record
+ size_t invalidPdrSize = sizeof(pldm_state_sensor_pdr) - 4; // Invalid size
+ std::vector<uint8_t> entry(invalidPdrSize, 0);
+ pldm_state_sensor_pdr* pdr = new (entry.data()) pldm_state_sensor_pdr;
+ pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
+ pdr->sensor_id = 50; // random ID
+
+ uint32_t record_handle = 0;
+ EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1,
+ &record_handle),
+ 0);
+ // Attempt to delete the malformed record by effecter_id
+ uint32_t removed_record_handle = 0;
+ int rc =
+ pldm_pdr_delete_by_sensor_id(repo, 50, false, &removed_record_handle);
+
+ // We expect a failure from decode_pldm_state_effecter_pdr
+ EXPECT_NE(rc, 0);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo),
+ 1u); // Record remains in the repo
+
+ pldm_pdr_destroy(repo);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(PDRAccess, testRemoveBySensorID)
+{
+ auto repo = pldm_pdr_init();
+ ASSERT_NE(repo, nullptr);
+
+ size_t pdrSize = 0;
+ pdrSize =
+ sizeof(pldm_state_sensor_pdr) + sizeof(state_sensor_possible_states);
+ std::vector<uint8_t> entry{};
+ entry.resize(pdrSize);
+
+ pldm_state_sensor_pdr* pdr = new (entry.data()) pldm_state_sensor_pdr;
+
+ pdr->hdr.type = PLDM_STATE_SENSOR_PDR;
+ pdr->sensor_id = 1;
+ uint32_t handle = 1;
+ EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
+ 0);
+
+ pdr->sensor_id = 2;
+ handle = 2;
+ EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
+ 0);
+
+ pdr->sensor_id = 10;
+ handle = 0;
+ EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
+ 0);
+
+ pdr->sensor_id = 20;
+ handle = 10;
+ EXPECT_EQ(pldm_pdr_add(repo, entry.data(), entry.size(), false, 1, &handle),
+ 0);
+
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 4u);
+
+ uint32_t removed_record_handle{};
+ int rc =
+ pldm_pdr_delete_by_sensor_id(repo, 1, false, &removed_record_handle);
+ EXPECT_EQ(rc, 0);
+ EXPECT_EQ(removed_record_handle, 1);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
+
+ // Error case where the effceter ID is not present in the repo
+ uint32_t removed_rec_handle{};
+ rc = pldm_pdr_delete_by_sensor_id(repo, 15, false, &removed_rec_handle);
+ EXPECT_EQ(rc, -ENOENT);
+ EXPECT_EQ(removed_rec_handle, 0);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 3u);
+
+ rc = pldm_pdr_delete_by_sensor_id(repo, 10, false, &removed_record_handle);
+ EXPECT_EQ(rc, 0);
+ EXPECT_EQ(removed_record_handle, 3);
+ EXPECT_EQ(pldm_pdr_get_record_count(repo), 2u);
+
+ pldm_pdr_destroy(repo);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
TEST(PDRAccess, testGetTerminusHandle)
{