platform/tests: merge branch 'th/platform-cache-test'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1513

(cherry picked from commit 90df190a1a)
This commit is contained in:
Thomas Haller 2023-01-30 08:34:18 +01:00
commit 79c54e645c
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
9 changed files with 402 additions and 105 deletions

View file

@ -64,8 +64,11 @@ check_run_clean() {
return 0
}
check_run_clean 1 && BUILD_TYPE=autotools CC=gcc WITH_DOCS=1 WITH_VALGRIND=1 contrib/scripts/nm-ci-run.sh \
&& mv build/INST/share/gtk-doc/html "$ARTIFACT_DIR/docs-html"
if check_run_clean 1 ; then
BUILD_TYPE=autotools CC=gcc WITH_DOCS=1 WITH_VALGRIND=1 contrib/scripts/nm-ci-run.sh
mv build/INST/share/gtk-doc/html "$ARTIFACT_DIR/docs-html"
fi
check_run_clean 2 && BUILD_TYPE=meson CC=gcc WITH_DOCS=1 WITH_VALGRIND=1 contrib/scripts/nm-ci-run.sh
check_run_clean 3 && BUILD_TYPE=autotools CC=clang WITH_DOCS=0 contrib/scripts/nm-ci-run.sh
check_run_clean 4 && BUILD_TYPE=meson CC=clang WITH_DOCS=0 contrib/scripts/nm-ci-run.sh

View file

