Add test cases for audio streaming functions 36/293736/2
authorSuyeon Hwang <stom.hwang@samsung.com>
Fri, 2 Jun 2023 02:44:57 +0000 (11:44 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Thu, 6 Jul 2023 08:08:28 +0000 (17:08 +0900)
- Requirements:
The test cases for testing new functions are neccessary.

- Contents:
This patch adds new test cases for audio streaming functions. With this
patch, the developer can validate new functions.

Change-Id: Ie07218cca3ba169967400f58a0b0f4bf8c5531c8
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
packaging/stt.spec
tests/CMakeLists.txt
tests/res/test_pcm.dat [new file with mode: 0644]
tests/src/stt_unittests.cpp

index 939a80f..06e909d 100644 (file)
@@ -248,5 +248,6 @@ mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 %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/res/test_pcm.dat
 %{TZ_SYS_RO_APP}/org.tizen.stt-unittests/bin/stt-unittests
 %{_bindir}/tizen-unittests/%{name}/run-unittest.sh
index 1dffba8..ecb866d 100644 (file)
@@ -2,6 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 PROJECT(gtest-stt CXX)
 
 SET(PKGNAME "org.tizen.stt-unittests")
+SET(RESDIR "${TZ_SYS_RO_APP}/${PKGNAME}/res")
 SET(BINDIR "${TZ_SYS_RO_APP}/${PKGNAME}/bin")
 
 FOREACH(flag ${pkgs_CFLAGS})
@@ -43,4 +44,5 @@ SET_TARGET_PROPERTIES(${UNITTEST_STT} PROPERTIES
 --wrap=calloc")
 
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/${PKGNAME}.xml DESTINATION ${TZ_SYS_RO_PACKAGES})
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/res/test_pcm.dat DESTINATION ${RESDIR})
 INSTALL(TARGETS ${UNITTEST_STT} DESTINATION ${BINDIR})
diff --git a/tests/res/test_pcm.dat b/tests/res/test_pcm.dat
new file mode 100644 (file)
index 0000000..edde2e6
Binary files /dev/null and b/tests/res/test_pcm.dat differ
index d9d2a92..3c9283e 100644 (file)
 
 #include <gtest/gtest.h>
 #include <Ecore.h>
+#include <tzplatform_config.h>
 #include <stt.h>
+#include <stt_internal.h>
 #include <system_info.h>
-#include "../../client/stt_client.h"
 
 #include "cynara_mock.h"
 #include "system_info_mock.h"
@@ -34,6 +35,9 @@ static stt_state_e g_temp_current_state;
 static bool g_stt_supported = false;
 static stt_error_e g_error = STT_ERROR_NONE;
 
