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

3
#include <stdio.h>
4 5
#include <stdlib.h>
#include <unistd.h>
6
#include <string.h>
J
Jiri Denemark 已提交
7
#include <stdbool.h>
8 9 10 11

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

12 13
#ifdef WITH_QEMU

14 15
# include "internal.h"
# include "testutils.h"
16 17
# include "qemu/qemu_capabilities.h"
# include "qemu/qemu_command.h"
18
# include "datatypes.h"
19
# include "cpu/cpu_map.h"
20

21
# include "testutilsqemu.h"
22

23
static char *progname;
24
static char *abs_srcdir;
25
static const char *abs_top_srcdir;
26
static struct qemud_driver driver;
27

28
# define MAX_FILE 4096
29

30
static int testCompareXMLToArgvFiles(const char *xml,
E
Eric Blake 已提交
31
                                     const char *cmdline,
32
                                     unsigned long long extraFlags,
J
Jiri Denemark 已提交
33
                                     const char *migrateFrom,
34
                                     int migrateFd,
J
Jiri Denemark 已提交
35
                                     bool expectError) {
36 37
    char argvData[MAX_FILE];
    char *expectargv = &(argvData[0]);
E
Eric Blake 已提交
38
    int len;
39
    char *actualargv = NULL;
E
Eric Blake 已提交
40
    int ret = -1;
41
    unsigned long long flags;
42
    virDomainDefPtr vmdef = NULL;
43
    virDomainChrSourceDef monitor_chr;
44
    virConnectPtr conn;
J
Jiri Denemark 已提交
45
    char *log = NULL;
46
    char *emulator = NULL;
E
Eric Blake 已提交
47
    virCommandPtr cmd = NULL;
48 49 50

    if (!(conn = virGetConnect()))
        goto fail;
51

E
Eric Blake 已提交
52 53
    len = virtTestLoadFile(cmdline, &expectargv, MAX_FILE);
    if (len < 0)
54
        goto fail;
E
Eric Blake 已提交
55 56
    if (len && expectargv[len - 1] == '\n')
        expectargv[len - 1] = '\0';
57

58
    if (!(vmdef = virDomainDefParseFile(driver.caps, xml,
59
                                        VIR_DOMAIN_XML_INACTIVE)))
60 61
        goto fail;

62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
    /*
     * 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)))
            goto fail;
        free(vmdef->emulator);
        vmdef->emulator = NULL;
        if (virAsprintf(&vmdef->emulator, "%s/qemuxml2argvdata/%s",
                        abs_srcdir, emulator) < 0)
            goto fail;
    }

82
    if (qemuCapsGet(extraFlags, QEMU_CAPS_DOMID))
83
        vmdef->id = 6;
84
    else
85
        vmdef->id = -1;
86

87
    memset(&monitor_chr, 0, sizeof(monitor_chr));
88 89 90
    monitor_chr.type = VIR_DOMAIN_CHR_TYPE_UNIX;
    monitor_chr.data.nix.path = (char *)"/tmp/test-monitor";
    monitor_chr.data.nix.listen = true;
91

92 93
    flags = QEMU_CAPS_VNC_COLON |
        QEMU_CAPS_NO_REBOOT |
94
        extraFlags;
95

96 97 98
    if (qemudCanonicalizeMachine(&driver, vmdef) < 0)
        goto fail;

99
    if (qemuCapsGet(flags, QEMU_CAPS_DEVICE)) {
100 101 102 103 104 105 106 107 108 109 110
        qemuDomainPCIAddressSetPtr pciaddrs;
        if (!(pciaddrs = qemuDomainPCIAddressSetCreate(vmdef)))
            goto fail;

        if (qemuAssignDevicePCISlots(vmdef, pciaddrs) < 0)
            goto fail;

        qemuDomainPCIAddressSetFree(pciaddrs);
    }


J
Jiri Denemark 已提交
111
    free(virtTestLogContentAndReset());
112
    virResetLastError();
J
Jiri Denemark 已提交
113

114
    /* We do not call qemuCapsExtractVersionInfo() before calling
115
     * qemuBuildCommandLine(), so we should set QEMU_CAPS_PCI_MULTIBUS for
116 117 118 119
     * x86_64 and i686 architectures here.
     */
    if (STREQLEN(vmdef->os.arch, "x86_64", 6) ||
        STREQLEN(vmdef->os.arch, "i686", 4)) {
120
        qemuCapsSet(&flags, QEMU_CAPS_PCI_MULTIBUS);
121 122
    }

123 124
    if (!(cmd = qemuBuildCommandLine(conn, &driver,
                                     vmdef, &monitor_chr, false, flags,
125 126
                                     migrateFrom, migrateFd, NULL,
                                     VIR_VM_OP_CREATE)))
127 128
        goto fail;

129 130
    if (!!virGetLastError() != expectError) {
        if (virTestGetDebug() && (log = virtTestLogContentAndReset()))
J
Jiri Denemark 已提交
131 132 133 134 135 136 137 138 139
            fprintf(stderr, "\n%s", log);
        goto fail;
    }

    if (expectError) {
        /* need to suppress the errors */
        virResetLastError();
    }

E
Eric Blake 已提交
140
    if (!(actualargv = virCommandToString(cmd)))
141
        goto fail;
E
Eric Blake 已提交
142 143 144 145 146 147 148 149

    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)
            goto fail;
        memmove(start_skip, end_skip, strlen(end_skip) + 1);
