#include <glib/gstdio.h>
#include <gio/gio.h>
#include "libqtest.h"
+#include "migration/migration-qmp.h"
#include "dbus-vmstate1.h"
-#include "migration-helpers.h"
static char *workdir;
typedef struct Test {
const char *id_list;
- bool migrate_fail;
+ int result;
bool without_dst_b;
TestServer srcA;
TestServer dstA;
g_autofree char *uri = NULL;
QTestState *src_qemu = NULL, *dst_qemu = NULL;
guint ownsrcA, ownsrcB, owndstA, owndstB;
+ QTestMigrationState src_state = { };
uri = g_strdup_printf("unix:%s/migsocket", workdir);
src_qemu = qtest_init(src_qemu_args);
dst_qemu = qtest_init(dst_qemu_args);
+
+ migrate_set_capability(src_qemu, "events", true);
+ qtest_qmp_set_event_callback(src_qemu, migrate_watch_for_events,
+ &src_state);
+
set_id_list(test, src_qemu);
set_id_list(test, dst_qemu);
thread = g_thread_new("dbus-vmstate-thread", dbus_vmstate_thread, loop);
migrate_incoming_qmp(dst_qemu, uri, NULL, "{}");
- migrate_qmp(src_qemu, uri, "{}");
+ migrate_ensure_converge(src_qemu);
+ migrate_qmp(src_qemu, NULL, uri, NULL, "{}");
test->src_qemu = src_qemu;
- if (test->migrate_fail) {
- wait_for_migration_fail(src_qemu, true);
- qtest_set_expected_status(dst_qemu, EXIT_FAILURE);
+
+ if (test->result != MIG_TEST_SUCCEED) {
+ QDict *rsp;
+
+ migration_event_wait(src_qemu, "failing");
+ wait_for_resume(src_qemu, &src_state);
+ migration_event_wait(src_qemu, "failed");
+
+ rsp = qtest_qmp_assert_success_ref(src_qemu,
+ "{ 'execute': 'query-status' }");
+ g_assert(qdict_haskey(rsp, "running"));
+ g_assert(qdict_get_bool(rsp, "running"));
+ qobject_unref(rsp);
} else {
wait_for_migration_complete(src_qemu);
}
}
static void
-test_dbus_vmstate_without_list(void)
+test_dbus_vmstate_without_list(char *name, MigrateCommon *args)
{
Test test = { 0, };
}
static void
-test_dbus_vmstate_with_list(void)
+test_dbus_vmstate_with_list(char *name, MigrateCommon *args)
{
Test test = { .id_list = "idA,idB" };
}
static void
-test_dbus_vmstate_only_a(void)
+test_dbus_vmstate_only_a(char *name, MigrateCommon *args)
{
Test test = { .id_list = "idA" };
}
static void
-test_dbus_vmstate_missing_src(void)
+test_dbus_vmstate_missing_src(char *name, MigrateCommon *args)
{
- Test test = { .id_list = "idA,idC", .migrate_fail = true };
+ Test test = { .id_list = "idA,idC",
+ .result = MIG_TEST_FAIL };
/* run in subprocess to silence QEMU error reporting */
if (g_test_subprocess()) {
}
static void
-test_dbus_vmstate_missing_dst(void)
+test_dbus_vmstate_missing_dst(char *name, MigrateCommon *args)
{
Test test = { .id_list = "idA,idB",
.without_dst_b = true,
- .migrate_fail = true };
+ .result = MIG_TEST_FAIL };
/* run in subprocess to silence QEMU error reporting */
if (g_test_subprocess()) {
main(int argc, char **argv)
{
GError *err = NULL;
- g_autofree char *dbus_daemon = NULL;
int ret;
- dbus_daemon = g_build_filename(G_STRINGIFY(SRCDIR),
- "tests",
- "dbus-vmstate-daemon.sh",
- NULL);
- g_setenv("G_TEST_DBUS_DAEMON", dbus_daemon, true);
-
g_test_init(&argc, &argv, NULL);
workdir = g_dir_make_tmp("dbus-vmstate-test-XXXXXX", &err);
g_setenv("DBUS_VMSTATE_TEST_TMPDIR", workdir, true);
- qtest_add_func("/dbus-vmstate/without-list",
- test_dbus_vmstate_without_list);
- qtest_add_func("/dbus-vmstate/with-list",
- test_dbus_vmstate_with_list);
- qtest_add_func("/dbus-vmstate/only-a",
- test_dbus_vmstate_only_a);
- qtest_add_func("/dbus-vmstate/missing-src",
- test_dbus_vmstate_missing_src);
- qtest_add_func("/dbus-vmstate/missing-dst",
- test_dbus_vmstate_missing_dst);
+ migration_test_add("/dbus-vmstate/without-list",
+ test_dbus_vmstate_without_list);
+ migration_test_add("/dbus-vmstate/with-list",
+ test_dbus_vmstate_with_list);
+ migration_test_add("/dbus-vmstate/only-a",
+ test_dbus_vmstate_only_a);
+ migration_test_add("/dbus-vmstate/missing-src",
+ test_dbus_vmstate_missing_src);
+ migration_test_add("/dbus-vmstate/missing-dst",
+ test_dbus_vmstate_missing_dst);
ret = g_test_run();
# Temporarily disabled due to Patchew failures:
#qtests_i386 += ['dbus-vmstate-test']
dbus_vmstate1 = custom_target('dbus-vmstate description',
- output: ['dbus-vmstate1.h', 'dbus-vmstate1.c'],
+ build_by_default: true,
+ output: [ 'dbus-vmstate1.h', 'dbus-vmstate1.c'],
input: meson.project_source_root() / 'backends/dbus-vmstate1.xml',
command: [gdbus_codegen, '@INPUT@',
'--interface-prefix', 'org.qemu',
+ '--output-directory', meson.current_build_dir(),
'--generate-c-code', '@BASENAME@']).to_list()
else
dbus_vmstate1 = []
'bios-tables-test': [io, 'boot-sector.c', 'acpi-utils.c', 'tpm-emu.c'],
'cdrom-test': files('boot-sector.c'),
'dbus-vmstate-test': files('migration/migration-qmp.c',
- 'migration/migration-util.c') + dbus_vmstate1,
+ 'migration/migration-util.c') + dbus_vmstate1 +
+ [gio],
'erst-test': files('erst-test.c'),
'ivshmem-test': [rt, '../../contrib/ivshmem-server/ivshmem-server.c'],
'migration-test': test_migration_files + migration_tls_files + migration_colo_files,