Add STT unittests 98/239198/11
authorJihoon Kim <jihoon48.kim@samsung.com>
Wed, 22 Jul 2020 02:55:10 +0000 (11:55 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Wed, 29 Jul 2020 11:38:43 +0000 (20:38 +0900)
Change-Id: I7c639b884093c07993b9aff70a418e7eeec1c5be
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
14 files changed:
CMakeLists.txt
packaging/stt.spec
tests/CMakeLists.txt [new file with mode: 0644]
tests/org.tizen.stt-unittests.manifest [new file with mode: 0644]
tests/org.tizen.stt-unittests.xml [new file with mode: 0644]
tests/src/calloc_mock.cpp [new file with mode: 0644]
tests/src/calloc_mock.h [new file with mode: 0644]
tests/src/cynara_mock.cpp [new file with mode: 0644]
tests/src/cynara_mock.h [new file with mode: 0644]
tests/src/main.cpp [new file with mode: 0644]
tests/src/stt_denied_unittests.cpp [new file with mode: 0644]
tests/src/stt_unittests.cpp [new file with mode: 0644]
tests/src/system_info_mock.cpp [new file with mode: 0644]
tests/src/system_info_mock.h [new file with mode: 0644]

index f137941..9a76f84 100644 (file)
@@ -40,12 +40,12 @@ INCLUDE(FindPkgConfig)
 IF("${_TV_PRODUCT}" STREQUAL "TRUE")
 pkg_check_modules(pkgs REQUIRED
        aul capi-media-audio-io capi-media-wav-player capi-network-bluetooth capi-network-bluetooth-tv capi-system-info cynara-client cynara-session
-       dbus-1 dlog ecore glib-2.0 libgum libtzplatform-config libxml-2.0 libsystemd-login vconf vconf-internal-keys buxton2 farfield-voice-api
+       dbus-1 dlog ecore glib-2.0 libgum libtzplatform-config libxml-2.0 libsystemd-login vconf vconf-internal-keys buxton2 gmock farfield-voice-api
 )
 ELSE()
 pkg_check_modules(pkgs REQUIRED
        aul capi-media-audio-io capi-media-wav-player capi-system-info cynara-client cynara-session
-       dbus-1 dlog ecore glib-2.0 libgum libtzplatform-config libxml-2.0 libsystemd-login vconf vconf-internal-keys buxton2
+       dbus-1 dlog ecore glib-2.0 libgum libtzplatform-config libxml-2.0 libsystemd-login vconf vconf-internal-keys buxton2 gmock
 )
 ENDIF()
 
@@ -68,6 +68,14 @@ ADD_SUBDIRECTORY(server)
 ## Engine Parser ##
 ADD_SUBDIRECTORY(engine-parser)
 
+## Test
+ENABLE_TESTING()
+SET(UNITTEST_STT stt-unittests)
+ADD_TEST(NAME ${UNITTEST_STT} COMMAND ${UNITTEST_STT}
+                        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests)
+
+ADD_SUBDIRECTORY(tests)
+
 ## config ##
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/stt-config.xml DESTINATION ${TZ_SYS_RO_SHARE}/voice/stt/1.0)
 
index 6221f76..58a3cf2 100644 (file)
@@ -32,6 +32,7 @@ BuildRequires:  pkgconfig(pkgmgr)
 BuildRequires:  pkgconfig(pkgmgr-info)
 BuildRequires:  pkgconfig(pkgmgr-installer)
 BuildRequires:  pkgconfig(vconf)
+BuildRequires:  pkgconfig(gmock)
 %if "%{tizen_profile_name}" == "tv"
 BuildRequires:  pkgconfig(capi-network-bluetooth)
 BuildRequires:  pkgconfig(capi-network-bluetooth-tv)
@@ -64,6 +65,14 @@ Summary:    Speech To Text engine header files for STT development
 Group:      Graphics & UI Framework/Development
 Requires:   %{name} = %{version}-%{release}
 
+%package unittests
+Summary:    STT tests
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+
+%description unittests
+GTest for STT
+
 %description devel
 Speech To Text header files for STT development.
 
@@ -110,10 +119,12 @@ export LDFLAGS="$LDFLAGS -lgcov"
 %if "%{tizen_profile_name}" == "tv"
 export CFLAGS="$CFLAGS -DTV_PRODUCT"
 cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DBINDIR=%{_bindir} -DINCLUDEDIR=%{_includedir} \
-        -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN -D_TV_PRODUCT=TRUE
+        -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN -D_TV_PRODUCT=TRUE \
+        -DTZ_SYS_RO_PACKAGES=%TZ_SYS_RO_PACKAGES -DTZ_SYS_RO_APP=%TZ_SYS_RO_APP
 %else
 cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DBINDIR=%{_bindir} -DINCLUDEDIR=%{_includedir} \
