[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command constructio
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction |
Date: |
Wed, 09 Aug 2017 13:40:44 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) |
Eric Blake <address@hidden> writes:
> When you build qga input manually like this:
>
> cmd = g_strdup_printf("{'execute': 'guest-file-write',"
> " 'arguments': {'handle': %" PRId64 ","
> " 'buf-b64': '%s' } }", id, enc);
> ret = qmp_fd(fixture->fd, cmd);
> g_free(cmd);
>
> you're responsible for escaping the interpolated values for JSON.
> Not done here, and therefore works only because the base64 encoding
> does not include % or '.
>
> Leaving interpolation into JSON via qobject_from_jsonf() is more
> robust; we can also reduce the boilerplate by factoring out the
> common 'execute':%s and 'arguments':%p code into new qga() and
> qga_args() helpers:
>
> ret = qga_args(fixture, "guest-file-write",
> "{'handle': %" PRId64 ", 'buf-b64': %s}", id, enc);
>
> Note that this reverts part of commit 1792d7d0; but that is because
> we just recently guaranteed support of PRId64 in qobject_from_jsonf().
>
> Also note that the simple form qga() sends "arguments":{} over the
> wire rather than the previous approach of omitting it entirely;
> test_qga_ping() is updated to use a long-hand form to ensure that
> "arguments" is truly optional.
>
> As a bonus, this eliminates the last external caller using varargs
> for qmp_fd_send(); the next patch will simplify that interface to
I'm blind... where?
> take just the string being sent over the wire rather than performing
> a string->QObject->string round trip (there's already a hint
> of that in the simplification of passing '\xff' separately from
> the command, where this patch had to tweak things to avoid an
> assertion). Also, this is a step towards getting rid of non-literal
> format strings; our new helpers can already use GCC_ATTR_FMT() just
> like qobject_from_jsonf().
>
> Signed-off-by: Eric Blake <address@hidden>
> ---
> tests/libqtest.c | 3 +-
> tests/test-qga.c | 222
> +++++++++++++++++++++++++++----------------------------
> 2 files changed, 111 insertions(+), 114 deletions(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 0cb439eefa..ba09c949dc 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -458,7 +458,8 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
> * resyncs */
> if (*fmt == '\377') {
> socket_send(fd, fmt, 1);
> - fmt++;
> + assert(!fmt[1]);
> + return;
> }
> assert(*fmt);
>
> diff --git a/tests/test-qga.c b/tests/test-qga.c
> index fd6bc7690f..839481e49b 100644
> --- a/tests/test-qga.c
> +++ b/tests/test-qga.c
> @@ -5,6 +5,7 @@
> #include <sys/un.h>
>
> #include "libqtest.h"
> +#include "qapi/qmp/qjson.h"
>
> typedef struct {
> char *test_dir;
> @@ -111,6 +112,55 @@ fixture_tear_down(TestFixture *fixture, gconstpointer
> data)
> g_free(fixture->test_dir);
> }
>
> +static void GCC_FMT_ATTR(3, 0) qga_sendv(const TestFixture *fixture,
> + const char *cmd,
> + const char *fmt, va_list ap)
> +{
> + QObject *args = qobject_from_jsonv(fmt, ap);
> + QObject *obj = qobject_from_jsonf("{'execute':%s, 'arguments':%p}",
> + cmd, args);
> + QString *qstr = qobject_to_json(obj);
> + const char *str;
> +
> + qstring_append_chr(qstr, '\n');
> + str = qstring_get_str(qstr);
> + assert(!strchr(str, '%'));
I figure you assert here because you can't rely on the compiler to catch
mistakes, and the technique you'd use with genuine printf, namely
passing "%s", str, isn't applicable. Not entirely obvious. Hmm, it
goes away in the next patch. Okay then.
> + qmp_fd_send(fixture->fd, str);
> + QDECREF(qstr);
> + qobject_decref(obj);
> +}
> +
> +static void GCC_FMT_ATTR(3, 4) qga_send_args(const TestFixture *fixture,
> + const char *cmd,
> + const char *fmt, ...)
> +{
> + va_list ap;
> +
> + va_start(ap, fmt);
> + qga_sendv(fixture, cmd, fmt, ap);
> + va_end(ap);
> +}
> +
> +
> +static QDict * GCC_FMT_ATTR(3, 4) qga_args(const TestFixture *fixture,
> + const char *cmd,
> + const char *fmt, ...)
> +{
> + va_list ap;
> +
> + va_start(ap, fmt);
> + qga_sendv(fixture, cmd, fmt, ap);
> + va_end(ap);
> + return qmp_fd_receive(fixture->fd);
> +}
> +
> +static QDict *qga(const TestFixture *fixture, const char *cmd)
> +{
> + qga_send_args(fixture, cmd, "{}");
> + return qmp_fd_receive(fixture->fd);
> +}
> +
> +
> static void qmp_assertion_message_error(const char *domain,
> const char *file,
> int line,
> @@ -144,12 +194,9 @@ static void test_qga_sync_delimited(gconstpointer fix)
> guint32 v, r = g_random_int();
> unsigned char c;
> QDict *ret;
> - gchar *cmd;
>
> - cmd = g_strdup_printf("\xff{'execute': 'guest-sync-delimited',"
> - " 'arguments': {'id': %u } }", r);
> - qmp_fd_send(fixture->fd, cmd);
> - g_free(cmd);
> + qmp_fd_send(fixture->fd, "\xff");
I was starting to type "opportunity to switch to the \377 used in
libqtest.c", but then I noticed that one will go away in the next
patch. Nevermind then.
> + qga_send_args(fixture, "guest-sync-delimited", "{'id': %u}", r);
>
> /*
> * Read and ignore garbage until resynchronized.
> @@ -186,7 +233,6 @@ static void test_qga_sync(gconstpointer fix)
> const TestFixture *fixture = fix;
> guint32 v, r = g_random_int();
> QDict *ret;
> - gchar *cmd;
>
> /*
> * TODO guest-sync is inherently limited: we cannot distinguish
> @@ -199,10 +245,7 @@ static void test_qga_sync(gconstpointer fix)
> * invalid JSON. Testing of '\xff' handling is done in
> * guest-sync-delimited instead.
> */
> - cmd = g_strdup_printf("{'execute': 'guest-sync',"
> - " 'arguments': {'id': %u } }", r);
> - ret = qmp_fd(fixture->fd, cmd);
> - g_free(cmd);
> + ret = qga_args(fixture, "guest-sync", "{'id': %u}", r);
>
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
> @@ -218,10 +261,17 @@ static void test_qga_ping(gconstpointer fix)
> const TestFixture *fixture = fix;
> QDict *ret;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping'}");
> + /* qga() adds an "arguments":{} over the wire... */
> + ret = qga(fixture, "guest-ping");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
> + QDECREF(ret);
>
> + /* ...so also test in long-hand that "arguments" can be omitted. */
> + qmp_fd_send(fixture->fd, "{'execute':'guest-ping'}");
> + ret = qmp_fd_receive(fixture->fd);
> + g_assert_nonnull(ret);
> + qmp_assert_no_error(ret);
> QDECREF(ret);
> }
>
> @@ -231,8 +281,7 @@ static void test_qga_invalid_args(gconstpointer fix)
> QDict *ret, *error;
> const gchar *class, *desc;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping', "
> - "'arguments': {'foo': 42 }}");
> + ret = qga_args(fixture, "guest-ping", "{'foo': 42 }");
> g_assert_nonnull(ret);
>
> error = qdict_get_qdict(ret, "error");
> @@ -251,7 +300,7 @@ static void test_qga_invalid_cmd(gconstpointer fix)
> QDict *ret, *error;
> const gchar *class, *desc;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-invalid-cmd'}");
> + ret = qga(fixture, "guest-invalid-cmd");
> g_assert_nonnull(ret);
>
> error = qdict_get_qdict(ret, "error");
> @@ -270,7 +319,7 @@ static void test_qga_info(gconstpointer fix)
> QDict *ret, *val;
> const gchar *version;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-info'}");
> + ret = qga(fixture, "guest-info");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -288,7 +337,7 @@ static void test_qga_get_vcpus(gconstpointer fix)
> QList *list;
> const QListEntry *entry;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-vcpus'}");
> + ret = qga(fixture, "guest-get-vcpus");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -308,7 +357,7 @@ static void test_qga_get_fsinfo(gconstpointer fix)
> QList *list;
> const QListEntry *entry;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-fsinfo'}");
> + ret = qga(fixture, "guest-get-fsinfo");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -331,7 +380,7 @@ static void test_qga_get_memory_block_info(gconstpointer
> fix)
> QDict *ret, *val;
> int64_t size;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-memory-block-info'}");
> + ret = qga(fixture, "guest-get-memory-block-info");
> g_assert_nonnull(ret);
>
> /* some systems might not expose memory block info in sysfs */
> @@ -352,7 +401,7 @@ static void test_qga_get_memory_blocks(gconstpointer fix)
> QList *list;
> const QListEntry *entry;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-memory-blocks'}");
> + ret = qga(fixture, "guest-get-memory-blocks");
> g_assert_nonnull(ret);
>
> /* some systems might not expose memory block info in sysfs */
> @@ -376,7 +425,7 @@ static void test_qga_network_get_interfaces(gconstpointer
> fix)
> QList *list;
> const QListEntry *entry;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-network-get-interfaces'}");
> + ret = qga(fixture, "guest-network-get-interfaces");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -393,7 +442,7 @@ static void test_qga_file_ops(gconstpointer fix)
> const TestFixture *fixture = fix;
> const unsigned char helloworld[] = "Hello World!\n";
> const char *b64;
> - gchar *cmd, *path, *enc;
> + gchar *path, *enc;
> unsigned char *dec;
> QDict *ret, *val;
> int64_t id, eof;
> @@ -402,8 +451,8 @@ static void test_qga_file_ops(gconstpointer fix)
> char tmp[100];
>
> /* open */
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
> - " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
> + ret = qga_args(fixture, "guest-file-open",
> + "{ 'path': 'foo', 'mode': 'w+' }");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
> id = qdict_get_int(ret, "return");
> @@ -411,10 +460,8 @@ static void test_qga_file_ops(gconstpointer fix)
>
> enc = g_base64_encode(helloworld, sizeof(helloworld));
> /* write */
> - cmd = g_strdup_printf("{'execute': 'guest-file-write',"
> - " 'arguments': { 'handle': %" PRId64 ","
> - " 'buf-b64': '%s' } }", id, enc);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-write",
> + "{ 'handle': %" PRId64 ", 'buf-b64': %s }", id, enc);
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -424,23 +471,14 @@ static void test_qga_file_ops(gconstpointer fix)
> g_assert_cmpint(count, ==, sizeof(helloworld));
> g_assert_cmpint(eof, ==, 0);
> QDECREF(ret);
> - g_free(cmd);
>
> /* flush */
> - cmd = g_strdup_printf("{'execute': 'guest-file-flush',"
> - " 'arguments': {'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-flush", "{'handle': %" PRId64 "}",
> id);
I'd break the line after the second argument.
> QDECREF(ret);
> - g_free(cmd);
>
> /* close */
> - cmd = g_strdup_printf("{'execute': 'guest-file-close',"
> - " 'arguments': {'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}",
> id);
Likewise.
> QDECREF(ret);
> - g_free(cmd);
>
> /* check content */
> path = g_build_filename(fixture->test_dir, "foo", NULL);
> @@ -454,18 +492,15 @@ static void test_qga_file_ops(gconstpointer fix)
> fclose(f);
>
> /* open */
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
> - " 'arguments': { 'path': 'foo', 'mode': 'r' } }");
> + ret = qga_args(fixture, "guest-file-open",
> + "{ 'path': 'foo', 'mode': 'r' }");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
> id = qdict_get_int(ret, "return");
> QDECREF(ret);
>
> /* read */
> - cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> - " 'arguments': { 'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}",
> id);
Likewise.
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "count");
> eof = qdict_get_bool(val, "eof");
> @@ -475,14 +510,10 @@ static void test_qga_file_ops(gconstpointer fix)
> g_assert_cmpstr(b64, ==, enc);
>
> QDECREF(ret);
> - g_free(cmd);
> g_free(enc);
>
> /* read eof */
> - cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> - " 'arguments': { 'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}",
> id);
Likewise.
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "count");
> eof = qdict_get_bool(val, "eof");
> @@ -491,14 +522,11 @@ static void test_qga_file_ops(gconstpointer fix)
> g_assert(eof);
> g_assert_cmpstr(b64, ==, "");
> QDECREF(ret);
> - g_free(cmd);
>
> /* seek */
> - cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
> - " 'arguments': { 'handle': %" PRId64 ", "
> - " 'offset': %d, 'whence': '%s' } }",
> - id, 6, "set");
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-seek",
> + "{'handle': %" PRId64 ", 'offset': %d, 'whence': %s}",
> + id, 6, "set");
> qmp_assert_no_error(ret);
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "position");
> @@ -506,13 +534,9 @@ static void test_qga_file_ops(gconstpointer fix)
> g_assert_cmpint(count, ==, 6);
> g_assert(!eof);
> QDECREF(ret);
> - g_free(cmd);
>
> /* partial read */
> - cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> - " 'arguments': { 'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}",
> id);
Likewise.
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "count");
> eof = qdict_get_bool(val, "eof");
> @@ -525,15 +549,10 @@ static void test_qga_file_ops(gconstpointer fix)
> g_free(dec);
>
> QDECREF(ret);
> - g_free(cmd);
>
> /* close */
> - cmd = g_strdup_printf("{'execute': 'guest-file-close',"
> - " 'arguments': {'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}",
> id);
Likewise.
> QDECREF(ret);
> - g_free(cmd);
> }
>
> static void test_qga_file_write_read(gconstpointer fix)
> @@ -541,14 +560,14 @@ static void test_qga_file_write_read(gconstpointer fix)
> const TestFixture *fixture = fix;
> const unsigned char helloworld[] = "Hello World!\n";
> const char *b64;
> - gchar *cmd, *enc;
> + gchar *enc;
> QDict *ret, *val;
> int64_t id, eof;
> gsize count;
>
> /* open */
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
> - " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
> + ret = qga_args(fixture, "guest-file-open",
> + "{ 'path': 'foo', 'mode': 'w+' }");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
> id = qdict_get_int(ret, "return");
> @@ -556,10 +575,8 @@ static void test_qga_file_write_read(gconstpointer fix)
>
> enc = g_base64_encode(helloworld, sizeof(helloworld));
> /* write */
> - cmd = g_strdup_printf("{'execute': 'guest-file-write',"
> - " 'arguments': { 'handle': %" PRId64 ","
> - " 'buf-b64': '%s' } }", id, enc);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-write",
> + "{'handle': %" PRId64 ", 'buf-b64': %s}", id, enc);
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -569,13 +586,9 @@ static void test_qga_file_write_read(gconstpointer fix)
> g_assert_cmpint(count, ==, sizeof(helloworld));
> g_assert_cmpint(eof, ==, 0);
> QDECREF(ret);
> - g_free(cmd);
>
> /* read (check implicit flush) */
> - cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> - " 'arguments': { 'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}",
> id);
Likewise.
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "count");
> eof = qdict_get_bool(val, "eof");
> @@ -584,14 +597,11 @@ static void test_qga_file_write_read(gconstpointer fix)
> g_assert(eof);
> g_assert_cmpstr(b64, ==, "");
> QDECREF(ret);
> - g_free(cmd);
>
> /* seek to 0 */
> - cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
> - " 'arguments': { 'handle': %" PRId64 ", "
> - " 'offset': %d, 'whence': '%s' } }",
> - id, 0, "set");
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-seek",
> + "{'handle': %" PRId64 ", 'offset': %d, 'whence': %s}",
> + id, 0, "set");
> qmp_assert_no_error(ret);
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "position");
> @@ -599,13 +609,9 @@ static void test_qga_file_write_read(gconstpointer fix)
> g_assert_cmpint(count, ==, 0);
> g_assert(!eof);
> QDECREF(ret);
> - g_free(cmd);
>
> /* read */
> - cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> - " 'arguments': { 'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}",
> id);
Likewise.
> val = qdict_get_qdict(ret, "return");
> count = qdict_get_int(val, "count");
> eof = qdict_get_bool(val, "eof");
> @@ -614,16 +620,11 @@ static void test_qga_file_write_read(gconstpointer fix)
> g_assert(eof);
> g_assert_cmpstr(b64, ==, enc);
> QDECREF(ret);
> - g_free(cmd);
> g_free(enc);
>
> /* close */
> - cmd = g_strdup_printf("{'execute': 'guest-file-close',"
> - " 'arguments': {'handle': %" PRId64 "} }",
> - id);
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}",
> id);
Likewise.
> QDECREF(ret);
> - g_free(cmd);
> }
>
> static void test_qga_get_time(gconstpointer fix)
> @@ -632,7 +633,7 @@ static void test_qga_get_time(gconstpointer fix)
> QDict *ret;
> int64_t time;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-time'}");
> + ret = qga(fixture, "guest-get-time");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -651,7 +652,7 @@ static void test_qga_blacklist(gconstpointer data)
> fixture_setup(&fix, "-b guest-ping,guest-get-time", NULL);
>
> /* check blacklist */
> - ret = qmp_fd(fix.fd, "{'execute': 'guest-ping'}");
> + ret = qga(&fix, "guest-ping");
> g_assert_nonnull(ret);
> error = qdict_get_qdict(ret, "error");
> class = qdict_get_try_str(error, "class");
> @@ -660,7 +661,7 @@ static void test_qga_blacklist(gconstpointer data)
> g_assert_nonnull(g_strstr_len(desc, -1, "has been disabled"));
> QDECREF(ret);
>
> - ret = qmp_fd(fix.fd, "{'execute': 'guest-get-time'}");
> + ret = qga(&fix, "guest-get-time");
> g_assert_nonnull(ret);
> error = qdict_get_qdict(ret, "error");
> class = qdict_get_try_str(error, "class");
> @@ -670,7 +671,7 @@ static void test_qga_blacklist(gconstpointer data)
> QDECREF(ret);
>
> /* check something work */
> - ret = qmp_fd(fix.fd, "{'execute': 'guest-get-fsinfo'}");
> + ret = qga(&fix, "guest-get-fsinfo");
> qmp_assert_no_error(ret);
> QDECREF(ret);
>
> @@ -762,7 +763,7 @@ static void test_qga_fsfreeze_status(gconstpointer fix)
> QDict *ret;
> const gchar *status;
>
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-fsfreeze-status'}");
> + ret = qga(fixture, "guest-fsfreeze-status");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
>
> @@ -781,12 +782,11 @@ static void test_qga_guest_exec(gconstpointer fix)
> int64_t pid, now, exitcode;
> gsize len;
> bool exited;
> - char *cmd;
>
> /* exec 'echo foo bar' */
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
> - " 'path': '/bin/echo', 'arg': [ '-n', '\" test_str \"' ],"
> - " 'capture-output': true } }");
> + ret = qga_args(fixture, "guest-exec",
> + "{ 'path': '/bin/echo', 'arg': [ '-n', '\" test_str \"' ],"
> + " 'capture-output': true }");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
> val = qdict_get_qdict(ret, "return");
> @@ -796,10 +796,9 @@ static void test_qga_guest_exec(gconstpointer fix)
>
> /* wait for completion */
> now = g_get_monotonic_time();
> - cmd = g_strdup_printf("{'execute': 'guest-exec-status',"
> - " 'arguments': { 'pid': %" PRId64 " } }", pid);
> do {
> - ret = qmp_fd(fixture->fd, cmd);
> + ret = qga_args(fixture, "guest-exec-status", "{'pid': %" PRId64 "}",
> + pid);
> g_assert_nonnull(ret);
> val = qdict_get_qdict(ret, "return");
> exited = qdict_get_bool(val, "exited");
> @@ -809,7 +808,6 @@ static void test_qga_guest_exec(gconstpointer fix)
> } while (!exited &&
> g_get_monotonic_time() < now + 5 * G_TIME_SPAN_SECOND);
> g_assert(exited);
> - g_free(cmd);
>
> /* check stdout */
> exitcode = qdict_get_int(val, "exitcode");
> @@ -829,8 +827,7 @@ static void test_qga_guest_exec_invalid(gconstpointer fix)
> const gchar *class, *desc;
>
> /* invalid command */
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
> - " 'path': '/bin/invalid-cmd42' } }");
> + ret = qga_args(fixture, "guest-exec", "{ 'path': '/bin/invalid-cmd42'
> }");
> g_assert_nonnull(ret);
> error = qdict_get_qdict(ret, "error");
> g_assert_nonnull(error);
> @@ -841,8 +838,7 @@ static void test_qga_guest_exec_invalid(gconstpointer fix)
> QDECREF(ret);
>
> /* invalid pid */
> - ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec-status',"
> - " 'arguments': { 'pid': 0 } }");
> + ret = qga_args(fixture, "guest-exec-status", "{ 'pid': 0 }");
Likewise.
> g_assert_nonnull(ret);
> error = qdict_get_qdict(ret, "error");
> g_assert_nonnull(error);
> @@ -868,7 +864,7 @@ static void test_qga_guest_get_osinfo(gconstpointer data)
> g_free(cwd);
> fixture_setup(&fixture, NULL, env);
>
> - ret = qmp_fd(fixture.fd, "{'execute': 'guest-get-osinfo'}");
> + ret = qga(&fixture, "guest-get-osinfo");
> g_assert_nonnull(ret);
> qmp_assert_no_error(ret);
- Re: [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf(), (continued)
- [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject, Eric Blake, 2017/08/03
- [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv(), Eric Blake, 2017/08/03
- [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs, Eric Blake, 2017/08/03
- [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction, Eric Blake, 2017/08/03
- Re: [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction,
Markus Armbruster <=
- [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw(), Eric Blake, 2017/08/03
- [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers, Eric Blake, 2017/08/03
[Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command, Eric Blake, 2017/08/03