From: Suyeon Hwang Date: Wed, 21 Jul 2021 10:15:05 +0000 (+0900) Subject: Add TCs for pcm data handling API X-Git-Tag: accepted/tizen/unified/20210810.135334~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ce8d6fe5c91f531a44553832d30b5ba0bb145ad0;p=platform%2Fcore%2Fuifw%2Ftts.git Add TCs for pcm data handling API Change-Id: I5701d21cfe213f09d87d0af252eeb1755e90fbfe Signed-off-by: Suyeon Hwang --- diff --git a/packaging/tts.spec b/packaging/tts.spec index 2fcb28a..cad7c1d 100644 --- a/packaging/tts.spec +++ b/packaging/tts.spec @@ -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 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 07c294d..b1ed340 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -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 index 0000000..edde2e6 Binary files /dev/null and b/tests/res/test_pcm.dat differ diff --git a/tests/src/tts_unittests.cpp b/tests/src/tts_unittests.cpp index 7334248..7a9471b 100644 --- a/tests/src/tts_unittests.cpp +++ b/tests/src/tts_unittests.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -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