[UTC][machine-learning-service][ACR-1691] Add testcases for ml-service 71/273571/6
authorgichan <gichan2.jang@samsung.com>
Thu, 7 Apr 2022 11:16:12 +0000 (20:16 +0900)
committershobhit verma <shobhit.v@samsung.com>
Thu, 5 May 2022 03:57:23 +0000 (03:57 +0000)
Add testcases for machine learning server API.

Change-Id: Ic64ae1d9f22dba31b33772ced5c1ffa5cbb5d66f
Signed-off-by: gichan <gichan2.jang@samsung.com>
src/utc/nnstreamer/CMakeLists.txt
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-machine-learning-service.c [new file with mode: 0644]
src/utc/nnstreamer/utc-nnstreamer-common.h

index bbd9d121a0495ab518b5d824fc0cf36d0add5058..3325cd8061ee8efc8b8c25dec06ce5f66e2b7be2 100644 (file)
@@ -15,6 +15,7 @@ SET(TC_SOURCES
        utc-nnstreamer-single.c
        utc-nnstreamer-scenario.c
        utc-nnstreamer-capi.c
+       utc-machine-learning-service.c
 )
 
 PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED
index 23b007bf9d2390d3380e61da12e12c064b6c47d6..f4c50f5bb1e255cb23a9452e6bff8b19580a4476 100755 (executable)
@@ -39,6 +39,8 @@ extern void utc_nnstreamer_scenario_startup (void);
 extern void utc_nnstreamer_scenario_cleanup (void);
 extern void utc_nnstreamer_capi_startup (void);
 extern void utc_nnstreamer_capi_cleanup (void);
+extern void utc_machine_learning_service_startup (void);
+extern void utc_machine_learning_service_cleanup (void);
 
 extern int utc_ml_pipeline_construct_p (void);
 extern int utc_ml_pipeline_construct_n (void);
