xtest 6017: Test info.dataSize in Persistent objects

Create a persistent object and write some data into it,
get the info.dataSize and then close it, and reopen it
to get the new info.dataSize of this reopen's object,
these two dataSizes should be equal.

Signed-off-by: Guanchao Liang <liang.guanchao@linaro.org>
Reviewed-by: Joakim Bech <joakim.bech@linaro.org>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
diff --git a/host/xtest/xtest_6000.c b/host/xtest/xtest_6000.c
index 9242acb..c412f25 100644
--- a/host/xtest/xtest_6000.c
+++ b/host/xtest/xtest_6000.c
@@ -394,6 +394,23 @@
 	return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_RESET_OBJ, &op, &org);
 }
 
+static TEEC_Result fs_get_obj_info(TEEC_Session *sess, uint32_t obj,
+				void *obj_info, size_t info_size)
+{
+	TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
+	uint32_t org;
+
+	op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
+					TEEC_MEMREF_TEMP_OUTPUT,
+					TEEC_NONE, TEEC_NONE);
+
+	op.params[0].value.a = obj;
+	op.params[1].tmpref.buffer = obj_info;
+	op.params[1].tmpref.size = info_size;
+
+	return TEEC_InvokeCommand(sess, TA_STORAGE_CMD_GET_OBJ_INFO, &op, &org);
+}
+
 /* trunc */
 static void test_truncate_file_length(ADBG_Case_t *c, uint32_t storage_id)
 {
@@ -1652,6 +1669,59 @@
 
 DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6016)
 
+static void xtest_tee_test_6017_single(ADBG_Case_t *c, uint32_t storage_id)
+{
+	TEEC_Session sess;
+	TEE_ObjectInfo obj_info1;
+	TEE_ObjectInfo obj_info2;
+	uint32_t obj;
+	uint32_t orig;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+		xtest_teec_open_session(&sess, &storage_ta_uuid, NULL, &orig)))
+		return;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+		fs_create(&sess, file_01, sizeof(file_01),
+			  TEE_DATA_FLAG_ACCESS_WRITE, 0, NULL,
+			  0, &obj, storage_id)))
+		goto exit;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+		fs_write(&sess, obj, data_00, sizeof(data_00))))
+		goto exit;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+		fs_get_obj_info(&sess, obj, &obj_info1,
+				sizeof(TEE_ObjectInfo))))
+		goto exit;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_close(&sess, obj)))
+		goto exit;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+		fs_open(&sess, file_01, sizeof(file_01),
+			TEE_DATA_FLAG_ACCESS_WRITE_META, &obj, storage_id)))
+		goto exit;
+
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c,
+		fs_get_obj_info(&sess, obj, &obj_info2,
+				sizeof(TEE_ObjectInfo))))
+		goto exit;
+
+	if (!ADBG_EXPECT_COMPARE_UNSIGNED(c,
+		obj_info1.dataSize, ==, obj_info2.dataSize))
+		goto exit;
+
+	/* clean */
+	if (!ADBG_EXPECT_TEEC_SUCCESS(c, fs_unlink(&sess, obj)))
+		goto exit;
+
+exit:
+	TEEC_CloseSession(&sess);
+}
+
+DEFINE_TEST_MULTIPLE_STORAGE_IDS(xtest_tee_test_6017)
 
 ADBG_CASE_DEFINE(XTEST_TEE_6001, xtest_tee_test_6001,
 		 "Test TEE_CreatePersistentObject");
@@ -1686,3 +1756,5 @@
 		 "Loop on Persistent objects");
 ADBG_CASE_DEFINE(XTEST_TEE_6015, xtest_tee_test_6015, "Storage isolation");
 ADBG_CASE_DEFINE(XTEST_TEE_6016, xtest_tee_test_6016, "Storage concurency");
+ADBG_CASE_DEFINE(XTEST_TEE_6017, xtest_tee_test_6017,
+		 "Test Persistent objects info");
diff --git a/host/xtest/xtest_main.c b/host/xtest/xtest_main.c
index 8f3920d..ec1c9a8 100644
--- a/host/xtest/xtest_main.c
+++ b/host/xtest/xtest_main.c
@@ -74,6 +74,7 @@
 ADBG_SUITE_ENTRY(XTEST_TEE_6014)
 ADBG_SUITE_ENTRY(XTEST_TEE_6015)
 ADBG_SUITE_ENTRY(XTEST_TEE_6016)
