raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=5b8e1a38f562ee3f1dd09075530ae155a16b0a99
commit 5b8e1a38f562ee3f1dd09075530ae155a16b0a99 Author: Mykola Solyanko <m.solya...@samsung.com> Date: Wed Feb 1 13:10:18 2017 +0900 Eldbus: add test suite for eldbus (eldbus_object*) Summary: add tests for next API: eldbus_object_bus_name_get eldbus_object_connection_get eldbus_object_method_call_new eldbus_object_path_get eldbus_object_ref eldbus_object_send eldbus_object_get eldbus_object_introspect eldbus_object_peer_ping eldbus_object_peer_machine_id_get eldbus_object_get Reviewers: cedric, NikaWhite, myoungwoon, raster Subscribers: m.solyanko, jpeg, artem.popov Differential Revision: https://phab.enlightenment.org/D4635 --- src/Makefile_Eldbus.am | 1 + src/tests/eldbus/CMakeLists.txt | 1 + src/tests/eldbus/eldbus_suite.c | 1 + src/tests/eldbus/eldbus_suite.h | 1 + src/tests/eldbus/eldbus_test_eldbus_object.c | 409 +++++++++++++++++++++++++++ 5 files changed, 413 insertions(+) diff --git a/src/Makefile_Eldbus.am b/src/Makefile_Eldbus.am index b4e646c..e602042 100644 --- a/src/Makefile_Eldbus.am +++ b/src/Makefile_Eldbus.am @@ -131,6 +131,7 @@ tests/eldbus/eldbus_test_eldbus_model_object.c \ tests/eldbus/eldbus_test_eldbus_model_proxy.c \ tests/eldbus/eldbus_test_eldbus_model_method.c \ tests/eldbus/eldbus_test_eldbus_model_signal.c \ +tests/eldbus/eldbus_test_eldbus_object.c \ tests/eldbus/eldbus_test_fake_server_eldbus_model_proxy.c \ tests/eldbus/eldbus_fake_server.c \ tests/eldbus/eldbus_suite.h diff --git a/src/tests/eldbus/CMakeLists.txt b/src/tests/eldbus/CMakeLists.txt index df058f9..9192690 100644 --- a/src/tests/eldbus/CMakeLists.txt +++ b/src/tests/eldbus/CMakeLists.txt @@ -11,6 +11,7 @@ set(SOURCES eldbus_test_eldbus_model_object.c eldbus_test_eldbus_model_proxy.c eldbus_test_eldbus_model_signal.c + eldbus_test_eldbus_object.c eldbus_test_fake_server_eldbus_model_proxy.c ) diff --git a/src/tests/eldbus/eldbus_suite.c b/src/tests/eldbus/eldbus_suite.c index dd79e33..4f3c6bb 100644 --- a/src/tests/eldbus/eldbus_suite.c +++ b/src/tests/eldbus/eldbus_suite.c @@ -14,6 +14,7 @@ static const Efl_Test_Case etc[] = { { "eldbus_test_fake_server_eldbus_model_proxy", eldbus_test_fake_server_eldbus_model_proxy }, { "eldbus_model_method", eldbus_test_eldbus_model_method }, { "eldbus_model_signal", eldbus_test_eldbus_model_signal }, + { "eldbus_test_eldbus_object", eldbus_test_eldbus_object }, { NULL, NULL } }; diff --git a/src/tests/eldbus/eldbus_suite.h b/src/tests/eldbus/eldbus_suite.h index 5410fe4..efc47b3 100644 --- a/src/tests/eldbus/eldbus_suite.h +++ b/src/tests/eldbus/eldbus_suite.h @@ -11,5 +11,6 @@ void eldbus_test_eldbus_model_proxy(TCase *tc); void eldbus_test_fake_server_eldbus_model_proxy(TCase *tc); void eldbus_test_eldbus_model_method(TCase *tc); void eldbus_test_eldbus_model_signal(TCase *tc); +void eldbus_test_eldbus_object(TCase *tc); #endif diff --git a/src/tests/eldbus/eldbus_test_eldbus_object.c b/src/tests/eldbus/eldbus_test_eldbus_object.c new file mode 100644 index 0000000..c679da4 --- /dev/null +++ b/src/tests/eldbus/eldbus_test_eldbus_object.c @@ -0,0 +1,409 @@ +#include <Eldbus.h> +#include <Ecore.h> +#include <string.h> +#include <stdio.h> +#include <Eina.h> + +#include "eldbus_suite.h" + +static Eina_Bool is_success = EINA_FALSE; +static Eina_Bool is_register_service = EINA_FALSE; +static Eina_Bool is_peer_ping = EINA_FALSE; + +static Ecore_Timer *timeout = NULL; + +static const char *empty_string = ""; + +static const char *bus = "org.freedesktop.DBus"; +static const char *interface = "org.freedesktop.DBus"; +static const char *path = "/org/freedesktop/DBus"; +static const char *method_name = "GetId"; + +static int cb_data = 5; + +/** +* @addtogroup eldbus +* @{ +* @defgroup eldbus_object +* +* @precondition +* @step 1 Initialize ecore with ecore_init() +* @step 2 Initialize eldbus with eldbus_init() +*/ + +static void +_setup(void) +{ + ecore_init(); + int ret = eldbus_init(); + ck_assert_int_ge(ret, 1); +} + +static void +_teardown(void) +{ + ecore_shutdown(); + int ret = eldbus_shutdown(); + ck_assert_int_eq(ret, 0); +} + +static Eina_Bool +_ecore_loop_close(void *data EINA_UNUSED) +{ + ecore_main_loop_quit(); + + return ECORE_CALLBACK_CANCEL; +} + +static void +_object_message_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + if (timeout != NULL) + { + ecore_timer_del(timeout); + timeout = NULL; + } + + const char *errname, *errmsg; + int *user_data = data; + + if ((user_data) && (*user_data == cb_data)) + { + if (!eldbus_message_error_get(msg, &errname, &errmsg)) + { + char *txt; + if (eldbus_message_arguments_get(msg, "s", &txt)) + { + if ((txt) && strcmp(txt, empty_string)) + is_success = EINA_TRUE; + } + } + } + + ecore_main_loop_quit(); +} + +static void +_name_request(void *data EINA_UNUSED, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + unsigned int reply; + const char *errname, *errmsg; + if (!eldbus_message_error_get(msg, &errname, &errmsg)) + { + if (eldbus_message_arguments_get(msg, "u", &reply)) + { + if (reply == ELDBUS_NAME_REQUEST_REPLY_PRIMARY_OWNER) + { + is_register_service = EINA_TRUE; + } + } + } +} + +static const Eldbus_Method methods[] = { + { + "Ping", NULL, + NULL, NULL, 0 + }, + { + "GetMachineId", NULL, + ELDBUS_ARGS({"s", "machine_id"}), NULL, 0 + }, + { } +}; + +static const Eldbus_Service_Interface_Desc iface_desc = { + "org.freedesktop.DBus.Peer", methods, NULL +}; + +static void +_peer_ping_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + int *user_data = data; + + if (user_data && (*user_data == cb_data)) + { + if (!eldbus_message_error_get(msg, NULL, NULL)) + { + is_peer_ping = EINA_TRUE; + } + } +} + +static void +_machine_id_get(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED) +{ + int *user_data = data; + + if (user_data && (*user_data == cb_data)) + { + if (!eldbus_message_error_get(msg, NULL, NULL)) + { + char *txt; + if (eldbus_message_arguments_get(msg, "s", &txt)) + { + if (txt && strcmp(txt, empty_string)) + { + is_success = EINA_TRUE; + } + } + } + } +} + +/** + * @addtogroup eldbus_object + * @{ + * @defgroup eldbus_object_send_info_get + * @li eldbus_object_bus_name_get() + * @li eldbus_object_connection_get() + * @li eldbus_object_method_call_new() + * @li eldbus_object_path_get() + * @li eldbus_object_ref() + * @li eldbus_object_send() + * @li eldbus_object_get() + * @{ + * @objective Positive test case checks if functions get expected bus name, + * get Eldbus_Connection expected associated with Eldbus_Object object, + * get expected path associated with object, + * create message object and send a message to DBus service, + * increase object reference. Without segmentation fault. + * + * @n Input Data: + * @li the conn object connection with bus + * @li the obj Eldbus_Object object of the given bus and path. + * + * @procedure + * @step 1 Call eldbus_connection_get function to get connection object. + * @step 2 Check returned connection object on NULL. + * @step 3 Call eldbus_object_get get an object of the given bus and path. + * @step 4 Check returned object on NULL. + * @step 5 Call eldbus_object_bus_name_get function to get valid string and check on expected string. + * @step 6 Call eldbus_object_path_get function to get valid string and check on expected string. + * @step 7 Call eldbus_object_ref function to increase object reference. + * @step 8 Check two objects on the same address. + * @step 9 Call eldbus_object_unref function to decrease object reference. + * @step 10 Call eldbus_object_method_call_new function to call a dbus method on the object. + * @step 11 Check returned message object on NULL. + * @step 12 Call eldbus_object_send function to send a message. + * @step 13 Check returned pending object on NULL. + * @step 14 Set timer for preschedule termination of main loop if tested callback wasn't executed. + * @step 15 Start of main loop and wait for tested response in callback executing. + * @step 16 Check static variable named is_success. + * If is equal EINA_TRUE, that callback was executed and method send valid message response. + * @step 17 Call eldbus_message_unref function to delete message object + * @step 18 Call eldbus_object_unref function to delete connection dbus object + * @step 19 Call eldbus_connection_unref function to delete connection object + * + * @passcondition Function should get valid expected object information about service. + * Variables named is_success must equals EINA_TRUE. Without segmentation fault. + * @} + * @} + */ + +START_TEST(utc_eldbus_object_send_info_get_p) +{ + is_success = EINA_FALSE; + + Eldbus_Connection *conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM); + ck_assert_ptr_ne(NULL, conn); + + Eldbus_Object *obj = eldbus_object_get(conn, bus, path); + ck_assert_ptr_ne(NULL, obj); + + const char *bus_from_object_ptr = eldbus_object_bus_name_get(obj); + ck_assert_msg((strcmp(bus, bus_from_object_ptr) == 0), "'%s' != '%s'", bus, bus_from_object_ptr); + + const char *path_from_object_ptr = eldbus_object_path_get(obj); + ck_assert_msg((strcmp(path, path_from_object_ptr) == 0), "'%s' != '%s'", path, path_from_object_ptr); + + Eldbus_Object *obj_ref = eldbus_object_ref(obj); + ck_assert_ptr_eq(obj_ref, obj); + + eldbus_object_unref(obj_ref); + + Eldbus_Connection *connection_obj = eldbus_object_connection_get(obj); + ck_assert_ptr_eq(connection_obj, conn); + + Eldbus_Message *msg = eldbus_object_method_call_new(obj, interface, method_name); + ck_assert_ptr_ne(NULL, msg); + + Eldbus_Pending *pending = eldbus_object_send(obj, msg, _object_message_cb, &cb_data, -1); + ck_assert_ptr_ne(NULL, pending); + + timeout = ecore_timer_add(1.5, _ecore_loop_close, NULL); + ck_assert_ptr_ne(NULL, timeout); + + ecore_main_loop_begin(); + + ck_assert_msg(is_success, "Method %s is not call", method_name); + + eldbus_message_unref(msg); + eldbus_object_unref(obj); + eldbus_connection_unref(conn); +} +END_TEST + +/** + * @addtogroup eldbus_object + * @{ + * @defgroup eldbus_introspect eldbus_object_introspect() + * @{ + * @objective Positive test case checks if function call the method "Introspect" + * on the eldbus object and get valid response in callback function. Without segmentation fault. + * + * @n Input Data: + * @li the conn object connection with bus + * @li the obj Eldbus_Object object of the given bus and path. + * + * @procedure + * @step 1 Call eldbus_connection_get function to get connection object. + * @step 2 Check returned connection object on NULL. + * @step 3 Call eldbus_object_get to get an object of the given bus and path. + * @step 4 Check returned object on NULL. + * @step 5 Call eldbus_object_introspect functiont to call the method "Introspect" on the eldbus object. + * @step 6 Check returned pending object on NULL. + * @step 7 Set timer for preschedule termination of main loop if tested callback wasn't executed. + * @step 8 Start of main loop and wait for tested response in callback executing. + * @step 9 Check static variable named is_success. + * If is equal EINA_TRUE, that callback was executed and method send valid message response. + * @step 10 Call eldbus_object_unref function to delete connection dbus object. + * @step 11 Call eldbus_connection_unref function to delete connection object. + * + * @passcondition Variables named is_success must equals EINA_TRUE, and there is no segmentation fault. + * @} + * @} + */ + +START_TEST(utc_eldbus_introspect_p) +{ + is_success = EINA_FALSE; + + Eldbus_Connection *conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM); + ck_assert_ptr_ne(NULL, conn); + + Eldbus_Object *obj = eldbus_object_get(conn, bus, path); + ck_assert_ptr_ne(NULL, obj); + + Eldbus_Pending *pending = eldbus_object_introspect(obj, _object_message_cb, &cb_data); + ck_assert_ptr_ne(NULL, pending); + + timeout = ecore_timer_add(1.0, _ecore_loop_close, NULL); + ck_assert_ptr_ne(NULL, timeout); + + ecore_main_loop_begin(); + + ck_assert_msg(is_success, "Method Introspect is not call"); + + eldbus_object_unref(obj); + eldbus_connection_unref(conn); +} +END_TEST + +/** + * @addtogroup eldbus_object + * @{ + * @defgroup eldbus_object_peer + * @li eldbus_object_peer_ping() + * @li eldbus_object_peer_machine_id_get() + * @li eldbus_object_get() + * @{ + * @objective Positive test case checks if function call the method "Ping", + * "GetMachineId" and get expected response without error. Without segmentation fault. + * + * @n Input Data: + * @li the conn_server object connection to server + * @li the conn_client object connection to client + * @li the iface object register an interface + * + * @procedure + * @step 1 Call eldbus_connection_get function to get server connection object. + * @step 2 Check returned connection object on NULL. + * @step 3 Call eldbus_service_interface_register function to register an interface. + * in the given path and connection. + * @step 4 Check returned interface object on NULL. + * @step 5 Call eldbus_name_request function to send a "RequestName" method call in proxy. + * @step 6 Check returned pending object on NULL. + * @step 7 Call eldbus_connection_get function to get client connection object. + * @step 8 Check returned connection object on NULL. + * @step 9 Call eldbus_object_get function to get an client object + * of the given bus and path. + * @step 10 Check returned object on NULL. + * @step 11 Call eldbus_object_peer_machine_id_get function to call the + * method "GetMachineId" on the dbus object. + * @step 12 Check returned pending object on NULL. + * @step 13 Call eldbus_object_peer_ping function to call the + * method "Ping" on the dbus object. + * @step 14 Check returned pending object on NULL. + * @step 15 Set timer for preschedule termination of main loop if tested callback wasn't executed. + * @step 16 Start of main loop and wait for tested response in callback executing. + * @step 17 Check static variables named is_success, is_register_service, is_peer_ping. + * If are equals 1, that callbacks were executed and methods send valid message response. + * In other cases error. + * @step 18 Call eldbus_object_unref function to delete connection dbus object. + * @step 19 Call eldbus_connection_unref function to delete client connection object. + * @step 20 Call eldbus_service_interface_unregister function to unregister a interface. + * @step 21 Call eldbus_connection_unref function to delete server connection object + * + * @passcondition Variables named is_success_cb, is_register_service, is_peer_ping must equals 1, and there is no segmentation fault. + * @} + * @} + */ +START_TEST(utc_eldbus_object_peer_p) +{ + const char *dbus_path = "/org/freedesktop/Test"; + const char *bus_session = "org.freedesktop.Test"; + + is_success = EINA_FALSE; + is_register_service = EINA_FALSE; + is_peer_ping = EINA_FALSE; + + Eldbus_Connection *conn_server = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); + ck_assert_ptr_ne(NULL, conn_server); + + Eldbus_Service_Interface *iface = eldbus_service_interface_register(conn_server, dbus_path, &iface_desc); + ck_assert_ptr_ne(NULL, iface); + + Eldbus_Pending *pending_name = eldbus_name_request(conn_server, bus_session, ELDBUS_NAME_REQUEST_FLAG_DO_NOT_QUEUE, + _name_request, iface); + ck_assert_ptr_ne(NULL, pending_name); + + Eldbus_Connection *conn_client = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); + ck_assert_ptr_ne(NULL, conn_client); + + Eldbus_Object *obj = eldbus_object_get(conn_client, bus_session, dbus_path); + ck_assert_ptr_ne(NULL, obj); + + Eldbus_Pending *pending1 = eldbus_object_peer_machine_id_get(obj, _machine_id_get, &cb_data); + ck_assert_ptr_ne(NULL, pending1); + + Eldbus_Pending *pending2 = eldbus_object_peer_ping(obj, _peer_ping_cb, &cb_data); + ck_assert_ptr_ne(NULL, pending2); + + timeout = ecore_timer_add(2.5, _ecore_loop_close, NULL); + ck_assert_ptr_ne(NULL, timeout); + + ecore_main_loop_begin(); + + ck_assert_msg(is_register_service, "Can not register interface"); + ck_assert_msg(is_peer_ping, "Method Ping is not call"); + ck_assert_msg(is_success, "Method GetMachineId is not call"); + + eldbus_object_unref(obj); + eldbus_connection_unref(conn_client); + eldbus_service_interface_unregister(iface); + eldbus_connection_unref(conn_server); +} +END_TEST + +/** + *@} + */ +void +eldbus_test_eldbus_object(TCase *tc) +{ + tcase_add_checked_fixture(tc, _setup, _teardown); + tcase_add_test(tc, utc_eldbus_object_send_info_get_p); + tcase_add_test(tc, utc_eldbus_introspect_p); + tcase_add_test(tc, utc_eldbus_object_peer_p); +} --