6d3351
From e3f778f53a39635ac34e498219c2d08fee52d0b0 Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <e3f778f53a39635ac34e498219c2d08fee52d0b0@dist-git>
6d3351
From: Andrea Bolognani <abologna@redhat.com>
6d3351
Date: Mon, 17 Jul 2017 12:09:02 +0200
6d3351
Subject: [PATCH] tests: Mock IOMMU groups
6d3351
6d3351
Later on we're going to need access to information about IOMMU
6d3351
groups for host devices. Implement the support in virpcimock,
6d3351
and start using that mock library in a few QEMU test cases.
6d3351
6d3351
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
6d3351
Reviewed-by: Laine Stump <laine@laine.org>
6d3351
(cherry picked from commit dd9b29dad8ec3d5372ee5e857ab0922fecb26718)
6d3351
6d3351
Conflicts:
6d3351
6d3351
  * tests/qemumemlocktest.c,
6d3351
    tests/qemuxml2argvtest.c:
6d3351
6d3351
    caused by commit 4ceac4bf2931fb70ac1af4f9568c31d41959e8ce,
6d3351
    which changed the name of the macro formerly known as
6d3351
    VIRT_TEST_MAIN_PRELOAD(), being missing;
6d3351
6d3351
  * tests/qemuxml2xmltest.c:
6d3351
6d3351
    in addition to the same conflict as above, we also have
6d3351
    to reintroduce the use of qemuxml2xmlmock because commit
6d3351
    2a13a0a103340878b05a5ae0b9f454721f67dbb3, which removed
6d3351
    it from the test suite, has not been backported.
6d3351
6d3351
Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1431193
6d3351
6d3351
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
6d3351
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
6d3351
---
6d3351
 tests/qemumemlocktest.c  | 21 ++++++++++++++++++++-
6d3351
 tests/qemuxml2argvtest.c | 21 ++++++++++++++++++++-
6d3351
 tests/qemuxml2xmltest.c  | 22 +++++++++++++++++++++-
6d3351
 tests/virpcimock.c       | 43 +++++++++++++++++++++++++++++++++++++------
6d3351
 4 files changed, 98 insertions(+), 9 deletions(-)
6d3351
6d3351
diff --git a/tests/qemumemlocktest.c b/tests/qemumemlocktest.c
6d3351
index 48b0565d68..ea25cd9a66 100644
6d3351
--- a/tests/qemumemlocktest.c
6d3351
+++ b/tests/qemumemlocktest.c
6d3351
@@ -56,11 +56,25 @@ testCompareMemLock(const void *data)
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
+# define FAKEROOTDIRTEMPLATE abs_builddir "/fakerootdir-XXXXXX"
6d3351
 
6d3351
 static int
6d3351
 mymain(void)
6d3351
 {
6d3351
     int ret = 0;
6d3351
+    char *fakerootdir;
6d3351
+
6d3351
+    if (VIR_STRDUP_QUIET(fakerootdir, FAKEROOTDIRTEMPLATE) < 0) {
6d3351
+        fprintf(stderr, "Out of memory\n");
6d3351
+        abort();
6d3351
+    }
6d3351
+
6d3351
+    if (!mkdtemp(fakerootdir)) {
6d3351
+        fprintf(stderr, "Cannot create fakerootdir");
6d3351
+        abort();
6d3351
+    }
6d3351
+
6d3351
+    setenv("LIBVIRT_FAKE_ROOT_DIR", fakerootdir, 1);
6d3351
 
6d3351
     abs_top_srcdir = getenv("abs_top_srcdir");
6d3351
     if (!abs_top_srcdir)
6d3351
@@ -124,12 +138,17 @@ mymain(void)
6d3351
     DO_TEST("pseries-hardlimit+locked+hostdev", 2147483648);
6d3351
     DO_TEST("pseries-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
6d3351
 
6d3351
+    if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
6d3351
+        virFileDeleteTree(fakerootdir);
6d3351
+
6d3351
     qemuTestDriverFree(&driver);
6d3351
+    VIR_FREE(fakerootdir);
6d3351
 
6d3351
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
6d3351
 }
6d3351
 
6d3351
-VIRT_TEST_MAIN(mymain)
6d3351
+VIRT_TEST_MAIN_PRELOAD(mymain,
6d3351
+                       abs_builddir "/.libs/virpcimock.so")
6d3351
 
6d3351
 #else
6d3351
 
6d3351
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
6d3351
index d4afaef06e..2a0b0ce954 100644
6d3351
--- a/tests/qemuxml2argvtest.c
6d3351
+++ b/tests/qemuxml2argvtest.c
6d3351
@@ -542,13 +542,27 @@ testCompareXMLToArgv(const void *data)
6d3351
     return ret;
6d3351
 }
6d3351
 
6d3351
+# define FAKEROOTDIRTEMPLATE abs_builddir "/fakerootdir-XXXXXX"
6d3351
 
6d3351
 static int
6d3351
 mymain(void)