+ADBG_SUITE_ENTRY(XTEST_TEE_6017)
 ADBG_SUITE_ENTRY(XTEST_TEE_7001)
 ADBG_SUITE_ENTRY(XTEST_TEE_7002)
 ADBG_SUITE_ENTRY(XTEST_TEE_7003)
diff --git a/host/xtest/xtest_test.h b/host/xtest/xtest_test.h
index b3f8c22..5bdb5bc 100644
--- a/host/xtest/xtest_test.h
+++ b/host/xtest/xtest_test.h
@@ -65,6 +65,7 @@
 ADBG_CASE_DECLARE(XTEST_TEE_6014);
 ADBG_CASE_DECLARE(XTEST_TEE_6015);
 ADBG_CASE_DECLARE(XTEST_TEE_6016);
+ADBG_CASE_DECLARE(XTEST_TEE_6017);
 ADBG_CASE_DECLARE(XTEST_TEE_7001);
 ADBG_CASE_DECLARE(XTEST_TEE_7002);
 ADBG_CASE_DECLARE(XTEST_TEE_7003);
diff --git a/ta/storage/include/storage.h b/ta/storage/include/storage.h
index d037c17..d4a4ddc 100644
--- a/ta/storage/include/storage.h
+++ b/ta/storage/include/storage.h
@@ -54,5 +54,7 @@
 TEE_Result ta_storage_cmd_alloc_obj(uint32_t param_types, TEE_Param params[4]);
 TEE_Result ta_storage_cmd_free_obj(uint32_t param_types, TEE_Param params[4]);
 TEE_Result ta_storage_cmd_reset_obj(uint32_t param_types, TEE_Param params[4]);
+TEE_Result ta_storage_cmd_get_obj_info(uint32_t param_types,
+					    TEE_Param params[4]);
 
 #endif /*STORAGE_H */
diff --git a/ta/storage/include/ta_storage.h b/ta/storage/include/ta_storage.h
index d2aede1..45b3d25 100644
--- a/ta/storage/include/ta_storage.h
+++ b/ta/storage/include/ta_storage.h
@@ -54,5 +54,6 @@
 #define TA_STORAGE_CMD_ALLOC_OBJ		18
 #define TA_STORAGE_CMD_FREE_OBJ			19
 #define TA_STORAGE_CMD_RESET_OBJ		20
+#define TA_STORAGE_CMD_GET_OBJ_INFO		21
 
 #endif /*TA_SKELETON_H */
diff --git a/ta/storage/storage.c b/ta/storage/storage.c
index 1140170..e9a507b 100644
--- a/ta/storage/storage.c
+++ b/ta/storage/storage.c
@@ -485,3 +485,21 @@
 	TEE_ResetTransientObject(o);
 	return TEE_SUCCESS;
 }
+
+TEE_Result ta_storage_cmd_get_obj_info(uint32_t param_types,
+					    TEE_Param params[4])
+{
+	TEE_Result res;
+	TEE_ObjectInfo *info;
+	TEE_ObjectHandle o = VAL2HANDLE(params[0].value.a);
+
+	ASSERT_PARAM_TYPE(TEE_PARAM_TYPES
+			  (TEE_PARAM_TYPE_VALUE_INPUT,
+			   TEE_PARAM_TYPE_MEMREF_OUTPUT, TEE_PARAM_TYPE_NONE,
+			   TEE_PARAM_TYPE_NONE));
+
+	info = (TEE_ObjectInfo *)params[1].memref.buffer;
+	res = TEE_GetObjectInfo1(o, info);
+
+	return res;
+}
diff --git a/ta/storage/ta_entry.c b/ta/storage/ta_entry.c
index 8b82f88..7157550 100644
--- a/ta/storage/ta_entry.c
+++ b/ta/storage/ta_entry.c
@@ -133,6 +133,9 @@
 	case TA_STORAGE_CMD_RESET_OBJ:
 		return ta_storage_cmd_reset_obj(nParamTypes, pParams);
 
+	case TA_STORAGE_CMD_GET_OBJ_INFO:
+		return ta_storage_cmd_get_obj_info(nParamTypes, pParams);
+
 	default:
 		return TEE_ERROR_BAD_PARAMETERS;
 	}