@@ -327,6 +329,18 @@ extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_p (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n1 (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n2 (void);
 
+extern int utc_ml_service_set_pipeline_p1 (void);
+extern int utc_ml_service_set_pipeline_p2 (void);
+extern int utc_ml_service_set_pipeline_n1 (void);
+extern int utc_ml_service_set_pipeline_n2 (void);
+extern int utc_ml_service_get_pipeline_p1 (void);
+extern int utc_ml_service_get_pipeline_n1 (void);
+extern int utc_ml_service_get_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_p1 (void);
+extern int utc_ml_service_delete_pipeline_n1 (void);
+extern int utc_ml_service_delete_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_n3 (void);
+
 testcase tc_array[] = {
   {"utc_ml_pipeline_construct_p", utc_ml_pipeline_construct_p, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
   {"utc_ml_pipeline_construct_n", utc_ml_pipeline_construct_n, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
@@ -614,6 +628,18 @@ testcase tc_array[] = {
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n1", utc_nnstreamer_capi_tensor_if_custom_unregistration_n1, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
 
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n2", utc_nnstreamer_capi_tensor_if_custom_unregistration_n2, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
+
+  {"utc_ml_service_set_pipeline_p1", utc_ml_service_set_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_p2", utc_ml_service_set_pipeline_p2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n1", utc_ml_service_set_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n2", utc_ml_service_set_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_p1", utc_ml_service_get_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n1", utc_ml_service_get_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n2", utc_ml_service_get_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_p1", utc_ml_service_delete_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n1", utc_ml_service_delete_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n2", utc_ml_service_delete_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n3", utc_ml_service_delete_pipeline_n3, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
   {NULL, NULL}
 };
 
index 23b007bf9d2390d3380e61da12e12c064b6c47d6..f4c50f5bb1e255cb23a9452e6bff8b19580a4476 100755 (executable)
@@ -39,6 +39,8 @@ extern void utc_nnstreamer_scenario_startup (void);
 extern void utc_nnstreamer_scenario_cleanup (void);
 extern void utc_nnstreamer_capi_startup (void);
 extern void utc_nnstreamer_capi_cleanup (void);
+extern void utc_machine_learning_service_startup (void);
+extern void utc_machine_learning_service_cleanup (void);
 
 extern int utc_ml_pipeline_construct_p (void);
 extern int utc_ml_pipeline_construct_n (void);
@@ -327,6 +329,18 @@ extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_p (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n1 (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n2 (void);
 
+extern int utc_ml_service_set_pipeline_p1 (void);
+extern int utc_ml_service_set_pipeline_p2 (void);
+extern int utc_ml_service_set_pipeline_n1 (void);
+extern int utc_ml_service_set_pipeline_n2 (void);
+extern int utc_ml_service_get_pipeline_p1 (void);
+extern int utc_ml_service_get_pipeline_n1 (void);
+extern int utc_ml_service_get_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_p1 (void);
+extern int utc_ml_service_delete_pipeline_n1 (void);
+extern int utc_ml_service_delete_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_n3 (void);
+
 testcase tc_array[] = {
   {"utc_ml_pipeline_construct_p", utc_ml_pipeline_construct_p, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
   {"utc_ml_pipeline_construct_n", utc_ml_pipeline_construct_n, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
@@ -614,6 +628,18 @@ testcase tc_array[] = {
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n1", utc_nnstreamer_capi_tensor_if_custom_unregistration_n1, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
 
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n2", utc_nnstreamer_capi_tensor_if_custom_unregistration_n2, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
+
+  {"utc_ml_service_set_pipeline_p1", utc_ml_service_set_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_p2", utc_ml_service_set_pipeline_p2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n1", utc_ml_service_set_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n2", utc_ml_service_set_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_p1", utc_ml_service_get_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n1", utc_ml_service_get_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n2", utc_ml_service_get_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_p1", utc_ml_service_delete_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n1", utc_ml_service_delete_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n2", utc_ml_service_delete_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n3", utc_ml_service_delete_pipeline_n3, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
   {NULL, NULL}
 };
 
index 3729aeab2596b3ad6dad5041344830abc29d1a13..b9caa51ad4b932f121fd5ec28313e64a8ace09ae 100755 (executable)
@@ -39,6 +39,8 @@ extern void utc_nnstreamer_scenario_startup (void);
 extern void utc_nnstreamer_scenario_cleanup (void);
 extern void utc_nnstreamer_capi_startup (void);
 extern void utc_nnstreamer_capi_cleanup (void);
+extern void utc_machine_learning_service_startup (void);
+extern void utc_machine_learning_service_cleanup (void);
 
 extern int utc_ml_pipeline_construct_p (void);
 extern int utc_ml_pipeline_construct_n (void);
@@ -316,6 +318,18 @@ extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_p (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n1 (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n2 (void);
 
+extern int utc_ml_service_set_pipeline_p1 (void);
+extern int utc_ml_service_set_pipeline_p2 (void);
+extern int utc_ml_service_set_pipeline_n1 (void);
+extern int utc_ml_service_set_pipeline_n2 (void);
+extern int utc_ml_service_get_pipeline_p1 (void);
+extern int utc_ml_service_get_pipeline_n1 (void);
+extern int utc_ml_service_get_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_p1 (void);
+extern int utc_ml_service_delete_pipeline_n1 (void);
+extern int utc_ml_service_delete_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_n3 (void);
+
 testcase tc_array[] = {
   {"utc_ml_pipeline_construct_p", utc_ml_pipeline_construct_p, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
   {"utc_ml_pipeline_construct_n", utc_ml_pipeline_construct_n, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
@@ -592,6 +606,18 @@ testcase tc_array[] = {
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_p", utc_nnstreamer_capi_tensor_if_custom_unregistration_p, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n1", utc_nnstreamer_capi_tensor_if_custom_unregistration_n1, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n2", utc_nnstreamer_capi_tensor_if_custom_unregistration_n2, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
+
+  {"utc_ml_service_set_pipeline_p1", utc_ml_service_set_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_p2", utc_ml_service_set_pipeline_p2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n1", utc_ml_service_set_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n2", utc_ml_service_set_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_p1", utc_ml_service_get_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n1", utc_ml_service_get_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n2", utc_ml_service_get_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_p1", utc_ml_service_delete_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n1", utc_ml_service_delete_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n2", utc_ml_service_delete_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n3", utc_ml_service_delete_pipeline_n3, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
   {NULL, NULL}
 };
 
index 23b007bf9d2390d3380e61da12e12c064b6c47d6..f4c50f5bb1e255cb23a9452e6bff8b19580a4476 100755 (executable)
@@ -39,6 +39,8 @@ extern void utc_nnstreamer_scenario_startup (void);
 extern void utc_nnstreamer_scenario_cleanup (void);
 extern void utc_nnstreamer_capi_startup (void);
 extern void utc_nnstreamer_capi_cleanup (void);
+extern void utc_machine_learning_service_startup (void);
+extern void utc_machine_learning_service_cleanup (void);
 
 extern int utc_ml_pipeline_construct_p (void);
 extern int utc_ml_pipeline_construct_n (void);
@@ -327,6 +329,18 @@ extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_p (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n1 (void);
 extern int utc_nnstreamer_capi_tensor_if_custom_unregistration_n2 (void);
 
+extern int utc_ml_service_set_pipeline_p1 (void);
+extern int utc_ml_service_set_pipeline_p2 (void);
+extern int utc_ml_service_set_pipeline_n1 (void);
+extern int utc_ml_service_set_pipeline_n2 (void);
+extern int utc_ml_service_get_pipeline_p1 (void);
+extern int utc_ml_service_get_pipeline_n1 (void);
+extern int utc_ml_service_get_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_p1 (void);
+extern int utc_ml_service_delete_pipeline_n1 (void);
+extern int utc_ml_service_delete_pipeline_n2 (void);
+extern int utc_ml_service_delete_pipeline_n3 (void);
+
 testcase tc_array[] = {
   {"utc_ml_pipeline_construct_p", utc_ml_pipeline_construct_p, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
   {"utc_ml_pipeline_construct_n", utc_ml_pipeline_construct_n, utc_nnstreamer_pipeline_startup, utc_nnstreamer_pipeline_cleanup},
@@ -614,6 +628,18 @@ testcase tc_array[] = {
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n1", utc_nnstreamer_capi_tensor_if_custom_unregistration_n1, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
 
   {"utc_nnstreamer_capi_tensor_if_custom_unregistration_n2", utc_nnstreamer_capi_tensor_if_custom_unregistration_n2, utc_nnstreamer_capi_startup, utc_nnstreamer_capi_cleanup},
+
+  {"utc_ml_service_set_pipeline_p1", utc_ml_service_set_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_p2", utc_ml_service_set_pipeline_p2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n1", utc_ml_service_set_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_set_pipeline_n2", utc_ml_service_set_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_p1", utc_ml_service_get_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n1", utc_ml_service_get_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_get_pipeline_n2", utc_ml_service_get_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_p1", utc_ml_service_delete_pipeline_p1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n1", utc_ml_service_delete_pipeline_n1, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n2", utc_ml_service_delete_pipeline_n2, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
+  {"utc_ml_service_delete_pipeline_n3", utc_ml_service_delete_pipeline_n3, utc_machine_learning_service_startup, utc_machine_learning_service_cleanup},
   {NULL, NULL}
 };
 
diff --git a/src/utc/nnstreamer/utc-machine-learning-service.c b/src/utc/nnstreamer/utc-machine-learning-service.c
new file mode 100644 (file)
index 0000000..e38c16c
--- /dev/null
@@ -0,0 +1,325 @@
+//
+// Copyright (c) 2022 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <string.h>
+
+#include "utc-nnstreamer-common.h"
+#include <ml-api-service.h>
+
+#define IS_SUPPORT_ML_SERVICE_FEATURE \
+do { \
+  if (!feature_ml || !feature_ml_service) { \
+    FPRINTF("[%s][%d][%s] Machine Learning feature is not supported!\\n", __FILE__, __LINE__, __FUNCTION__); \
+    return 0; \
+  } \
+} while (0)
+
+static int status;
+static gchar *test_model;
+static gchar *pipeline;
+
+/**
+ * @function           utc_machine_learning_service_startup
+ * @description                Called before each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_machine_learning_service_startup (void)
+{
+  const gchar *model_file = "mobilenet_v1_1.0_224_quant.tflite";
+
+       int ret = system_info_get_platform_bool(FEATURE_ML, &feature_ml);
+  if (ret != SYSTEM_INFO_ERROR_NONE || !feature_ml) {
+    FPRINTF("[%s][%d][%s] feature machine_learning is not supported!\\n", __FILE__, __LINE__, __FUNCTION__);
+    return;
+  }
+       ret = system_info_get_platform_bool(FEATURE_ML_SERVICE, &feature_ml_service);
+  if (ret != SYSTEM_INFO_ERROR_NONE || !feature_ml_service) {
+    FPRINTF("[%s][%d][%s] feature machine_learning.service is not supported!\\n", __FILE__, __LINE__, __FUNCTION__);
+    return;
+  }
+
+  FPRINTF("[%s][%d][%s] [STARTUP]\\n", __FILE__, __LINE__, __FUNCTION__);
+  char pszValue[CONFIG_VALUE_LEN_MAX] = {0,};
+
+  if ( true == GetValueForTCTSetting("DEVICE_SUITE_TARGET_30", pszValue, API_NAMESPACE ))
+  {
+    int model_path_len = strlen(pszValue) + strlen(model_file) + 10;
+    test_model = (gchar*)malloc(model_path_len);
+    snprintf(test_model, model_path_len, "%s/res/res/%s", pszValue, model_file);
+    FPRINTF("[%s][%d][%s] %s\\n", __FILE__, __LINE__, __FUNCTION__, test_model);
+  }
+  else
+  {
+    FPRINTF("[%s][%d][%s] ERROR TO GET MODEL PATH\\n", __FILE__, __LINE__, __FUNCTION__);
+  }
+
+  pipeline = g_strdup_printf ("appsrc name=appsrc ! "
+      "other/tensors,num-tensors=1,dimensions=(string)1:1:1:1,types=(string)float32,framerate=(fraction)0/1,format=static ! "
+      "tensor_filter name=filter_h framework=tensorflow-lite model=%s ! tensor_sink name=tensor_sink",
+      test_model);
+}
+
+/**
+ * @function           utc_machine_learning_service_cleanup
+ * @description                Called after each test
+ * @parameter          NA
+ * @return                     NA
+ */
+void utc_machine_learning_service_cleanup (void)
+{
+  if (!feature_ml || !feature_ml_service) {
+    return;
+  }
+  g_free (pipeline);
+  g_free (test_model);
+}
+
+/**
+ * @testcase           utc_ml_service_set_pipeline_p1
+ * @since_tizen                7.0
+ * @description                Positive test case to set pipeline description.
+ */
+int utc_ml_service_set_pipeline_p1 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  const gchar *key = "ServiceName";
+
+  /* Test */
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_set_pipeline_p2
+ * @since_tizen                7.0
+ * @description                Positive test case to update pipeline description.
+ */
+int utc_ml_service_set_pipeline_p2 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  gchar *pipeline2, *ret_pipeline;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (key, &ret_pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+  assert (0 == strcmp (pipeline, ret_pipeline));
+  g_free (ret_pipeline);
+
+  pipeline2 =
+      g_strdup_printf
+      ("v4l2src ! videoconvert ! videoscale ! video/x-raw,format=RGB,width=640,height=480,framerate=5/1 ! "
+      "mqttsink pub-topic=example/objectDetection");
+  status = ml_service_set_pipeline (key, pipeline2);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (key, &ret_pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+  assert (0 == strcmp (pipeline2, ret_pipeline));
+
+  g_free (pipeline2);
+  g_free (ret_pipeline);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_set_pipeline_n1
+ * @since_tizen                7.0
+ * @description                Negative test case to set pipeline description with invalid param.
+ */
+int utc_ml_service_set_pipeline_n1 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, NULL);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_set_pipeline_n2
+ * @since_tizen                7.0
+ * @description                Negative test case to set pipeline description with invalid param.
+ */
+int utc_ml_service_set_pipeline_n2 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+
+  status = ml_service_set_pipeline (NULL, pipeline);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_set_pipeline_p1
+ * @since_tizen                7.0
+ * @description                Positive test case to get pipeline description.
+ */
+int utc_ml_service_get_pipeline_p1 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  gchar *ret_pipeline;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (key, &ret_pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+  assert (0 == strcmp (pipeline, ret_pipeline));
+
+  g_free (ret_pipeline);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_get_pipeline_n1
+ * @since_tizen                7.0
+ * @description                Negative test case to get pipeline description with invalid param.
+ */
+int utc_ml_service_get_pipeline_n1 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  gchar *ret_pipeline;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (NULL, &ret_pipeline);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_get_pipeline_n2
+ * @since_tizen                7.0
+ * @description                Negative test case to get pipeline description with invalid param.
+ */
+int utc_ml_service_get_pipeline_n2 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (key, NULL);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_delete_pipeline_p1
+ * @since_tizen                7.0
+ * @description                Positive test case to delete pipeline description.
+ */
+int utc_ml_service_delete_pipeline_p1 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  gchar *ret_pipeline;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (key, &ret_pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+  assert (0 == strcmp (pipeline, ret_pipeline));
+
+  status = ml_service_delete_pipeline (key);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_get_pipeline (key, &ret_pipeline);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  g_free (ret_pipeline);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_delete_pipeline_n1
+ * @since_tizen                7.0
+ * @description                Negative test case to delete pipeline description.
+ */
+int utc_ml_service_delete_pipeline_n1 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_delete_pipeline (NULL);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_delete_pipeline_n2
+ * @since_tizen                7.0
+ * @description                Negative test case to delete pipeline description.
+ */
+int utc_ml_service_delete_pipeline_n2 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  const gchar *key = "ServiceName";
+  const gchar *invalid_key = "InvalidServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_delete_pipeline (invalid_key);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
+
+/**
+ * @testcase           utc_ml_service_delete_pipeline_n3
+ * @since_tizen                7.0
+ * @description                Negative test case to delete pipeline description.
+ */
+int utc_ml_service_delete_pipeline_n3 (void)
+{
+  IS_SUPPORT_ML_SERVICE_FEATURE;
+  const gchar *key = "ServiceName";
+
+  status = ml_service_set_pipeline (key, pipeline);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_delete_pipeline (key);
+  assert_eq (ML_ERROR_NONE, status);
+
+  status = ml_service_delete_pipeline (key);
+  assert_eq (ML_ERROR_INVALID_PARAMETER, status);
+
+  return 0;
+}
index 4af11fb6ab7898bd0d0206f1af1f377c0b1f782a..0b2229e64c369ee1b5b2b8fac7c052611ad9cf1e 100644 (file)
@@ -9,6 +9,7 @@
 #define API_NAMESPACE   "nnstreamer"
 #define FEATURE_ML    "http://tizen.org/feature/machine_learning"
 #define FEATURE_ML_INFERENCE    "http://tizen.org/feature/machine_learning.inference"
+#define FEATURE_ML_SERVICE    "http://tizen.org/feature/machine_learning.service"
 #define SLEEP_TIME  1000000
 
 #define IS_SUPPORT_FEATURE \
@@ -21,6 +22,7 @@ do { \
 
 static bool feature_ml;
 static bool feature_ml_inf;
+static bool feature_ml_service;
 
 #define wait_for_start(handle, state, status) \
 do {\