From: Yongjoo Ahn Date: Fri, 28 Jul 2023 04:42:01 +0000 (+0900) Subject: [UTC][nnstreamer][ACR-1773] Add TCs for modeified macro value X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c83c73351d5b5791559d7f0a6bed20783240977d;p=test%2Ftct%2Fnative%2Fapi.git [UTC][nnstreamer][ACR-1773] Add TCs for modeified macro value - 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 --- 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 index 000000000..933880ae6 Binary files /dev/null and b/src/utc/nnstreamer/res/simple_32_in_32_out.tflite differ diff --git a/src/utc/nnstreamer/tct-nnstreamer-core_mobile.h b/src/utc/nnstreamer/tct-nnstreamer-core_mobile.h index d051455c5..1220a6f37 100755 --- a/src/utc/nnstreamer/tct-nnstreamer-core_mobile.h +++ b/src/utc/nnstreamer/tct-nnstreamer-core_mobile.h @@ -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}, diff --git a/src/utc/nnstreamer/tct-nnstreamer-core_tizeniot.h b/src/utc/nnstreamer/tct-nnstreamer-core_tizeniot.h index d051455c5..1220a6f37 100755 --- a/src/utc/nnstreamer/tct-nnstreamer-core_tizeniot.h +++ b/src/utc/nnstreamer/tct-nnstreamer-core_tizeniot.h @@ -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}, diff --git a/src/utc/nnstreamer/tct-nnstreamer-core_tv.h b/src/utc/nnstreamer/tct-nnstreamer-core_tv.h index 76e898703..0271e8c84 100755 --- a/src/utc/nnstreamer/tct-nnstreamer-core_tv.h +++ b/src/utc/nnstreamer/tct-nnstreamer-core_tv.h @@ -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}, diff --git a/src/utc/nnstreamer/tct-nnstreamer-core_wearable.h b/src/utc/nnstreamer/tct-nnstreamer-core_wearable.h index 48d313960..1220a6f37 100755 --- a/src/utc/nnstreamer/tct-nnstreamer-core_wearable.h +++ b/src/utc/nnstreamer/tct-nnstreamer-core_wearable.h @@ -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}, diff --git a/src/utc/nnstreamer/utc-nnstreamer-pipeline-tensor-info.c b/src/utc/nnstreamer/utc-nnstreamer-pipeline-tensor-info.c index c5e2be34d..cc690699c 100644 --- a/src/utc/nnstreamer/utc-nnstreamer-pipeline-tensor-info.c +++ b/src/utc/nnstreamer/utc-nnstreamer-pipeline-tensor-info.c @@ -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; +} diff --git a/src/utc/nnstreamer/utc-nnstreamer-single.c b/src/utc/nnstreamer/utc-nnstreamer-single.c index f5723b36e..c432726d0 100644 --- a/src/utc/nnstreamer/utc-nnstreamer-single.c +++ b/src/utc/nnstreamer/utc-nnstreamer-single.c @@ -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; +}