@@ -1,7 +1,8 @@
# -*-Makefile-*-
PLDM_TEST := core/pldm/test/test-pldm-fileio \
core/pldm/test/test-pldm-bios \
- core/pldm/test/test-pldm-platform
+ core/pldm/test/test-pldm-platform \
+ core/pldm/test/test-pldm-fru
LCOV_EXCLUDE += $(PLDM_TEST:%=%.c)
new file mode 100644
@@ -0,0 +1,193 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+// Copyright 2022 IBM Corp.
+
+#include "common/test-pldm-common.c"
+
+
+#define TEST_BMC_VERSION "tes_t_1.0"
+
+bool get_fru_record_table_in_progress;
+int pldm_test_verify_response(void *response_msg, size_t response_len);
+int pldm_test_verify_response_fru(void *response_msg, size_t response_len);
+int test_fru_table_metadata_request(void);
+
+
+/*
+ * This function duplicates BMC functionality for Pldm self test
+ * It will only handle PLDM_FRU type response
+ */
+int pldm_test_verify_response(void *response_msg, size_t response_len)
+{
+ switch (((struct pldm_msg *)response_msg)->hdr.type) {
+
+ case PLDM_FRU:
+ return pldm_test_verify_response_fru(response_msg, response_len);
+
+ default:
+ printf("PLDM_TEST: Not equal to PLDM_FRU\n");
+ return OPAL_PARAMETER;
+ }
+
+
+}
+
+
+/*
+ * This function duplicates BMC functionality for Pldm self test
+ * It will only handle PLDM_FRU type response and tries to verify that
+ * PLDM response is same as expected
+ */
+int pldm_test_verify_response_fru(void *response_msg, size_t response_len)
+{
+ uint8_t completion_code;
+ int rc = 0;
+ int payload_len = 0;
+ uint8_t fru_data_major_version;
+ uint8_t fru_data_minor_version;
+ uint32_t fru_table_maximum_size;
+ uint32_t fru_table_length;
+ uint16_t total_record_set_identifiers;
+ uint16_t total_table_records;
+ uint32_t checksum;
+
+ switch (((struct pldm_msg *)response_msg)->hdr.command) {
+ case PLDM_GET_FRU_RECORD_TABLE_METADATA:
+
+ /*
+ * Test that response receive for
+ * PLDM_GET_FRU_RECORD_TABLE_METADATA
+ * only when specific request in progress
+ */
+ if (get_fru_record_table_in_progress != true)
+ return OPAL_PARAMETER;
+
+ payload_len = response_len - sizeof(struct pldm_msg_hdr);
+ rc = decode_get_fru_record_table_metadata_resp(response_msg, payload_len,
+ &(completion_code), &fru_data_major_version,
+ &fru_data_minor_version,
+ &fru_table_maximum_size,
+ &fru_table_length,
+ &total_record_set_identifiers,
+ &total_table_records,
+ &checksum);
+
+ /*
+ * Test if PLDM request completed with success i.e. completion code = PLDM_SUCCESS
+ * and test if other parameter as expected then return OPAL_SUCCESS
+ * else return error OPAL_PARAMETER
+ */
+ if (rc == PLDM_SUCCESS && completion_code == PLDM_SUCCESS &&
+ total_record_set_identifiers == 1
+ && total_table_records == 1)
+ return OPAL_SUCCESS;
+ else
+ return OPAL_PARAMETER;
+ break;
+
+ default:
+ return OPAL_PARAMETER;
+
+ }
+
+ return OPAL_SUCCESS;
+
+
+
+}
+
+
+/*
+ * This function duplicates BMC functionality for Pldm self test
+ * It will only handle PLDM request
+ * or now we don't have any request
+ */
+int pldm_test_reply_request(void *request_msg, size_t request_len,
+ void **response_msg, size_t *response_len)
+{
+ if (request_msg != NULL && response_msg != NULL) {
+ (void)request_len;
+ (void)*response_len;
+ }
+ return OPAL_PARAMETER;
+
+}
+
+/*
+ * This function duplicates BMC functionality for Pldm self test
+ * It tries to send PLDM_GET_FRU_RECORD_TABLE_METADATA on behalf of BMC
+ */
+int test_fru_table_metadata_request(void)
+{
+ void *pldm_req;
+ int size, rc;
+
+ size = sizeof(struct pldm_msg_hdr);
+ pldm_req = malloc(size);
+ /*
+ * Enable flag that indicate PLDM_GET_FRU_RECORD_TABLE_METADATA
+ * request in progress.
+ * This flag is used only for test
+ */
+ get_fru_record_table_in_progress = true;
+
+ /* Encode request on behalf of BMC */
+ rc = encode_get_fru_record_table_metadata_req(0, pldm_req, 0);
+ if (rc != PLDM_SUCCESS)
+ return OPAL_PARAMETER;
+
+ /* initialize responder */
+ rc = pldm_mctp_responder_init();
+ if (rc != OPAL_SUCCESS)
+ return rc;
+
+ /* skip mctp layer directly call handle */
+ rc = pldm_handle(BMC_EID, pldm_req, size);
+ if (rc != OPAL_SUCCESS)
+ return rc;
+
+ /*
+ * Disable flag that indicate PLDM_GET_FRU_RECORD_TABLE_METADATA
+ * request in progress.
+ * This flag is used only for test
+ */
+ get_fru_record_table_in_progress = false;
+
+ return rc;
+
+}
+
+
+int main(void)
+{
+ int rc;
+ void *fru_record_table;
+ uint32_t fru_record_table_size;
+
+ /*
+ * Get fru table when fru table not created
+ * return error OPAL_PARAMETER
+ */
+ rc = pldm_fru_get_table(&fru_record_table, &fru_record_table_size);
+ if (rc != OPAL_PARAMETER) {
+ printf("PLDM_TEST Failed : pldm_fru_get_table",
+ " expected=%d received=%d\n", OPAL_PARAMETER, rc);
+ return OPAL_PARAMETER;
+ }
+
+ /* Sending request in behalf of bmc and checking response */
+ rc = test_fru_table_metadata_request();
+ if (rc != OPAL_SUCCESS) {
+ printf("PLDM_TEST Failed : test_fru_table_metadata_request return=%d\n", rc);
+ return rc;
+ }
+
+ /* Get fru table when fru table created */
+ rc = pldm_fru_get_table(&fru_record_table, &fru_record_table_size);
+ if (rc != OPAL_SUCCESS) {
+ printf("PLDM_TEST Failed : test_fru_table_metadata_request return=%d\n", rc);
+ return rc;
+ }
+
+ return OPAL_SUCCESS;
+}
+
This patch tests: 1. responder implementation for PLDM FRU command PLDM_GET_FRU_RECORD_TABLE_METADATA when request sends on behalf of BMC. 2. pldm_fru_get_table() failure case when fru table not created and pldm_fru_get_table() success case when fru table already created. Signed-off-by: Abhishek Singh Tomar <abhishek@linux.ibm.com> --- core/pldm/test/Makefile.check | 3 +- core/pldm/test/test-pldm-fru.c | 193 +++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 core/pldm/test/test-pldm-fru.c