migration-test: Clean up string interpolation into QMP, part 2

Leaving interpolation into JSON to qmp() is more robust than building
QMP input manually, as explained in the recent commit "tests: Clean up
string interpolation into QMP input (simple cases)".

migrate() interpolates members into a JSON object.  Change it to take
its extra QMP arguments as arguments for qdict_from_jsonf_nofail()
instead of a string containing JSON members.

Bonus: gets rid of a non-literal format string.  A step towards
compile-time format string checking without triggering
-Wformat-nonliteral.

Cc: Juan Quintela <quintela@redhat.com>
Cc: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20180806065344.7103-20-armbru@redhat.com>
This commit is contained in:
Markus Armbruster 2018-08-06 08:53:40 +02:00
parent b7281c6989
commit b5bbd3f315

View file

@ -14,6 +14,7 @@
#include "libqtest.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qjson.h"
#include "qemu/option.h"
#include "qemu/range.h"
#include "qemu/sockets.h"
@ -384,16 +385,25 @@ static void migrate_set_capability(QTestState *who, const char *capability,
qobject_unref(rsp);
}
static void migrate(QTestState *who, const char *uri, const char *extra)
/*
* Send QMP command "migrate".
* Arguments are built from @fmt... (formatted like
* qobject_from_jsonf_nofail()) with "uri": @uri spliced in.
*/
GCC_FMT_ATTR(3, 4)
static void migrate(QTestState *who, const char *uri, const char *fmt, ...)
{
QDict *rsp;
gchar *cmd;
va_list ap;
QDict *args, *rsp;
cmd = g_strdup_printf("{ 'execute': 'migrate',"
" 'arguments': { 'uri': '%s' %s } }",
uri, extra ? extra : "");
rsp = qtest_qmp(who, cmd);
g_free(cmd);
va_start(ap, fmt);
args = qdict_from_vjsonf_nofail(fmt, ap);
va_end(ap);
g_assert(!qdict_haskey(args, "uri"));
qdict_put_str(args, "uri", uri);
rsp = qmp("{ 'execute': 'migrate', 'arguments': %p}", args);
g_assert(qdict_haskey(rsp, "return"));
qobject_unref(rsp);
}
@ -585,7 +595,7 @@ static int migrate_postcopy_prepare(QTestState **from_ptr,
/* Wait for the first serial output from the source */
wait_for_serial("src_serial");
migrate(from, uri, NULL);
migrate(from, uri, "{}");
g_free(uri);
wait_for_migration_pass(from);
@ -668,7 +678,7 @@ static void test_postcopy_recovery(void)
* the newly created channel
*/
wait_for_migration_status(from, "postcopy-paused");
migrate(from, uri, ", 'resume': true");
migrate(from, uri, "{'resume': true}");
g_free(uri);
/* Restore the postcopy bandwidth to unlimited */
@ -687,7 +697,7 @@ static void test_baddest(void)
if (test_migrate_start(&from, &to, "tcp:0:0", true)) {
return;
}
migrate(from, "tcp:0:0", NULL);
migrate(from, "tcp:0:0", "{}");
do {
status = migrate_query_status(from);
g_assert(!strcmp(status, "setup") || !(strcmp(status, "failed")));
@ -725,7 +735,7 @@ static void test_precopy_unix(void)
/* Wait for the first serial output from the source */
wait_for_serial("src_serial");
migrate(from, uri, NULL);
migrate(from, uri, "{}");
wait_for_migration_pass(from);