Add TCs for pcm data handling API 92/261592/2
authorSuyeon Hwang <stom.hwang@samsung.com>
Wed, 21 Jul 2021 10:15:05 +0000 (19:15 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Thu, 22 Jul 2021 06:32:38 +0000 (15:32 +0900)
Change-Id: I5701d21cfe213f09d87d0af252eeb1755e90fbfe
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
packaging/tts.spec
tests/CMakeLists.txt
tests/res/test_pcm.dat [new file with mode: 0644]
tests/src/tts_unittests.cpp

index 2fcb28a..cad7c1d 100644 (file)
@@ -211,4 +211,5 @@ mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 %manifest tests/org.tizen.tts-unittests.manifest
 %defattr(-,root,root,-)
 %{TZ_SYS_RO_PACKAGES}/org.tizen.tts-unittests.xml
+%{TZ_SYS_RO_APP}/org.tizen.tts-unittests/res/test_pcm.dat
 %{TZ_SYS_RO_APP}/org.tizen.tts-unittests/bin/tts-unittests
index 07c294d..b1ed340 100644 (file)
@@ -2,6 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 PROJECT(gtest-tts CXX)
 
 SET(PKGNAME "org.tizen.tts-unittests")
+SET(RESDIR "${TZ_SYS_RO_APP}/${PKGNAME}/res")
 SET(BINDIR "${TZ_SYS_RO_APP}/${PKGNAME}/bin")
 
 FOREACH(flag ${pkgs_CFLAGS})
@@ -39,4 +40,5 @@ SET_TARGET_PROPERTIES(${UNITTEST_TTS} PROPERTIES
 --wrap=system_info_get_platform_bool")
 
 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_TTS} 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 7334248..7a9471b 100644 (file)
@@ -17,6 +17,7 @@
 #include <gtest/gtest.h>
 #include <Ecore.h>
 #include <system_info.h>
+#include <tzplatform_config.h>
 
 #include <tts.h>
 #include <tts_internal.h>
@@ -47,6 +48,8 @@ static const char *g_text = "Speech Synthesis is the artificial production of hu
        the front-end. The back-end?often referred to as the synthesizer?then converts the symbolic linguistic representation into sound. In certain systems, this part includes the computation \
        of the target prosody (pitch contour, phoneme durations),[4] which is then imposed on the output speech. From Wikipedia";
 
+static const int g_sample_rate = 24000;
+
 static bool __tts_supported_voice_cb(tts_h tts, const char* language, int voice_type, void* user_data)
 {
        return true;
@@ -2935,4 +2938,323 @@ TEST_F(TTSTest, utc_tts_set_credential_n2)
        EXPECT_EQ(ret, TTS_ERROR_NONE);
 }
 
+
+/**
+ * @testcase           utc_tts_add_pcm_p
+ * @since_tizen                2.3
+ * @description                test whether pcm data is added properly.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_p)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 20));
+
+       char data[10] = {0, };
+       EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, 0, g_sample_rate), TTS_ERROR_NONE);
+       EXPECT_EQ(tts_add_pcm(g_tts, 2, data, 10, 0, g_sample_rate), TTS_ERROR_NONE);
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_add_pcm_p2
+ * @since_tizen                2.3
+ * @description                test whether null pcm data is added properly as a final event.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_p2)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 10));
+
+       EXPECT_EQ(tts_add_pcm(g_tts, 3, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NONE);
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_add_pcm_n
+ * @since_tizen                2.3
+ * @description                test whether function returns error with NULL parameter.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       char data[10] = {0, };
+       EXPECT_EQ(tts_add_pcm(nullptr, 1, data, 10, 0, g_sample_rate), TTS_ERROR_INVALID_PARAMETER);
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_add_pcm_n2
+ * @since_tizen                2.3
+ * @description                test whether function returns error when tts is in create state.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n2)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+
+       char data[10] = {0, };
+       EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, 0, g_sample_rate), TTS_ERROR_INVALID_STATE);
+}
+
+/**
+ * @testcase           utc_tts_add_pcm_n3
+ * @since_tizen                2.3
+ * @description                test whether function returns error with invliad data size.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n3)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       char data[10] = {0, };
+       EXPECT_EQ(tts_add_pcm(g_tts, 1, data, -10, 0, g_sample_rate), TTS_ERROR_INVALID_PARAMETER);
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_add_pcm_n4
+ * @since_tizen                2.3
+ * @description                test whether function returns error with invalid audio type.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n4)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       char data[10] = {0, };
+       EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, -1, g_sample_rate), TTS_ERROR_INVALID_PARAMETER);
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_add_pcm_n5
+ * @since_tizen                2.3
+ * @description                test whether function returns error with invalid sampling rate.
+ */
+TEST_F(TTSTest, utc_tts_add_pcm_n5)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_add_pcm(g_tts, 1, nullptr, 0, 0, g_sample_rate), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       char data[10] = {0, };
+       EXPECT_EQ(tts_add_pcm(g_tts, 1, data, 10, 0, -1), TTS_ERROR_INVALID_PARAMETER);
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_play_pcm_p
+ * @since_tizen                2.3
+ * @description                test whether tts is played properly.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_p)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_PLAYING, 5));
+
+       EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_play_pcm_p2
+ * @since_tizen                2.3
+ * @description                test whether tts is played all pcm data properly.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_p2)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_set_utterance_started_cb(g_tts, __tts_utterance_started_cb, NULL), TTS_ERROR_NONE);
+       EXPECT_EQ(tts_set_utterance_completed_cb(g_tts, __tts_utterance_completed_cb, NULL), TTS_ERROR_NONE);
+
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       g_utterance_completed_cb = false;
+       const char* pcm_path = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.tts-unittests/res/test_pcm.dat");
+       FILE* fp_in = fopen(pcm_path, "rb");
+       ASSERT_NE(fp_in, nullptr);
+
+       fseek(fp_in, 0, SEEK_END);
+       size_t size = ftell(fp_in);
+       fseek(fp_in, 0, SEEK_SET);
+
+       const size_t shift_size = 12000;
+       char* data = (char*)calloc(sizeof(char), size);
+       size_t read_size = fread(data, sizeof(char), size, fp_in);
+       ASSERT_GT(read_size, 0);
+
+       int data_num = size / shift_size;
+       for (int i = 0; i <= data_num; i++ ) {
+               if (0 == i) {
+                       EXPECT_EQ(tts_add_pcm(g_tts, 1, &data[i*shift_size], shift_size, 0, g_sample_rate), TTS_ERROR_NONE);
+               } else if (data_num == i) {
+                       EXPECT_EQ(tts_add_pcm(g_tts, 3, &data[i*shift_size], size % shift_size, 0, g_sample_rate), TTS_ERROR_NONE);
+               } else {
+                       EXPECT_EQ(tts_add_pcm(g_tts, 2, &data[i*shift_size], shift_size, 0, g_sample_rate), TTS_ERROR_NONE);
+               }
+       }
+
+       EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_PLAYING, 5));
+
+       while (true != g_utterance_completed_cb) {
+               ecore_main_loop_iterate();
+       }
+
+       EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_play_pcm_n
+ * @since_tizen                2.3
+ * @description                test whether function returns error with NULL parameter.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_n)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_play_pcm(nullptr), TTS_ERROR_INVALID_PARAMETER);
+}
+
+/**
+ * @testcase           utc_tts_play_pcm_n2
+ * @since_tizen                2.3
+ * @description                test whether function returns error when tts is in create state.
+ */
+TEST_F(TTSTest, utc_tts_play_pcm_n2)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_INVALID_STATE);
+}
+
+/**
+ * @testcase           utc_tts_stop_pcm_p
+ * @since_tizen                2.3
+ * @description                test whether tts is stopped properly.
+ */
+TEST_F(TTSTest, utc_tts_stop_pcm_p)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+
+       EXPECT_EQ(tts_prepare(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       EXPECT_EQ(tts_play_pcm(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_PLAYING, 5));
+
+       EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NONE);
+       EXPECT_EQ(true, __is_state_changed(TTS_STATE_READY, 5));
+
+       EXPECT_EQ(tts_unprepare(g_tts), TTS_ERROR_NONE);
+}
+
+/**
+ * @testcase           utc_tts_stop_pcm_n
+ * @since_tizen                2.3
+ * @description                test whether function returns error with NULL parameter.
+ */
+TEST_F(TTSTest, utc_tts_stop_pcm_n)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_stop_pcm(nullptr), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_stop_pcm(nullptr), TTS_ERROR_INVALID_PARAMETER);
+}
+
+/**
+ * @testcase           utc_tts_stop_pcm_n2
+ * @since_tizen                2.3
+ * @description                test whether function returns error when tts is in create state.
+ */
+TEST_F(TTSTest, utc_tts_stop_pcm_n2)
+{
+       if (g_supported == false) {
+               EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_NOT_SUPPORTED);
+               return;
+       }
+       EXPECT_EQ(is_created_hndl, TTS_ERROR_NONE);
+       EXPECT_EQ(tts_stop_pcm(g_tts), TTS_ERROR_INVALID_STATE);
+}
+
 } // namespace