6d3351
 {
6d3351
     int ret = 0;
6d3351
+    char *fakerootdir;
6d3351
     bool skipLegacyCPUs = false;
6d3351
 
6d3351
+    if (VIR_STRDUP_QUIET(fakerootdir, FAKEROOTDIRTEMPLATE) < 0) {
6d3351
+        fprintf(stderr, "Out of memory\n");
6d3351
+        abort();
6d3351
+    }
6d3351
+
6d3351
+    if (!mkdtemp(fakerootdir)) {
6d3351
+        fprintf(stderr, "Cannot create fakerootdir");
6d3351
+        abort();
6d3351
+    }
6d3351
+
6d3351
+    setenv("LIBVIRT_FAKE_ROOT_DIR", fakerootdir, 1);
6d3351
+
6d3351
     abs_top_srcdir = getenv("abs_top_srcdir");
6d3351
     if (!abs_top_srcdir)
6d3351
         abs_top_srcdir = abs_srcdir "/..";
6d3351
@@ -2672,7 +2686,11 @@ mymain(void)
6d3351
     DO_TEST_PARSE_ERROR("cpu-cache-passthrough3", QEMU_CAPS_KVM);
6d3351
     DO_TEST_PARSE_ERROR("cpu-cache-passthrough-l3", QEMU_CAPS_KVM);
6d3351
 
6d3351
+    if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
6d3351
+        virFileDeleteTree(fakerootdir);
6d3351
+
6d3351
     qemuTestDriverFree(&driver);
6d3351
+    VIR_FREE(fakerootdir);
6d3351
 
6d3351
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
6d3351
 }
6d3351
@@ -2680,7 +2698,8 @@ mymain(void)
6d3351
 VIRT_TEST_MAIN_PRELOAD(mymain,
6d3351
                        abs_builddir "/.libs/qemuxml2argvmock.so",
6d3351
                        abs_builddir "/.libs/virrandommock.so",
6d3351
-                       abs_builddir "/.libs/qemucpumock.so")
6d3351
+                       abs_builddir "/.libs/qemucpumock.so",
6d3351
+                       abs_builddir "/.libs/virpcimock.so")
6d3351
 
6d3351
 #else
6d3351
 
6d3351
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
6d3351
index d026bdfa68..95f053faa7 100644
6d3351
--- a/tests/qemuxml2xmltest.c
6d3351
+++ b/tests/qemuxml2xmltest.c
6d3351
@@ -307,14 +307,28 @@ testInfoSet(struct testInfo *info,
6d3351
     return -1;
6d3351
 }
6d3351
 
6d3351
+# define FAKEROOTDIRTEMPLATE abs_builddir "/fakerootdir-XXXXXX"
6d3351
 
6d3351
 static int
6d3351
 mymain(void)
6d3351
 {
6d3351
     int ret = 0;
6d3351
+    char *fakerootdir;
6d3351
     struct testInfo info;
6d3351
     virQEMUDriverConfigPtr cfg = NULL;
6d3351
 
6d3351
+    if (VIR_STRDUP_QUIET(fakerootdir, FAKEROOTDIRTEMPLATE) < 0) {
6d3351
+        fprintf(stderr, "Out of memory\n");
6d3351
+        abort();
6d3351
+    }
6d3351
+
6d3351
+    if (!mkdtemp(fakerootdir)) {
6d3351
+        fprintf(stderr, "Cannot create fakerootdir");
6d3351
+        abort();
6d3351
+    }
6d3351
+
6d3351
+    setenv("LIBVIRT_FAKE_ROOT_DIR", fakerootdir, 1);
6d3351
+
6d3351
     memset(&info, 0, sizeof(info));
6d3351
 
6d3351
     if (qemuTestDriverInit(&driver) < 0)
6d3351
@@ -1142,12 +1156,18 @@ mymain(void)
6d3351
     DO_TEST("cpu-check-default-partial", NONE);
6d3351
     DO_TEST("cpu-check-default-partial2", NONE);
6d3351
 
6d3351
+    if (getenv("LIBVIRT_SKIP_CLEANUP") == NULL)
6d3351
+        virFileDeleteTree(fakerootdir);
6d3351
+
6d3351
     qemuTestDriverFree(&driver);
6d3351
+    VIR_FREE(fakerootdir);
6d3351
 
6d3351
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
6d3351
 }
6d3351
 
6d3351
-VIRT_TEST_MAIN_PRELOAD(mymain, abs_builddir "/.libs/qemuxml2xmlmock.so")
6d3351
+VIRT_TEST_MAIN_PRELOAD(mymain,
6d3351
+                       abs_builddir "/.libs/qemuxml2xmlmock.so",
6d3351
+                       abs_builddir "/.libs/virpcimock.so")
6d3351
 
6d3351
 #else
6d3351
 
