From 80aff2515c2719f03ab3f433e9119acab57a4d54 Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Mon, 14 Nov 2022 21:07:00 +0900 Subject: [PATCH] Add test case for checking callback invocation - Issue: There is no test case for checking whether the callbacks which are set by manager is invoked. - Solution: The voice control framework provides manager API for sending pcm data as recording data. Using this APIs, we can simulate the situation that the user says something. Thus, we can make new test case in this situation. And also, using app manager framework, we can make situation that the engine is suddenly terminate. Using these simulation, this patch creates new test cases for checking whether the callback is invoked. Through this patch, developer can check some callbacks are properly invoked in proper situation. Change-Id: I42d4167c1d6dc33b67858e309264a542032f5f3e Signed-off-by: Suyeon Hwang --- tests/CMakeLists.txt | 2 + tests/org.tizen.vc-unittests.xml | 1 + tests/res/test_pcm.dat | Bin 0 -> 71502 bytes tests/src/vc_mgr_unittests.cpp | 359 ++++++++++++++++++++++++++++--- 4 files changed, 337 insertions(+), 25 deletions(-) create mode 100644 tests/res/test_pcm.dat diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 36c8d35..bec7880 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -31,6 +31,7 @@ ADD_EXECUTABLE(${UNITTEST_VC} TARGET_LINK_LIBRARIES(${UNITTEST_VC} vc -ldl ${pkgs_LDFLAGS}) TARGET_LINK_LIBRARIES(${UNITTEST_VC} vc_manager -ldl ${pkgs_LDFLAGS}) +TARGET_LINK_LIBRARIES(${UNITTEST_VC} vc_setting -ldl ${pkgs_LDFLAGS}) TARGET_LINK_LIBRARIES(${UNITTEST_VC} ${GTEST_LIBRARIES} ${pkgs_LDFLAGS} ${EXTRA_LDFLAGS}) SET_TARGET_PROPERTIES(${UNITTEST_VC} PROPERTIES COMPILE_FLAGS "-fPIE" @@ -46,4 +47,5 @@ INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/${PKGNAME}.xml DESTINATION ${TZ_SYS_RO_P INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/res/test_command.json DESTINATION ${RESDIR}) INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/res/test_demandable_list.xml DESTINATION ${RESDIR}) INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/res/empty_file DESTINATION ${RESDIR}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/tests/res/test_pcm.dat DESTINATION ${RESDIR}) INSTALL(TARGETS ${UNITTEST_VC} DESTINATION ${BINDIR}) diff --git a/tests/org.tizen.vc-unittests.xml b/tests/org.tizen.vc-unittests.xml index 18556d0..8c69747 100644 --- a/tests/org.tizen.vc-unittests.xml +++ b/tests/org.tizen.vc-unittests.xml @@ -12,6 +12,7 @@ http://tizen.org/privilege/recorder http://tizen.org/privilege/voicecontrol.manager http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/appmanager.kill http://tizen.org/privilege/datasharing http://tizen.org/privilege/volume.set diff --git a/tests/res/test_pcm.dat b/tests/res/test_pcm.dat new file mode 100644 index 0000000000000000000000000000000000000000..44231cdfcca856ad4971a793f6c6dc01d183d757 GIT binary patch literal 71502 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 literal 0 HcmV?d00001 diff --git a/tests/src/vc_mgr_unittests.cpp b/tests/src/vc_mgr_unittests.cpp index ae804c2..8711dbd 100644 --- a/tests/src/vc_mgr_unittests.cpp +++ b/tests/src/vc_mgr_unittests.cpp @@ -18,9 +18,12 @@ #include #include #include +#include +#include #include #include +#include #include "system_info_mock.h" #include "cynara_mock.h" @@ -28,11 +31,23 @@ static const char *TEST_COMMAND_JSON_PATH = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.vc-unittests/res/test_command.json"); static const char *TEST_DEMANDABLE_LIST_XML_PATH = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.vc-unittests/res/test_demandable_list.xml"); static const char *TEST_EMPTY_FILE_PATH = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.vc-unittests/res/empty_file"); +static const char *TEST_PCM_DATA_PATH = tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_APP"), "/org.tizen.vc-unittests/res/test_pcm.dat"); static const char *TEST_DOMAIN = "domain"; static const char *DEFAULT_ENGINE_APP_ID = "org.tizen.vc-engine-default"; + static vc_state_e g_vc_mgr_state = VC_STATE_NONE; static vc_service_state_e g_vc_mgr_service_state = VC_SERVICE_STATE_NONE; +static bool g_all_result_cb_invoked = false; +static bool g_result_cb_invoked = false; +static bool g_speech_detected_cb_invoked = false; +static bool g_error_cb_invoked = false; +static int g_set_selected_result_return = VC_ERROR_NONE; +static int g_get_error_message_return = VC_ERROR_NONE; + +static unsigned char* g_pcm_data = nullptr; +static long g_pcm_size = 0; +static vc_cmd_list_h g_test_commands = nullptr; static bool __is_mgr_state_changed(vc_state_e state, int wait_delay) { @@ -74,7 +89,9 @@ static void __vc_mgr_specific_engine_result_cb(const char* engine_app_id, const static bool __vc_mgr_all_result_cb(vc_result_event_e event, vc_cmd_list_h vc_cmd_list, const char *result, const char *msg, void *user_data) { - return true; + g_all_result_cb_invoked = true; + g_set_selected_result_return = vc_mgr_set_selected_results(g_test_commands); + return false; } static void __vc_mgr_pre_result_cb(vc_pre_result_event_e event, const char *result, void *user_data) @@ -83,10 +100,12 @@ static void __vc_mgr_pre_result_cb(vc_pre_result_event_e event, const char *resu static void __vc_mgr_result_cb(vc_result_event_e event, vc_cmd_list_h vc_cmd_list, const char* result, void* user_data) { + g_result_cb_invoked = true; } static void __vc_mgr_begin_speech_detected_cb(void *user_data) { + g_speech_detected_cb_invoked = true; } static void __vc_mgr_dialog_request_cb(int pid, const char *disp_text, const char *utt_text, bool continuous, void *user_data) @@ -132,6 +151,11 @@ static void __vc_mgr_service_state_changed_cb(vc_service_state_e previous, vc_se static void __vc_mgr_error_cb(vc_error_e reason, void* user_data) { + g_error_cb_invoked = true; + + char *error = nullptr; + g_get_error_message_return = vc_mgr_get_error_message(&error); + free(error); } static void __vc_mgr_vc_tts_streaming_cb(int pid, int utt_id, vc_feedback_event_e event, char* buffer, int len, void *user_data) @@ -153,17 +177,6 @@ static vc_cmd_list_h __create_test_command_list() return commands; } -static void __initialize_ecore() -{ - ecore_init(); - ecore_main_loop_glib_integrate(); -} - -static void __shutdown_ecore() -{ - ecore_shutdown(); -} - static bool __is_vc_mgr_supported() { bool is_vc_supported = false; @@ -186,22 +199,169 @@ static bool __is_vc_mgr_supported() return false; } +static bool __is_all_result_cb_invoked(int wait_delay) +{ + int max_count = wait_delay * 10; + int count = 0; + while (max_count > count && false == g_all_result_cb_invoked) { + ecore_main_loop_iterate(); + usleep(100000); + count++; + } + + return g_all_result_cb_invoked; +} + +static bool __is_result_cb_invoked(int wait_delay) +{ + int max_count = wait_delay * 10; + int count = 0; + while (max_count > count && false == g_result_cb_invoked) { + ecore_main_loop_iterate(); + usleep(100000); + count++; + } + + return g_result_cb_invoked; +} + +static bool __is_speech_detected_cb_invoked(int wait_delay) +{ + int max_count = wait_delay * 10; + int count = 0; + while (max_count > count && false == g_speech_detected_cb_invoked) { + ecore_main_loop_iterate(); + usleep(100000); + count++; + } + + return g_speech_detected_cb_invoked; +} + +static bool __is_error_cb_invoked(int wait_delay) +{ + int max_count = wait_delay * 10; + int count = 0; + while (max_count > count && false == g_error_cb_invoked) { + ecore_main_loop_iterate(); + usleep(100000); + count++; + } + + return g_error_cb_invoked; +} + +static void __get_test_PCM_data() +{ + const char* pcm_path = TEST_PCM_DATA_PATH; + 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; + } + + unsigned char* data = (unsigned char*)calloc(sizeof(unsigned char), size); + if (NULL == data) { + fclose(fp_in); + return; + } + size_t read_size = fread(data, sizeof(unsigned char), size, fp_in); + fclose(fp_in); + + if (read_size <= 0) { + free(data); + return; + } + + g_pcm_size = size; + g_pcm_data = data; + + return; +} + +static void __initialize_test_environment() +{ + ecore_init(); + ecore_main_loop_glib_integrate(); + + g_vc_mgr_state = VC_STATE_NONE; + g_vc_mgr_service_state = VC_SERVICE_STATE_NONE; + + g_all_result_cb_invoked = false; + g_result_cb_invoked = false; + g_speech_detected_cb_invoked = false; + g_error_cb_invoked = false; + g_set_selected_result_return = VC_ERROR_OPERATION_FAILED; + g_get_error_message_return = VC_ERROR_OPERATION_FAILED; + + g_test_commands = __create_test_command_list(); + + vc_setting_initialize(); + vc_setting_set_language("en_US"); +} + +static void __shutdown_test_environment() +{ + vc_cmd_list_destroy(g_test_commands, true); + g_test_commands = nullptr; + + vc_setting_set_auto_language(true); + vc_setting_deinitialize(); + + ecore_shutdown(); +} + +static void __test_voice_recording() +{ + EXPECT_EQ(vc_mgr_set_recognition_mode(VC_RECOGNITION_MODE_MANUAL), VC_ERROR_NONE); + EXPECT_EQ(vc_mgr_set_audio_streaming_mode(VC_AUDIO_STREAMING_MODE_OUTSIDE), VC_ERROR_NONE); + + ASSERT_EQ(vc_mgr_set_command_list(g_test_commands), VC_ERROR_NONE); + + ASSERT_EQ(vc_mgr_start(false), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_RECORDING, 5), true); + + __get_test_PCM_data(); + ASSERT_NE(g_pcm_data, nullptr); + ASSERT_GT(g_pcm_size, 0); + + const size_t shift_size = 12000; + int data_num = g_pcm_size / shift_size; + for (int i = 0; i <= data_num; i++ ) { + if (0 == i) { + EXPECT_EQ(vc_mgr_send_audio_streaming(VC_AUDIO_STREAMING_EVENT_START, &g_pcm_data[i*shift_size], shift_size), VC_ERROR_NONE); + } else if (data_num == i) { + EXPECT_EQ(vc_mgr_send_audio_streaming(VC_AUDIO_STREAMING_EVENT_FINISH, &g_pcm_data[i*shift_size], g_pcm_size % shift_size), VC_ERROR_NONE); + } else { + EXPECT_EQ(vc_mgr_send_audio_streaming(VC_AUDIO_STREAMING_EVENT_CONTINUE, &g_pcm_data[i*shift_size], shift_size), VC_ERROR_NONE); + } + } + + ASSERT_EQ(vc_mgr_stop(), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_PROCESSING, 5), true); +} + namespace { class VcMgrTestInNoneState : public testing::Test { public: virtual void SetUp() { - __initialize_ecore(); - g_vc_mgr_state = VC_STATE_NONE; - g_vc_mgr_service_state = VC_SERVICE_STATE_NONE; + __initialize_test_environment(); __is_feature_supported = __is_vc_mgr_supported(); } virtual void TearDown() { vc_mgr_deinitialize(); - __shutdown_ecore(); + __shutdown_test_environment(); } public: @@ -212,9 +372,7 @@ class VcMgrTestInInitializedState : public testing::Test { public: virtual void SetUp() { - __initialize_ecore(); - g_vc_mgr_state = VC_STATE_NONE; - g_vc_mgr_service_state = VC_SERVICE_STATE_NONE; + __initialize_test_environment(); __is_feature_supported = __is_vc_mgr_supported(); EXPECT_EQ(vc_mgr_initialize(), VC_ERROR_NONE); @@ -229,7 +387,7 @@ class VcMgrTestInInitializedState : public testing::Test { EXPECT_EQ(vc_mgr_unset_service_state_changed_cb(), VC_ERROR_NONE); EXPECT_EQ(vc_mgr_deinitialize(), VC_ERROR_NONE); - __shutdown_ecore(); + __shutdown_test_environment(); } public: @@ -240,14 +398,13 @@ class VcMgrTestInReadyState : public testing::Test { public: virtual void SetUp() { - __initialize_ecore(); - g_vc_mgr_state = VC_STATE_NONE; - g_vc_mgr_service_state = VC_SERVICE_STATE_NONE; + __initialize_test_environment(); __is_feature_supported = __is_vc_mgr_supported(); EXPECT_EQ(vc_mgr_initialize(), VC_ERROR_NONE); EXPECT_EQ(vc_mgr_set_state_changed_cb(__vc_mgr_state_changed_cb, nullptr), VC_ERROR_NONE); EXPECT_EQ(vc_mgr_set_service_state_changed_cb(__vc_mgr_service_state_changed_cb, nullptr), VC_ERROR_NONE); + EXPECT_EQ(vc_mgr_set_all_result_cb(__vc_mgr_all_result_cb, nullptr), VC_ERROR_NONE); EXPECT_EQ(vc_mgr_prepare(), VC_ERROR_NONE); ASSERT_EQ(true, __is_mgr_state_changed(VC_STATE_READY, 5)); ASSERT_EQ(true, __is_mgr_service_state_changed(VC_SERVICE_STATE_READY, 5)); @@ -260,7 +417,7 @@ class VcMgrTestInReadyState : public testing::Test { EXPECT_EQ(vc_mgr_unset_service_state_changed_cb(), VC_ERROR_NONE); EXPECT_EQ(vc_mgr_deinitialize(), VC_ERROR_NONE); - __shutdown_ecore(); + __shutdown_test_environment(); } public: @@ -900,7 +1057,7 @@ TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_get_current_commands_n2) * @since_tizen 5.0 * @description Positive UTC for set audio type */ -TEST_F(VcMgrTestInReadyState, vc_set_result_cb_p) +TEST_F(VcMgrTestInReadyState, utc_vc_mgr_set_audio_type_p) { const char *audioType = "audio_id"; if (false == __is_feature_supported) { @@ -1576,6 +1733,29 @@ TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_all_result_cb_p) EXPECT_EQ(vc_mgr_set_all_result_cb(__vc_mgr_all_result_cb, nullptr), VC_ERROR_NONE); } +/** + * @testcase utc_vc_mgr_set_all_result_cb_p2 + * @since_tizen 5.0 + * @description Positive UTC for set all result callback + */ +TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_all_result_cb_p2) +{ + if (false == __is_feature_supported) { + EXPECT_EQ(vc_mgr_set_all_result_cb(__vc_mgr_all_result_cb, nullptr), VC_ERROR_NOT_SUPPORTED); + return; + } + + EXPECT_EQ(vc_mgr_set_all_result_cb(__vc_mgr_all_result_cb, nullptr), VC_ERROR_NONE); + + ASSERT_EQ(vc_mgr_prepare(), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_state_changed(VC_STATE_READY, 5), true); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_READY, 5), true); + + __test_voice_recording(); + + EXPECT_EQ(__is_all_result_cb_invoked(5), true); +} + /** * @testcase utc_vc_mgr_set_all_result_cb_n1 * @since_tizen 5.0 @@ -1801,6 +1981,31 @@ TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_result_cb_p) EXPECT_EQ(vc_mgr_set_result_cb(__vc_mgr_result_cb, nullptr), VC_ERROR_NONE); } +/** + * @testcase utc_vc_mgr_set_result_cb_p2 + * @since_tizen 5.0 + * @description Positive UTC for set result callback + */ +TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_result_cb_p2) +{ + if (false == __is_feature_supported) { + EXPECT_EQ(vc_mgr_set_result_cb(__vc_mgr_result_cb, nullptr), VC_ERROR_NOT_SUPPORTED); + return; + } + + // TODO: Is it necessary to set all result callback? + EXPECT_EQ(vc_mgr_set_all_result_cb(__vc_mgr_all_result_cb, nullptr), VC_ERROR_NONE); + EXPECT_EQ(vc_mgr_set_result_cb(__vc_mgr_result_cb, nullptr), VC_ERROR_NONE); + + ASSERT_EQ(vc_mgr_prepare(), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_state_changed(VC_STATE_READY, 5), true); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_READY, 5), true); + + __test_voice_recording(); + + EXPECT_EQ(__is_result_cb_invoked(5), true); +} + /** * @testcase utc_vc_mgr_set_result_cb_n1 * @since_tizen 5.0 @@ -2026,6 +2231,29 @@ TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_speech_detected_cb_p) EXPECT_EQ(vc_mgr_set_speech_detected_cb(__vc_mgr_begin_speech_detected_cb, nullptr), VC_ERROR_NONE); } +/** + * @testcase utc_vc_mgr_set_speech_detected_cb_p2 + * @since_tizen 5.0 + * @description Positive UTC for set speech detected callback + */ +TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_speech_detected_cb_p2) +{ + if (false == __is_feature_supported) { + EXPECT_EQ(vc_mgr_set_speech_detected_cb(__vc_mgr_begin_speech_detected_cb, nullptr), VC_ERROR_NOT_SUPPORTED); + return; + } + + EXPECT_EQ(vc_mgr_set_speech_detected_cb(__vc_mgr_begin_speech_detected_cb, nullptr), VC_ERROR_NONE); + + ASSERT_EQ(vc_mgr_prepare(), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_state_changed(VC_STATE_READY, 5), true); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_READY, 5), true); + + __test_voice_recording(); + + EXPECT_EQ(__is_speech_detected_cb_invoked(5), true); +} + /** * @testcase utc_vc_mgr_set_speech_detected_cb_n1 * @since_tizen 5.0 @@ -2161,6 +2389,38 @@ TEST_F(VcMgrTestInNoneState, utc_vc_mgr_unset_current_language_changed_cb_n) EXPECT_EQ(vc_mgr_unset_current_language_changed_cb(), VC_ERROR_INVALID_STATE); } +/** + * @testcase utc_vc_mgr_get_error_message_p + * @since_tizen 5.0 + * @description Positive UTC for get error message + */ +TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_get_error_message_p) +{ + if (false == __is_feature_supported) { + EXPECT_EQ(vc_mgr_set_error_cb(__vc_mgr_error_cb, nullptr), VC_ERROR_NOT_SUPPORTED); + return; + } + + char* engine_id = vconf_get_str(VCONFKEY_VC_ENGINE_DEFAULT); + + app_context_h context = nullptr; + EXPECT_EQ(app_manager_get_app_context(engine_id, &context), APP_MANAGER_ERROR_NONE); + EXPECT_NE(context, nullptr); + free(engine_id); + + EXPECT_EQ(vc_mgr_set_error_cb(__vc_mgr_error_cb, nullptr), VC_ERROR_NONE); + + EXPECT_EQ(vc_mgr_prepare(), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_state_changed(VC_STATE_READY, 5), true); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_READY, 5), true); + + EXPECT_EQ(app_manager_terminate_app(context), APP_MANAGER_ERROR_NONE); + app_context_destroy(context); + + EXPECT_EQ(__is_error_cb_invoked(5), true); + EXPECT_EQ(g_get_error_message_return, VC_ERROR_NONE); +} + /** * @testcase utc_vc_mgr_get_error_message_n1 * @since_tizen 5.0 @@ -2223,6 +2483,37 @@ TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_error_cb_p) EXPECT_EQ(vc_mgr_set_error_cb(__vc_mgr_error_cb, nullptr), VC_ERROR_NONE); } +/** + * @testcase utc_vc_mgr_set_error_cb_p2 + * @since_tizen 5.0 + * @description Positive UTC for set error callback + */ +TEST_F(VcMgrTestInInitializedState, utc_vc_mgr_set_error_cb_p2) +{ + if (false == __is_feature_supported) { + EXPECT_EQ(vc_mgr_set_error_cb(__vc_mgr_error_cb, nullptr), VC_ERROR_NOT_SUPPORTED); + return; + } + + char* engine_id = vconf_get_str(VCONFKEY_VC_ENGINE_DEFAULT); + + app_context_h context = nullptr; + EXPECT_EQ(app_manager_get_app_context(engine_id, &context), APP_MANAGER_ERROR_NONE); + EXPECT_NE(context, nullptr); + free(engine_id); + + EXPECT_EQ(vc_mgr_set_error_cb(__vc_mgr_error_cb, nullptr), VC_ERROR_NONE); + + EXPECT_EQ(vc_mgr_prepare(), VC_ERROR_NONE); + ASSERT_EQ(__is_mgr_state_changed(VC_STATE_READY, 5), true); + ASSERT_EQ(__is_mgr_service_state_changed(VC_SERVICE_STATE_READY, 5), true); + + EXPECT_EQ(app_manager_terminate_app(context), APP_MANAGER_ERROR_NONE); + app_context_destroy(context); + + EXPECT_EQ(__is_error_cb_invoked(5), true); +} + /** * @testcase utc_vc_mgr_set_error_cb_n1 * @since_tizen 5.0 @@ -3182,6 +3473,24 @@ TEST_F(VcMgrTestInNoneState, utc_vc_mgr_reset_background_volume_n) EXPECT_EQ(vc_mgr_reset_background_volume(), VC_ERROR_INVALID_STATE); } +/** + * @testcase utc_vc_mgr_set_selected_results_p + * @since_tizen 5.0 + * @description Positive UTC for set selected results + */ +TEST_F(VcMgrTestInReadyState, utc_vc_mgr_set_selected_results_p) +{ + if (false == __is_feature_supported) { + EXPECT_EQ(vc_mgr_set_selected_results(g_test_commands), VC_ERROR_NOT_SUPPORTED); + return; + } + + __test_voice_recording(); + + EXPECT_EQ(__is_all_result_cb_invoked(5), true); + EXPECT_EQ(g_set_selected_result_return, VC_ERROR_NONE); +} + /** * @testcase utc_vc_mgr_set_selected_results_n1 * @since_tizen 5.0 -- 2.34.1