]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
tests: qemu: Add helper code to lookup latest capability file
authorPeter Krempa <pkrempa@redhat.com>
Wed, 18 Apr 2018 08:47:31 +0000 (10:47 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 19 Apr 2018 09:20:34 +0000 (11:20 +0200)
The helper iterates the directory with files for the capability test and
looks up the most recent one for the given architecture. This will allow
testing against the newest qemu capabilities so that we can catch
regressions in behaviour more easily.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
tests/testutilsqemu.c
tests/testutilsqemu.h

index 9671a46f125d9277308ba68deae64ecb12456667..3222d7864cf1e033d1dfe4b79611df072118af5d 100644 (file)
@@ -674,3 +674,66 @@ testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
 }
 
 #endif
+
+
+char *
+testQemuGetLatestCapsForArch(const char *dirname,
+                             const char *arch,
+                             const char *suffix)
+{
+    struct dirent *ent;
+    DIR *dir = NULL;
+    int rc;
+    char *fullsuffix = NULL;
+    char *tmp = NULL;
+    unsigned long maxver = 0;
+    unsigned long ver;
+    const char *maxname = NULL;
+    char *ret = NULL;
+
+    if (virAsprintf(&fullsuffix, "%s.%s", arch, suffix) < 0)
+        goto cleanup;
+
+    if (virDirOpen(&dir, dirname) < 0)
+        goto cleanup;
+
+    while ((rc = virDirRead(dir, &ent, dirname)) > 0) {
+        VIR_FREE(tmp);
+
+        if ((rc = VIR_STRDUP(tmp, STRSKIP(ent->d_name, "caps_"))) < 0)
+            goto cleanup;
+
+        if (rc == 0)
+            continue;
+
+        if (virFileStripSuffix(tmp, fullsuffix) != 1)
+            continue;
+
+        if (virParseVersionString(tmp, &ver, false) < 0) {
+            VIR_TEST_DEBUG("skipping caps file '%s'\n", ent->d_name);
+            continue;
+        }
+
+        if (ver > maxver) {
+            maxname = ent->d_name;
+            maxver = ver;
+        }
+    }
+
+    if (rc < 0)
+        goto cleanup;
+
+    if (!maxname) {
+        VIR_TEST_VERBOSE("failed to find capabilities for '%s' in '%s'\n",
+                         arch, dirname);
+        goto cleanup;
+    }
+
+    ignore_value(virAsprintf(&ret, "%s/%s", dirname, maxname));
+
+ cleanup:
+    VIR_FREE(tmp);
+    VIR_FREE(fullsuffix);
+    virDirClose(&dir);
+    return ret;
+}
index 7ae8324933d72e11dff36c28c1666e366aabe701..efb1baeadd42d1519b3dc18ee90613e1e852a909 100644 (file)
@@ -39,4 +39,9 @@ int qemuTestCapsCacheInsert(virFileCachePtr cache,
 
 int testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
                        int gic);
+
+char *testQemuGetLatestCapsForArch(const char *dirname,
+                                   const char *arch,
+                                   const char *suffix);
+
 #endif