From 63857eb4a0ce6334091069a54c0b8eb11ad5a5e2 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 19 Sep 2013 13:44:41 +0200 Subject: [PATCH] tests: Introduce qemucapabilitiestest This test is there to ensure that our capabilities detection code isn't broken somehow. How to gather test data: Firstly, the data is split into two separate files. The former (with suffix .replies) contains all the qemu replies. This is very fragile as introducing a new device can mean yet another monitor command and hence edit of this file in the future. But there's no better way of doing this. To get this data simply turn on debug logs and copy all the QEMU_MONITOR_IO_PROCESS lines. But be careful to not copy incomplete ones (yeah, we report some incomplete lines too). Long story short, at the libvirtd startup, a dummy qemu is spawn to get all the capabilities. The latter (with suffix .caps) contains capabilities XML. Just start a domain and copy the corresponding part from its state XML file. Including tag. Signed-off-by: Michal Privoznik --- .gitignore | 1 + tests/Makefile.am | 12 +- tests/qemucapabilitiesdata/caps_1.5.3-1.caps | 133 + .../qemucapabilitiesdata/caps_1.5.3-1.replies | 2519 +++++++++++++++++ tests/qemucapabilitiestest.c | 241 ++ 5 files changed, 2904 insertions(+), 2 deletions(-) create mode 100644 tests/qemucapabilitiesdata/caps_1.5.3-1.caps create mode 100644 tests/qemucapabilitiesdata/caps_1.5.3-1.replies create mode 100644 tests/qemucapabilitiestest.c 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)