+static char* g_pcm_data = nullptr;
+static long g_pcm_size = 0;
+
 static bool __stt_supported_engine_cb(stt_h stt, const char* engine_id, const char* engine_name, void* user_data)
 {
     return true;
@@ -83,6 +87,39 @@ static void __stt_speech_status_cb(stt_h stt, stt_speech_status_e status, void *
 {
 }
 
+static void read_test_pcm()
+{
+    const char* pcm_path = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.stt-unittests/res/test_pcm.dat");
+    FILE* fp_in = fopen(pcm_path, "rb");
+    if (fp_in == nullptr) {
+        return;
+    }
+
+    fseek(fp_in, 0, SEEK_END);
+    long size = ftell(fp_in);
+    fseek(fp_in, 0, SEEK_SET);
+    if (size <= 0) {
+        fclose(fp_in);
+        return;
+    }
+
+    char* data = (char*)calloc(sizeof(char), size);
+    if (NULL == data) {
+        fclose(fp_in);
+        return;
+    }
+    size_t read_size = fread(data, sizeof(char), size, fp_in);
+    fclose(fp_in);
+
+    if (read_size <= 0) {
+        free(data);
+        return;
+    }
+
+    g_pcm_size = size;
+    g_pcm_data = data;
+}
+
 static bool is_feature_enabled()
 {
     bool stt_feature = false;
@@ -99,44 +136,120 @@ static bool is_feature_enabled()
 }
 
 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 = is_feature_enabled();
-            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);
-            }
+public:
+    virtual void SetUp()
+    {
+        ecore_init();
+
+        /* start of TC */
+        g_stt_supported = is_feature_enabled();
+        g_current_state = STT_STATE_CREATED;
+        g_error = STT_ERROR_NONE;
+        mIsStreaming = false;
+
+        if (g_stt_supported) {
+            g_stt = nullptr;
+            EXPECT_EQ(stt_create(&g_stt), STT_ERROR_NONE);
+            EXPECT_EQ(stt_set_state_changed_cb(g_stt, __stt_state_changed_cb, nullptr), STT_ERROR_NONE);
+            EXPECT_EQ(stt_set_error_cb(g_stt, __stt_error_cb, nullptr), 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();
+    virtual void TearDown()
+    {
+        /* end of TC */
+        CancelSttRecording();
+        UnprepareStt();
+        SetTestMode(false);
+
+        if (true == g_stt_supported) {
+            EXPECT_EQ(stt_unset_state_changed_cb(g_stt), STT_ERROR_NONE);
+            EXPECT_EQ(stt_unset_error_cb(g_stt), STT_ERROR_NONE);
+            EXPECT_EQ(stt_destroy(g_stt), STT_ERROR_NONE);
+            g_stt = nullptr;
+        }
+
+        ecore_shutdown();
+    }
+
+    bool CancelSttRecording()
+    {
+        stt_state_e state = STT_STATE_CREATED;
+        stt_get_state(g_stt, &state);
+        if (STT_STATE_READY == state || STT_STATE_CREATED == state) {
+            return false;
         }
+
+        stt_cancel(g_stt);
+        return IsStateChanged(STT_STATE_READY, 5);
+    }
+
+    bool UnprepareStt()
+    {
+        stt_state_e state = STT_STATE_CREATED;
+        stt_get_state(g_stt, &state);
+        if (STT_STATE_READY != state) {
+            return false;
+        }
+
+        stt_unprepare(g_stt);
+        return IsStateChanged(STT_STATE_CREATED, 5);
+    }
+
+    bool PrepareStt()
+    {
+        stt_state_e state = STT_STATE_CREATED;
+        stt_get_state(g_stt, &state);
+        if (STT_STATE_CREATED != state) {
+            return false;
+        }
+
+        stt_prepare(g_stt);
+        return IsStateChanged(STT_STATE_READY, 5);
+    }
+
+    void SetTestMode(bool isTestMode)
+    {
+        stt_state_e state = STT_STATE_CREATED;
+        stt_get_state(g_stt, &state);
+        if (STT_STATE_READY != state) {
+            return;
+        }
+
+        stt_set_private_data(g_stt, "stt_verification", isTestMode ? "true" : "false");
+    }
+
+    bool IsStateChanged(stt_state_e state, int wait_delay)
+    {
+        mTargetState = state;
+        auto mainLoopQuitTimer = ecore_timer_add(static_cast<double>(wait_delay), [](void *data) -> Eina_Bool {
+            ecore_main_loop_quit();
+            return EINA_FALSE;
+        }, nullptr);
+
+        auto stateCheckerTimer = ecore_timer_add(0.0, [](void *data) -> Eina_Bool {
+            auto instance = reinterpret_cast<STTTest *>(data);
+            if (instance->mTargetState != g_current_state) {
+                return EINA_TRUE;
+            }
+
+            ecore_main_loop_quit();
+            return EINA_FALSE;
+        }, this);
+
+        ecore_main_loop_begin();
+
+        ecore_timer_del(mainLoopQuitTimer);
+        mainLoopQuitTimer = nullptr;
+
+        ecore_timer_del(stateCheckerTimer);
+        stateCheckerTimer = nullptr;
+
+        return state == g_current_state;
+    }
+
+    bool mIsStreaming = false;
+    stt_state_e mTargetState = STT_STATE_CREATED;
 };
 
 TEST_F(STTTest, utc_stt_create_p)
@@ -432,6 +545,8 @@ TEST_F(STTTest, utc_stt_unprepare_n1)
 
         ret = stt_unprepare(stt);
         EXPECT_EQ(ret, STT_ERROR_INVALID_STATE);
+
+        EXPECT_EQ(stt_destroy(stt), STT_ERROR_NONE);
     }
 }
 
@@ -2181,4 +2296,311 @@ TEST_F(STTTest, utc_stt_unset_speech_status_cb_n)
     }
 }
 
