msgbuf: Add copy API

pldm_msgbuf_copy API allows copy of data from one msg buffer
to another. This was done earlier with a pldm_msgbuf_extract()
followed by pldm_msgbuf_insert().

Change-Id: I159792f726916761894aefb0a8795f1f0dc84114
Signed-off-by: Varsha Kaverappa <vkaverap@in.ibm.com>
diff --git a/tests/msgbuf.cpp b/tests/msgbuf.cpp
index fecf514..cfe7914 100644
--- a/tests/msgbuf.cpp
+++ b/tests/msgbuf.cpp
@@ -944,3 +944,56 @@
     EXPECT_EQ(pldm_msgbuf_destroy(ctxExtract), PLDM_SUCCESS);
     EXPECT_EQ(pldm_msgbuf_destroy(ctx), PLDM_SUCCESS);
 }
+
+TEST(msgbuf, pldm_msgbuf_copy_good)
+{
+    struct pldm_msgbuf _src;
+    struct pldm_msgbuf* src = &_src;
+    uint16_t buf[1] = {htole16(0x5aa5)};
+
+    ASSERT_EQ(pldm_msgbuf_init(src, sizeof(buf), buf, sizeof(buf)),
+              PLDM_SUCCESS);
+
+    struct pldm_msgbuf _dst;
+    struct pldm_msgbuf* dst = &_dst;
+    uint16_t checkVal = 0;
+    uint8_t buf1[sizeof(buf)] = {};
+
+    ASSERT_EQ(pldm_msgbuf_init(dst, sizeof(buf1), buf1, sizeof(buf1)),
+              PLDM_SUCCESS);
+    EXPECT_EQ(pldm_msgbuf_copy(dst, src, buf[0], name), PLDM_SUCCESS);
+
+    ASSERT_EQ(pldm_msgbuf_init(dst, sizeof(buf1), buf1, sizeof(buf1)),
+              PLDM_SUCCESS);
+    EXPECT_EQ(pldm_msgbuf_extract_uint16(dst, &checkVal), PLDM_SUCCESS);
+
+    EXPECT_EQ(buf[0], checkVal);
+    EXPECT_EQ(pldm_msgbuf_destroy(src), PLDM_SUCCESS);
+    EXPECT_EQ(pldm_msgbuf_destroy(dst), PLDM_SUCCESS);
+}
+
+TEST(msgbuf, pldm_msgbuf_copy_bad)
+{
+    struct pldm_msgbuf _src;
+    struct pldm_msgbuf* src = &_src;
+    struct pldm_msgbuf _dst;
+    struct pldm_msgbuf* dst = &_dst;
+    uint8_t buf[1] = {sizeof(uint8_t)};
+    uint8_t buf1[1] = {sizeof(uint16_t)};
+    uint16_t value = 8;
+
+    EXPECT_EQ(pldm_msgbuf_copy(dst, NULL, buf[0], name),
+              PLDM_ERROR_INVALID_DATA);
+    EXPECT_EQ(pldm_msgbuf_copy(NULL, src, buf[0], name),
+              PLDM_ERROR_INVALID_DATA);
+
+    ASSERT_EQ(pldm_msgbuf_init(src, 0, buf, sizeof(buf)), PLDM_SUCCESS);
+    ASSERT_EQ(pldm_msgbuf_init(dst, 0, buf1, sizeof(buf1)), PLDM_SUCCESS);
+    EXPECT_EQ(pldm_msgbuf_copy(dst, src, value, name),
+              PLDM_ERROR_INVALID_LENGTH);
+
+    ASSERT_EQ(pldm_msgbuf_init(src, 0, buf1, sizeof(buf1)), PLDM_SUCCESS);
+    ASSERT_EQ(pldm_msgbuf_init(dst, 0, buf, sizeof(buf)), PLDM_SUCCESS);
+    EXPECT_EQ(pldm_msgbuf_copy(dst, src, value, name),
+              PLDM_ERROR_INVALID_LENGTH);
+}