test(dir_msg): extend multiple uuids test

Extend test case `ffa_send_direct_message_req2_multiple_uuids`
to send a request to each of the target partition's UUIDs.

To enable this test, add parsing of `uuid` field to test service
manifest parsing.

Signed-off-by: Kathleen Capella <kathleen.capella@arm.com>
Change-Id: Ib6f3f86e5350143a624a555f5c0da98df4415ba8
diff --git a/test/hftest/service_common.c b/test/hftest/service_common.c
index 510fc77..214aefd 100644
--- a/test/hftest/service_common.c
+++ b/test/hftest/service_common.c
@@ -31,6 +31,23 @@
 	return &global_context;
 }
 
+static bool uint32list_has_next(const struct memiter *list)
+{
+	return memiter_size(list) > 0;
+}
+
+static void uint32list_get_next(struct memiter *list, uint32_t *out)
+{
+	uint64_t num;
+
+	CHECK(uint32list_has_next(list));
+	if (!fdt_parse_number(list, sizeof(uint32_t), &num)) {
+		return;
+	}
+
+	*out = (uint32_t)num;
+}
+
 noreturn void abort(void)
 {
 	HFTEST_LOG("Service contained failures.");
@@ -83,6 +100,10 @@
 	struct fdt_node ffa_node;
 	struct string mem_region_node_name = STRING_INIT("memory-regions");
 	struct string dev_region_node_name = STRING_INIT("device-regions");
+	struct memiter uuid;
+	uint32_t uuid_word = 0;
+	uint16_t j = 0;
+	uint16_t i = 0;
 	uint64_t number;
 
 	CHECK(ctx != NULL);
@@ -94,6 +115,30 @@
 				    &ctx->partition_manifest.load_addr));
 	EXPECT_TRUE(fdt_read_number(&root, "ffa-version", &number));
 
+	EXPECT_TRUE(fdt_read_property(&root, "uuid", &uuid));
+
+	/* Parse UUIDs and populate uuid count.*/
+	while (uint32list_has_next(&uuid) && j < PARTITION_MAX_UUIDS) {
+		while (uint32list_has_next(&uuid) && i < 4) {
+			uint32list_get_next(&uuid, &uuid_word);
+			ctx->partition_manifest.uuids[j].uuid[i] = uuid_word;
+			i++;
+		}
+
+		EXPECT_FALSE(
+			ffa_uuid_is_null(&ctx->partition_manifest.uuids[j]));
+
+		dlog_verbose("  UUID %#x-%x-%x-%x\n",
+			     ctx->partition_manifest.uuids[j].uuid[0],
+			     ctx->partition_manifest.uuids[j].uuid[1],
+			     ctx->partition_manifest.uuids[j].uuid[2],
+			     ctx->partition_manifest.uuids[j].uuid[3]);
+		j++;
+		i = 0;
+	}
+
+	ctx->partition_manifest.uuid_count = j;
+
 	ffa_node = root;
 
 	/* Look for the memory region node. */