qemuxml2argvtest.c 30.8 KB
Newer Older
1
#include <config.h>
2

3
#include <stdio.h>
4 5
#include <stdlib.h>
#include <unistd.h>
6 7 8 9 10
#include <string.h>

#include <sys/types.h>
#include <fcntl.h>

11 12
#ifdef WITH_QEMU

13 14
# include "internal.h"
# include "testutils.h"
15
# include "util/memory.h"
16 17
# include "qemu/qemu_capabilities.h"
# include "qemu/qemu_command.h"
M
Matthias Bolte 已提交
18
# include "qemu/qemu_domain.h"
19
# include "datatypes.h"
20
# include "cpu/cpu_map.h"
21

22
# include "testutilsqemu.h"
23

24
static const char *abs_top_srcdir;
25
static struct qemud_driver driver;
26

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
static unsigned char *
fakeSecretGetValue(virSecretPtr obj ATTRIBUTE_UNUSED,
                   size_t *value_size,
                   unsigned int fakeflags ATTRIBUTE_UNUSED,
                   unsigned int internalFlags ATTRIBUTE_UNUSED)
{
    char *secret = strdup("AQCVn5hO6HzFAhAAq0NCv8jtJcIcE+HOBlMQ1A");
    *value_size = strlen(secret);
    return (unsigned char *) secret;
}

static virSecretPtr
fakeSecretLookupByUsage(virConnectPtr conn,
                        int usageType ATTRIBUTE_UNUSED,
                        const char *usageID)
{
    virSecretPtr ret = NULL;
    int err;
    if (STRNEQ(usageID, "mycluster_myname"))
        return NULL;
    err = VIR_ALLOC(ret);
    if (err < 0)
        return NULL;
    ret->magic = VIR_SECRET_MAGIC;
    ret->refs = 1;
    ret->usageID = strdup(usageID);
S
Stefan Berger 已提交
53 54
    if (!ret->usageID) {
        VIR_FREE(ret);
55
        return NULL;
S
Stefan Berger 已提交
56
    }
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
    ret->conn = conn;
    conn->refs++;
    return ret;
}

static int
fakeSecretClose(virConnectPtr conn ATTRIBUTE_UNUSED)
{
    return 0;
}

static virSecretDriver fakeSecretDriver = {
    .name = "fake_secret",
    .open = NULL,
    .close = fakeSecretClose,
    .numOfSecrets = NULL,
    .listSecrets = NULL,
    .lookupByUUID = NULL,
    .lookupByUsage = fakeSecretLookupByUsage,
    .defineXML = NULL,
    .getXMLDesc = NULL,
    .setValue = NULL,
    .getValue = fakeSecretGetValue,
    .undefine = NULL,
};

83
static int testCompareXMLToArgvFiles(const char *xml,
E
Eric Blake 已提交
84
                                     const char *cmdline,
85
                                     virBitmapPtr extraFlags,
J
Jiri Denemark 已提交
86
                                     const char *migrateFrom,
87
                                     int migrateFd,
88
                                     bool json,
89 90
                                     bool expectError,
                                     bool expectFailure)