150 151
    }

152 153
    if (STRNEQ(expectargv, actualargv)) {
        virtTestDifference(stderr, expectargv, actualargv);
154 155 156 157 158 159
        goto fail;
    }

    ret = 0;

 fail:
J
Jiri Denemark 已提交
160
    free(log);
161
    free(emulator);
162
    free(actualargv);
E
Eric Blake 已提交
163
    virCommandFree(cmd);
164
    virDomainDefFree(vmdef);
165
    virUnrefConnect(conn);
166 167 168 169
    return ret;
}


170 171
struct testInfo {
    const char *name;
172
    unsigned long long extraFlags;
173
    const char *migrateFrom;
174
    int migrateFd;
J
Jiri Denemark 已提交
175
    bool expectError;
176 177
};

178
static int testCompareXMLToArgvHelper(const void *data) {
179
    const struct testInfo *info = data;
180 181
    char xml[PATH_MAX];
    char args[PATH_MAX];
182
    snprintf(xml, PATH_MAX, "%s/qemuxml2argvdata/qemuxml2argv-%s.xml",
183
             abs_srcdir, info->name);
184
    snprintf(args, PATH_MAX, "%s/qemuxml2argvdata/qemuxml2argv-%s.args",
185
             abs_srcdir, info->name);
J
Jiri Denemark 已提交
186
    return testCompareXMLToArgvFiles(xml, args, info->extraFlags,
187 188
                                     info->migrateFrom, info->migrateFd,
                                     info->expectError);
189 190 191 192
}



193 194
static int
mymain(int argc, char **argv)
195 196
{
    int ret = 0;
197
    char cwd[PATH_MAX];
198
    char map[PATH_MAX];
199 200 201 202 203

    progname = argv[0];

    if (argc > 1) {
        fprintf(stderr, "Usage: %s\n", progname);
204
        return (EXIT_FAILURE);
205 206
    }

207 208 209
    abs_srcdir = getenv("abs_srcdir");
    if (!abs_srcdir)
        abs_srcdir = getcwd(cwd, sizeof(cwd));
210

211 212 213 214
    abs_top_srcdir = getenv("abs_top_srcdir");
    if (!abs_top_srcdir)
        abs_top_srcdir = "..";

215 216
    if ((driver.caps = testQemuCapsInit()) == NULL)
        return EXIT_FAILURE;
217 218 219 220 221
    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)
222
        return EXIT_FAILURE;
223 224 225 226 227
    driver.spiceTLS = 1;
    if (!(driver.spiceTLSx509certdir = strdup("/etc/pki/libvirt-spice")))
        return EXIT_FAILURE;
    if (!(driver.spicePassword = strdup("123456")))
        return EXIT_FAILURE;
228

