[PATCH v2 05/23] testQemuInfoSetArgs: Always allocate 'info->qemuCaps'

Peter Krempa pkrempa at redhat.com
Tue Aug 17 16:25:06 UTC 2021


Modify the logic so that 'info->qemuCaps' is populated, but empty even
when ARG_QEMU_CAPS was not used. The function still retains the
interlocking of fake caps with real caps.

A lot of the internal code expects qemuCaps to be populated and many
tests work this around by using ARG_QEMU_CAPS with no caps.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 tests/testutilsqemu.c | 44 ++++++++++++++++++++-----------------------
 1 file changed, 20 insertions(+), 24 deletions(-)

diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
index 9a0666724a..32119e30c2 100644
--- a/tests/testutilsqemu.c
+++ b/tests/testutilsqemu.c
@@ -684,7 +684,8 @@ testQemuInfoSetArgs(struct testQemuInfo *info,
 {
     va_list argptr;
     testQemuInfoArgName argname;
-    virQEMUCaps *qemuCaps = NULL;
+    g_autoptr(virQEMUCaps) fakeCaps = virQEMUCapsNew();
+    bool fakeCapsUsed = false;
     int gic = GIC_NONE;
     char *capsarch = NULL;
     char *capsver = NULL;
@@ -692,16 +693,18 @@ testQemuInfoSetArgs(struct testQemuInfo *info,
     int flag;
     int ret = -1;

+    if (!fakeCaps)
+        abort();
+
     va_start(argptr, capslatest);
     argname = va_arg(argptr, testQemuInfoArgName);
     while (argname != ARG_END) {
         switch (argname) {
         case ARG_QEMU_CAPS:
-            if (qemuCaps || !(qemuCaps = virQEMUCapsNew()))
-                goto cleanup;
+            fakeCapsUsed = true;

             while ((flag = va_arg(argptr, int)) < QEMU_CAPS_LAST)
-                virQEMUCapsSet(qemuCaps, flag);
+                virQEMUCapsSet(fakeCaps, flag);

             /* Some tests are run with NONE capabilities, which is just
              * another name for QEMU_CAPS_LAST. If that is the case the
@@ -764,16 +767,16 @@ testQemuInfoSetArgs(struct testQemuInfo *info,
         goto cleanup;
     }

-    if (qemuCaps && (capsarch || capsver)) {
-        fprintf(stderr, "ARG_QEMU_CAPS can not be combined with ARG_CAPS_ARCH "
-                        "or ARG_CAPS_VER\n");
-        goto cleanup;
-    }
-
-    if (!qemuCaps && capsarch && capsver) {
+    if (capsarch && capsver) {
         bool stripmachinealiases = false;
         virQEMUCaps *cachedcaps = NULL;

+        if (fakeCapsUsed) {
+            fprintf(stderr, "ARG_QEMU_CAPS can not be combined with ARG_CAPS_ARCH "
+                    "or ARG_CAPS_VER\n");
+            goto cleanup;
+        }
+
         info->arch = virArchFromString(capsarch);

         if (STREQ(capsver, "latest")) {
@@ -785,40 +788,33 @@ testQemuInfoSetArgs(struct testQemuInfo *info,
         }

         if (!g_hash_table_lookup_extended(capscache, capsfile, NULL, (void **) &cachedcaps)) {
-            if (!(qemuCaps = qemuTestParseCapabilitiesArch(info->arch, capsfile)))
+            if (!(cachedcaps = qemuTestParseCapabilitiesArch(info->arch, capsfile)))
                 goto cleanup;

-            cachedcaps = qemuCaps;
-
-            g_hash_table_insert(capscache, g_strdup(capsfile), g_steal_pointer(&qemuCaps));
+            g_hash_table_insert(capscache, g_strdup(capsfile), cachedcaps);
         }

-        if (!(qemuCaps = virQEMUCapsNewCopy(cachedcaps)))
+        if (!(info->qemuCaps = virQEMUCapsNewCopy(cachedcaps)))
             goto cleanup;

         if (stripmachinealiases)
-            virQEMUCapsStripMachineAliases(qemuCaps);
+            virQEMUCapsStripMachineAliases(info->qemuCaps);

         info->flags |= FLAG_REAL_CAPS;

         /* provide path to the replies file for schema testing */
         capsfile[strlen(capsfile) - 3] = '\0';
         info->schemafile = g_strdup_printf("%sreplies", capsfile);
+    } else {
+        info->qemuCaps = g_steal_pointer(&fakeCaps);
     }

-    if (!qemuCaps) {
-        fprintf(stderr, "No qemuCaps generated\n");
-        goto cleanup;
-    }
-    info->qemuCaps = g_steal_pointer(&qemuCaps);
-
     if (gic != GIC_NONE && testQemuCapsSetGIC(info->qemuCaps, gic) < 0)
         goto cleanup;

     ret = 0;

  cleanup:
-    virObjectUnref(qemuCaps);
     va_end(argptr);

     return ret;
-- 
2.31.1




More information about the libvir-list mailing list