91 92
{
    char *expectargv = NULL;
E
Eric Blake 已提交
93
    int len;
94
    char *actualargv = NULL;
E
Eric Blake 已提交
95
    int ret = -1;
96
    virDomainDefPtr vmdef = NULL;
97
    virDomainChrSourceDef monitor_chr;
98
    virConnectPtr conn;
J
Jiri Denemark 已提交
99
    char *log = NULL;
100
    char *emulator = NULL;
E
Eric Blake 已提交
101
    virCommandPtr cmd = NULL;
102 103

    if (!(conn = virGetConnect()))
104
        goto out;
105
    conn->secretDriver = &fakeSecretDriver;
106

107
    if (!(vmdef = virDomainDefParseFile(driver.caps, xml,
M
Matthias Bolte 已提交
108
                                        QEMU_EXPECTED_VIRT_TYPES,
109
                                        VIR_DOMAIN_XML_INACTIVE)))
110
        goto out;
111

112 113 114 115 116 117 118 119 120 121 122 123
    /*
     * For test purposes, we may want to fake emulator's output by providing
     * our own script instead of a real emulator. For this to work we need to
     * specify a relative path in <emulator/> element, which, however, is not
     * allowed by RelaxNG schema for domain XML. To work around it we add an
     * extra '/' at the beginning of relative emulator path so that it looks
     * like, e.g., "/./qemu.sh" or "/../emulator/qemu.sh" instead of
     * "./qemu.sh" or "../emulator/qemu.sh" respectively. The following code
     * detects such paths, strips the extra '/' and makes the path absolute.
     */
    if (vmdef->emulator && STRPREFIX(vmdef->emulator, "/.")) {
        if (!(emulator = strdup(vmdef->emulator + 1)))
124
            goto out;
125
        VIR_FREE(vmdef->emulator);
126 127 128
        vmdef->emulator = NULL;
        if (virAsprintf(&vmdef->emulator, "%s/qemuxml2argvdata/%s",
                        abs_srcdir, emulator) < 0)
129
            goto out;
130 131
    }

132
    if (qemuCapsGet(extraFlags, QEMU_CAPS_DOMID))
133
        vmdef->id = 6;
134
    else
135
        vmdef->id = -1;
136

137
    memset(&monitor_chr, 0, sizeof(monitor_chr));
138 139 140
    monitor_chr.type = VIR_DOMAIN_CHR_TYPE_UNIX;
    monitor_chr.data.nix.path = (char *)"/tmp/test-monitor";
    monitor_chr.data.nix.listen = true;
141

142 143 144
    qemuCapsSetList(extraFlags,
                    QEMU_CAPS_VNC_COLON,
                    QEMU_CAPS_NO_REBOOT,
145
                    QEMU_CAPS_NO_ACPI,
146
                    QEMU_CAPS_LAST);
147

148
    if (qemudCanonicalizeMachine(&driver, vmdef) < 0)
149
        goto out;
150

151
    if (qemuCapsGet(extraFlags, QEMU_CAPS_DEVICE)) {
152
        qemuDomainPCIAddressSetPtr pciaddrs;
153 154 155 156

        if (qemuDomainAssignSpaprVIOAddresses(vmdef)) {
            if (expectError)
                goto ok;
157
            goto out;
158 159
        }

160
        if (!(pciaddrs = qemuDomainPCIAddressSetCreate(vmdef)))
161
            goto out;
162 163

        if (qemuAssignDevicePCISlots(vmdef, pciaddrs) < 0)
164
            goto out;
165 166 167 168

        qemuDomainPCIAddressSetFree(pciaddrs);
    }

169 170
    log = virtTestLogContentAndReset();
    VIR_FREE(log);
171
    virResetLastError();
J
Jiri Denemark 已提交
172

173
    /* We do not call qemuCapsExtractVersionInfo() before calling
174
     * qemuBuildCommandLine(), so we should set QEMU_CAPS_PCI_MULTIBUS for
175 176 177 178
     * x86_64 and i686 architectures here.
     */
    if (STREQLEN(vmdef->os.arch, "x86_64", 6) ||
        STREQLEN(vmdef->os.arch, "i686", 4)) {
179
        qemuCapsSet(extraFlags, QEMU_CAPS_PCI_MULTIBUS);
180 181
    }

182
    if (qemuAssignDeviceAliases(vmdef, extraFlags) < 0)
183
        goto out;
184

185
    if (!(cmd = qemuBuildCommandLine(conn, &driver,
186
                                     vmdef, &monitor_chr, json, extraFlags,
187
                                     migrateFrom, migrateFd, NULL,
188 189 190 191 192 193 194 195 196 197 198
                                     VIR_NETDEV_VPORT_PROFILE_OP_NO_OP))) {
        if (expectFailure) {
            ret = 0;
            virResetLastError();
        }
        goto out;
    } else if (expectFailure) {
        if (virTestGetDebug())
            fprintf(stderr, "qemuBuildCommandLine should have failed\n");
        goto out;
    }
199

200 201
    if (!!virGetLastError() != expectError) {
        if (virTestGetDebug() && (log = virtTestLogContentAndReset()))
J
Jiri Denemark 已提交
202
            fprintf(stderr, "\n%s", log);
203
        goto out;
J
Jiri Denemark 已提交
204 205
    }

E
Eric Blake 已提交
206
    if (!(actualargv = virCommandToString(cmd)))
207
        goto out;
E
Eric Blake 已提交
208 209 210 211 212 213

    if (emulator) {
        /* Skip the abs_srcdir portion of replacement emulator.  */
        char *start_skip = strstr(actualargv, abs_srcdir);
        char *end_skip = strstr(actualargv, emulator);
        if (!start_skip || !end_skip)
214
            goto out;
E
Eric Blake 已提交
215
        memmove(start_skip, end_skip, strlen(end_skip) + 1);
216 217
    }

218 219 220 221 222 223
    len = virtTestLoadFile(cmdline, &expectargv);
    if (len < 0)
        goto out;
    if (len && expectargv[len - 1] == '\n')
        expectargv[len - 1] = '\0';

224 225
    if (STRNEQ(expectargv, actualargv)) {
        virtTestDifference(stderr, expectargv, actualargv);
226
        goto out;
227 228
    }

229 230 231 232 233 234
 ok:
    if (expectError) {
        /* need to suppress the errors */
        virResetLastError();
    }

235 236
    ret = 0;

237
out:
238 239 240 241
    VIR_FREE(log);
    VIR_FREE(emulator);
    VIR_FREE(expectargv);
    VIR_FREE(actualargv);
E
Eric Blake 已提交
242
    virCommandFree(cmd);
243
    virDomainDefFree(vmdef);
244
    virUnrefConnect(conn);
245 246 247 248
    return ret;
}