229 230 231 232
    snprintf(map, PATH_MAX, "%s/src/cpu/cpu_map.xml", abs_top_srcdir);
    if (cpuMapOverride(map) < 0)
        return EXIT_FAILURE;

233
# define DO_TEST_FULL(name, extraFlags, migrateFrom, migrateFd, expectError) \
234
    do {                                                                \
J
Jiri Denemark 已提交
235
        const struct testInfo info = {                                  \
236
            name, extraFlags, migrateFrom, migrateFd, expectError       \
J
Jiri Denemark 已提交
237
        };                                                              \
238 239 240 241 242
        if (virtTestRun("QEMU XML-2-ARGV " name,                        \
                        1, testCompareXMLToArgvHelper, &info) < 0)      \
            ret = -1;                                                   \
    } while (0)

J
Jiri Denemark 已提交
243
# define DO_TEST(name, extraFlags, expectError)                         \
244
    DO_TEST_FULL(name, extraFlags, NULL, -1, expectError)
245

246 247 248
    /* 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 */
249 250 251 252 253 254 255
    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");
256 257
    unsetenv("QEMU_AUDIO_DRV");
    unsetenv("SDL_AUDIODRIVER");
258

259
    DO_TEST("minimal", QEMU_CAPS_NAME, false);
J
Jiri Denemark 已提交
260 261 262 263 264
    DO_TEST("machine-aliases1", 0, false);
    DO_TEST("machine-aliases2", 0, true);
    DO_TEST("boot-cdrom", 0, false);
    DO_TEST("boot-network", 0, false);
    DO_TEST("boot-floppy", 0, false);
265 266 267 268 269
    DO_TEST("boot-multi", QEMU_CAPS_BOOT_MENU, false);
    DO_TEST("boot-menu-disable", QEMU_CAPS_BOOT_MENU, false);
    DO_TEST("boot-order", QEMU_CAPS_BOOTINDEX |
            QEMU_CAPS_DRIVE | QEMU_CAPS_DEVICE, false);
    DO_TEST("bootloader", QEMU_CAPS_DOMID, true);
J
Jiri Denemark 已提交
270 271
    DO_TEST("clock-utc", 0, false);
    DO_TEST("clock-localtime", 0, false);
272 273
    /*
     * Can't be enabled since the absolute timestamp changes every time
274
    DO_TEST("clock-variable", QEMU_CAPS_RTC, false);
275
    */
276
    DO_TEST("clock-france", QEMU_CAPS_RTC, false);
277

278
    DO_TEST("hugepages", QEMU_CAPS_MEM_PATH, false);
J
Jiri Denemark 已提交
279
    DO_TEST("disk-cdrom", 0, false);
280
    DO_TEST("disk-cdrom-empty", QEMU_CAPS_DRIVE, false);
