platform: fix test failure when /proc is mounted read-only

Expect a failure when writing to /proc if the file system is mounted
read-only.

(cherry picked from commit 211eb3ff8a)
This commit is contained in:
Beniamino Galvani 2020-04-30 17:20:21 +02:00
parent f2fdb6710f
commit cd056b664b

View file

@ -3028,18 +3028,29 @@ test_sysctl_netns_switch (void)
nmtstp_link_delete (PL, FALSE, ifindex, NULL, TRUE); nmtstp_link_delete (PL, FALSE, ifindex, NULL, TRUE);
} }
static void typedef struct {
sysctl_set_async_cb_assert_success (GError *error, gpointer data) GMainLoop *loop;
{ const char *path;
g_assert_no_error (error); gboolean expected_success;
g_main_loop_quit (data); gint32 expected_value;
} } SetAsyncData;
static void static void
sysctl_set_async_cb_assert_failure (GError *error, gpointer data) sysctl_set_async_cb (GError *error, gpointer user_data)
{ {
g_assert (error); SetAsyncData *data = user_data;
g_main_loop_quit (data);
if (data->expected_success) {
g_assert_no_error (error);
g_assert_cmpint (nm_platform_sysctl_get_int32 (NM_PLATFORM_GET,
NMP_SYSCTL_PATHID_ABSOLUTE (data->path),
-1),
==,
data->expected_value);
} else
g_assert (error);
g_main_loop_quit (data->loop);
} }
static void static void
@ -3048,43 +3059,53 @@ test_sysctl_set_async (void)
NMPlatform *const PL = NM_PLATFORM_GET; NMPlatform *const PL = NM_PLATFORM_GET;
const char *const IFNAME = "nm-dummy-0"; const char *const IFNAME = "nm-dummy-0";
const char *const PATH = "/proc/sys/net/ipv4/conf/nm-dummy-0/rp_filter"; const char *const PATH = "/proc/sys/net/ipv4/conf/nm-dummy-0/rp_filter";
gs_free GMainLoop *loop = NULL; GMainLoop *loop;
gs_unref_object GCancellable *cancellable = NULL; gs_unref_object GCancellable *cancellable = NULL;
gboolean proc_writable;
SetAsyncData data;
int ifindex; int ifindex;
ifindex = nmtstp_link_dummy_add (PL, -1, IFNAME)->ifindex; ifindex = nmtstp_link_dummy_add (PL, -1, IFNAME)->ifindex;
loop = g_main_loop_new (NULL, FALSE); loop = g_main_loop_new (NULL, FALSE);
cancellable = g_cancellable_new (); cancellable = g_cancellable_new ();
proc_writable = access (PATH, W_OK) == 0;
data = (SetAsyncData) {
.loop = loop,
.path = PATH,
.expected_success = proc_writable,
.expected_value = 2,
};
nm_platform_sysctl_set_async (PL, nm_platform_sysctl_set_async (PL,
NMP_SYSCTL_PATHID_ABSOLUTE (PATH), NMP_SYSCTL_PATHID_ABSOLUTE (PATH),
(const char *[]) { "2", NULL}, (const char *[]) { "2", NULL},
sysctl_set_async_cb_assert_success, sysctl_set_async_cb,
loop, &data,
cancellable); cancellable);
if (!nmtst_main_loop_run (loop, 1000)) if (!nmtst_main_loop_run (loop, 1000))
g_assert_not_reached (); g_assert_not_reached ();
g_assert_cmpint (nm_platform_sysctl_get_int32 (PL, NMP_SYSCTL_PATHID_ABSOLUTE (PATH), -1), data = (SetAsyncData) {
==, .loop = loop,
2); .path = PATH,
.expected_success = proc_writable,
.expected_value = 1,
};
nm_platform_sysctl_set_async (PL, nm_platform_sysctl_set_async (PL,
NMP_SYSCTL_PATHID_ABSOLUTE (PATH), NMP_SYSCTL_PATHID_ABSOLUTE (PATH),
(const char *[]) { "2", "0", "1", "0", "1", NULL}, (const char *[]) { "2", "0", "1", "0", "1", NULL},
sysctl_set_async_cb_assert_success, sysctl_set_async_cb,
loop, &data,
cancellable); cancellable);
if (!nmtst_main_loop_run (loop, 2000)) if (!nmtst_main_loop_run (loop, 2000))
g_assert_not_reached (); g_assert_not_reached ();
g_assert_cmpint (nm_platform_sysctl_get_int32 (PL, NMP_SYSCTL_PATHID_ABSOLUTE (PATH), -1),
==,
1);
nmtstp_link_delete (NULL, -1, ifindex, IFNAME, TRUE); nmtstp_link_delete (NULL, -1, ifindex, IFNAME, TRUE);
g_main_loop_unref (loop);
} }
static void static void
@ -3093,25 +3114,33 @@ test_sysctl_set_async_fail (void)
NMPlatform *const PL = NM_PLATFORM_GET; NMPlatform *const PL = NM_PLATFORM_GET;
const char *const IFNAME = "nm-dummy-0"; const char *const IFNAME = "nm-dummy-0";
const char *const PATH = "/proc/sys/net/ipv4/conf/nm-dummy-0/does-not-exist"; const char *const PATH = "/proc/sys/net/ipv4/conf/nm-dummy-0/does-not-exist";
gs_free GMainLoop *loop = NULL; GMainLoop *loop;
gs_unref_object GCancellable *cancellable = NULL; gs_unref_object GCancellable *cancellable = NULL;
SetAsyncData data;
int ifindex; int ifindex;
ifindex = nmtstp_link_dummy_add (PL, -1, IFNAME)->ifindex; ifindex = nmtstp_link_dummy_add (PL, -1, IFNAME)->ifindex;
loop = g_main_loop_new (NULL, FALSE); loop = g_main_loop_new (NULL, FALSE);
cancellable = g_cancellable_new (); cancellable = g_cancellable_new ();
data = (SetAsyncData) {
.loop = loop,
.path = PATH,
.expected_success = FALSE,
};
nm_platform_sysctl_set_async (PL, nm_platform_sysctl_set_async (PL,
NMP_SYSCTL_PATHID_ABSOLUTE (PATH), NMP_SYSCTL_PATHID_ABSOLUTE (PATH),
(const char *[]) { "2", NULL}, (const char *[]) { "2", NULL},
sysctl_set_async_cb_assert_failure, sysctl_set_async_cb,
loop, &data,
cancellable); cancellable);
if (!nmtst_main_loop_run (loop, 1000)) if (!nmtst_main_loop_run (loop, 1000))
g_assert_not_reached (); g_assert_not_reached ();
nmtstp_link_delete (NULL, -1, ifindex, IFNAME, TRUE); nmtstp_link_delete (NULL, -1, ifindex, IFNAME, TRUE);
g_main_loop_unref (loop);
} }
/*****************************************************************************/ /*****************************************************************************/