Diff between 482fcc359d5f24aa6c1048bc36609f276b09bf8b and 55dcb118b87166fae10dae923ccd2708c9d0267b

Changed Files

File Additions Deletions Status
unit/test-gdbus-client.c +79 -34 modified

Full Patch

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
@@ -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[])