platform/test: fix fake platform to emit signals synchronously (analog to Linux platform)

When adding a link, the Linux platform implementation raises the
link-changed signal synchronously. Fix the fake platform to behave identically
and also fix all the tests.

This also fixes the Linux platform tests for the most part because now the
test functions (and fake platform) behave like the Linux system
implementation.

https://bugzilla.gnome.org/show_bug.cgi?id=706293

Co-Authored-By: Thomas Haller <thaller@redhat.com>
Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
Pavel Šimerda
2014-04-17 14:57:55 +02:00
committed by Thomas Haller
parent accd10b501
commit f008c9fbea
8 changed files with 21 additions and 51 deletions

View File

@@ -36,8 +36,6 @@ typedef struct {
GArray *ip6_addresses; GArray *ip6_addresses;
GArray *ip4_routes; GArray *ip4_routes;
GArray *ip6_routes; GArray *ip6_routes;
GSList *link_added_ids;
} NMFakePlatformPrivate; } NMFakePlatformPrivate;
typedef struct { typedef struct {
@@ -163,27 +161,6 @@ link_get_all (NMPlatform *platform)
return links; return links;
} }
typedef struct {
NMPlatform *platform;
int ifindex;
guint id;
} LinkAddedInfo;
static gboolean
link_added_emit (gpointer user_data)
{
LinkAddedInfo *info = user_data;
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (info->platform);
NMFakePlatformLink *device;
priv->link_added_ids = g_slist_remove (priv->link_added_ids, GUINT_TO_POINTER (info->id));
device = link_get (info->platform, info->ifindex);
g_assert (device);
g_signal_emit_by_name (info->platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, info->ifindex, &device->link, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
return FALSE;
}
static gboolean static gboolean
_nm_platform_link_get (NMPlatform *platform, int ifindex, NMPlatformLink *link) _nm_platform_link_get (NMPlatform *platform, int ifindex, NMPlatformLink *link)
{ {
@@ -199,23 +176,13 @@ link_add (NMPlatform *platform, const char *name, NMLinkType type, const void *a
{ {
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform); NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMFakePlatformLink device; NMFakePlatformLink device;
LinkAddedInfo *info;
link_init (&device, priv->links->len, type, name); link_init (&device, priv->links->len, type, name);
g_array_append_val (priv->links, device); g_array_append_val (priv->links, device);
if (device.link.ifindex) { if (device.link.ifindex)
/* Platform requires LINK_ADDED signal emission from an idle handler */ g_signal_emit_by_name (platform, NM_PLATFORM_SIGNAL_LINK_CHANGED, device.link.ifindex, &device, NM_PLATFORM_SIGNAL_ADDED, NM_PLATFORM_REASON_INTERNAL);
info = g_new0 (LinkAddedInfo, 1);
info->platform = platform;
info->ifindex = device.link.ifindex;
info->id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
link_added_emit,
info,
g_free);
priv->link_added_ids = g_slist_prepend (priv->link_added_ids, GUINT_TO_POINTER (info->id));
}
return TRUE; return TRUE;
} }
@@ -1260,11 +1227,6 @@ nm_fake_platform_finalize (GObject *object)
{ {
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (object); NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (object);
int i; int i;
GSList *iter;
for (iter = priv->link_added_ids; iter; iter = iter->next)
g_source_remove (GPOINTER_TO_UINT (iter->data));
g_slist_free (priv->link_added_ids);
g_hash_table_unref (priv->options); g_hash_table_unref (priv->options);
for (i = 0; i < priv->links->len; i++) { for (i = 0; i < priv->links->len; i++) {

View File

@@ -1636,7 +1636,7 @@ event_notification (struct nl_msg *msg, gpointer user_data)
return NL_OK; return NL_OK;
nl_cache_remove (cached_object); nl_cache_remove (cached_object);
/* Don't announced removed interfaces that are not recognized by /* Don't announce removed interfaces that are not recognized by
* udev. They were either not yet discovered or they have been * udev. They were either not yet discovered or they have been
* already removed and announced. * already removed and announced.
*/ */

View File

@@ -314,7 +314,7 @@ nm_platform_sysctl_get_int_checked (const char *path, guint base, gint64 min, gi
/** /**
* nm_platform_query_devices: * nm_platform_query_devices:
* *
* Emit #NMPlatform:link-added signals for all currently-known links. * Emit #NMPlatform:link-changed ADDED signals for all currently-known links.
* Should only be called at startup. * Should only be called at startup.
*/ */
void void
@@ -468,8 +468,8 @@ nm_platform_link_get (int ifindex, NMPlatformLink *link)
* @address_len: the length of the @address * @address_len: the length of the @address
* *
* Add a software interface. Sets platform->error to NM_PLATFORM_ERROR_EXISTS * Add a software interface. Sets platform->error to NM_PLATFORM_ERROR_EXISTS
* if interface is already already exists. Any link-added signal will be * if interface is already already exists. Any link-changed ADDED signal will be
* emitted from an idle handler and not within this function. * emitted directly, before this function finishes.
*/ */
static gboolean static gboolean
nm_platform_link_add (const char *name, NMLinkType type, const void *address, size_t address_len) nm_platform_link_add (const char *name, NMLinkType type, const void *address, size_t address_len)

View File

@@ -252,7 +252,7 @@ setup_tests (void)
nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME)); nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
g_assert (!nm_platform_link_exists (DEVICE_NAME)); g_assert (!nm_platform_link_exists (DEVICE_NAME));
g_assert (nm_platform_dummy_add (DEVICE_NAME)); g_assert (nm_platform_dummy_add (DEVICE_NAME));
wait_signal (link_added); accept_signal (link_added);
free_signal (link_added); free_signal (link_added);
g_test_add_func ("/address/internal/ip4", test_ip4_address); g_test_add_func ("/address/internal/ip4", test_ip4_address);

View File

@@ -34,7 +34,7 @@ test_cleanup_internal ()
/* Create and set up device */ /* Create and set up device */
g_assert (nm_platform_dummy_add (DEVICE_NAME)); g_assert (nm_platform_dummy_add (DEVICE_NAME));
wait_signal (link_added); accept_signal (link_added);
free_signal (link_added); free_signal (link_added);
g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME))); g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME)));
ifindex = nm_platform_link_get_ifindex (DEVICE_NAME); ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);

