libpldm: Add decode API for TransferComplete request

The FD sends TransferComplete command to the UA once the FD has
transferred all the data for the component image or determines the
transfer has failed. If the TransferResult of the request message
indicates the transfer completed without error then, upon the
successful completion of this command, the FD proceeds to the next
step that verifies the firmware. This implementation works with
DSP0267_1.1.0, DSP0267_1.0.1 and DSP0267_1.0.0.

Tested: Unit tests passed

Signed-off-by: gokulsanker <gokul.sanker.v.g@intel.com>
Change-Id: I22c6ef60324dbedd3b3fa67754c9aec48dd9f311
diff --git a/libpldm/tests/libpldm_firmware_update_test.cpp b/libpldm/tests/libpldm_firmware_update_test.cpp
index 8aa012f..0aacb7b 100644
--- a/libpldm/tests/libpldm_firmware_update_test.cpp
+++ b/libpldm/tests/libpldm_firmware_update_test.cpp
@@ -2080,3 +2080,45 @@
     rc = encode_request_firmware_data_resp(0, PLDM_SUCCESS, responseMsg, 0);

     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);

 }

+

+TEST(TransferComplete, goodPathDecodeRequest)

+{

+    constexpr uint8_t transferResult = PLDM_FWUP_TRANSFER_SUCCESS;

+    constexpr std::array<uint8_t, hdrSize + sizeof(transferResult)>

+        transferCompleteReq1{0x00, 0x00, 0x00, 0x00};

+    auto requestMsg1 =

+        reinterpret_cast<const pldm_msg*>(transferCompleteReq1.data());

+    uint8_t outTransferResult = 0;

+

+    auto rc = decode_transfer_complete_req(requestMsg1, sizeof(transferResult),

+                                           &outTransferResult);

+    EXPECT_EQ(rc, PLDM_SUCCESS);

+    EXPECT_EQ(outTransferResult, transferResult);

+

+    constexpr std::array<uint8_t, hdrSize + sizeof(transferResult)>

+        transferCompleteReq2{0x00, 0x00, 0x00, 0x02};

+    auto requestMsg2 =

+        reinterpret_cast<const pldm_msg*>(transferCompleteReq2.data());

+    rc = decode_transfer_complete_req(requestMsg2, sizeof(transferResult),

+                                      &outTransferResult);

+    EXPECT_EQ(rc, PLDM_SUCCESS);

+    EXPECT_EQ(outTransferResult, PLDM_FWUP_TRANSFER_ERROR_IMAGE_CORRUPT);

+}

+

+TEST(TransferComplete, errorPathDecodeRequest)

+{

+    constexpr std::array<uint8_t, hdrSize> transferCompleteReq{0x00, 0x00,

+                                                               0x00};

+    auto requestMsg =

+        reinterpret_cast<const pldm_msg*>(transferCompleteReq.data());

+    uint8_t outTransferResult = 0;

+

+    auto rc = decode_transfer_complete_req(nullptr, 0, &outTransferResult);

+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);

+

+    rc = decode_transfer_complete_req(requestMsg, 0, nullptr);

+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);

+

+    rc = decode_transfer_complete_req(requestMsg, 0, &outTransferResult);

+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);

+}