[libvirt] [PATCH v2 1/7] tests: qemu: Add helper code to lookup most recent capability file

Peter Krempa posted 7 patches 7 years ago
[libvirt] [PATCH v2 1/7] tests: qemu: Add helper code to lookup most recent capability file
Posted by Peter Krempa 7 years ago
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 | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/testutilsqemu.h |  5 +++
 2 files changed, 99 insertions(+)

diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
index 9671a46f12..9dbcee6e3b 100644
--- a/tests/testutilsqemu.c
+++ b/tests/testutilsqemu.c
@@ -674,3 +674,97 @@ testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
 }

 #endif
+
+
+static bool
+testQemuCapsIsNewerVersion(char **cur,
+                           char **max)
+{
+    size_t i;
+    int rc;
+
+    for (i = 0; i < 3; i++) {
+        rc = strlen(cur[i]) - strlen(max[i]);
+
+        if (rc > 0)
+            return true;
+
+        if (rc < 0)
+            return false;
+
+        rc = strcmp(cur[i], max[i]);
+
+        if (rc > 0)
+            return true;
+
+        if (rc < 0)
+            return false;
+    }
+
+    return false;
+}
+
+
+char *
+testQemuGetNewestCapsForArch(const char *dirname,
+                             const char *arch,
+                             const char *suffix)
+{
+    struct dirent *ent;
+    int rc;
+    DIR *dir = NULL;
+    char *ret = NULL;
+    const char *tmp;
+    char **max = NULL;
+    size_t nmax = 0;
+    const char *maxname = NULL;
+    char **cur = NULL;
+    size_t ncur = 0;
+
+    if (virDirOpen(&dir, dirname) < 0)
+        goto cleanup;
+
+    while ((rc = virDirRead(dir, &ent, dirname)) > 0) {
+        virStringListFreeCount(cur, ncur);
+        cur = NULL;
+        ncur = 0;
+
+        if (!(tmp = STRSKIP(ent->d_name, "caps_")))
+            continue;
+
+        if (!strstr(tmp, suffix) || !strstr(tmp, arch))
+            continue;
+
+        if (!(cur = virStringSplitCount(tmp, ".", 4, &ncur)))
+            goto cleanup;
+
+        if (ncur != 4) {
+            VIR_TEST_DEBUG("skipping caps file '%s'\n", ent->d_name);
+            continue;
+        }
+
+        if (!max || testQemuCapsIsNewerVersion(cur, max)) {
+            VIR_STEAL_PTR(max, cur);
+            maxname = ent->d_name;
+            nmax = ncur;
+            ncur = 0;
+        }
+    }
+
+    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:
+    virStringListFreeCount(max, nmax);
+    virStringListFreeCount(cur, ncur);
+    virDirClose(&dir);
+    return ret;
+}
diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h
index 7ae8324933..6490db4b95 100644
--- a/tests/testutilsqemu.h
+++ b/tests/testutilsqemu.h
@@ -39,4 +39,9 @@ int qemuTestCapsCacheInsert(virFileCachePtr cache,

 int testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
                        int gic);
+
+char *testQemuGetNewestCapsForArch(const char *dirname,
+                                   const char *arch,
+                                   const char *suffix);
+
 #endif