249 250
struct testInfo {
    const char *name;
251
    virBitmapPtr extraFlags;
252
    const char *migrateFrom;
253
    int migrateFd;
J
Jiri Denemark 已提交
254
    bool expectError;
255
    bool expectFailure;
256 257
};

258 259 260 261
static int
testCompareXMLToArgvHelper(const void *data)
{
    int result = -1;
262
    const struct testInfo *info = data;
263 264 265 266 267 268 269 270 271 272
    char *xml = NULL;
    char *args = NULL;

    if (virAsprintf(&xml, "%s/qemuxml2argvdata/qemuxml2argv-%s.xml",
                    abs_srcdir, info->name) < 0 ||
        virAsprintf(&args, "%s/qemuxml2argvdata/qemuxml2argv-%s.args",
                    abs_srcdir, info->name) < 0)
        goto cleanup;

    result = testCompareXMLToArgvFiles(xml, args, info->extraFlags,
273
                                       info->migrateFrom, info->migrateFd,
E
Eric Blake 已提交
274 275
                                       qemuCapsGet(info->extraFlags,
                                                   QEMU_CAPS_MONITOR_JSON),
276 277
                                       info->expectError,
                                       info->expectFailure);
278 279

cleanup:
280 281
    VIR_FREE(xml);
    VIR_FREE(args);
282
    return result;
283 284 285 286
}



287
static int
E
Eric Blake 已提交
288
mymain(void)
289 290
{
    int ret = 0;
291
    char *map = NULL;
292

293 294 295 296
    abs_top_srcdir = getenv("abs_top_srcdir");
    if (!abs_top_srcdir)
        abs_top_srcdir = "..";

297 298
    if ((driver.caps = testQemuCapsInit()) == NULL)
        return EXIT_FAILURE;
299 300 301 302 303
    if ((driver.stateDir = strdup("/nowhere")) == NULL)
        return EXIT_FAILURE;
    if ((driver.hugetlbfs_mount = strdup("/dev/hugepages")) == NULL)
        return EXIT_FAILURE;
    if ((driver.hugepage_path = strdup("/dev/hugepages/libvirt/qemu")) == NULL)
304
        return EXIT_FAILURE;
305 306 307 308 309
    driver.spiceTLS = 1;
    if (!(driver.spiceTLSx509certdir = strdup("/etc/pki/libvirt-spice")))
        return EXIT_FAILURE;
    if (!(driver.spicePassword = strdup("123456")))
        return EXIT_FAILURE;
310 311
    if (virAsprintf(&map, "%s/src/cpu/cpu_map.xml", abs_top_srcdir) < 0 ||
        cpuMapOverride(map) < 0) {
312
        VIR_FREE(map);
313
        return EXIT_FAILURE;
314
    }
315

316 317
# define DO_TEST_FULL(name, migrateFrom, migrateFd,                     \
                      expectError, expectFailure, ...)                  \