6d3351
diff --git a/tests/virpcimock.c b/tests/virpcimock.c
6d3351
index e9408aa0ae..1112a7215d 100644
6d3351
--- a/tests/virpcimock.c
6d3351
+++ b/tests/virpcimock.c
6d3351
@@ -127,6 +127,7 @@ struct pciDevice {
6d3351
     int vendor;
6d3351
     int device;
6d3351
     int class;
6d3351
+    int iommuGroup;
6d3351
     struct pciDriver *driver;   /* Driver attached. NULL if attached to no driver */
6d3351
 };
6d3351
 
6d3351
@@ -190,6 +191,22 @@ make_file(const char *path,
6d3351
     VIR_FREE(filepath);
6d3351
 }
6d3351
 
6d3351
+static void
6d3351
+make_symlink(const char *path,
6d3351
+          const char *name,
6d3351
+          const char *target)
6d3351
+{
6d3351
+    char *filepath = NULL;
6d3351
+
6d3351
+    if (virAsprintfQuiet(&filepath, "%s/%s", path, name) < 0)
6d3351
+        ABORT_OOM();
6d3351
+
6d3351
+    if (symlink(target, filepath) < 0)
6d3351
+        ABORT("Unable to create symlink filepath -> target");
6d3351
+
6d3351
+    VIR_FREE(filepath);
6d3351
+}
6d3351
+
6d3351
 static int
6d3351
 pci_read_file(const char *path,
6d3351
               char *buf,
6d3351
@@ -322,7 +339,7 @@ pci_device_new_from_stub(const struct pciDevice *data)
6d3351
     char *id;
6d3351
     char *c;
6d3351
     char *configSrc;
6d3351
-    char tmp[32];
6d3351
+    char tmp[256];
6d3351
     struct stat sb;
6d3351
 
6d3351
     if (VIR_STRDUP_QUIET(id, data->id) < 0)
6d3351
@@ -386,6 +403,20 @@ pci_device_new_from_stub(const struct pciDevice *data)
6d3351
         ABORT("@tmp overflow");
6d3351
     make_file(devpath, "class", tmp, -1);
6d3351
 
6d3351
+    if (snprintf(tmp, sizeof(tmp),
6d3351
+                 "%s/../../../kernel/iommu_groups/%d",
6d3351
+                 devpath, dev->iommuGroup) < 0) {
6d3351
+        ABORT("@tmp overflow");
6d3351
+    }
6d3351
+    if (virFileMakePath(tmp) < 0)
6d3351
+        ABORT("Unable to create %s", tmp);
6d3351
+
6d3351
+    if (snprintf(tmp, sizeof(tmp),
6d3351
+                 "../../../kernel/iommu_groups/%d", dev->iommuGroup) < 0) {
6d3351
+        ABORT("@tmp overflow");
6d3351
+    }
6d3351
+    make_symlink(devpath, "iommu_group", tmp);
6d3351
+
6d3351
     if (pci_device_autobind(dev) < 0)
6d3351
         ABORT("Unable to bind: %s", data->id);
6d3351
 
6d3351
@@ -821,12 +852,12 @@ init_env(void)
6d3351
     MAKE_PCI_DEVICE("0000:00:02.0", 0x8086, 0x0046);
6d3351
     MAKE_PCI_DEVICE("0000:00:03.0", 0x8086, 0x0048);
6d3351
     MAKE_PCI_DEVICE("0001:00:00.0", 0x1014, 0x03b9, .class = 0x060400);
6d3351
-    MAKE_PCI_DEVICE("0001:01:00.0", 0x8086, 0x105e);
6d3351
-    MAKE_PCI_DEVICE("0001:01:00.1", 0x8086, 0x105e);
6d3351
+    MAKE_PCI_DEVICE("0001:01:00.0", 0x8086, 0x105e, .iommuGroup = 0);
6d3351
+    MAKE_PCI_DEVICE("0001:01:00.1", 0x8086, 0x105e, .iommuGroup = 0);
6d3351
     MAKE_PCI_DEVICE("0005:80:00.0", 0x10b5, 0x8112, .class = 0x060400);
6d3351
-    MAKE_PCI_DEVICE("0005:90:01.0", 0x1033, 0x0035);
6d3351
-    MAKE_PCI_DEVICE("0005:90:01.1", 0x1033, 0x0035);
6d3351
-    MAKE_PCI_DEVICE("0005:90:01.2", 0x1033, 0x00e0);
6d3351
+    MAKE_PCI_DEVICE("0005:90:01.0", 0x1033, 0x0035, .iommuGroup = 1);
6d3351
+    MAKE_PCI_DEVICE("0005:90:01.1", 0x1033, 0x0035, .iommuGroup = 1);
6d3351
+    MAKE_PCI_DEVICE("0005:90:01.2", 0x1033, 0x00e0, .iommuGroup = 1);
6d3351
     MAKE_PCI_DEVICE("0000:0a:01.0", 0x8086, 0x0047);
6d3351
     MAKE_PCI_DEVICE("0000:0a:02.0", 0x8286, 0x0048);
6d3351
     MAKE_PCI_DEVICE("0000:0a:03.0", 0x8386, 0x0048);
6d3351
-- 
6d3351
2.13.3
6d3351