[libvirt] [PATCH v2 1/7] tests: qemu: Add helper code to lookup most recent capability file
Ján Tomko
jtomko at redhat.com
Wed Apr 18 10:53:55 UTC 2018
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 at 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 at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180418/e38dea41/attachment-0001.sig>
More information about the libvir-list
mailing list