summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-11-02 17:04:29 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2018-11-02 17:05:50 +0100
commit9958df36e5b761c8e906da3e3706d519d7b1c2fd (patch)
treed2655afd469942bec7550d84021103360e86e6a0
parent6651915e69b75bf5cdbfe704691d9f62d39972c7 (diff)
parent5ba301f4eb652a208a500a39d59dadf427a64590 (diff)
downloadNetworkManager-9958df36e5b761c8e906da3e3706d519d7b1c2fd.tar.gz
tests/cli: merge branch 'bg/issue39'
Wait for all wifi scans to finish before displaying the 'nmcli device wifi list' result, and other fixes. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/39
-rw-r--r--clients/cli/devices.c142
-rw-r--r--clients/cli/utils.c2
-rwxr-xr-xclients/tests/test-client.py4
-rwxr-xr-xtools/test-networkmanager-service.py12
4 files changed, 85 insertions, 75 deletions
diff --git a/clients/cli/devices.c b/clients/cli/devices.c
index c23238f539..88fbae33f3 100644
--- a/clients/cli/devices.c
+++ b/clients/cli/devices.c
@@ -2822,7 +2822,7 @@ show_access_point_info (NMDeviceWifi *wifi, NmCli *nmc, NmcOutputData *out)
aps = sort_access_points (nm_device_wifi_get_access_points (wifi));
g_ptr_array_foreach (aps, fill_output_access_point, &info);
- g_ptr_array_free (aps, FALSE);
+ g_ptr_array_free (aps, TRUE);
}
print_data_prepare_width (out->output_data);
@@ -2897,28 +2897,38 @@ wifi_print_aps (NMDeviceWifi *wifi,
typedef struct {
NmCli *nmc;
- NMDeviceWifi *wifi;
- const NMMetaAbstractInfo *const*tmpl;
-
+ NMDevice **devices;
+ const NMMetaAbstractInfo *const *tmpl;
const char *bssid_user;
+ GArray *out_indices;
+} ScanInfo;
+
+typedef struct {
+ ScanInfo *scan_info;
+ NMDeviceWifi *wifi;
gulong last_scan_id;
guint timeout_id;
GCancellable *scan_cancellable;
- GArray *out_indices;
} WifiListData;
static void
wifi_list_finish (WifiListData *data)
{
- NmCli *nmc = data->nmc;
-
- wifi_print_aps (data->wifi, data->nmc, data->out_indices,
- data->tmpl, data->bssid_user);
+ ScanInfo *info = data->scan_info;
+ NmCli *nmc = info->nmc;
+ guint i;
- if (--nmc->should_wait == 0) {
+ if (--info->nmc->should_wait == 0) {
+ for (i = 0; info->devices[i]; i++) {
+ wifi_print_aps (NM_DEVICE_WIFI (info->devices[i]),
+ info->nmc,
+ info->out_indices,
+ info->tmpl,
+ info->bssid_user);
+ }
if (nmc->return_value == NMC_RESULT_ERROR_NOT_FOUND) {
g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."),
- data->bssid_user);
+ data->scan_info->bssid_user);
}
g_main_loop_quit (loop);
}
@@ -2926,9 +2936,15 @@ wifi_list_finish (WifiListData *data)
g_signal_handler_disconnect (data->wifi, data->last_scan_id);
nm_clear_g_source (&data->timeout_id);
nm_clear_g_cancellable (&data->scan_cancellable);
- g_array_unref (data->out_indices);
- g_object_unref (data->wifi);
g_slice_free (WifiListData, data);
+
+ if (info->nmc->should_wait == 0) {
+ for (i = 0; info->devices[i]; i++)
+ g_object_unref (info->devices[i]);
+ g_free (info->devices);
+ g_array_unref (info->out_indices);
+ g_free (info);
+ }
}
static void
@@ -2973,49 +2989,6 @@ wifi_list_scan_timeout (gpointer user_data)
}
static void
-wifi_list_aps (NMDeviceWifi *wifi,
- NmCli *nmc,
- GArray *out_indices,
- const NMMetaAbstractInfo *const*tmpl,
- const char *bssid_user,
- gint64 rescan_cutoff)
-{
- gboolean needs_rescan;
- WifiListData *data;
-
- needs_rescan = rescan_cutoff < 0 || (rescan_cutoff > 0 && nm_device_wifi_get_last_scan (wifi) < rescan_cutoff);
-
- /* FIXME: nmcli should either
- * - don't request any new scan for any device and print the full AP list right
- * away.
- * - or, when requesting a scan on one or more devices, don't print the result
- * before all requests complete.
- *
- * Otherwise:
- * - the printed output is not self consistent. E.g. it will print the result
- * on one device at a certain time, while printing the result for another
- * device at a later point in time.
- * - the order in which we print the AP list per-device, is unstable. */
- if (needs_rescan) {
- data = g_slice_new0 (WifiListData);
- data->nmc = nmc;
- data->wifi = g_object_ref (wifi);
- data->tmpl = tmpl;
- data->out_indices = g_array_ref (out_indices);;
- data->bssid_user = bssid_user;
- data->last_scan_id = g_signal_connect (wifi, "notify::" NM_DEVICE_WIFI_LAST_SCAN,
- G_CALLBACK (wifi_last_scan_updated), data);
- data->scan_cancellable = g_cancellable_new ();
- data->timeout_id = g_timeout_add_seconds (15, wifi_list_scan_timeout, data);
- nm_device_wifi_request_scan_async (wifi, data->scan_cancellable, wifi_list_rescan_cb, data);
-
- nmc->should_wait++;
- } else {
- wifi_print_aps (wifi, nmc, out_indices, tmpl, bssid_user);
- }
-}
-
-static void
complete_aps (NMDevice **devices, const char *ifname,
const char *bssid_prefix, const char *ssid_prefix)
{
@@ -3044,12 +3017,15 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
const char *bssid_user = NULL;
const char *rescan = NULL;
gs_free NMDevice **devices = NULL;
- guint i;
const char *fields_str = NULL;
const NMMetaAbstractInfo *const*tmpl;
gs_unref_array GArray *out_indices = NULL;
int option;
guint64 rescan_cutoff;
+ NMDeviceWifi *wifi;
+ ScanInfo *scan_info = NULL;
+ WifiListData *data;
+ guint i, j;
devices = nmc_get_devices_sorted (nmc->client);
@@ -3137,7 +3113,8 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
}
if (NM_IS_DEVICE_WIFI (device)) {
- wifi_list_aps (NM_DEVICE_WIFI (device), nmc, out_indices, tmpl, bssid_user, rescan_cutoff);
+ devices[0] = device;
+ devices[1] = NULL;
} else {
if ( nm_device_get_device_type (device) == NM_DEVICE_TYPE_GENERIC
&& g_strcmp0 (nm_device_get_type_description (device), "wifi") == 0) {
@@ -3151,13 +3128,52 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
}
return NMC_RESULT_ERROR_UNKNOWN;
}
+ }
+
+ /* Filter out non-wifi devices */
+ for (i = 0, j = 0; devices[i]; i++) {
+ if (NM_IS_DEVICE_WIFI (devices[i]))
+ devices[j++] = devices[i];
+ }
+ devices[j] = NULL;
+
+ /* Start a new scan for devices that need it */
+ for (i = 0; devices[i]; i++) {
+ wifi = (NMDeviceWifi *) devices[i];
+ g_object_ref (wifi);
+
+ if ( rescan_cutoff == 0
+ || (rescan_cutoff > 0 && nm_device_wifi_get_last_scan (wifi) >= rescan_cutoff))
+ continue;
+
+ if (!scan_info) {
+ scan_info = g_new0 (ScanInfo, 1);
+ scan_info->out_indices = g_array_ref (out_indices);
+ scan_info->tmpl = tmpl;
+ scan_info->bssid_user = bssid_user;
+ scan_info->nmc = nmc;
+ }
+
+ nmc->should_wait++;
+ data = g_slice_new0 (WifiListData);
+ data->wifi = wifi;
+ data->scan_info = scan_info;
+ data->last_scan_id = g_signal_connect (wifi, "notify::" NM_DEVICE_WIFI_LAST_SCAN,
+ G_CALLBACK (wifi_last_scan_updated), data);
+ data->scan_cancellable = g_cancellable_new ();
+ data->timeout_id = g_timeout_add_seconds (15, wifi_list_scan_timeout, data);
+ nm_device_wifi_request_scan_async (wifi, data->scan_cancellable, wifi_list_rescan_cb, data);
+ }
+
+ if (scan_info) {
+ scan_info->devices = g_steal_pointer (&devices);
} else {
+ /* Print results right away if no scan is pending */
for (i = 0; devices[i]; i++) {
- NMDevice *dev = devices[i];
-
- if (NM_IS_DEVICE_WIFI (dev)) {
- wifi_list_aps (NM_DEVICE_WIFI (dev), nmc, out_indices, tmpl, bssid_user, rescan_cutoff);
- }
+ wifi_print_aps (NM_DEVICE_WIFI (devices[i]),
+ nmc, out_indices,
+ tmpl, bssid_user);
+ g_object_unref (devices[i]);
}
}
diff --git a/clients/cli/utils.c b/clients/cli/utils.c
index f9ff489c05..1b940467ce 100644
--- a/clients/cli/utils.c
+++ b/clients/cli/utils.c
@@ -920,6 +920,8 @@ nmc_empty_output_fields (NmcOutputData *output_data)
/* Empty output_data array */
if (output_data->output_data->len > 0)
g_ptr_array_remove_range (output_data->output_data, 0, output_data->output_data->len);
+
+ g_ptr_array_unref (output_data->output_data);
}
/*****************************************************************************/
diff --git a/clients/tests/test-client.py b/clients/tests/test-client.py
index 9c79d2c49a..fee874ba85 100755
--- a/clients/tests/test-client.py
+++ b/clients/tests/test-client.py
@@ -744,8 +744,8 @@ class TestNmcli(NmTestBase):
skip_test_for_l10n_diff.append(n['test_name'])
continue
print("\n\n\nThe file '%s' does not have the expected content:" % (filename))
- print("ACTUAL OUTPUT:\n[[%s]]\n" % (results_expect[i]))
- print("EXPECT OUTPUT:\n[[%s]]\n" % (n['content']))
+ print("ACTUAL OUTPUT:\n[[%s]]\n" % (n['content']))
+ print("EXPECT OUTPUT:\n[[%s]]\n" % (results_expect[i]))
print("Let the test write the file by rerunning with NM_TEST_REGENERATE=1")
print("See howto in %s for details.\n" % (PathConfiguration.canonical_script_filename()))
sys.stdout.flush()
diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py
index 8a37fb17bb..9aa44a906e 100755
--- a/tools/test-networkmanager-service.py
+++ b/tools/test-networkmanager-service.py
@@ -916,16 +916,8 @@ class WifiDevice(Device):
self.aps = []
self.scan_cb_id = None
- # Note: we would like to simulate how nmcli calls RequestScan() and we could
- # do so by using an older timestamp. However, that makes the client tests
- # racy, because if a bunch of nmcli instances run in parallel against this
- # service, earlier instances will issue a RequestScan(), while later instances
- # won't do that (because the LastScan timestamp is already updated). That means,
- # the later instances will print the scan result immediately, and in another sort
- # order. That should be fixed, by nmcli not starting to print anything, before
- # all RequestScan() requests complete, and thus, always print a consistent list
- # of results.
- ts = NM.utils_get_timestamp_msec()
+ # Use a randomly older timestamp to trigger RequestScan() from the client
+ ts = max(0, NM.utils_get_timestamp_msec() - Util.random_int(self.path, 20000, 40000))
props = {
PRP_WIFI_HW_ADDRESS: mac,