diff options
author | Dan Winship <danw@gnome.org> | 2014-10-10 16:49:12 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-10-19 09:27:48 -0400 |
commit | f96835b83c1a3a8e1f4046ef6899a4ec85e2b25e (patch) | |
tree | c256dbe0bf9da0230e58407a52b399317657594e | |
parent | ba900f2a44f978300cac768c75384b54e3be61bc (diff) | |
download | NetworkManager-f96835b83c1a3a8e1f4046ef6899a4ec85e2b25e.tar.gz |
libnm: add a virtual device creation-and-activation test
Add a test of creating a (virtual) device and activating a connection
on it at the same time.
-rw-r--r-- | libnm/tests/test-nm-client.c | 136 |
1 files changed, 135 insertions, 1 deletions
diff --git a/libnm/tests/test-nm-client.c b/libnm/tests/test-nm-client.c index 77d38645f0..76469aac53 100644 --- a/libnm/tests/test-nm-client.c +++ b/libnm/tests/test-nm-client.c @@ -751,7 +751,7 @@ assert_ac_and_device (NMClient *client) g_assert_cmpint (acs->len, ==, 1); devices = nm_client_get_devices (client); g_assert (devices != NULL); - g_assert_cmpint (devices->len, ==, 1); + g_assert_cmpint (devices->len, >=, 1); ac = acs->pdata[0]; ac_devices = nm_active_connection_get_devices (ac); @@ -761,6 +761,8 @@ assert_ac_and_device (NMClient *client) g_assert (ac_device != NULL); device = devices->pdata[0]; + if (device != ac_device && devices->len > 1) + device = devices->pdata[1]; device_ac = nm_device_get_active_connection (device); g_assert (device_ac != NULL); @@ -875,6 +877,137 @@ test_active_connections (void) g_clear_pointer (&sinfo, nm_test_service_cleanup); } +static void +client_devices_changed_cb (GObject *client, + GParamSpec *pspec, + gpointer user_data) +{ + TestACInfo *info = user_data; + const GPtrArray *devices; + NMDevice *device; + + devices = nm_client_get_devices (NM_CLIENT (client)); + g_assert (devices != NULL); + g_assert_cmpint (devices->len, ==, 2); + + if (NM_IS_DEVICE_VLAN (devices->pdata[0])) + device = devices->pdata[0]; + else if (NM_IS_DEVICE_VLAN (devices->pdata[1])) + device = devices->pdata[1]; + else + g_assert_not_reached (); + + g_assert_cmpstr (nm_device_get_iface (device), ==, "eth0.1"); + + if (nm_device_get_active_connection (device)) + info->remaining--; + else { + g_signal_connect (device, "notify::" NM_DEVICE_ACTIVE_CONNECTION, + G_CALLBACK (device_ac_changed_cb), &info); + } + + info->remaining--; + if (!info->remaining) + g_main_loop_quit (info->loop); +} + +typedef struct { + GMainLoop *loop; + NMRemoteConnection *remote; +} TestConnectionInfo; + +static void +add_connection_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + TestConnectionInfo *info = user_data; + GError *error = NULL; + + info->remote = nm_client_add_connection_finish (NM_CLIENT (object), result, &error); + g_assert_no_error (error); + g_main_loop_quit (info->loop); +} + +static void +activate_cb (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + NMClient *client = NM_CLIENT (object); + TestACInfo *info = user_data; + GError *error = NULL; + + info->ac = nm_client_activate_connection_finish (client, result, &error); + g_assert_no_error (error); + g_assert (info->ac != NULL); + + assert_ac_and_device (client); + + info->remaining--; + if (!info->remaining) + g_main_loop_quit (info->loop); +} + +static void +test_activate_virtual (void) +{ + NMClient *client; + NMConnection *conn; + NMSettingConnection *s_con; + NMSettingVlan *s_vlan; + TestACInfo info = { loop, NULL, 0 }; + TestConnectionInfo conn_info = { loop, NULL }; + GError *error = NULL; + + sinfo = nm_test_service_init (); + client = nm_client_new (NULL, &error); + g_assert_no_error (error); + + nm_test_service_add_device (sinfo, client, "AddWiredDevice", "eth0"); + + conn = nmtst_create_minimal_connection ("test-ac", NULL, NM_SETTING_VLAN_SETTING_NAME, &s_con); + g_object_set (s_con, + NM_SETTING_CONNECTION_INTERFACE_NAME, "eth0.1", + NULL); + s_vlan = nm_connection_get_setting_vlan (conn); + g_object_set (s_vlan, + NM_SETTING_VLAN_ID, 1, + NM_SETTING_VLAN_PARENT, "eth0", + NULL); + + nm_client_add_connection_async (client, conn, TRUE, + NULL, add_connection_cb, &conn_info); + g_main_loop_run (loop); + g_object_unref (conn); + conn = NM_CONNECTION (conn_info.remote); + + nm_client_activate_connection_async (client, conn, NULL, NULL, + NULL, activate_cb, &info); + g_object_unref (conn); + + g_signal_connect (client, "notify::" NM_CLIENT_ACTIVE_CONNECTIONS, + G_CALLBACK (client_acs_changed_cb), &info); + g_signal_connect (client, "notify::" NM_CLIENT_DEVICES, + G_CALLBACK (client_devices_changed_cb), &info); + + /* As with test_active_connections() above, except that now we're waiting + * for NMClient:devices to change rather than NMDevice:active-connections. + */ + info.remaining = 3; + + g_main_loop_run (loop); + g_signal_handlers_disconnect_by_func (client, client_acs_changed_cb, &info); + g_signal_handlers_disconnect_by_func (client, client_devices_changed_cb, &info); + + g_assert (info.ac != NULL); + + g_object_unref (info.ac); + g_object_unref (client); + + g_clear_pointer (&sinfo, nm_test_service_cleanup); +} + /*******************************************************************/ int @@ -896,6 +1029,7 @@ main (int argc, char **argv) g_test_add_func ("/libnm/devices-array", test_devices_array); g_test_add_func ("/libnm/client-nm-running", test_client_nm_running); g_test_add_func ("/libnm/active-connections", test_active_connections); + g_test_add_func ("/libnm/activate-virtual", test_activate_virtual); return g_test_run (); } |