diff --git a/unit/test-gdbus-client.c b/unit/test-gdbus-client.c
index c395c4f..7c849f0 100644
--- a/unit/test-gdbus-client.c
+++ b/unit/test-gdbus-client.c
#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[] = {
{ }
{ }
};
-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[])