[UTC][nnstreamer][ACR-1773] Add TCs for modeified macro value 56/296456/1
authorYongjoo Ahn <yongjoo1.ahn@samsung.com>
Fri, 28 Jul 2023 04:42:01 +0000 (13:42 +0900)
committerYongjoo Ahn <yongjoo1.ahn@samsung.com>
Fri, 28 Jul 2023 04:50:04 +0000 (13:50 +0900)
- Add TCs testing ML_TENSOR_SIZE_LIMIT which is modified by ACR-1773:
  - Check ml_tensors_info_set_count for negative case
  - Add a tflite model with 32 input / 32 output and test whether ml-api
  can invoke this model

Change-Id: I8756f8266ef650d9bb6a591e31d66b7b0d12e0cb
Signed-off-by: Yongjoo Ahn <yongjoo1.ahn@samsung.com>
src/utc/nnstreamer/res/simple_32_in_32_out.tflite [new file with mode: 0644]
src/utc/nnstreamer/tct-nnstreamer-core_mobile.h
src/utc/nnstreamer/tct-nnstreamer-core_tizeniot.h
src/utc/nnstreamer/tct-nnstreamer-core_tv.h
src/utc/nnstreamer/tct-nnstreamer-core_wearable.h
src/utc/nnstreamer/utc-nnstreamer-pipeline-tensor-info.c
src/utc/nnstreamer/utc-nnstreamer-single.c

diff --git a/src/utc/nnstreamer/res/simple_32_in_32_out.tflite b/src/utc/nnstreamer/res/simple_32_in_32_out.tflite
new file mode 100644 (file)
index 0000000..933880a
Binary files /dev/null and b/src/utc/nnstreamer/res/simple_32_in_32_out.tflite differ
index d051455c5636a2f93807935d483ebfac5dba6989..1220a6f37c50b44740d0149b13bd69db3a9ca199 100755 (executable)
@@ -130,8 +130,9 @@ extern int utc_ml_tensors_info_get_tensor_size_p (void);
 extern int utc_ml_tensors_info_get_tensor_size_n (void);
 extern int utc_ml_tensors_info_create_extended_p (void);
 extern int utc_ml_tensors_info_create_extended_n (void);
-extern int utc_ml_tensors_data_create_p (void);
+extern int utc_ml_tensors_info_set_count_max_n (void);
 
+extern int utc_ml_tensors_data_create_p (void);
 extern int utc_ml_tensors_data_create_n (void);
 extern int utc_ml_tensors_data_destroy_p (void);
 extern int utc_ml_tensors_data_destroy_n (void);
@@ -173,6 +174,7 @@ extern int utc_ml_single_invoke_fast_n (void);
 extern int utc_ml_single_invoke_with_ml_option_p (void);
 extern int utc_ml_single_invoke_with_ml_option_n (void);
 extern int utc_ml_single_invoke_with_extended_p (void);
+extern int utc_ml_single_invoke_with_many_inout_p (void);
 
 extern int utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p (void);
 extern int utc_nnstreamer_scenario_construct_destruct_pipeline_p1 (void);
