From 31a56c6f23d15b5de2666c297d2ea110403d6b12 Mon Sep 17 00:00:00 2001 From: Wook Song Date: Wed, 8 Apr 2020 14:44:08 +0900 Subject: [PATCH] [Tests/CAPI] Use constexpr instead of define and ifdef for tflite This patch experimentally replaces #define and #ifdef used for checking enable-tensorflow-lite is true with constexpr, which is type-safe replacement for #define. Signed-off-by: Wook Song --- tests/tizen_capi/unittest_tizen_capi.cc | 516 ++++++++++++++++++++------------ 1 file changed, 326 insertions(+), 190 deletions(-) diff --git a/tests/tizen_capi/unittest_tizen_capi.cc b/tests/tizen_capi/unittest_tizen_capi.cc index 4a363bd..9fe942b 100644 --- a/tests/tizen_capi/unittest_tizen_capi.cc +++ b/tests/tizen_capi/unittest_tizen_capi.cc @@ -17,6 +17,12 @@ #define SINGLE_DEF_TIMEOUT_MSEC 10000 +#if defined (ENABLE_TENSORFLOW_LITE) +constexpr bool is_enabled_tensorflow_lite = true; +#else +constexpr bool is_enabled_tensorflow_lite = false; +#endif /* defined (ENABLE_TENSORFLOW_LITE) */ + /** * @brief Struct to check the pipeline state changes. */ @@ -1300,7 +1306,6 @@ TEST (nnstreamer_capi_util, availability_00) #endif /* ENABLE_NNFW_RUNTIME */ } -#ifdef ENABLE_TENSORFLOW_LITE /** * @brief Test NNStreamer Utility for checking availability of Tensorflow-lite backend */ @@ -1311,27 +1316,27 @@ TEST (nnstreamer_capi_util, availability_01) status = ml_check_nnfw_availability (ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY, &result); EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_EQ (result, true); + EXPECT_EQ (result, is_enabled_tensorflow_lite); status = ml_check_nnfw_availability (ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_AUTO, &result); EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_EQ (result, true); + EXPECT_EQ (result, is_enabled_tensorflow_lite); status = ml_check_nnfw_availability (ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_CPU, &result); EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_EQ (result, true); + EXPECT_EQ (result, is_enabled_tensorflow_lite); status = ml_check_nnfw_availability (ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_CPU_NEON, &result); EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_EQ (result, true); + EXPECT_EQ (result, is_enabled_tensorflow_lite); status = ml_check_nnfw_availability (ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_GPU, &result); EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_EQ (result, true); + EXPECT_EQ (result, is_enabled_tensorflow_lite); status = ml_check_nnfw_availability (ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_NPU, &result); EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_EQ (result, true); + EXPECT_EQ (result, is_enabled_tensorflow_lite); } /** @@ -1358,7 +1363,6 @@ TEST (nnstreamer_capi_util, availability_fail_01_n) EXPECT_EQ (status, ML_ERROR_NONE); EXPECT_EQ (result, false); } -#endif /* ENABLE_TENSORFLOW_LITE */ #ifdef ENABLE_TENSORFLOW /** @@ -1721,7 +1725,6 @@ TEST (nnstreamer_capi_util, compare_info) EXPECT_EQ (status, ML_ERROR_NONE); } -#ifdef ENABLE_TENSORFLOW_LITE /** * @brief Test NNStreamer single shot (tensorflow-lite) */ @@ -1771,7 +1774,12 @@ TEST (nnstreamer_capi_singleshot, invoke_01) status = ml_single_open (&single, test_model, in_info, out_info, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } /* input tensor in filter */ status = ml_single_get_input_info (single, &in_res); @@ -1837,6 +1845,7 @@ TEST (nnstreamer_capi_singleshot, invoke_01) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); ml_tensors_info_destroy (in_info); ml_tensors_info_destroy (out_info); @@ -1868,7 +1877,12 @@ TEST (nnstreamer_capi_singleshot, invoke_02) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_get_input_info (single, &in_info); EXPECT_EQ (status, ML_ERROR_NONE); @@ -1893,8 +1907,9 @@ TEST (nnstreamer_capi_singleshot, invoke_02) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); - g_free (test_model); ml_tensors_info_destroy (in_info); +skip_test: + g_free (test_model); } /** @@ -1951,7 +1966,12 @@ TEST (nnstreamer_capi_singleshot, benchmark_time) /** Initial run to warm up the cache */ status = ml_single_open (&single, test_model, in_info, out_info, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); @@ -1985,6 +2005,7 @@ TEST (nnstreamer_capi_singleshot, benchmark_time) g_warning ("Time to invoke single = %f us", (invoke_duration * 1.0)/count); g_warning ("Time to close single = %f us", (close_duration * 1.0)/count); +skip_test: ml_tensors_data_destroy (output); ml_tensors_data_destroy (input); @@ -1992,7 +2013,6 @@ TEST (nnstreamer_capi_singleshot, benchmark_time) ml_tensors_info_destroy (in_info); ml_tensors_info_destroy (out_info); } -#endif /* ENABLE_TENSORFLOW_LITE */ /** * @brief Test NNStreamer single shot (custom filter) @@ -2312,7 +2332,6 @@ TEST (nnstreamer_capi_singleshot, unavailable_fw_tf_n) } #endif /* ENABLE_TENSORFLOW */ -#ifdef ENABLE_TENSORFLOW_LITE /** * @brief Test NNStreamer single shot (tensorflow-lite) * @detail Failure case with invalid param. @@ -2360,11 +2379,17 @@ TEST (nnstreamer_capi_singleshot, open_fail_01_n) /* Successfully opened unknown fw type (tf-lite) */ status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_ANY, ML_NNFW_HW_ANY); - EXPECT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -2414,7 +2439,11 @@ TEST (nnstreamer_capi_singleshot, open_fail_02_n) /* invalid input dimension (model does not support dynamic dimension) */ status = ml_single_open (&single, test_model, in_info, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + if (is_enabled_tensorflow_lite) { + EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + } else { + EXPECT_NE (status, ML_ERROR_INVALID_PARAMETER); + } in_dim[1] = in_dim[2] = 224; ml_tensors_info_set_tensor_dimension (in_info, 0, in_dim); @@ -2423,7 +2452,11 @@ TEST (nnstreamer_capi_singleshot, open_fail_02_n) /* invalid input type */ status = ml_single_open (&single, test_model, in_info, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + if (is_enabled_tensorflow_lite) { + EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + } else { + EXPECT_NE (status, ML_ERROR_INVALID_PARAMETER); + } ml_tensors_info_set_tensor_type (in_info, 0, ML_TENSOR_TYPE_UINT8); @@ -2438,7 +2471,11 @@ TEST (nnstreamer_capi_singleshot, open_fail_02_n) /* invalid output dimension */ status = ml_single_open (&single, test_model, NULL, out_info, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + if (is_enabled_tensorflow_lite) { + EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + } else { + EXPECT_NE (status, ML_ERROR_INVALID_PARAMETER); + } out_dim[0] = 1001; ml_tensors_info_set_tensor_dimension (out_info, 0, out_dim); @@ -2447,18 +2484,28 @@ TEST (nnstreamer_capi_singleshot, open_fail_02_n) /* invalid output type */ status = ml_single_open (&single, test_model, NULL, out_info, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + if (is_enabled_tensorflow_lite) { + EXPECT_EQ (status, ML_ERROR_INVALID_PARAMETER); + } else { + EXPECT_NE (status, ML_ERROR_INVALID_PARAMETER); + } ml_tensors_info_set_tensor_type (out_info, 0, ML_TENSOR_TYPE_UINT8); /* Successfully opened unknown fw type (tf-lite) */ status = ml_single_open (&single, test_model, in_info, out_info, ML_NNFW_TYPE_ANY, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); ml_tensors_info_destroy (in_info); ml_tensors_info_destroy (out_info); @@ -2502,7 +2549,12 @@ TEST (nnstreamer_capi_singleshot, open_dynamic) /* open with input tensor info (1:1:1:1 > 5:1:1:1) */ status = ml_single_open (&single, test_model, in_info, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } /* validate output info */ status = ml_single_get_output_info (single, &out_info); @@ -2525,9 +2577,10 @@ TEST (nnstreamer_capi_singleshot, open_dynamic) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); - g_free (test_model); - ml_tensors_info_destroy (in_info); ml_tensors_info_destroy (out_info); +skip_test: + ml_tensors_info_destroy (in_info); + g_free (test_model); } /** @@ -2646,7 +2699,12 @@ TEST (nnstreamer_capi_singleshot, invoke_timeout) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } /* set timeout 5 ms */ status = ml_single_set_timeout (single, 5); @@ -2700,6 +2758,7 @@ TEST (nnstreamer_capi_singleshot, invoke_timeout) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -2718,6 +2777,10 @@ TEST (nnstreamer_capi_singleshot, parallel_runs) single_shot_thread_data ss_data[num_cases]; guint i, j; + /* Skip this test if enable-tensorflow-lite is false */ + if (!is_enabled_tensorflow_lite) + return; + /* supposed to run test in build directory */ if (root_path == NULL) root_path = ".."; @@ -2770,6 +2833,10 @@ TEST (nnstreamer_capi_singleshot, close_while_running) pthread_t thread; single_shot_thread_data ss_data; + /* Skip this test if enable-tensorflow-lite is false */ + if (!is_enabled_tensorflow_lite) + return; + /* supposed to run test in build directory */ if (root_path == NULL) root_path = ".."; @@ -2829,7 +2896,12 @@ TEST (nnstreamer_capi_singleshot, set_input_info_fail) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_set_input_info (single, NULL); EXPECT_NE (status, ML_ERROR_NONE); @@ -2854,6 +2926,7 @@ TEST (nnstreamer_capi_singleshot, set_input_info_fail) status = ml_tensors_info_destroy (in_info); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -2883,7 +2956,12 @@ TEST (nnstreamer_capi_singleshot, set_input_info_fail_01) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_get_input_info (single, &in_info); EXPECT_EQ (status, ML_ERROR_NONE); @@ -2912,6 +2990,7 @@ TEST (nnstreamer_capi_singleshot, set_input_info_fail_01) status = ml_tensors_info_destroy (in_info); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -2942,7 +3021,12 @@ TEST (nnstreamer_capi_singleshot, set_input_info_success) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_set_input_info (single, NULL); EXPECT_NE (status, ML_ERROR_NONE); @@ -2980,6 +3064,7 @@ TEST (nnstreamer_capi_singleshot, set_input_info_success) status = ml_tensors_info_destroy (in_info); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -3037,7 +3122,12 @@ TEST (nnstreamer_capi_singleshot, set_input_info_success_01) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_get_input_info (single, &in_res); EXPECT_EQ (status, ML_ERROR_NONE); @@ -3132,6 +3222,7 @@ TEST (nnstreamer_capi_singleshot, set_input_info_success_01) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); ml_tensors_info_destroy (in_info); ml_tensors_info_destroy (out_info); @@ -3166,7 +3257,12 @@ TEST (nnstreamer_capi_singleshot, property_01_p) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } /* get layout */ status = ml_single_get_property (single, "inputlayout", &prop_value); @@ -3212,6 +3308,7 @@ TEST (nnstreamer_capi_singleshot, property_01_p) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -3238,7 +3335,12 @@ TEST (nnstreamer_capi_singleshot, property_02_n) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } /* get invalid property */ status = ml_single_get_property (single, "unknown_prop", &prop_value); @@ -3273,6 +3375,7 @@ TEST (nnstreamer_capi_singleshot, property_02_n) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -3307,7 +3410,12 @@ TEST (nnstreamer_capi_singleshot, property_03_n) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } /* failed to set dimension */ status = ml_single_set_property (single, "input", "3:4:4:1"); @@ -3390,6 +3498,7 @@ TEST (nnstreamer_capi_singleshot, property_03_n) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } @@ -3422,7 +3531,12 @@ TEST (nnstreamer_capi_singleshot, property_04_p) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_set_property (single, "input", "5:1:1:1"); EXPECT_EQ (status, ML_ERROR_NONE); @@ -3484,9 +3598,9 @@ TEST (nnstreamer_capi_singleshot, property_04_p) status = ml_single_close (single); EXPECT_EQ (status, ML_ERROR_NONE); +skip_test: g_free (test_model); } -#endif /* ENABLE_TENSORFLOW_LITE */ #ifdef ENABLE_NNFW_RUNTIME /** @@ -4319,7 +4433,6 @@ TEST (nnstreamer_capi_singleshot, set_input_info_success_02) ml_tensors_info_destroy (out_res); } -#ifdef ENABLE_TENSORFLOW_LITE /** * @brief Test NNStreamer single shot (tflite) * @detail run the `ml_single_invoke_dynamic` api works properly. @@ -4330,6 +4443,7 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_01_p) int status; 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; @@ -4349,56 +4463,62 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_01_p) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_get_input_info (single, &in_info); EXPECT_EQ (status, ML_ERROR_NONE); status = ml_tensors_data_create (in_info, &input); EXPECT_EQ (status, ML_ERROR_NONE); + { + float tmp_input[] = { 1.0 }; + float *output_buf; + status = ml_tensors_data_set_tensor_data (input, 0, tmp_input, + 1 * sizeof (float)); + + ml_tensors_info_get_count (in_info, &tmp_count); + ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); + + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 1U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_EQ (tmp_dim[3], 1U); + + status = + ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); + EXPECT_EQ (status, ML_ERROR_NONE); - float tmp_input[] = { 1.0 }; - float *output_buf; - size_t data_size; - status = ml_tensors_data_set_tensor_data (input, 0, tmp_input, - 1 * sizeof (float)); - - ml_tensors_info_get_count (in_info, &tmp_count); - ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); - - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 1U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); - - status = - ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); - EXPECT_EQ (status, ML_ERROR_NONE); + ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf, + &data_size); - ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf, - &data_size); + EXPECT_FLOAT_EQ (output_buf[0], 3.0f); + EXPECT_EQ (data_size, sizeof (float)); - EXPECT_FLOAT_EQ (output_buf[0], 3.0f); - EXPECT_EQ (data_size, sizeof (float)); + ml_tensors_info_get_count (out_info, &tmp_count); + ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); - ml_tensors_info_get_count (out_info, &tmp_count); - ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 1U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_EQ (tmp_dim[3], 1U); - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 1U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_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); + } - 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_set_property (single, "input", "5:1:1:1"); EXPECT_EQ (status, ML_ERROR_NONE); @@ -4409,55 +4529,57 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_01_p) status = ml_tensors_data_create (in_info, &input); EXPECT_EQ (status, ML_ERROR_NONE); - float tmp_input2[] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; - float *output_buf2; - status = ml_tensors_data_set_tensor_data (input, 0, tmp_input2, - 5 * sizeof (float)); + { + float tmp_input2[] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; + float *output_buf2; + status = ml_tensors_data_set_tensor_data (input, 0, tmp_input2, + 5 * sizeof (float)); - ml_tensors_info_get_count (in_info, &tmp_count); - ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); + ml_tensors_info_get_count (in_info, &tmp_count); + ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 5U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); - - status = - ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); - EXPECT_EQ (status, ML_ERROR_NONE); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 5U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_EQ (tmp_dim[3], 1U); - ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf2, - &data_size); + status = + ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); + EXPECT_EQ (status, ML_ERROR_NONE); - EXPECT_FLOAT_EQ (output_buf2[0], 3.0f); - EXPECT_FLOAT_EQ (output_buf2[1], 4.0f); - EXPECT_FLOAT_EQ (output_buf2[2], 5.0f); - EXPECT_FLOAT_EQ (output_buf2[3], 6.0f); - EXPECT_FLOAT_EQ (output_buf2[4], 7.0f); - EXPECT_EQ (data_size, 5 * sizeof (float)); + ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf2, + &data_size); - ml_tensors_info_get_count (out_info, &tmp_count); - ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); + EXPECT_FLOAT_EQ (output_buf2[0], 3.0f); + EXPECT_FLOAT_EQ (output_buf2[1], 4.0f); + EXPECT_FLOAT_EQ (output_buf2[2], 5.0f); + EXPECT_FLOAT_EQ (output_buf2[3], 6.0f); + EXPECT_FLOAT_EQ (output_buf2[4], 7.0f); + EXPECT_EQ (data_size, 5 * sizeof (float)); - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 5U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); + ml_tensors_info_get_count (out_info, &tmp_count); + ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); - status = ml_single_close (single); - EXPECT_EQ (status, ML_ERROR_NONE); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 5U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_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); + EXPECT_EQ (status, ML_ERROR_NONE); + ml_tensors_data_destroy (output); + ml_tensors_data_destroy (input); + ml_tensors_info_destroy (in_info); + ml_tensors_info_destroy (out_info); + } +skip_test: g_free (test_model); } @@ -4471,6 +4593,7 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_02_p) int status; 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; @@ -4490,7 +4613,12 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_02_p) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_get_input_info (single, &in_info); EXPECT_EQ (status, ML_ERROR_NONE); @@ -4498,49 +4626,49 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_02_p) status = ml_tensors_data_create (in_info, &input); EXPECT_EQ (status, ML_ERROR_NONE); - float tmp_input[] = { 1.0 }; - float *output_buf; - size_t data_size; - status = ml_tensors_data_set_tensor_data (input, 0, tmp_input, - 1 * sizeof (float)); - - ml_tensors_info_get_count (in_info, &tmp_count); - ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); + { + float tmp_input[] = { 1.0 }; + float *output_buf; - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 1U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); + status = ml_tensors_data_set_tensor_data (input, 0, tmp_input, + 1 * sizeof (float)); - status = - ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); - EXPECT_EQ (status, ML_ERROR_NONE); + ml_tensors_info_get_count (in_info, &tmp_count); + ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); - ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf, - &data_size); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 1U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_EQ (tmp_dim[3], 1U); - EXPECT_FLOAT_EQ (output_buf[0], 3.0f; - EXPECT_EQ (data_size, sizeof (float)); + status = + ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); + EXPECT_EQ (status, ML_ERROR_NONE); - ml_tensors_info_get_count (out_info, &tmp_count); - ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); + ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf, + &data_size); + EXPECT_FLOAT_EQ (output_buf[0], 3.0f); + EXPECT_EQ (data_size, sizeof (float)); - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 1U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); + ml_tensors_info_get_count (out_info, &tmp_count); + ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); - ml_tensors_data_destroy (output); - ml_tensors_data_destroy (input); - ml_tensors_info_destroy (in_info); - ml_tensors_info_destroy (out_info); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 1U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_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_get_input_info (single, &in_info); EXPECT_EQ (status, ML_ERROR_NONE); @@ -4555,55 +4683,58 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_success_02_p) status = ml_tensors_data_create (in_info, &input); EXPECT_EQ (status, ML_ERROR_NONE); - float tmp_input2[] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; - float *output_buf2; - status = ml_tensors_data_set_tensor_data (input, 0, tmp_input2, - 5 * sizeof (float)); + { + float tmp_input2[] = { 1.0, 2.0, 3.0, 4.0, 5.0 }; + float *output_buf2; + status = ml_tensors_data_set_tensor_data (input, 0, tmp_input2, + 5 * sizeof (float)); - ml_tensors_info_get_count (in_info, &tmp_count); - ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); + ml_tensors_info_get_count (in_info, &tmp_count); + ml_tensors_info_get_tensor_type (in_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (in_info, 0, tmp_dim); - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 5U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 5U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_EQ (tmp_dim[3], 1U); - status = - ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); - EXPECT_EQ (status, ML_ERROR_NONE); + status = + ml_single_invoke_dynamic (single, input, in_info, &output, &out_info); + EXPECT_EQ (status, ML_ERROR_NONE); - ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf2, - &data_size); + ml_tensors_data_get_tensor_data (output, 0, (void **) &output_buf2, + &data_size); - EXPECT_FLOAT_EQ (output_buf2[0], 3.0f); - EXPECT_FLOAT_EQ (output_buf2[1], 4.0f); - EXPECT_FLOAT_EQ (output_buf2[2], 5.0f); - EXPECT_FLOAT_EQ (output_buf2[3], 6.0f); - EXPECT_FLOAT_EQ (output_buf2[4], 7.0f); - EXPECT_EQ (data_size, 5 * sizeof (float)); + EXPECT_FLOAT_EQ (output_buf2[0], 3.0f); + EXPECT_FLOAT_EQ (output_buf2[1], 4.0f); + EXPECT_FLOAT_EQ (output_buf2[2], 5.0f); + EXPECT_FLOAT_EQ (output_buf2[3], 6.0f); + EXPECT_FLOAT_EQ (output_buf2[4], 7.0f); + EXPECT_EQ (data_size, 5 * sizeof (float)); - ml_tensors_info_get_count (out_info, &tmp_count); - ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); - ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); + ml_tensors_info_get_count (out_info, &tmp_count); + ml_tensors_info_get_tensor_type (out_info, 0, &tmp_type); + ml_tensors_info_get_tensor_dimension (out_info, 0, tmp_dim); - EXPECT_EQ (tmp_count, 1U); - EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); - EXPECT_EQ (tmp_dim[0], 5U); - EXPECT_EQ (tmp_dim[1], 1U); - EXPECT_EQ (tmp_dim[2], 1U); - EXPECT_EQ (tmp_dim[3], 1U); + EXPECT_EQ (tmp_count, 1U); + EXPECT_EQ (tmp_type, ML_TENSOR_TYPE_FLOAT32); + EXPECT_EQ (tmp_dim[0], 5U); + EXPECT_EQ (tmp_dim[1], 1U); + EXPECT_EQ (tmp_dim[2], 1U); + EXPECT_EQ (tmp_dim[3], 1U); - status = ml_single_close (single); - EXPECT_EQ (status, ML_ERROR_NONE); + status = ml_single_close (single); + EXPECT_EQ (status, ML_ERROR_NONE); - ml_tensors_data_destroy (output); - ml_tensors_data_destroy (input); - ml_tensors_info_destroy (in_info); - ml_tensors_info_destroy (out_info); + ml_tensors_data_destroy (output); + ml_tensors_data_destroy (input); + ml_tensors_info_destroy (in_info); + ml_tensors_info_destroy (out_info); + } +skip_test: g_free (test_model); } @@ -4632,7 +4763,12 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_fail_n) status = ml_single_open (&single, test_model, NULL, NULL, ML_NNFW_TYPE_TENSORFLOW_LITE, ML_NNFW_HW_ANY); - ASSERT_EQ (status, ML_ERROR_NONE); + if (is_enabled_tensorflow_lite) { + ASSERT_EQ (status, ML_ERROR_NONE); + } else { + ASSERT_NE (status, ML_ERROR_NONE); + goto skip_test; + } status = ml_single_get_input_info (single, &in_info); EXPECT_EQ (status, ML_ERROR_NONE); @@ -4661,9 +4797,9 @@ TEST (nnstreamer_capi_singleshot, invoke_dynamic_fail_n) ml_tensors_data_destroy (input); ml_tensors_info_destroy (in_info); +skip_test: g_free (test_model); } -#endif /* ENABLE_TENSORFLOW_LITE */ /** * @brief Main gtest -- 2.7.4