311 lines
10 KiB
Diff
311 lines
10 KiB
Diff
|
From: Michal Privoznik <mprivozn@redhat.com>
|
||
|
Date: Wed, 11 Jun 2014 15:05:00 +0200
|
||
|
Subject: [PATCH] Introduce virnetdevtest
|
||
|
|
||
|
This is yet another test for check of basic functionality of our
|
||
|
NIC state handling code.
|
||
|
|
||
|
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
|
||
|
(cherry picked from commit 49ed6cff997bb893dafc805c868c9e772a04696d)
|
||
|
---
|
||
|
src/libvirt_private.syms | 1 +
|
||
|
src/util/virnetdev.c | 4 +-
|
||
|
src/util/virnetdev.h | 5 ++
|
||
|
tests/Makefile.am | 15 ++++
|
||
|
tests/virnetdevmock.c | 48 +++++++++++
|
||
|
tests/virnetdevtest.c | 94 ++++++++++++++++++++++
|
||
|
.../sys/class/net/eth0-broken/operstate | 1 +
|
||
|
.../sys/class/net/eth0-broken/speed | 1 +
|
||
|
.../virnetdevtestdata/sys/class/net/eth0/operstate | 1 +
|
||
|
tests/virnetdevtestdata/sys/class/net/eth0/speed | 1 +
|
||
|
tests/virnetdevtestdata/sys/class/net/lo/operstate | 1 +
|
||
|
tests/virnetdevtestdata/sys/class/net/lo/speed | 1 +
|
||
|
12 files changed, 171 insertions(+), 2 deletions(-)
|
||
|
create mode 100644 tests/virnetdevmock.c
|
||
|
create mode 100644 tests/virnetdevtest.c
|
||
|
create mode 100644 tests/virnetdevtestdata/sys/class/net/eth0-broken/operstate
|
||
|
create mode 100644 tests/virnetdevtestdata/sys/class/net/eth0-broken/speed
|
||
|
create mode 100644 tests/virnetdevtestdata/sys/class/net/eth0/operstate
|
||
|
create mode 100644 tests/virnetdevtestdata/sys/class/net/eth0/speed
|
||
|
create mode 100644 tests/virnetdevtestdata/sys/class/net/lo/operstate
|
||
|
create mode 100644 tests/virnetdevtestdata/sys/class/net/lo/speed
|
||
|
|
||
|
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
|
||
|
index 8653727..9cda39c 100644
|
||
|
--- a/src/libvirt_private.syms
|
||
|
+++ b/src/libvirt_private.syms
|
||
|
@@ -1702,6 +1702,7 @@ virNetDevSetPromiscuous;
|
||
|
virNetDevSetRcvAllMulti;
|
||
|
virNetDevSetRcvMulti;
|
||
|
virNetDevSetupControl;
|
||
|
+virNetDevSysfsFile;
|
||
|
virNetDevValidateConfig;
|
||
|
|
||
|
|
||
|
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
|
||
|
index ebb4c5c..c196d98 100644
|
||
|
--- a/src/util/virnetdev.c
|
||
|
+++ b/src/util/virnetdev.c
|
||
|
@@ -1514,9 +1514,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 0c0f666..d692f94 100644
|
||
|
--- a/src/util/virnetdev.h
|
||
|
+++ b/src/util/virnetdev.h
|
||
|
@@ -203,4 +203,9 @@ 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) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
||
|
+ ATTRIBUTE_RETURN_CHECK;
|
||
|
#endif /* __VIR_NETDEV_H__ */
|
||
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||
|
index 938270c..2dd0088 100644
|
||
|
--- a/tests/Makefile.am
|
||
|
+++ b/tests/Makefile.am
|
||
|
@@ -175,6 +175,7 @@ test_programs = virshtest sockettest \
|
||
|
domainconftest \
|
||
|
virhostdevtest \
|
||
|
vircaps2xmltest \
|
||
|
+ virnetdevtest \
|
||
|
$(NULL)
|
||
|
|
||
|
if WITH_REMOTE
|
||
|
@@ -401,6 +402,7 @@ test_libraries = libshunload.la \
|
||
|
virnetserverclientmock.la \
|
||
|
vircgroupmock.la \
|
||
|
virpcimock.la \
|
||
|
+ virnetdevmock.la \
|
||
|
$(NULL)
|
||
|
if WITH_QEMU
|
||
|
test_libraries += libqemumonitortestutils.la \
|
||
|
@@ -1017,6 +1019,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..a9967b7
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevmock.c
|
||
|
@@ -0,0 +1,48 @@
|
||
|
+/*
|
||
|
+ * Copyright (C) 2015 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@redhat.com>
|
||
|
+ */
|
||
|
+
|
||
|
+#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/sys/class/net"
|
||
|
+
|
||
|
+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..c31543e
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtest.c
|
||
|
@@ -0,0 +1,94 @@
|
||
|
+/*
|
||
|
+ * Copyright (C) 2015 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@redhat.com>
|
||
|
+ */
|
||
|
+
|
||
|
+#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/sys/class/net/eth0-broken/operstate b/tests/virnetdevtestdata/sys/class/net/eth0-broken/operstate
|
||
|
new file mode 100644
|
||
|
index 0000000..eb0e904
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtestdata/sys/class/net/eth0-broken/operstate
|
||
|
@@ -0,0 +1 @@
|
||
|
+down
|
||
|
diff --git a/tests/virnetdevtestdata/sys/class/net/eth0-broken/speed b/tests/virnetdevtestdata/sys/class/net/eth0-broken/speed
|
||
|
new file mode 100644
|
||
|
index 0000000..4f6ff86
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtestdata/sys/class/net/eth0-broken/speed
|
||
|
@@ -0,0 +1 @@
|
||
|
+4294967295
|
||
|
diff --git a/tests/virnetdevtestdata/sys/class/net/eth0/operstate b/tests/virnetdevtestdata/sys/class/net/eth0/operstate
|
||
|
new file mode 100644
|
||
|
index 0000000..e31ee94
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtestdata/sys/class/net/eth0/operstate
|
||
|
@@ -0,0 +1 @@
|
||
|
+up
|
||
|
diff --git a/tests/virnetdevtestdata/sys/class/net/eth0/speed b/tests/virnetdevtestdata/sys/class/net/eth0/speed
|
||
|
new file mode 100644
|
||
|
index 0000000..83b33d2
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtestdata/sys/class/net/eth0/speed
|
||
|
@@ -0,0 +1 @@
|
||
|
+1000
|
||
|
diff --git a/tests/virnetdevtestdata/sys/class/net/lo/operstate b/tests/virnetdevtestdata/sys/class/net/lo/operstate
|
||
|
new file mode 100644
|
||
|
index 0000000..3546645
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtestdata/sys/class/net/lo/operstate
|
||
|
@@ -0,0 +1 @@
|
||
|
+unknown
|
||
|
diff --git a/tests/virnetdevtestdata/sys/class/net/lo/speed b/tests/virnetdevtestdata/sys/class/net/lo/speed
|
||
|
new file mode 100644
|
||
|
index 0000000..573541a
|
||
|
--- /dev/null
|
||
|
+++ b/tests/virnetdevtestdata/sys/class/net/lo/speed
|
||
|
@@ -0,0 +1 @@
|
||
|
+0
|