+TEST_F(STTTest, utc_stt_get_audio_format_p)
+{
+    ASSERT_NE(g_stt, nullptr);
+
+    stt_audio_type_e type = STT_AUDIO_TYPE_RAW_S16;
+    int rate = -1;
+    int num_of_channels = -1;
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_get_audio_format(g_stt, &type, &rate, &num_of_channels), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    EXPECT_EQ(stt_get_audio_format(g_stt, &type, &rate, &num_of_channels), STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_get_audio_format_n1)
+{
+    ASSERT_NE(g_stt, nullptr);
+
+    stt_audio_type_e type = STT_AUDIO_TYPE_RAW_S16;
+    int rate = -1;
+    int num_of_channels = -1;
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_get_audio_format(g_stt, &type, &rate, &num_of_channels), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_EQ(stt_get_audio_format(g_stt, &type, &rate, &num_of_channels), STT_ERROR_INVALID_STATE);
+}
+
+TEST_F(STTTest, utc_stt_get_audio_format_n2)
+{
+    ASSERT_NE(g_stt, nullptr);
+
+    stt_audio_type_e type = STT_AUDIO_TYPE_RAW_S16;
+    int rate = -1;
+    int num_of_channels = -1;
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_get_audio_format(g_stt, &type, &rate, &num_of_channels), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    EXPECT_EQ(stt_get_audio_format(nullptr, &type, &rate, &num_of_channels), STT_ERROR_INVALID_PARAMETER);
+    EXPECT_EQ(stt_get_audio_format(g_stt, nullptr, &rate, &num_of_channels), STT_ERROR_INVALID_PARAMETER);
+    EXPECT_EQ(stt_get_audio_format(g_stt, &type, nullptr, &num_of_channels), STT_ERROR_INVALID_PARAMETER);
+    EXPECT_EQ(stt_get_audio_format(g_stt, &type, &rate, nullptr), STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_start_audio_streaming_p)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+}
+
+TEST_F(STTTest, utc_stt_start_audio_streaming_n1)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    EXPECT_EQ(stt_start_audio_streaming(nullptr, language, type), STT_ERROR_INVALID_PARAMETER);
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, nullptr), STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_start_audio_streaming_n2)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_INVALID_STATE);
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    ASSERT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    ASSERT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_INVALID_STATE);
+}
+
+TEST_F(STTTest, utc_stt_send_audio_streaming_p)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    read_test_pcm();
+    ASSERT_NE(g_pcm_data, nullptr);
+    ASSERT_GT(g_pcm_size, 0);
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    ASSERT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    ASSERT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_NONE);
+}
+
+TEST_F(STTTest, utc_stt_send_audio_streaming_n1)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    read_test_pcm();
+    ASSERT_NE(g_pcm_data, nullptr);
+    ASSERT_GT(g_pcm_size, 0);
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    ASSERT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    ASSERT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_send_audio_streaming(nullptr, g_pcm_data, g_pcm_size), STT_ERROR_INVALID_PARAMETER);
+    EXPECT_EQ(stt_send_audio_streaming(g_stt, nullptr, g_pcm_size), STT_ERROR_INVALID_PARAMETER);
+    EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, 0), STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_send_audio_streaming_n2)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    read_test_pcm();
+    ASSERT_NE(g_pcm_data, nullptr);
+    ASSERT_GT(g_pcm_size, 0);
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_INVALID_STATE);
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+    EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_INVALID_STATE);
+}
+
+TEST_F(STTTest, utc_stt_send_audio_streaming_n3)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    read_test_pcm();
+    ASSERT_NE(g_pcm_data, nullptr);
+    ASSERT_GT(g_pcm_size, 0);
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    ASSERT_EQ(stt_start(g_stt, language, type), STT_ERROR_NONE);
+    ASSERT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_send_audio_streaming(g_stt, g_pcm_data, g_pcm_size), STT_ERROR_OPERATION_FAILED);
+}
+
+TEST_F(STTTest, utc_stt_stop_audio_streaming_p)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_PROCESSING, 5), true);
+    EXPECT_EQ(IsStateChanged(STT_STATE_READY, 5), true);
+}
+
+TEST_F(STTTest, utc_stt_stop_audio_streaming_n1)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_stop_audio_streaming(nullptr), STT_ERROR_INVALID_PARAMETER);
+}
+
+TEST_F(STTTest, utc_stt_stop_audio_streaming_n2)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_INVALID_STATE);
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+    EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_INVALID_STATE);
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+    EXPECT_EQ(stt_start_audio_streaming(g_stt, language, type), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_PROCESSING, 5), true);
+
+    EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_INVALID_STATE);
+}
+
+TEST_F(STTTest, utc_stt_stop_audio_streaming_n3)
+{
+    ASSERT_NE(g_stt, nullptr);
+    mIsStreaming = true;
+
+    if (false == g_stt_supported) {
+        EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_NOT_SUPPORTED);
+        return;
+    }
+
+    ASSERT_EQ(PrepareStt(), true);
+    SetTestMode(true);
+
+    const char *language = "en_US";
+    const char *type = STT_RECOGNITION_TYPE_FREE_PARTIAL;
+    EXPECT_EQ(stt_start(g_stt, language, type), STT_ERROR_NONE);
+    EXPECT_EQ(IsStateChanged(STT_STATE_RECORDING, 5), true);
+
+    EXPECT_EQ(stt_stop_audio_streaming(g_stt), STT_ERROR_OPERATION_FAILED);
+}
+
 } // namespace