@ -69,9 +69,13 @@ if [ $IS_ALPINE = 1 ]; then
_WITH_SYSTEMD_LOGIND="$_FALSE"
fi
if [ "$NMTST_SEED_RAND" != "" ]; then
export NMTST_SEED_RAND=
if [ -z "${NMTST_SEED_RAND+x}" ]; then
NMTST_SEED_RAND="$SRANDOM"
if [ -z "$NMTST_SEED_RAND" ]; then
NMTST_SEED_RAND="$(( ( (RANDOM<<15|RANDOM)<<15|RANDOM ) % 0xfffffffe ))"
fi
fi
export NMTST_SEED_RAND
case "$CI" in
""|"true"|"default"|"gitlab")
@ -193,21 +197,18 @@ run_autotools() {
export NM_TEST_CLIENT_CHECK_L10N=1
if ! make check -j 6 -k ; then
_print_test_logs "first-test"
echo ">>>> RUN SECOND TEST (start)"
NMTST_DEBUG=TRACE,no-expect-message make check -k || :
NMTST_DEBUG="debug,TRACE,no-expect-message" make check -k || :
echo ">>>> RUN SECOND TEST (done)"
_print_test_logs "second-test"
die "test failed"
die "autotools test failed"
fi
if _with_valgrind; then
if ! NMTST_USE_VALGRIND=1 make check -j 3 -k ; then
_print_test_logs "(valgrind test)"
die "valgrind test failed"
die "autotools+valgrind test failed"
fi
fi
popd
@ -261,14 +262,21 @@ run_meson() {
export NM_TEST_CLIENT_CHECK_L10N=1
ninja -C build
ninja -C build -v
ninja -C build install
ninja -C build test
if ! meson test -C build -v --print-errorlogs ; then
echo ">>>> RUN SECOND TEST (start)"
NMTST_DEBUG="debug,TRACE,no-expect-message" \
meson test -C build -v --print-errorlogs || :
echo ">>>> RUN SECOND TEST (done)"
die "meson test failed"
fi
if _with_valgrind; then
if ! NMTST_USE_VALGRIND=1 ninja -C build test; then
if ! NMTST_USE_VALGRIND=1 meson test -C build -v --print-errorlogs ; then
_print_test_logs "(valgrind test)"
die "valgrind test failed"
die "meson+valgrind test failed"
fi
fi
}

View file

@ -15,6 +15,7 @@
#include <linux/rtnetlink.h>
#include "n-acd/src/n-acd.h"
#include "libnm-platform/nm-platform-utils.h"
#define SIGNAL_DATA_FMT "'%s-%s' ifindex %d%s%s%s (%d times received)"
#define SIGNAL_DATA_ARG(data) \
@ -33,6 +34,52 @@ int NMTSTP_ENV1_EX = -1;
/*****************************************************************************/
typedef struct {
const char *module_name;
NMLinkType iftype;
/* These modules create additional interfaces, like
* "gre0" for "ip_gre" module.
*
* - actually some modules create multiple interfaces, like "ip_gre"
* creating "gre0", "gretap0", "erspan0".
* - if already an interface with such name exist, kernel would create
* names like "gre1" or "gretap1". We don't care for that, because
* we run in our own namespace and we control which interfaces are there.
* We wouldn't create an interface with such a conflicting name.
*
* Anyway. This is the name of *one* of the interfaces that the module would
* create. */
const char *ifname;
/* This only gets set, if iftype is NM_LINK_TYPE_UNKNOWN. It corresponds to
* NMPlatformLink.kind. */
const char *ifkind;
} IPTunnelModInfo;
#define INF(_module_name, _iftype, _ifname, ...) \
{ \
.module_name = ""_module_name, .iftype = _iftype, .ifname = ""_ifname, __VA_ARGS__ \
}
static const IPTunnelModInfo ip_tunnel_mod_infos[] = {
INF("ip_gre", NM_LINK_TYPE_GRE, "gre0"),
INF("ip_gre", NM_LINK_TYPE_GRETAP, "gretap0"),
INF("ip_gre", NM_LINK_TYPE_UNKNOWN, "erspan0", .ifkind = "erspan"),
INF("ipip", NM_LINK_TYPE_IPIP, "tunl0"),
INF("ip6_tunnel", NM_LINK_TYPE_IP6TNL, "ip6tnl0"),
INF("ip6_gre", NM_LINK_TYPE_IP6GRE, "ip6gre0"),
INF("sit", NM_LINK_TYPE_SIT, "sit0"),
INF("ip_vti", NM_LINK_TYPE_VTI, "ip_vti0"),
INF("ip6_vti", NM_LINK_TYPE_VTI6, "ip6_vti0"),
};
#undef INF
/*****************************************************************************/
void
nmtstp_setup_platform(void)
{
@ -811,23 +858,56 @@ _assert_platform_normalize_all(GPtrArray *arr)
gboolean normalized = FALSE;
for (i = 0; i < nm_g_ptr_array_len(arr); i++) {
const NMPObject **ptr = (gpointer) &arr->pdata[i];
NMPObject *new;
const NMPObject **ptr = (gpointer) &arr->pdata[i];
nm_auto_nmpobj NMPObject *new = NULL;
gboolean skip = FALSE;
switch (NMP_OBJECT_GET_TYPE(*ptr)) {
case NMP_OBJECT_TYPE_LINK:
new = nmp_object_clone(*ptr, FALSE);
new->link.rx_packets = 0;
new->link.rx_bytes = 0;
new->link.tx_packets = 0;
new->link.tx_bytes = 0;
nmp_object_ref_set(ptr, new);
nmp_object_unref(new);
normalized = TRUE;
{
const NMPlatformLink *link = NMP_OBJECT_CAST_LINK(*ptr);
if (nmtstp_link_is_iptunnel_special(link)) {
/* These are special interfaces for the ip tunnel modules, like
* "gre0" created by the "ip_gre" module.
*
* These interfaces can appear at any moment, when the module
* gets loaded (by anybody on the host). We might want to avoid
* that by calling nmtstp_ensure_module(), but it's worse.
* Kernel does not send correct RTM_NEWLINK events when those
* interfaces get created. So the cache content based on the
* events will differ from a new load from a dump.
*
* We need to ignore those interfaces. */
skip = TRUE;
} else if (link->type == NM_LINK_TYPE_UNKNOWN) {
/* The link type is not detected. This might be a generated
* interface like nmtstp_link_is_iptunnel_special(), but for
* kernel modules that we don't know about. Ignore them too. */
skip = TRUE;
}
if (!skip) {
new = nmp_object_clone(*ptr, FALSE);
new->link.rx_packets = 0;
new->link.rx_bytes = 0;
new->link.tx_packets = 0;
new->link.tx_bytes = 0;
}
if (nmp_object_ref_set(ptr, new))
normalized = TRUE;
break;
}
default:
break;
}
}
while (g_ptr_array_remove(arr, NULL)) {
/* Remove NULL values. */
normalized = TRUE;
}
return normalized;
}
@ -912,6 +992,225 @@ _assert_platform_compare_arr(NMPObjectType obj_type,
}
}
/*****************************************************************************/
gboolean
nmtstp_link_is_iptunnel_special(const NMPlatformLink *link)
{
int i;
g_assert(link);
/* These interfaces are autogenerated when loading the ip tunnel
* modules. For example, loading "ip_gre" results in interfaces
* "gre0", "gretap0", "erspan0".
*
* Actually, if the interface names are already taken ("gre0" already
* exists), it will create "gre1" and so on. We don't care about that,
* because in our test's netns that is not happening. */
for (i = 0; i < (int) G_N_ELEMENTS(ip_tunnel_mod_infos); i++) {
const IPTunnelModInfo *module_info = &ip_tunnel_mod_infos[i];
if (module_info->iftype != link->type)
continue;
if (!nm_streq(module_info->ifname, link->name))
continue;
if (module_info->ifkind && !nm_streq(module_info->ifkind, link->kind))
continue;
return TRUE;
}
return FALSE;
}
/*****************************************************************************/
gboolean
nmtstp_ensure_module(const char *module_name)
{
/* using iproute2 seems to fail sometimes? Force use of platform code. */
const int EX = 0;
gs_free char *test_ifname = NULL;
const NMPlatformLink *link;
static int module_state[G_N_ELEMENTS(ip_tunnel_mod_infos)] = {0};
int i_module_info;
const IPTunnelModInfo *module_info = NULL;
int i;
int ifindex;
gboolean result;
if (!module_name) {
result = TRUE;
for (i = 0; i < (int) G_N_ELEMENTS(ip_tunnel_mod_infos); i++) {
if (!nmtstp_ensure_module(ip_tunnel_mod_infos[i].module_name))
result = FALSE;
}
return result;
}
for (i_module_info = 0; i_module_info < (int) G_N_ELEMENTS(ip_tunnel_mod_infos);
i_module_info++) {
if (nm_streq(module_name, ip_tunnel_mod_infos[i_module_info].module_name)) {
module_info = &ip_tunnel_mod_infos[i_module_info];
break;
}
}
if (!module_info)
g_error("%s:%d: Module name \"%s\" not implemented!", __FILE__, __LINE__, module_name);
test_ifname = g_strdup_printf("nm-mod-%s", module_info->ifname);
g_assert(nm_utils_ifname_valid_kernel(test_ifname, NULL));
again:
i = g_atomic_int_get(&module_state[i_module_info]);
if (i != 0)
return i > 0;
/* When tunnel modules get loaded, then interfaces like "gre0", "gretap0"
* and "erspan0" (for "ip_gre" module) appear. For other modules, the interfaces
* are named differently. Of course, unless those interface name are already taken,
* in which case it will create "gre1", etc). So ugly.
*
* Anyway. as we run unit tests in parallel (`make check -j`), another
* test might just load the module just now, which results in the creation of
* those interfaces in our current namespace. That can break the test.
*/
link = nmtstp_link_get_typed(NM_PLATFORM_GET, 0, test_ifname, module_info->iftype);
g_assert(!link);
link = nmtstp_link_get_typed(NM_PLATFORM_GET, 0, module_info->ifname, module_info->iftype);
if (link) {
g_assert(nmtstp_link_is_iptunnel_special(link));
/* An interface with this name exists. While technically this could not be the interface
* generated by the kernel module, in our test netns we can assume that it is. This is
* good enough. */
result = TRUE;
goto out;
}
/* Try to load the module. It probably won't work, because we don't have permissions.
* Ignore any failure. */
nmp_utils_modprobe(NULL, TRUE, module_info->module_name, NULL);
if (nm_streq(module_name, "ip_gre")) {
link = nmtstp_link_gre_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkGre){
.local = nmtst_inet4_from_string("192.168.233.204"),
.remote = nmtst_inet4_from_string("172.168.10.25"),
.parent_ifindex = 0,
.ttl = 174,
.tos = 37,
.path_mtu_discovery = TRUE,
}));
} else if (nm_streq(module_name, "ipip")) {
link = nmtstp_link_ipip_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkIpIp){
.local = nmtst_inet4_from_string("1.2.3.4"),
.remote = nmtst_inet4_from_string("5.6.7.8"),
.parent_ifindex = 0,
.tos = 32,
.path_mtu_discovery = FALSE,
}));
} else if (nm_streq(module_name, "ip6_tunnel")) {
link = nmtstp_link_ip6tnl_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkIp6Tnl){
.local = nmtst_inet6_from_string("fd01::15"),
.remote = nmtst_inet6_from_string("fd01::16"),
.tclass = 20,
.encap_limit = 6,
.flow_label = 1337,
.proto = IPPROTO_IPV6,
}));
} else if (nm_streq(module_name, "ip6_gre")) {
link = nmtstp_link_ip6gre_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkIp6Tnl){
.local = nmtst_inet6_from_string("fd01::42"),
.remote = nmtst_inet6_from_string("fd01::aaaa"),
.tclass = 21,
.flow_label = 1338,
.is_gre = TRUE,
}));
} else if (nm_streq(module_name, "sit")) {
link = nmtstp_link_sit_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkSit){
.local = nmtst_inet4_from_string("192.168.200.1"),
.remote = nmtst_inet4_from_string("172.25.100.14"),
.ttl = 0,
.tos = 31,
.path_mtu_discovery = FALSE,
}));
} else if (nm_streq(module_name, "ip_vti")) {
link = nmtstp_link_vti_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkVti){
.local = nmtst_inet4_from_string("192.168.212.204"),
.remote = nmtst_inet4_from_string("172.168.11.25"),
.ikey = 12,
.okey = 13,
}));
} else if (nm_streq(module_name, "ip6_vti")) {
link = nmtstp_link_vti6_add(NULL,
EX,
test_ifname,
&((const NMPlatformLnkVti6){
.local = nmtst_inet6_from_string("fd01::1"),
.remote = nmtst_inet6_from_string("fd02::2"),
.ikey = 13,
.okey = 14,
}));
} else
g_error("%s:%d: Module name \"%s\" not implemented!", __FILE__, __LINE__, module_name);
if (!link) {
/* We might be unable to add the interface, if the kernel module does not exist.
* Be graceful about that. */
ifindex = 0;
g_assert(!nmtstp_link_get_typed(NM_PLATFORM_GET, 0, test_ifname, module_info->iftype));
g_assert(
!nmtstp_link_get_typed(NM_PLATFORM_GET, 0, module_info->ifname, module_info->iftype));
} else {
ifindex = link->ifindex;
g_assert(link);
g_assert(
link
== nmtstp_link_get_typed(NM_PLATFORM_GET, ifindex, test_ifname, module_info->iftype));
nmtstp_link_delete(NULL, -1, link->ifindex, test_ifname, TRUE);
link = nmtstp_link_get_typed(NM_PLATFORM_GET, 0, module_info->ifname, module_info->iftype);
g_assert(nmtstp_link_is_iptunnel_special(link));
}
result = ifindex > 0 ? 1 : -1;
out:
if (!g_atomic_int_compare_and_exchange(&module_state[i_module_info], 0, result))
goto again;
if (!result) {
/* The function aims to be graceful about missing kernel modules. */
/* g_error("Failure to ensure module \"%s\"", module_name); */
}
return result;
}
void
nmtstp_assert_platform(NMPlatform *platform, guint32 obj_type_flags)
{
@ -2061,11 +2360,11 @@ nmtstp_link_gre_add(NMPlatform *platform,
obj = lnk->is_tap ? "link" : "tunnel";
type = lnk->is_tap ? "type gretap" : "mode gre";
success = !nmtstp_run_command("ip %s add %s %s %s local %s remote %s ttl %u tos %02x %s",
success = !nmtstp_run_command("ip %s add %s %s%s%s local %s remote %s ttl %u tos %02x %s",
obj,
name,
type,
dev ?: "",
NM_PRINT_FMT_QUOTED2(dev, " ", dev, ""),
nm_inet4_ntop(lnk->local, b1),
nm_inet4_ntop(lnk->remote, b2),
lnk->ttl,
@ -2127,11 +2426,11 @@ nmtstp_link_ip6tnl_add(NMPlatform *platform,
tclass_inherit = NM_FLAGS_HAS(lnk->flags, IP6_TNL_F_USE_ORIG_TCLASS);
success = !nmtstp_run_command(
"ip -6 tunnel add %s mode %s %s local %s remote %s ttl %u tclass %s encaplimit %s "
"ip -6 tunnel add %s mode %s%s%s local %s remote %s ttl %u tclass %s encaplimit %s "
"flowlabel %x",
name,
mode,
dev,
NM_PRINT_FMT_QUOTED2(dev, " ", dev, ""),
nm_inet6_ntop(&lnk->local, b1),
nm_inet6_ntop(&lnk->remote, b2),
lnk->ttl,
@ -2178,10 +2477,10 @@ nmtstp_link_ip6gre_add(NMPlatform *platform,
tclass_inherit = NM_FLAGS_HAS(lnk->flags, IP6_TNL_F_USE_ORIG_TCLASS);
success = !nmtstp_run_command(
"ip link add %s type %s %s local %s remote %s ttl %u tclass %s flowlabel %x",
"ip link add %s type %s%s%s local %s remote %s ttl %u tclass %s flowlabel %x",
name,
lnk->is_tap ? "ip6gretap" : "ip6gre",
dev,
NM_PRINT_FMT_QUOTED2(dev, " ", dev, ""),
nm_inet6_ntop(&lnk->local, b1),
nm_inet6_ntop(&lnk->remote, b2),
lnk->ttl,
@ -2232,9 +2531,9 @@ nmtstp_link_ipip_add(NMPlatform *platform,
g_strdup_printf("dev %s", nm_platform_link_get_name(platform, lnk->parent_ifindex));
success = !nmtstp_run_command(
"ip tunnel add %s mode ipip %s local %s remote %s ttl %u tos %02x %s",
"ip tunnel add %s mode ipip%s%s local %s remote %s ttl %u tos %02x %s",
name,
dev,
NM_PRINT_FMT_QUOTED2(dev, " ", dev, ""),
nm_inet4_ntop(lnk->local, b1),
nm_inet4_ntop(lnk->remote, b2),
lnk->ttl,

View file

@ -530,6 +530,10 @@ void nmtstp_link_delete(NMPlatform *platform,
const char *name,
gboolean require_exist);
gboolean nmtstp_link_is_iptunnel_special(const NMPlatformLink *link);
gboolean nmtstp_ensure_module(const char *module_name);
/*****************************************************************************/
#define nmtst_object_new_mptcp_addr(...) \

View file

@ -1290,6 +1290,7 @@ test_software_detect(gconstpointer user_data)
NMPlatformLnkVti lnk_vti = {};
NMPlatformLnkVti6 lnk_vti6 = {};
nm_auto_close int tun_fd = -1;
gboolean module_loaded;
nmtstp_run_command_check("ip link add %s type dummy", PARENT_NAME);
ifindex_parent =
@ -1330,8 +1331,7 @@ test_software_detect(gconstpointer user_data)
break;
case NM_LINK_TYPE_GRE:
{
gboolean gracefully_skip = FALSE;
module_loaded = nmtstp_ensure_module("ip_gre");
lnk_gre.local = nmtst_inet4_from_string("192.168.233.204");
lnk_gre.remote = nmtst_inet4_from_string("172.168.10.25");
@ -1340,13 +1340,8 @@ test_software_detect(gconstpointer user_data)
lnk_gre.tos = 37;
lnk_gre.path_mtu_discovery = TRUE;
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "gre0")) {
/* Seems that the ip_gre module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip_gre", NULL) != 0;
}
if (!nmtstp_link_gre_add(NULL, ext, DEVICE_NAME, &lnk_gre)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip(
"Cannot create gre tunnel because of missing ip_gre module (modprobe ip_gre)");
goto out_delete_parent;
@ -1354,10 +1349,9 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding GRE tunnel");
}
break;
}
case NM_LINK_TYPE_GRETAP:
{
gboolean gracefully_skip = FALSE;
module_loaded = nmtstp_ensure_module("ip_gre");
lnk_gre.local = nmtst_inet4_from_string("192.168.1.133");
lnk_gre.remote = nmtst_inet4_from_string("172.168.101.2");
@ -1367,13 +1361,8 @@ test_software_detect(gconstpointer user_data)
lnk_gre.path_mtu_discovery = FALSE;
lnk_gre.is_tap = TRUE;
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "gretap0")) {
/* Seems that the ip_gre module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip_gre", NULL) != 0;
}
if (!nmtstp_link_gre_add(NULL, ext, DEVICE_NAME, &lnk_gre)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip("Cannot create gretap tunnel because of missing ip_gre module "
"(modprobe ip_gre)");
goto out_delete_parent;
@ -1381,16 +1370,12 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding GRETAP tunnel");
}
break;
}
case NM_LINK_TYPE_IPIP:
{
NMPlatformLnkIpIp lnk_ipip = {};
gboolean gracefully_skip = FALSE;
NMPlatformLnkIpIp lnk_ipip = {};
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "tunl0")) {
/* Seems that the ipip module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ipip", NULL) != 0;
}
module_loaded = nmtstp_ensure_module("ipip");
lnk_ipip.local = nmtst_inet4_from_string("1.2.3.4");
lnk_ipip.remote = nmtst_inet4_from_string("5.6.7.8");
@ -1399,7 +1384,7 @@ test_software_detect(gconstpointer user_data)
lnk_ipip.path_mtu_discovery = FALSE;
if (!nmtstp_link_ipip_add(NULL, ext, DEVICE_NAME, &lnk_ipip)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip(
"Cannot create ipip tunnel because of missing ipip module (modprobe ipip)");
goto out_delete_parent;
@ -1408,15 +1393,12 @@ test_software_detect(gconstpointer user_data)
}
break;
}
case NM_LINK_TYPE_IP6TNL:
{
NMPlatformLnkIp6Tnl lnk_ip6tnl = {};
gboolean gracefully_skip = FALSE;
NMPlatformLnkIp6Tnl lnk_ip6tnl = {};
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "ip6tnl0")) {
/* Seems that the ip6_tunnel module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip6_tunnel", NULL) != 0;
}
module_loaded = nmtstp_ensure_module("ip6_tunnel");
switch (test_data->test_mode) {
case 0:
@ -1441,7 +1423,7 @@ test_software_detect(gconstpointer user_data)
}
if (!nmtstp_link_ip6tnl_add(NULL, ext, DEVICE_NAME, &lnk_ip6tnl)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip("Cannot create ip6tnl tunnel because of missing ip6_tunnel module "
"(modprobe ip6_tunnel)");
goto out_delete_parent;
@ -1450,15 +1432,12 @@ test_software_detect(gconstpointer user_data)
}
break;
}
case NM_LINK_TYPE_IP6GRE:
{
NMPlatformLnkIp6Tnl lnk_ip6tnl = {};
gboolean gracefully_skip = FALSE;
NMPlatformLnkIp6Tnl lnk_ip6tnl = {};
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "ip6gre0")) {
/* Seems that the ip6_tunnel module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip6_gre", NULL) != 0;
}
module_loaded = nmtstp_ensure_module("ip6_gre");
lnk_ip6tnl.local = nmtst_inet6_from_string("fd01::42");
lnk_ip6tnl.remote = nmtst_inet6_from_string("fd01::aaaa");
@ -1468,7 +1447,7 @@ test_software_detect(gconstpointer user_data)
lnk_ip6tnl.is_gre = TRUE;
if (!nmtstp_link_ip6gre_add(NULL, ext, DEVICE_NAME, &lnk_ip6tnl)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip("Cannot create ip6gre tunnel because of missing ip6_gre module "
"(modprobe ip6_gre)");
goto out_delete_parent;
@ -1477,15 +1456,12 @@ test_software_detect(gconstpointer user_data)
}
break;
}
case NM_LINK_TYPE_IP6GRETAP:
{
NMPlatformLnkIp6Tnl lnk_ip6tnl = {};
gboolean gracefully_skip = FALSE;
NMPlatformLnkIp6Tnl lnk_ip6tnl = {};
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "ip6gre0")) {
/* Seems that the ip6_tunnel module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip6_gre", NULL) != 0;
}
module_loaded = nmtstp_ensure_module("ip6_gre");
lnk_ip6tnl.local = nmtst_inet6_from_string("fe80::abcd");
lnk_ip6tnl.remote = nmtst_inet6_from_string("fc01::bbbb");
@ -1497,7 +1473,7 @@ test_software_detect(gconstpointer user_data)
lnk_ip6tnl.is_tap = TRUE;
if (!nmtstp_link_ip6gre_add(NULL, ext, DEVICE_NAME, &lnk_ip6tnl)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip("Cannot create ip6gretap tunnel because of missing ip6_gre module "
"(modprobe ip6_gre)");
goto out_delete_parent;
@ -1506,6 +1482,7 @@ test_software_detect(gconstpointer user_data)
}
break;
}
case NM_LINK_TYPE_MACVLAN:
{
NMPlatformLnkMacvlan lnk_macvlan = {};
@ -1539,6 +1516,7 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding MACVLAN interface");
break;
}
case NM_LINK_TYPE_MACVTAP:
{
NMPlatformLnkMacvlan lnk_macvtap = {};
@ -1551,10 +1529,12 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding MACVTAP interface");
break;
}
case NM_LINK_TYPE_SIT:
{
NMPlatformLnkSit lnk_sit = {};
gboolean gracefully_skip = FALSE;
NMPlatformLnkSit lnk_sit = {};
module_loaded = nmtstp_ensure_module("sit");
lnk_sit.local = nmtst_inet4_from_string("192.168.200.1");
lnk_sit.remote = nmtst_inet4_from_string("172.25.100.14");
@ -1563,13 +1543,8 @@ test_software_detect(gconstpointer user_data)
lnk_sit.tos = 31;
lnk_sit.path_mtu_discovery = FALSE;
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "sit0")) {
/* Seems that the sit module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "sit", NULL) != 0;
}
if (!nmtstp_link_sit_add(NULL, ext, DEVICE_NAME, &lnk_sit)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip(
"Cannot create sit tunnel because of missing sit module (modprobe sit)");
goto out_delete_parent;
@ -1578,6 +1553,7 @@ test_software_detect(gconstpointer user_data)
}
break;
}
case NM_LINK_TYPE_VLAN:
{
NMPlatformLnkVlan lnk_vlan = {};
@ -1601,6 +1577,7 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding VLAN interface");
break;
}
case NM_LINK_TYPE_VRF:
{
NMPlatformLnkVrf lnk_vrf = {};
@ -1617,14 +1594,9 @@ test_software_detect(gconstpointer user_data)
}
break;
}
case NM_LINK_TYPE_VTI:
{
gboolean gracefully_skip = FALSE;
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "ip_vti0")) {
/* Seems that the ip_vti module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip_vti", NULL) != 0;
}
case NM_LINK_TYPE_VTI:
module_loaded = nmtstp_ensure_module("ip_vti");
lnk_vti.local = nmtst_inet4_from_string("192.168.212.204");
lnk_vti.remote = nmtst_inet4_from_string("172.168.11.25");
@ -1633,7 +1605,7 @@ test_software_detect(gconstpointer user_data)
lnk_vti.okey = 13;
if (!nmtstp_link_vti_add(NULL, ext, DEVICE_NAME, &lnk_vti)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip(
"Cannot create vti tunnel because of missing vti module (modprobe ip_vti)");
goto out_delete_parent;
@ -1641,15 +1613,9 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding VTI tunnel");
}
break;
}
case NM_LINK_TYPE_VTI6:
{
gboolean gracefully_skip = FALSE;
if (!nm_platform_link_get_by_ifname(NM_PLATFORM_GET, "ip6_vti0")) {
/* Seems that the ip6_vti module is not loaded... try to load it. */
gracefully_skip = nmp_utils_modprobe(NULL, TRUE, "ip6_vti", NULL) != 0;
}
case NM_LINK_TYPE_VTI6:
module_loaded = nmtstp_ensure_module("ip6_vti");
lnk_vti6.local = nmtst_inet6_from_string("fd01::1");
lnk_vti6.remote = nmtst_inet6_from_string("fd02::2");
@ -1658,7 +1624,7 @@ test_software_detect(gconstpointer user_data)
lnk_vti6.okey = 14;
if (!nmtstp_link_vti6_add(NULL, ext, DEVICE_NAME, &lnk_vti6)) {
if (gracefully_skip) {
if (!module_loaded) {
g_test_skip(
"Cannot create vti6 tunnel because of missing vti module (modprobe ip_vti)");
goto out_delete_parent;
@ -1666,7 +1632,7 @@ test_software_detect(gconstpointer user_data)
g_error("Failed adding VTI6 tunnel");
}
break;
}
case NM_LINK_TYPE_VXLAN:
{
NMPlatformLnkVxlan lnk_vxlan = {};
@ -1698,6 +1664,7 @@ test_software_detect(gconstpointer user_data)
g_assert(nmtstp_link_vxlan_add(NULL, ext, DEVICE_NAME, &lnk_vxlan));
break;
}
case NM_LINK_TYPE_TUN:
{
gboolean owner_valid = nmtst_get_rand_bool();
@ -1732,6 +1699,7 @@ test_software_detect(gconstpointer user_data)
(!lnk_tun.persist || nmtst_get_rand_bool()) ? &tun_fd : NULL));
break;
}
case NM_LINK_TYPE_WIREGUARD:
{
const NMPlatformLink *link;

View file

@ -2262,7 +2262,7 @@ test_cache_consistency_routes(gconstpointer test_data)
if (s) {
if (nmtst_get_rand_bool()) {
s = nm_streq(s, "kernel") ? nmtst_rand_select_str("boot", "static", "ra")
: nmtst_rand_select_str("babel", "bgp");
: nmtst_rand_select_str("zebra", "bird");
}
extra_options[n_extra_options++] = "proto";
extra_options[n_extra_options++] = s;

View file

@ -339,6 +339,10 @@ test_l3cfg(gconstpointer test_data)
_LOGD("test start (/l3cfg/%d)", TEST_IDX);
/* FIXME: https://bugzilla.redhat.com/show_bug.cgi?id=2165141 */
g_test_skip("Skip: this test is currently known to fail (rhbz#2165141)");
return;
if (nmtst_test_quick()) {
gs_free char *msg =
g_strdup_printf("Skipping test: don't run long running test %s (NMTST_DEBUG=slow)\n",

View file

@ -772,6 +772,12 @@ nmtst_init(int *argc, char ***argv, gboolean assert_logging)
static inline gboolean
nmtst_is_debug(void)
{
/* This is based on the "debug"/"no-debug" flag in "$NMTST_DEBUG".
*
* If debugging is enabled, print more information. However, make sure
* that the test behaves still in a similar manner and that the same code
* path are taken where it matters (it matters for example, if the code path
* consumes random numbers). */
g_assert(nmtst_initialized());
return __nmtst_internal.is_debug;
}

View file

@ -1889,6 +1889,11 @@ class TestNmcli(NmTestBase):
@skip_without_pexpect
@nm_test
def test_monitor(self):
# FIXME: this test is currently known to fail. Skip it.
# https://bugzilla.redhat.com/show_bug.cgi?id=2154288
raise unittest.SkipTest("test is known to randomly fail (rhbz#2154288)")
def start_mon():
nmc = self.call_nmcli_pexpect(["monitor"])
nmc.expect("NetworkManager is running")