* Rework of qtests to support hot plugging tests on q35
* New VNC qtest * Fixes related to temporary file handling in the tests * Use signal() instead of sigaction() since the latter does not work on Windows * Some other small clean-ups -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmNGz1URHHRodXRoQHJl ZGhhdC5jb20ACgkQLtnXdP5wLbXwxxAAoh9CeYKLyPFPe71XGsSWW4mQDkny+4CA AFBfcEchPSyOoTJwuSHS5cL27KkL1Wy7wTSlWdcQ2Z4LA8hexopfPtCVlizH8vQh hHVP5KLDY7WA7bsuRznrjUjXtjLL9mExuPm3QZ+YxH/3rNhISvq1GfC9Z5PQ/zNp GagCW+WiFyEYyhRHJnVVTJfZV0NCbJp9KCCJ6n/Rag80JRQiouGQsKLfRoRhvkGC 13dWq2NeDq9xE1k1ThUZdIpUxJO4cA+9bh6LzGOIcHX8akfkryh3NGCWuojX3XDF 2CRyyblfjMIp5HUcKNOrQzY1oGRn8y5537ycUkEsropSMdAccIqNwlcWO7whLEGn 7nbogrPt8Orezytl5ZM3WopWlge5KA2vxOUURx487LnZC2/g7l2unrCDv0c3PHDb U2fD5do7ZtPOl9Uz8QkYPo5CzEDnKPmPv1txOMBRcBZsvmXPZMxRWwsYavB/RloG nI9IvG3ZW6ivKwoPPceJberL8Ndq+pqn7y4CNNAAunHSjJ2H0YS1m1F/HfVWKJYJ uStXy3IZ5Qo8E+IRbPYyM68yBgrnaShuAvTSax8tWjhHOR8HetrzPABMrWylCrdo gaeSCEZmqf2zIYHQ2q8c7U/YrHgFNHlLz9yCyM6rZtU9dOAe52PG2TlRQomlGP76 NKnti3RJWG4= =4f+b -----END PGP SIGNATURE----- Merge tag 'pull-request-2022-10-12' of https://gitlab.com/thuth/qemu into staging * Rework of qtests to support hot plugging tests on q35 * New VNC qtest * Fixes related to temporary file handling in the tests * Use signal() instead of sigaction() since the latter does not work on Windows * Some other small clean-ups # -----BEGIN PGP SIGNATURE----- # # iQJFBAABCAAvFiEEJ7iIR+7gJQEY8+q5LtnXdP5wLbUFAmNGz1URHHRodXRoQHJl # ZGhhdC5jb20ACgkQLtnXdP5wLbXwxxAAoh9CeYKLyPFPe71XGsSWW4mQDkny+4CA # AFBfcEchPSyOoTJwuSHS5cL27KkL1Wy7wTSlWdcQ2Z4LA8hexopfPtCVlizH8vQh # hHVP5KLDY7WA7bsuRznrjUjXtjLL9mExuPm3QZ+YxH/3rNhISvq1GfC9Z5PQ/zNp # GagCW+WiFyEYyhRHJnVVTJfZV0NCbJp9KCCJ6n/Rag80JRQiouGQsKLfRoRhvkGC # 13dWq2NeDq9xE1k1ThUZdIpUxJO4cA+9bh6LzGOIcHX8akfkryh3NGCWuojX3XDF # 2CRyyblfjMIp5HUcKNOrQzY1oGRn8y5537ycUkEsropSMdAccIqNwlcWO7whLEGn # 7nbogrPt8Orezytl5ZM3WopWlge5KA2vxOUURx487LnZC2/g7l2unrCDv0c3PHDb # U2fD5do7ZtPOl9Uz8QkYPo5CzEDnKPmPv1txOMBRcBZsvmXPZMxRWwsYavB/RloG # nI9IvG3ZW6ivKwoPPceJberL8Ndq+pqn7y4CNNAAunHSjJ2H0YS1m1F/HfVWKJYJ # uStXy3IZ5Qo8E+IRbPYyM68yBgrnaShuAvTSax8tWjhHOR8HetrzPABMrWylCrdo # gaeSCEZmqf2zIYHQ2q8c7U/YrHgFNHlLz9yCyM6rZtU9dOAe52PG2TlRQomlGP76 # NKnti3RJWG4= # =4f+b # -----END PGP SIGNATURE----- # gpg: Signature made Wed 12 Oct 2022 10:29:41 EDT # gpg: using RSA key 27B88847EEE0250118F3EAB92ED9D774FE702DB5 # gpg: issuer "thuth@redhat.com" # gpg: Good signature from "Thomas Huth <th.huth@gmx.de>" [full] # gpg: aka "Thomas Huth <thuth@redhat.com>" [full] # gpg: aka "Thomas Huth <huth@tuxfamily.org>" [full] # gpg: aka "Thomas Huth <th.huth@posteo.de>" [unknown] # Primary key fingerprint: 27B8 8847 EEE0 2501 18F3 EAB9 2ED9 D774 FE70 2DB5 * tag 'pull-request-2022-10-12' of https://gitlab.com/thuth/qemu: tests/unit/test-image-locking: Fix handling of temporary files tests/qtest: libqtest: Install signal handler via signal() tests/qtest: migration-test: Avoid using hardcoded /tmp qtest: start a VNC test tests/avocado: Add missing require_netdev('user') checks tests/x86: Add 'q35' machine type to ivshmem-test tests/x86: Add 'q35' machine type to drive_del-test tests/x86: replace snprint() by g_strdup_printf() in drive_del-test tests/x86: Fix comment typo in drive_del-test tests/x86: Add 'q35' machine type to hotplug hd-geo-test tests/x86: Add 'q35' machine type to override-tests in hd-geo-test tests/x86: Refactor hot unplug hd-geo-test tests/x86: Add subtest with 'q35' machine type to device-plug-test tests/x86: add helper qtest_qmp_device_del_send() tests/migration: remove the unused local variable qtest: "-display none" is set in qtest_init() Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
7a37814aeb
@ -381,6 +381,8 @@ class BootLinuxConsole(LinuxKernelTest):
|
|||||||
:avocado: tags=u-boot
|
:avocado: tags=u-boot
|
||||||
:avocado: tags=accel:tcg
|
:avocado: tags=accel:tcg
|
||||||
"""
|
"""
|
||||||
|
self.require_netdev('user')
|
||||||
|
|
||||||
uboot_url = ('https://raw.githubusercontent.com/'
|
uboot_url = ('https://raw.githubusercontent.com/'
|
||||||
'Subbaraya-Sundeep/qemu-test-binaries/'
|
'Subbaraya-Sundeep/qemu-test-binaries/'
|
||||||
'fe371d32e50ca682391e1e70ab98c2942aeffb01/u-boot')
|
'fe371d32e50ca682391e1e70ab98c2942aeffb01/u-boot')
|
||||||
@ -779,6 +781,8 @@ class BootLinuxConsole(LinuxKernelTest):
|
|||||||
:avocado: tags=machine:orangepi-pc
|
:avocado: tags=machine:orangepi-pc
|
||||||
:avocado: tags=device:sd
|
:avocado: tags=device:sd
|
||||||
"""
|
"""
|
||||||
|
self.require_netdev('user')
|
||||||
|
|
||||||
deb_url = ('https://apt.armbian.com/pool/main/l/'
|
deb_url = ('https://apt.armbian.com/pool/main/l/'
|
||||||
'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
|
'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb')
|
||||||
deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
|
deb_hash = '9fa84beda245cabf0b4fa84cf6eaa7738ead1da0'
|
||||||
|
@ -93,6 +93,8 @@ class AST2x00Machine(QemuSystemTest):
|
|||||||
self.do_test_arm_aspeed(image_path)
|
self.do_test_arm_aspeed(image_path)
|
||||||
|
|
||||||
def do_test_arm_aspeed_buidroot_start(self, image, cpu_id):
|
def do_test_arm_aspeed_buidroot_start(self, image, cpu_id):
|
||||||
|
self.require_netdev('user')
|
||||||
|
|
||||||
self.vm.set_console()
|
self.vm.set_console()
|
||||||
self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
|
self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
|
||||||
'-net', 'nic', '-net', 'user')
|
'-net', 'nic', '-net', 'user')
|
||||||
@ -193,6 +195,7 @@ class AST2x00MachineSDK(QemuSystemTest):
|
|||||||
vm=vm)
|
vm=vm)
|
||||||
|
|
||||||
def do_test_arm_aspeed_sdk_start(self, image, cpu_id):
|
def do_test_arm_aspeed_sdk_start(self, image, cpu_id):
|
||||||
|
self.require_netdev('user')
|
||||||
self.vm.set_console()
|
self.vm.set_console()
|
||||||
self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
|
self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
|
||||||
'-net', 'nic', '-net', 'user')
|
'-net', 'nic', '-net', 'user')
|
||||||
|
@ -23,6 +23,7 @@ class BambooMachine(QemuSystemTest):
|
|||||||
:avocado: tags=accel:tcg
|
:avocado: tags=accel:tcg
|
||||||
"""
|
"""
|
||||||
self.require_accelerator("tcg")
|
self.require_accelerator("tcg")
|
||||||
|
self.require_netdev('user')
|
||||||
tar_url = ('http://landley.net/aboriginal/downloads/binaries/'
|
tar_url = ('http://landley.net/aboriginal/downloads/binaries/'
|
||||||
'system-image-powerpc-440fp.tar.gz')
|
'system-image-powerpc-440fp.tar.gz')
|
||||||
tar_hash = '53e5f16414b195b82d2c70272f81c2eedb39bad9'
|
tar_hash = '53e5f16414b195b82d2c70272f81c2eedb39bad9'
|
||||||
|
@ -65,7 +65,6 @@ class Engine(object):
|
|||||||
return records
|
return records
|
||||||
|
|
||||||
def _cpu_timing(self, pid):
|
def _cpu_timing(self, pid):
|
||||||
records = []
|
|
||||||
now = time.time()
|
now = time.time()
|
||||||
|
|
||||||
jiffies_per_sec = os.sysconf(os.sysconf_names['SC_CLK_TCK'])
|
jiffies_per_sec = os.sysconf(os.sysconf_names['SC_CLK_TCK'])
|
||||||
|
@ -725,7 +725,7 @@ static char *test_acpi_create_args(test_data *data, const char *params,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
args = g_strdup_printf("-machine %s %s -accel tcg "
|
args = g_strdup_printf("-machine %s %s -accel tcg "
|
||||||
"-net none -display none %s "
|
"-net none %s "
|
||||||
"-drive id=hd0,if=none,file=%s,format=raw "
|
"-drive id=hd0,if=none,file=%s,format=raw "
|
||||||
"-device %s,drive=hd0 ",
|
"-device %s,drive=hd0 ",
|
||||||
data->machine, data->tcg_only ? "" : "-accel kvm",
|
data->machine, data->tcg_only ? "" : "-accel kvm",
|
||||||
|
@ -15,17 +15,6 @@
|
|||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|
||||||
static void device_del(QTestState *qtest, const char *id)
|
|
||||||
{
|
|
||||||
QDict *resp;
|
|
||||||
|
|
||||||
resp = qtest_qmp(qtest,
|
|
||||||
"{'execute': 'device_del', 'arguments': { 'id': %s } }", id);
|
|
||||||
|
|
||||||
g_assert(qdict_haskey(resp, "return"));
|
|
||||||
qobject_unref(resp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void system_reset(QTestState *qtest)
|
static void system_reset(QTestState *qtest)
|
||||||
{
|
{
|
||||||
QDict *resp;
|
QDict *resp;
|
||||||
@ -68,7 +57,7 @@ static void process_device_remove(QTestState *qtest, const char *id)
|
|||||||
* be processed. However during system reset, the removal will be
|
* be processed. However during system reset, the removal will be
|
||||||
* handled, removing the device.
|
* handled, removing the device.
|
||||||
*/
|
*/
|
||||||
device_del(qtest, id);
|
qtest_qmp_device_del_send(qtest, id);
|
||||||
system_reset(qtest);
|
system_reset(qtest);
|
||||||
wait_device_deleted_event(qtest, id);
|
wait_device_deleted_event(qtest, id);
|
||||||
}
|
}
|
||||||
@ -90,6 +79,19 @@ static void test_pci_unplug_request(void)
|
|||||||
qtest_quit(qtest);
|
qtest_quit(qtest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_q35_pci_unplug_request(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
QTestState *qtest = qtest_initf("-machine q35 "
|
||||||
|
"-device pcie-root-port,id=p1 "
|
||||||
|
"-device pcie-pci-bridge,bus=p1,id=b1 "
|
||||||
|
"-device virtio-mouse-pci,bus=b1,id=dev0");
|
||||||
|
|
||||||
|
process_device_remove(qtest, "dev0");
|
||||||
|
|
||||||
|
qtest_quit(qtest);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_pci_unplug_json_request(void)
|
static void test_pci_unplug_json_request(void)
|
||||||
{
|
{
|
||||||
const char *arch = qtest_get_arch();
|
const char *arch = qtest_get_arch();
|
||||||
@ -108,11 +110,32 @@ static void test_pci_unplug_json_request(void)
|
|||||||
qtest_quit(qtest);
|
qtest_quit(qtest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_q35_pci_unplug_json_request(void)
|
||||||
|
{
|
||||||
|
const char *port = "-device '{\"driver\": \"pcie-root-port\", "
|
||||||
|
"\"id\": \"p1\"}'";
|
||||||
|
|
||||||
|
const char *bridge = "-device '{\"driver\": \"pcie-pci-bridge\", "
|
||||||
|
"\"id\": \"b1\", "
|
||||||
|
"\"bus\": \"p1\"}'";
|
||||||
|
|
||||||
|
const char *device = "-device '{\"driver\": \"virtio-mouse-pci\", "
|
||||||
|
"\"bus\": \"b1\", "
|
||||||
|
"\"id\": \"dev0\"}'";
|
||||||
|
|
||||||
|
QTestState *qtest = qtest_initf("-machine q35 %s %s %s",
|
||||||
|
port, bridge, device);
|
||||||
|
|
||||||
|
process_device_remove(qtest, "dev0");
|
||||||
|
|
||||||
|
qtest_quit(qtest);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_ccw_unplug(void)
|
static void test_ccw_unplug(void)
|
||||||
{
|
{
|
||||||
QTestState *qtest = qtest_initf("-device virtio-balloon-ccw,id=dev0");
|
QTestState *qtest = qtest_initf("-device virtio-balloon-ccw,id=dev0");
|
||||||
|
|
||||||
device_del(qtest, "dev0");
|
qtest_qmp_device_del_send(qtest, "dev0");
|
||||||
wait_device_deleted_event(qtest, "dev0");
|
wait_device_deleted_event(qtest, "dev0");
|
||||||
|
|
||||||
qtest_quit(qtest);
|
qtest_quit(qtest);
|
||||||
@ -187,5 +210,12 @@ int main(int argc, char **argv)
|
|||||||
test_spapr_phb_unplug_request);
|
test_spapr_phb_unplug_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strcmp(arch, "x86_64") && qtest_has_machine("q35")) {
|
||||||
|
qtest_add_func("/device-plug/q35-pci-unplug-request",
|
||||||
|
test_q35_pci_unplug_request);
|
||||||
|
qtest_add_func("/device-plug/q35-pci-unplug-json-request",
|
||||||
|
test_q35_pci_unplug_json_request);
|
||||||
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
@ -123,12 +123,10 @@ static const char *qvirtio_get_dev_type(void)
|
|||||||
|
|
||||||
static void device_add(QTestState *qts)
|
static void device_add(QTestState *qts)
|
||||||
{
|
{
|
||||||
QDict *response;
|
g_autofree char *driver = g_strdup_printf("virtio-blk-%s",
|
||||||
char driver[32];
|
|
||||||
snprintf(driver, sizeof(driver), "virtio-blk-%s",
|
|
||||||
qvirtio_get_dev_type());
|
qvirtio_get_dev_type());
|
||||||
|
QDict *response =
|
||||||
response = qtest_qmp(qts, "{'execute': 'device_add',"
|
qtest_qmp(qts, "{'execute': 'device_add',"
|
||||||
" 'arguments': {"
|
" 'arguments': {"
|
||||||
" 'driver': %s,"
|
" 'driver': %s,"
|
||||||
" 'drive': 'drive0',"
|
" 'drive': 'drive0',"
|
||||||
@ -143,11 +141,7 @@ static void device_del(QTestState *qts, bool and_reset)
|
|||||||
{
|
{
|
||||||
QDict *response;
|
QDict *response;
|
||||||
|
|
||||||
response = qtest_qmp(qts, "{'execute': 'device_del',"
|
qtest_qmp_device_del_send(qts, "dev0");
|
||||||
" 'arguments': { 'id': 'dev0' } }");
|
|
||||||
g_assert(response);
|
|
||||||
g_assert(qdict_haskey(response, "return"));
|
|
||||||
qobject_unref(response);
|
|
||||||
|
|
||||||
if (and_reset) {
|
if (and_reset) {
|
||||||
response = qtest_qmp(qts, "{'execute': 'system_reset' }");
|
response = qtest_qmp(qts, "{'execute': 'system_reset' }");
|
||||||
@ -258,6 +252,27 @@ static void test_cli_device_del(void)
|
|||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_cli_device_del_q35(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -drive/-device and device_del. Start with a drive used by a
|
||||||
|
* device that unplugs after reset.
|
||||||
|
*/
|
||||||
|
qts = qtest_initf("-drive if=none,id=drive0,file=null-co://,"
|
||||||
|
"file.read-zeroes=on,format=raw "
|
||||||
|
"-machine q35 -device pcie-root-port,id=p1 "
|
||||||
|
"-device pcie-pci-bridge,bus=p1,id=b1 "
|
||||||
|
"-device virtio-blk-%s,drive=drive0,bus=b1,id=dev0",
|
||||||
|
qvirtio_get_dev_type());
|
||||||
|
|
||||||
|
device_del(qts, true);
|
||||||
|
g_assert(!has_drive(qts));
|
||||||
|
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_empty_device_del(void)
|
static void test_empty_device_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
@ -294,6 +309,43 @@ static void test_device_add_and_del(void)
|
|||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void device_add_q35(QTestState *qts)
|
||||||
|
{
|
||||||
|
g_autofree char *driver = g_strdup_printf("virtio-blk-%s",
|
||||||
|
qvirtio_get_dev_type());
|
||||||
|
QDict *response =
|
||||||
|
qtest_qmp(qts, "{'execute': 'device_add',"
|
||||||
|
" 'arguments': {"
|
||||||
|
" 'driver': %s,"
|
||||||
|
" 'drive': 'drive0',"
|
||||||
|
" 'id': 'dev0',"
|
||||||
|
" 'bus': 'b1'"
|
||||||
|
"}}", driver);
|
||||||
|
g_assert(response);
|
||||||
|
g_assert(qdict_haskey(response, "return"));
|
||||||
|
qobject_unref(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_device_add_and_del_q35(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -drive/device_add and device_del. Start with a drive used by a
|
||||||
|
* device that unplugs after reset.
|
||||||
|
*/
|
||||||
|
qts = qtest_initf("-machine q35 -device pcie-root-port,id=p1 "
|
||||||
|
"-device pcie-pci-bridge,bus=p1,id=b1 "
|
||||||
|
"-drive if=none,id=drive0,file=null-co://,"
|
||||||
|
"file.read-zeroes=on,format=raw");
|
||||||
|
|
||||||
|
device_add_q35(qts);
|
||||||
|
device_del(qts, true);
|
||||||
|
g_assert(!has_drive(qts));
|
||||||
|
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_drive_add_device_add_and_del(void)
|
static void test_drive_add_device_add_and_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
@ -318,6 +370,25 @@ static void test_drive_add_device_add_and_del(void)
|
|||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_drive_add_device_add_and_del_q35(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
|
||||||
|
qts = qtest_init("-machine q35 -device pcie-root-port,id=p1 "
|
||||||
|
"-device pcie-pci-bridge,bus=p1,id=b1");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* drive_add/device_add and device_del. The drive is used by a
|
||||||
|
* device that unplugs after reset.
|
||||||
|
*/
|
||||||
|
drive_add_with_media(qts);
|
||||||
|
device_add_q35(qts);
|
||||||
|
device_del(qts, true);
|
||||||
|
g_assert(!has_drive(qts));
|
||||||
|
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_blockdev_add_device_add_and_del(void)
|
static void test_blockdev_add_device_add_and_del(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
@ -331,7 +402,7 @@ static void test_blockdev_add_device_add_and_del(void)
|
|||||||
qts = qtest_init(machine_addition);
|
qts = qtest_init(machine_addition);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* blockdev_add/device_add and device_del. The it drive is used by a
|
* blockdev_add/device_add and device_del. The drive is used by a
|
||||||
* device that unplugs after reset, but it doesn't go away.
|
* device that unplugs after reset, but it doesn't go away.
|
||||||
*/
|
*/
|
||||||
blockdev_add_with_media(qts);
|
blockdev_add_with_media(qts);
|
||||||
@ -342,6 +413,25 @@ static void test_blockdev_add_device_add_and_del(void)
|
|||||||
qtest_quit(qts);
|
qtest_quit(qts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_blockdev_add_device_add_and_del_q35(void)
|
||||||
|
{
|
||||||
|
QTestState *qts;
|
||||||
|
|
||||||
|
qts = qtest_init("-machine q35 -device pcie-root-port,id=p1 "
|
||||||
|
"-device pcie-pci-bridge,bus=p1,id=b1");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* blockdev_add/device_add and device_del. The drive is used by a
|
||||||
|
* device that unplugs after reset, but it doesn't go away.
|
||||||
|
*/
|
||||||
|
blockdev_add_with_media(qts);
|
||||||
|
device_add_q35(qts);
|
||||||
|
device_del(qts, true);
|
||||||
|
g_assert(has_blockdev(qts));
|
||||||
|
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
@ -363,6 +453,17 @@ int main(int argc, char **argv)
|
|||||||
test_empty_device_del);
|
test_empty_device_del);
|
||||||
qtest_add_func("/device_del/blockdev",
|
qtest_add_func("/device_del/blockdev",
|
||||||
test_blockdev_add_device_add_and_del);
|
test_blockdev_add_device_add_and_del);
|
||||||
|
|
||||||
|
if (qtest_has_machine("q35")) {
|
||||||
|
qtest_add_func("/device_del/drive/cli_device_q35",
|
||||||
|
test_cli_device_del_q35);
|
||||||
|
qtest_add_func("/device_del/drive/device_add_q35",
|
||||||
|
test_device_add_and_del_q35);
|
||||||
|
qtest_add_func("/device_del/drive/drive_add_device_add_q35",
|
||||||
|
test_drive_add_device_add_and_del_q35);
|
||||||
|
qtest_add_func("/device_del/blockdev_q35",
|
||||||
|
test_blockdev_add_device_add_and_del_q35);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_test_run();
|
return g_test_run();
|
||||||
|
@ -21,7 +21,7 @@ static void test_lsi_do_msgout_cancel_req(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
s = qtest_init("-M q35 -m 2G -display none -nodefaults "
|
s = qtest_init("-M q35 -m 2G -nodefaults "
|
||||||
"-device lsi53c895a,id=scsi "
|
"-device lsi53c895a,id=scsi "
|
||||||
"-device scsi-hd,drive=disk0 "
|
"-device scsi-hd,drive=disk0 "
|
||||||
"-drive file=null-co://,id=disk0,if=none,format=raw");
|
"-drive file=null-co://,id=disk0,if=none,format=raw");
|
||||||
|
@ -40,7 +40,7 @@ static void test_lp1878263_megasas_zero_iov_cnt(void)
|
|||||||
*/
|
*/
|
||||||
static void test_gitlab_issue521_megasas_sgl_ovf(void)
|
static void test_gitlab_issue521_megasas_sgl_ovf(void)
|
||||||
{
|
{
|
||||||
QTestState *s = qtest_init("-display none -m 32M -machine q35 "
|
QTestState *s = qtest_init("-m 32M -machine q35 "
|
||||||
"-nodefaults -device megasas "
|
"-nodefaults -device megasas "
|
||||||
"-device scsi-cd,drive=null0 "
|
"-device scsi-cd,drive=null0 "
|
||||||
"-blockdev "
|
"-blockdev "
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
static void test_fuzz_sb16_0x1c(void)
|
static void test_fuzz_sb16_0x1c(void)
|
||||||
{
|
{
|
||||||
QTestState *s = qtest_init("-M q35 -display none "
|
QTestState *s = qtest_init("-M q35 "
|
||||||
"-device sb16,audiodev=snd0 "
|
"-device sb16,audiodev=snd0 "
|
||||||
"-audiodev none,id=snd0");
|
"-audiodev none,id=snd0");
|
||||||
qtest_outw(s, 0x22c, 0x41);
|
qtest_outw(s, 0x22c, 0x41);
|
||||||
@ -27,7 +27,7 @@ static void test_fuzz_sb16_0x1c(void)
|
|||||||
|
|
||||||
static void test_fuzz_sb16_0x91(void)
|
static void test_fuzz_sb16_0x91(void)
|
||||||
{
|
{
|
||||||
QTestState *s = qtest_init("-M pc -display none "
|
QTestState *s = qtest_init("-M pc "
|
||||||
"-device sb16,audiodev=none "
|
"-device sb16,audiodev=none "
|
||||||
"-audiodev id=none,driver=none");
|
"-audiodev id=none,driver=none");
|
||||||
qtest_outw(s, 0x22c, 0xf141);
|
qtest_outw(s, 0x22c, 0xf141);
|
||||||
@ -43,7 +43,7 @@ static void test_fuzz_sb16_0x91(void)
|
|||||||
*/
|
*/
|
||||||
static void test_fuzz_sb16_0xd4(void)
|
static void test_fuzz_sb16_0xd4(void)
|
||||||
{
|
{
|
||||||
QTestState *s = qtest_init("-M pc -display none "
|
QTestState *s = qtest_init("-M pc "
|
||||||
"-device sb16,audiodev=none "
|
"-device sb16,audiodev=none "
|
||||||
"-audiodev id=none,driver=none");
|
"-audiodev id=none,driver=none");
|
||||||
qtest_outb(s, 0x22c, 0x41);
|
qtest_outb(s, 0x22c, 0x41);
|
||||||
|
@ -18,7 +18,7 @@ static void oss_fuzz_29225(void)
|
|||||||
{
|
{
|
||||||
QTestState *s;
|
QTestState *s;
|
||||||
|
|
||||||
s = qtest_init(" -display none -m 512m -nodefaults -nographic"
|
s = qtest_init(" -m 512m -nodefaults -nographic"
|
||||||
" -device sdhci-pci,sd-spec-version=3"
|
" -device sdhci-pci,sd-spec-version=3"
|
||||||
" -device sd-card,drive=d0"
|
" -device sd-card,drive=d0"
|
||||||
" -drive if=none,index=0,file=null-co://,format=raw,id=d0");
|
" -drive if=none,index=0,file=null-co://,format=raw,id=d0");
|
||||||
@ -61,7 +61,7 @@ static void oss_fuzz_36217(void)
|
|||||||
{
|
{
|
||||||
QTestState *s;
|
QTestState *s;
|
||||||
|
|
||||||
s = qtest_init(" -display none -m 32 -nodefaults -nographic"
|
s = qtest_init(" -m 32 -nodefaults -nographic"
|
||||||
" -device sdhci-pci,sd-spec-version=3 "
|
" -device sdhci-pci,sd-spec-version=3 "
|
||||||
"-device sd-card,drive=d0 "
|
"-device sd-card,drive=d0 "
|
||||||
"-drive if=none,index=0,file=null-co://,format=raw,id=d0");
|
"-drive if=none,index=0,file=null-co://,format=raw,id=d0");
|
||||||
@ -95,7 +95,7 @@ static void oss_fuzz_36391(void)
|
|||||||
{
|
{
|
||||||
QTestState *s;
|
QTestState *s;
|
||||||
|
|
||||||
s = qtest_init(" -display none -m 512M -nodefaults -nographic"
|
s = qtest_init(" -m 512M -nodefaults -nographic"
|
||||||
" -device sdhci-pci,sd-spec-version=3"
|
" -device sdhci-pci,sd-spec-version=3"
|
||||||
" -device sd-card,drive=drv"
|
" -device sd-card,drive=drv"
|
||||||
" -drive if=none,index=0,file=null-co://,format=raw,id=drv");
|
" -drive if=none,index=0,file=null-co://,format=raw,id=drv");
|
||||||
|
@ -19,7 +19,7 @@ static void test_mmio_oob_from_memory_region_cache(void)
|
|||||||
{
|
{
|
||||||
QTestState *s;
|
QTestState *s;
|
||||||
|
|
||||||
s = qtest_init("-M pc-q35-5.2 -display none -m 512M "
|
s = qtest_init("-M pc-q35-5.2 -m 512M "
|
||||||
"-device virtio-scsi,num_queues=8,addr=03.0 ");
|
"-device virtio-scsi,num_queues=8,addr=03.0 ");
|
||||||
|
|
||||||
qtest_outl(s, 0xcf8, 0x80001811);
|
qtest_outl(s, 0xcf8, 0x80001811);
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
static void test_fuzz_xlnx_dp_0x3ac(void)
|
static void test_fuzz_xlnx_dp_0x3ac(void)
|
||||||
{
|
{
|
||||||
QTestState *s = qtest_init("-M xlnx-zcu102 -display none ");
|
QTestState *s = qtest_init("-M xlnx-zcu102 ");
|
||||||
qtest_readl(s, 0xfd4a03ac);
|
qtest_readl(s, 0xfd4a03ac);
|
||||||
qtest_quit(s);
|
qtest_quit(s);
|
||||||
}
|
}
|
||||||
|
@ -691,7 +691,8 @@ static void add_virtio_disk(TestArgs *args,
|
|||||||
args->n_virtio_disks++;
|
args->n_virtio_disks++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override(TestArgs *args, CHSResult expected[])
|
static void test_override(TestArgs *args, const char *arch,
|
||||||
|
CHSResult expected[])
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
char *joined_args;
|
char *joined_args;
|
||||||
@ -700,7 +701,7 @@ static void test_override(TestArgs *args, CHSResult expected[])
|
|||||||
|
|
||||||
joined_args = g_strjoinv(" ", args->argv);
|
joined_args = g_strjoinv(" ", args->argv);
|
||||||
|
|
||||||
qts = qtest_initf("-machine pc %s", joined_args);
|
qts = qtest_initf("-machine %s %s", arch, joined_args);
|
||||||
fw_cfg = pc_fw_cfg_init(qts);
|
fw_cfg = pc_fw_cfg_init(qts);
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected);
|
read_bootdevices(fw_cfg, expected);
|
||||||
@ -737,7 +738,28 @@ static void test_override_ide(void)
|
|||||||
add_ide_disk(args, 1, 0, 1, 9000, 120, 30);
|
add_ide_disk(args, 1, 0, 1, 9000, 120, 30);
|
||||||
add_ide_disk(args, 2, 1, 0, 0, 1, 1);
|
add_ide_disk(args, 2, 1, 0, 0, 1, 1);
|
||||||
add_ide_disk(args, 3, 1, 1, 1, 0, 0);
|
add_ide_disk(args, 3, 1, 1, 1, 0, 0);
|
||||||
test_override(args, expected);
|
test_override(args, "pc", expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_override_sata(void)
|
||||||
|
{
|
||||||
|
TestArgs *args = create_args();
|
||||||
|
CHSResult expected[] = {
|
||||||
|
{"/pci@i0cf8/pci8086,2922@1f,2/drive@0/disk@0", {10000, 120, 30} },
|
||||||
|
{"/pci@i0cf8/pci8086,2922@1f,2/drive@1/disk@0", {9000, 120, 30} },
|
||||||
|
{"/pci@i0cf8/pci8086,2922@1f,2/drive@2/disk@0", {0, 1, 1} },
|
||||||
|
{"/pci@i0cf8/pci8086,2922@1f,2/drive@3/disk@0", {1, 0, 0} },
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_ide_disk(args, 0, 0, 0, 10000, 120, 30);
|
||||||
|
add_ide_disk(args, 1, 1, 0, 9000, 120, 30);
|
||||||
|
add_ide_disk(args, 2, 2, 0, 0, 1, 1);
|
||||||
|
add_ide_disk(args, 3, 3, 0, 1, 0, 0);
|
||||||
|
test_override(args, "q35", expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override_scsi(void)
|
static void test_override_scsi(void)
|
||||||
@ -759,7 +781,43 @@ static void test_override_scsi(void)
|
|||||||
add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
|
add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
|
||||||
add_scsi_disk(args, 2, 0, 0, 2, 0, 1, 0, 0);
|
add_scsi_disk(args, 2, 0, 0, 2, 0, 1, 0, 0);
|
||||||
add_scsi_disk(args, 3, 0, 0, 3, 0, 0, 1, 0);
|
add_scsi_disk(args, 3, 0, 0, 3, 0, 0, 1, 0);
|
||||||
test_override(args, expected);
|
test_override(args, "pc", expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setup_pci_bridge(TestArgs *args, const char *id, const char *rootid)
|
||||||
|
{
|
||||||
|
|
||||||
|
char *root, *br;
|
||||||
|
root = g_strdup_printf("-device pcie-root-port,id=%s", rootid);
|
||||||
|
br = g_strdup_printf("-device pcie-pci-bridge,bus=%s,id=%s", rootid, id);
|
||||||
|
|
||||||
|
args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, root);
|
||||||
|
args->argc = append_arg(args->argc, args->argv, ARGV_SIZE, br);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_override_scsi_q35(void)
|
||||||
|
{
|
||||||
|
TestArgs *args = create_args();
|
||||||
|
CHSResult expected[] = {
|
||||||
|
{ "/pci@i0cf8/pci-bridge@1/scsi@3/channel@0/disk@0,0",
|
||||||
|
{10000, 120, 30}
|
||||||
|
},
|
||||||
|
{"/pci@i0cf8/pci-bridge@1/scsi@3/channel@0/disk@1,0", {9000, 120, 30} },
|
||||||
|
{"/pci@i0cf8/pci-bridge@1/scsi@3/channel@0/disk@2,0", {1, 0, 0} },
|
||||||
|
{"/pci@i0cf8/pci-bridge@1/scsi@3/channel@0/disk@3,0", {0, 1, 0} },
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
setup_pci_bridge(args, "pcie.0", "br");
|
||||||
|
add_scsi_controller(args, "lsi53c895a", "br", 3);
|
||||||
|
add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
|
||||||
|
add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
|
||||||
|
add_scsi_disk(args, 2, 0, 0, 2, 0, 1, 0, 0);
|
||||||
|
add_scsi_disk(args, 3, 0, 0, 3, 0, 0, 1, 0);
|
||||||
|
test_override(args, "q35", expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override_scsi_2_controllers(void)
|
static void test_override_scsi_2_controllers(void)
|
||||||
@ -782,7 +840,7 @@ static void test_override_scsi_2_controllers(void)
|
|||||||
add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
|
add_scsi_disk(args, 1, 0, 0, 1, 0, 9000, 120, 30);
|
||||||
add_scsi_disk(args, 2, 1, 0, 0, 1, 1, 0, 0);
|
add_scsi_disk(args, 2, 1, 0, 0, 1, 1, 0, 0);
|
||||||
add_scsi_disk(args, 3, 1, 0, 1, 2, 0, 1, 0);
|
add_scsi_disk(args, 3, 1, 0, 1, 2, 0, 1, 0);
|
||||||
test_override(args, expected);
|
test_override(args, "pc", expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override_virtio_blk(void)
|
static void test_override_virtio_blk(void)
|
||||||
@ -797,7 +855,23 @@ static void test_override_virtio_blk(void)
|
|||||||
add_drive_with_mbr(args, empty_mbr, 1);
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
add_virtio_disk(args, 0, "pci.0", 3, 10000, 120, 30);
|
add_virtio_disk(args, 0, "pci.0", 3, 10000, 120, 30);
|
||||||
add_virtio_disk(args, 1, "pci.0", 4, 9000, 120, 30);
|
add_virtio_disk(args, 1, "pci.0", 4, 9000, 120, 30);
|
||||||
test_override(args, expected);
|
test_override(args, "pc", expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_override_virtio_blk_q35(void)
|
||||||
|
{
|
||||||
|
TestArgs *args = create_args();
|
||||||
|
CHSResult expected[] = {
|
||||||
|
{"/pci@i0cf8/pci-bridge@1/scsi@3/disk@0,0", {10000, 120, 30} },
|
||||||
|
{"/pci@i0cf8/pci-bridge@1/scsi@4/disk@0,0", {9000, 120, 30} },
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
setup_pci_bridge(args, "pcie.0", "br");
|
||||||
|
add_virtio_disk(args, 0, "br", 3, 10000, 120, 30);
|
||||||
|
add_virtio_disk(args, 1, "br", 4, 9000, 120, 30);
|
||||||
|
test_override(args, "q35", expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override_zero_chs(void)
|
static void test_override_zero_chs(void)
|
||||||
@ -808,16 +882,65 @@ static void test_override_zero_chs(void)
|
|||||||
};
|
};
|
||||||
add_drive_with_mbr(args, empty_mbr, 1);
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
add_ide_disk(args, 0, 1, 1, 0, 0, 0);
|
add_ide_disk(args, 0, 1, 1, 0, 0, 0);
|
||||||
test_override(args, expected);
|
test_override(args, "pc", expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override_scsi_hot_unplug(void)
|
static void test_override_zero_chs_q35(void)
|
||||||
|
{
|
||||||
|
TestArgs *args = create_args();
|
||||||
|
CHSResult expected[] = {
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_ide_disk(args, 0, 0, 0, 0, 0, 0);
|
||||||
|
test_override(args, "q35", expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_override_hot_unplug(TestArgs *args, const char *devid,
|
||||||
|
CHSResult expected[], CHSResult expected2[])
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
QTestState *qts;
|
||||||
char *joined_args;
|
char *joined_args;
|
||||||
QFWCFG *fw_cfg;
|
QFWCFG *fw_cfg;
|
||||||
QDict *response;
|
QDict *response;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
joined_args = g_strjoinv(" ", args->argv);
|
||||||
|
|
||||||
|
qts = qtest_initf("%s", joined_args);
|
||||||
|
fw_cfg = pc_fw_cfg_init(qts);
|
||||||
|
|
||||||
|
read_bootdevices(fw_cfg, expected);
|
||||||
|
|
||||||
|
/* unplug device an restart */
|
||||||
|
qtest_qmp_device_del_send(qts, devid);
|
||||||
|
|
||||||
|
response = qtest_qmp(qts,
|
||||||
|
"{ 'execute': 'system_reset', 'arguments': { }}");
|
||||||
|
g_assert(response);
|
||||||
|
g_assert(!qdict_haskey(response, "error"));
|
||||||
|
qobject_unref(response);
|
||||||
|
|
||||||
|
qtest_qmp_eventwait(qts, "RESET");
|
||||||
|
|
||||||
|
read_bootdevices(fw_cfg, expected2);
|
||||||
|
|
||||||
|
g_free(joined_args);
|
||||||
|
qtest_quit(qts);
|
||||||
|
|
||||||
|
g_free(fw_cfg);
|
||||||
|
|
||||||
|
for (i = 0; i < args->n_drives; i++) {
|
||||||
|
unlink(args->drives[i]);
|
||||||
|
g_free(args->drives[i]);
|
||||||
|
}
|
||||||
|
g_free(args->drives);
|
||||||
|
g_strfreev(args->argv);
|
||||||
|
g_free(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_override_scsi_hot_unplug(void)
|
||||||
|
{
|
||||||
TestArgs *args = create_args();
|
TestArgs *args = create_args();
|
||||||
CHSResult expected[] = {
|
CHSResult expected[] = {
|
||||||
{"/pci@i0cf8/scsi@2/channel@0/disk@0,0", {10000, 120, 30} },
|
{"/pci@i0cf8/scsi@2/channel@0/disk@0,0", {10000, 120, 30} },
|
||||||
@ -834,51 +957,50 @@ static void test_override_scsi_hot_unplug(void)
|
|||||||
add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
|
add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
|
||||||
add_scsi_disk(args, 1, 0, 0, 1, 0, 20, 20, 20);
|
add_scsi_disk(args, 1, 0, 0, 1, 0, 20, 20, 20);
|
||||||
|
|
||||||
joined_args = g_strjoinv(" ", args->argv);
|
args->argc = append_arg(args->argc, args->argv, ARGV_SIZE,
|
||||||
|
g_strdup("-machine pc"));
|
||||||
|
|
||||||
qts = qtest_initf("-machine pc %s", joined_args);
|
test_override_hot_unplug(args, "scsi-disk0", expected, expected2);
|
||||||
fw_cfg = pc_fw_cfg_init(qts);
|
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected);
|
|
||||||
|
|
||||||
/* unplug device an restart */
|
|
||||||
response = qtest_qmp(qts,
|
|
||||||
"{ 'execute': 'device_del',"
|
|
||||||
" 'arguments': {'id': 'scsi-disk0' }}");
|
|
||||||
g_assert(response);
|
|
||||||
g_assert(!qdict_haskey(response, "error"));
|
|
||||||
qobject_unref(response);
|
|
||||||
response = qtest_qmp(qts,
|
|
||||||
"{ 'execute': 'system_reset', 'arguments': { }}");
|
|
||||||
g_assert(response);
|
|
||||||
g_assert(!qdict_haskey(response, "error"));
|
|
||||||
qobject_unref(response);
|
|
||||||
|
|
||||||
qtest_qmp_eventwait(qts, "RESET");
|
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected2);
|
|
||||||
|
|
||||||
g_free(joined_args);
|
|
||||||
qtest_quit(qts);
|
|
||||||
|
|
||||||
g_free(fw_cfg);
|
|
||||||
|
|
||||||
for (i = 0; i < args->n_drives; i++) {
|
|
||||||
unlink(args->drives[i]);
|
|
||||||
g_free(args->drives[i]);
|
|
||||||
}
|
}
|
||||||
g_free(args->drives);
|
|
||||||
g_strfreev(args->argv);
|
static void test_override_scsi_hot_unplug_q35(void)
|
||||||
g_free(args);
|
{
|
||||||
|
TestArgs *args = create_args();
|
||||||
|
CHSResult expected[] = {
|
||||||
|
{
|
||||||
|
"/pci@i0cf8/pci-bridge@1/pci-bridge@0/scsi@2/channel@0/disk@0,0",
|
||||||
|
{10000, 120, 30}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/pci@i0cf8/pci-bridge@1/pci-bridge@0/scsi@2/channel@0/disk@1,0",
|
||||||
|
{20, 20, 20}
|
||||||
|
},
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
CHSResult expected2[] = {
|
||||||
|
{
|
||||||
|
"/pci@i0cf8/pci-bridge@1/pci-bridge@0/scsi@2/channel@0/disk@1,0",
|
||||||
|
{20, 20, 20}
|
||||||
|
},
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
|
||||||
|
args->argc = append_arg(args->argc, args->argv, ARGV_SIZE,
|
||||||
|
g_strdup("-device pcie-root-port,id=p0 "
|
||||||
|
"-device pcie-pci-bridge,bus=p0,id=b1 "
|
||||||
|
"-machine q35"));
|
||||||
|
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_scsi_controller(args, "virtio-scsi-pci", "b1", 2);
|
||||||
|
add_scsi_disk(args, 0, 0, 0, 0, 0, 10000, 120, 30);
|
||||||
|
add_scsi_disk(args, 1, 0, 0, 1, 0, 20, 20, 20);
|
||||||
|
|
||||||
|
test_override_hot_unplug(args, "scsi-disk0", expected, expected2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_override_virtio_hot_unplug(void)
|
static void test_override_virtio_hot_unplug(void)
|
||||||
{
|
{
|
||||||
QTestState *qts;
|
|
||||||
char *joined_args;
|
|
||||||
QFWCFG *fw_cfg;
|
|
||||||
QDict *response;
|
|
||||||
int i;
|
|
||||||
TestArgs *args = create_args();
|
TestArgs *args = create_args();
|
||||||
CHSResult expected[] = {
|
CHSResult expected[] = {
|
||||||
{"/pci@i0cf8/scsi@2/disk@0,0", {10000, 120, 30} },
|
{"/pci@i0cf8/scsi@2/disk@0,0", {10000, 120, 30} },
|
||||||
@ -894,42 +1016,45 @@ static void test_override_virtio_hot_unplug(void)
|
|||||||
add_virtio_disk(args, 0, "pci.0", 2, 10000, 120, 30);
|
add_virtio_disk(args, 0, "pci.0", 2, 10000, 120, 30);
|
||||||
add_virtio_disk(args, 1, "pci.0", 3, 20, 20, 20);
|
add_virtio_disk(args, 1, "pci.0", 3, 20, 20, 20);
|
||||||
|
|
||||||
joined_args = g_strjoinv(" ", args->argv);
|
args->argc = append_arg(args->argc, args->argv, ARGV_SIZE,
|
||||||
|
g_strdup("-machine pc"));
|
||||||
|
|
||||||
qts = qtest_initf("-machine pc %s", joined_args);
|
test_override_hot_unplug(args, "virtio-disk0", expected, expected2);
|
||||||
fw_cfg = pc_fw_cfg_init(qts);
|
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected);
|
|
||||||
|
|
||||||
/* unplug device an restart */
|
|
||||||
response = qtest_qmp(qts,
|
|
||||||
"{ 'execute': 'device_del',"
|
|
||||||
" 'arguments': {'id': 'virtio-disk0' }}");
|
|
||||||
g_assert(response);
|
|
||||||
g_assert(!qdict_haskey(response, "error"));
|
|
||||||
qobject_unref(response);
|
|
||||||
response = qtest_qmp(qts,
|
|
||||||
"{ 'execute': 'system_reset', 'arguments': { }}");
|
|
||||||
g_assert(response);
|
|
||||||
g_assert(!qdict_haskey(response, "error"));
|
|
||||||
qobject_unref(response);
|
|
||||||
|
|
||||||
qtest_qmp_eventwait(qts, "RESET");
|
|
||||||
|
|
||||||
read_bootdevices(fw_cfg, expected2);
|
|
||||||
|
|
||||||
g_free(joined_args);
|
|
||||||
qtest_quit(qts);
|
|
||||||
|
|
||||||
g_free(fw_cfg);
|
|
||||||
|
|
||||||
for (i = 0; i < args->n_drives; i++) {
|
|
||||||
unlink(args->drives[i]);
|
|
||||||
g_free(args->drives[i]);
|
|
||||||
}
|
}
|
||||||
g_free(args->drives);
|
|
||||||
g_strfreev(args->argv);
|
static void test_override_virtio_hot_unplug_q35(void)
|
||||||
g_free(args);
|
{
|
||||||
|
TestArgs *args = create_args();
|
||||||
|
CHSResult expected[] = {
|
||||||
|
{
|
||||||
|
"/pci@i0cf8/pci-bridge@1/pci-bridge@0/scsi@2/disk@0,0",
|
||||||
|
{10000, 120, 30}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"/pci@i0cf8/pci-bridge@1/pci-bridge@0/scsi@3/disk@0,0",
|
||||||
|
{20, 20, 20}
|
||||||
|
},
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
CHSResult expected2[] = {
|
||||||
|
{
|
||||||
|
"/pci@i0cf8/pci-bridge@1/pci-bridge@0/scsi@3/disk@0,0",
|
||||||
|
{20, 20, 20}
|
||||||
|
},
|
||||||
|
{NULL, {0, 0, 0} }
|
||||||
|
};
|
||||||
|
|
||||||
|
args->argc = append_arg(args->argc, args->argv, ARGV_SIZE,
|
||||||
|
g_strdup("-device pcie-root-port,id=p0 "
|
||||||
|
"-device pcie-pci-bridge,bus=p0,id=b1 "
|
||||||
|
"-machine q35"));
|
||||||
|
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_drive_with_mbr(args, empty_mbr, 1);
|
||||||
|
add_virtio_disk(args, 0, "b1", 2, 10000, 120, 30);
|
||||||
|
add_virtio_disk(args, 1, "b1", 3, 20, 20, 20);
|
||||||
|
|
||||||
|
test_override_hot_unplug(args, "virtio-disk0", expected, expected2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
@ -974,6 +1099,22 @@ int main(int argc, char **argv)
|
|||||||
test_override_scsi_hot_unplug);
|
test_override_scsi_hot_unplug);
|
||||||
qtest_add_func("hd-geo/override/virtio_hot_unplug",
|
qtest_add_func("hd-geo/override/virtio_hot_unplug",
|
||||||
test_override_virtio_hot_unplug);
|
test_override_virtio_hot_unplug);
|
||||||
|
|
||||||
|
if (qtest_has_machine("q35")) {
|
||||||
|
qtest_add_func("hd-geo/override/sata", test_override_sata);
|
||||||
|
qtest_add_func("hd-geo/override/virtio_blk_q35",
|
||||||
|
test_override_virtio_blk_q35);
|
||||||
|
qtest_add_func("hd-geo/override/zero_chs_q35",
|
||||||
|
test_override_zero_chs_q35);
|
||||||
|
if (qtest_has_device("lsi53c895a")) {
|
||||||
|
qtest_add_func("hd-geo/override/scsi_q35",
|
||||||
|
test_override_scsi_q35);
|
||||||
|
}
|
||||||
|
qtest_add_func("hd-geo/override/scsi_hot_unplug_q35",
|
||||||
|
test_override_scsi_hot_unplug_q35);
|
||||||
|
qtest_add_func("hd-geo/override/virtio_hot_unplug_q35",
|
||||||
|
test_override_virtio_hot_unplug_q35);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
g_test_message("QTEST_QEMU_IMG not set or qemu-img missing; "
|
g_test_message("QTEST_QEMU_IMG not set or qemu-img missing; "
|
||||||
"skipping hd-geo/override/* tests");
|
"skipping hd-geo/override/* tests");
|
||||||
|
@ -378,6 +378,20 @@ static void test_ivshmem_server(void)
|
|||||||
close(thread.pipe[0]);
|
close(thread.pipe[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_ivshmem_hotplug_q35(void)
|
||||||
|
{
|
||||||
|
QTestState *qts = qtest_init("-object memory-backend-ram,size=1M,id=mb1 "
|
||||||
|
"-device pcie-root-port,id=p1 "
|
||||||
|
"-device pcie-pci-bridge,bus=p1,id=b1 "
|
||||||
|
"-machine q35");
|
||||||
|
|
||||||
|
qtest_qmp_device_add(qts, "ivshmem-plain", "iv1",
|
||||||
|
"{'memdev': 'mb1', 'bus': 'b1'}");
|
||||||
|
qtest_qmp_device_del_send(qts, "iv1");
|
||||||
|
|
||||||
|
qtest_quit(qts);
|
||||||
|
}
|
||||||
|
|
||||||
#define PCI_SLOT_HP 0x06
|
#define PCI_SLOT_HP 0x06
|
||||||
|
|
||||||
static void test_ivshmem_hotplug(void)
|
static void test_ivshmem_hotplug(void)
|
||||||
@ -469,6 +483,7 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int ret, fd;
|
int ret, fd;
|
||||||
gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
|
gchar dir[] = "/tmp/ivshmem-test.XXXXXX";
|
||||||
|
const char *arch = qtest_get_arch();
|
||||||
|
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
@ -494,6 +509,9 @@ int main(int argc, char **argv)
|
|||||||
qtest_add_func("/ivshmem/pair", test_ivshmem_pair);
|
qtest_add_func("/ivshmem/pair", test_ivshmem_pair);
|
||||||
qtest_add_func("/ivshmem/server", test_ivshmem_server);
|
qtest_add_func("/ivshmem/server", test_ivshmem_server);
|
||||||
}
|
}
|
||||||
|
if (!strcmp(arch, "x86_64") && qtest_has_machine("q35")) {
|
||||||
|
qtest_add_func("/ivshmem/hotplug-q35", test_ivshmem_hotplug_q35);
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
@ -179,13 +179,7 @@ void qpci_free_pc(QPCIBus *bus)
|
|||||||
|
|
||||||
void qpci_unplug_acpi_device_test(QTestState *qts, const char *id, uint8_t slot)
|
void qpci_unplug_acpi_device_test(QTestState *qts, const char *id, uint8_t slot)
|
||||||
{
|
{
|
||||||
QDict *response;
|
qtest_qmp_device_del_send(qts, id);
|
||||||
|
|
||||||
response = qtest_qmp(qts, "{'execute': 'device_del',"
|
|
||||||
" 'arguments': {'id': %s}}", id);
|
|
||||||
g_assert(response);
|
|
||||||
g_assert(!qdict_haskey(response, "error"));
|
|
||||||
qobject_unref(response);
|
|
||||||
|
|
||||||
qtest_outl(qts, ACPI_PCIHP_ADDR + PCI_EJ_BASE, 1 << slot);
|
qtest_outl(qts, ACPI_PCIHP_ADDR + PCI_EJ_BASE, 1 << slot);
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ struct QTestState
|
|||||||
};
|
};
|
||||||
|
|
||||||
static GHookList abrt_hooks;
|
static GHookList abrt_hooks;
|
||||||
static struct sigaction sigact_old;
|
static void (*sighandler_old)(int);
|
||||||
|
|
||||||
static int qtest_query_target_endianness(QTestState *s);
|
static int qtest_query_target_endianness(QTestState *s);
|
||||||
|
|
||||||
@ -179,20 +179,12 @@ static void sigabrt_handler(int signo)
|
|||||||
|
|
||||||
static void setup_sigabrt_handler(void)
|
static void setup_sigabrt_handler(void)
|
||||||
{
|
{
|
||||||
struct sigaction sigact;
|
sighandler_old = signal(SIGABRT, sigabrt_handler);
|
||||||
|
|
||||||
/* Catch SIGABRT to clean up on g_assert() failure */
|
|
||||||
sigact = (struct sigaction){
|
|
||||||
.sa_handler = sigabrt_handler,
|
|
||||||
.sa_flags = SA_RESETHAND,
|
|
||||||
};
|
|
||||||
sigemptyset(&sigact.sa_mask);
|
|
||||||
sigaction(SIGABRT, &sigact, &sigact_old);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cleanup_sigabrt_handler(void)
|
static void cleanup_sigabrt_handler(void)
|
||||||
{
|
{
|
||||||
sigaction(SIGABRT, &sigact_old, NULL);
|
signal(SIGABRT, sighandler_old);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hook_list_is_empty(GHookList *hook_list)
|
static bool hook_list_is_empty(GHookList *hook_list)
|
||||||
@ -1371,15 +1363,19 @@ void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd)
|
|||||||
*
|
*
|
||||||
* {"return": {}}
|
* {"return": {}}
|
||||||
*/
|
*/
|
||||||
|
void qtest_qmp_device_del_send(QTestState *qts, const char *id)
|
||||||
|
{
|
||||||
|
QDict *rsp = qtest_qmp(qts, "{'execute': 'device_del', "
|
||||||
|
"'arguments': {'id': %s}}", id);
|
||||||
|
g_assert(rsp);
|
||||||
|
g_assert(qdict_haskey(rsp, "return"));
|
||||||
|
g_assert(!qdict_haskey(rsp, "error"));
|
||||||
|
qobject_unref(rsp);
|
||||||
|
}
|
||||||
|
|
||||||
void qtest_qmp_device_del(QTestState *qts, const char *id)
|
void qtest_qmp_device_del(QTestState *qts, const char *id)
|
||||||
{
|
{
|
||||||
QDict *rsp;
|
qtest_qmp_device_del_send(qts, id);
|
||||||
|
|
||||||
rsp = qtest_qmp(qts, "{'execute': 'device_del', 'arguments': {'id': %s}}",
|
|
||||||
id);
|
|
||||||
|
|
||||||
g_assert(qdict_haskey(rsp, "return"));
|
|
||||||
qobject_unref(rsp);
|
|
||||||
qtest_qmp_eventwait(qts, "DEVICE_DELETED");
|
qtest_qmp_eventwait(qts, "DEVICE_DELETED");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -761,12 +761,22 @@ void qtest_qmp_device_add(QTestState *qts, const char *driver, const char *id,
|
|||||||
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
void qtest_qmp_add_client(QTestState *qts, const char *protocol, int fd);
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qtest_qmp_device_del_send:
|
||||||
|
* @qts: QTestState instance to operate on
|
||||||
|
* @id: Identification string
|
||||||
|
*
|
||||||
|
* Generic hot-unplugging test via the device_del QMP command.
|
||||||
|
*/
|
||||||
|
void qtest_qmp_device_del_send(QTestState *qts, const char *id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qtest_qmp_device_del:
|
* qtest_qmp_device_del:
|
||||||
* @qts: QTestState instance to operate on
|
* @qts: QTestState instance to operate on
|
||||||
* @id: Identification string
|
* @id: Identification string
|
||||||
*
|
*
|
||||||
* Generic hot-unplugging test via the device_del QMP command.
|
* Generic hot-unplugging test via the device_del QMP command.
|
||||||
|
* Waiting for command completion event.
|
||||||
*/
|
*/
|
||||||
void qtest_qmp_device_del(QTestState *qts, const char *id);
|
void qtest_qmp_device_del(QTestState *qts, const char *id);
|
||||||
|
|
||||||
|
@ -306,6 +306,12 @@ qtests = {
|
|||||||
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
|
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gvnc = dependency('gvnc-1.0', required: false)
|
||||||
|
if gvnc.found()
|
||||||
|
qtests += {'vnc-display-test': [gvnc]}
|
||||||
|
qtests_generic += [ 'vnc-display-test' ]
|
||||||
|
endif
|
||||||
|
|
||||||
if dbus_display
|
if dbus_display
|
||||||
qtests += {'dbus-display-test': [dbus_display1, gio]}
|
qtests += {'dbus-display-test': [dbus_display1, gio]}
|
||||||
endif
|
endif
|
||||||
|
@ -102,7 +102,7 @@ static bool ufd_version_check(void)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char *tmpfs;
|
static char *tmpfs;
|
||||||
|
|
||||||
/* The boot file modifies memory area in [start_address, end_address)
|
/* The boot file modifies memory area in [start_address, end_address)
|
||||||
* repeatedly. It outputs a 'B' at a fixed rate while it's still running.
|
* repeatedly. It outputs a 'B' at a fixed rate while it's still running.
|
||||||
@ -2451,10 +2451,10 @@ static bool kvm_dirty_ring_supported(void)
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char template[] = "/tmp/migration-test-XXXXXX";
|
|
||||||
const bool has_kvm = qtest_has_accel("kvm");
|
const bool has_kvm = qtest_has_accel("kvm");
|
||||||
const bool has_uffd = ufd_version_check();
|
const bool has_uffd = ufd_version_check();
|
||||||
const char *arch = qtest_get_arch();
|
const char *arch = qtest_get_arch();
|
||||||
|
g_autoptr(GError) err = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
g_test_init(&argc, &argv, NULL);
|
g_test_init(&argc, &argv, NULL);
|
||||||
@ -2479,9 +2479,10 @@ int main(int argc, char **argv)
|
|||||||
return g_test_run();
|
return g_test_run();
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpfs = g_mkdtemp(template);
|
tmpfs = g_dir_make_tmp("migration-test-XXXXXX", &err);
|
||||||
if (!tmpfs) {
|
if (!tmpfs) {
|
||||||
g_test_message("g_mkdtemp on path (%s): %s", template, strerror(errno));
|
g_test_message("g_dir_make_tmp on path (%s): %s", tmpfs,
|
||||||
|
err->message);
|
||||||
}
|
}
|
||||||
g_assert(tmpfs);
|
g_assert(tmpfs);
|
||||||
|
|
||||||
@ -2612,6 +2613,7 @@ int main(int argc, char **argv)
|
|||||||
g_test_message("unable to rmdir: path (%s): %s",
|
g_test_message("unable to rmdir: path (%s): %s",
|
||||||
tmpfs, strerror(errno));
|
tmpfs, strerror(errno));
|
||||||
}
|
}
|
||||||
|
g_free(tmpfs);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
103
tests/qtest/vnc-display-test.c
Normal file
103
tests/qtest/vnc-display-test.c
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* VNC display tests
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/sockets.h"
|
||||||
|
#include "libqtest.h"
|
||||||
|
#include <gio/gio.h>
|
||||||
|
#include <gvnc.h>
|
||||||
|
|
||||||
|
typedef struct Test {
|
||||||
|
QTestState *qts;
|
||||||
|
VncConnection *conn;
|
||||||
|
GMainLoop *loop;
|
||||||
|
} Test;
|
||||||
|
|
||||||
|
static void on_vnc_error(VncConnection* self,
|
||||||
|
const char* msg)
|
||||||
|
{
|
||||||
|
g_error("vnc-error: %s", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_vnc_auth_failure(VncConnection *self,
|
||||||
|
const char *msg)
|
||||||
|
{
|
||||||
|
g_error("vnc-auth-failure: %s", msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
test_setup(Test *test)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
g_test_skip("Not supported on Windows yet");
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
int pair[2];
|
||||||
|
|
||||||
|
test->qts = qtest_init("-vnc none -name vnc-test");
|
||||||
|
|
||||||
|
g_assert_cmpint(qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, pair), ==, 0);
|
||||||
|
|
||||||
|
qtest_qmp_add_client(test->qts, "vnc", pair[1]);
|
||||||
|
|
||||||
|
test->conn = vnc_connection_new();
|
||||||
|
g_signal_connect(test->conn, "vnc-error",
|
||||||
|
G_CALLBACK(on_vnc_error), NULL);
|
||||||
|
g_signal_connect(test->conn, "vnc-auth-failure",
|
||||||
|
G_CALLBACK(on_vnc_auth_failure), NULL);
|
||||||
|
vnc_connection_set_auth_type(test->conn, VNC_CONNECTION_AUTH_NONE);
|
||||||
|
vnc_connection_open_fd(test->conn, pair[0]);
|
||||||
|
|
||||||
|
test->loop = g_main_loop_new(NULL, FALSE);
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_vnc_basic_on_vnc_initialized(VncConnection *self,
|
||||||
|
Test *test)
|
||||||
|
{
|
||||||
|
const char *name = vnc_connection_get_name(test->conn);
|
||||||
|
|
||||||
|
g_assert_cmpstr(name, ==, "QEMU (vnc-test)");
|
||||||
|
g_main_loop_quit(test->loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_vnc_basic(void)
|
||||||
|
{
|
||||||
|
Test test;
|
||||||
|
|
||||||
|
if (!test_setup(&test)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_signal_connect(test.conn, "vnc-initialized",
|
||||||
|
G_CALLBACK(test_vnc_basic_on_vnc_initialized), &test);
|
||||||
|
|
||||||
|
g_main_loop_run(test.loop);
|
||||||
|
|
||||||
|
qtest_quit(test.qts);
|
||||||
|
g_object_unref(test.conn);
|
||||||
|
g_main_loop_unref(test.loop);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (getenv("GTK_VNC_DEBUG")) {
|
||||||
|
vnc_util_set_debug(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_test_init(&argc, &argv, NULL);
|
||||||
|
|
||||||
|
qtest_add_func("/vnc-display/basic", test_vnc_basic);
|
||||||
|
|
||||||
|
return g_test_run();
|
||||||
|
}
|
@ -79,7 +79,7 @@ static void test_image_locking_basic(void)
|
|||||||
g_autofree char *img_path = NULL;
|
g_autofree char *img_path = NULL;
|
||||||
uint64_t perm, shared_perm;
|
uint64_t perm, shared_perm;
|
||||||
|
|
||||||
int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
|
int fd = g_file_open_tmp("qemu-tst-img-lock.XXXXXX", &img_path, NULL);
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
|
|
||||||
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
||||||
@ -120,7 +120,7 @@ static void test_set_perm_abort(void)
|
|||||||
g_autofree char *img_path = NULL;
|
g_autofree char *img_path = NULL;
|
||||||
uint64_t perm, shared_perm;
|
uint64_t perm, shared_perm;
|
||||||
int r;
|
int r;
|
||||||
int fd = g_file_open_tmp("qtest.XXXXXX", &img_path, NULL);
|
int fd = g_file_open_tmp("qemu-tst-img-lock.XXXXXX", &img_path, NULL);
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
|
|
||||||
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
perm = BLK_PERM_WRITE | BLK_PERM_CONSISTENT_READ;
|
||||||
@ -140,6 +140,8 @@ static void test_set_perm_abort(void)
|
|||||||
check_locked_bytes(fd, perm, ~shared_perm);
|
check_locked_bytes(fd, perm, ~shared_perm);
|
||||||
blk_unref(blk1);
|
blk_unref(blk1);
|
||||||
blk_unref(blk2);
|
blk_unref(blk2);
|
||||||
|
close(fd);
|
||||||
|
unlink(img_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
|
Loading…
Reference in New Issue
Block a user