From fa3093e16721b1617b6e5fcb2cd36c5eff13e2eb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 20 Dec 2015 21:59:13 +0100 Subject: [PATCH] libnm/tests: move common testing code to nm-test-libnm-utils The unit tests for libnm and libnm-glib use a NetworkManager stub service written in Python (test-networkmanager-service.py). As they share the same server, it makes sense to also share the same utility code to drive the stub. Move the common code to include/. Note that contrary to "nm-test-utils.h", "nm-test-libnm-utils.h" is not a header-only file. Instead its implementation is in "nm-test-utils-impl.c". The reason for that this split is, if we later have yet another non-header-only test-utility, then all the implementations are in "nm-test-utils-impl.c", requiring the tests to link only one object file. --- .../common.h => include/nm-test-libnm-utils.h | 2 + .../common.c => include/nm-test-utils-impl.c | 4 +- libnm-glib/tests/Makefile.am | 8 +- libnm-glib/tests/test-nm-client.c | 2 +- .../tests/test-remote-settings-client.c | 2 +- libnm/tests/Makefile.am | 12 +- libnm/tests/common.c | 238 ------------------ libnm/tests/common.h | 49 ---- libnm/tests/test-nm-client.c | 2 +- libnm/tests/test-remote-settings-client.c | 2 +- libnm/tests/test-secret-agent.c | 2 +- 11 files changed, 19 insertions(+), 304 deletions(-) rename libnm-glib/tests/common.h => include/nm-test-libnm-utils.h (98%) rename libnm-glib/tests/common.c => include/nm-test-utils-impl.c (99%) delete mode 100644 libnm/tests/common.c delete mode 100644 libnm/tests/common.h diff --git a/libnm-glib/tests/common.h b/include/nm-test-libnm-utils.h similarity index 98% rename from libnm-glib/tests/common.h rename to include/nm-test-libnm-utils.h index 7ac61bb392..b3dfd45a56 100644 --- a/libnm-glib/tests/common.h +++ b/include/nm-test-libnm-utils.h @@ -22,6 +22,8 @@ #include "nm-default.h" +#include "nm-test-utils.h" + typedef struct { GDBusConnection *bus; GDBusProxy *proxy; diff --git a/libnm-glib/tests/common.c b/include/nm-test-utils-impl.c similarity index 99% rename from libnm-glib/tests/common.c rename to include/nm-test-utils-impl.c index 9b71afb391..6c4ed83916 100644 --- a/libnm-glib/tests/common.c +++ b/include/nm-test-utils-impl.c @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright 2010 - 2014 Red Hat, Inc. + * Copyright 2010 - 2015 Red Hat, Inc. * */ @@ -26,7 +26,7 @@ #include "NetworkManager.h" #include "nm-dbus-compat.h" -#include "common.h" +#include "nm-test-libnm-utils.h" static gboolean name_exists (GDBusConnection *c, const char *name) diff --git a/libnm-glib/tests/Makefile.am b/libnm-glib/tests/Makefile.am index 931e243c0e..9afbf6f566 100644 --- a/libnm-glib/tests/Makefile.am +++ b/libnm-glib/tests/Makefile.am @@ -24,8 +24,8 @@ TESTS = test-nm-client test-remote-settings-client ####### NMClient and non-settings tests ####### test_nm_client_SOURCES = \ - common.c \ - common.h \ + $(top_builddir)/include/nm-test-utils-impl.c \ + $(top_builddir)/include/nm-test-libnm-utils.h \ test-nm-client.c test_nm_client_LDADD = \ @@ -37,8 +37,8 @@ test_nm_client_LDADD = \ ####### remote settings client test ####### test_remote_settings_client_SOURCES = \ - common.c \ - common.h \ + $(top_builddir)/include/nm-test-utils-impl.c \ + $(top_builddir)/include/nm-test-libnm-utils.h \ test-remote-settings-client.c test_remote_settings_client_LDADD = \ diff --git a/libnm-glib/tests/test-nm-client.c b/libnm-glib/tests/test-nm-client.c index 2c721f94df..417eca79f9 100644 --- a/libnm-glib/tests/test-nm-client.c +++ b/libnm-glib/tests/test-nm-client.c @@ -36,7 +36,7 @@ #include "nm-test-utils.h" -#include "common.h" +#include "nm-test-libnm-utils.h" static GMainLoop *loop = NULL; static NMTestServiceInfo *sinfo; diff --git a/libnm-glib/tests/test-remote-settings-client.c b/libnm-glib/tests/test-remote-settings-client.c index 831c1beef5..99d326f43b 100644 --- a/libnm-glib/tests/test-remote-settings-client.c +++ b/libnm-glib/tests/test-remote-settings-client.c @@ -35,7 +35,7 @@ #include "nm-default.h" #include "nm-remote-settings.h" -#include "common.h" +#include "nm-test-libnm-utils.h" #include "nm-test-utils.h" diff --git a/libnm/tests/Makefile.am b/libnm/tests/Makefile.am index 0c3bfda0cf..99a4b8a66e 100644 --- a/libnm/tests/Makefile.am +++ b/libnm/tests/Makefile.am @@ -26,18 +26,18 @@ endif TESTS = test-nm-client test-remote-settings-client test-secret-agent test_nm_client_SOURCES = \ - common.c \ - common.h \ + $(top_builddir)/include/nm-test-utils-impl.c \ + $(top_builddir)/include/nm-test-libnm-utils.h \ test-nm-client.c test_remote_settings_client_SOURCES = \ - common.c \ - common.h \ + $(top_builddir)/include/nm-test-utils-impl.c \ + $(top_builddir)/include/nm-test-libnm-utils.h \ test-remote-settings-client.c test_secret_agent_SOURCES = \ - common.c \ - common.h \ + $(top_builddir)/include/nm-test-utils-impl.c \ + $(top_builddir)/include/nm-test-libnm-utils.h \ test-secret-agent.c endif diff --git a/libnm/tests/common.c b/libnm/tests/common.c deleted file mode 100644 index 9b71afb391..0000000000 --- a/libnm/tests/common.c +++ /dev/null @@ -1,238 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Copyright 2010 - 2014 Red Hat, Inc. - * - */ - -#include "config.h" - -#include - -#include "nm-default.h" -#include "NetworkManager.h" -#include "nm-dbus-compat.h" - -#include "common.h" - -static gboolean -name_exists (GDBusConnection *c, const char *name) -{ - GVariant *reply; - gboolean exists = FALSE; - - reply = g_dbus_connection_call_sync (c, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS, - "GetNameOwner", - g_variant_new ("(s)", name), - NULL, - G_DBUS_CALL_FLAGS_NO_AUTO_START, - -1, - NULL, - NULL); - if (reply != NULL) { - exists = TRUE; - g_variant_unref (reply); - } - - return exists; -} - -NMTestServiceInfo * -nm_test_service_init (void) -{ - NMTestServiceInfo *info; - const char *args[2] = { TEST_NM_SERVICE, NULL }; - GError *error = NULL; - int i; - - info = g_malloc0 (sizeof (*info)); - - info->bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - g_assert_no_error (error); - - /* Spawn the test service. info->keepalive_fd will be a pipe to the service's - * stdin; if it closes, the service will exit immediately. We use this to - * make sure the service exits if the test program crashes. - */ - g_spawn_async_with_pipes (NULL, (char **) args, NULL, 0, NULL, NULL, - &info->pid, &info->keepalive_fd, NULL, NULL, &error); - g_assert_no_error (error); - - /* Wait until the service is registered on the bus */ - for (i = 1000; i > 0; i--) { - if (name_exists (info->bus, "org.freedesktop.NetworkManager")) - break; - g_usleep (G_USEC_PER_SEC / 50); - } - g_assert (i > 0); - - /* Grab a proxy to our fake NM service to trigger tests */ - info->proxy = g_dbus_proxy_new_sync (info->bus, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | - G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS | - G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, - NULL, - NM_DBUS_SERVICE, - NM_DBUS_PATH, - "org.freedesktop.NetworkManager.LibnmGlibTest", - NULL, &error); - g_assert_no_error (error); - - return info; -} - -void -nm_test_service_cleanup (NMTestServiceInfo *info) -{ - int i; - - g_object_unref (info->proxy); - kill (info->pid, SIGTERM); - - /* Wait until the bus notices the service is gone */ - for (i = 100; i > 0; i--) { - if (!name_exists (info->bus, "org.freedesktop.NetworkManager")) - break; - g_usleep (G_USEC_PER_SEC / 50); - } - g_assert (i > 0); - - g_object_unref (info->bus); - close (info->keepalive_fd); - - memset (info, 0, sizeof (*info)); - g_free (info); -} - -#if ((NETWORKMANAGER_COMPILATION) == NM_NETWORKMANAGER_COMPILATION_LIB) - -typedef struct { - GMainLoop *loop; - const char *ifname; - char *path; - NMDevice *device; -} AddDeviceInfo; - -static void -device_added_cb (NMClient *client, - NMDevice *device, - gpointer user_data) -{ - AddDeviceInfo *info = user_data; - - g_assert (device); - g_assert_cmpstr (nm_object_get_path (NM_OBJECT (device)), ==, info->path); - g_assert_cmpstr (nm_device_get_iface (device), ==, info->ifname); - - info->device = device; - g_main_loop_quit (info->loop); -} - -static gboolean -timeout (gpointer user_data) -{ - g_assert_not_reached (); - return G_SOURCE_REMOVE; -} - -static GVariant * -call_add_wired_device (GDBusProxy *proxy, const char *ifname, const char *hwaddr, - const char **subchannels, GError **error) -{ - const char *empty[] = { NULL }; - - if (!hwaddr) - hwaddr = "/"; - if (!subchannels) - subchannels = empty; - - return g_dbus_proxy_call_sync (proxy, - "AddWiredDevice", - g_variant_new ("(ss^as)", ifname, hwaddr, subchannels), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - error); -} - -static GVariant * -call_add_device (GDBusProxy *proxy, const char *method, const char *ifname, GError **error) -{ - return g_dbus_proxy_call_sync (proxy, - method, - g_variant_new ("(s)", ifname), - G_DBUS_CALL_FLAGS_NO_AUTO_START, - 3000, - NULL, - error); -} - -static NMDevice * -add_device_common (NMTestServiceInfo *sinfo, NMClient *client, - const char *method, const char *ifname, - const char *hwaddr, const char **subchannels) -{ - AddDeviceInfo info; - GError *error = NULL; - GVariant *ret; - guint timeout_id; - - if (g_strcmp0 (method, "AddWiredDevice") == 0) - ret = call_add_wired_device (sinfo->proxy, ifname, hwaddr, subchannels, &error); - else - ret = call_add_device (sinfo->proxy, method, ifname, &error); - - g_assert_no_error (error); - g_assert (ret); - g_assert_cmpstr (g_variant_get_type_string (ret), ==, "(o)"); - g_variant_get (ret, "(o)", &info.path); - g_variant_unref (ret); - - /* Wait for libnm to find the device */ - info.ifname = ifname; - info.loop = g_main_loop_new (NULL, FALSE); - g_signal_connect (client, "device-added", - G_CALLBACK (device_added_cb), &info); - timeout_id = g_timeout_add_seconds (5, timeout, NULL); - g_main_loop_run (info.loop); - - g_source_remove (timeout_id); - g_signal_handlers_disconnect_by_func (client, device_added_cb, &info); - g_free (info.path); - g_main_loop_unref (info.loop); - - return info.device; -} - -NMDevice * -nm_test_service_add_device (NMTestServiceInfo *sinfo, NMClient *client, - const char *method, const char *ifname) -{ - return add_device_common (sinfo, client, method, ifname, NULL, NULL); -} - -NMDevice * -nm_test_service_add_wired_device (NMTestServiceInfo *sinfo, NMClient *client, - const char *ifname, const char *hwaddr, - const char **subchannels) -{ - return add_device_common (sinfo, client, "AddWiredDevice", ifname, hwaddr, subchannels); -} - -#endif /* NM_NETWORKMANAGER_COMPILATION_LIB */ diff --git a/libnm/tests/common.h b/libnm/tests/common.h deleted file mode 100644 index 7ac61bb392..0000000000 --- a/libnm/tests/common.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - * Copyright 2014 Red Hat, Inc. - */ - -#include - -#include "nm-default.h" - -typedef struct { - GDBusConnection *bus; - GDBusProxy *proxy; - GPid pid; - int keepalive_fd; -} NMTestServiceInfo; - -NMTestServiceInfo *nm_test_service_init (void); -void nm_test_service_cleanup (NMTestServiceInfo *info); - -#if ((NETWORKMANAGER_COMPILATION) == NM_NETWORKMANAGER_COMPILATION_LIB) - -NMDevice *nm_test_service_add_device (NMTestServiceInfo *info, - NMClient *client, - const char *method, - const char *ifname); - -NMDevice * nm_test_service_add_wired_device (NMTestServiceInfo *sinfo, - NMClient *client, - const char *ifname, - const char *hwaddr, - const char **subchannels); - -#endif /* NM_NETWORKMANAGER_COMPILATION_LIB */ - diff --git a/libnm/tests/test-nm-client.c b/libnm/tests/test-nm-client.c index 9da5647147..f87add8842 100644 --- a/libnm/tests/test-nm-client.c +++ b/libnm/tests/test-nm-client.c @@ -27,7 +27,7 @@ #include #include "nm-default.h" -#include "common.h" +#include "nm-test-libnm-utils.h" #include "nm-test-utils.h" diff --git a/libnm/tests/test-remote-settings-client.c b/libnm/tests/test-remote-settings-client.c index 66fbf2bfbc..613287bca5 100644 --- a/libnm/tests/test-remote-settings-client.c +++ b/libnm/tests/test-remote-settings-client.c @@ -27,7 +27,7 @@ #include #include "nm-default.h" -#include "common.h" +#include "nm-test-libnm-utils.h" #include "nm-test-utils.h" diff --git a/libnm/tests/test-secret-agent.c b/libnm/tests/test-secret-agent.c index ed2e2dcb50..30650cace0 100644 --- a/libnm/tests/test-secret-agent.c +++ b/libnm/tests/test-secret-agent.c @@ -28,7 +28,7 @@ #include #include "nm-default.h" -#include "common.h" +#include "nm-test-libnm-utils.h" #include "nm-test-utils.h"