diff --git a/.gitignore b/.gitignore index edd5d26180..b5824dcd6a 100644 --- a/.gitignore +++ b/.gitignore @@ -176,6 +176,7 @@ /tests/openvzutilstest /tests/qemuagenttest /tests/qemuargv2xmltest +/tests/qemucapabilitiestest /tests/qemuhelptest /tests/qemuhotplugtest /tests/qemumonitorjsontest diff --git a/tests/Makefile.am b/tests/Makefile.am index 17a2a724c6..a691f13eea 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -82,6 +82,7 @@ EXTRA_DIST = \ nwfilterxml2xmlin \ nwfilterxml2xmlout \ oomtrace.pl \ + qemucapabilitiesdata \ qemuhelpdata \ qemuhotplugtestdata \ qemuxml2argvdata \ @@ -173,7 +174,7 @@ if WITH_QEMU test_programs += qemuxml2argvtest qemuxml2xmltest qemuxmlnstest \ qemuargv2xmltest qemuhelptest domainsnapshotxml2xmltest \ qemumonitortest qemumonitorjsontest qemuhotplugtest \ - qemuagenttest + qemuagenttest qemucapabilitiestest endif WITH_QEMU if WITH_LXC @@ -440,6 +441,13 @@ qemumonitorjsontest_SOURCES = \ $(NULL) qemumonitorjsontest_LDADD = libqemumonitortestutils.la $(qemu_LDADDS) +qemucapabilitiestest_SOURCES = \ + qemucapabilitiestest.c \ + testutils.c testutils.h \ + testutilsqemu.c testutilsqemu.h \ + $(NULL) +qemucapabilitiestest_LDADD = libqemumonitortestutils.la $(qemu_LDADDS) + qemuagenttest_SOURCES = \ qemuagenttest.c \ testutils.c testutils.h \ @@ -463,7 +471,7 @@ EXTRA_DIST += qemuxml2argvtest.c qemuxml2xmltest.c qemuargv2xmltest.c \ qemuxmlnstest.c qemuhelptest.c domainsnapshotxml2xmltest.c \ qemumonitortest.c testutilsqemu.c testutilsqemu.h \ qemumonitorjsontest.c qemuhotplugtest.c \ - qemuagenttest.c \ + qemuagenttest.c qemucapabilitiestest.c \ $(QEMUMONITORTESTUTILS_SOURCES) endif ! WITH_QEMU diff --git a/tests/qemucapabilitiesdata/caps_1.5.3-1.caps b/tests/qemucapabilitiesdata/caps_1.5.3-1.caps new file mode 100644 index 0000000000..323ac8291b --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_1.5.3-1.caps @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/qemucapabilitiesdata/caps_1.5.3-1.replies b/tests/qemucapabilitiesdata/caps_1.5.3-1.replies new file mode 100644 index 0000000000..8ff17cea4b --- /dev/null +++ b/tests/qemucapabilitiesdata/caps_1.5.3-1.replies @@ -0,0 +1,2519 @@ +{ + "QMP": { + "version": { + "qemu": { + "micro": 3, + "minor": 5, + "major": 1 + }, + "package": "" + }, + "capabilities": [ + ] + } +} + +{ + "return": { + }, + "id": "libvirt-1" +} + +{ + "return": { + "qemu": { + "micro": 3, + "minor": 5, + "major": 1 + }, + "package": "" + }, + "id": "libvirt-2" +} + +{ + "return": { + "arch": "x86_64" + }, + "id": "libvirt-3" +} + +{ + "return": [ + { + "name": "chardev-remove" + }, + { + "name": "chardev-add" + }, + { + "name": "query-tpm-types" + }, + { + "name": "query-tpm-models" + }, + { + "name": "query-tpm" + }, + { + "name": "query-target" + }, + { + "name": "query-cpu-definitions" + }, + { + "name": "query-machines" + }, + { + "name": "device-list-properties" + }, + { + "name": "qom-list-types" + }, + { + "name": "change-vnc-password" + }, + { + "name": "nbd-server-stop" + }, + { + "name": "nbd-server-add" + }, + { + "name": "nbd-server-start" + }, + { + "name": "qom-get" + }, + { + "name": "qom-set" + }, + { + "name": "qom-list" + }, + { + "name": "query-block-jobs" + }, + { + "name": "query-balloon" + }, + { + "name": "query-migrate-capabilities" + }, + { + "name": "migrate-set-capabilities" + }, + { + "name": "query-migrate" + }, + { + "name": "query-command-line-options" + }, + { + "name": "query-uuid" + }, + { + "name": "query-name" + }, + { + "name": "query-spice" + }, + { + "name": "query-vnc" + }, + { + "name": "query-mice" + }, + { + "name": "query-status" + }, + { + "name": "query-kvm" + }, + { + "name": "query-pci" + }, + { + "name": "query-cpus" + }, + { + "name": "query-blockstats" + }, + { + "name": "query-block" + }, + { + "name": "query-chardev" + }, + { + "name": "query-events" + }, + { + "name": "query-commands" + }, + { + "name": "query-version" + }, + { + "name": "human-monitor-command" + }, + { + "name": "qmp_capabilities" + }, + { + "name": "add_client" + }, + { + "name": "expire_password" + }, + { + "name": "set_password" + }, + { + "name": "block_set_io_throttle" + }, + { + "name": "block_passwd" + }, + { + "name": "query-fdsets" + }, + { + "name": "remove-fd" + }, + { + "name": "add-fd" + }, + { + "name": "closefd" + }, + { + "name": "getfd" + }, + { + "name": "set_link" + }, + { + "name": "balloon" + }, + { + "name": "drive-mirror" + }, + { + "name": "blockdev-snapshot-sync" + }, + { + "name": "transaction" + }, + { + "name": "block-job-complete" + }, + { + "name": "block-job-resume" + }, + { + "name": "block-job-pause" + }, + { + "name": "block-job-cancel" + }, + { + "name": "block-job-set-speed" + }, + { + "name": "block-commit" + }, + { + "name": "block-stream" + }, + { + "name": "block_resize" + }, + { + "name": "netdev_del" + }, + { + "name": "netdev_add" + }, + { + "name": "dump-guest-memory" + }, + { + "name": "client_migrate_info" + }, + { + "name": "migrate_set_downtime" + }, + { + "name": "migrate_set_speed" + }, + { + "name": "query-migrate-cache-size" + }, + { + "name": "migrate-set-cache-size" + }, + { + "name": "migrate_cancel" + }, + { + "name": "migrate" + }, + { + "name": "xen-set-global-dirty-log" + }, + { + "name": "xen-save-devices-state" + }, + { + "name": "ringbuf-read" + }, + { + "name": "ringbuf-write" + }, + { + "name": "inject-nmi" + }, + { + "name": "pmemsave" + }, + { + "name": "memsave" + }, + { + "name": "cpu-add" + }, + { + "name": "cpu" + }, + { + "name": "send-key" + }, + { + "name": "device_del" + }, + { + "name": "device_add" + }, + { + "name": "system_powerdown" + }, + { + "name": "system_reset" + }, + { + "name": "system_wakeup" + }, + { + "name": "cont" + }, + { + "name": "stop" + }, + { + "name": "screendump" + }, + { + "name": "change" + }, + { + "name": "eject" + }, + { + "name": "quit" + } + ], + "id": "libvirt-4" +} + +{ + "return": { + "fd": 10, + "fdset-id": 0 + }, + "id": "libvirt-5" +} + +{ + "return": [ + { + "name": "GUEST_PANICKED" + }, + { + "name": "SPICE_MIGRATE_COMPLETED" + }, + { + "name": "BALLOON_CHANGE" + }, + { + "name": "WAKEUP" + }, + { + "name": "SUSPEND_DISK" + }, + { + "name": "SUSPEND" + }, + { + "name": "DEVICE_TRAY_MOVED" + }, + { + "name": "DEVICE_DELETED" + }, + { + "name": "BLOCK_JOB_READY" + }, + { + "name": "BLOCK_JOB_ERROR" + }, + { + "name": "BLOCK_JOB_CANCELLED" + }, + { + "name": "BLOCK_JOB_COMPLETED" + }, + { + "name": "SPICE_DISCONNECTED" + }, + { + "name": "SPICE_INITIALIZED" + }, + { + "name": "SPICE_CONNECTED" + }, + { + "name": "WATCHDOG" + }, + { + "name": "RTC_CHANGE" + }, + { + "name": "BLOCK_IO_ERROR" + }, + { + "name": "VNC_DISCONNECTED" + }, + { + "name": "VNC_INITIALIZED" + }, + { + "name": "VNC_CONNECTED" + }, + { + "name": "RESUME" + }, + { + "name": "STOP" + }, + { + "name": "POWERDOWN" + }, + { + "name": "RESET" + }, + { + "name": "SHUTDOWN" + } + ], + "id": "libvirt-6" +} + +{ + "return": [ + { + "name": "ICH9 LPC" + }, + { + "name": "x86_64-cpu" + }, + { + "name": "port92" + }, + { + "name": "virtio-net-pci" + }, + { + "name": "virtio-scsi-device" + }, + { + "name": "apic" + }, + { + "name": "pc-testdev" + }, + { + "name": "virtio-blk-device" + }, + { + "name": "virtio-scsi-pci" + }, + { + "name": "exynos4210-ehci-usb" + }, + { + "name": "i6300esb" + }, + { + "name": "usb-host" + }, + { + "name": "ich9-usb-ehci2" + }, + { + "name": "usb-ehci" + }, + { + "name": "ich9-ahci" + }, + { + "name": "ich9-usb-ehci1" + }, + { + "name": "isa-ide" + }, + { + "name": "ICH9 SMB" + }, + { + "name": "virtio-balloon-pci" + }, + { + "name": "vt82c686b-usb-uhci" + }, + { + "name": "i82558b" + }, + { + "name": "i82558a" + }, + { + "name": "isa-fdc" + }, + { + "name": "isabus-bridge" + }, + { + "name": "pvpanic" + }, + { + "name": "i2c-bus" + }, + { + "name": "piix3-ide" + }, + { + "name": "ioapic" + }, + { + "name": "pci-bridge" + }, + { + "name": "HDA" + }, + { + "name": "am53c974" + }, + { + "name": "xlnx,ps7-usb" + }, + { + "name": "vmmouse" + }, + { + "name": "sb16" + }, + { + "name": "i82801b11-bridge" + }, + { + "name": "vmxnet3" + }, + { + "name": "isa-cirrus-vga" + }, + { + "name": "dc390" + }, + { + "name": "vmware-svga" + }, + { + "name": "smbus-eeprom" + }, + { + "name": "piix4-usb-uhci" + }, + { + "name": "ccid-card-passthru" + }, + { + "name": "i82801" + }, + { + "name": "fw_cfg" + }, + { + "name": "qxl" + }, + { + "name": "piix3-usb-uhci" + }, + { + "name": "ib700" + }, + { + "name": "usb-audio" + }, + { + "name": "i82557c" + }, + { + "name": "i82557b" + }, + { + "name": "i82557a" + }, + { + "name": "IndustryPack" + }, + { + "name": "hpet" + }, + { + "name": "pvscsi" + }, + { + "name": "rtl8139" + }, + { + "name": "isa-applesmc" + }, + { + "name": "kvm-pci-assign" + }, + { + "name": "container" + }, + { + "name": "cfi.pflash01" + }, + { + "name": "usb-kbd" + }, + { + "name": "vfio-pci" + }, + { + "name": "isa-vga" + }, + { + "name": "pci-testdev" + }, + { + "name": "usb-tablet" + }, + { + "name": "vmport" + }, + { + "name": "virtio-rng-pci" + }, + { + "name": "kvmvapic" + }, + { + "name": "usb-bt-dongle" + }, + { + "name": "sysbus-fdc" + }, + { + "name": "piix4-ide" + }, + { + "name": "e1000" + }, + { + "name": "AC97" + }, + { + "name": "ipoctal232" + }, + { + "name": "mch" + }, + { + "name": "mc146818rtc" + }, + { + "name": "ivshmem" + }, + { + "name": "usb-ccid" + }, + { + "name": "sysbus-ahci" + }, + { + "name": "kvmclock" + }, + { + "name": "i82562" + }, + { + "name": "hda-output" + }, + { + "name": "pci-serial-4x" + }, + { + "name": "ccid-bus" + }, + { + "name": "i82559er" + }, + { + "name": "virtio-balloon-device" + }, + { + "name": "i8042" + }, + { + "name": "megasas" + }, + { + "name": "intel-hda" + }, + { + "name": "hda-duplex" + }, + { + "name": "virtio-serial-pci" + }, + { + "name": "ne2k_pci" + }, + { + "name": "ich9-usb-uhci6" + }, + { + "name": "ich9-usb-uhci5" + }, + { + "name": "ich9-usb-uhci3" + }, + { + "name": "virtconsole" + }, + { + "name": "ich9-usb-uhci4" + }, + { + "name": "isa-parallel" + }, + { + "name": "pci-serial" + }, + { + "name": "ich9-usb-uhci2" + }, + { + "name": "ich9-usb-uhci1" + }, + { + "name": "PCI" + }, + { + "name": "adlib" + }, + { + "name": "SUNW,fdtwo" + }, + { + "name": "ide-cd" + }, + { + "name": "isa-debugcon" + }, + { + "name": "usb-bot" + }, + { + "name": "i82551" + }, + { + "name": "i82550" + }, + { + "name": "isa-serial" + }, + { + "name": "PCIE" + }, + { + "name": "kvm-ioapic" + }, + { + "name": "nec-usb-xhci" + }, + { + "name": "System" + }, + { + "name": "kvm-apic" + }, + { + "name": "ich9-intel-hda" + }, + { + "name": "virtio-net-device" + }, + { + "name": "usb-wacom-tablet" + }, + { + "name": "PIIX4_PM" + }, + { + "name": "kvm-i8259" + }, + { + "name": "q35-pcihost" + }, + { + "name": "scsi-cd" + }, + { + "name": "pci-ohci" + }, + { + "name": "i440FX" + }, + { + "name": "usb-braille" + }, + { + "name": "virtserialport" + }, + { + "name": "pci-serial-2x" + }, + { + "name": "xio3130-downstream" + }, + { + "name": "rng-random" + }, + { + "name": "hda-micro" + }, + { + "name": "scsi-disk" + }, + { + "name": "vhost-scsi" + }, + { + "name": "lsi53c895a" + }, + { + "name": "qxl-vga" + }, + { + "name": "SCSI" + }, + { + "name": "pcnet" + }, + { + "name": "scsi-generic" + }, + { + "name": "virtio-scsi-common" + }, + { + "name": "virtio-serial-device" + }, + { + "name": "virtio-serial-bus" + }, + { + "name": "icc-bridge" + }, + { + "name": "usb-bus" + }, + { + "name": "ne2k_isa" + }, + { + "name": "IDE" + }, + { + "name": "usb-net" + }, + { + "name": "usb-hub" + }, + { + "name": "i440FX-pcihost" + }, + { + "name": "usb-mouse" + }, + { + "name": "isa-i8259" + }, + { + "name": "ISA" + }, + { + "name": "cs4231a" + }, + { + "name": "usb-serial" + }, + { + "name": "pc-sysfw" + }, + { + "name": "scsi-block" + }, + { + "name": "sga" + }, + { + "name": "isa-debug-exit" + }, + { + "name": "virtio-rng-device" + }, + { + "name": "ioh3420" + }, + { + "name": "ES1370" + }, + { + "name": "PIIX3" + }, + { + "name": "isa-pcspk" + }, + { + "name": "ide-hd" + }, + { + "name": "rng-egd" + }, + { + "name": "cirrus-vga" + }, + { + "name": "kvm-pit" + }, + { + "name": "qemu-console" + }, + { + "name": "icc-bus" + }, + { + "name": "ide-drive" + }, + { + "name": "x3130-upstream" + }, + { + "name": "virtio-pci-bus" + }, + { + "name": "usb-uas" + }, + { + "name": "vhost-scsi-pci" + }, + { + "name": "virtio-blk-pci" + }, + { + "name": "sysbus-ohci" + }, + { + "name": "esp" + }, + { + "name": "piix3-ide-xen" + }, + { + "name": "i82559c" + }, + { + "name": "i82559b" + }, + { + "name": "i82559a" + }, + { + "name": "scsi-hd" + }, + { + "name": "PIIX3-xen" + }, + { + "name": "usb-storage" + }, + { + "name": "isa-pit" + }, + { + "name": "tpci200" + }, + { + "name": "gus" + }, + { + "name": "VGA" + } + ], + "id": "libvirt-7" +} + +{ + "return": [ + { + "name": "command_serr_enable", + "type": "on/off" + }, + { + "name": "multifunction", + "type": "on/off" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "romfile", + "type": "string" + }, + { + "name": "addr", + "type": "pci-devfn" + }, + { + "name": "scsi", + "type": "on/off" + }, + { + "name": "config-wce", + "type": "on/off" + }, + { + "name": "serial", + "type": "string" + }, + { + "name": "secs", + "type": "uint32" + }, + { + "name": "heads", + "type": "uint32" + }, + { + "name": "cyls", + "type": "uint32" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "physical_block_size", + "type": "blocksize" + }, + { + "name": "logical_block_size", + "type": "blocksize" + }, + { + "name": "drive", + "type": "drive" + }, + { + "name": "event_idx", + "type": "on/off" + }, + { + "name": "indirect_desc", + "type": "on/off" + }, + { + "name": "x-data-plane", + "type": "on/off" + }, + { + "name": "vectors", + "type": "uint32" + }, + { + "name": "ioeventfd", + "type": "on/off" + }, + { + "name": "class", + "type": "hex32" + } + ], + "id": "libvirt-8" +} + +{ + "return": [ + { + "name": "command_serr_enable", + "type": "on/off" + }, + { + "name": "multifunction", + "type": "on/off" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "romfile", + "type": "string" + }, + { + "name": "addr", + "type": "pci-devfn" + }, + { + "name": "tx", + "type": "string" + }, + { + "name": "x-txburst", + "type": "int32" + }, + { + "name": "x-txtimer", + "type": "uint32" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "netdev", + "type": "netdev" + }, + { + "name": "vlan", + "type": "vlan" + }, + { + "name": "mac", + "type": "macaddr" + }, + { + "name": "mq", + "type": "on/off" + }, + { + "name": "ctrl_mac_addr", + "type": "on/off" + }, + { + "name": "ctrl_rx_extra", + "type": "on/off" + }, + { + "name": "ctrl_vlan", + "type": "on/off" + }, + { + "name": "ctrl_rx", + "type": "on/off" + }, + { + "name": "ctrl_vq", + "type": "on/off" + }, + { + "name": "status", + "type": "on/off" + }, + { + "name": "mrg_rxbuf", + "type": "on/off" + }, + { + "name": "host_ufo", + "type": "on/off" + }, + { + "name": "host_ecn", + "type": "on/off" + }, + { + "name": "host_tso6", + "type": "on/off" + }, + { + "name": "host_tso4", + "type": "on/off" + }, + { + "name": "guest_ufo", + "type": "on/off" + }, + { + "name": "guest_ecn", + "type": "on/off" + }, + { + "name": "guest_tso6", + "type": "on/off" + }, + { + "name": "guest_tso4", + "type": "on/off" + }, + { + "name": "gso", + "type": "on/off" + }, + { + "name": "guest_csum", + "type": "on/off" + }, + { + "name": "csum", + "type": "on/off" + }, + { + "name": "event_idx", + "type": "on/off" + }, + { + "name": "indirect_desc", + "type": "on/off" + }, + { + "name": "vectors", + "type": "uint32" + }, + { + "name": "ioeventfd", + "type": "on/off" + } + ], + "id": "libvirt-9" +} + +{ + "id": "libvirt-10", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-blk-ccw' not found" + } +} + +{ + "id": "libvirt-11", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-net-ccw' not found" + } +} + +{ + "id": "libvirt-12", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-blk-s390' not found" + } +} + +{ + "id": "libvirt-13", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'virtio-net-s390' not found" + } +} + +{ + "id": "libvirt-14", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'pci-assign' not found" + } +} + +{ + "return": [ + { + "name": "command_serr_enable", + "type": "on/off" + }, + { + "name": "multifunction", + "type": "on/off" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "romfile", + "type": "string" + }, + { + "name": "addr", + "type": "pci-devfn" + }, + { + "name": "configfd", + "type": "string" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "share_intx", + "type": "on/off" + }, + { + "name": "prefer_msi", + "type": "on/off" + }, + { + "name": "host", + "type": "pci-host-devaddr" + } + ], + "id": "libvirt-15" +} + +{ + "return": [ + { + "name": "command_serr_enable", + "type": "on/off" + }, + { + "name": "multifunction", + "type": "on/off" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "romfile", + "type": "string" + }, + { + "name": "addr", + "type": "pci-devfn" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "x-vga", + "type": "on/off" + }, + { + "name": "x-intx-mmap-timeout-ms", + "type": "uint32" + }, + { + "name": "host", + "type": "pci-host-devaddr" + } + ], + "id": "libvirt-16" +} + +{ + "return": [ + { + "name": "lun", + "type": "uint32" + }, + { + "name": "scsi-id", + "type": "uint32" + }, + { + "name": "channel", + "type": "uint32" + }, + { + "name": "wwn", + "type": "hex64" + }, + { + "name": "dpofua", + "type": "on/off" + }, + { + "name": "removable", + "type": "on/off" + }, + { + "name": "product", + "type": "string" + }, + { + "name": "vendor", + "type": "string" + }, + { + "name": "serial", + "type": "string" + }, + { + "name": "ver", + "type": "string" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "physical_block_size", + "type": "blocksize" + }, + { + "name": "logical_block_size", + "type": "blocksize" + }, + { + "name": "drive", + "type": "drive" + } + ], + "id": "libvirt-17" +} + +{ + "return": [ + { + "name": "unit", + "type": "uint32" + }, + { + "name": "model", + "type": "string" + }, + { + "name": "serial", + "type": "string" + }, + { + "name": "wwn", + "type": "hex64" + }, + { + "name": "ver", + "type": "string" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "physical_block_size", + "type": "blocksize" + }, + { + "name": "logical_block_size", + "type": "blocksize" + }, + { + "name": "drive", + "type": "drive" + } + ], + "id": "libvirt-18" +} + +{ + "return": [ + { + "name": "command_serr_enable", + "type": "on/off" + }, + { + "name": "multifunction", + "type": "on/off" + }, + { + "name": "rombar", + "type": "uint32" + }, + { + "name": "romfile", + "type": "string" + }, + { + "name": "addr", + "type": "pci-devfn" + }, + { + "name": "s4_val", + "type": "uint8" + }, + { + "name": "disable_s4", + "type": "uint8" + }, + { + "name": "disable_s3", + "type": "uint8" + }, + { + "name": "smb_io_base", + "type": "uint32" + } + ], + "id": "libvirt-19" +} + +{ + "id": "libvirt-20", + "error": { + "class": "DeviceNotFound", + "desc": "Device 'usb-redir' not found" + } +} + +{ + "return": [ + { + "name": "full-path", + "type": "on/off" + }, + { + "name": "port", + "type": "string" + }, + { + "name": "pipeline", + "type": "on/off" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "isobufs", + "type": "uint32" + }, + { + "name": "productid", + "type": "hex32" + }, + { + "name": "vendorid", + "type": "hex32" + }, + { + "name": "hostport", + "type": "string" + }, + { + "name": "hostaddr", + "type": "uint32" + }, + { + "name": "hostbus", + "type": "uint32" + } + ], + "id": "libvirt-21" +} + +{ + "return": [ + { + "name": "lun", + "type": "uint32" + }, + { + "name": "scsi-id", + "type": "uint32" + }, + { + "name": "channel", + "type": "uint32" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "drive", + "type": "drive" + } + ], + "id": "libvirt-22" +} + +{ + "return": [ + ], + "id": "libvirt-23" +} + +{ + "return": [ + { + "name": "MCFG", + "type": "uint64" + } + ], + "id": "libvirt-24" +} + +{ + "return": [ + { + "name": "full-path", + "type": "on/off" + }, + { + "name": "port", + "type": "string" + }, + { + "name": "removable", + "type": "on/off" + }, + { + "name": "serial", + "type": "string" + }, + { + "name": "discard_granularity", + "type": "uint32" + }, + { + "name": "bootindex", + "type": "int32" + }, + { + "name": "opt_io_size", + "type": "uint32" + }, + { + "name": "min_io_size", + "type": "uint16" + }, + { + "name": "physical_block_size", + "type": "blocksize" + }, + { + "name": "logical_block_size", + "type": "blocksize" + }, + { + "name": "drive", + "type": "drive" + } + ], + "id": "libvirt-25" +} + +{ + "return": [ + { + "name": "pc-q35-1.4", + "cpu-max": 255 + }, + { + "name": "pc-q35-1.5", + "cpu-max": 255, + "alias": "q35" + }, + { + "name": "isapc", + "cpu-max": 1 + }, + { + "name": "pc-0.10", + "cpu-max": 255 + }, + { + "name": "pc-0.11", + "cpu-max": 255 + }, + { + "name": "pc-0.12", + "cpu-max": 255 + }, + { + "name": "pc-0.13", + "cpu-max": 255 + }, + { + "name": "pc-0.14", + "cpu-max": 255 + }, + { + "name": "pc-0.15", + "cpu-max": 255 + }, + { + "name": "pc-1.0", + "cpu-max": 255 + }, + { + "name": "pc-1.1", + "cpu-max": 255 + }, + { + "name": "pc-1.2", + "cpu-max": 255 + }, + { + "name": "pc-1.3", + "cpu-max": 255 + }, + { + "name": "pc-i440fx-1.4", + "cpu-max": 255 + }, + { + "name": "pc-i440fx-1.5", + "is-default": true, + "cpu-max": 255, + "alias": "pc" + }, + { + "name": "none", + "cpu-max": 1 + } + ], + "id": "libvirt-26" +} + +{ + "return": [ + { + "name": "Opteron_G5" + }, + { + "name": "Opteron_G4" + }, + { + "name": "Opteron_G3" + }, + { + "name": "Opteron_G2" + }, + { + "name": "Opteron_G1" + }, + { + "name": "Haswell" + }, + { + "name": "SandyBridge" + }, + { + "name": "Westmere" + }, + { + "name": "Nehalem" + }, + { + "name": "Penryn" + }, + { + "name": "Conroe" + }, + { + "name": "n270" + }, + { + "name": "athlon" + }, + { + "name": "pentium3" + }, + { + "name": "pentium2" + }, + { + "name": "pentium" + }, + { + "name": "486" + }, + { + "name": "coreduo" + }, + { + "name": "kvm32" + }, + { + "name": "qemu32" + }, + { + "name": "kvm64" + }, + { + "name": "core2duo" + }, + { + "name": "phenom" + }, + { + "name": "qemu64" + } + ], + "id": "libvirt-27" +} + +{ + "return": { + "enabled": false, + "present": true + }, + "id": "libvirt-28" +} + +{ + "return": [ + ], + "id": "libvirt-29" +} + +{ + "return": [ + ], + "id": "libvirt-30" +} + +{ + "return": [ + { + "parameters": [ + { + "name": "seamless-migration", + "type": "boolean" + }, + { + "name": "playback-compression", + "type": "boolean" + }, + { + "name": "agent-mouse", + "type": "boolean" + }, + { + "name": "streaming-video", + "type": "string" + }, + { + "name": "zlib-glz-wan-compression", + "type": "string" + }, + { + "name": "jpeg-wan-compression", + "type": "string" + }, + { + "name": "image-compression", + "type": "string" + }, + { + "name": "plaintext-channel", + "type": "string" + }, + { + "name": "tls-channel", + "type": "string" + }, + { + "name": "tls-ciphers", + "type": "string" + }, + { + "name": "x509-dh-key-file", + "type": "string" + }, + { + "name": "x509-cacert-file", + "type": "string" + }, + { + "name": "x509-cert-file", + "type": "string" + }, + { + "name": "x509-key-password", + "type": "string" + }, + { + "name": "x509-key-file", + "type": "string" + }, + { + "name": "x509-dir", + "type": "string" + }, + { + "name": "sasl", + "type": "boolean" + }, + { + "name": "disable-copy-paste", + "type": "boolean" + }, + { + "name": "disable-ticketing", + "type": "boolean" + }, + { + "name": "password", + "type": "string" + }, + { + "name": "ipv6", + "type": "boolean" + }, + { + "name": "ipv4", + "type": "boolean" + }, + { + "name": "addr", + "type": "string" + }, + { + "name": "tls-port", + "type": "number" + }, + { + "name": "port", + "type": "number" + } + ], + "option": "spice" + }, + { + "parameters": [ + ], + "option": "acpi" + }, + { + "parameters": [ + { + "name": "sock_fd", + "type": "number" + }, + { + "name": "socket", + "type": "string" + }, + { + "name": "readonly", + "type": "boolean" + }, + { + "name": "writeout", + "type": "string" + }, + { + "name": "security_model", + "type": "string" + }, + { + "name": "mount_tag", + "type": "string" + }, + { + "name": "path", + "type": "string" + }, + { + "name": "fsdriver", + "type": "string" + } + ], + "option": "virtfs" + }, + { + "parameters": [ + { + "name": "sock_fd", + "type": "number" + }, + { + "name": "socket", + "type": "string" + }, + { + "name": "readonly", + "type": "boolean" + }, + { + "name": "writeout", + "type": "string" + }, + { + "name": "security_model", + "type": "string" + }, + { + "name": "path", + "type": "string" + }, + { + "name": "fsdriver", + "type": "string" + } + ], + "option": "fsdev" + }, + { + "parameters": [ + { + "name": "mlock", + "type": "boolean" + } + ], + "option": "realtime" + }, + { + "parameters": [ + ], + "option": "tpmdev" + }, + { + "parameters": [ + ], + "option": "object" + }, + { + "parameters": [ + { + "name": "opaque", + "help": "free-form string used to describe fd", + "type": "string" + }, + { + "name": "set", + "help": "ID of the fd set to add fd to", + "type": "number" + }, + { + "name": "fd", + "help": "file descriptor of which a duplicate is added to fd set", + "type": "number" + } + ], + "option": "add-fd" + }, + { + "parameters": [ + { + "name": "enable", + "type": "boolean" + } + ], + "option": "sandbox" + }, + { + "parameters": [ + { + "name": "strict", + "type": "string" + }, + { + "name": "reboot-timeout", + "type": "string" + }, + { + "name": "splash-time", + "type": "string" + }, + { + "name": "splash", + "type": "string" + }, + { + "name": "menu", + "type": "string" + }, + { + "name": "once", + "type": "string" + }, + { + "name": "order", + "type": "string" + } + ], + "option": "boot-opts" + }, + { + "parameters": [ + { + "name": "usb", + "help": "Set on/off to enable/disable usb", + "type": "boolean" + }, + { + "name": "mem-merge", + "help": "enable/disable memory merge support", + "type": "boolean" + }, + { + "name": "dump-guest-core", + "help": "Include guest memory in a core dump", + "type": "boolean" + }, + { + "name": "dt_compatible", + "help": "Overrides the \"compatible\" property of the dt root node", + "type": "string" + }, + { + "name": "phandle_start", + "help": "The first phandle ID we may generate dynamically", + "type": "string" + }, + { + "name": "dumpdtb", + "help": "Dump current dtb to a file and quit", + "type": "string" + }, + { + "name": "dtb", + "help": "Linux kernel device tree file", + "type": "string" + }, + { + "name": "append", + "help": "Linux kernel command line", + "type": "string" + }, + { + "name": "initrd", + "help": "Linux initial ramdisk file", + "type": "string" + }, + { + "name": "kernel", + "help": "Linux kernel image file", + "type": "string" + }, + { + "name": "kvm_shadow_mem", + "help": "KVM shadow MMU size", + "type": "size" + }, + { + "name": "kernel_irqchip", + "help": "use KVM in-kernel irqchip", + "type": "boolean" + }, + { + "name": "accel", + "help": "accelerator list", + "type": "string" + }, + { + "name": "type", + "help": "emulated machine", + "type": "string" + } + ], + "option": "machine" + }, + { + "parameters": [ + { + "name": "romfile", + "type": "string" + }, + { + "name": "bootindex", + "type": "number" + } + ], + "option": "option-rom" + }, + { + "parameters": [ + { + "name": "file", + "type": "string" + }, + { + "name": "events", + "type": "string" + } + ], + "option": "trace" + }, + { + "parameters": [ + { + "name": "pretty", + "type": "boolean" + }, + { + "name": "default", + "type": "boolean" + }, + { + "name": "chardev", + "type": "string" + }, + { + "name": "mode", + "type": "string" + } + ], + "option": "mon" + }, + { + "parameters": [ + { + "name": "value", + "type": "string" + }, + { + "name": "property", + "type": "string" + }, + { + "name": "driver", + "type": "string" + } + ], + "option": "global" + }, + { + "parameters": [ + { + "name": "driftfix", + "type": "string" + }, + { + "name": "clock", + "type": "string" + }, + { + "name": "base", + "type": "string" + } + ], + "option": "rtc" + }, + { + "parameters": [ + ], + "option": "net" + }, + { + "parameters": [ + ], + "option": "netdev" + }, + { + "parameters": [ + ], + "option": "device" + }, + { + "parameters": [ + { + "name": "size", + "type": "size" + }, + { + "name": "debug", + "type": "number" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "signal", + "type": "boolean" + }, + { + "name": "mux", + "type": "boolean" + }, + { + "name": "rows", + "type": "number" + }, + { + "name": "cols", + "type": "number" + }, + { + "name": "height", + "type": "number" + }, + { + "name": "width", + "type": "number" + }, + { + "name": "telnet", + "type": "boolean" + }, + { + "name": "delay", + "type": "boolean" + }, + { + "name": "server", + "type": "boolean" + }, + { + "name": "wait", + "type": "boolean" + }, + { + "name": "ipv6", + "type": "boolean" + }, + { + "name": "ipv4", + "type": "boolean" + }, + { + "name": "to", + "type": "number" + }, + { + "name": "localport", + "type": "string" + }, + { + "name": "localaddr", + "type": "string" + }, + { + "name": "port", + "type": "string" + }, + { + "name": "host", + "type": "string" + }, + { + "name": "path", + "type": "string" + }, + { + "name": "backend", + "type": "string" + } + ], + "option": "chardev" + }, + { + "parameters": [ + { + "name": "boot", + "help": "(deprecated, ignored)", + "type": "boolean" + }, + { + "name": "copy-on-read", + "help": "copy read data from backing file into image file", + "type": "boolean" + }, + { + "name": "bps_wr", + "help": "limit write bytes per second", + "type": "number" + }, + { + "name": "bps_rd", + "help": "limit read bytes per second", + "type": "number" + }, + { + "name": "bps", + "help": "limit total bytes per second", + "type": "number" + }, + { + "name": "iops_wr", + "help": "limit write operations per second", + "type": "number" + }, + { + "name": "iops_rd", + "help": "limit read operations per second", + "type": "number" + }, + { + "name": "iops", + "help": "limit total I/O operations per second", + "type": "number" + }, + { + "name": "readonly", + "help": "open drive file as read-only", + "type": "boolean" + }, + { + "name": "addr", + "help": "pci address (virtio only)", + "type": "string" + }, + { + "name": "werror", + "help": "write error action", + "type": "string" + }, + { + "name": "rerror", + "help": "read error action", + "type": "string" + }, + { + "name": "serial", + "help": "disk serial number", + "type": "string" + }, + { + "name": "format", + "help": "disk format (raw, qcow2, ...)", + "type": "string" + }, + { + "name": "aio", + "help": "host AIO implementation (threads, native)", + "type": "string" + }, + { + "name": "cache", + "help": "host cache usage (none, writeback, writethrough, directsync, unsafe)", + "type": "string" + }, + { + "name": "discard", + "help": "discard operation (ignore/off, unmap/on)", + "type": "string" + }, + { + "name": "file", + "help": "disk image", + "type": "string" + }, + { + "name": "snapshot", + "help": "enable/disable snapshot mode", + "type": "boolean" + }, + { + "name": "media", + "help": "media type (disk, cdrom)", + "type": "string" + }, + { + "name": "trans", + "help": "chs translation (auto, lba. none)", + "type": "string" + }, + { + "name": "secs", + "help": "number of sectors (ide disk geometry)", + "type": "number" + }, + { + "name": "heads", + "help": "number of heads (ide disk geometry)", + "type": "number" + }, + { + "name": "cyls", + "help": "number of cylinders (ide disk geometry)", + "type": "number" + }, + { + "name": "index", + "help": "index number", + "type": "number" + }, + { + "name": "if", + "help": "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)", + "type": "string" + }, + { + "name": "unit", + "help": "unit number (i.e. lun for scsi)", + "type": "number" + }, + { + "name": "bus", + "help": "bus number", + "type": "number" + } + ], + "option": "drive" + } + ], + "id": "libvirt-31" +} diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c new file mode 100644 index 0000000000..f6d672f496 --- /dev/null +++ b/tests/qemucapabilitiestest.c @@ -0,0 +1,241 @@ +/* + * Copyright (C) 2011-2013 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + * + */ + +#include + +#include "testutils.h" +#include "testutilsqemu.h" +#include "qemumonitortestutils.h" + + +#define VIR_FROM_THIS VIR_FROM_NONE + +typedef struct _testQemuData testQemuData; +typedef testQemuData * testQemuDataPtr; +struct _testQemuData { + virDomainXMLOptionPtr xmlopt; + const char *base; +}; + +static qemuMonitorTestPtr +testQemuFeedMonitor(char *replies, + virDomainXMLOptionPtr xmlopt) +{ + qemuMonitorTestPtr test = NULL; + char *tmp = replies; + char *singleReply = tmp; + + /* Our JSON parser expects replies to be separated by a newline character. + * Hence we must preprocess the file a bit. */ + while ((tmp = strchr(tmp, '\n'))) { + /* It is safe to touch tmp[1] since all strings ends with '\0'. */ + bool eof = !tmp[1]; + + if (*(tmp + 1) != '\n') { + *tmp = ' '; + tmp++; + } else { + /* Cut off a single reply. */ + *(tmp + 1) = '\0'; + + if (test) { + if (qemuMonitorTestAddItem(test, NULL, singleReply) < 0) + goto error; + } else { + /* Create new mocked monitor with our greeting */ + if (!(test = qemuMonitorTestNew(true, xmlopt, NULL, NULL, singleReply))) + goto error; + } + + if (!eof) { + /* Move the @tmp and @singleReply. */ + tmp += 2; + singleReply = tmp; + } + } + + if (eof) + break; + } + + if (test && qemuMonitorTestAddItem(test, NULL, singleReply) < 0) + goto error; + + return test; + +error: + qemuMonitorTestFree(test); + return NULL; +} + +static virQEMUCapsPtr +testQemuGetCaps(char *caps) +{ + virQEMUCapsPtr qemuCaps = NULL; + xmlDocPtr xml; + xmlXPathContextPtr ctxt = NULL; + ssize_t i, n; + xmlNodePtr *nodes = NULL; + + if (!(xml = virXMLParseStringCtxt(caps, "(test caps)", &ctxt))) + goto error; + + if ((n = virXPathNodeSet("/qemuCaps/flag", ctxt, &nodes)) < 0) { + fprintf(stderr, "failed to parse qemu capabilities flags"); + goto error; + } + + if (n > 0) { + if (!(qemuCaps = virQEMUCapsNew())) + goto error; + + for (i = 0; i < n; i++) { + char *str = virXMLPropString(nodes[i], "name"); + if (str) { + int flag = virQEMUCapsTypeFromString(str); + if (flag < 0) { + fprintf(stderr, "Unknown qemu capabilities flag %s", str); + VIR_FREE(str); + goto error; + } + VIR_FREE(str); + virQEMUCapsSet(qemuCaps, flag); + } + } + } + + VIR_FREE(nodes); + xmlFreeDoc(xml); + xmlXPathFreeContext(ctxt); + return qemuCaps; + +error: + VIR_FREE(nodes); + virObjectUnref(qemuCaps); + xmlFreeDoc(xml); + xmlXPathFreeContext(ctxt); + return NULL; +} + +static int +testQemuCapsCompare(virQEMUCapsPtr capsProvided, + virQEMUCapsPtr capsComputed) +{ + int ret = 0; + size_t i; + + for (i = 0; i < QEMU_CAPS_LAST; i++) { + if (virQEMUCapsGet(capsProvided, i) && + !virQEMUCapsGet(capsComputed, i)) { + fprintf(stderr, "Caps mismatch: capsComputed is missing %s\n", + virQEMUCapsTypeToString(i)); + ret = -1; + } + + if (virQEMUCapsGet(capsComputed, i) && + !virQEMUCapsGet(capsProvided, i)) { + fprintf(stderr, "Caps mismatch: capsProvided is missing %s\n", + virQEMUCapsTypeToString(i)); + ret = -1; + } + } + + return ret; +} + +static int +testQemuCaps(const void *opaque) +{ + int ret = -1; + const testQemuDataPtr data = (const testQemuDataPtr) opaque; + char *repliesFile = NULL, *capsFile = NULL; + char *replies = NULL, *caps = NULL; + qemuMonitorTestPtr mon = NULL; + virQEMUCapsPtr capsProvided = NULL, capsComputed = NULL; + + if (virAsprintf(&repliesFile, "%s/qemucapabilitiesdata/%s.replies", + abs_srcdir, data->base) < 0 || + virAsprintf(&capsFile, "%s/qemucapabilitiesdata/%s.caps", + abs_srcdir, data->base) < 0) + goto cleanup; + + if (virtTestLoadFile(repliesFile, &replies) < 0 || + virtTestLoadFile(capsFile, &caps) < 0) + goto cleanup; + + if (!(mon = testQemuFeedMonitor(replies, data->xmlopt))) + goto cleanup; + + if (!(capsProvided = testQemuGetCaps(caps))) + goto cleanup; + + if (!(capsComputed = virQEMUCapsNew())) + goto cleanup; + + if (virQEMUCapsInitQMPMonitor(capsComputed, + qemuMonitorTestGetMonitor(mon)) < 0) + goto cleanup; + + if (testQemuCapsCompare(capsProvided, capsComputed) < 0) + goto cleanup; + + ret = 0; +cleanup: + VIR_FREE(repliesFile); + VIR_FREE(capsFile); + VIR_FREE(replies); + VIR_FREE(caps); + qemuMonitorTestFree(mon); + virObjectUnref(capsProvided); + virObjectUnref(capsComputed); + return ret; +} + +static int +mymain(void) +{ + int ret = 0; + virDomainXMLOptionPtr xmlopt; + testQemuData data; + +#if !WITH_YAJL + fputs("libvirt not compiled with yajl, skipping this test\n", stderr); + return EXIT_AM_SKIP; +#endif + + if (virThreadInitialize() < 0 || + !(xmlopt = virQEMUDriverCreateXMLConf(NULL))) + return EXIT_FAILURE; + + virEventRegisterDefaultImpl(); + + data.xmlopt = xmlopt; + +#define DO_TEST(name) \ + data.base = name; \ + if (virtTestRun(name, 1, testQemuCaps, &data) < 0) \ + ret = -1 + + DO_TEST("caps_1.5.3-1"); + + virObjectUnref(xmlopt); + return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} + +VIRT_TEST_MAIN(mymain)