-        -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN
+        -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN \
+        -DTZ_SYS_RO_PACKAGES=%TZ_SYS_RO_PACKAGES -DTZ_SYS_RO_APP=%TZ_SYS_RO_APP
 %endif
 
 make %{?jobs:-j%jobs}
@@ -201,3 +212,9 @@ mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 %files gcov
 %{_datadir}/gcov/obj/*
 %endif
+
+%files unittests
+%manifest tests/org.tizen.stt-unittests.manifest
+%defattr(-,root,root,-)
+%{TZ_SYS_RO_PACKAGES}/org.tizen.stt-unittests.xml
+%{TZ_SYS_RO_APP}/org.tizen.stt-unittests/bin/stt-unittests
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..429674a
--- /dev/null
@@ -0,0 +1,48 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(gtest-stt CXX)
+
+SET(PKGNAME "org.tizen.stt-unittests")
+SET(BINDIR "${TZ_SYS_RO_APP}/${PKGNAME}/bin")
+
+FOREACH(flag ${pkgs_CFLAGS})
+       SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -Wall -Werror")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fPIE")
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -Werror")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+
+SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -std=c++11")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}")
+
+SET(SOURCES "")
+
+INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/common)
+
+AUX_SOURCE_DIRECTORY(src SOURCES)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../client STT_CLIENT_SOURCES)
+AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/../common STT_COMMON_SOURCES)
+
+ADD_DEFINITIONS("-DFULLVER=\"${FULLVER}\"")
+
+ADD_EXECUTABLE(${UNITTEST_STT}
+       ${STT_COMMON_SOURCES}
+       ${STT_CLIENT_SOURCES}
+       ${SOURCES}
+       )
+TARGET_LINK_LIBRARIES(${UNITTEST_STT} ${GTEST_LIBRARIES} ${pkgs_LDFLAGS} ${EXTRA_LDFLAGS})
+SET_TARGET_PROPERTIES(${UNITTEST_STT} PROPERTIES
+       COMPILE_FLAGS "-fPIE"
+       #Never add any space for LINKFLAGS
+       LINK_FLAGS "-Wl,\
+--wrap=system_info_get_platform_bool,\
+--wrap=cynara_initialize,\
+--wrap=cynara_finish,\
+--wrap=cynara_session_from_pid,\
+--wrap=cynara_check,\
+--wrap=calloc")
+
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/${PKGNAME}.xml DESTINATION ${TZ_SYS_RO_PACKAGES})
+INSTALL(TARGETS ${UNITTEST_STT} DESTINATION ${BINDIR})
diff --git a/tests/org.tizen.stt-unittests.manifest b/tests/org.tizen.stt-unittests.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
diff --git a/tests/org.tizen.stt-unittests.xml b/tests/org.tizen.stt-unittests.xml
new file mode 100644 (file)
index 0000000..9281099
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="3.0" package="org.tizen.stt-unittests" version="0.6.2" install-location="internal-only">
+        <label>STT unittests</label>
+        <author email="jihoon48.kim" href="www.samsung.com">Jihoon Kim</author>
+        <description>STT unittests</description>
+        <service-application appid="org.tizen.stt-unittests" launch_mode="caller" exec="stt-unittests" hw-acceleration="use-GL" nodisplay="true" multiple="false" type="capp" taskmanage="false">
+            <label>STT unittests</label>
+            <background-category value="background-network"/>
+            <background-category value="download"/>
+            <background-category value="iot-communication"/>
+            <background-category value="location"/>
+            <background-category value="media"/>
+        </service-application>
+        <privileges>
+            <privilege>http://tizen.org/privilege/recorder</privilege>
+            <privilege>http://tizen.org/privilege/appmanager.launch</privilege>
+        </privileges>
+</manifest>
diff --git a/tests/src/calloc_mock.cpp b/tests/src/calloc_mock.cpp
new file mode 100644 (file)
index 0000000..b6c0ca1
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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 "calloc_mock.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <tizen.h>
+
+static size_t stt_mock_calloc_size;
+static size_t stt_mock_calloc_result;
+
+EXPORT_API void stt_mock_calloc_set_up(size_t size, int result)
+{
+       stt_mock_calloc_size = size;
+       stt_mock_calloc_result = result;
+}
+
+EXPORT_API void* __wrap_calloc(size_t nmemb, size_t size)
+{
+       if (size == stt_mock_calloc_size) {
+               if (0 == stt_mock_calloc_result)
+                       return NULL;
+       }
+
+       return __real_calloc(nmemb, size);
+}
diff --git a/tests/src/calloc_mock.h b/tests/src/calloc_mock.h
new file mode 100644 (file)
index 0000000..022db8d
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+#pragma once
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void stt_mock_calloc_set_up(size_t size, int result);
+void* __wrap_calloc(size_t nmemb, size_t size);
+extern void* __real_calloc(size_t nmemb, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/tests/src/cynara_mock.cpp b/tests/src/cynara_mock.cpp
new file mode 100644 (file)
index 0000000..ff6e88f
--- /dev/null
@@ -0,0 +1,34 @@
+#include "cynara_mock.h"
+#include <string.h>
+#include <stdio.h>
+#include <tizen.h>
+
+static int check_result = CYNARA_API_ACCESS_ALLOWED;
+
+void cynara_check_set_result(int result)
+{
+    check_result = result;
+}
+
+EXPORT_API int __wrap_cynara_initialize(cynara** c, const cynara_configuration* conf)
+{
+    *c = (void *)0x1;
+    return 0;
+}
+
+EXPORT_API int __wrap_cynara_finish(cynara* c)
+{
+    return 0;
+}
+
+EXPORT_API int __wrap_cynara_check(cynara* c, const char* client, const char* client_session,
+    const char* user,
+    const char* privilege)
+{
+    return check_result;
+}
+
+EXPORT_API char *__wrap_cynara_session_from_pid(pid_t pid)
+{
+    return strdup("session");
+}
diff --git a/tests/src/cynara_mock.h b/tests/src/cynara_mock.h
new file mode 100644 (file)
index 0000000..1becb42
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef MOCK_CYNARA_H_
+#define MOCK_CYNARA_H_
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void cynara;
+typedef void* cynara_configuration;
+
+/*! \brief  indicating that API call was interrupted by user*/
+#define CYNARA_API_INTERRUPTED                  4
+
+/*! \brief  indicating access that cannot be resolved without further actions*/
+#define CYNARA_API_ACCESS_NOT_RESOLVED          3
+
+/*! \brief   indicating access that was checked is allowed */
+#define CYNARA_API_ACCESS_ALLOWED               2
+
+/*! \brief   indicating that access that was checked is denied */
+#define CYNARA_API_ACCESS_DENIED                1
+
+/*! \brief   indicating the result of the one specific API is successful */
+#define CYNARA_API_SUCCESS                      0
+
+/*! \brief   indicating that value is not present in cache */
+#define CYNARA_API_CACHE_MISS                   -1
+
+/*! \brief   indicating that pending requests reached maximum */
+#define CYNARA_API_MAX_PENDING_REQUESTS         -2
+
+/*! \brief   indicating system is running out of memory state */
+#define CYNARA_API_OUT_OF_MEMORY                -3
+
+/*! \brief   indicating the API's parameter is malformed */
+#define CYNARA_API_INVALID_PARAM                -4
+
+/*! \brief   indicating that service is not available */
+#define CYNARA_API_SERVICE_NOT_AVAILABLE        -5
+
+/*! \brief   indicating that provided method is not supported by library */
+#define CYNARA_API_METHOD_NOT_SUPPORTED         -6
+
+/*! \brief   cynara service does not allow to perform requested operation */
+#define CYNARA_API_OPERATION_NOT_ALLOWED        -7
+
+/*! \brief   cynara service failed to perform requested operation */
+#define CYNARA_API_OPERATION_FAILED             -8
+
+/*! \brief   cynara service hasn't found requested bucket */
+#define CYNARA_API_BUCKET_NOT_FOUND             -9
+
+/*! \brief   indicating an unknown error */
+#define CYNARA_API_UNKNOWN_ERROR                -10
+
+/*! \brief   indicating configuration error */
+#define CYNARA_API_CONFIGURATION_ERROR          -11
+
+/*! \brief   indicating invalid parameter in command-line */
+#define CYNARA_API_INVALID_COMMANDLINE_PARAM    -12
+
+/*! \brief   indicating that provided buffer is too short */
+#define CYNARA_API_BUFFER_TOO_SHORT             -13
+
+/*! \brief   indicating that database is corrupted */
+#define CYNARA_API_DATABASE_CORRUPTED           -14
+
+/*! \brief   indicating that user doesn't have enough permission to perform action */
+#define CYNARA_API_PERMISSION_DENIED            -15
+
+void cynara_check_set_result(int result);
+
+int __wrap_cynara_initialize(cynara** c, const cynara_configuration* conf);
+int __wrap_cynara_finish(cynara* c);
+int __wrap_cynara_check(cynara* c, const char* client, const char* client_session,
+                        const char* user,
+                        const char* privilege);
+
+char *__wrap_cynara_session_from_pid(pid_t pid);
+
+#ifdef __cplusplus
+}
+#endif
+#endif  /* MOCK_CYNARA_H_ */
diff --git a/tests/src/main.cpp b/tests/src/main.cpp
new file mode 100644 (file)
index 0000000..a37d671
--- /dev/null
@@ -0,0 +1,7 @@
+#include <gtest/gtest.h>
+#include <gmock/gmock.h>
+
+int main(int argc, char** argv) {
+    testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
diff --git a/tests/src/stt_denied_unittests.cpp b/tests/src/stt_denied_unittests.cpp
new file mode 100644 (file)
index 0000000..0f17f44
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020 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 <gtest/gtest.h>
+#include <stt.h>
+
+#include "cynara_mock.h"
+#include "system_info_mock.h"
+
+namespace {
+
+class STTDeniedTest : public testing::Test {
+    public:
+        virtual void SetUp() {
+            /* start of TC */
+            cynara_check_set_result(CYNARA_API_ACCESS_DENIED);
+        }
+        virtual void TearDown() {
+            /* end of TC */
+            cynara_check_set_result(CYNARA_API_ACCESS_ALLOWED);
+        }
+};
+
+TEST_F(STTDeniedTest, utc_stt_create_denied)
+{
+    int ret = STT_ERROR_NONE;
+
+    stt_h stt = NULL;
+    ret = stt_create(&stt);
+    EXPECT_EQ(ret, STT_ERROR_PERMISSION_DENIED);
+}
+
+} // namespace
diff --git a/tests/src/stt_unittests.cpp b/tests/src/stt_unittests.cpp
new file mode 100644 (file)
index 0000000..ae3f74a
--- /dev/null
@@ -0,0 +1,2182 @@
+/*
+ * Copyright (c) 2020 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 <gtest/gtest.h>
+#include <Ecore.h>
+#include <stt.h>
+#include <system_info.h>
+#include "../../client/stt_client.h"
+
+#include "cynara_mock.h"
+#include "system_info_mock.h"
+#include "calloc_mock.h"
+
+namespace {
+
+stt_h g_stt = NULL;
+static char *g_engine_id = NULL;
+static char *g_language = NULL;
+static stt_state_e g_current_state;
+static stt_state_e g_temp_current_state;
+static bool g_stt_supported = false;
+static stt_error_e g_error = STT_ERROR_NONE;
+
+static bool __stt_supported_engine_cb(stt_h stt, const char* engine_id, const char* engine_name, void* user_data)
+{
+    return true;
+}
+
+static bool __stt_supported_language_cb(stt_h stt, const char* lang, void* user_data)
+{
+    return true;
+}
+
+static void __stt_state_changed_cb(stt_h stt, stt_state_e previous, stt_state_e current, void* user_data)
+{
+    g_current_state = current;
+}
+
+static void __stt_temp_state_changed_cb(stt_h stt, stt_state_e previous, stt_state_e current, void* user_data)
+{
+    g_temp_current_state = current;
+}
+
+static void __stt_error_cb(stt_h stt, stt_error_e reason, void *user_data)
+{
+    g_error = reason;
+    printf("ERROR(%d)", g_error);
+
+    return;
+}
+
+static void __stt_recognition_result_cb(stt_h stt, stt_result_event_e event, const char** data, int data_count, const char* msg, void *user_data)
+{
+}
+
+static bool __stt_result_time_cb(stt_h stt, int index, stt_result_time_event_e event, const char* text, long start_time, long end_time, void *user_data)
+{
+    return true;
+}
+
+static void __stt_default_language_changed_cb(stt_h stt, const char* previous, const char* current, void *user_data)
+{
+}
+
+static void __stt_engine_changed_cb(stt_h stt, const char* engine_id, const char* language, bool support_silence, bool need_credential, void *user_data)
+{
+}
+
+static void __stt_speech_status_cb(stt_h stt, stt_speech_status_e status, void *user_data)
+{
+}
+
+class STTTest : public testing::Test {
+    public:
+        virtual void SetUp() {
+            ecore_init();
+
+            cynara_check_set_result(CYNARA_API_ACCESS_ALLOWED);
+
+            /* start of TC */
+            int ret = -1;
+            g_stt_supported = true;
+            system_info_get_platform_bool("http://tizen.org/feature/speech.recognition", &g_stt_supported);
+            g_current_state = STT_STATE_CREATED;
+            g_error = STT_ERROR_NONE;
+
+            if (g_stt_supported) {
+                g_stt = NULL;
+                ret = stt_create(&g_stt);
+                EXPECT_EQ(ret, STT_ERROR_NONE);
+
+                ret = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+                EXPECT_EQ(ret, STT_ERROR_NONE);
+                ret = stt_set_error_cb(g_stt, __stt_error_cb, nullptr);
+                EXPECT_EQ(ret, STT_ERROR_NONE);
+            }
+        }
+        virtual void TearDown() {
+            /* end of TC */
+            int ret = -1;
+            if (true == g_stt_supported) {
+                ret = stt_unset_state_changed_cb(g_stt);
+                EXPECT_EQ(ret, STT_ERROR_NONE);
+                ret = stt_unset_error_cb(g_stt);
+                EXPECT_EQ(ret, STT_ERROR_NONE);
+                ret = stt_destroy(g_stt);
+                EXPECT_EQ(ret, STT_ERROR_NONE);
+            }
+            g_stt = NULL;
+            ecore_shutdown();
+        }
+};
+
+TEST_F(STTTest, utc_stt_create_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(g_stt, nullptr);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+
+        stt_h stt = NULL;
+        ret = stt_create(&stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+        EXPECT_NE(stt, nullptr);
+
+        ret = stt_destroy(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_create_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_create(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_create(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_destroy_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_destroy(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_destroy(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_create(&g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_destroy_p1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_destroy(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        stt_h stt = NULL;
+        ret = stt_create(&stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_set_state_changed_cb(stt, __stt_temp_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_get_state(stt, &g_temp_current_state);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_temp_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        /* Destroy stt on ready state */
+        ret = stt_destroy(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_destroy_p2)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_destroy(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check to remove timer */
+        stt_h stt = NULL;
+        ret = stt_create(&stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_destroy(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_destroy_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_destroy(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_destroy(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_destroy_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_destroy(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        stt_h stt = NULL;
+        ret = stt_destroy(stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+static int g_n2_state_changed_ret = STT_ERROR_NONE;
+static void __stt_n2_state_changed_cb(stt_h stt, stt_state_e previous, stt_state_e current, void* user_data)
+{
+    g_temp_current_state = current;
+
+    /* Fail to destroy in callback function */
+    g_n2_state_changed_ret = stt_destroy(stt);
+}
+
+TEST_F(STTTest, utc_stt_destroy_n2)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_destroy(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Fail to destroy in callback function */
+        stt_h stt = NULL;
+        ret = stt_create(&stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_set_state_changed_cb(stt, __stt_n2_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_get_state(stt, &g_temp_current_state);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_temp_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        EXPECT_EQ(g_n2_state_changed_ret, STT_ERROR_OPERATION_FAILED);
+
+        ret = stt_destroy(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_prepare_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_prepare_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_prepare(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_prepare(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_prepare_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_prepare(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        stt_h stt = NULL;
+        ret = stt_create(&stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_set_state_changed_cb(stt, __stt_temp_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_get_state(stt, &g_temp_current_state);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_temp_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_prepare(stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        /* Destroy stt on ready state */
+        ret = stt_destroy(stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unprepare_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while(STT_STATE_READY!=g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unprepare_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unprepare(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unprepare(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unprepare_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unprepare(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        stt_h stt = NULL;
+        ret = stt_create(&stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_supported_engines_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_supported_engines(g_stt, __stt_supported_engine_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_foreach_supported_engines(g_stt, __stt_supported_engine_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_supported_engines_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_supported_engines(NULL, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_foreach_supported_engines(NULL, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_supported_engines_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_supported_engines(NULL, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_foreach_supported_engines(g_stt, __stt_supported_engine_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_engine_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_engine(g_stt, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_get_engine(g_stt, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        if (NULL != g_engine_id) {
+            free(g_engine_id);
+            g_engine_id = NULL;
+        }
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_engine_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_engine(NULL, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_get_engine(NULL, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+
+        if (NULL != g_engine_id) {
+            free(g_engine_id);
+            g_engine_id = NULL;
+        }
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_engine_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_engine(NULL, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_get_engine(g_stt, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        if (NULL != g_engine_id) {
+            free(g_engine_id);
+            g_engine_id = NULL;
+        }
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_engine_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_engine(g_stt, g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_get_engine(g_stt, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_set_engine(g_stt, g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        if (NULL != g_engine_id) {
+            free(g_engine_id);
+            g_engine_id = NULL;
+        }
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_engine_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_engine(NULL, g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_engine(NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_engine_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_engine(NULL, g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_get_engine(g_stt, &g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_engine(g_stt, g_engine_id);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        if (NULL != g_engine_id) {
+            free(g_engine_id);
+            g_engine_id = NULL;
+        }
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_supported_languages_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_supported_languages(g_stt, __stt_supported_language_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_foreach_supported_languages(g_stt, __stt_supported_language_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_supported_languages_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_supported_languages(NULL, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_foreach_supported_languages(NULL, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_default_language_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_default_language(g_stt, &g_language);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_get_default_language(g_stt, &g_language);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        if (NULL != g_language) {
+            free(g_language);
+            g_language = NULL;
+        }
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_default_language_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_default_language(NULL, &g_language);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_get_default_language(NULL, &g_language);
+        free (g_language);
+        g_language = NULL;
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_state_p)
+{
+    stt_state_e state;
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_state(g_stt, &state);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_get_state(g_stt, &state);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_state_n)
+{
+    stt_state_e state;
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_state(NULL, &state);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_get_state(NULL, &state);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_is_recognition_type_supported_p)
+{
+    bool support;
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_is_recognition_type_supported(g_stt, STT_RECOGNITION_TYPE_FREE, &support);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+        ret = stt_is_recognition_type_supported(g_stt, STT_RECOGNITION_TYPE_FREE, &support);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_is_recognition_type_supported_p1)
+{
+    bool support;
+    int ret = STT_ERROR_NONE;
+    const char* type = "STT_RECOGNITION_TYPE_TEST";
+
+    if (false == g_stt_supported) {
+        ret = stt_is_recognition_type_supported(g_stt, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        support = true;
+        ret = stt_is_recognition_type_supported(g_stt, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_is_recognition_type_supported_n)
+{
+    bool support;
+    int ret = STT_ERROR_NONE;
+    const char* type = "STT_RECOGNITION_TYPE_NOT_SUPPORTED";
+
+    if (false == g_stt_supported) {
+        ret = stt_is_recognition_type_supported(g_stt, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_is_recognition_type_supported(NULL, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_is_recognition_type_supported_n1)
+{
+    bool support;
+    int ret = STT_ERROR_NONE;
+    const char* type = "STT_RECOGNITION_TYPE_NOT_SUPPORTED";
+
+    if (false == g_stt_supported) {
+        ret = stt_is_recognition_type_supported(g_stt, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_is_recognition_type_supported(g_stt, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_is_recognition_type_supported_n2)
+{
+    bool support;
+    int ret = STT_ERROR_NONE;
+    const char* type = "STT_RECOGNITION_TYPE_NOT_SUPPORTED";
+
+    if (false == g_stt_supported) {
+        ret = stt_is_recognition_type_supported(g_stt, type, &support);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_is_recognition_type_supported(NULL, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_silence_detection_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_silence_detection(g_stt, STT_OPTION_SILENCE_DETECTION_AUTO);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+        ret = stt_set_silence_detection(g_stt, STT_OPTION_SILENCE_DETECTION_AUTO);
+        assert(STT_ERROR_NONE == ret || STT_ERROR_NOT_SUPPORTED_FEATURE == ret);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_silence_detection_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_silence_detection(NULL, STT_OPTION_SILENCE_DETECTION_AUTO);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_silence_detection(NULL, STT_OPTION_SILENCE_DETECTION_AUTO);
+        assert(STT_ERROR_NONE != ret && STT_ERROR_NOT_SUPPORTED_FEATURE != ret);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_silence_detection_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_silence_detection(NULL, STT_OPTION_SILENCE_DETECTION_AUTO);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_silence_detection(g_stt, STT_OPTION_SILENCE_DETECTION_AUTO);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_silence_detection_n2)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_silence_detection(NULL, STT_OPTION_SILENCE_DETECTION_AUTO);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        /* Check invalid parameter */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_silence_detection(g_stt, (stt_option_silence_detection_e)-1);
+        assert(STT_ERROR_INVALID_PARAMETER == ret || STT_ERROR_NOT_SUPPORTED_FEATURE == ret);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_start_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_start(NULL, g_language, STT_RECOGNITION_TYPE_FREE);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_start(g_stt, NULL, STT_RECOGNITION_TYPE_FREE);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_start_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_start(NULL, g_language, STT_RECOGNITION_TYPE_FREE);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        ret = stt_start(NULL, NULL, STT_RECOGNITION_TYPE_FREE);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_stop_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_stop(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_stop(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_cancel_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_cancel(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_cancel(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_cancel_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_cancel(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_cancel(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_recording_volume_n)
+{
+    float vol;
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_recording_volume(NULL, &vol);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_get_recording_volume(NULL, &vol);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_recording_volume_n1)
+{
+    float vol;
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_get_recording_volume(NULL, &vol);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_get_recording_volume(g_stt, &vol);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_recognition_result_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_recognition_result_cb(g_stt, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_recognition_result_cb(g_stt, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_recognition_result_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_recognition_result_cb(NULL, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_recognition_result_cb(NULL, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_recognition_result_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_recognition_result_cb(NULL, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_recognition_result_cb(g_stt, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_recognition_result_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_recognition_result_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_recognition_result_cb(g_stt, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unset_recognition_result_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_recognition_result_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_recognition_result_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unset_recognition_result_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_recognition_result_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_recognition_result_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_recognition_result_cb(g_stt, __stt_recognition_result_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_unset_recognition_result_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_state_changed_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret  = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret  = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_state_changed_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_state_changed_cb(NULL, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_state_changed_cb(NULL, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_state_changed_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_state_changed_cb(NULL, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_state_changed_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_state_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_unset_state_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_state_changed_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_state_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unset_state_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_state_changed_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_state_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_unset_state_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_error_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_error_cb(g_stt, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_error_cb(g_stt, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_error_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_error_cb(NULL, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_error_cb(NULL, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_error_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_error_cb(NULL, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_error_cb(g_stt, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_error_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_error_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_error_cb(g_stt, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+        ret = stt_unset_error_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_error_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_error_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unset_error_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_error_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_error_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_error_cb(g_stt, __stt_error_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_unset_error_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_default_language_changed_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_default_language_changed_cb(g_stt, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_default_language_changed_cb(g_stt, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_default_language_changed_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_default_language_changed_cb(NULL, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_default_language_changed_cb(NULL, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_default_language_changed_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_default_language_changed_cb(NULL, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_default_language_changed_cb(g_stt, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_default_language_changed_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_default_language_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_default_language_changed_cb(g_stt, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+        ret = stt_unset_default_language_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_default_language_changed_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_default_language_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unset_default_language_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_default_language_changed_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_default_language_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_default_language_changed_cb(g_stt, __stt_default_language_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_unset_default_language_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_start_sound_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_start_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_start_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_start_sound_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_start_sound(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_start_sound(NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_start_sound_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_start_sound(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        /* check invalid state */
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_start_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_start_sound_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_start_sound(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+        ret = stt_set_start_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unset_start_sound(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_start_sound_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_start_sound(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        EXPECT_NE(STT_STATE_READY, g_current_state);
+
+        ret = stt_unset_start_sound(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_start_sound_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_start_sound(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        EXPECT_NE(STT_STATE_READY, g_current_state);
+
+        ret = stt_unset_start_sound(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_stop_sound_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_stop_sound(g_stt, "test.wav");
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_stop_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_stop_sound_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_stop_sound(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_stop_sound(NULL, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_stop_sound_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_stop_sound(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        ret = stt_set_stop_sound(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_stop_sound_n2)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_stop_sound(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_stop_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_stop_sound_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_stop_sound(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        if (0 != access("/opt/usr/apps/core-stt-tests/data/ringtone.wav", F_OK)) {
+            return;
+        }
+
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_stop_sound(g_stt, "/opt/usr/apps/core-stt-tests/data/ringtone.wav");
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unset_stop_sound(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_stop_sound_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_stop_sound(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        EXPECT_NE(STT_STATE_READY, g_current_state);
+
+        ret = stt_unset_stop_sound(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_stop_sound_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_stop_sound(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        EXPECT_NE(STT_STATE_READY, g_current_state);
+
+        ret = stt_unset_stop_sound(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_detailed_result_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_detailed_result(g_stt, __stt_result_time_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_foreach_detailed_result(g_stt, __stt_result_time_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_foreach_detailed_result_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_foreach_detailed_result(NULL, __stt_result_time_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_foreach_detailed_result(NULL, __stt_result_time_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_get_error_message_n)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_error_message(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_get_error_message(g_stt, nullptr);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_get_error_message_n1)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_error_message(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ret = stt_get_error_message(NULL, nullptr);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_get_error_message_n2)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_error_message(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+    char* err_msg = NULL;
+    ret = stt_get_error_message(g_stt, &err_msg);
+    EXPECT_EQ(ret, STT_ERROR_OPERATION_FAILED);
+}
+
+TEST_F(STTTest, utc_stt_set_private_data_p)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_prepare(g_stt);
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+
+    while (STT_STATE_READY != g_current_state) {
+        ecore_main_loop_iterate();
+    }
+
+    ret = stt_set_private_data(g_stt, "gender", "data");
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+
+    ret = stt_unprepare(g_stt);
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_set_private_data_n)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_private_data(NULL, NULL, nullptr);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_set_private_data_n1)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_private_data(g_stt, "gender", nullptr);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_set_private_data_n2)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_private_data(g_stt, NULL, "data");
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_set_private_data_n3)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_private_data(g_stt, "gender", "data");
+    EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+}
+
+TEST_F(STTTest, utc_stt_get_private_data_p)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_prepare(g_stt);
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+
+    while (STT_STATE_READY != g_current_state) {
+        ecore_main_loop_iterate();
+    }
+
+    char *data = NULL;
+    ret = stt_get_private_data(g_stt, "gender", &data);
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+    free(data);
+
+    ret = stt_unprepare(g_stt);
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_get_private_data_n)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_get_private_data(NULL, NULL, nullptr);
+    EXPECT_NE(ret, STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_get_private_data_n1)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_get_private_data(g_stt, "gender", nullptr);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_get_private_data_n2)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    char* data = NULL;
+    ret = stt_get_private_data(g_stt, NULL, &data);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_get_private_data_n3)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_get_private_data(g_stt, NULL, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    char* data = NULL;
+    ret = stt_get_private_data(g_stt, "gender", &data);
+    EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+}
+
+TEST_F(STTTest, utc_stt_set_credential_p)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_credential(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_credential(g_stt, "test");
+    EXPECT_EQ(ret, STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_set_credential_n)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_credential(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_credential(NULL, nullptr);
+    EXPECT_NE(ret, STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_set_credential_n1)
+{
+    int ret = STT_ERROR_NONE;
+    if (false == g_stt_supported) {
+        ret = stt_set_credential(g_stt, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_NE(g_stt, nullptr);
+
+    ret = stt_set_credential(g_stt, nullptr);
+    EXPECT_NE(ret, STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_set_engine_changed_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_engine_changed_cb(g_stt, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_engine_changed_cb(g_stt, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unset_engine_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_engine_changed_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_engine_changed_cb(NULL, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_engine_changed_cb(NULL, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_engine_changed_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_engine_changed_cb(NULL, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_set_engine_changed_cb(g_stt, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_engine_changed_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_engine_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_engine_changed_cb(g_stt, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+        ret = stt_unset_engine_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_engine_changed_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_engine_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unset_engine_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_engine_changed_cb_n1)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_engine_changed_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    }
+    else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_engine_changed_cb(g_stt, __stt_engine_changed_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_prepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        while (STT_STATE_READY != g_current_state) {
+            ecore_main_loop_iterate();
+        }
+
+        ret = stt_unset_engine_changed_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        ret = stt_unprepare(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_speech_status_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_speech_status_cb(g_stt, __stt_speech_status_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_speech_status_cb(g_stt, __stt_speech_status_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+
+        ret = stt_unset_speech_status_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_set_speech_status_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_set_speech_status_cb(NULL, __stt_speech_status_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_set_speech_status_cb(NULL, __stt_speech_status_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_speech_status_cb_p)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_speech_status_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        EXPECT_NE(g_stt, nullptr);
+        ret = stt_set_speech_status_cb(g_stt, __stt_speech_status_cb, nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+        ret = stt_unset_speech_status_cb(g_stt);
+        EXPECT_EQ(ret, STT_ERROR_NONE);
+    }
+}
+
+TEST_F(STTTest, utc_stt_unset_speech_status_cb_n)
+{
+    int ret = STT_ERROR_NONE;
+
+    if (false == g_stt_supported) {
+        ret = stt_unset_speech_status_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_NOT_SUPPORTED);
+    } else {
+        ret = stt_unset_speech_status_cb(nullptr);
+        EXPECT_EQ(ret, STT_ERROR_INVALID_PARAMETER);
+    }
+}
+
+TEST_F(STTTest, utc_stt_create_out_of_memory)
+{
+    int ret = STT_ERROR_NONE;
+
+    stt_mock_calloc_set_up(sizeof(stt_client_s), 0);
+
+    stt_h stt = NULL;
+    ret = stt_create(&stt);
+    EXPECT_EQ(ret, STT_ERROR_OUT_OF_MEMORY);
+
+    stt_mock_calloc_set_up(sizeof(stt_client_s), sizeof(stt_client_s));
+}
+
+} // namespace
diff --git a/tests/src/system_info_mock.cpp b/tests/src/system_info_mock.cpp
new file mode 100644 (file)
index 0000000..0e00a70
--- /dev/null
@@ -0,0 +1,11 @@
+#include "system_info_mock.h"
+#include <stdio.h>
+#include <tizen.h>
+
+EXPORT_API int __wrap_system_info_get_platform_bool(const char *key, bool *value)
+{
+    if (value)
+        *value = true;
+
+    return 0;
+}
diff --git a/tests/src/system_info_mock.h b/tests/src/system_info_mock.h
new file mode 100644 (file)
index 0000000..075c93b
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef MOCK_SYSTEM_INFO_H_
+#define MOCK_SYSTEM_INFO_H_
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int __wrap_system_info_get_platform_bool(const char *key, bool *value);
+
+#ifdef __cplusplus
+}
+#endif
+#endif  /* MOCK_SYSTEM_INFO_H_ */