This is yet another test for check of basic functionality of our NIC state handling code. Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- src/libvirt_private.syms | 1 + src/util/virnetdev.c | 4 +- src/util/virnetdev.h | 4 ++ tests/Makefile.am | 15 +++++ tests/virnetdevmock.c | 48 ++++++++++++++ tests/virnetdevtest.c | 94 +++++++++++++++++++++++++++ tests/virnetdevtestdata/eth0-broken/operstate | 1 + tests/virnetdevtestdata/eth0-broken/speed | 1 + tests/virnetdevtestdata/eth0/operstate | 1 + tests/virnetdevtestdata/eth0/speed | 1 + tests/virnetdevtestdata/lo/operstate | 1 + tests/virnetdevtestdata/lo/speed | 1 + 12 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 tests/virnetdevmock.c create mode 100644 tests/virnetdevtest.c create mode 100644 tests/virnetdevtestdata/eth0-broken/operstate create mode 100644 tests/virnetdevtestdata/eth0-broken/speed create mode 100644 tests/virnetdevtestdata/eth0/operstate create mode 100644 tests/virnetdevtestdata/eth0/speed create mode 100644 tests/virnetdevtestdata/lo/operstate create mode 100644 tests/virnetdevtestdata/lo/speed diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9f82926..0b42238 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1741,6 +1741,7 @@ virNetDevSetPromiscuous; virNetDevSetRcvAllMulti; virNetDevSetRcvMulti; virNetDevSetupControl; +virNetDevSysfsFile; virNetDevValidateConfig; diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 54d866e..a2d55a8 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -1519,9 +1519,9 @@ int virNetDevValidateConfig(const char *ifname ATTRIBUTE_UNUSED, #ifdef __linux__ # define NET_SYSFS "/sys/class/net/" -static int +int virNetDevSysfsFile(char **pf_sysfs_device_link, const char *ifname, - const char *file) + const char *file) { if (virAsprintf(pf_sysfs_device_link, NET_SYSFS "%s/%s", ifname, file) < 0) diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index 856127b..999a89a 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -219,4 +219,8 @@ int virNetDevSetRcvAllMulti(const char *ifname, bool receive) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; int virNetDevGetRcvAllMulti(const char *ifname, bool *receive) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; +int virNetDevSysfsFile(char **pf_sysfs_device_link, + const char *ifname, + const char *file) + ATTRIBUTE_NONNULL(1); #endif /* __VIR_NETDEV_H__ */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 046cd08..9ebedc3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -176,6 +176,7 @@ test_programs = virshtest sockettest \ domainconftest \ virhostdevtest \ vircaps2xmltest \ + virnetdevtest \ $(NULL) if WITH_REMOTE @@ -402,6 +403,7 @@ test_libraries = libshunload.la \ virnetserverclientmock.la \ vircgroupmock.la \ virpcimock.la \ + virnetdevmock.la \ $(NULL) if WITH_QEMU test_libraries += libqemumonitortestutils.la \ @@ -1029,6 +1031,19 @@ virpcimock_la_LIBADD = $(GNULIB_LIBS) \ virpcimock_la_LDFLAGS = -module -avoid-version \ -rpath /evil/libtool/hack/to/force/shared/lib/creation +virnetdevtest_SOURCES = \ + virnetdevtest.c testutils.h testutils.c +virnetdevtest_CFLAGS = $(AM_CFLAGS) $(LIBNL_CFLAGS) +virnetdevtest_LDADD = $(LDADDS) + +virnetdevmock_la_SOURCES = \ + virnetdevmock.c +virnetdevmock_la_CFLAGS = $(AM_CFLAGS) $(LIBNL_CFLAGS) +virnetdevmock_la_LIBADD = $(GNULIB_LIBS) \ + ../src/libvirt.la +virnetdevmock_la_LDFLAGS = -module -avoid-version \ + -rpath /evil/libtool/hack/to/force/shared/lib/creation + if WITH_LINUX virusbtest_SOURCES = \ virusbtest.c testutils.h testutils.c diff --git a/tests/virnetdevmock.c b/tests/virnetdevmock.c new file mode 100644 index 0000000..681e5fe --- /dev/null +++ b/tests/virnetdevmock.c @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2013 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + * Author: Michal Privoznik <mprivozn@xxxxxxxxxx> + */ + +#include <config.h> + +#ifdef __linux__ +# include "internal.h" +# include <stdlib.h> +# include <stdio.h> +# include "virstring.h" +# include "virnetdev.h" + +# define NET_DEV_TEST_DATA_PREFIX abs_srcdir "/virnetdevtestdata" + +int +virNetDevSysfsFile(char **pf_sysfs_device_link, + const char *ifname, + const char *file) +{ + + if (virAsprintfQuiet(pf_sysfs_device_link, "%s/%s/%s", + NET_DEV_TEST_DATA_PREFIX, ifname, file) < 0) { + fprintf(stderr, "Out of memory\n"); + abort(); + } + + return 0; +} +#else +/* Nothing to override on non-__linux__ platforms */ +#endif diff --git a/tests/virnetdevtest.c b/tests/virnetdevtest.c new file mode 100644 index 0000000..8795bf1 --- /dev/null +++ b/tests/virnetdevtest.c @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2014 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + * Author: Michal Privoznik <mprivozn@xxxxxxxxxx> + */ + +#include <config.h> + +#include "testutils.h" + +#ifdef __linux__ + +# include "virnetdev.h" + +# define VIR_FROM_THIS VIR_FROM_NONE + +struct testVirNetDevGetLinkInfoData { + const char *ifname; /* ifname to get info on */ + virInterfaceState state; /* expected state */ + unsigned int speed; /* expected speed */ +}; + +static int +testVirNetDevGetLinkInfo(const void *opaque) +{ + int ret = -1; + const struct testVirNetDevGetLinkInfoData *data = opaque; + virInterfaceLink lnk; + + if (virNetDevGetLinkInfo(data->ifname, &lnk) < 0) + goto cleanup; + + if (lnk.state != data->state) { + fprintf(stderr, + "Fetched link state (%s) doesn't match the expected one (%s)", + virInterfaceStateTypeToString(lnk.state), + virInterfaceStateTypeToString(data->state)); + goto cleanup; + } + + if (lnk.speed != data->speed) { + fprintf(stderr, + "Fetched link speed (%u) doesn't match the expected one (%u)", + lnk.speed, data->speed); + goto cleanup; + } + + ret = 0; + cleanup: + return ret; +} + +static int +mymain(void) +{ + int ret = 0; + +# define DO_TEST_LINK(ifname, state, speed) \ + do { \ + struct testVirNetDevGetLinkInfoData data = {ifname, state, speed}; \ + if (virtTestRun("Link info: " # ifname, \ + testVirNetDevGetLinkInfo, &data) < 0) \ + ret = -1; \ + } while (0) + + DO_TEST_LINK("eth0", VIR_INTERFACE_STATE_UP, 1000); + DO_TEST_LINK("lo", VIR_INTERFACE_STATE_UNKNOWN, 0); + DO_TEST_LINK("eth0-broken", VIR_INTERFACE_STATE_DOWN, 0); + + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; +} + +VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/virnetdevmock.so") +#else +int +main(void) +{ + return EXIT_AM_SKIP; +} +#endif diff --git a/tests/virnetdevtestdata/eth0-broken/operstate b/tests/virnetdevtestdata/eth0-broken/operstate new file mode 100644 index 0000000..eb0e904 --- /dev/null +++ b/tests/virnetdevtestdata/eth0-broken/operstate @@ -0,0 +1 @@ +down diff --git a/tests/virnetdevtestdata/eth0-broken/speed b/tests/virnetdevtestdata/eth0-broken/speed new file mode 100644 index 0000000..4f6ff86 --- /dev/null +++ b/tests/virnetdevtestdata/eth0-broken/speed @@ -0,0 +1 @@ +4294967295 diff --git a/tests/virnetdevtestdata/eth0/operstate b/tests/virnetdevtestdata/eth0/operstate new file mode 100644 index 0000000..e31ee94 --- /dev/null +++ b/tests/virnetdevtestdata/eth0/operstate @@ -0,0 +1 @@ +up diff --git a/tests/virnetdevtestdata/eth0/speed b/tests/virnetdevtestdata/eth0/speed new file mode 100644 index 0000000..83b33d2 --- /dev/null +++ b/tests/virnetdevtestdata/eth0/speed @@ -0,0 +1 @@ +1000 diff --git a/tests/virnetdevtestdata/lo/operstate b/tests/virnetdevtestdata/lo/operstate new file mode 100644 index 0000000..3546645 --- /dev/null +++ b/tests/virnetdevtestdata/lo/operstate @@ -0,0 +1 @@ +unknown diff --git a/tests/virnetdevtestdata/lo/speed b/tests/virnetdevtestdata/lo/speed new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/virnetdevtestdata/lo/speed @@ -0,0 +1 @@ +0 -- 2.0.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list