J
Jiri Denemark 已提交
281 282
    DO_TEST("disk-floppy", 0, false);
    DO_TEST("disk-many", 0, false);
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
    DO_TEST("disk-virtio", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT, false);
    DO_TEST("disk-xenvbd", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT, false);
    DO_TEST("disk-drive-boot-disk", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT, false);
    DO_TEST("disk-drive-boot-cdrom", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT, false);
    DO_TEST("floppy-drive-fat", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT | QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-fat", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT | QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-readonly-disk", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_READONLY | QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("disk-drive-readonly-no-device", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_READONLY | QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("disk-drive-fmt-qcow", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_BOOT | QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-shared", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT | QEMU_CAPS_DRIVE_SERIAL, false);
    DO_TEST("disk-drive-cache-v1-wt", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-cache-v1-wb", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-cache-v1-none", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-error-policy-stop", QEMU_CAPS_DRIVE |
            QEMU_CAPS_MONITOR_JSON |
            QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-cache-v2-wt", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-cache-v2-wb", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-cache-v2-none", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-network-nbd", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-network-rbd", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT, false);
    DO_TEST("disk-drive-network-sheepdog", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DRIVE_FORMAT, false);
J
Jiri Denemark 已提交
325
    DO_TEST("disk-usb", 0, false);
326 327 328 329 330 331 332 333
    DO_TEST("disk-usb-device", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("disk-scsi-device", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("disk-scsi-device-auto", QEMU_CAPS_DRIVE |
            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("disk-aio", QEMU_CAPS_DRIVE | QEMU_CAPS_DRIVE_AIO |
            QEMU_CAPS_DRIVE_CACHE_V2 | QEMU_CAPS_DRIVE_FORMAT, false);
J
Jiri Denemark 已提交
334
    DO_TEST("graphics-vnc", 0, false);
335
    DO_TEST("graphics-vnc-socket", 0, false);
336 337 338

    driver.vncSASL = 1;
    driver.vncSASLdir = strdup("/root/.sasl2");
339
    DO_TEST("graphics-vnc-sasl", QEMU_CAPS_VGA, false);
340 341 342
    driver.vncTLS = 1;
    driver.vncTLSx509verify = 1;
    driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu");
J
Jiri Denemark 已提交
343
    DO_TEST("graphics-vnc-tls", 0, false);
344 345 346 347 348
    driver.vncSASL = driver.vncTLSx509verify = driver.vncTLS = 0;
    free(driver.vncSASLdir);
    free(driver.vncTLSx509certdir);
    driver.vncSASLdir = driver.vncTLSx509certdir = NULL;

J
Jiri Denemark 已提交
349 350
    DO_TEST("graphics-sdl", 0, false);
    DO_TEST("graphics-sdl-fullscreen", 0, false);
351 352 353
    DO_TEST("nographics", QEMU_CAPS_VGA, false);
    DO_TEST("nographics-vga", QEMU_CAPS_VGA |
                              QEMU_CAPS_VGA_NONE, false);
354
    DO_TEST("graphics-spice",
355 356
            QEMU_CAPS_VGA | QEMU_CAPS_VGA_QXL |
            QEMU_CAPS_DEVICE | QEMU_CAPS_SPICE, false);
357

J
Jiri Denemark 已提交
358 359
    DO_TEST("input-usbmouse", 0, false);
    DO_TEST("input-usbtablet", 0, false);
360
    DO_TEST("input-xen", QEMU_CAPS_DOMID, true);
J
Jiri Denemark 已提交
361 362
    DO_TEST("misc-acpi", 0, false);
    DO_TEST("misc-no-reboot", 0, false);
363 364
    DO_TEST("misc-uuid", QEMU_CAPS_NAME |
            QEMU_CAPS_UUID, false);
J
Jiri Denemark 已提交
365 366
    DO_TEST("net-user", 0, false);
    DO_TEST("net-virtio", 0, false);
367 368 369 370
    DO_TEST("net-virtio-device", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_VIRTIO_TX_ALG, false);
    DO_TEST("net-virtio-netdev", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NETDEV | QEMU_CAPS_NODEFCONFIG, false);
J
Jiri Denemark 已提交
371 372
    DO_TEST("net-eth", 0, false);
    DO_TEST("net-eth-ifname", 0, false);
373
    DO_TEST("net-eth-names", QEMU_CAPS_NET_NAME, false);
J
Jiri Denemark 已提交
374 375 376 377 378 379 380 381 382 383 384 385 386

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

388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
    DO_TEST("serial-vc-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-pty-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-dev-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-file-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-unix-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-tcp-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-udp-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-tcp-telnet-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("serial-many-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("parallel-tcp-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("console-compat-chardev", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);

    DO_TEST("channel-guestfwd", QEMU_CAPS_CHARDEV|QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("channel-virtio", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("channel-virtio-auto", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("console-virtio", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("channel-spicevmc", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_SPICE |
            QEMU_CAPS_CHARDEV_SPICEVMC, false);
    DO_TEST("channel-spicevmc-old", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_SPICE |
            QEMU_CAPS_DEVICE_SPICEVMC, false);
425

E
Eric Blake 已提交
426
    DO_TEST("smartcard-host",
427 428
            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_EMULATED, false);
E
Eric Blake 已提交
429
    DO_TEST("smartcard-host-certificates",
430 431
            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_EMULATED, false);
E
Eric Blake 已提交
432
    DO_TEST("smartcard-passthrough-tcp",
433 434
            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_PASSTHRU, false);
E
Eric Blake 已提交
435
    DO_TEST("smartcard-passthrough-spicevmc",
436 437 438
            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_PASSTHRU |
            QEMU_CAPS_CHARDEV_SPICEVMC, false);
E
Eric Blake 已提交
439
    DO_TEST("smartcard-controller",
440 441
            QEMU_CAPS_CHARDEV | QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_CCID_EMULATED, false);
E
Eric Blake 已提交
442

443
    DO_TEST("smbios", QEMU_CAPS_SMBIOS_TYPE, false);
444

J
Jiri Denemark 已提交
445
    DO_TEST("watchdog", 0, false);
446 447
    DO_TEST("watchdog-device", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
448
    DO_TEST("watchdog-dump", 0, false);
449 450 451 452
    DO_TEST("balloon-device", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("balloon-device-auto", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
J
Jiri Denemark 已提交
453
    DO_TEST("sound", 0, false);
454 455 456 457
    DO_TEST("sound-device", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_HDA_DUPLEX, false);
    DO_TEST("fs9p", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG | QEMU_CAPS_FSDEV, false);
458

J
Jiri Denemark 已提交
459
    DO_TEST("hostdev-usb-address", 0, false);
460 461 462 463 464
    DO_TEST("hostdev-usb-address-device", QEMU_CAPS_DEVICE |
            QEMU_CAPS_NODEFCONFIG, false);
    DO_TEST("hostdev-pci-address", QEMU_CAPS_PCIDEVICE, false);
    DO_TEST("hostdev-pci-address-device", QEMU_CAPS_PCIDEVICE |
            QEMU_CAPS_DEVICE | QEMU_CAPS_NODEFCONFIG, false);
465

466
    DO_TEST_FULL("restore-v1", QEMU_CAPS_MIGRATE_KVM_STDIO, "stdio", 7,
467
                 false);
468
    DO_TEST_FULL("restore-v2", QEMU_CAPS_MIGRATE_QEMU_EXEC, "stdio", 7,
469
                 false);
470
    DO_TEST_FULL("restore-v2", QEMU_CAPS_MIGRATE_QEMU_EXEC, "exec:cat", 7,
471
                 false);
472
    DO_TEST_FULL("restore-v2-fd", QEMU_CAPS_MIGRATE_QEMU_FD, "stdio", 7,
473
                 false);
474
    DO_TEST_FULL("restore-v2-fd", QEMU_CAPS_MIGRATE_QEMU_FD, "fd:7", 7,
475
                 false);
476
    DO_TEST_FULL("migrate", QEMU_CAPS_MIGRATE_QEMU_TCP,
477
                 "tcp:10.0.0.1:5000", -1, false);
478

J
Jiri Denemark 已提交
479
    DO_TEST("qemu-ns", 0, false);
480

481
    DO_TEST("smp", QEMU_CAPS_SMP_TOPOLOGY, false);
482

483 484
    DO_TEST("cpu-topology1", QEMU_CAPS_SMP_TOPOLOGY, false);
    DO_TEST("cpu-topology2", QEMU_CAPS_SMP_TOPOLOGY, false);
485 486 487 488 489 490 491
    DO_TEST("cpu-topology3", 0, false);
    DO_TEST("cpu-minimum1", 0, false);
    DO_TEST("cpu-minimum2", 0, false);
    DO_TEST("cpu-exact1", 0, false);
    DO_TEST("cpu-exact2", 0, false);
    DO_TEST("cpu-strict1", 0, false);

492 493
    DO_TEST("memtune", QEMU_CAPS_NAME, false);
    DO_TEST("blkiotune", QEMU_CAPS_NAME, false);
494

D
Daniel P. Berrange 已提交
495
    free(driver.stateDir);
496 497
    virCapabilitiesFree(driver.caps);

498
    return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
499 500
}

501 502
VIRT_TEST_MAIN(mymain)

503 504
#else

505
int main (void) { return (77); /* means 'test skipped' for automake */ }
506 507

#endif /* WITH_QEMU */