-- 
2.16.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 1/7] tests: qemu: Add helper code to lookup most recent capability file
Posted by Ján Tomko 7 years ago
On Wed, Apr 18, 2018 at 11:38:41AM +0200, Peter Krempa wrote:
>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 | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/testutilsqemu.h |  5 +++
> 2 files changed, 99 insertions(+)
>
>diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
>index 9671a46f12..9dbcee6e3b 100644
>--- a/tests/testutilsqemu.c
>+++ b/tests/testutilsqemu.c
>@@ -674,3 +674,97 @@ testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
> }
>
> #endif
>+
>+
>+static bool
>+testQemuCapsIsNewerVersion(char **cur,
>+                           char **max)
>+{
>+    size_t i;
>+    int rc;
>+
>+    for (i = 0; i < 3; i++) {
>+        rc = strlen(cur[i]) - strlen(max[i]);
>+
>+        if (rc > 0)
>+            return true;
>+
>+        if (rc < 0)
>+            return false;
>+
>+        rc = strcmp(cur[i], max[i]);
>+
>+        if (rc > 0)
>+            return true;
>+
>+        if (rc < 0)
>+            return false;
>+    }
>+
>+    return false;
>+}
>+
>+
>+char *
>+testQemuGetNewestCapsForArch(const char *dirname,
>+                             const char *arch,
>+                             const char *suffix)
>+{
>+    struct dirent *ent;
>+    int rc;
>+    DIR *dir = NULL;
>+    char *ret = NULL;
>+    const char *tmp;
>+    char **max = NULL;
>+    size_t nmax = 0;
>+    const char *maxname = NULL;
>+    char **cur = NULL;
>+    size_t ncur = 0;
>+
>+    if (virDirOpen(&dir, dirname) < 0)
>+        goto cleanup;
>+
>+    while ((rc = virDirRead(dir, &ent, dirname)) > 0) {
>+        virStringListFreeCount(cur, ncur);
>+        cur = NULL;
>+        ncur = 0;
>+
>+        if (!(tmp = STRSKIP(ent->d_name, "caps_")))
>+            continue;
>+
>+        if (!strstr(tmp, suffix) || !strstr(tmp, arch))
>+            continue;
>+

This helper assumes the prefix is "caps_" but leaves the suffix
configurable.

You can concatenate arch and suffix into some real_suffix, then
1. STRDUP(tmp, STRSKIP( "caps_"))
2. virFileStripSuffix(tmp, real_suffix)
3. Either use virParseVersionString and a plain numeric comparison,
   or import strverscmp from gnulib instead of subjecting the reader
   to testQemuCapsIsNewerVersion.

Jano

>+        if (!(cur = virStringSplitCount(tmp, ".", 4, &ncur)))
>+            goto cleanup;
>+
>+        if (ncur != 4) {
>+            VIR_TEST_DEBUG("skipping caps file '%s'\n", ent->d_name);
>+            continue;
>+        }
>+
>+        if (!max || testQemuCapsIsNewerVersion(cur, max)) {
>+            VIR_STEAL_PTR(max, cur);
>+            maxname = ent->d_name;
>+            nmax = ncur;
>+            ncur = 0;
>+        }
>+    }
>+
>+    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:
>+    virStringListFreeCount(max, nmax);
>+    virStringListFreeCount(cur, ncur);
>+    virDirClose(&dir);
>+    return ret;
>+}
>diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h
>index 7ae8324933..6490db4b95 100644
>--- a/tests/testutilsqemu.h
>+++ b/tests/testutilsqemu.h
>@@ -39,4 +39,9 @@ int qemuTestCapsCacheInsert(virFileCachePtr cache,
>
> int testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
>                        int gic);
>+
>+char *testQemuGetNewestCapsForArch(const char *dirname,
>+                                   const char *arch,
>+                                   const char *suffix);
>+
> #endif
>-- 
>2.16.2
>
>--
>libvir-list mailing list
>libvir-list@redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 1/7] tests: qemu: Add helper code to lookup most recent capability file
Posted by Peter Krempa 7 years ago
On Wed, Apr 18, 2018 at 12:53:55 +0200, Ján Tomko wrote:
> On Wed, Apr 18, 2018 at 11:38:41AM +0200, Peter Krempa wrote:
> > 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 | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > tests/testutilsqemu.h |  5 +++
> > 2 files changed, 99 insertions(+)
> > 
> > diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
> > index 9671a46f12..9dbcee6e3b 100644
> > --- a/tests/testutilsqemu.c
> > +++ b/tests/testutilsqemu.c
> > @@ -674,3 +674,97 @@ testQemuCapsSetGIC(virQEMUCapsPtr qemuCaps,
> > }
> > 
> > #endif
> > +
> > +
> > +static bool
> > +testQemuCapsIsNewerVersion(char **cur,
> > +                           char **max)
> > +{
> > +    size_t i;
> > +    int rc;
> > +
> > +    for (i = 0; i < 3; i++) {
> > +        rc = strlen(cur[i]) - strlen(max[i]);
> > +
> > +        if (rc > 0)
> > +            return true;
> > +
> > +        if (rc < 0)
> > +            return false;
> > +
> > +        rc = strcmp(cur[i], max[i]);
> > +
> > +        if (rc > 0)
> > +            return true;
> > +
> > +        if (rc < 0)
> > +            return false;
> > +    }
> > +
> > +    return false;
> > +}
> > +
> > +
> > +char *
> > +testQemuGetNewestCapsForArch(const char *dirname,
> > +                             const char *arch,
> > +                             const char *suffix)
> > +{
> > +    struct dirent *ent;
> > +    int rc;
> > +    DIR *dir = NULL;
> > +    char *ret = NULL;
> > +    const char *tmp;
> > +    char **max = NULL;
> > +    size_t nmax = 0;
> > +    const char *maxname = NULL;
> > +    char **cur = NULL;
> > +    size_t ncur = 0;
> > +
> > +    if (virDirOpen(&dir, dirname) < 0)
> > +        goto cleanup;
> > +
> > +    while ((rc = virDirRead(dir, &ent, dirname)) > 0) {
> > +        virStringListFreeCount(cur, ncur);
> > +        cur = NULL;
> > +        ncur = 0;
> > +
> > +        if (!(tmp = STRSKIP(ent->d_name, "caps_")))
> > +            continue;
> > +
> > +        if (!strstr(tmp, suffix) || !strstr(tmp, arch))
> > +            continue;
> > +
> 
> This helper assumes the prefix is "caps_" but leaves the suffix
> configurable.

Suffix is configurable for cases when you might want to select the
.replies file instead of the .xml file. This is planned to be used when
I'll want to replace tests/qemuqapischema.json with the newest reply
from the capabilitiestest.

On the other hand, prefix is not really going to change, and if so, it
will need to be fixed.

> You can concatenate arch and suffix into some real_suffix, then
> 1. STRDUP(tmp, STRSKIP( "caps_"))
> 2. virFileStripSuffix(tmp, real_suffix)
> 3. Either use virParseVersionString and a plain numeric comparison,
>   or import strverscmp from gnulib instead of subjecting the reader
>   to testQemuCapsIsNewerVersion.

Okay.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list