aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/migration-test.c16
-rw-r--r--tests/pxe-test.c99
-rw-r--r--tests/virtio-blk-test.c25
3 files changed, 115 insertions, 25 deletions
diff --git a/tests/migration-test.c b/tests/migration-test.c
index 799e24ebc6..9fd5dadc0d 100644
--- a/tests/migration-test.c
+++ b/tests/migration-test.c
@@ -25,6 +25,7 @@
const unsigned start_address = 1024 * 1024;
const unsigned end_address = 100 * 1024 * 1024;
bool got_stop;
+static bool uffd_feature_thread_id;
#if defined(__linux__)
#include <sys/syscall.h>
@@ -54,6 +55,7 @@ static bool ufd_version_check(void)
g_test_message("Skipping test: UFFDIO_API failed");
return false;
}
+ uffd_feature_thread_id = api_struct.features & UFFD_FEATURE_THREAD_ID;
ioctl_mask = (__u64)1 << _UFFDIO_REGISTER |
(__u64)1 << _UFFDIO_UNREGISTER;
@@ -266,6 +268,16 @@ static uint64_t get_migration_pass(QTestState *who)
return result;
}
+static void read_blocktime(QTestState *who)
+{
+ QDict *rsp, *rsp_return;
+
+ rsp = wait_command(who, "{ 'execute': 'query-migrate' }");
+ rsp_return = qdict_get_qdict(rsp, "return");
+ g_assert(qdict_haskey(rsp_return, "postcopy-blocktime"));
+ QDECREF(rsp);
+}
+
static void wait_for_migration_complete(QTestState *who)
{
QDict *rsp, *rsp_return;
@@ -525,6 +537,7 @@ static void test_migrate(void)
migrate_set_capability(from, "postcopy-ram", "true");
migrate_set_capability(to, "postcopy-ram", "true");
+ migrate_set_capability(to, "postcopy-blocktime", "true");
/* We want to pick a speed slow enough that the test completes
* quickly, but that it doesn't complete precopy even on a slow
@@ -553,6 +566,9 @@ static void test_migrate(void)
wait_for_serial("dest_serial");
wait_for_migration_complete(from);
+ if (uffd_feature_thread_id) {
+ read_blocktime(to);
+ }
g_free(uri);
test_migrate_end(from, to);
diff --git a/tests/pxe-test.c b/tests/pxe-test.c
index 937f29e631..5ca84805eb 100644
--- a/tests/pxe-test.c
+++ b/tests/pxe-test.c
@@ -22,14 +22,53 @@
static char disk[] = "tests/pxe-test-disk-XXXXXX";
-static void test_pxe_one(const char *params, bool ipv6)
+typedef struct testdef {
+ const char *machine; /* Machine type */
+ const char *model; /* NIC device model */
+} testdef_t;
+
+static testdef_t x86_tests[] = {
+ { "pc", "e1000" },
+ { "pc", "virtio-net-pci" },
+ { "q35", "e1000e" },
+ { "q35", "virtio-net-pci", },
+ { NULL },
+};
+
+static testdef_t x86_tests_slow[] = {
+ { "pc", "ne2k_pci", },
+ { "pc", "i82550", },
+ { "pc", "rtl8139" },
+ { "pc", "vmxnet3" },
+ { NULL },
+};
+
+static testdef_t ppc64_tests[] = {
+ { "pseries", "spapr-vlan" },
+ { "pseries", "virtio-net-pci", },
+ { NULL },
+};
+
+static testdef_t ppc64_tests_slow[] = {
+ { "pseries", "e1000" },
+ { NULL },
+};
+
+static testdef_t s390x_tests[] = {
+ { "s390-ccw-virtio", "virtio-net-ccw" },
+ { NULL },
+};
+
+static void test_pxe_one(const testdef_t *test, bool ipv6)
{
char *args;
- args = g_strdup_printf("-machine accel=kvm:tcg -nodefaults -boot order=n "
- "-netdev user,id=" NETNAME ",tftp=./,bootfile=%s,"
- "ipv4=%s,ipv6=%s %s", disk, ipv6 ? "off" : "on",
- ipv6 ? "on" : "off", params);
+ args = g_strdup_printf(
+ "-machine %s,accel=kvm:tcg -nodefaults -boot order=n "
+ "-netdev user,id=" NETNAME ",tftp=./,bootfile=%s,ipv4=%s,ipv6=%s "
+ "-device %s,bootindex=1,netdev=" NETNAME,
+ test->machine, disk, ipv6 ? "off" : "on", ipv6 ? "on" : "off",
+ test->model);
qtest_start(args);
boot_sector_test();
@@ -39,22 +78,38 @@ static void test_pxe_one(const char *params, bool ipv6)
static void test_pxe_ipv4(gconstpointer data)
{
- const char *model = data;
- char *dev_arg;
+ const testdef_t *test = data;
- dev_arg = g_strdup_printf("-device %s,netdev=" NETNAME, model);
- test_pxe_one(dev_arg, false);
- g_free(dev_arg);
+ test_pxe_one(test, false);
}
-static void test_pxe_spapr_vlan(void)
+static void test_pxe_ipv6(gconstpointer data)
{
- test_pxe_one("-device spapr-vlan,netdev=" NETNAME, true);
+ const testdef_t *test = data;
+
+ test_pxe_one(test, true);
}
-static void test_pxe_virtio_ccw(void)
+static void test_batch(const testdef_t *tests, bool ipv6)
{
- test_pxe_one("-device virtio-net-ccw,bootindex=1,netdev=" NETNAME, false);
+ int i;
+
+ for (i = 0; tests[i].machine; i++) {
+ const testdef_t *test = &tests[i];
+ char *testname;
+
+ testname = g_strdup_printf("pxe/ipv4/%s/%s",
+ test->machine, test->model);
+ qtest_add_data_func(testname, test, test_pxe_ipv4);
+ g_free(testname);
+
+ if (ipv6) {
+ testname = g_strdup_printf("pxe/ipv6/%s/%s",
+ test->machine, test->model);
+ qtest_add_data_func(testname, test, test_pxe_ipv6);
+ g_free(testname);
+ }
+ }
}
int main(int argc, char *argv[])
@@ -69,23 +124,17 @@ int main(int argc, char *argv[])
g_test_init(&argc, &argv, NULL);
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
- qtest_add_data_func("pxe/e1000", "e1000", test_pxe_ipv4);
- qtest_add_data_func("pxe/virtio", "virtio-net-pci", test_pxe_ipv4);
+ test_batch(x86_tests, false);
if (g_test_slow()) {
- qtest_add_data_func("pxe/ne2000", "ne2k_pci", test_pxe_ipv4);
- qtest_add_data_func("pxe/eepro100", "i82550", test_pxe_ipv4);
- qtest_add_data_func("pxe/pcnet", "pcnet", test_pxe_ipv4);
- qtest_add_data_func("pxe/rtl8139", "rtl8139", test_pxe_ipv4);
- qtest_add_data_func("pxe/vmxnet3", "vmxnet3", test_pxe_ipv4);
+ test_batch(x86_tests_slow, false);
}
} else if (strcmp(arch, "ppc64") == 0) {
- qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);
+ test_batch(ppc64_tests, g_test_slow());
if (g_test_slow()) {
- qtest_add_data_func("pxe/virtio", "virtio-net-pci", test_pxe_ipv4);
- qtest_add_data_func("pxe/e1000", "e1000", test_pxe_ipv4);
+ test_batch(ppc64_tests_slow, true);
}
} else if (g_str_equal(arch, "s390x")) {
- qtest_add_func("pxe/virtio-ccw", test_pxe_virtio_ccw);
+ test_batch(s390x_tests, g_test_slow());
}
ret = g_test_run();
boot_sector_cleanup(disk);
diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
index e6fb9bac87..45f368dcd9 100644
--- a/tests/virtio-blk-test.c
+++ b/tests/virtio-blk-test.c
@@ -674,6 +674,30 @@ static void pci_hotplug(void)
qtest_shutdown(qs);
}
+/*
+ * Check that setting the vring addr on a non-existent virtqueue does
+ * not crash.
+ */
+static void test_nonexistent_virtqueue(void)
+{
+ QPCIBar bar0;
+ QOSState *qs;
+ QPCIDevice *dev;
+
+ qs = pci_test_start();
+ dev = qpci_device_find(qs->pcibus, QPCI_DEVFN(4, 0));
+ g_assert(dev != NULL);
+
+ qpci_device_enable(dev);
+ bar0 = qpci_iomap(dev, 0, NULL);
+
+ qpci_io_writeb(dev, bar0, VIRTIO_PCI_QUEUE_SEL, 2);
+ qpci_io_writel(dev, bar0, VIRTIO_PCI_QUEUE_PFN, 1);
+
+ g_free(dev);
+ qtest_shutdown(qs);
+}
+
static void mmio_basic(void)
{
QVirtioMMIODevice *dev;
@@ -724,6 +748,7 @@ int main(int argc, char **argv)
qtest_add_func("/virtio/blk/pci/basic", pci_basic);
qtest_add_func("/virtio/blk/pci/indirect", pci_indirect);
qtest_add_func("/virtio/blk/pci/config", pci_config);
+ qtest_add_func("/virtio/blk/pci/nxvirtq", test_nonexistent_virtqueue);
if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
qtest_add_func("/virtio/blk/pci/msix", pci_msix);
qtest_add_func("/virtio/blk/pci/idx", pci_idx);