View File

@@ -48,6 +48,9 @@ accept_signal (SignalData *data)
void void
wait_signal (SignalData *data) wait_signal (SignalData *data)
{ {
if (data->received)
g_error ("Signal '%s' received before waiting for it.", data->name);
data->loop = g_main_loop_new (NULL, FALSE); data->loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (data->loop); g_main_loop_run (data->loop);
g_clear_pointer (&data->loop, g_main_loop_unref); g_clear_pointer (&data->loop, g_main_loop_unref);
@@ -96,6 +99,11 @@ link_callback (NMPlatform *platform, int ifindex, NMPlatformLink *received, NMPl
debug ("Received signal '%s-%s' ifindex %d ifname '%s'.", data->name, _change_type_to_string (data->change_type), ifindex, received->name); debug ("Received signal '%s-%s' ifindex %d ifname '%s'.", data->name, _change_type_to_string (data->change_type), ifindex, received->name);
data->received = TRUE; data->received = TRUE;
if (change_type == NM_PLATFORM_SIGNAL_REMOVED)
g_assert (!nm_platform_link_get_name (ifindex));
else
g_assert (nm_platform_link_get_name (ifindex));
/* Check the data */ /* Check the data */
g_assert (received->ifindex > 0); g_assert (received->ifindex > 0);
links = nm_platform_link_get_all (); links = nm_platform_link_get_all ();

View File

@@ -113,7 +113,7 @@ software_add (NMLinkType link_type, const char *name)
/* Don't call link_callback for the bridge interface */ /* Don't call link_callback for the bridge interface */
parent_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, PARENT_NAME); parent_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, PARENT_NAME);
if (nm_platform_bridge_add (PARENT_NAME, NULL, 0)) if (nm_platform_bridge_add (PARENT_NAME, NULL, 0))
wait_signal (parent_added); accept_signal (parent_added);
free_signal (parent_added); free_signal (parent_added);
{ {
@@ -145,7 +145,7 @@ test_slave (int master, int type, SignalData *master_changed)
g_assert (ifindex > 0); g_assert (ifindex > 0);
link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex); link_changed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_CHANGED, link_callback, ifindex);
link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex); link_removed = add_signal_ifindex (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_REMOVED, link_callback, ifindex);
wait_signal (link_added); accept_signal (link_added);
/* Set the slave up to see whether master's IFF_LOWER_UP is set correctly. /* Set the slave up to see whether master's IFF_LOWER_UP is set correctly.
* *
@@ -247,7 +247,7 @@ test_software (NMLinkType link_type, const char *link_typename)
link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME); link_added = add_signal_ifname (NM_PLATFORM_SIGNAL_LINK_CHANGED, NM_PLATFORM_SIGNAL_ADDED, link_callback, DEVICE_NAME);
g_assert (software_add (link_type, DEVICE_NAME)); g_assert (software_add (link_type, DEVICE_NAME));
no_error (); no_error ();
wait_signal (link_added); accept_signal (link_added);
g_assert (nm_platform_link_exists (DEVICE_NAME)); g_assert (nm_platform_link_exists (DEVICE_NAME));
ifindex = nm_platform_link_get_ifindex (DEVICE_NAME); ifindex = nm_platform_link_get_ifindex (DEVICE_NAME);
g_assert (ifindex >= 0); g_assert (ifindex >= 0);
@@ -389,7 +389,7 @@ test_internal (void)
/* Add device */ /* Add device */
g_assert (nm_platform_dummy_add (DEVICE_NAME)); g_assert (nm_platform_dummy_add (DEVICE_NAME));
no_error (); no_error ();
wait_signal (link_added); accept_signal (link_added);
/* Try to add again */ /* Try to add again */
g_assert (!nm_platform_dummy_add (DEVICE_NAME)); g_assert (!nm_platform_dummy_add (DEVICE_NAME));

View File

@@ -220,7 +220,7 @@ setup_tests (void)
nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME)); nm_platform_link_delete (nm_platform_link_get_ifindex (DEVICE_NAME));
g_assert (!nm_platform_link_exists (DEVICE_NAME)); g_assert (!nm_platform_link_exists (DEVICE_NAME));
g_assert (nm_platform_dummy_add (DEVICE_NAME)); g_assert (nm_platform_dummy_add (DEVICE_NAME));
wait_signal (link_added); accept_signal (link_added);
free_signal (link_added); free_signal (link_added);
g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME))); g_assert (nm_platform_link_set_up (nm_platform_link_get_ifindex (DEVICE_NAME)));