@@ -462,8 +464,9 @@ testcase tc_array[] = {
   {"utc_ml_tensors_info_get_tensor_size_n", utc_ml_tensors_info_get_tensor_size_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_p", utc_ml_tensors_info_create_extended_p, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_n", utc_ml_tensors_info_create_extended_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
-  {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
+  {"utc_ml_tensors_info_set_count_max_n", utc_ml_tensors_info_set_count_max_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
 
+  {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_create_n", utc_ml_tensors_data_create_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_p", utc_ml_tensors_data_destroy_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_n", utc_ml_tensors_data_destroy_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
@@ -505,6 +508,8 @@ testcase tc_array[] = {
   {"utc_ml_single_invoke_with_ml_option_p", utc_ml_single_invoke_with_ml_option_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_ml_option_n", utc_ml_single_invoke_with_ml_option_n, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_extended_p", utc_ml_single_invoke_with_extended_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
+  {"utc_ml_single_invoke_with_many_inout_p", utc_ml_single_invoke_with_many_inout_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
+
   {"utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p", utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p1", utc_nnstreamer_scenario_construct_destruct_pipeline_p1, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p2", utc_nnstreamer_scenario_construct_destruct_pipeline_p2, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
index d051455c5636a2f93807935d483ebfac5dba6989..1220a6f37c50b44740d0149b13bd69db3a9ca199 100755 (executable)
@@ -130,8 +130,9 @@ extern int utc_ml_tensors_info_get_tensor_size_p (void);
 extern int utc_ml_tensors_info_get_tensor_size_n (void);
 extern int utc_ml_tensors_info_create_extended_p (void);
 extern int utc_ml_tensors_info_create_extended_n (void);
-extern int utc_ml_tensors_data_create_p (void);
+extern int utc_ml_tensors_info_set_count_max_n (void);
 
+extern int utc_ml_tensors_data_create_p (void);
 extern int utc_ml_tensors_data_create_n (void);
 extern int utc_ml_tensors_data_destroy_p (void);
 extern int utc_ml_tensors_data_destroy_n (void);
@@ -173,6 +174,7 @@ extern int utc_ml_single_invoke_fast_n (void);
 extern int utc_ml_single_invoke_with_ml_option_p (void);
 extern int utc_ml_single_invoke_with_ml_option_n (void);
 extern int utc_ml_single_invoke_with_extended_p (void);
+extern int utc_ml_single_invoke_with_many_inout_p (void);
 
 extern int utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p (void);
 extern int utc_nnstreamer_scenario_construct_destruct_pipeline_p1 (void);
@@ -462,8 +464,9 @@ testcase tc_array[] = {
   {"utc_ml_tensors_info_get_tensor_size_n", utc_ml_tensors_info_get_tensor_size_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_p", utc_ml_tensors_info_create_extended_p, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_n", utc_ml_tensors_info_create_extended_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
-  {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
+  {"utc_ml_tensors_info_set_count_max_n", utc_ml_tensors_info_set_count_max_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
 
+  {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_create_n", utc_ml_tensors_data_create_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_p", utc_ml_tensors_data_destroy_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_n", utc_ml_tensors_data_destroy_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
@@ -505,6 +508,8 @@ testcase tc_array[] = {
   {"utc_ml_single_invoke_with_ml_option_p", utc_ml_single_invoke_with_ml_option_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_ml_option_n", utc_ml_single_invoke_with_ml_option_n, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_extended_p", utc_ml_single_invoke_with_extended_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
+  {"utc_ml_single_invoke_with_many_inout_p", utc_ml_single_invoke_with_many_inout_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
+
   {"utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p", utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p1", utc_nnstreamer_scenario_construct_destruct_pipeline_p1, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p2", utc_nnstreamer_scenario_construct_destruct_pipeline_p2, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
index 76e898703afcbf2402af1f583ed6904eaffb7e8a..0271e8c849542697c77a28f9f6259713b3f644ba 100755 (executable)
@@ -128,8 +128,9 @@ extern int utc_ml_tensors_info_get_tensor_size_p (void);
 extern int utc_ml_tensors_info_get_tensor_size_n (void);
 extern int utc_ml_tensors_info_create_extended_p (void);
 extern int utc_ml_tensors_info_create_extended_n (void);
-extern int utc_ml_tensors_data_create_p (void);
+extern int utc_ml_tensors_info_set_count_max_n (void);
 
+extern int utc_ml_tensors_data_create_p (void);
 extern int utc_ml_tensors_data_create_n (void);
 extern int utc_ml_tensors_data_destroy_p (void);
 extern int utc_ml_tensors_data_destroy_n (void);
@@ -171,6 +172,7 @@ extern int utc_ml_single_invoke_fast_n (void);
 extern int utc_ml_single_invoke_with_ml_option_p (void);
 extern int utc_ml_single_invoke_with_ml_option_n (void);
 extern int utc_ml_single_invoke_with_extended_p (void);
+extern int utc_ml_single_invoke_with_many_inout_p (void);
 
 extern int utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p (void);
 extern int utc_nnstreamer_scenario_construct_destruct_pipeline_p1 (void);
@@ -416,6 +418,8 @@ testcase tc_array[] = {
   {"utc_ml_tensors_info_get_tensor_size_n", utc_ml_tensors_info_get_tensor_size_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_p", utc_ml_tensors_info_create_extended_p, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_n", utc_ml_tensors_info_create_extended_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
+  {"utc_ml_tensors_info_set_count_max_n", utc_ml_tensors_info_set_count_max_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
+
   {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_create_n", utc_ml_tensors_data_create_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_p", utc_ml_tensors_data_destroy_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
@@ -458,9 +462,9 @@ testcase tc_array[] = {
   {"utc_ml_single_invoke_with_ml_option_p", utc_ml_single_invoke_with_ml_option_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_ml_option_n", utc_ml_single_invoke_with_ml_option_n, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_extended_p", utc_ml_single_invoke_with_extended_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
+  {"utc_ml_single_invoke_with_many_inout_p", utc_ml_single_invoke_with_many_inout_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
 
   {"utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p", utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
-
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p1", utc_nnstreamer_scenario_construct_destruct_pipeline_p1, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p2", utc_nnstreamer_scenario_construct_destruct_pipeline_p2, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_pipeline_error_case_n1", utc_nnstreamer_scenario_construct_pipeline_error_case_n1, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
index 48d3139602146ef305598e8c2d85703dd3732d37..1220a6f37c50b44740d0149b13bd69db3a9ca199 100755 (executable)
@@ -130,8 +130,9 @@ extern int utc_ml_tensors_info_get_tensor_size_p (void);
 extern int utc_ml_tensors_info_get_tensor_size_n (void);
 extern int utc_ml_tensors_info_create_extended_p (void);
 extern int utc_ml_tensors_info_create_extended_n (void);
-extern int utc_ml_tensors_data_create_p (void);
+extern int utc_ml_tensors_info_set_count_max_n (void);
 
+extern int utc_ml_tensors_data_create_p (void);
 extern int utc_ml_tensors_data_create_n (void);
 extern int utc_ml_tensors_data_destroy_p (void);
 extern int utc_ml_tensors_data_destroy_n (void);
@@ -173,6 +174,7 @@ extern int utc_ml_single_invoke_fast_n (void);
 extern int utc_ml_single_invoke_with_ml_option_p (void);
 extern int utc_ml_single_invoke_with_ml_option_n (void);
 extern int utc_ml_single_invoke_with_extended_p (void);
+extern int utc_ml_single_invoke_with_many_inout_p (void);
 
 extern int utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p (void);
 extern int utc_nnstreamer_scenario_construct_destruct_pipeline_p1 (void);
@@ -462,8 +464,9 @@ testcase tc_array[] = {
   {"utc_ml_tensors_info_get_tensor_size_n", utc_ml_tensors_info_get_tensor_size_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_p", utc_ml_tensors_info_create_extended_p, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
   {"utc_ml_tensors_info_create_extended_n", utc_ml_tensors_info_create_extended_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
-  {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
+  {"utc_ml_tensors_info_set_count_max_n", utc_ml_tensors_info_set_count_max_n, utc_nnstreamer_pipeline_tensor_info_startup, utc_nnstreamer_pipeline_tensor_info_cleanup},
 
+  {"utc_ml_tensors_data_create_p", utc_ml_tensors_data_create_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_create_n", utc_ml_tensors_data_create_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_p", utc_ml_tensors_data_destroy_p, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
   {"utc_ml_tensors_data_destroy_n", utc_ml_tensors_data_destroy_n, utc_nnstreamer_pipeline_tensor_data_startup, utc_nnstreamer_pipeline_tensor_data_cleanup},
@@ -504,8 +507,8 @@ testcase tc_array[] = {
 
   {"utc_ml_single_invoke_with_ml_option_p", utc_ml_single_invoke_with_ml_option_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
   {"utc_ml_single_invoke_with_ml_option_n", utc_ml_single_invoke_with_ml_option_n, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
-
   {"utc_ml_single_invoke_with_extended_p", utc_ml_single_invoke_with_extended_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
+  {"utc_ml_single_invoke_with_many_inout_p", utc_ml_single_invoke_with_many_inout_p, utc_nnstreamer_single_startup, utc_nnstreamer_single_cleanup},
 
   {"utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p", utc_nnstreamer_scenario_construct_destruct_empty_pipeline_p, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
   {"utc_nnstreamer_scenario_construct_destruct_pipeline_p1", utc_nnstreamer_scenario_construct_destruct_pipeline_p1, utc_nnstreamer_scenario_startup, utc_nnstreamer_scenario_cleanup},
index c5e2be34d20565f4496aee9d2678da3ef6427715..cc690699c684dba9a8f264a684ed9757df928066 100644 (file)
@@ -694,3 +694,26 @@ int utc_ml_tensors_info_create_extended_n (void)
 
   return 0;
 }
+
+/**
+ * @testcase           utc_ml_tensors_info_set_count_max_n
+ * @since_tizen                8.0
+ * @description                Test NNStreamer set tensor info count, Failure case
+ */
+int utc_ml_tensors_info_set_count_max_n (void)
+{
+  IS_SUPPORT_FEATURE;
+  status = ml_tensors_info_create (&info);
+  assert_eq (status, ML_ERROR_NONE);
+
+  status = ml_tensors_info_set_count (info, ML_TENSOR_SIZE_LIMIT);
+  assert_eq (status, ML_ERROR_NONE);
+
+  status = ml_tensors_info_set_count (info, ML_TENSOR_SIZE_LIMIT + 1);
+  assert_eq (status, ML_ERROR_INVALID_PARAMETER);
+
+  status = ml_tensors_info_destroy (info);
+  assert_eq (status, ML_ERROR_NONE);
+
+  return 0;
+}
index f5723b36e257a82b9f802d37b8d0e037ea0dd30b..c432726d0499d636899f1870de89ec35f3031c41 100644 (file)
@@ -1168,3 +1168,102 @@ int utc_ml_single_invoke_with_extended_p (void)
 
   return 0;
 }
+
+/**
+ * @testcase           utc_ml_single_invoke_with_many_inout_p
+ * @since_tizen                8.0
+ * @description                Test NNStreamer invoke tflite model with 32 intput / 32 output tensors.
+ */
+int utc_ml_single_invoke_with_many_inout_p (void)
+{
+  IS_SUPPORT_FEATURE;
+  ml_tensors_info_h in_info, out_info;
+  ml_tensors_data_h input, output;
+  size_t data_size;
+
+  unsigned int tmp_count;
+  ml_tensor_type_e tmp_type = ML_TENSOR_TYPE_UNKNOWN;
+  ml_tensor_dimension tmp_dim;
+
+  gchar *test_model;
+
+  char pszValue[CONFIG_VALUE_LEN_MAX] = {0,};
+
+  char *model_file = "simple_32_in_32_out.tflite";
+  char *model_file_path = NULL;
+
+  if ( true == GetValueForTCTSetting("DEVICE_SUITE_TARGET_30", pszValue, API_NAMESPACE ))
+  {
+    int model_path_len = strlen(pszValue) + strlen(model_file) + 10;
+    model_file_path = (char*)malloc(model_path_len);
+    CHECK_HANDLE(model_file_path,"malloc:failure:utc_ml_single_invoke_with_many_inout_p");
+    snprintf(model_file_path, model_path_len, "%s/res/res/%s", pszValue, model_file);
+  }
+
+  test_model = model_file_path;
+  assert (g_file_test (test_model, G_FILE_TEST_EXISTS));
+
+  status = ml_single_open (&single, test_model, NULL, NULL,
+      ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY);
+  assert_eq (status, ML_ERROR_NONE);
+
+  status = ml_single_get_input_info (single, &in_info);
+  assert_eq (status, ML_ERROR_NONE);
+  ml_tensors_info_get_count (in_info, &tmp_count);
+  assert_eq (tmp_count, 32U);
+
+  status = ml_single_get_output_info (single, &out_info);
+  assert_eq (status, ML_ERROR_NONE);
+  ml_tensors_info_get_count (out_info, &tmp_count);
+  assert_eq (tmp_count, 32U);
+
+  status = ml_tensors_data_create (in_info, &input);
+  assert_eq (status, ML_ERROR_NONE);
+
+  for (int j = 0; j < 5; j++) {
+    float tmp_input[] = { 16.0f };
+    float *output_buf;
+
+    for (int i = 0; i < 32; i++) {
+      status = ml_tensors_data_set_tensor_data (input, i, tmp_input, 1 * sizeof (float));
+
+      ml_tensors_info_get_tensor_type (in_info, i, &tmp_type);
+      ml_tensors_info_get_tensor_dimension (in_info, i, tmp_dim);
+
+      assert_eq (tmp_type, ML_TENSOR_TYPE_FLOAT32);
+      assert_eq (tmp_dim[0], 1U);
+      assert_eq (tmp_dim[1], 1U);
+      assert_eq (tmp_dim[2], 1U);
+      assert_eq (tmp_dim[3], 1U);
+    }
+
+    status = ml_single_invoke (single, input, &output);
+    assert_eq (status, ML_ERROR_NONE);
+
+    for (int i = 0; i < 32; i++) {
+      ml_tensors_data_get_tensor_data (output, i, (void **) &output_buf, &data_size);
+      assert_eq (output_buf[0], 17.0f);
+      assert_eq (data_size, sizeof (float));
+
+      ml_tensors_info_get_tensor_type (out_info, i, &tmp_type);
+      ml_tensors_info_get_tensor_dimension (out_info, i, tmp_dim);
+
+      assert_eq (tmp_type, ML_TENSOR_TYPE_FLOAT32);
+      assert_eq (tmp_dim[0], 1U);
+      assert_eq (tmp_dim[1], 1U);
+      assert_eq (tmp_dim[2], 1U);
+      assert_eq (tmp_dim[3], 1U);
+    }
+
+    ml_tensors_data_destroy (output);
+  }
+
+  ml_tensors_data_destroy (input);
+  ml_tensors_info_destroy (in_info);
+  ml_tensors_info_destroy (out_info);
+
+  status = ml_single_close (single);
+  assert_eq (status, ML_ERROR_NONE);
+
+  return 0;
+}