318
    do {                                                                \
319
        static struct testInfo info = {                                 \
320 321
            name, NULL, migrateFrom, migrateFd,                         \
            expectError, expectFailure                                  \
J
Jiri Denemark 已提交
322
        };                                                              \
323 324 325
        if (!(info.extraFlags = qemuCapsNew()))                         \
            return EXIT_FAILURE;                                        \
        qemuCapsSetList(info.extraFlags, __VA_ARGS__, QEMU_CAPS_LAST);  \
326 327 328
        if (virtTestRun("QEMU XML-2-ARGV " name,                        \
                        1, testCompareXMLToArgvHelper, &info) < 0)      \
            ret = -1;                                                   \
329
        qemuCapsFree(info.extraFlags);                                  \
330 331
    } while (0)

332
# define DO_TEST(name, expectError, ...)                                \
333 334 335 336
    DO_TEST_FULL(name, NULL, -1, expectError, false, __VA_ARGS__)

# define DO_TEST_FAILURE(name, ...)                                     \
    DO_TEST_FULL(name, NULL, -1, false, true, __VA_ARGS__)
337 338

# define NONE QEMU_CAPS_LAST
339

340 341 342
    /* Unset or set all envvars here that are copied in qemudBuildCommandLine
     * using ADD_ENV_COPY, otherwise these tests may fail due to unexpected
     * values for these envvars */
343 344 345 346 347 348 349
    setenv("PATH", "/bin", 1);
    setenv("USER", "test", 1);
    setenv("LOGNAME", "test", 1);
    setenv("HOME", "/home/test", 1);
    unsetenv("TMPDIR");
    unsetenv("LD_PRELOAD");
    unsetenv("LD_LIBRARY_PATH");
350 351
    unsetenv("QEMU_AUDIO_DRV");
    unsetenv("SDL_AUDIODRIVER");
352

353 354 355 356 357 358 359
    DO_TEST("minimal", false, QEMU_CAPS_NAME);
    DO_TEST("machine-aliases1", false, NONE);
    DO_TEST("machine-aliases2", true, NONE);
    DO_TEST("boot-cdrom", false, NONE);
    DO_TEST("boot-network", false, NONE);
    DO_TEST("boot-floppy", false, NONE);
    DO_TEST("boot-multi", false, QEMU_CAPS_BOOT_MENU);
360 361 362 363 364
    DO_TEST("boot-menu-enable", false,
            QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE);
    DO_TEST("boot-menu-enable", false,
            QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
            QEMU_CAPS_BOOTINDEX);
365
    DO_TEST("boot-menu-disable", false, QEMU_CAPS_BOOT_MENU);
366 367 368 369 370
    DO_TEST("boot-menu-disable-drive", false,
            QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE);
    DO_TEST("boot-menu-disable-drive-bootindex", false,
            QEMU_CAPS_BOOT_MENU, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE,
            QEMU_CAPS_BOOTINDEX);
