From: Arkadiusz Nowak Date: Wed, 18 May 2022 07:30:43 +0000 (+0200) Subject: Registration of switch user completion event X-Git-Tag: submit/tizen/20220603.143851~1^2~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d40c718fae8aa7f115e47a12159721f6707c5cf5;p=platform%2Fcore%2Fsystem%2Fsessiond.git Registration of switch user completion event Implementation of API function subsession_register_event_callback for SUBSESSION_SWITCH_USER_COMPLETION flag Change-Id: I8049e7c9b39d5f726b24353f9155a9374ac83f4c --- diff --git a/libsessiond/src/lib.c b/libsessiond/src/lib.c index 78251f5..7fd8cc4 100644 --- a/libsessiond/src/lib.c +++ b/libsessiond/src/lib.c @@ -418,7 +418,6 @@ static void signal_switch_user_complete_handler( if(signal_data == NULL || signal_data->client_callback == NULL) { return ; } - call_reply_callback(signal_data, cb_result_ok); g_variant_unref(signal_data->params); @@ -543,20 +542,19 @@ static void signal_switch_user_completion_handler( GDBusConnection *connection, return; } - client_callbacks_data_t *client_callbacks_data = &switch_user_callbacks_data_mt; + client_callbacks_data_t *client_callbacks_data = client_data; - if(client_callbacks_data->list == NULL) { + if(client_data == NULL || client_callbacks_data->list == NULL) { return; } - signal_client_data_t *signal_data = take_from_callbacks_data_and_remove_from_list(client_callbacks_data, parameters, g_compare_session_uid_params); + signal_client_data_t *signal_data = find_in_callbacks_data(client_callbacks_data, parameters, g_compare_session_uid_params_switch_wait); if(signal_data == NULL || signal_data->client_callback == NULL || signal_data->client_callback_data == NULL) { return ; } subsession_event_info event_info = {0}; - event_info.switch_user.event = SUBSESSION_SWITCH_USER_COMPLETION; maybe_g_variant_get_void_(parameters, "(ixii)", diff --git a/libsessiond/target_test/CMakeLists.txt b/libsessiond/target_test/CMakeLists.txt index fa3bacb..b872f81 100644 --- a/libsessiond/target_test/CMakeLists.txt +++ b/libsessiond/target_test/CMakeLists.txt @@ -20,4 +20,5 @@ add_libsd_target_test(api_adduserwait "") add_libsd_target_test(api_removeuserwait "") add_libsd_target_test(api_switch_user_wait "") add_libsd_target_test(api_reg_unreg_add_user_wait "") +add_libsd_target_test(api_switch_user_completion "") add_libsd_target_test(api_get_user_list "") diff --git a/libsessiond/target_test/test_api_switch_user_completion.cpp b/libsessiond/target_test/test_api_switch_user_completion.cpp new file mode 100644 index 0000000..3075dc0 --- /dev/null +++ b/libsessiond/target_test/test_api_switch_user_completion.cpp @@ -0,0 +1,174 @@ +#include +#include +#include +#include + +#include +#include +#include +#include "sessiond.h" + +#include "test_hlp.hpp" + +template +bool all_true(Args... args) +{ + return (... && args); +} + +int test_reply_callback (int result, void *cb_data) { + + + test_user_data_cb_t *user_data = (test_user_data_cb_t *)cb_data; + + user_data->callback_result = result; + g_atomic_int_inc(&user_data->callback_reference); + + return result; +} + +int test_switch_callback(int result, void *cb_data) { + + //std::cout << " test_switch_callback" << std::endl; + test_user_data_cb_t *user_data = (test_user_data_cb_t *)cb_data; + + user_data->callback_result = result; + g_atomic_int_inc(&user_data->callback_reference); + + //std::cout << " test_switch_callback end" << std::endl; + return result; +} + +int tud_atomic_int_get(test_user_data_cb_t &arg) { + return g_atomic_int_get(&arg.callback_reference); +} + +template +gboolean callback_pending_ud (gpointer data) { + + T *ud = static_cast(data); + + gboolean is_pending = g_main_context_pending(NULL); + + if(is_pending == TRUE) { + return TRUE; + } + + auto loop_quit_ready = std::apply([](auto &... args){ + return ( ( tud_atomic_int_get(args)>=1 ) && ... ); + }, ud->t); + + if(loop_quit_ready) { + g_main_loop_quit((GMainLoop*)ud->loop); + } + + return TRUE; +} + +const int user_1 = 1; +const int user_2 = 2; + + +int test_subsession_switch_user_completion_callback(subsession_event_info info, void *cb_data) { + + test_user_data_cb_t *user_data = (test_user_data_cb_t *)cb_data; + user_data->session_uid = info.switch_user.session_uid; + user_data->switch_id = info.switch_user.switch_id; + user_data->user_id = info.switch_user.next_user; + user_data->prev_user_id = info.switch_user.prev_user; + user_data->callback_result = -1; + + if(user_data->user_id == user_2 ){ + user_data->callback_result = 0; + g_atomic_int_inc(&user_data->callback_reference); + } + + return 0; +} + + +enum { + add_user_1 = 0, + add_user_2, + remove_user_1, + remove_user_2, + switch_user_to_1, + switch_user_to_2, + switch_completion, +}; + +using tud_ = test_user_data_cb_t; +using ud_ = struct ud_ctrl_t; + +template +int add_user_wrap(int user_id, subsession_reply_callback cb, ud_ &ud) { + + std::get(ud.t).user_id = user_id; + return subsession_add_user(test_subsession_uid, std::get(ud.t).user_id, + cb, (void *)&std::get(ud.t)); +} + +template +int remove_user_wrap(int user_id, subsession_reply_callback cb, ud_ &ud) { + + std::get(ud.t).user_id = user_id; + return subsession_remove_user(test_subsession_uid, std::get(ud.t).user_id, + cb, (void *)&std::get(ud.t)); +} + +TEST(subsession_switch_user_completion, APISwitchUserCompletion) { + + ud_ ud = { .loop = g_main_loop_new (NULL, FALSE), + .t = std::tuple(), + }; + + std::apply([](auto &... args){( (init_user(args) ), ...); }, ud.t ); + + std::get(ud.t).session_uid = -1; + int switch_user_completion_res = subsession_register_event_callback(test_subsession_uid, SUBSESSION_SWITCH_USER_COMPLETION, + test_subsession_switch_user_completion_callback, (void *)&std::get(ud.t) ); + + int add_user_res_1 = add_user_wrap(user_1, test_reply_callback, ud); + int add_user_res_2 = add_user_wrap(user_2, test_reply_callback, ud); + + std::get(ud.t).prev_user_id = user_1; + std::get(ud.t).user_id = user_1; + + int switch_user_res_to_1 = subsession_switch_user(test_subsession_uid, std::get(ud.t).user_id, test_switch_callback, (void *)&std::get(ud.t)); + + + std::get(ud.t).prev_user_id = user_1; + std::get(ud.t).user_id = user_2; + + int switch_user_res_to_2 = subsession_switch_user(test_subsession_uid, std::get(ud.t).user_id, test_switch_callback, (void *)&std::get(ud.t)); + + int remove_user_res_1 = remove_user_wrap(user_1, test_reply_callback, ud); + int remove_user_res_2 = remove_user_wrap(user_2, test_reply_callback, ud); + + + g_idle_add(callback_pending_ud,(gpointer*)&ud); + g_main_loop_run(ud.loop); + + EXPECT_EQ(switch_user_completion_res, 0); + EXPECT_EQ(add_user_res_1, 0); + EXPECT_EQ(remove_user_res_1, 0); + EXPECT_EQ(switch_user_res_to_1, 0); + EXPECT_EQ(switch_user_res_to_2, 0); + EXPECT_EQ(add_user_res_2, 0); + EXPECT_EQ(remove_user_res_2, 0); + + EXPECT_EQ(0, std::get(ud.t).callback_result); + EXPECT_EQ(0, std::get(ud.t).callback_result); + EXPECT_EQ(0, std::get(ud.t).callback_result); + EXPECT_EQ(0, std::get(ud.t).callback_result); + EXPECT_EQ(0, std::get(ud.t).callback_result); + EXPECT_EQ(0, std::get(ud.t).callback_result); + + auto &user_data_result = std::get(ud.t); + + EXPECT_EQ(0, user_data_result.callback_result); + EXPECT_EQ(user_data_result.session_uid, test_subsession_uid); + EXPECT_EQ(user_data_result.user_id, user_2); + EXPECT_EQ(user_data_result.prev_user_id, user_1); + +}