#include "migration/framework.h"
#include "migration/migration-qmp.h"
#include "migration/migration-util.h"
+#include "qapi/error.h"
+#include "qobject/qjson.h"
+#include "qobject/qlist.h"
static char *tmpfs;
test_file_common(args, true);
}
-static void *test_mode_transfer_start(QTestState *from, QTestState *to)
+static int test_transfer(MigrateCommon *args, const char *cpr_channel,
+ bool incoming_defer)
{
+ QTestState *from, *to;
+ QObject *obj, *out_channels = qobject_from_json(args->connect_channels,
+ &error_abort);
+ QList *channels_list;
+
+ /*
+ * The cpr channel must be included in outgoing channels, but not in
+ * migrate-incoming channels.
+ */
+ channels_list = qobject_to(QList, out_channels);
+ obj = migrate_str_to_channel(cpr_channel);
+ qlist_append(channels_list, obj);
+
+ if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ return -1;
+ }
+
migrate_set_parameter_str(from, "mode", "cpr-transfer");
- return NULL;
+
+ wait_for_serial("src_serial");
+
+ qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}");
+ wait_for_stop(from, get_src());
+ migrate_ensure_converge(from);
+
+ migrate_qmp(from, to, NULL, out_channels, "{}");
+
+ qtest_connect(to);
+ qtest_qmp_handshake(to, NULL);
+ if (incoming_defer) {
+ QObject *in_channels = qobject_from_json(args->connect_channels,
+ &error_abort);
+
+ migrate_incoming_qmp(to, NULL, in_channels, "{}");
+ }
+
+ wait_for_migration_complete(from);
+ wait_for_migration_complete(to);
+
+ qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}");
+
+ wait_for_resume(to, get_dst());
+ wait_for_serial("dest_serial");
+
+ migrate_end(from, to, true);
+
+ return 0;
}
/*
args->listen_uri = incoming_defer ? "defer" : uri;
args->connect_channels = connect_channels;
- args->cpr_channel = cpr_channel;
- args->start_hook = test_mode_transfer_start;
args->start.opts_source = opts;
args->start.opts_target = opts_target;
args->start.defer_target_connect = true;
args->start.mem_type = MEM_TYPE_MEMFD;
- if (test_precopy_common(args) < 0) {
+ if (test_transfer(args, cpr_channel, incoming_defer) < 0) {
close(cpr_sockfd);
unlink(cpr_path);
}
#include "ppc-util.h"
#include "qapi/error.h"
#include "qobject/qjson.h"
-#include "qobject/qlist.h"
#include "qemu/bswap.h"
#include "qemu/module.h"
#include "qemu/option.h"
{
QTestState *from, *to;
void *data_hook = NULL;
- QObject *in_channels = NULL;
- QObject *out_channels = NULL;
-
- g_assert(!args->cpr_channel || args->connect_channels);
+ QObject *channels = NULL;
if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
return -1;
}
}
- /*
- * The cpr channel must be included in outgoing channels, but not in
- * migrate-incoming channels.
- */
if (args->connect_channels) {
- if (args->start.defer_target_connect &&
- !strcmp(args->listen_uri, "defer")) {
- in_channels = qobject_from_json(args->connect_channels,
- &error_abort);
- }
- out_channels = qobject_from_json(args->connect_channels, &error_abort);
-
- if (args->cpr_channel) {
- QList *channels_list = qobject_to(QList, out_channels);
- QObject *obj = migrate_str_to_channel(args->cpr_channel);
-
- qlist_append(channels_list, obj);
- }
+ channels = qobject_from_json(args->connect_channels, &error_abort);
}
if (args->result == MIG_TEST_QMP_ERROR) {
- migrate_qmp_fail(from, args->connect_uri, out_channels, "{}");
+ migrate_qmp_fail(from, args->connect_uri, channels, "{}");
goto finish;
}
- migrate_qmp(from, to, args->connect_uri, out_channels, "{}");
-
- if (args->start.defer_target_connect) {
- qtest_connect(to);
- qtest_qmp_handshake(to, NULL);
- if (!strcmp(args->listen_uri, "defer")) {
- migrate_incoming_qmp(to, args->connect_uri, in_channels, "{}");
- }
- }
+ migrate_qmp(from, to, args->connect_uri, channels, "{}");
if (args->result != MIG_TEST_SUCCEED) {
bool allow_active = args->result == MIG_TEST_FAIL;