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
1 changed files with 22 additions and 12 deletions

View File

@ -14,6 +14,7 @@
#include "libqtest.h" #include "libqtest.h"
#include "qapi/qmp/qdict.h" #include "qapi/qmp/qdict.h"
#include "qapi/qmp/qjson.h"
#include "qemu/option.h" #include "qemu/option.h"
#include "qemu/range.h" #include "qemu/range.h"
#include "qemu/sockets.h" #include "qemu/sockets.h"
@ -384,16 +385,25 @@ static void migrate_set_capability(QTestState *who, const char *capability,
qobject_unref(rsp); 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; va_list ap;
gchar *cmd; QDict *args, *rsp;
cmd = g_strdup_printf("{ 'execute': 'migrate'," va_start(ap, fmt);
" 'arguments': { 'uri': '%s' %s } }", args = qdict_from_vjsonf_nofail(fmt, ap);
uri, extra ? extra : ""); va_end(ap);
rsp = qtest_qmp(who, cmd);
g_free(cmd); 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")); g_assert(qdict_haskey(rsp, "return"));
qobject_unref(rsp); 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 the first serial output from the source */
wait_for_serial("src_serial"); wait_for_serial("src_serial");
migrate(from, uri, NULL); migrate(from, uri, "{}");
g_free(uri); g_free(uri);
wait_for_migration_pass(from); wait_for_migration_pass(from);
@ -668,7 +678,7 @@ static void test_postcopy_recovery(void)
* the newly created channel * the newly created channel
*/ */
wait_for_migration_status(from, "postcopy-paused"); wait_for_migration_status(from, "postcopy-paused");
migrate(from, uri, ", 'resume': true"); migrate(from, uri, "{'resume': true}");
g_free(uri); g_free(uri);
/* Restore the postcopy bandwidth to unlimited */ /* 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)) { if (test_migrate_start(&from, &to, "tcp:0:0", true)) {
return; return;
} }
migrate(from, "tcp:0:0", NULL); migrate(from, "tcp:0:0", "{}");
do { do {
status = migrate_query_status(from); status = migrate_query_status(from);
g_assert(!strcmp(status, "setup") || !(strcmp(status, "failed"))); 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 the first serial output from the source */
wait_for_serial("src_serial"); wait_for_serial("src_serial");
migrate(from, uri, NULL); migrate(from, uri, "{}");
wait_for_migration_pass(from); wait_for_migration_pass(from);