summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2019-11-03 21:41:03 +0100
committerThomas Haller <thaller@redhat.com>2019-11-07 11:34:36 +0100
commitfeea4222eff1be4576b959f168fd800d0cf3e317 (patch)
treea5d9c5b73dfdbccb36e3c21290ddf6c8e149ca33
parentf21b8781ed7ab3da080ab5736c77cfff6a9c7328 (diff)
downloadNetworkManager-feea4222eff1be4576b959f168fd800d0cf3e317.tar.gz
libnm/tests: unsubscribe signal handler during test_activate_virtual()
libnm is gonna change, where it would still emit signals when the instance gets destructed. In particular, when the device gets removed from the NMClient cache, the references to other objects would be cleared (and consequently property changed signals emitted). This will cause a test failure, because the signal was not unsubscribed: test:ERROR:libnm/tests/test-nm-client.c:694:device_ac_changed_cb: assertion failed: (nm_device_get_active_connection (NM_DEVICE (device)) != NULL)
-rw-r--r--libnm/tests/test-nm-client.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/libnm/tests/test-nm-client.c b/libnm/tests/test-nm-client.c
index 987b63ed90..e92e1cd1e3 100644
--- a/libnm/tests/test-nm-client.c
+++ b/libnm/tests/test-nm-client.c
@@ -606,6 +606,9 @@ typedef struct {
NMActiveConnection *ac;
int remaining;
+
+ NMDevice *device;
+ gulong ac_signal_id;
} TestACInfo;
static void
@@ -768,9 +771,12 @@ client_devices_changed_cb (GObject *client,
g_assert_cmpstr (nm_device_get_iface (device), ==, "eth0.1");
if (!nm_device_get_active_connection (device)) {
+ g_assert (info->ac_signal_id == 0);
info->remaining++;
- g_signal_connect (device, "notify::" NM_DEVICE_ACTIVE_CONNECTION,
- G_CALLBACK (device_ac_changed_cb), info);
+ info->device = device;
+ g_object_add_weak_pointer (G_OBJECT (device), (gpointer *) &info->device);
+ info->ac_signal_id = g_signal_connect (device, "notify::" NM_DEVICE_ACTIVE_CONNECTION,
+ G_CALLBACK (device_ac_changed_cb), info);
}
info->remaining--;
@@ -872,8 +878,12 @@ test_activate_virtual (void)
g_signal_handlers_disconnect_by_func (client, client_devices_changed_cb, &info);
g_assert (info.ac != NULL);
+ g_clear_object (&info.ac);
- g_object_unref (info.ac);
+ if (info.device) {
+ g_object_remove_weak_pointer (G_OBJECT (info.device), (gpointer *) &info.device);
+ nm_clear_g_signal_handler (info.device, &info.ac_signal_id);
+ }
}
static void