371
    DO_TEST("boot-order", false,
372 373
            QEMU_CAPS_BOOTINDEX, QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE,
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
374
    DO_TEST("boot-complex", false,
375 376
            QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT,
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
377 378
    DO_TEST("boot-complex-bootindex", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT,
379 380
            QEMU_CAPS_BOOTINDEX,
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
381
    DO_TEST("bootloader", true, QEMU_CAPS_DOMID);
M
Michal Privoznik 已提交
382
    DO_TEST("bios", false, QEMU_CAPS_DEVICE, QEMU_CAPS_SGA);
383 384
    DO_TEST("clock-utc", false, NONE);
    DO_TEST("clock-localtime", false, NONE);
385 386
    /*
     * Can't be enabled since the absolute timestamp changes every time
387
    DO_TEST("clock-variable", false, QEMU_CAPS_RTC);
388
    */
389
    DO_TEST("clock-france", false, QEMU_CAPS_RTC);
390 391 392
    DO_TEST("cpu-kvmclock", false, QEMU_CAPS_ENABLE_KVM);
    DO_TEST("cpu-host-kvmclock", false, QEMU_CAPS_ENABLE_KVM, QEMU_CAPS_CPU_HOST);
    DO_TEST("kvmclock", false, QEMU_CAPS_KVM);
393 394 395 396

    DO_TEST("hugepages", false, QEMU_CAPS_MEM_PATH);
    DO_TEST("disk-cdrom", false, NONE);
    DO_TEST("disk-cdrom-empty", false, QEMU_CAPS_DRIVE);
397 398 399
    DO_TEST("disk-cdrom-tray", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_TX_ALG);
    DO_TEST("disk-cdrom-tray-no-device-cap", false, NONE);
400
    DO_TEST("disk-floppy", false, NONE);
401 402 403
    DO_TEST("disk-floppy-tray-no-device-cap", false, NONE);
    DO_TEST("disk-floppy-tray", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE);
404 405
    DO_TEST("disk-many", false, NONE);
    DO_TEST("disk-virtio", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
406
    DO_TEST("disk-order", false,
407 408
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_DRIVE_BOOT,
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
    DO_TEST("disk-xenvbd", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
    DO_TEST("disk-drive-boot-disk", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
    DO_TEST("disk-drive-boot-cdrom", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT);
    DO_TEST("floppy-drive-fat", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-fat", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-readonly-disk", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_READONLY,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("disk-drive-readonly-no-device", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_READONLY, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("disk-drive-fmt-qcow", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-shared", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT, QEMU_CAPS_DRIVE_SERIAL);
    DO_TEST("disk-drive-cache-v1-wt", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-cache-v1-wb", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-cache-v1-none", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-error-policy-stop", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT);
435 436
    DO_TEST("disk-drive-error-policy-enospace", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT);
437 438
    DO_TEST("disk-drive-error-policy-wreport-rignore", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_DRIVE_FORMAT);
439 440 441 442 443 444
    DO_TEST("disk-drive-cache-v2-wt", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-cache-v2-wb", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-cache-v2-none", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
445 446 447
    DO_TEST("disk-drive-cache-directsync", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2,
            QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC, QEMU_CAPS_DRIVE_FORMAT);
448 449 450
    DO_TEST("disk-drive-cache-unsafe", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2,
            QEMU_CAPS_DRIVE_CACHE_UNSAFE, QEMU_CAPS_DRIVE_FORMAT);
451 452 453 454 455 456
    DO_TEST("disk-drive-network-nbd", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-network-rbd", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
    DO_TEST("disk-drive-network-sheepdog", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
457 458
    DO_TEST("disk-drive-network-rbd-auth", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_FORMAT);
459 460
    DO_TEST("disk-drive-no-boot", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_BOOTINDEX);
461 462 463 464 465 466 467
    DO_TEST("disk-usb", false, NONE);
    DO_TEST("disk-usb-device", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("disk-scsi-device", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("disk-scsi-device-auto", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
468 469 470
    DO_TEST("disk-scsi-disk-split", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_SCSI_CD);
471 472 473 474
    DO_TEST("disk-scsi-vscsi", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("disk-scsi-virtio-scsi", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
J
Jim Fehlig 已提交
475 476 477
    DO_TEST("disk-sata-device", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE,
            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_ICH9_AHCI);
478 479 480
    DO_TEST("disk-aio", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_AIO,
            QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
481 482
    DO_TEST("disk-ioeventfd", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_VIRTIO_IOEVENTFD,
483
            QEMU_CAPS_VIRTIO_TX_ALG, QEMU_CAPS_DEVICE,
O
Osier Yang 已提交
484 485 486 487
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
    DO_TEST("disk-copy_on_read", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_COPY_ON_READ,
            QEMU_CAPS_VIRTIO_TX_ALG, QEMU_CAPS_DEVICE,
488
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
489 490
    DO_TEST("disk-snapshot", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_CACHE_V2, QEMU_CAPS_DRIVE_FORMAT);
491 492 493 494
    DO_TEST("event_idx", false,
            QEMU_CAPS_DRIVE,
            QEMU_CAPS_VIRTIO_BLK_EVENT_IDX,
            QEMU_CAPS_VIRTIO_NET_EVENT_IDX,
495 496 497 498 499 500
            QEMU_CAPS_DEVICE,
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
    DO_TEST("virtio-lun", false,
            QEMU_CAPS_DRIVE,
            QEMU_CAPS_DEVICE,
            QEMU_CAPS_VIRTIO_BLK_SCSI, QEMU_CAPS_VIRTIO_BLK_SG_IO);
501 502 503 504
    DO_TEST("disk-scsi-lun-passthrough", false,
            QEMU_CAPS_DRIVE,
            QEMU_CAPS_DEVICE,
            QEMU_CAPS_SCSI_BLOCK, QEMU_CAPS_VIRTIO_BLK_SG_IO);
505

506 507
    DO_TEST("graphics-vnc", false, NONE);
    DO_TEST("graphics-vnc-socket", false, NONE);
508 509 510

    driver.vncSASL = 1;
    driver.vncSASLdir = strdup("/root/.sasl2");
511
    DO_TEST("graphics-vnc-sasl", false, QEMU_CAPS_VGA);
512 513 514
    driver.vncTLS = 1;
    driver.vncTLSx509verify = 1;
    driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu");
515
    DO_TEST("graphics-vnc-tls", false, NONE);
516
    driver.vncSASL = driver.vncTLSx509verify = driver.vncTLS = 0;
517 518
    VIR_FREE(driver.vncSASLdir);
    VIR_FREE(driver.vncTLSx509certdir);
519 520
    driver.vncSASLdir = driver.vncTLSx509certdir = NULL;

521 522 523 524 525 526 527 528
    DO_TEST("graphics-sdl", false, NONE);
    DO_TEST("graphics-sdl-fullscreen", false, NONE);
    DO_TEST("nographics", false, QEMU_CAPS_VGA);
    DO_TEST("nographics-vga", false,
            QEMU_CAPS_VGA, QEMU_CAPS_VGA_NONE);
    DO_TEST("graphics-spice", false,
            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE);
P
Peng Zhou 已提交
529 530
    DO_TEST("graphics-spice-agentmouse", false,
            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
531 532 533
            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE,
            QEMU_CAPS_CHARDEV_SPICEVMC,
            QEMU_CAPS_NODEFCONFIG);
534 535 536
    DO_TEST("graphics-spice-compression", false,
            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE);
537 538 539 540 541
    DO_TEST("graphics-spice-timeout", false,
            QEMU_CAPS_DRIVE,
            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE,
            QEMU_CAPS_DEVICE_QXL_VGA);
542 543 544 545
    DO_TEST("graphics-spice-qxl-vga", false,
            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE,
            QEMU_CAPS_DEVICE_QXL_VGA);
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561

    DO_TEST("input-usbmouse", false, NONE);
    DO_TEST("input-usbtablet", false, NONE);
    DO_TEST("input-xen", true, QEMU_CAPS_DOMID);
    DO_TEST("misc-acpi", false, NONE);
    DO_TEST("misc-no-reboot", false, NONE);
    DO_TEST("misc-uuid", false, QEMU_CAPS_NAME, QEMU_CAPS_UUID);
    DO_TEST("net-user", false, NONE);
    DO_TEST("net-virtio", false, NONE);
    DO_TEST("net-virtio-device", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_VIRTIO_TX_ALG);
    DO_TEST("net-virtio-netdev", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NETDEV, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("net-eth", false, NONE);
    DO_TEST("net-eth-ifname", false, NONE);
    DO_TEST("net-eth-names", false, QEMU_CAPS_NET_NAME);
562 563 564
    DO_TEST("net-client", false, NONE);
    DO_TEST("net-server", false, NONE);
    DO_TEST("net-mcast", false, NONE);
565 566
    DO_TEST("net-hostdev", false,
            QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606

    DO_TEST("serial-vc", false, NONE);
    DO_TEST("serial-pty", false, NONE);
    DO_TEST("serial-dev", false, NONE);
    DO_TEST("serial-file", false, NONE);
    DO_TEST("serial-unix", false, NONE);
    DO_TEST("serial-tcp", false, NONE);
    DO_TEST("serial-udp", false, NONE);
    DO_TEST("serial-tcp-telnet", false, NONE);
    DO_TEST("serial-many", false, NONE);
    DO_TEST("parallel-tcp", false, NONE);
    DO_TEST("console-compat", false, NONE);
    DO_TEST("console-compat-auto", false, NONE);

    DO_TEST("serial-vc-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-pty-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-dev-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-file-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-unix-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-tcp-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-udp-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-tcp-telnet-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("serial-many-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("parallel-tcp-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("console-compat-chardev", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);

    DO_TEST("channel-guestfwd", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("channel-virtio", false,
607
            QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
608
    DO_TEST("channel-virtio-auto", false,
609
            QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
610
    DO_TEST("console-virtio", false,
611 612 613
            QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("console-virtio-many", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_CHARDEV, QEMU_CAPS_NODEFCONFIG);
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636
    DO_TEST("channel-spicevmc", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC);
    DO_TEST("channel-spicevmc-old", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_SPICE, QEMU_CAPS_DEVICE_SPICEVMC);

    DO_TEST("smartcard-host", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED);
    DO_TEST("smartcard-host-certificates", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED);
    DO_TEST("smartcard-passthrough-tcp", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_PASSTHRU);
    DO_TEST("smartcard-passthrough-spicevmc", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_CCID_PASSTHRU, QEMU_CAPS_CHARDEV_SPICEVMC);
    DO_TEST("smartcard-controller", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
            QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_CCID_EMULATED);

637 638 639 640 641
    DO_TEST("usb-controller", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE,
            QEMU_CAPS_NODEFCONFIG);
    DO_TEST("usb-piix3-controller", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_PIIX3_USB_UHCI,
642
            QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_NODEFCONFIG);
643 644 645
    DO_TEST("usb-ich9-ehci-addr", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1);
646 647
    DO_TEST("input-usbmouse-addr", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
648 649 650
    DO_TEST("usb-ich9-companion", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_ICH9_USB_EHCI1);
M
Marc-André Lureau 已提交
651 652 653
    DO_TEST("usb-hub", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_USB_HUB,
            QEMU_CAPS_NODEFCONFIG);
654 655 656
    DO_TEST("usb-ports", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_USB_HUB,
            QEMU_CAPS_NODEFCONFIG);
657 658 659
    DO_TEST("usb-redir", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB,
660 661
            QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR,
            QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC);
662 663 664 665
    DO_TEST("usb1-usb2", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_PIIX3_USB_UHCI,
            QEMU_CAPS_USB_HUB, QEMU_CAPS_ICH9_USB_EHCI1);
666

667 668 669 670 671 672 673 674 675 676 677 678
    DO_TEST("smbios", false, QEMU_CAPS_SMBIOS_TYPE);

    DO_TEST("watchdog", false, NONE);
    DO_TEST("watchdog-device", false, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("watchdog-dump", false, NONE);
    DO_TEST("balloon-device", false, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("balloon-device-auto", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("sound", false, NONE);
    DO_TEST("sound-device", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_HDA_DUPLEX);
    DO_TEST("fs9p", false,
679 680
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_FSDEV,
            QEMU_CAPS_FSDEV_WRITEOUT);
681 682 683 684 685 686 687

    DO_TEST("hostdev-usb-address", false, NONE);
    DO_TEST("hostdev-usb-address-device", false,
            QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("hostdev-pci-address", false, QEMU_CAPS_PCIDEVICE);
    DO_TEST("hostdev-pci-address-device", false,
            QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
688 689 690
    DO_TEST("pci-rom", false,
            QEMU_CAPS_PCIDEVICE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_PCI_ROMBAR);
691

692
    DO_TEST_FULL("restore-v1", "stdio", 7, false, false,
693
            QEMU_CAPS_MIGRATE_KVM_STDIO);
694
    DO_TEST_FULL("restore-v2", "stdio", 7, false, false,
695
            QEMU_CAPS_MIGRATE_QEMU_EXEC);
696
    DO_TEST_FULL("restore-v2", "exec:cat", 7, false, false,
697
            QEMU_CAPS_MIGRATE_QEMU_EXEC);
698
    DO_TEST_FULL("restore-v2-fd", "stdio", 7, false, false,
699
            QEMU_CAPS_MIGRATE_QEMU_FD);
700
    DO_TEST_FULL("restore-v2-fd", "fd:7", 7, false, false,
701
            QEMU_CAPS_MIGRATE_QEMU_FD);
702
    DO_TEST_FULL("migrate", "tcp:10.0.0.1:5000", -1, false, false,
703 704 705 706 707 708 709 710 711 712 713 714 715
            QEMU_CAPS_MIGRATE_QEMU_TCP);

    DO_TEST("qemu-ns", false, NONE);

    DO_TEST("smp", false, QEMU_CAPS_SMP_TOPOLOGY);

    DO_TEST("cpu-topology1", false, QEMU_CAPS_SMP_TOPOLOGY);
    DO_TEST("cpu-topology2", false, QEMU_CAPS_SMP_TOPOLOGY);
    DO_TEST("cpu-topology3", false, NONE);
    DO_TEST("cpu-minimum1", false, NONE);
    DO_TEST("cpu-minimum2", false, NONE);
    DO_TEST("cpu-exact1", false, NONE);
    DO_TEST("cpu-exact2", false, NONE);
716 717 718
    DO_TEST("cpu-exact2-nofallback", false, NONE);
    DO_TEST("cpu-fallback", false, NONE);
    DO_TEST_FAILURE("cpu-nofallback", NONE);
719
    DO_TEST("cpu-strict1", false, NONE);
B
Bharata B Rao 已提交
720 721
    DO_TEST("cpu-numa1", false, NONE);
    DO_TEST("cpu-numa2", false, QEMU_CAPS_SMP_TOPOLOGY);
722 723 724 725 726 727 728
    DO_TEST("cpu-host-model", false, NONE);
    DO_TEST("cpu-host-model-fallback", false, NONE);
    DO_TEST_FAILURE("cpu-host-model-nofallback", NONE);
    DO_TEST("cpu-host-passthrough", false, QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST);
    DO_TEST_FAILURE("cpu-host-passthrough", NONE);
    DO_TEST_FAILURE("cpu-qemu-host-passthrough",
                    QEMU_CAPS_KVM, QEMU_CAPS_CPU_HOST);
729 730 731

    DO_TEST("memtune", false, QEMU_CAPS_NAME);
    DO_TEST("blkiotune", false, QEMU_CAPS_NAME);
732
    DO_TEST("blkiotune-device", false, QEMU_CAPS_NAME);
O
Osier Yang 已提交
733
    DO_TEST("cputune", false, QEMU_CAPS_NAME);
734
    DO_TEST("numatune-memory", false, NONE);
L
Lei Li 已提交
735
    DO_TEST("blkdeviotune", false, QEMU_CAPS_NAME, QEMU_CAPS_DEVICE,
736
            QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_IOTUNE);
737

738 739 740 741
    DO_TEST("multifunction-pci-device", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_PCI_MULTIFUNCTION);

742 743
    DO_TEST("monitor-json", false, QEMU_CAPS_DEVICE,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_NODEFCONFIG);
744 745 746
    DO_TEST("no-shutdown", false, QEMU_CAPS_DEVICE,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_MONITOR_JSON, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_NO_SHUTDOWN);
747

748 749
    DO_TEST("seclabel-dynamic", false, QEMU_CAPS_NAME);
    DO_TEST("seclabel-dynamic-baselabel", false, QEMU_CAPS_NAME);
750
    DO_TEST("seclabel-dynamic-override", false, QEMU_CAPS_NAME);
751 752
    DO_TEST("seclabel-static", false, QEMU_CAPS_NAME);
    DO_TEST("seclabel-static-relabel", false, QEMU_CAPS_NAME);
E
Eric Blake 已提交
753
    DO_TEST("seclabel-none", false, QEMU_CAPS_NAME);
754

755 756 757 758 759 760 761 762
    DO_TEST("pseries-basic", false,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("pseries-vio", false, QEMU_CAPS_DRIVE,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("pseries-vio-user-assigned", false, QEMU_CAPS_DRIVE,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
    DO_TEST("pseries-vio-address-clash", true, QEMU_CAPS_DRIVE,
            QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG);
763 764 765
    DO_TEST("disk-ide-drive-split", false,
            QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
            QEMU_CAPS_IDE_CD);
766

767
    VIR_FREE(driver.stateDir);
768
    virCapabilitiesFree(driver.caps);
769
    VIR_FREE(map);
770

771
    return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
772 773
}

774 775
VIRT_TEST_MAIN(mymain)

776
#else
E
Eric Blake 已提交
777
# include "testutils.h"
778

779 780 781 782
int main(void)
{
    return EXIT_AM_SKIP;
}
783 784

#endif /* WITH_QEMU */