From 55dcb118b87166fae10dae923ccd2708c9d0267b Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 2 Jan 2013 15:35:37 -0800 Subject: [PATCH] unit: Use separate context for each D-Bus test case --- unit/test-gdbus-client.c | 113 +++++++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 34 deletions(-) diff --git a/unit/test-gdbus-client.c b/unit/test-gdbus-client.c index c395c4fa8..7c849f016 100644 --- a/unit/test-gdbus-client.c +++ b/unit/test-gdbus-client.c @@ -31,10 +31,12 @@ #define SERVICE_NAME "org.bluez.unit.test-gdbus-client" #define SERVICE_PATH "/org/bluez/unit/test_gdbus_client" -static GMainLoop *main_loop; -static DBusConnection *dbus_conn; -static GDBusClient *dbus_client; -static guint timeout_source; +struct context { + GMainLoop *main_loop; + DBusConnection *dbus_conn; + GDBusClient *dbus_client; + guint timeout_source; +}; static const GDBusMethodTable methods[] = { { } @@ -48,82 +50,125 @@ static const GDBusPropertyTable properties[] = { { } }; -static gboolean timeout_handler(gpointer data) +static struct context *create_context(void) +{ + struct context *context = g_new0(struct context, 1); + + context->main_loop = g_main_loop_new(NULL, FALSE); + if (context->main_loop == NULL) { + g_free(context); + return NULL; + } + + context->dbus_conn = g_dbus_setup_private(DBUS_BUS_SESSION, + SERVICE_NAME, NULL); + if (context->dbus_conn == NULL) { + g_main_loop_unref(context->main_loop); + g_free(context); + return NULL; + } + + return context; +} + +static void destroy_context(struct context *context) +{ + if (context == NULL) + return; + + dbus_connection_flush(context->dbus_conn); + dbus_connection_close(context->dbus_conn); + + g_main_loop_unref(context->main_loop); + + g_free(context); +} + +static gboolean timeout_handler(gpointer user_data) { + struct context *context = user_data; + if (g_test_verbose()) g_print("timeout triggered\n"); - timeout_source = 0; + context->timeout_source = 0; - g_dbus_client_unref(dbus_client); + g_dbus_client_unref(context->dbus_client); return FALSE; } static void connect_handler(DBusConnection *connection, void *user_data) { + struct context *context = user_data; + if (g_test_verbose()) g_print("service connected\n"); - g_dbus_client_unref(dbus_client); + g_dbus_client_unref(context->dbus_client); } static void disconnect_handler(DBusConnection *connection, void *user_data) { + struct context *context = user_data; + if (g_test_verbose()) g_print("service disconnected\n"); - g_main_loop_quit(main_loop); + g_main_loop_quit(context->main_loop); } static void simple_client(void) { - main_loop = g_main_loop_new(NULL, FALSE); - dbus_conn = g_dbus_setup_private(DBUS_BUS_SESSION, SERVICE_NAME, NULL); + struct context *context = create_context(); - if (dbus_conn == NULL) + if (context == NULL) return; - dbus_client = g_dbus_client_new(dbus_conn, SERVICE_NAME, SERVICE_PATH); + context->dbus_client = g_dbus_client_new(context->dbus_conn, + SERVICE_NAME, SERVICE_PATH); - g_dbus_client_set_connect_watch(dbus_client, connect_handler, NULL); - g_dbus_client_set_disconnect_watch(dbus_client, - disconnect_handler, NULL); + g_dbus_client_set_connect_watch(context->dbus_client, + connect_handler, context); + g_dbus_client_set_disconnect_watch(context->dbus_client, + disconnect_handler, context); - g_main_loop_run(main_loop); + g_main_loop_run(context->main_loop); - dbus_connection_close(dbus_conn); - g_main_loop_unref(main_loop); + destroy_context(context); } static void client_connect_disconnect(void) { - main_loop = g_main_loop_new(NULL, FALSE); - dbus_conn = g_dbus_setup_private(DBUS_BUS_SESSION, SERVICE_NAME, NULL); + struct context *context = create_context(); - if (dbus_conn == NULL) + if (context == NULL) return; - g_dbus_register_interface(dbus_conn, SERVICE_PATH, SERVICE_NAME, + g_dbus_register_interface(context->dbus_conn, + SERVICE_PATH, SERVICE_NAME, methods, signals, properties, NULL, NULL); - dbus_client = g_dbus_client_new(dbus_conn, SERVICE_NAME, SERVICE_PATH); + context->dbus_client = g_dbus_client_new(context->dbus_conn, + SERVICE_NAME, SERVICE_PATH); - g_dbus_client_set_connect_watch(dbus_client, connect_handler, NULL); - g_dbus_client_set_disconnect_watch(dbus_client, - disconnect_handler, NULL); + g_dbus_client_set_connect_watch(context->dbus_client, + connect_handler, context); + g_dbus_client_set_disconnect_watch(context->dbus_client, + disconnect_handler, context); - timeout_source = g_timeout_add_seconds(10, timeout_handler, NULL); + context->timeout_source = g_timeout_add_seconds(10, timeout_handler, + context); - g_main_loop_run(main_loop); + g_main_loop_run(context->main_loop); - if (timeout_source > 0) - g_source_remove(timeout_source); + if (context->timeout_source > 0) + g_source_remove(context->timeout_source); - g_dbus_unregister_interface(dbus_conn, SERVICE_PATH, SERVICE_NAME); + g_dbus_unregister_interface(context->dbus_conn, + SERVICE_PATH, SERVICE_NAME); - dbus_connection_close(dbus_conn); - g_main_loop_unref(main_loop); + destroy_context(context); } int main(int argc, char *argv[]) -- 2.47.3