platform/tests: add tests for nmp_utils_sysctl_open_netdir()

This commit is contained in:
Thomas Haller
2016-12-09 16:30:35 +01:00
parent 6b132a2bd0
commit e332c27824

View File

@@ -2322,6 +2322,173 @@ test_netns_bind_to_path (gpointer fixture, gconstpointer test_data)
/*****************************************************************************/
static void
test_sysctl_rename (void)
{
NMPlatform *const PL = NM_PLATFORM_GET;
const char *const IFNAME[3] = {
"nm-dummy-0",
"nm-dummy-1",
"nm-dummy-2",
};
int ifindex[G_N_ELEMENTS (IFNAME)] = { 0 };
nm_auto_close int dirfd = -1;
int i;
char ifname_buf[IFNAMSIZ];
char *s;
const NMPlatformLink *pllink;
ifindex[0] = nmtstp_link_dummy_add (PL, -1, IFNAME[0])->ifindex;
ifindex[1] = nmtstp_link_dummy_add (PL, -1, IFNAME[1])->ifindex;
s = (nmtst_get_rand_int () % 2) ? NULL : ifname_buf;
if (nmtst_get_rand_int () % 2) {
/* bring the platform cache out of sync */
nmtstp_run_command_check ("ip link set %s name %s", IFNAME[0], IFNAME[2]);
nm_platform_process_events (PL);
nmtstp_run_command_check ("ip link set %s name %s", IFNAME[2], IFNAME[0]);
pllink = nm_platform_link_get_by_ifname (PL, IFNAME[2]);
g_assert (pllink && pllink->ifindex == ifindex[0]);
pllink = nm_platform_link_get_by_ifname (PL, IFNAME[0]);
g_assert (!pllink);
}
/* open dirfd for IFNAME[0] */
i = nmtst_get_rand_int () % (2 + G_N_ELEMENTS (IFNAME));
if (i == 0) {
dirfd = nm_platform_sysctl_open_netdir (PL,
ifindex[0],
s);
} else {
const char *ifname_guess;
/* provide a wrong or no guess. */
ifname_guess = i == 1 ? NULL : IFNAME[i - 2];
dirfd = nmp_utils_sysctl_open_netdir (ifindex[0],
ifname_guess,
s);
}
g_assert (dirfd >= 0);
if (s)
g_assert_cmpstr (s, ==, IFNAME[0]);
/* possibly rename the interfaces. */
switch (nmtst_get_rand_int () % 4) {
case 0:
break;
case 1:
nmtstp_run_command_check ("ip link set %s name %s", IFNAME[0], IFNAME[2]);
break;
case 2:
nmtstp_run_command_check ("ip link set %s name %s", IFNAME[0], IFNAME[2]);
nmtstp_run_command_check ("ip link set %s name %s", IFNAME[1], IFNAME[0]);
break;
}
/* possibly, resync platform cache (should make no difference). */
if (nmtst_get_rand_int () % 2)
nm_platform_process_events (PL);
/* check that we still read the same file. */
switch (nmtst_get_rand_int () % 2) {
case 0: {
gs_free char *c = NULL;
if (nm_utils_file_get_contents (dirfd, "ifindex", 1*1024*1024, &c, NULL, NULL) < 0)
g_assert_not_reached();
g_assert_cmpint (ifindex[0], ==, (int) _nm_utils_ascii_str_to_int64 (c, 10, 0, G_MAXINT, -1));
break;
}
case 1: {
g_assert_cmpint (ifindex[0], ==, (gint32) nm_platform_sysctl_get_int32 (PL, NMP_SYSCTL_PATHID_NETDIR (dirfd, s ?: "<unknown>", "ifindex"), -1));
break;
}
default:
g_assert_not_reached ();
}
nm_platform_process_events (PL);
nmtstp_link_del (PL, -1, ifindex[0], NULL);
nmtstp_link_del (PL, -1, ifindex[1], NULL);
}
/*****************************************************************************/
static void
test_sysctl_netns_switch (void)
{
const char *const IFNAME = "nm-dummy-0";
int ifindex, ifindex_tmp;
nm_auto_close int dirfd = -1;
char ifname_buf[IFNAMSIZ];
char *s;
gs_unref_object NMPlatform *platform_0 = NULL;
gs_unref_object NMPlatform *platform_1 = NULL;
gs_unref_object NMPlatform *platform_2 = NULL;
nm_auto_pop_netns NMPNetns *netns_pop_1 = NULL;
nm_auto_pop_netns NMPNetns *netns_pop_2 = NULL;
nm_auto_pop_netns NMPNetns *netns_pop_3 = NULL;
NMPlatform *PL;
NMPlatform *platforms[3];
if (_test_netns_check_skip ())
return;
platforms[0] = platform_0 = nm_linux_platform_new (TRUE);
platforms[1] = platform_1 = _test_netns_create_platform ();
platforms[2] = platform_2 = _test_netns_create_platform ();
PL = platforms[nmtst_get_rand_int () % 3];
nmtstp_netns_select_random (platforms, G_N_ELEMENTS (platforms), &netns_pop_1);
ifindex = nmtstp_link_dummy_add (PL, FALSE, IFNAME)->ifindex;
nmtstp_netns_select_random (platforms, G_N_ELEMENTS (platforms), &netns_pop_2);
s = (nmtst_get_rand_int () % 2) ? NULL : ifname_buf;
dirfd = nm_platform_sysctl_open_netdir (PL,
ifindex,
s);
g_assert (dirfd >= 0);
if (s)
g_assert_cmpstr (s, ==, IFNAME);
nmtstp_netns_select_random (platforms, G_N_ELEMENTS (platforms), &netns_pop_3);
/* even if we switch to other namespaces, we can still lookup the path correctly,
* either using dirfd or via the platform instance (which switches namespace as needed). */
{
gs_free char *c = NULL;
if (nm_utils_file_get_contents (dirfd, "ifindex", 0, &c, NULL, NULL) < 0)
g_assert_not_reached();
g_assert_cmpint (ifindex, ==, (int) _nm_utils_ascii_str_to_int64 (c, 10, 0, G_MAXINT, -1));
}
g_assert_cmpint (ifindex, ==, (gint32) nm_platform_sysctl_get_int32 (PL, NMP_SYSCTL_PATHID_NETDIR (dirfd, s ?: "<unknown>", "ifindex"), -1));
g_assert_cmpint (ifindex, ==, (gint32) nm_platform_sysctl_get_int32 (PL, NMP_SYSCTL_PATHID_ABSOLUTE (nm_sprintf_bufa (100, "/sys/class/net/%s/ifindex", IFNAME)), -1));
/* accessing the path directly, only succeeds iff the current namespace happens to be the namespace
* in which we created the link. */
{
gs_free char *c = NULL;
if (nm_utils_file_get_contents (-1, nm_sprintf_bufa (100, "/sys/class/net/%s/ifindex", IFNAME), 0, &c, NULL, NULL) < 0)
ifindex_tmp = -1;
else
ifindex_tmp = _nm_utils_ascii_str_to_int64 (c, 10, 0, G_MAXINT, -2);
}
if (nmp_netns_get_current () == nm_platform_netns_get (PL))
g_assert_cmpint (ifindex_tmp, ==, ifindex);
else
g_assert_cmpint (ifindex_tmp, ==, -1);
nmtstp_link_del (PL, FALSE, ifindex, NULL);
}
/*****************************************************************************/
NMTstpSetupFunc const _nmtstp_setup_platform_func = SETUP;
void
@@ -2375,5 +2542,8 @@ _nmtstp_setup_tests (void)
g_test_add_vtable ("/general/netns/set-netns", 0, NULL, _test_netns_setup, test_netns_set_netns, _test_netns_teardown);
g_test_add_vtable ("/general/netns/push", 0, NULL, _test_netns_setup, test_netns_push, _test_netns_teardown);
g_test_add_vtable ("/general/netns/bind-to-path", 0, NULL, _test_netns_setup, test_netns_bind_to_path, _test_netns_teardown);
g_test_add_func ("/general/sysctl/rename", test_sysctl_rename);
g_test_add_func ("/general/sysctl/netns-switch", test_sysctl_netns_switch);
}
}