[glib] gdbus-codegen: Don't leak stuff in tests
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] gdbus-codegen: Don't leak stuff in tests
- Date: Tue, 17 Apr 2012 22:00:10 +0000 (UTC)
commit 7f5f47ae15268a1dd96fabd360eb25e712724ac4
Author: David Zeuthen <davidz redhat com>
Date: Tue Apr 17 17:51:01 2012 -0400
gdbus-codegen: Don't leak stuff in tests
Signed-off-by: David Zeuthen <davidz redhat com>
gio/tests/gdbus-test-codegen.c | 108 +++++++++++++++++++++++++---------------
1 files changed, 67 insertions(+), 41 deletions(-)
---
diff --git a/gio/tests/gdbus-test-codegen.c b/gio/tests/gdbus-test-codegen.c
index 054cf6a..363aa85 100644
--- a/gio/tests/gdbus-test-codegen.c
+++ b/gio/tests/gdbus-test-codegen.c
@@ -420,6 +420,16 @@ static FooiGenMethodThreads *exported_thread_object_1 = NULL;
static FooiGenMethodThreads *exported_thread_object_2 = NULL;
static void
+unexport_objects (void)
+{
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bar_object));
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_bat_object));
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_authorize_object));
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_1));
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (exported_thread_object_2));
+}
+
+static void
on_bus_acquired (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
@@ -1740,18 +1750,18 @@ om_check_property_and_signal_emission (GMainLoop *loop,
static void
check_object_manager (void)
{
- FooiGenObjectSkeleton *o;
- FooiGenObjectSkeleton *o2;
- FooiGenObjectSkeleton *o3;
+ FooiGenObjectSkeleton *o = NULL;
+ FooiGenObjectSkeleton *o2 = NULL;
+ FooiGenObjectSkeleton *o3 = NULL;
GDBusInterfaceSkeleton *i;
GDBusConnection *c;
- GDBusObjectManagerServer *manager;
+ GDBusObjectManagerServer *manager = NULL;
GDBusNodeInfo *info;
GError *error;
GMainLoop *loop;
- OMData *om_data;
- guint om_signal_id;
- GDBusObjectManager *pm;
+ OMData *om_data = NULL;
+ guint om_signal_id = -1;
+ GDBusObjectManager *pm = NULL;
GList *object_proxies;
GList *proxies;
GDBusObject *op;
@@ -1814,7 +1824,7 @@ check_object_manager (void)
g_assert_cmpstr (path, ==, "/managed");
g_assert (c2 == c);
g_free (path);
- g_object_unref (c2);
+ g_clear_object (&c2);
/* Check that the manager object is visible */
info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
@@ -1839,7 +1849,7 @@ check_object_manager (void)
g_main_loop_run (loop);
error = NULL;
pm = foo_igen_object_manager_client_new_finish (om_res, &error);
- g_object_unref (om_res);
+ g_clear_object (&om_res);
g_assert_no_error (error);
g_assert (pm != NULL);
g_signal_connect (pm,
@@ -1865,7 +1875,7 @@ check_object_manager (void)
g_assert_cmpint (flags, ==, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE);
g_assert (c2 == c);
g_free (path);
- g_object_unref (c2);
+ g_clear_object (&c2);
g_free (name);
g_free (name_owner);
@@ -1894,13 +1904,15 @@ check_object_manager (void)
o2 = FOO_IGEN_OBJECT_SKELETON (g_dbus_interface_dup_object (G_DBUS_INTERFACE (i)));
g_assert (G_DBUS_OBJECT (o2) == G_DBUS_OBJECT (o));
g_assert_cmpint (G_OBJECT (o2)->ref_count, ==, 2);
- g_object_unref (o2);
+ g_clear_object (&o2);
g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o));
/* ... check we get the InterfacesAdded signal */
om_data->state = 1;
+
g_main_loop_run (om_data->loop);
+
g_assert_cmpint (om_data->state, ==, 2);
g_assert_cmpint (om_data->num_object_proxy_added_signals, ==, 1);
g_assert_cmpint (om_data->num_object_proxy_removed_signals, ==, 0);
@@ -1915,12 +1927,12 @@ check_object_manager (void)
/* Also check g_dbus_object_manager_get_interface */
iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bar");
g_assert (iface != NULL);
- g_object_unref (iface);
+ g_clear_object (&iface);
iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (manager), "/managed/first", "org.project.Bat");
g_assert (iface == NULL);
iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bar");
g_assert (iface != NULL);
- g_object_unref (iface);
+ g_clear_object (&iface);
iface = g_dbus_object_manager_get_interface (G_DBUS_OBJECT_MANAGER (pm), "/managed/first", "org.project.Bat");
g_assert (iface == NULL);
@@ -1940,7 +1952,7 @@ check_object_manager (void)
g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
g_assert (has_interface (info, "org.project.Bar"));
g_dbus_node_info_unref (info);
- g_object_unref (i);
+ g_clear_object (&i);
/* check adding an interface of same type (but not same object) replaces the existing one */
i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
@@ -1958,12 +1970,12 @@ check_object_manager (void)
g_assert_cmpint (count_interfaces (info), ==, 4); /* Bar + Properties,Introspectable,Peer */
g_assert (has_interface (info, "org.project.Bar"));
g_dbus_node_info_unref (info);
- g_object_unref (i);
+ g_clear_object (&i);
/* check adding an interface of another type doesn't replace the existing one */
i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
foo_igen_object_skeleton_set_bat (o, FOO_IGEN_BAT (i));
- g_object_unref (i);
+ g_clear_object (&i);
/* ... check we get the InterfacesAdded */
om_data->state = 11;
g_main_loop_run (om_data->loop);
@@ -2024,7 +2036,7 @@ check_object_manager (void)
/* and add an interface again */
i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
foo_igen_object_skeleton_set_com_acme_coyote (o, FOO_IGEN_COM_ACME_COYOTE (i));
- g_object_unref (i);
+ g_clear_object (&i);
/* ... check we get the InterfacesAdded */
om_data->state = 17;
g_main_loop_run (om_data->loop);
@@ -2050,10 +2062,10 @@ check_object_manager (void)
i = G_DBUS_INTERFACE_SKELETON (foo_igen_bar_skeleton_new ());
bar_skeleton = FOO_IGEN_BAR (i); /* save for later test */
foo_igen_object_skeleton_set_bar (o2, FOO_IGEN_BAR (i));
- g_object_unref (i);
+ g_clear_object (&i);
i = G_DBUS_INTERFACE_SKELETON (foo_igen_bat_skeleton_new ());
foo_igen_object_skeleton_set_bat (o2, FOO_IGEN_BAT (i));
- g_object_unref (i);
+ g_clear_object (&i);
/* ... add it */
g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (o2));
/* ... check we get the InterfacesAdded with _two_ interfaces */
@@ -2080,6 +2092,7 @@ check_object_manager (void)
info = introspect (c, g_dbus_connection_get_unique_name (c), "/managed", loop);
g_assert_cmpint (count_interfaces (info), ==, 0); /* nothing */
g_dbus_node_info_unref (info);
+
g_dbus_object_manager_server_set_connection (manager, c);
om_check_get_all (c, loop,
"({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}, '/managed/second': {'org.project.Bar': {'y': <byte 0x00>, 'b': <false>, 'n': <int16 0>, 'q': <uint16 0>, 'i': <0>, 'u': <uint32 0>, 'x': <int64 0>, 't': <uint64 0>, 'd': <0.0>, 's': <''>, 'o': <objectpath '/'>, 'g': <signature ''>, 'ay': <b''>, 'as': <@as []>, 'aay': <@aay []>, 'ao': <@ao []>, 'ag': <@ag []>, 'FinallyNormalName': <''>, 'ReadonlyProperty': <''>, 'unset_i': <0>, 'unset_d': <0.0>, 'unset_s': <''>, 'unset_o': <objectpath '/'>, 'unset_g': <signature ''>, 'unset_ay': <b''>, 'unset_as': <@as []>, 'unset_ao': <@ao []>, 'unset_ag': <@ag []>, 'unset_struct': <(0, 0.0, '', objectpath '/', signature '', @ay [], @as [], @ao [], @ag [])>}, 'org.project.Bat': {'force_i': <0>, 'force_s': <''>, 'force_ay': <@ay []>, 'force_struct': <(0,)>}}},)");
@@ -2102,10 +2115,11 @@ check_object_manager (void)
g_assert (p != NULL);
g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_COM_ACME_COYOTE_PROXY);
g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_COM_ACME_COYOTE));
- g_object_unref (p);
+ g_clear_object (&p);
p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
g_assert (p == NULL);
- g_object_unref (op);
+ g_clear_object (&op);
+
/* -- */
op = g_dbus_object_manager_get_object (pm, "/managed/second");
g_assert (op != NULL);
@@ -2118,7 +2132,7 @@ check_object_manager (void)
g_assert (p != NULL);
g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAT_PROXY);
g_assert (g_type_is_a (G_TYPE_FROM_INSTANCE (p), FOO_IGEN_TYPE_BAT));
- g_object_unref (p);
+ g_clear_object (&p);
p = G_DBUS_PROXY (foo_igen_object_get_bar (FOO_IGEN_OBJECT (op)));
g_assert (p != NULL);
g_assert_cmpint (G_TYPE_FROM_INSTANCE (p), ==, FOO_IGEN_TYPE_BAR_PROXY);
@@ -2127,10 +2141,10 @@ check_object_manager (void)
* and property changes...
*/
om_check_property_and_signal_emission (loop, bar_skeleton, FOO_IGEN_BAR (p));
- g_object_unref (p);
+ g_clear_object (&p);
p = (GDBusProxy *) g_dbus_object_get_interface (op, "org.project.NonExisting");
g_assert (p == NULL);
- g_object_unref (op);
+ g_clear_object (&op);
/* -------------------------------------------------- */
@@ -2153,7 +2167,6 @@ check_object_manager (void)
/* Check GetManagedObjects() again */
om_check_get_all (c, loop,
"({objectpath '/managed/first': {'com.acme.Coyote': {'Mood': <''>}}},)");
-
/* -------------------------------------------------- */
/* Check that export_uniquely() works */
@@ -2162,7 +2175,7 @@ check_object_manager (void)
i = G_DBUS_INTERFACE_SKELETON (foo_igen_com_acme_coyote_skeleton_new ());
foo_igen_com_acme_coyote_set_mood (FOO_IGEN_COM_ACME_COYOTE (i), "indifferent");
foo_igen_object_skeleton_set_com_acme_coyote (o3, FOO_IGEN_COM_ACME_COYOTE (i));
- g_object_unref (i);
+ g_clear_object (&i);
g_dbus_object_manager_server_export_uniquely (manager, G_DBUS_OBJECT_SKELETON (o3));
/* ... check we get the InterfacesAdded signal */
om_data->state = 200;
@@ -2174,21 +2187,32 @@ check_object_manager (void)
//g_main_loop_run (loop); /* TODO: tmp */
- g_main_loop_unref (loop);
-
- g_dbus_connection_signal_unsubscribe (c, om_signal_id);
- g_object_unref (o3);
- g_object_unref (o2);
- g_object_unref (o);
- g_object_unref (manager);
- g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
- G_CALLBACK (on_object_proxy_added),
- om_data), ==, 1);
- g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
- G_CALLBACK (on_object_proxy_removed),
- om_data), ==, 1);
- g_object_unref (pm);
- g_object_unref (c);
+ /* Clean up objects */
+ g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first_1"));
+ //g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/second"));
+ g_assert (g_dbus_object_manager_server_unexport (manager, "/managed/first"));
+ g_assert_cmpint (g_list_length (g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (manager))), ==, 0);
+
+ if (loop != NULL)
+ g_main_loop_unref (loop);
+
+ if (om_signal_id != -1)
+ g_dbus_connection_signal_unsubscribe (c, om_signal_id);
+ g_clear_object (&o3);
+ g_clear_object (&o2);
+ g_clear_object (&o);
+ g_clear_object (&manager);
+ if (pm != NULL)
+ {
+ g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
+ G_CALLBACK (on_object_proxy_added),
+ om_data), ==, 1);
+ g_assert_cmpint (g_signal_handlers_disconnect_by_func (pm,
+ G_CALLBACK (on_object_proxy_removed),
+ om_data), ==, 1);
+ g_clear_object (&pm);
+ }
+ g_clear_object (&c);
g_free (om_data);
}
@@ -2219,6 +2243,8 @@ test_object_manager (void)
/* uncomment to keep the service around (to e.g. introspect it) */
/* g_main_loop_run (loop); */
+ unexport_objects ();
+
g_bus_unown_name (id);
g_main_loop_unref (loop);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]