From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940267937437.69692074215857; Mon, 30 Jul 2018 01:44:27 -0700 (PDT) Received: from localhost ([::1]:51227 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3n0-0003yY-Mt for importer@patchew.org; Mon, 30 Jul 2018 04:44:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39366) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Ou-Qk for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cG-0004Vr-Kl for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:56614 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cG-0004VD-FK for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:20 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0ADA04021703; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B4B6C2026D68; Mon, 30 Jul 2018 08:33:19 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 80EED11386C5; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:32:55 +0200 Message-Id: <20180730083317.11765-2-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 01/23] libqtest: Document calling conventions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Eric Blake We have two flavors of vararg usage in qtest: qtest_hmp() etc. work like sprintf(), and qtest_qmp() etc. work like qobject_from_jsonf(). Spell that out in the comments. Also add GCC_FMT_ATTR() to qtest_hmp() etc. so that the compiler can flag incorrect use. We have some cleanup work to do before we can do the same for qtest_qmp() etc. This would get us the same better-than-nothing checking we already have for qobject_from_jsonf(): common incorrect uses of supported conversion specifications will be flagged (e.g. passing a double for %d), but use of unsupported ones won't. Signed-off-by: Eric Blake Reviewed-by: Stefan Hajnoczi Reviewed-by: Markus Armbruster [Rebased, comment wording tweaked, commit message rewritten] Signed-off-by: Markus Armbruster --- tests/libqtest.h | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/tests/libqtest.h b/tests/libqtest.h index ac52872cbe..aa2b2cd7c1 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -76,7 +76,9 @@ void qtest_quit(QTestState *s); /** * qtest_qmp_discard_response: * @s: #QTestState instance to operate on. - * @fmt...: QMP message to send to qemu + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and consumes the response. */ @@ -85,7 +87,9 @@ void qtest_qmp_discard_response(QTestState *s, const char= *fmt, ...); /** * qtest_qmp: * @s: #QTestState instance to operate on. - * @fmt...: QMP message to send to qemu + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and returns the response. */ @@ -94,7 +98,9 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...); /** * qtest_async_qmp: * @s: #QTestState instance to operate on. - * @fmt...: QMP message to send to qemu + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and leaves the response in the stream. */ @@ -103,7 +109,9 @@ void qtest_async_qmp(QTestState *s, const char *fmt, ..= .); /** * qtest_qmpv_discard_response: * @s: #QTestState instance to operate on. - * @fmt: QMP message to send to QEMU + * @fmt: QMP message to send to QEMU, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * @ap: QMP message arguments * * Sends a QMP message to QEMU and consumes the response. @@ -113,7 +121,9 @@ void qtest_qmpv_discard_response(QTestState *s, const c= har *fmt, va_list ap); /** * qtest_qmpv: * @s: #QTestState instance to operate on. - * @fmt: QMP message to send to QEMU + * @fmt: QMP message to send to QEMU, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * @ap: QMP message arguments * * Sends a QMP message to QEMU and returns the response. @@ -123,7 +133,9 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_li= st ap); /** * qtest_async_qmpv: * @s: #QTestState instance to operate on. - * @fmt: QMP message to send to QEMU + * @fmt: QMP message to send to QEMU, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * @ap: QMP message arguments * * Sends a QMP message to QEMU and leaves the response in the stream. @@ -172,7 +184,7 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...) GC= C_FMT_ATTR(2, 3); /** * qtest_hmpv: * @s: #QTestState instance to operate on. - * @fmt: HMP command to send to QEMU + * @fmt: HMP command to send to QEMU, formats arguments like vsprintf(). * @ap: HMP command arguments * * Send HMP command to QEMU via QMP's human-monitor-command. @@ -180,7 +192,8 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...) GC= C_FMT_ATTR(2, 3); * * Returns: the command's output. The caller should g_free() it. */ -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap); +char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap) + GCC_FMT_ATTR(2, 0); =20 /** * qtest_get_irq: @@ -561,7 +574,9 @@ static inline void qtest_end(void) =20 /** * qmp: - * @fmt...: QMP message to send to qemu + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and returns the response. */ @@ -569,7 +584,9 @@ QDict *qmp(const char *fmt, ...); =20 /** * qmp_async: - * @fmt...: QMP message to send to qemu + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and leaves the response in the stream. */ @@ -577,7 +594,9 @@ void qmp_async(const char *fmt, ...); =20 /** * qmp_discard_response: - * @fmt...: QMP message to send to qemu + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and consumes the response. */ --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940264976864.3601164287577; Mon, 30 Jul 2018 01:44:24 -0700 (PDT) Received: from localhost ([::1]:51226 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3mx-0003ui-Ib for importer@patchew.org; Mon, 30 Jul 2018 04:44:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39370) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Oy-Ra for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cG-0004Vw-L1 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45060 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cG-0004VC-Em for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:20 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0A04B4000B74; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B61CB10F1C09; Mon, 30 Jul 2018 08:33:19 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 846B211385E4; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:32:56 +0200 Message-Id: <20180730083317.11765-3-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 02/23] libqtest: Rename functions to send QMP messages X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The functions to receive messages are called qtest_qmp_receive() and qmp_receive(), qmp_fd_receive(). The ones to send messages are called qtest_async_qmp(), qtest_async_qmpv(), qmp_async(), qmp_fd_send(), qmp_fd_sendv(). Inconsistent. Rename the *_async* ones to qmp_send(), qtest_qmp_send(), qtest_qmp_vsend(). Rename qmp_fd_sendv() to qmp_fd_vsend(). Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- tests/ahci-test.c | 10 +++++----- tests/libqos/ahci.c | 4 ++-- tests/libqtest.c | 20 ++++++++++---------- tests/libqtest.h | 14 +++++++------- tests/qmp-test.c | 18 +++++++++--------- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 1a7b761304..7e3491b5bd 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -1389,7 +1389,7 @@ static void test_flush_migrate(void) =20 /* Complete the command */ s =3D "{'execute':'cont' }"; - qmp_async(s); + qmp_send(s); qmp_eventwait("RESUME"); ahci_command_wait(dst, cmd); ahci_command_verify(dst, cmd); @@ -1592,8 +1592,8 @@ static void test_atapi_tray(void) atapi_wait_tray(false); =20 /* Remove media */ - qmp_async("{'execute': 'blockdev-open-tray', " - "'arguments': {'id': 'cd0'}}"); + qmp_send("{'execute': 'blockdev-open-tray'," + " 'arguments': {'id': 'cd0'}}"); atapi_wait_tray(true); rsp =3D qmp_receive(); qobject_unref(rsp); @@ -1619,8 +1619,8 @@ static void test_atapi_tray(void) "'node-name': 'node0' }}"); =20 /* Again, the event shows up first */ - qmp_async("{'execute': 'blockdev-close-tray', " - "'arguments': {'id': 'cd0'}}"); + qmp_send("{'execute': 'blockdev-close-tray'," + " 'arguments': {'id': 'cd0'}}"); atapi_wait_tray(false); rsp =3D qmp_receive(); qobject_unref(rsp); diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c index 42d3f76933..63fbc9e3c9 100644 --- a/tests/libqos/ahci.c +++ b/tests/libqos/ahci.c @@ -674,7 +674,7 @@ void ahci_exec(AHCIQState *ahci, uint8_t port, g_assert_cmpint(rc, =3D=3D, 0); } if (opts->error) { - qtest_async_qmp(ahci->parent->qts, "{'execute':'cont' }"); + qtest_qmp_send(ahci->parent->qts, "{'execute':'cont' }"); qtest_qmp_eventwait(ahci->parent->qts, "RESUME"); } =20 @@ -712,7 +712,7 @@ AHCICommand *ahci_guest_io_halt(AHCIQState *ahci, uint8= _t port, void ahci_guest_io_resume(AHCIQState *ahci, AHCICommand *cmd) { /* Complete the command */ - qtest_async_qmp(ahci->parent->qts, "{'execute':'cont' }"); + qtest_qmp_send(ahci->parent->qts, "{'execute':'cont' }"); qtest_qmp_eventwait(ahci->parent->qts, "RESUME"); ahci_command_wait(ahci, cmd); ahci_command_verify(ahci, cmd); diff --git a/tests/libqtest.c b/tests/libqtest.c index 098af6aec4..9cb4096639 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -484,7 +484,7 @@ QDict *qtest_qmp_receive(QTestState *s) * in the case that they choose to discard all replies up until * a particular EVENT is received. */ -void qmp_fd_sendv(int fd, const char *fmt, va_list ap) +void qmp_fd_vsend(int fd, const char *fmt, va_list ap) { va_list ap_copy; QObject *qobj; @@ -529,21 +529,21 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap) } } =20 -void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap) +void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap) { - qmp_fd_sendv(s->qmp_fd, fmt, ap); + qmp_fd_vsend(s->qmp_fd, fmt, ap); } =20 QDict *qmp_fdv(int fd, const char *fmt, va_list ap) { - qmp_fd_sendv(fd, fmt, ap); + qmp_fd_vsend(fd, fmt, ap); =20 return qmp_fd_receive(fd); } =20 QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap) { - qtest_async_qmpv(s, fmt, ap); + qtest_qmp_vsend(s, fmt, ap); =20 /* Receive reply */ return qtest_qmp_receive(s); @@ -565,7 +565,7 @@ void qmp_fd_send(int fd, const char *fmt, ...) va_list ap; =20 va_start(ap, fmt); - qmp_fd_sendv(fd, fmt, ap); + qmp_fd_vsend(fd, fmt, ap); va_end(ap); } =20 @@ -580,12 +580,12 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...) return response; } =20 -void qtest_async_qmp(QTestState *s, const char *fmt, ...) +void qtest_qmp_send(QTestState *s, const char *fmt, ...) { va_list ap; =20 va_start(ap, fmt); - qtest_async_qmpv(s, fmt, ap); + qtest_qmp_vsend(s, fmt, ap); va_end(ap); } =20 @@ -968,12 +968,12 @@ QDict *qmp(const char *fmt, ...) return response; } =20 -void qmp_async(const char *fmt, ...) +void qmp_send(const char *fmt, ...) { va_list ap; =20 va_start(ap, fmt); - qtest_async_qmpv(global_qtest, fmt, ap); + qtest_qmp_vsend(global_qtest, fmt, ap); va_end(ap); } =20 diff --git a/tests/libqtest.h b/tests/libqtest.h index aa2b2cd7c1..ced95f490a 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -96,7 +96,7 @@ void qtest_qmp_discard_response(QTestState *s, const char= *fmt, ...); QDict *qtest_qmp(QTestState *s, const char *fmt, ...); =20 /** - * qtest_async_qmp: + * qtest_qmp_send: * @s: #QTestState instance to operate on. * @fmt...: QMP message to send to qemu, formatted like * qobject_from_jsonf(). @@ -104,7 +104,7 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...); * * Sends a QMP message to QEMU and leaves the response in the stream. */ -void qtest_async_qmp(QTestState *s, const char *fmt, ...); +void qtest_qmp_send(QTestState *s, const char *fmt, ...); =20 /** * qtest_qmpv_discard_response: @@ -131,7 +131,7 @@ void qtest_qmpv_discard_response(QTestState *s, const c= har *fmt, va_list ap); QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap); =20 /** - * qtest_async_qmpv: + * qtest_qmp_vsend: * @s: #QTestState instance to operate on. * @fmt: QMP message to send to QEMU, formatted like * qobject_from_jsonf(). @@ -140,7 +140,7 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_li= st ap); * * Sends a QMP message to QEMU and leaves the response in the stream. */ -void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap); +void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap); =20 /** * qtest_receive: @@ -583,14 +583,14 @@ static inline void qtest_end(void) QDict *qmp(const char *fmt, ...); =20 /** - * qmp_async: + * qmp_send: * @fmt...: QMP message to send to qemu, formatted like * qobject_from_jsonf(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and leaves the response in the stream. */ -void qmp_async(const char *fmt, ...); +void qmp_send(const char *fmt, ...); =20 /** * qmp_discard_response: @@ -959,7 +959,7 @@ static inline int64_t clock_set(int64_t val) } =20 QDict *qmp_fd_receive(int fd); -void qmp_fd_sendv(int fd, const char *fmt, va_list ap); +void qmp_fd_vsend(int fd, const char *fmt, va_list ap); void qmp_fd_send(int fd, const char *fmt, ...); QDict *qmp_fdv(int fd, const char *fmt, va_list ap); QDict *qmp_fd(int fd, const char *fmt, ...); diff --git a/tests/qmp-test.c b/tests/qmp-test.c index b9774084f8..5eb15daebc 100644 --- a/tests/qmp-test.c +++ b/tests/qmp-test.c @@ -159,12 +159,12 @@ static void cleanup_blocking_cmd(void) =20 static void send_cmd_that_blocks(QTestState *s, const char *id) { - qtest_async_qmp(s, "{ 'execute': 'blockdev-add', 'id': %s," - " 'arguments': {" - " 'driver': 'blkdebug', 'node-name': %s," - " 'config': %s," - " 'image': { 'driver': 'null-co' } } }", - id, id, fifo_name); + qtest_qmp_send(s, "{ 'execute': 'blockdev-add', 'id': %s," + " 'arguments': {" + " 'driver': 'blkdebug', 'node-name': %s," + " 'config': %s," + " 'image': { 'driver': 'null-co' } } }", + id, id, fifo_name); } =20 static void unblock_blocked_cmd(void) @@ -176,7 +176,7 @@ static void unblock_blocked_cmd(void) =20 static void send_oob_cmd_that_fails(QTestState *s, const char *id) { - qtest_async_qmp(s, "{ 'exec-oob': 'migrate-pause', 'id': %s }", id); + qtest_qmp_send(s, "{ 'exec-oob': 'migrate-pause', 'id': %s }", id); } =20 static void recv_cmd_id(QTestState *s, const char *id) @@ -235,7 +235,7 @@ static void test_qmp_oob(void) /* OOB command overtakes slow in-band command */ setup_blocking_cmd(); send_cmd_that_blocks(qts, "ib-blocks-1"); - qtest_async_qmp(qts, "{ 'execute': 'query-name', 'id': 'ib-quick-1' }"= ); + qtest_qmp_send(qts, "{ 'execute': 'query-name', 'id': 'ib-quick-1' }"); send_oob_cmd_that_fails(qts, "oob-1"); recv_cmd_id(qts, "oob-1"); unblock_blocked_cmd(); @@ -244,7 +244,7 @@ static void test_qmp_oob(void) =20 /* Even malformed in-band command fails in-band */ send_cmd_that_blocks(qts, "blocks-2"); - qtest_async_qmp(qts, "{ 'id': 'err-2' }"); + qtest_qmp_send(qts, "{ 'id': 'err-2' }"); unblock_blocked_cmd(); recv_cmd_id(qts, "blocks-2"); recv_cmd_id(qts, "err-2"); --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939756666331.6937085392133; Mon, 30 Jul 2018 01:35:56 -0700 (PDT) Received: from localhost ([::1]:51179 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3ec-000520-6H for importer@patchew.org; Mon, 30 Jul 2018 04:35:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39368) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Ow-Qs for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cG-0004VV-FV for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:42322 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cG-0004VA-B2 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:20 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E124B7C6A9; Mon, 30 Jul 2018 08:33:19 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B7C992026D76; Mon, 30 Jul 2018 08:33:19 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 87ECA11385FA; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:32:57 +0200 Message-Id: <20180730083317.11765-4-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 30 Jul 2018 08:33:19 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 30 Jul 2018 08:33:19 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 03/23] libqtest: Clean up how we read device_del messages X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" qtest_qmp_device_del() still uses the qmp("") hack to receive a message, even though we have qmp_receive() since commit 66e0c7b187e. Put it to use. Bonus: gets rid of empty format strings. A step towards compile-time format string checking without triggering -Wformat-zero-length. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Thomas Huth Reviewed-by: Eric Blake --- tests/libqtest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index 9cb4096639..071d7eb7b1 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -1090,7 +1090,7 @@ void qtest_qmp_device_del(const char *id) g_assert(response1); g_assert(!qdict_haskey(response1, "error")); =20 - response2 =3D qmp(""); + response2 =3D qmp_receive(); g_assert(response2); g_assert(!qdict_haskey(response2, "error")); =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939756674486.455132250657; Mon, 30 Jul 2018 01:35:56 -0700 (PDT) Received: from localhost ([::1]:51181 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3ee-00053n-3d for importer@patchew.org; Mon, 30 Jul 2018 04:35:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003P0-SD for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cF-0004Ux-SB for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:56610 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cF-0004Un-NE for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:19 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 10B404021703; Mon, 30 Jul 2018 08:33:19 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BD0042156701; Mon, 30 Jul 2018 08:33:18 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8B4B01138612; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:32:58 +0200 Message-Id: <20180730083317.11765-5-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 30 Jul 2018 08:33:19 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 30 Jul 2018 08:33:19 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 04/23] libqtest: Clean up how we read the QMP greeting X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" qtest_init() still uses the qtest_qmp_discard_response(s, "") hack to receive the greeting, even though we have qtest_qmp_receive() since commit 66e0c7b187e. Put it to use. Bonus: gets rid of an empty format string. A step towards compile-time format string checking without triggering -Wformat-zero-length. Signed-off-by: Markus Armbruster Reviewed-by: Thomas Huth Reviewed-by: Eric Blake --- tests/libqtest.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index 071d7eb7b1..c2c08a890c 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -249,9 +249,11 @@ QTestState *qtest_init_without_qmp_handshake(bool use_= oob, QTestState *qtest_init(const char *extra_args) { QTestState *s =3D qtest_init_without_qmp_handshake(false, extra_args); + QDict *greeting; =20 /* Read the QMP greeting and then do the handshake */ - qtest_qmp_discard_response(s, ""); + greeting =3D qtest_qmp_receive(s); + qobject_unref(greeting); qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }"); =20 return s; --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940107315546.7214922351277; Mon, 30 Jul 2018 01:41:47 -0700 (PDT) Received: from localhost ([::1]:51215 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3kJ-0001Uh-DO for importer@patchew.org; Mon, 30 Jul 2018 04:41:39 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39367) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Ov-Qm for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cG-0004WH-Ui for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51102 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cG-0004Vb-OY for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:20 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 57606CFB54; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1013F178B8; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8EBD5113861C; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:32:59 +0200 Message-Id: <20180730083317.11765-6-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 05/23] qobject: Replace qobject_from_jsonf() by qobject_from_jsonf_nofail() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Commit ab45015a968 "qobject: Let qobject_from_jsonf() fail instead of abort" fails to accomplish its stated aim: the function can still abort due to its use of &error_abort. Its rationale for letting it fail is that all remaining users cope fine with failure. Well, they're just fine with aborting, too; it's what they do on failure. Simply reverting the broken commit would bring back the unfortunate asymmetry between qobject_from_jsonf() and qobject_from_jsonv(): one aborts, the other returns null. So also rename it to qobject_from_jsonf_nofail(). Signed-off-by: Markus Armbruster Reviewed-by: Thomas Huth Reviewed-by: Eric Blake --- include/qapi/qmp/qjson.h | 6 ++++-- qobject/qjson.c | 8 +++++++- tests/check-qjson.c | 15 ++++++++------- tests/libqtest.h | 18 +++++++++--------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h index 43b2ce2f33..dc509d51ae 100644 --- a/include/qapi/qmp/qjson.h +++ b/include/qapi/qmp/qjson.h @@ -15,11 +15,13 @@ #define QJSON_H =20 QObject *qobject_from_json(const char *string, Error **errp); -QObject *qobject_from_jsonf(const char *string, ...) GCC_FMT_ATTR(1, 2); QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp) GCC_FMT_ATTR(1, 0); =20 -QDict *qdict_from_jsonf_nofail(const char *string, ...) GCC_FMT_ATTR(1, 2); +QObject *qobject_from_jsonf_nofail(const char *string, ...) + GCC_FMT_ATTR(1, 2); +QDict *qdict_from_jsonf_nofail(const char *string, ...) + GCC_FMT_ATTR(1, 2); =20 QString *qobject_to_json(const QObject *obj); QString *qobject_to_json_pretty(const QObject *obj); diff --git a/qobject/qjson.c b/qobject/qjson.c index 2f6a590e44..4a9dcff343 100644 --- a/qobject/qjson.c +++ b/qobject/qjson.c @@ -59,7 +59,12 @@ QObject *qobject_from_json(const char *string, Error **e= rrp) return qobject_from_jsonv(string, NULL, errp); } =20 -QObject *qobject_from_jsonf(const char *string, ...) +/* + * Parse @string as JSON value with %-escapes interpolated. + * Abort on error. Do not use with untrusted @string. + * Return the resulting QObject. It is never null. + */ +QObject *qobject_from_jsonf_nofail(const char *string, ...) { QObject *obj; va_list ap; @@ -68,6 +73,7 @@ QObject *qobject_from_jsonf(const char *string, ...) obj =3D qobject_from_jsonv(string, &ap, &error_abort); va_end(ap); =20 + assert(obj); return obj; } =20 diff --git a/tests/check-qjson.c b/tests/check-qjson.c index da582df3e9..eaf5d20663 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -865,7 +865,8 @@ static void vararg_string(void) QString *str; =20 str =3D qobject_to(QString, - qobject_from_jsonf("%s", test_cases[i].decoded)); + qobject_from_jsonf_nofail("%s", + test_cases[i].decoded)); g_assert(str); g_assert(strcmp(qstring_get_str(str), test_cases[i].decoded) =3D= =3D 0); =20 @@ -998,17 +999,17 @@ static void vararg_number(void) double valuef =3D 2.323423423; int64_t val; =20 - qnum =3D qobject_to(QNum, qobject_from_jsonf("%d", value)); + qnum =3D qobject_to(QNum, qobject_from_jsonf_nofail("%d", value)); g_assert(qnum_get_try_int(qnum, &val)); g_assert_cmpint(val, =3D=3D, value); qobject_unref(qnum); =20 - qnum =3D qobject_to(QNum, qobject_from_jsonf("%lld", value_ll)); + qnum =3D qobject_to(QNum, qobject_from_jsonf_nofail("%lld", value_ll)); g_assert(qnum_get_try_int(qnum, &val)); g_assert_cmpint(val, =3D=3D, value_ll); qobject_unref(qnum); =20 - qnum =3D qobject_to(QNum, qobject_from_jsonf("%f", valuef)); + qnum =3D qobject_to(QNum, qobject_from_jsonf_nofail("%f", valuef)); g_assert(qnum_get_double(qnum) =3D=3D valuef); qobject_unref(qnum); } @@ -1042,13 +1043,13 @@ static void keyword_literal(void) =20 qobject_unref(qbool); =20 - qbool =3D qobject_to(QBool, qobject_from_jsonf("%i", false)); + qbool =3D qobject_to(QBool, qobject_from_jsonf_nofail("%i", false)); g_assert(qbool); g_assert(qbool_get_bool(qbool) =3D=3D false); qobject_unref(qbool); =20 /* Test that non-zero values other than 1 get collapsed to true */ - qbool =3D qobject_to(QBool, qobject_from_jsonf("%i", 2)); + qbool =3D qobject_to(QBool, qobject_from_jsonf_nofail("%i", 2)); g_assert(qbool); g_assert(qbool_get_bool(qbool) =3D=3D true); qobject_unref(qbool); @@ -1298,7 +1299,7 @@ static void simple_varargs(void) embedded_obj =3D qobject_from_json("[32, 42]", &error_abort); g_assert(embedded_obj !=3D NULL); =20 - obj =3D qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj); + obj =3D qobject_from_jsonf_nofail("[%d, 2, %p]", 1, embedded_obj); g_assert(qlit_equal_qobject(&decoded, obj)); =20 qobject_unref(obj); diff --git a/tests/libqtest.h b/tests/libqtest.h index ced95f490a..a67e5e34eb 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -77,7 +77,7 @@ void qtest_quit(QTestState *s); * qtest_qmp_discard_response: * @s: #QTestState instance to operate on. * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and consumes the response. @@ -88,7 +88,7 @@ void qtest_qmp_discard_response(QTestState *s, const char= *fmt, ...); * qtest_qmp: * @s: #QTestState instance to operate on. * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and returns the response. @@ -99,7 +99,7 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...); * qtest_qmp_send: * @s: #QTestState instance to operate on. * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and leaves the response in the stream. @@ -110,7 +110,7 @@ void qtest_qmp_send(QTestState *s, const char *fmt, ...= ); * qtest_qmpv_discard_response: * @s: #QTestState instance to operate on. * @fmt: QMP message to send to QEMU, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * @ap: QMP message arguments * @@ -122,7 +122,7 @@ void qtest_qmpv_discard_response(QTestState *s, const c= har *fmt, va_list ap); * qtest_qmpv: * @s: #QTestState instance to operate on. * @fmt: QMP message to send to QEMU, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * @ap: QMP message arguments * @@ -134,7 +134,7 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_li= st ap); * qtest_qmp_vsend: * @s: #QTestState instance to operate on. * @fmt: QMP message to send to QEMU, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * @ap: QMP message arguments * @@ -575,7 +575,7 @@ static inline void qtest_end(void) /** * qmp: * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and returns the response. @@ -585,7 +585,7 @@ QDict *qmp(const char *fmt, ...); /** * qmp_send: * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and leaves the response in the stream. @@ -595,7 +595,7 @@ void qmp_send(const char *fmt, ...); /** * qmp_discard_response: * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf(). + * qobject_from_jsonf_nofail(). * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Sends a QMP message to QEMU and consumes the response. --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939756761854.78376318987; Mon, 30 Jul 2018 01:35:56 -0700 (PDT) Received: from localhost ([::1]:51182 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3ef-00054H-UQ for importer@patchew.org; Mon, 30 Jul 2018 04:35:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Ot-QW for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cG-0004WC-UN for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45066 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cG-0004Vi-PT for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:20 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 615954219DB9; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 130BB2156701; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 922E411385CF; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:00 +0200 Message-Id: <20180730083317.11765-7-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 06/23] qobject: New qobject_from_vjsonf_nofail(), qdict_from_vjsonf_nofail() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Every printf()-like function sooner or later needs its vprintf()-like buddy. The next commit will need qobject_from_jsonf_nofail()'s buddy, and qdict_from_jsonf_nofail()'s buddy will be used later in this series. Add both. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- include/qapi/qmp/qjson.h | 4 ++++ qobject/qjson.c | 44 +++++++++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h index dc509d51ae..dce78583dc 100644 --- a/include/qapi/qmp/qjson.h +++ b/include/qapi/qmp/qjson.h @@ -18,8 +18,12 @@ QObject *qobject_from_json(const char *string, Error **e= rrp); QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp) GCC_FMT_ATTR(1, 0); =20 +QObject *qobject_from_vjsonf_nofail(const char *string, va_list ap) + GCC_FMT_ATTR(1, 0); QObject *qobject_from_jsonf_nofail(const char *string, ...) GCC_FMT_ATTR(1, 2); +QDict *qdict_from_vjsonf_nofail(const char *string, va_list ap) + GCC_FMT_ATTR(1, 0); QDict *qdict_from_jsonf_nofail(const char *string, ...) GCC_FMT_ATTR(1, 2); =20 diff --git a/qobject/qjson.c b/qobject/qjson.c index 4a9dcff343..2e450231ff 100644 --- a/qobject/qjson.c +++ b/qobject/qjson.c @@ -59,6 +59,25 @@ QObject *qobject_from_json(const char *string, Error **e= rrp) return qobject_from_jsonv(string, NULL, errp); } =20 +/* + * Parse @string as JSON value with %-escapes interpolated. + * Abort on error. Do not use with untrusted @string. + * Return the resulting QObject. It is never null. + */ +QObject *qobject_from_vjsonf_nofail(const char *string, va_list ap) +{ + va_list ap_copy; + QObject *obj; + + /* va_copy() is needed when va_list is an array type */ + va_copy(ap_copy, ap); + obj =3D qobject_from_jsonv(string, &ap_copy, &error_abort); + va_end(ap_copy); + + assert(obj); + return obj; +} + /* * Parse @string as JSON value with %-escapes interpolated. * Abort on error. Do not use with untrusted @string. @@ -70,13 +89,26 @@ QObject *qobject_from_jsonf_nofail(const char *string, = ...) va_list ap; =20 va_start(ap, string); - obj =3D qobject_from_jsonv(string, &ap, &error_abort); + obj =3D qobject_from_vjsonf_nofail(string, ap); va_end(ap); =20 - assert(obj); return obj; } =20 +/* + * Parse @string as JSON object with %-escapes interpolated. + * Abort on error. Do not use with untrusted @string. + * Return the resulting QDict. It is never null. + */ +QDict *qdict_from_vjsonf_nofail(const char *string, va_list ap) +{ + QDict *qdict; + + qdict =3D qobject_to(QDict, qobject_from_vjsonf_nofail(string, ap)); + assert(qdict); + return qdict; +} + /* * Parse @string as JSON object with %-escapes interpolated. * Abort on error. Do not use with untrusted @string. @@ -84,15 +116,13 @@ QObject *qobject_from_jsonf_nofail(const char *string,= ...) */ QDict *qdict_from_jsonf_nofail(const char *string, ...) { - QDict *obj; + QDict *qdict; va_list ap; =20 va_start(ap, string); - obj =3D qobject_to(QDict, qobject_from_jsonv(string, &ap, &error_abort= )); + qdict =3D qdict_from_vjsonf_nofail(string, ap); va_end(ap); - - assert(obj); - return obj; + return qdict; } =20 typedef struct ToJsonIterState --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939758227595.6530221841566; Mon, 30 Jul 2018 01:35:58 -0700 (PDT) Received: from localhost ([::1]:51180 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3ed-00052n-De for importer@patchew.org; Mon, 30 Jul 2018 04:35:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39363) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Or-QU for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cG-0004W4-S8 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51098 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cG-0004VT-NL for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:20 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4DE8DCFB51; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 24C537C47; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 958F211385D0; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:01 +0200 Message-Id: <20180730083317.11765-8-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:20 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 07/23] libqtest: Simplify qmp_fd_vsend() a bit X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- tests/libqtest.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index c2c08a890c..3bfb062fcb 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -488,24 +488,20 @@ QDict *qtest_qmp_receive(QTestState *s) */ void qmp_fd_vsend(int fd, const char *fmt, va_list ap) { - va_list ap_copy; QObject *qobj; =20 - /* qobject_from_jsonv() silently eats leading 0xff as invalid - * JSON, but we want to test sending them over the wire to force - * resyncs */ + /* + * qobject_from_vjsonf_nofail() chokes on leading 0xff as invalid + * JSON, but tests/test-qga.c needs to send that to test QGA + * synchronization + */ if (*fmt =3D=3D '\377') { socket_send(fd, fmt, 1); fmt++; } =20 - /* Going through qobject ensures we escape strings properly. - * This seemingly unnecessary copy is required in case va_list - * is an array type. - */ - va_copy(ap_copy, ap); - qobj =3D qobject_from_jsonv(fmt, &ap_copy, &error_abort); - va_end(ap_copy); + /* Going through qobject ensures we escape strings properly */ + qobj =3D qobject_from_vjsonf_nofail(fmt, ap); =20 /* No need to send anything for an empty QObject. */ if (qobj) { --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940263326969.8033360350856; Mon, 30 Jul 2018 01:44:23 -0700 (PDT) Received: from localhost ([::1]:51224 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3mw-0003tA-4L for importer@patchew.org; Mon, 30 Jul 2018 04:44:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39411) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cL-0003P2-6g for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004XD-AT for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45072 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cH-0004WV-Nw for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 522E64001388; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2927C215670B; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9917711385D4; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:02 +0200 Message-Id: <20180730083317.11765-9-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 08/23] test-qobject-input-visitor: Avoid format string ambiguity X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When visitor_input_test_init_internal()'s argument @ap is null, then @json_string is interpreted literally, else it's gets %-escapes interpolated. This is awkward. One caller always passes null @ap, and the others never do. Lift the building of the QObject into the callers, where it can be done without such ambiguity. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-qobject-input-visitor.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-= visitor.c index 0f4d234c3f..caa90b3d7e 100644 --- a/tests/test-qobject-input-visitor.c +++ b/tests/test-qobject-input-visitor.c @@ -47,15 +47,13 @@ static void visitor_input_teardown(TestInputVisitorData= *data, /* The various test_init functions are provided instead of a test setup function so that the JSON string used by the tests are kept in the test functions (and not in main()). */ -static Visitor *visitor_input_test_init_internal(TestInputVisitorData *dat= a, - bool keyval, - const char *json_string, - va_list *ap) + +static Visitor *test_init_internal(TestInputVisitorData *data, bool keyval, + QObject *obj) { visitor_input_teardown(data, NULL); =20 - data->obj =3D qobject_from_jsonv(json_string, ap, &error_abort); - g_assert(data->obj); + data->obj =3D obj; =20 if (keyval) { data->qiv =3D qobject_input_visitor_new_keyval(data->obj); @@ -75,7 +73,8 @@ Visitor *visitor_input_test_init_full(TestInputVisitorDat= a *data, va_list ap; =20 va_start(ap, json_string); - v =3D visitor_input_test_init_internal(data, keyval, json_string, &ap); + v =3D test_init_internal(data, keyval, + qobject_from_vjsonf_nofail(json_string, ap)); va_end(ap); return v; } @@ -88,7 +87,8 @@ Visitor *visitor_input_test_init(TestInputVisitorData *da= ta, va_list ap; =20 va_start(ap, json_string); - v =3D visitor_input_test_init_internal(data, false, json_string, &ap); + v =3D test_init_internal(data, false, + qobject_from_vjsonf_nofail(json_string, ap)); va_end(ap); return v; } @@ -103,7 +103,8 @@ Visitor *visitor_input_test_init(TestInputVisitorData *= data, static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data, const char *json_string) { - return visitor_input_test_init_internal(data, false, json_string, NULL= ); + return test_init_internal(data, false, + qobject_from_json(json_string, &error_abort)= ); } =20 static void test_visitor_in_int(TestInputVisitorData *data, --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939932187534.2903315967227; Mon, 30 Jul 2018 01:38:52 -0700 (PDT) Received: from localhost ([::1]:51197 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3hb-0007O8-3h for importer@patchew.org; Mon, 30 Jul 2018 04:38:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39369) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Ox-RU for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cH-0004Wd-Kg for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45070 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cH-0004WR-G5 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:21 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 12F294219DB9; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DEC5B10F1C09; Mon, 30 Jul 2018 08:33:20 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9C75911385D5; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:03 +0200 Message-Id: <20180730083317.11765-10-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 09/23] qobject: qobject_from_jsonv() is dangerous, hide it away X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" qobject_from_jsonv() takes ownership of %p arguments. On failure, we can't generally know whether we failed before or after %p, so ownership becomes indeterminate. To avoid leaks, callers passing %p must terminate on error, e.g. by passing &error_abort. Trap for the unwary; document and give the function internal linkage. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- include/qapi/qmp/qjson.h | 2 -- qobject/qjson.c | 13 ++++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h index dce78583dc..5ebbe5a118 100644 --- a/include/qapi/qmp/qjson.h +++ b/include/qapi/qmp/qjson.h @@ -15,8 +15,6 @@ #define QJSON_H =20 QObject *qobject_from_json(const char *string, Error **errp); -QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp) - GCC_FMT_ATTR(1, 0); =20 QObject *qobject_from_vjsonf_nofail(const char *string, va_list ap) GCC_FMT_ATTR(1, 0); diff --git a/qobject/qjson.c b/qobject/qjson.c index 2e450231ff..ab4040f235 100644 --- a/qobject/qjson.c +++ b/qobject/qjson.c @@ -39,7 +39,18 @@ static void parse_json(JSONMessageParser *parser, GQueue= *tokens) s->result =3D json_parser_parse_err(tokens, s->ap, &s->err); } =20 -QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp) +/* + * Parse @string as JSON value. + * If @ap is non-null, interpolate %-escapes. + * Takes ownership of %p arguments. + * On success, return the JSON value. + * On failure, store an error through @errp and return NULL. + * Ownership of %p arguments becomes indeterminate then. To avoid + * leaks, callers passing %p must terminate on error, e.g. by passing + * &error_abort. + */ +static QObject *qobject_from_jsonv(const char *string, va_list *ap, + Error **errp) { JSONParsingState state =3D {}; =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939927689238.25802948489672; Mon, 30 Jul 2018 01:38:47 -0700 (PDT) Received: from localhost ([::1]:51194 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3hW-0007Ln-GS for importer@patchew.org; Mon, 30 Jul 2018 04:38:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39418) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cL-0003P3-HN for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004YF-Tq for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51108 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004X8-Fe for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1443BCFB51; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E0EA12026D68; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 9FDF2113853B; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:04 +0200 Message-Id: <20180730083317.11765-11-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 10/23] tests: Pass literal format strings directly to qmp_FOO() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The qmp_FOO() take a printf-like format string. In a few places, we assign a string literal to a variable and pass that instead of simply passing the literal. Clean that up. Bonus: gets rid of non-literal format strings. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- tests/ahci-test.c | 4 +--- tests/ide-test.c | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 7e3491b5bd..19a7ab1bca 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -1352,7 +1352,6 @@ static void test_flush_migrate(void) AHCIQState *src, *dst; AHCICommand *cmd; uint8_t px; - const char *s; char *uri =3D g_strdup_printf("unix:%s", mig_socket); =20 prepare_blkdebug_script(debug_path, "flush_to_disk"); @@ -1388,8 +1387,7 @@ static void test_flush_migrate(void) ahci_migrate(src, dst, uri); =20 /* Complete the command */ - s =3D "{'execute':'cont' }"; - qmp_send(s); + qmp_send("{'execute':'cont' }"); qmp_eventwait("RESUME"); ahci_command_wait(dst, cmd); ahci_command_verify(dst, cmd); diff --git a/tests/ide-test.c b/tests/ide-test.c index 2384c2c3e2..834ee9005b 100644 --- a/tests/ide-test.c +++ b/tests/ide-test.c @@ -694,7 +694,6 @@ static void test_retry_flush(const char *machine) QPCIDevice *dev; QPCIBar bmdma_bar, ide_bar; uint8_t data; - const char *s; =20 prepare_blkdebug_script(debug_path, "flush_to_disk"); =20 @@ -722,8 +721,7 @@ static void test_retry_flush(const char *machine) qmp_eventwait("STOP"); =20 /* Complete the command */ - s =3D "{'execute':'cont' }"; - qmp_discard_response(s); + qmp_discard_response("{'execute':'cont' }"); =20 /* Check registers */ data =3D qpci_io_readb(dev, ide_bar, reg_device); --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940625559269.23092030279133; Mon, 30 Jul 2018 01:50:25 -0700 (PDT) Received: from localhost ([::1]:51264 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3sm-0000tA-AJ for importer@patchew.org; Mon, 30 Jul 2018 04:50:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39521) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cN-0003Pf-Tf for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004XX-Ad for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:27 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45078 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004WZ-0g for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7259D4219DBB; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 083B010F1C0B; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A353B11384BA; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:05 +0200 Message-Id: <20180730083317.11765-12-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 11/23] tests: Clean up string interpolation into QMP input (simple cases) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When you build QMP input manually like this cmd =3D g_strdup_printf("{ 'execute': 'migrate'," "'arguments': { 'uri': '%s' } }", uri); rsp =3D qmp(cmd); g_free(cmd); you're responsible for escaping the interpolated values for JSON. Not done here, and therefore works only for sufficiently nice @uri. For instance, if @uri contained a single "'", qobject_from_vjsonf_nofail() would abort. A sufficiently nasty @uri could even inject unwanted members into the arguments object. Leaving interpolation into JSON to qmp() is more robust: rsp =3D qmp("{ 'execute': 'migrate', 'arguments': { 'uri': %s } }", uri= ); It's also more concise. Clean up the simple cases where we interpolate exactly a JSON value. Bonus: gets rid of non-literal format strings. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- tests/libqos/pci-pc.c | 9 +-- tests/libqtest.c | 7 +- tests/migration-test.c | 8 +-- tests/test-qga.c | 150 ++++++++++++++++++---------------------- tests/tpm-util.c | 9 +-- tests/vhost-user-test.c | 6 +- 6 files changed, 77 insertions(+), 112 deletions(-) diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c index a7803308b7..585f5289ec 100644 --- a/tests/libqos/pci-pc.c +++ b/tests/libqos/pci-pc.c @@ -160,14 +160,9 @@ void qpci_free_pc(QPCIBus *bus) void qpci_unplug_acpi_device_test(const char *id, uint8_t slot) { QDict *response; - char *cmd; =20 - cmd =3D g_strdup_printf("{'execute': 'device_del'," - " 'arguments': {" - " 'id': '%s'" - "}}", id); - response =3D qmp(cmd); - g_free(cmd); + response =3D qmp("{'execute': 'device_del', 'arguments': {'id': %s}}", + id); g_assert(response); g_assert(!qdict_haskey(response, "error")); qobject_unref(response); diff --git a/tests/libqtest.c b/tests/libqtest.c index 3bfb062fcb..e36cc5ede3 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -1079,12 +1079,9 @@ void qtest_qmp_device_add(const char *driver, const = char *id, const char *fmt, void qtest_qmp_device_del(const char *id) { QDict *response1, *response2, *event =3D NULL; - char *cmd; =20 - cmd =3D g_strdup_printf("{'execute': 'device_del'," - " 'arguments': { 'id': '%s' }}", id); - response1 =3D qmp(cmd); - g_free(cmd); + response1 =3D qmp("{'execute': 'device_del', 'arguments': {'id': %s}}", + id); g_assert(response1); g_assert(!qdict_haskey(response1, "error")); =20 diff --git a/tests/migration-test.c b/tests/migration-test.c index e079e0bdb6..c6c7089ce1 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -529,14 +529,12 @@ static void test_migrate_end(QTestState *from, QTestS= tate *to, bool test_dest) static void deprecated_set_downtime(QTestState *who, const double value) { QDict *rsp; - gchar *cmd; char *expected; int64_t result_int; =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate_set_downtime'," - "'arguments': { 'value': %g } }", value); - rsp =3D qtest_qmp(who, cmd); - g_free(cmd); + rsp =3D qtest_qmp(who, + "{ 'execute': 'migrate_set_downtime'," + " 'arguments': { 'value': %f } }", value); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); result_int =3D value * 1000L; diff --git a/tests/test-qga.c b/tests/test-qga.c index d638b1571a..c552cc0125 100644 --- a/tests/test-qga.c +++ b/tests/test-qga.c @@ -146,12 +146,11 @@ static void test_qga_sync_delimited(gconstpointer fix) guint32 v, r =3D g_random_int(); unsigned char c; QDict *ret; - gchar *cmd; =20 - cmd =3D 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{'execute': 'guest-sync-delimited'," + " 'arguments': {'id': %u } }", + r); =20 /* * Read and ignore garbage until resynchronized. @@ -188,7 +187,6 @@ static void test_qga_sync(gconstpointer fix) const TestFixture *fixture =3D fix; guint32 v, r =3D g_random_int(); QDict *ret; - gchar *cmd; =20 /* * TODO guest-sync is inherently limited: we cannot distinguish @@ -201,10 +199,9 @@ static void test_qga_sync(gconstpointer fix) * invalid JSON. Testing of '\xff' handling is done in * guest-sync-delimited instead. */ - cmd =3D g_strdup_printf("{'execute': 'guest-sync'," - " 'arguments': {'id': %u } }", r); - ret =3D qmp_fd(fixture->fd, cmd); - g_free(cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-sync', 'arguments': {'id': %u } }", + r); =20 g_assert_nonnull(ret); qmp_assert_no_error(ret); @@ -428,7 +425,7 @@ static void test_qga_file_ops(gconstpointer fix) const TestFixture *fixture =3D fix; const unsigned char helloworld[] =3D "Hello World!\n"; const char *b64; - gchar *cmd, *path, *enc; + gchar *path, *enc; unsigned char *dec; QDict *ret, *val; int64_t id, eof; @@ -446,10 +443,10 @@ static void test_qga_file_ops(gconstpointer fix) =20 enc =3D g_base64_encode(helloworld, sizeof(helloworld)); /* write */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-write'," - " 'arguments': { 'handle': %" PRId64 "," - " 'buf-b64': '%s' } }", id, enc); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-write'," + " 'arguments': { 'handle': %" PRId64 ", 'buf-b64': %s } }= ", + id, enc); g_assert_nonnull(ret); qmp_assert_no_error(ret); =20 @@ -459,23 +456,20 @@ static void test_qga_file_ops(gconstpointer fix) g_assert_cmpint(count, =3D=3D, sizeof(helloworld)); g_assert_cmpint(eof, =3D=3D, 0); qobject_unref(ret); - g_free(cmd); =20 /* flush */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-flush'," - " 'arguments': {'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-flush'," + " 'arguments': {'handle': %" PRId64 "} }", + id); qobject_unref(ret); - g_free(cmd); =20 /* close */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-close'," - " 'arguments': {'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-close'," + " 'arguments': {'handle': %" PRId64 "} }", + id); qobject_unref(ret); - g_free(cmd); =20 /* check content */ path =3D g_build_filename(fixture->test_dir, "foo", NULL); @@ -497,10 +491,10 @@ static void test_qga_file_ops(gconstpointer fix) qobject_unref(ret); =20 /* read */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-read'," - " 'arguments': { 'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-read'," + " 'arguments': { 'handle': %" PRId64 "} }", + id); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "count"); eof =3D qdict_get_bool(val, "eof"); @@ -510,14 +504,13 @@ static void test_qga_file_ops(gconstpointer fix) g_assert_cmpstr(b64, =3D=3D, enc); =20 qobject_unref(ret); - g_free(cmd); g_free(enc); =20 /* read eof */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-read'," - " 'arguments': { 'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-read'," + " 'arguments': { 'handle': %" PRId64 "} }", + id); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "count"); eof =3D qdict_get_bool(val, "eof"); @@ -526,14 +519,13 @@ static void test_qga_file_ops(gconstpointer fix) g_assert(eof); g_assert_cmpstr(b64, =3D=3D, ""); qobject_unref(ret); - g_free(cmd); =20 /* seek */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-seek'," - " 'arguments': { 'handle': %" PRId64 ", " - " 'offset': %d, 'whence': '%s' } }", - id, 6, "set"); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-seek'," + " 'arguments': { 'handle': %" PRId64 ", " + " 'offset': %d, 'whence': %s } }", + id, 6, "set"); qmp_assert_no_error(ret); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "position"); @@ -541,13 +533,12 @@ static void test_qga_file_ops(gconstpointer fix) g_assert_cmpint(count, =3D=3D, 6); g_assert(!eof); qobject_unref(ret); - g_free(cmd); =20 /* partial read */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-read'," - " 'arguments': { 'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-read'," + " 'arguments': { 'handle': %" PRId64 "} }", + id); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "count"); eof =3D qdict_get_bool(val, "eof"); @@ -560,15 +551,13 @@ static void test_qga_file_ops(gconstpointer fix) g_free(dec); =20 qobject_unref(ret); - g_free(cmd); =20 /* close */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-close'," - " 'arguments': {'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-close'," + " 'arguments': {'handle': %" PRId64 "} }", + id); qobject_unref(ret); - g_free(cmd); } =20 static void test_qga_file_write_read(gconstpointer fix) @@ -576,7 +565,7 @@ static void test_qga_file_write_read(gconstpointer fix) const TestFixture *fixture =3D fix; const unsigned char helloworld[] =3D "Hello World!\n"; const char *b64; - gchar *cmd, *enc; + gchar *enc; QDict *ret, *val; int64_t id, eof; gsize count; @@ -591,10 +580,10 @@ static void test_qga_file_write_read(gconstpointer fi= x) =20 enc =3D g_base64_encode(helloworld, sizeof(helloworld)); /* write */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-write'," - " 'arguments': { 'handle': %" PRId64 "," - " 'buf-b64': '%s' } }", id, enc); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-write'," + " 'arguments': { 'handle': %" PRId64 "," + " 'buf-b64': %s } }", id, enc); g_assert_nonnull(ret); qmp_assert_no_error(ret); =20 @@ -604,13 +593,12 @@ static void test_qga_file_write_read(gconstpointer fi= x) g_assert_cmpint(count, =3D=3D, sizeof(helloworld)); g_assert_cmpint(eof, =3D=3D, 0); qobject_unref(ret); - g_free(cmd); =20 /* read (check implicit flush) */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-read'," - " 'arguments': { 'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-read'," + " 'arguments': { 'handle': %" PRId64 "} }", + id); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "count"); eof =3D qdict_get_bool(val, "eof"); @@ -619,14 +607,13 @@ static void test_qga_file_write_read(gconstpointer fi= x) g_assert(eof); g_assert_cmpstr(b64, =3D=3D, ""); qobject_unref(ret); - g_free(cmd); =20 /* seek to 0 */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-seek'," - " 'arguments': { 'handle': %" PRId64 ", " - " 'offset': %d, 'whence': '%s' } }", - id, 0, "set"); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-seek'," + " 'arguments': { 'handle': %" PRId64 ", " + " 'offset': %d, 'whence': %s } }", + id, 0, "set"); qmp_assert_no_error(ret); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "position"); @@ -634,13 +621,12 @@ static void test_qga_file_write_read(gconstpointer fi= x) g_assert_cmpint(count, =3D=3D, 0); g_assert(!eof); qobject_unref(ret); - g_free(cmd); =20 /* read */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-read'," - " 'arguments': { 'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-read'," + " 'arguments': { 'handle': %" PRId64 "} }", + id); val =3D qdict_get_qdict(ret, "return"); count =3D qdict_get_int(val, "count"); eof =3D qdict_get_bool(val, "eof"); @@ -649,16 +635,14 @@ static void test_qga_file_write_read(gconstpointer fi= x) g_assert(eof); g_assert_cmpstr(b64, =3D=3D, enc); qobject_unref(ret); - g_free(cmd); g_free(enc); =20 /* close */ - cmd =3D g_strdup_printf("{'execute': 'guest-file-close'," - " 'arguments': {'handle': %" PRId64 "} }", - id); - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-file-close'," + " 'arguments': {'handle': %" PRId64 "} }", + id); qobject_unref(ret); - g_free(cmd); } =20 static void test_qga_get_time(gconstpointer fix) @@ -814,7 +798,6 @@ static void test_qga_guest_exec(gconstpointer fix) int64_t pid, now, exitcode; gsize len; bool exited; - char *cmd; =20 /* exec 'echo foo bar' */ ret =3D qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {" @@ -829,10 +812,10 @@ static void test_qga_guest_exec(gconstpointer fix) =20 /* wait for completion */ now =3D g_get_monotonic_time(); - cmd =3D g_strdup_printf("{'execute': 'guest-exec-status'," - " 'arguments': { 'pid': %" PRId64 " } }", pid); do { - ret =3D qmp_fd(fixture->fd, cmd); + ret =3D qmp_fd(fixture->fd, + "{'execute': 'guest-exec-status'," + " 'arguments': { 'pid': %" PRId64 " } }", pid); g_assert_nonnull(ret); val =3D qdict_get_qdict(ret, "return"); exited =3D qdict_get_bool(val, "exited"); @@ -842,7 +825,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); =20 /* check stdout */ exitcode =3D qdict_get_int(val, "exitcode"); diff --git a/tests/tpm-util.c b/tests/tpm-util.c index 672cedf905..3bd2887f1e 100644 --- a/tests/tpm-util.c +++ b/tests/tpm-util.c @@ -239,13 +239,10 @@ void tpm_util_swtpm_kill(GPid pid) void tpm_util_migrate(QTestState *who, const char *uri) { QDict *rsp; - gchar *cmd; =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate'," - "'arguments': { 'uri': '%s' } }", - uri); - rsp =3D qtest_qmp(who, cmd); - g_free(cmd); + rsp =3D qtest_qmp(who, + "{ 'execute': 'migrate', 'arguments': { 'uri': %s } }", + uri); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); } diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index fecc832d99..ca6251f5f8 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -709,11 +709,7 @@ static void test_migrate(void) g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate'," - "'arguments': { 'uri': '%s' } }", - uri); - rsp =3D qmp(cmd); - g_free(cmd); + rsp =3D qmp("{ 'execute': 'migrate', 'arguments': { 'uri': %s } }", ur= i); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939929239646.4023251398726; Mon, 30 Jul 2018 01:38:49 -0700 (PDT) Received: from localhost ([::1]:51195 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3hY-0007Mc-3I for importer@patchew.org; Mon, 30 Jul 2018 04:38:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39364) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cJ-0003Os-QG for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004X4-6t for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:41584 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cH-0004WT-NA for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:21 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2ED534022909; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 082B22026D68; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id A6B9E11384C3; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:06 +0200 Message-Id: <20180730083317.11765-13-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 12/23] cpu-plug-test: Don't pass integers as strings to device_add X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" test_plug_with_device_add_x86() plugs Haswell-i386-cpu and Haswell-x86_64-cpu with device_add. It passes socket-id, core-id, thread-id as JSON strings. The properties are actually integers. test_plug_with_device_add_coreid() plugs power8_v2.0-spapr-cpu-core and qemu-s390x-cpu with device_add. It passes core-id as JSON string. The properties are actually integers. Passing JSON string values to integer properties works only due to device_add implementation accidents. Fix the test to pass JSON numbers. While there, use %u rather than %i with unsigned int. Cc: Thomas Huth Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Thomas Huth Reviewed-by: Eric Blake --- tests/cpu-plug-test.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/cpu-plug-test.c b/tests/cpu-plug-test.c index 5f39ba0df3..ab3bf6df90 100644 --- a/tests/cpu-plug-test.c +++ b/tests/cpu-plug-test.c @@ -88,8 +88,8 @@ static void test_plug_with_device_add_x86(gconstpointer d= ata) for (c =3D 0; c < td->cores; c++) { for (t =3D 0; t < td->threads; t++) { char *id =3D g_strdup_printf("id-%i-%i-%i", s, c, t); - qtest_qmp_device_add(td->device_model, id, "'socket-id':'%= i', " - "'core-id':'%i', 'thread-id':'%i'", + qtest_qmp_device_add(td->device_model, id, "'socket-id':%u= , " + "'core-id':%u, 'thread-id':%u", s, c, t); g_free(id); } @@ -114,7 +114,7 @@ static void test_plug_with_device_add_coreid(gconstpoin= ter data) =20 for (c =3D td->cores; c < td->maxcpus / td->sockets / td->threads; c++= ) { char *id =3D g_strdup_printf("id-%i", c); - qtest_qmp_device_add(td->device_model, id, "'core-id':'%i'", c); + qtest_qmp_device_add(td->device_model, id, "'core-id':%u", c); g_free(id); } =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940864451468.90986527449115; Mon, 30 Jul 2018 01:54:24 -0700 (PDT) Received: from localhost ([::1]:51286 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3wd-0003Sl-5y for importer@patchew.org; Mon, 30 Jul 2018 04:54:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39564) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cP-0003RV-9S for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Zy-PC for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:29 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51124 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Yg-It for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 26EDFCFB46; Mon, 30 Jul 2018 08:33:23 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0A3B8FF69; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id AA33B11384D8; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:07 +0200 Message-Id: <20180730083317.11765-14-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:23 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:23 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 13/23] tests: Clean up string interpolation around qtest_qmp_device_add() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Leaving interpolation into JSON to qmp() is more robust than building QMP input manually, as explained in the commit before previous. qtest_qmp_device_add() and its wrappers interpolate into JSON as follows: * qtest_qmp_device_add() interpolates members into a JSON object. * So do its wrappers qpci_plug_device_test() and usb_test_hotplug(). * usb_test_hotplug() additionally interpolates strings and numbers into JSON strings. Clean them up: * Have qtest_qmp_device_add() take its extra device properties as arguments for qdict_from_jsonf_nofail() instead of a string containing JSON members. * Drop qpci_plug_device_test(), use qtest_qmp_device_add() directly. * Change usb_test_hotplug() parameter @port to string, to avoid interpolation. Interpolate @hcd_id separately. Bonus: gets rid of a non-literal format string. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Cc: Thomas Huth Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/cpu-plug-test.c | 7 ++++--- tests/e1000e-test.c | 6 ++---- tests/ivshmem-test.c | 8 +++----- tests/libqos/pci.c | 7 ------- tests/libqos/pci.h | 2 -- tests/libqos/usb.c | 10 ++++++---- tests/libqos/usb.h | 2 +- tests/libqtest.c | 27 +++++++++++---------------- tests/libqtest.h | 4 +++- tests/usb-hcd-ehci-test.c | 2 +- tests/usb-hcd-ohci-test.c | 2 +- tests/usb-hcd-uhci-test.c | 4 ++-- tests/usb-hcd-xhci-test.c | 10 +++++----- tests/virtio-blk-test.c | 5 +++-- tests/virtio-net-test.c | 3 ++- tests/virtio-rng-test.c | 3 ++- tests/virtio-scsi-test.c | 2 +- tests/virtio-serial-test.c | 2 +- 18 files changed, 48 insertions(+), 58 deletions(-) diff --git a/tests/cpu-plug-test.c b/tests/cpu-plug-test.c index ab3bf6df90..f5d57da60e 100644 --- a/tests/cpu-plug-test.c +++ b/tests/cpu-plug-test.c @@ -88,8 +88,9 @@ static void test_plug_with_device_add_x86(gconstpointer d= ata) for (c =3D 0; c < td->cores; c++) { for (t =3D 0; t < td->threads; t++) { char *id =3D g_strdup_printf("id-%i-%i-%i", s, c, t); - qtest_qmp_device_add(td->device_model, id, "'socket-id':%u= , " - "'core-id':%u, 'thread-id':%u", + qtest_qmp_device_add(td->device_model, id, + "{'socket-id':%u, 'core-id':%u," + " 'thread-id':%u}", s, c, t); g_free(id); } @@ -114,7 +115,7 @@ static void test_plug_with_device_add_coreid(gconstpoin= ter data) =20 for (c =3D td->cores; c < td->maxcpus / td->sockets / td->threads; c++= ) { char *id =3D g_strdup_printf("id-%i", c); - qtest_qmp_device_add(td->device_model, id, "'core-id':%u", c); + qtest_qmp_device_add(td->device_model, id, "{'core-id':%u}", c); g_free(id); } =20 diff --git a/tests/e1000e-test.c b/tests/e1000e-test.c index 32aa738b72..c9408a5d1f 100644 --- a/tests/e1000e-test.c +++ b/tests/e1000e-test.c @@ -456,12 +456,10 @@ static void test_e1000e_multiple_transfers(gconstpoin= ter data) =20 static void test_e1000e_hotplug(gconstpointer data) { - static const uint8_t slot =3D 0x06; - qtest_start("-device e1000e"); =20 - qpci_plug_device_test("e1000e", "e1000e_net", slot, NULL); - qpci_unplug_acpi_device_test("e1000e_net", slot); + qtest_qmp_device_add("e1000e", "e1000e_net", "{'addr': '0x06'}"); + qpci_unplug_acpi_device_test("e1000e_net", 0x06); =20 qtest_end(); } diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c index 9b407a3e42..c37b196b32 100644 --- a/tests/ivshmem-test.c +++ b/tests/ivshmem-test.c @@ -420,19 +420,17 @@ static void test_ivshmem_server_irq(void) static void test_ivshmem_hotplug(void) { const char *arch =3D qtest_get_arch(); - gchar *opts; =20 qtest_start(""); =20 - opts =3D g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm); - - qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts); + qtest_qmp_device_add("ivshmem", + "iv1", "{'addr': %s, 'shm': %s, 'size': '1M'}", + stringify(PCI_SLOT_HP), tmpshm); if (strcmp(arch, "ppc64") !=3D 0) { qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP); } =20 qtest_end(); - g_free(opts); } =20 static void test_ivshmem_memdev(void) diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c index 0b73cb23d0..e8c342c257 100644 --- a/tests/libqos/pci.c +++ b/tests/libqos/pci.c @@ -395,10 +395,3 @@ QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t ad= dr) QPCIBar bar =3D { .addr =3D addr }; return bar; } - -void qpci_plug_device_test(const char *driver, const char *id, - uint8_t slot, const char *opts) -{ - qtest_qmp_device_add(driver, id, "'addr': '%d'%s%s", slot, - opts ? ", " : "", opts ? opts : ""); -} diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h index 429c382282..0b7e936174 100644 --- a/tests/libqos/pci.h +++ b/tests/libqos/pci.h @@ -109,7 +109,5 @@ QPCIBar qpci_iomap(QPCIDevice *dev, int barno, uint64_t= *sizeptr); void qpci_iounmap(QPCIDevice *dev, QPCIBar addr); QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr); =20 -void qpci_plug_device_test(const char *driver, const char *id, - uint8_t slot, const char *opts); void qpci_unplug_acpi_device_test(const char *id, uint8_t slot); #endif diff --git a/tests/libqos/usb.c b/tests/libqos/usb.c index 2a476049a8..49e2f4bc0a 100644 --- a/tests/libqos/usb.c +++ b/tests/libqos/usb.c @@ -37,13 +37,14 @@ void uhci_port_test(struct qhc *hc, int port, uint16_t = expect) g_assert((value & mask) =3D=3D (expect & mask)); } =20 -void usb_test_hotplug(const char *hcd_id, const int port, +void usb_test_hotplug(const char *hcd_id, const char *port, void (*port_check)(void)) { - char *id =3D g_strdup_printf("usbdev%d", port); + char *id =3D g_strdup_printf("usbdev%s", port); + char *bus =3D g_strdup_printf("%s.0", hcd_id); =20 - qtest_qmp_device_add("usb-tablet", id, "'port': '%d', 'bus': '%s.0'", - port, hcd_id); + qtest_qmp_device_add("usb-tablet", id, "{'port': %s, 'bus': %s}", + port, bus); =20 if (port_check) { port_check(); @@ -51,5 +52,6 @@ void usb_test_hotplug(const char *hcd_id, const int port, =20 qtest_qmp_device_del(id); =20 + g_free(bus); g_free(id); } diff --git a/tests/libqos/usb.h b/tests/libqos/usb.h index 297cfc564d..c506418a13 100644 --- a/tests/libqos/usb.h +++ b/tests/libqos/usb.h @@ -13,6 +13,6 @@ void qusb_pci_init_one(QPCIBus *pcibus, struct qhc *hc, void uhci_port_test(struct qhc *hc, int port, uint16_t expect); void uhci_deinit(struct qhc *hc); =20 -void usb_test_hotplug(const char *bus_name, const int port, +void usb_test_hotplug(const char *bus_name, const char *port, void (*port_check)(void)); #endif diff --git a/tests/libqtest.c b/tests/libqtest.c index e36cc5ede3..dfca3af89d 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -1032,26 +1032,21 @@ void qtest_cb_for_every_machine(void (*cb)(const ch= ar *machine)) /* * Generic hot-plugging test via the device_add QMP command. */ -void qtest_qmp_device_add(const char *driver, const char *id, const char *= fmt, - ...) +void qtest_qmp_device_add(const char *driver, const char *id, + const char *fmt, ...) { - QDict *response; - char *cmd, *opts =3D NULL; - va_list va; + QDict *args, *response; + va_list ap; =20 - if (fmt) { - va_start(va, fmt); - opts =3D g_strdup_vprintf(fmt, va); - va_end(va); - } + va_start(ap, fmt); + args =3D qdict_from_vjsonf_nofail(fmt, ap); + va_end(ap); =20 - cmd =3D g_strdup_printf("{'execute': 'device_add'," - " 'arguments': { 'driver': '%s', 'id': '%s'%s%s = }}", - driver, id, opts ? ", " : "", opts ? opts : ""); - g_free(opts); + g_assert(!qdict_haskey(args, "driver") && !qdict_haskey(args, "id")); + qdict_put_str(args, "driver", driver); + qdict_put_str(args, "id", id); =20 - response =3D qmp(cmd); - g_free(cmd); + response =3D qmp("{'execute': 'device_add', 'arguments': %p}", args); g_assert(response); g_assert(!qdict_haskey(response, "event")); /* We don't expect any eve= nts */ g_assert(!qdict_haskey(response, "error")); diff --git a/tests/libqtest.h b/tests/libqtest.h index a67e5e34eb..ce6c092fc9 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -976,7 +976,9 @@ void qtest_cb_for_every_machine(void (*cb)(const char *= machine)); * qtest_qmp_device_add: * @driver: Name of the device that should be added * @id: Identification string - * @fmt: printf-like format string for further options to device_add + * @fmt...: QMP message to send to qemu, formatted like + * qobject_from_jsonf_nofail(). + * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). * * Generic hot-plugging test via the device_add QMP command. */ diff --git a/tests/usb-hcd-ehci-test.c b/tests/usb-hcd-ehci-test.c index 55d4743a2a..f28ea27f37 100644 --- a/tests/usb-hcd-ehci-test.c +++ b/tests/usb-hcd-ehci-test.c @@ -139,7 +139,7 @@ static void pci_ehci_port_3_hotplug(void) =20 static void pci_ehci_port_hotplug(void) { - usb_test_hotplug("ich9-ehci-1", 3, pci_ehci_port_3_hotplug); + usb_test_hotplug("ich9-ehci-1", "3", pci_ehci_port_3_hotplug); } =20 =20 diff --git a/tests/usb-hcd-ohci-test.c b/tests/usb-hcd-ohci-test.c index 4758813d78..48ddbfd26d 100644 --- a/tests/usb-hcd-ohci-test.c +++ b/tests/usb-hcd-ohci-test.c @@ -19,7 +19,7 @@ static void test_ohci_init(void) =20 static void test_ohci_hotplug(void) { - usb_test_hotplug("ohci", 1, NULL); + usb_test_hotplug("ohci", "1", NULL); } =20 int main(int argc, char **argv) diff --git a/tests/usb-hcd-uhci-test.c b/tests/usb-hcd-uhci-test.c index 6a7e5a2fed..a119d6d5c8 100644 --- a/tests/usb-hcd-uhci-test.c +++ b/tests/usb-hcd-uhci-test.c @@ -43,12 +43,12 @@ static void test_port_2(void) =20 static void test_uhci_hotplug(void) { - usb_test_hotplug("uhci", 2, test_port_2); + usb_test_hotplug("uhci", "2", test_port_2); } =20 static void test_usb_storage_hotplug(void) { - qtest_qmp_device_add("usb-storage", "usbdev0", "'drive': 'drive0'"); + qtest_qmp_device_add("usb-storage", "usbdev0", "{'drive': 'drive0'}"); =20 qtest_qmp_device_del("usbdev0"); } diff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c index 5b1b681bf2..9eb24b00e4 100644 --- a/tests/usb-hcd-xhci-test.c +++ b/tests/usb-hcd-xhci-test.c @@ -18,13 +18,13 @@ static void test_xhci_init(void) =20 static void test_xhci_hotplug(void) { - usb_test_hotplug("xhci", 1, NULL); + usb_test_hotplug("xhci", "1", NULL); } =20 static void test_usb_uas_hotplug(void) { - qtest_qmp_device_add("usb-uas", "uas", NULL); - qtest_qmp_device_add("scsi-hd", "scsihd", "'drive': 'drive0'"); + qtest_qmp_device_add("usb-uas", "uas", "{}"); + qtest_qmp_device_add("scsi-hd", "scsihd", "{'drive': 'drive0'}"); =20 /* TODO: UAS HBA driver in libqos, to check that @@ -37,10 +37,10 @@ static void test_usb_uas_hotplug(void) =20 static void test_usb_ccid_hotplug(void) { - qtest_qmp_device_add("usb-ccid", "ccid", NULL); + qtest_qmp_device_add("usb-ccid", "ccid", "{}"); qtest_qmp_device_del("ccid"); /* check the device can be added again */ - qtest_qmp_device_add("usb-ccid", "ccid", NULL); + qtest_qmp_device_add("usb-ccid", "ccid", "{}"); qtest_qmp_device_del("ccid"); } =20 diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 9be9ffb378..d96b4c69e1 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -662,8 +662,9 @@ static void pci_hotplug(void) qs =3D pci_test_start(); =20 /* plug secondary disk */ - qpci_plug_device_test("virtio-blk-pci", "drv1", PCI_SLOT_HP, - "'drive': 'drive1'"); + qtest_qmp_device_add("virtio-blk-pci", "drv1", + "{'addr': %s, 'drive': 'drive1'}", + stringify(PCI_SLOT_HP)); =20 dev =3D virtio_blk_pci_init(qs->pcibus, PCI_SLOT_HP); g_assert(dev); diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c index b285a262e9..dcb87a8b6e 100644 --- a/tests/virtio-net-test.c +++ b/tests/virtio-net-test.c @@ -249,7 +249,8 @@ static void hotplug(void) =20 qtest_start("-device virtio-net-pci"); =20 - qpci_plug_device_test("virtio-net-pci", "net1", PCI_SLOT_HP, NULL); + qtest_qmp_device_add("virtio-net-pci", "net1", + "{'addr': %s}", stringify(PCI_SLOT_HP)); =20 if (strcmp(arch, "i386") =3D=3D 0 || strcmp(arch, "x86_64") =3D=3D 0) { qpci_unplug_acpi_device_test("net1", PCI_SLOT_HP); diff --git a/tests/virtio-rng-test.c b/tests/virtio-rng-test.c index dcecf77463..657d9a4105 100644 --- a/tests/virtio-rng-test.c +++ b/tests/virtio-rng-test.c @@ -22,7 +22,8 @@ static void hotplug(void) { const char *arch =3D qtest_get_arch(); =20 - qpci_plug_device_test("virtio-rng-pci", "rng1", PCI_SLOT_HP, NULL); + qtest_qmp_device_add("virtio-rng-pci", "rng1", + "{'addr': %s}", stringify(PCI_SLOT_HP)); =20 if (strcmp(arch, "i386") =3D=3D 0 || strcmp(arch, "x86_64") =3D=3D 0) { qpci_unplug_acpi_device_test("rng1", PCI_SLOT_HP); diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 037872bb98..0d4f25d369 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -199,7 +199,7 @@ static void hotplug(void) =20 qs =3D qvirtio_scsi_start( "-drive id=3Ddrv1,if=3Dnone,file=3Dnull-co://,format=3Draw"); - qtest_qmp_device_add("scsi-hd", "scsihd", "'drive': 'drv1'"); + qtest_qmp_device_add("scsi-hd", "scsihd", "{'drive': 'drv1'}"); qtest_qmp_device_del("scsihd"); qvirtio_scsi_stop(qs); } diff --git a/tests/virtio-serial-test.c b/tests/virtio-serial-test.c index 7cc7060264..e4b18b1c8a 100644 --- a/tests/virtio-serial-test.c +++ b/tests/virtio-serial-test.c @@ -18,7 +18,7 @@ static void virtio_serial_nop(void) =20 static void hotplug(void) { - qtest_qmp_device_add("virtserialport", "hp-port", NULL); + qtest_qmp_device_add("virtserialport", "hp-port", "{}"); =20 qtest_qmp_device_del("hp-port"); } --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940448702200.76835789216057; Mon, 30 Jul 2018 01:47:28 -0700 (PDT) Received: from localhost ([::1]:51244 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3po-0006gy-8x for importer@patchew.org; Mon, 30 Jul 2018 04:47:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39428) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cL-0003P7-Qy for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004Xf-Br for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:41590 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004WX-00 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5EE4F402312B; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0D7772156701; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id ADA6111384DA; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:08 +0200 Message-Id: <20180730083317.11765-15-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 14/23] migration-test: Make wait_command() return the "return" member X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org, "Dr . David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All callers of wait_command() are only interested in the success response's "return" member. Lift its extraction into wait_command(). Cc: Juan Quintela Cc: Dr. David Alan Gilbert Signed-off-by: Markus Armbruster Reviewed-by: Juan Quintela Reviewed-by: Eric Blake --- tests/migration-test.c | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/tests/migration-test.c b/tests/migration-test.c index c6c7089ce1..e336399a71 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -152,7 +152,7 @@ static void wait_for_serial(const char *side) static QDict *wait_command(QTestState *who, const char *command) { const char *event_string; - QDict *response; + QDict *response, *ret; =20 response =3D qtest_qmp(who, command); =20 @@ -165,7 +165,12 @@ static QDict *wait_command(QTestState *who, const char= *command) qobject_unref(response); response =3D qtest_qmp_receive(who); } - return response; + + ret =3D qdict_get_qdict(response, "return"); + g_assert(ret); + qobject_ref(ret); + qobject_unref(response); + return ret; } =20 /* @@ -174,15 +179,7 @@ static QDict *wait_command(QTestState *who, const char= *command) */ static QDict *migrate_query(QTestState *who) { - QDict *rsp, *rsp_return; - - rsp =3D wait_command(who, "{ 'execute': 'query-migrate' }"); - rsp_return =3D qdict_get_qdict(rsp, "return"); - g_assert(rsp_return); - qobject_ref(rsp_return); - qobject_unref(rsp); - - return rsp_return; + return wait_command(who, "{ 'execute': 'query-migrate' }"); } =20 /* @@ -324,16 +321,16 @@ static void cleanup(const char *filename) static void migrate_check_parameter(QTestState *who, const char *parameter, const char *value) { - QDict *rsp, *rsp_return; + QDict *rsp_return; char *result; =20 - rsp =3D wait_command(who, "{ 'execute': 'query-migrate-parameters' }"); - rsp_return =3D qdict_get_qdict(rsp, "return"); + rsp_return =3D wait_command(who, + "{ 'execute': 'query-migrate-parameters' }"); result =3D g_strdup_printf("%" PRId64, qdict_get_try_int(rsp_return, parameter, -1)= ); g_assert_cmpstr(result, =3D=3D, value); g_free(result); - qobject_unref(rsp); + qobject_unref(rsp_return); } =20 static void migrate_set_parameter(QTestState *who, const char *parameter, @@ -357,7 +354,6 @@ static void migrate_pause(QTestState *who) QDict *rsp; =20 rsp =3D wait_command(who, "{ 'execute': 'migrate-pause' }"); - g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); } =20 @@ -370,7 +366,6 @@ static void migrate_recover(QTestState *who, const char= *uri) " 'arguments': { 'uri': '%s' } }", uri); =20 rsp =3D wait_command(who, cmd); - g_assert(qdict_haskey(rsp, "return")); g_free(cmd); qobject_unref(rsp); } @@ -411,7 +406,6 @@ static void migrate_postcopy_start(QTestState *from, QT= estState *to) QDict *rsp; =20 rsp =3D wait_command(from, "{ 'execute': 'migrate-start-postcopy' }"); - g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); =20 if (!got_stop) { @@ -689,7 +683,7 @@ static void test_postcopy_recovery(void) static void test_baddest(void) { QTestState *from, *to; - QDict *rsp, *rsp_return; + QDict *rsp_return; char *status; bool failed; =20 @@ -705,12 +699,10 @@ static void test_baddest(void) } while (!failed); =20 /* Is the machine currently running? */ - rsp =3D wait_command(from, "{ 'execute': 'query-status' }"); - g_assert(qdict_haskey(rsp, "return")); - rsp_return =3D qdict_get_qdict(rsp, "return"); + rsp_return =3D wait_command(from, "{ 'execute': 'query-status' }"); g_assert(qdict_haskey(rsp_return, "running")); g_assert(qdict_get_bool(rsp_return, "running")); - qobject_unref(rsp); + qobject_unref(rsp_return); =20 test_migrate_end(from, to, false); } --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940447991955.2247637850895; Mon, 30 Jul 2018 01:47:27 -0700 (PDT) Received: from localhost ([::1]:51243 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3po-0006fQ-0w for importer@patchew.org; Mon, 30 Jul 2018 04:47:20 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39486) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cN-0003PR-A1 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Zo-MR for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:27 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45086 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cJ-0004YZ-GR for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 121D540214E2; Mon, 30 Jul 2018 08:33:23 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4C4CFFF5B; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B136D1133040; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:09 +0200 Message-Id: <20180730083317.11765-16-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:23 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:23 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 15/23] tests: New helper qtest_qmp_receive_success() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, Stefan Berger , Juan Quintela , f4bug@amsat.org, "Dr . David Alan Gilbert" Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Commit b21373d0713 copied wait_command() from tests/migration-test.c to tests/tpm-util.c. Replace both copies by new libqtest helper qtest_qmp_receive_success(). Also use it to simplify qtest_qmp_device_del(). Bonus: gets rid of a non-literal format string. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Cc: Thomas Huth Cc: Juan Quintela Cc: Dr. David Alan Gilbert Cc: Stefan Berger Signed-off-by: Markus Armbruster Reviewed-by: Juan Quintela Reviewed-by: Stefan Berger Reviewed-by: Eric Blake --- tests/libqtest.c | 69 ++++++++++++++++++++++++++++++------------ tests/libqtest.h | 17 +++++++++++ tests/migration-test.c | 29 ++++++------------ tests/tpm-util.c | 32 +++----------------- 4 files changed, 80 insertions(+), 67 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index dfca3af89d..ed832cd8e6 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -1029,6 +1029,35 @@ void qtest_cb_for_every_machine(void (*cb)(const cha= r *machine)) qobject_unref(response); } =20 +QDict *qtest_qmp_receive_success(QTestState *s, + void (*event_cb)(void *opaque, + const char *event, + QDict *data), + void *opaque) +{ + QDict *response, *ret, *data; + const char *event; + + for (;;) { + response =3D qtest_qmp_receive(s); + g_assert(!qdict_haskey(response, "error")); + ret =3D qdict_get_qdict(response, "return"); + if (ret) { + break; + } + event =3D qdict_get_str(response, "event"); + data =3D qdict_get_qdict(response, "data"); + if (event_cb) { + event_cb(opaque, event, data); + } + qobject_unref(response); + } + + qobject_ref(ret); + qobject_unref(response); + return ret; +} + /* * Generic hot-plugging test via the device_add QMP command. */ @@ -1053,6 +1082,14 @@ void qtest_qmp_device_add(const char *driver, const = char *id, qobject_unref(response); } =20 +static void device_deleted_cb(void *opaque, const char *name, QDict *data) +{ + bool *got_event =3D opaque; + + g_assert_cmpstr(name, =3D=3D, "DEVICE_DELETED"); + *got_event =3D true; +} + /* * Generic hot-unplugging test via the device_del QMP command. * Device deletion will get one response and one event. For example: @@ -1073,27 +1110,21 @@ void qtest_qmp_device_add(const char *driver, const= char *id, */ void qtest_qmp_device_del(const char *id) { - QDict *response1, *response2, *event =3D NULL; + bool got_event =3D false; + QDict *rsp; =20 - response1 =3D qmp("{'execute': 'device_del', 'arguments': {'id': %s}}", - id); - g_assert(response1); - g_assert(!qdict_haskey(response1, "error")); - - response2 =3D qmp_receive(); - g_assert(response2); - g_assert(!qdict_haskey(response2, "error")); - - if (qdict_haskey(response1, "event")) { - event =3D response1; - } else if (qdict_haskey(response2, "event")) { - event =3D response2; + qtest_qmp_send(global_qtest, + "{'execute': 'device_del', 'arguments': {'id': %s}}", + id); + rsp =3D qtest_qmp_receive_success(global_qtest, device_deleted_cb, + &got_event); + qobject_unref(rsp); + if (!got_event) { + rsp =3D qmp_receive(); + g_assert_cmpstr(qdict_get_try_str(rsp, "event"), + =3D=3D, "DEVICE_DELETED"); + qobject_unref(rsp); } - g_assert(event); - g_assert_cmpstr(qdict_get_str(event, "event"), =3D=3D, "DEVICE_DELETED= "); - - qobject_unref(response1); - qobject_unref(response2); } =20 bool qmp_rsp_is_err(QDict *rsp) diff --git a/tests/libqtest.h b/tests/libqtest.h index ce6c092fc9..ee58fcdf6d 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -169,6 +169,23 @@ void qtest_qmp_eventwait(QTestState *s, const char *ev= ent); */ QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event); =20 +/** + * qtest_qmp_receive_success: + * @s: #QTestState instance to operate on + * @event_cb: Event callback + * @opaque: Argument for @event_cb + * + * Poll QMP messages until a command success response is received. + * If @event_cb, call it for each event received, passing @opaque, + * the event's name and data. + * Return the success response's "return" member. + */ +QDict *qtest_qmp_receive_success(QTestState *s, + void (*event_cb)(void *opaque, + const char *name, + QDict *data), + void *opaque); + /** * qtest_hmp: * @s: #QTestState instance to operate on. diff --git a/tests/migration-test.c b/tests/migration-test.c index e336399a71..860b8aa0b9 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -146,31 +146,20 @@ static void wait_for_serial(const char *side) } while (true); } =20 +static void stop_cb(void *opaque, const char *name, QDict *data) +{ + if (!strcmp(name, "STOP")) { + got_stop =3D true; + } +} + /* * Events can get in the way of responses we are actually waiting for. */ static QDict *wait_command(QTestState *who, const char *command) { - const char *event_string; - QDict *response, *ret; - - response =3D qtest_qmp(who, command); - - while (qdict_haskey(response, "event")) { - /* OK, it was an event */ - event_string =3D qdict_get_str(response, "event"); - if (!strcmp(event_string, "STOP")) { - got_stop =3D true; - } - qobject_unref(response); - response =3D qtest_qmp_receive(who); - } - - ret =3D qdict_get_qdict(response, "return"); - g_assert(ret); - qobject_ref(ret); - qobject_unref(response); - return ret; + qtest_qmp_send(who, command); + return qtest_qmp_receive_success(who, stop_cb, NULL); } =20 /* diff --git a/tests/tpm-util.c b/tests/tpm-util.c index 3bd2887f1e..9f3f156e42 100644 --- a/tests/tpm-util.c +++ b/tests/tpm-util.c @@ -22,8 +22,6 @@ #define TIS_REG(LOCTY, REG) \ (TPM_TIS_ADDR_BASE + ((LOCTY) << 12) + REG) =20 -static bool got_stop; - void tpm_util_crb_transfer(QTestState *s, const unsigned char *req, size_t req_size, unsigned char *rsp, size_t rsp_size) @@ -247,41 +245,19 @@ void tpm_util_migrate(QTestState *who, const char *ur= i) qobject_unref(rsp); } =20 -/* - * Events can get in the way of responses we are actually waiting for. - */ -static QDict *tpm_util_wait_command(QTestState *who, const char *command) -{ - const char *event_string; - QDict *response; - - response =3D qtest_qmp(who, command); - - while (qdict_haskey(response, "event")) { - /* OK, it was an event */ - event_string =3D qdict_get_str(response, "event"); - if (!strcmp(event_string, "STOP")) { - got_stop =3D true; - } - qobject_unref(response); - response =3D qtest_qmp_receive(who); - } - return response; -} - void tpm_util_wait_for_migration_complete(QTestState *who) { while (true) { - QDict *rsp, *rsp_return; + QDict *rsp_return; bool completed; const char *status; =20 - rsp =3D tpm_util_wait_command(who, "{ 'execute': 'query-migrate' }= "); - rsp_return =3D qdict_get_qdict(rsp, "return"); + qtest_qmp_send(who, "{ 'execute': 'query-migrate' }"); + rsp_return =3D qtest_qmp_receive_success(who, NULL, NULL); status =3D qdict_get_str(rsp_return, "status"); completed =3D strcmp(status, "completed") =3D=3D 0; g_assert_cmpstr(status, !=3D, "failed"); - qobject_unref(rsp); + qobject_unref(rsp_return); if (completed) { return; } --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532939933012236.86277693437546; Mon, 30 Jul 2018 01:38:53 -0700 (PDT) Received: from localhost ([::1]:51196 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3hY-0007NE-Lu for importer@patchew.org; Mon, 30 Jul 2018 04:38:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39420) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cL-0003P4-JE for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004Xj-Ba for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45082 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004Wk-5B for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 84E534219DB9; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 527D32156711; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B4A34113304E; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:10 +0200 Message-Id: <20180730083317.11765-17-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 16/23] migration-test: Make wait_command() cope with '%' X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org, "Dr . David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" wait_command() passes its argument @command to qtest_qmp_send(). Falls apart if @command contain '%'. Two ways to disarm this trap: suppress interpretation of '%' by passing @command as argument to format string "%s", or fix it by having wait_command() take the variable arguments to go with @command. Do the latter. This is another step towards compile-time format string checking without triggering -Wformat-nonliteral. Cc: Juan Quintela Cc: Dr. David Alan Gilbert Signed-off-by: Markus Armbruster Reviewed-by: Juan Quintela Reviewed-by: Eric Blake --- tests/migration-test.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/migration-test.c b/tests/migration-test.c index 860b8aa0b9..0c92f2b1cd 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -156,9 +156,14 @@ static void stop_cb(void *opaque, const char *name, QD= ict *data) /* * Events can get in the way of responses we are actually waiting for. */ -static QDict *wait_command(QTestState *who, const char *command) +static QDict *wait_command(QTestState *who, const char *command, ...) { - qtest_qmp_send(who, command); + va_list ap; + + va_start(ap, command); + qtest_qmp_vsend(who, command, ap); + va_end(ap); + return qtest_qmp_receive_success(who, stop_cb, NULL); } =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940107245539.957950432849; Mon, 30 Jul 2018 01:41:47 -0700 (PDT) Received: from localhost ([::1]:51214 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3kG-0001Sd-Hc for importer@patchew.org; Mon, 30 Jul 2018 04:41:36 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cL-0003P6-Lj for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004XS-Ac for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:41594 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004Wh-0c for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7E5F7402315B; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5354710F1C09; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id B81C71133056; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:11 +0200 Message-Id: <20180730083317.11765-18-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 17/23] migration-test: Clean up string interpolation into QMP, part 1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org, "Dr . David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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_recover() builds QMP input manually because wait_command() can't interpolate. Well, it can since the previous commit. Simplify accordingly. Bonus: gets rid of a non-literal format string. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Cc: Juan Quintela Cc: Dr. David Alan Gilbert Signed-off-by: Markus Armbruster Reviewed-by: Juan Quintela Reviewed-by: Eric Blake --- tests/migration-test.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/migration-test.c b/tests/migration-test.c index 0c92f2b1cd..323bb60535 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -156,6 +156,7 @@ static void stop_cb(void *opaque, const char *name, QDi= ct *data) /* * Events can get in the way of responses we are actually waiting for. */ +GCC_FMT_ATTR(2, 3) static QDict *wait_command(QTestState *who, const char *command, ...) { va_list ap; @@ -354,13 +355,12 @@ static void migrate_pause(QTestState *who) static void migrate_recover(QTestState *who, const char *uri) { QDict *rsp; - gchar *cmd =3D g_strdup_printf( - "{ 'execute': 'migrate-recover', " - " 'id': 'recover-cmd', " - " 'arguments': { 'uri': '%s' } }", uri); =20 - rsp =3D wait_command(who, cmd); - g_free(cmd); + rsp =3D wait_command(who, + "{ 'execute': 'migrate-recover', " + " 'id': 'recover-cmd', " + " 'arguments': { 'uri': %s } }", + uri); qobject_unref(rsp); } =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940263455529.5315967478638; Mon, 30 Jul 2018 01:44:23 -0700 (PDT) Received: from localhost ([::1]:51225 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3mw-0003ua-81 for importer@patchew.org; Mon, 30 Jul 2018 04:44:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39446) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cM-0003P8-4k for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004Xp-CQ for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:26 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51104 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004Wq-5i for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A2432CFB46; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 589C22026D68; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id BB935113305C; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:12 +0200 Message-Id: <20180730083317.11765-19-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 18/23] migration-test: Clean up string interpolation into QMP, part 2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org, "Dr . David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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 Cc: Dr. David Alan Gilbert Signed-off-by: Markus Armbruster Reviewed-by: Juan Quintela Reviewed-by: Eric Blake --- tests/migration-test.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/tests/migration-test.c b/tests/migration-test.c index 323bb60535..beccb6337e 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -14,6 +14,7 @@ =20 #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" @@ -381,16 +382,25 @@ static void migrate_set_capability(QTestState *who, c= onst char *capability, qobject_unref(rsp); } =20 -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; =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate'," - " 'arguments': { 'uri': '%s' %s } }", - uri, extra ? extra : ""); - rsp =3D qtest_qmp(who, cmd); - g_free(cmd); + va_start(ap, fmt); + args =3D qdict_from_vjsonf_nofail(fmt, ap); + va_end(ap); + + g_assert(!qdict_haskey(args, "uri")); + qdict_put_str(args, "uri", uri); + + rsp =3D qmp("{ 'execute': 'migrate', 'arguments': %p}", args); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); } @@ -582,7 +592,7 @@ static int migrate_postcopy_prepare(QTestState **from_p= tr, /* Wait for the first serial output from the source */ wait_for_serial("src_serial"); =20 - migrate(from, uri, NULL); + migrate(from, uri, "{}"); g_free(uri); =20 wait_for_migration_pass(from); @@ -665,7 +675,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); =20 /* Restore the postcopy bandwidth to unlimited */ @@ -684,7 +694,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 =3D migrate_query_status(from); g_assert(!strcmp(status, "setup") || !(strcmp(status, "failed"))); @@ -722,7 +732,7 @@ static void test_precopy_unix(void) /* Wait for the first serial output from the source */ wait_for_serial("src_serial"); =20 - migrate(from, uri, NULL); + migrate(from, uri, "{}"); =20 wait_for_migration_pass(from); =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940619027924.8835553496149; Mon, 30 Jul 2018 01:50:19 -0700 (PDT) Received: from localhost ([::1]:51263 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3sf-0000pW-QS for importer@patchew.org; Mon, 30 Jul 2018 04:50:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39457) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cM-0003PD-Jy for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cJ-0004YP-2b for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:26 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51112 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004XI-S8 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 241D2CFB54; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 65B5310F1C0D; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id BF36C113306B; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:13 +0200 Message-Id: <20180730083317.11765-20-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 19/23] migration-test: Clean up string interpolation into QMP, part 3 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org, "Dr . David Alan Gilbert" , Juan Quintela Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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)". migration-test.c interpolates strings into JSON in a few places: * migrate_set_parameter() interpolates string parameter @value as a JSON number. Change it to long long. This requires changing migrate_check_parameter() similarly. * migrate_set_capability() interpolates string parameter @value as a JSON boolean. Change it to bool. * deprecated_set_speed() interpolates string parameter @value as a JSON number. Change it to long long. Bonus: gets rid of non-literal format strings. A step towards compile-time format string checking without triggering -Wformat-nonliteral. Cc: Juan Quintela Cc: Dr. David Alan Gilbert Signed-off-by: Markus Armbruster Reviewed-by: Juan Quintela Reviewed-by: Eric Blake --- tests/migration-test.c | 74 +++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 45 deletions(-) diff --git a/tests/migration-test.c b/tests/migration-test.c index beccb6337e..48f81a0600 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -315,31 +315,25 @@ static void cleanup(const char *filename) } =20 static void migrate_check_parameter(QTestState *who, const char *parameter, - const char *value) + long long value) { QDict *rsp_return; - char *result; =20 rsp_return =3D wait_command(who, "{ 'execute': 'query-migrate-parameters' }"); - result =3D g_strdup_printf("%" PRId64, - qdict_get_try_int(rsp_return, parameter, -1)= ); - g_assert_cmpstr(result, =3D=3D, value); - g_free(result); + g_assert_cmpint(qdict_get_int(rsp_return, parameter), =3D=3D, value); qobject_unref(rsp_return); } =20 static void migrate_set_parameter(QTestState *who, const char *parameter, - const char *value) + long long value) { QDict *rsp; - gchar *cmd; =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate-set-parameters'," - "'arguments': { '%s': %s } }", - parameter, value); - rsp =3D qtest_qmp(who, cmd); - g_free(cmd); + rsp =3D qtest_qmp(who, + "{ 'execute': 'migrate-set-parameters'," + "'arguments': { %s: %lld } }", + parameter, value); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); migrate_check_parameter(who, parameter, value); @@ -366,18 +360,16 @@ static void migrate_recover(QTestState *who, const ch= ar *uri) } =20 static void migrate_set_capability(QTestState *who, const char *capability, - const char *value) + bool value) { QDict *rsp; - gchar *cmd; =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate-set-capabilities'," - "'arguments': { " - "'capabilities': [ { " - "'capability': '%s', 'state': %s } ] } }", - capability, value); - rsp =3D qtest_qmp(who, cmd); - g_free(cmd); + rsp =3D qtest_qmp(who, + "{ 'execute': 'migrate-set-capabilities'," + "'arguments': { " + "'capabilities': [ { " + "'capability': %s, 'state': %i } ] } }", + capability, value); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); } @@ -527,29 +519,21 @@ static void test_migrate_end(QTestState *from, QTestS= tate *to, bool test_dest) static void deprecated_set_downtime(QTestState *who, const double value) { QDict *rsp; - char *expected; - int64_t result_int; =20 rsp =3D qtest_qmp(who, "{ 'execute': 'migrate_set_downtime'," " 'arguments': { 'value': %f } }", value); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); - result_int =3D value * 1000L; - expected =3D g_strdup_printf("%" PRId64, result_int); - migrate_check_parameter(who, "downtime-limit", expected); - g_free(expected); + migrate_check_parameter(who, "downtime-limit", value * 1000); } =20 -static void deprecated_set_speed(QTestState *who, const char *value) +static void deprecated_set_speed(QTestState *who, long long value) { QDict *rsp; - gchar *cmd; =20 - cmd =3D g_strdup_printf("{ 'execute': 'migrate_set_speed'," - "'arguments': { 'value': %s } }", value); - rsp =3D qtest_qmp(who, cmd); - g_free(cmd); + rsp =3D qtest_qmp(who, "{ 'execute': 'migrate_set_speed'," + "'arguments': { 'value': %lld } }", value); g_assert(qdict_haskey(rsp, "return")); qobject_unref(rsp); migrate_check_parameter(who, "max-bandwidth", value); @@ -562,7 +546,7 @@ static void test_deprecated(void) from =3D qtest_start(""); =20 deprecated_set_downtime(from, 0.12345); - deprecated_set_speed(from, "12345"); + deprecated_set_speed(from, 12345); =20 qtest_quit(from); } @@ -578,16 +562,16 @@ static int migrate_postcopy_prepare(QTestState **from= _ptr, return -1; } =20 - migrate_set_capability(from, "postcopy-ram", "true"); - migrate_set_capability(to, "postcopy-ram", "true"); - migrate_set_capability(to, "postcopy-blocktime", "true"); + migrate_set_capability(from, "postcopy-ram", true); + migrate_set_capability(to, "postcopy-ram", true); + migrate_set_capability(to, "postcopy-blocktime", true); =20 /* We want to pick a speed slow enough that the test completes * quickly, but that it doesn't complete precopy even on a slow * machine, so also set the downtime. */ - migrate_set_parameter(from, "max-bandwidth", "100000000"); - migrate_set_parameter(from, "downtime-limit", "1"); + migrate_set_parameter(from, "max-bandwidth", 100000000); + migrate_set_parameter(from, "downtime-limit", 1); =20 /* Wait for the first serial output from the source */ wait_for_serial("src_serial"); @@ -638,7 +622,7 @@ static void test_postcopy_recovery(void) } =20 /* Turn postcopy speed down, 4K/s is slow enough on any machines */ - migrate_set_parameter(from, "max-postcopy-bandwidth", "4096"); + migrate_set_parameter(from, "max-postcopy-bandwidth", 4096); =20 /* Now we start the postcopy */ migrate_postcopy_start(from, to); @@ -679,7 +663,7 @@ static void test_postcopy_recovery(void) g_free(uri); =20 /* Restore the postcopy bandwidth to unlimited */ - migrate_set_parameter(from, "max-postcopy-bandwidth", "0"); + migrate_set_parameter(from, "max-postcopy-bandwidth", 0); =20 migrate_postcopy_complete(from, to); } @@ -725,9 +709,9 @@ static void test_precopy_unix(void) * machine, so also set the downtime. */ /* 1 ms should make it not converge*/ - migrate_set_parameter(from, "downtime-limit", "1"); + migrate_set_parameter(from, "downtime-limit", 1); /* 1GB/s */ - migrate_set_parameter(from, "max-bandwidth", "1000000000"); + migrate_set_parameter(from, "max-bandwidth", 1000000000); =20 /* Wait for the first serial output from the source */ wait_for_serial("src_serial"); @@ -737,7 +721,7 @@ static void test_precopy_unix(void) wait_for_migration_pass(from); =20 /* 300 ms should converge */ - migrate_set_parameter(from, "downtime-limit", "300"); + migrate_set_parameter(from, "downtime-limit", 300); =20 if (!got_stop) { qtest_qmp_eventwait(from, "STOP"); --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940447992538.8920912945816; Mon, 30 Jul 2018 01:47:27 -0700 (PDT) Received: from localhost ([::1]:51242 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3pk-0006bx-2X for importer@patchew.org; Mon, 30 Jul 2018 04:47:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39465) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cM-0003PM-NK for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cI-0004Xv-E4 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:26 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:41598 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004Ws-5o for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AAE28402316D; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6338F2027EA0; Mon, 30 Jul 2018 08:33:21 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C2C3C113306C; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:14 +0200 Message-Id: <20180730083317.11765-21-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:21 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 20/23] libqtest: Enable compile-time format string checking X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" qtest_qmp() & friends pass their format string and variable arguments to qobject_from_vjsonf_nofail(). Unlike qobject_from_jsonv(), they aren't decorated with GCC_FMT_ATTR(). Fix that to get compile-time format string checking. Signed-off-by: Markus Armbruster Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake --- tests/libqtest.h | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/tests/libqtest.h b/tests/libqtest.h index ee58fcdf6d..327e402da5 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -82,7 +82,8 @@ void qtest_quit(QTestState *s); * * Sends a QMP message to QEMU and consumes the response. */ -void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...); +void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); =20 /** * qtest_qmp: @@ -93,7 +94,8 @@ void qtest_qmp_discard_response(QTestState *s, const char= *fmt, ...); * * Sends a QMP message to QEMU and returns the response. */ -QDict *qtest_qmp(QTestState *s, const char *fmt, ...); +QDict *qtest_qmp(QTestState *s, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); =20 /** * qtest_qmp_send: @@ -104,7 +106,8 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...); * * Sends a QMP message to QEMU and leaves the response in the stream. */ -void qtest_qmp_send(QTestState *s, const char *fmt, ...); +void qtest_qmp_send(QTestState *s, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); =20 /** * qtest_qmpv_discard_response: @@ -116,7 +119,8 @@ void qtest_qmp_send(QTestState *s, const char *fmt, ...= ); * * Sends a QMP message to QEMU and consumes the response. */ -void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list a= p); +void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list a= p) + GCC_FMT_ATTR(2, 0); =20 /** * qtest_qmpv: @@ -128,7 +132,8 @@ void qtest_qmpv_discard_response(QTestState *s, const c= har *fmt, va_list ap); * * Sends a QMP message to QEMU and returns the response. */ -QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap); +QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap) + GCC_FMT_ATTR(2, 0); =20 /** * qtest_qmp_vsend: @@ -140,7 +145,8 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_li= st ap); * * Sends a QMP message to QEMU and leaves the response in the stream. */ -void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap); +void qtest_qmp_vsend(QTestState *s, const char *fmt, va_list ap) + GCC_FMT_ATTR(2, 0); =20 /** * qtest_receive: @@ -597,7 +603,7 @@ static inline void qtest_end(void) * * Sends a QMP message to QEMU and returns the response. */ -QDict *qmp(const char *fmt, ...); +QDict *qmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2); =20 /** * qmp_send: @@ -607,7 +613,7 @@ QDict *qmp(const char *fmt, ...); * * Sends a QMP message to QEMU and leaves the response in the stream. */ -void qmp_send(const char *fmt, ...); +void qmp_send(const char *fmt, ...) GCC_FMT_ATTR(1, 2); =20 /** * qmp_discard_response: @@ -617,7 +623,7 @@ void qmp_send(const char *fmt, ...); * * Sends a QMP message to QEMU and consumes the response. */ -void qmp_discard_response(const char *fmt, ...); +void qmp_discard_response(const char *fmt, ...) GCC_FMT_ATTR(1, 2); =20 /** * qmp_receive: @@ -976,10 +982,10 @@ static inline int64_t clock_set(int64_t val) } =20 QDict *qmp_fd_receive(int fd); -void qmp_fd_vsend(int fd, const char *fmt, va_list ap); -void qmp_fd_send(int fd, const char *fmt, ...); -QDict *qmp_fdv(int fd, const char *fmt, va_list ap); -QDict *qmp_fd(int fd, const char *fmt, ...); +void qmp_fd_vsend(int fd, const char *fmt, va_list ap) GCC_FMT_ATTR(2, 0); +void qmp_fd_send(int fd, const char *fmt, ...) GCC_FMT_ATTR(2, 3); +QDict *qmp_fdv(int fd, const char *fmt, va_list ap) GCC_FMT_ATTR(2, 0); +QDict *qmp_fd(int fd, const char *fmt, ...) GCC_FMT_ATTR(2, 3); =20 /** * qtest_cb_for_every_machine: --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940767607904.178833030852; Mon, 30 Jul 2018 01:52:47 -0700 (PDT) Received: from localhost ([::1]:51278 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3up-0002KK-Cu for importer@patchew.org; Mon, 30 Jul 2018 04:52:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39536) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cO-0003QD-Cy for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Zv-Ot for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45090 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Ye-In for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 230AE4021CC3; Mon, 30 Jul 2018 08:33:23 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1093710190; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C63BB113306F; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:15 +0200 Message-Id: <20180730083317.11765-22-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:23 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 30 Jul 2018 08:33:23 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 21/23] libqtest: Remove qtest_qmp_discard_response() & friends X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" qtest_qmp_discard_response(...) is shorthand for qobject_unref(qtest_qmp(...), except it's not actually shorter. Moreover, the presence of these functions encourage sloppy testing. Remove them. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/ahci-test.c | 20 +++++++++---------- tests/boot-order-test.c | 4 ++-- tests/drive_del-test.c | 4 ++-- tests/fdc-test.c | 11 ++++++----- tests/ide-test.c | 4 ++-- tests/libqtest.c | 27 +------------------------- tests/libqtest.h | 35 ---------------------------------- tests/migration-test.c | 2 +- tests/test-filter-mirror.c | 3 ++- tests/test-filter-redirector.c | 5 +++-- tests/virtio-blk-test.c | 19 +++++++++--------- 11 files changed, 39 insertions(+), 95 deletions(-) diff --git a/tests/ahci-test.c b/tests/ahci-test.c index 19a7ab1bca..4575c9f1a2 100644 --- a/tests/ahci-test.c +++ b/tests/ahci-test.c @@ -1596,8 +1596,8 @@ static void test_atapi_tray(void) rsp =3D qmp_receive(); qobject_unref(rsp); =20 - qmp_discard_response("{'execute': 'blockdev-remove-medium', " - "'arguments': {'id': 'cd0'}}"); + qobject_unref(qmp("{'execute': 'blockdev-remove-medium', " + "'arguments': {'id': 'cd0'}}")); =20 /* Test the tray without a medium */ ahci_atapi_load(ahci, port); @@ -1607,14 +1607,14 @@ static void test_atapi_tray(void) atapi_wait_tray(true); =20 /* Re-insert media */ - qmp_discard_response("{'execute': 'blockdev-add', " - "'arguments': {'node-name': 'node0', " - "'driver': 'raw', " - "'file': { 'driver': 'file', " - "'filename': %s }}}", is= o); - qmp_discard_response("{'execute': 'blockdev-insert-medium'," - "'arguments': { 'id': 'cd0', " - "'node-name': 'node0' }}"); + qobject_unref(qmp("{'execute': 'blockdev-add', " + "'arguments': {'node-name': 'node0', " + "'driver': 'raw', " + "'file': { 'driver': 'file', " + "'filename': %s }}}", iso)); + qobject_unref(qmp("{'execute': 'blockdev-insert-medium'," + "'arguments': { 'id': 'cd0', " + "'node-name': 'node0' }}")); =20 /* Again, the event shows up first */ qmp_send("{'execute': 'blockdev-close-tray'," diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c index e70f5dedba..2ec86c0ee2 100644 --- a/tests/boot-order-test.c +++ b/tests/boot-order-test.c @@ -13,7 +13,7 @@ #include "qemu/osdep.h" #include "libqos/fw_cfg.h" #include "libqtest.h" - +#include "qapi/qmp/qdict.h" #include "hw/nvram/fw_cfg_keys.h" =20 typedef struct { @@ -36,7 +36,7 @@ static void test_a_boot_order(const char *machine, test_args); actual =3D read_boot_order(); g_assert_cmphex(actual, =3D=3D, expected_boot); - qmp_discard_response("{ 'execute': 'system_reset' }"); + qobject_unref(qmp("{ 'execute': 'system_reset' }")); /* * system_reset only requests reset. We get a RESET event after * the actual reset completes. Need to wait for that. diff --git a/tests/drive_del-test.c b/tests/drive_del-test.c index 852fefc8f3..92489be0ba 100644 --- a/tests/drive_del-test.c +++ b/tests/drive_del-test.c @@ -36,8 +36,8 @@ static void device_del(void) QDict *response; =20 /* Complication: ignore DEVICE_DELETED event */ - qmp_discard_response("{'execute': 'device_del'," - " 'arguments': { 'id': 'dev0' } }"); + qobject_unref(qmp("{'execute': 'device_del'," + " 'arguments': { 'id': 'dev0' } }")); response =3D qmp_receive(); g_assert(response); g_assert(qdict_haskey(response, "return")); diff --git a/tests/fdc-test.c b/tests/fdc-test.c index 325712e0f2..d30d261921 100644 --- a/tests/fdc-test.c +++ b/tests/fdc-test.c @@ -26,6 +26,7 @@ =20 =20 #include "libqtest.h" +#include "qapi/qmp/qdict.h" #include "qemu-common.h" =20 #define TEST_IMAGE_SIZE 1440 * 1024 @@ -298,9 +299,9 @@ static void test_media_insert(void) =20 /* Insert media in drive. DSKCHK should not be reset until a step pulse * is sent. */ - qmp_discard_response("{'execute':'blockdev-change-medium', 'arguments'= :{" - " 'id':'floppy0', 'filename': %s, 'format': 'raw'= }}", - test_image); + qobject_unref(qmp("{'execute':'blockdev-change-medium', 'arguments':{" + " 'id':'floppy0', 'filename': %s, 'format': 'raw' }}= ", + test_image)); =20 dir =3D inb(FLOPPY_BASE + reg_dir); assert_bit_set(dir, DSKCHG); @@ -329,8 +330,8 @@ static void test_media_change(void) =20 /* Eject the floppy and check that DSKCHG is set. Reading it out doesn= 't * reset the bit. */ - qmp_discard_response("{'execute':'eject', 'arguments':{" - " 'id':'floppy0' }}"); + qobject_unref(qmp("{'execute':'eject', 'arguments':{" + " 'id':'floppy0' }}")); =20 dir =3D inb(FLOPPY_BASE + reg_dir); assert_bit_set(dir, DSKCHG); diff --git a/tests/ide-test.c b/tests/ide-test.c index 834ee9005b..48bb0e6519 100644 --- a/tests/ide-test.c +++ b/tests/ide-test.c @@ -29,7 +29,7 @@ #include "libqos/libqos.h" #include "libqos/pci-pc.h" #include "libqos/malloc-pc.h" - +#include "qapi/qmp/qdict.h" #include "qemu-common.h" #include "qemu/bswap.h" #include "hw/pci/pci_ids.h" @@ -721,7 +721,7 @@ static void test_retry_flush(const char *machine) qmp_eventwait("STOP"); =20 /* Complete the command */ - qmp_discard_response("{'execute':'cont' }"); + qobject_unref(qmp("{'execute':'cont' }")); =20 /* Check registers */ data =3D qpci_io_readb(dev, ide_bar, reg_device); diff --git a/tests/libqtest.c b/tests/libqtest.c index ed832cd8e6..2f81bc6382 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -254,7 +254,7 @@ QTestState *qtest_init(const char *extra_args) /* Read the QMP greeting and then do the handshake */ greeting =3D qtest_qmp_receive(s); qobject_unref(greeting); - qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }"); + qobject_unref(qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }")); =20 return s; } @@ -587,23 +587,6 @@ void qtest_qmp_send(QTestState *s, const char *fmt, ..= .) va_end(ap); } =20 -void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list a= p) -{ - QDict *response =3D qtest_qmpv(s, fmt, ap); - qobject_unref(response); -} - -void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...) -{ - va_list ap; - QDict *response; - - va_start(ap, fmt); - response =3D qtest_qmpv(s, fmt, ap); - va_end(ap); - qobject_unref(response); -} - QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event) { QDict *response; @@ -975,14 +958,6 @@ void qmp_send(const char *fmt, ...) va_end(ap); } =20 -void qmp_discard_response(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - qtest_qmpv_discard_response(global_qtest, fmt, ap); - va_end(ap); -} char *hmp(const char *fmt, ...) { va_list ap; diff --git a/tests/libqtest.h b/tests/libqtest.h index 327e402da5..58dea82c76 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -73,18 +73,6 @@ QTestState *qtest_init_without_qmp_handshake(bool use_oo= b, */ void qtest_quit(QTestState *s); =20 -/** - * qtest_qmp_discard_response: - * @s: #QTestState instance to operate on. - * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf_nofail(). - * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). - * - * Sends a QMP message to QEMU and consumes the response. - */ -void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...) - GCC_FMT_ATTR(2, 3); - /** * qtest_qmp: * @s: #QTestState instance to operate on. @@ -109,19 +97,6 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...) void qtest_qmp_send(QTestState *s, const char *fmt, ...) GCC_FMT_ATTR(2, 3); =20 -/** - * qtest_qmpv_discard_response: - * @s: #QTestState instance to operate on. - * @fmt: QMP message to send to QEMU, formatted like - * qobject_from_jsonf_nofail(). - * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). - * @ap: QMP message arguments - * - * Sends a QMP message to QEMU and consumes the response. - */ -void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list a= p) - GCC_FMT_ATTR(2, 0); - /** * qtest_qmpv: * @s: #QTestState instance to operate on. @@ -615,16 +590,6 @@ QDict *qmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2); */ void qmp_send(const char *fmt, ...) GCC_FMT_ATTR(1, 2); =20 -/** - * qmp_discard_response: - * @fmt...: QMP message to send to qemu, formatted like - * qobject_from_jsonf_nofail(). - * Only understands '%((l|ll|I64)?d|[ipsf])', see parse_escape(). - * - * Sends a QMP message to QEMU and consumes the response. - */ -void qmp_discard_response(const char *fmt, ...) GCC_FMT_ATTR(1, 2); - /** * qmp_receive: * diff --git a/tests/migration-test.c b/tests/migration-test.c index 48f81a0600..5755994e30 100644 --- a/tests/migration-test.c +++ b/tests/migration-test.c @@ -497,7 +497,7 @@ static void test_migrate_end(QTestState *from, QTestSta= te *to, bool test_dest) usleep(1000 * 10); } while (dest_byte_a =3D=3D dest_byte_b); =20 - qtest_qmp_discard_response(to, "{ 'execute' : 'stop'}"); + qobject_unref(qtest_qmp(to, "{ 'execute' : 'stop'}")); =20 /* With it stopped, check nothing changes */ qtest_memread(to, start_address, &dest_byte_c, 1); diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c index 6c6f710dc6..1ab4759b80 100644 --- a/tests/test-filter-mirror.c +++ b/tests/test-filter-mirror.c @@ -10,6 +10,7 @@ =20 #include "qemu/osdep.h" #include "libqtest.h" +#include "qapi/qmp/qdict.h" #include "qemu/iov.h" #include "qemu/sockets.h" #include "qemu/error-report.h" @@ -57,7 +58,7 @@ static void test_mirror(void) }; =20 /* send a qmp command to guarantee that 'connected' is setting to true= . */ - qmp_discard_response("{ 'execute' : 'query-status'}"); + qobject_unref(qmp("{ 'execute' : 'query-status'}")); ret =3D iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_b= uf)); g_assert_cmpint(ret, =3D=3D, sizeof(send_buf) + sizeof(size)); close(send_sock[0]); diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c index fbaf19bbd8..5b6c594867 100644 --- a/tests/test-filter-redirector.c +++ b/tests/test-filter-redirector.c @@ -52,6 +52,7 @@ =20 #include "qemu/osdep.h" #include "libqtest.h" +#include "qapi/qmp/qdict.h" #include "qemu/iov.h" #include "qemu/sockets.h" #include "qemu/error-report.h" @@ -104,7 +105,7 @@ static void test_redirector_tx(void) g_assert_cmpint(recv_sock, !=3D, -1); =20 /* send a qmp command to guarantee that 'connected' is setting to true= . */ - qmp_discard_response("{ 'execute' : 'query-status'}"); + qobject_unref(qmp("{ 'execute' : 'query-status'}")); =20 struct iovec iov[] =3D { { @@ -182,7 +183,7 @@ static void test_redirector_rx(void) send_sock =3D unix_connect(sock_path1, NULL); g_assert_cmpint(send_sock, !=3D, -1); /* send a qmp command to guarantee that 'connected' is setting to true= . */ - qmp_discard_response("{ 'execute' : 'query-status'}"); + qobject_unref(qmp("{ 'execute' : 'query-status'}")); =20 ret =3D iov_send(send_sock, iov, 2, 0, sizeof(size) + sizeof(send_buf)= ); g_assert_cmpint(ret, =3D=3D, sizeof(send_buf) + sizeof(size)); diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index d96b4c69e1..5955bf6d57 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -16,6 +16,7 @@ #include "libqos/virtio-pci.h" #include "libqos/virtio-mmio.h" #include "libqos/malloc-generic.h" +#include "qapi/qmp/qdict.h" #include "qemu/bswap.h" #include "standard-headers/linux/virtio_ids.h" #include "standard-headers/linux/virtio_config.h" @@ -409,9 +410,9 @@ static void pci_config(void) =20 qvirtio_set_driver_ok(&dev->vdev); =20 - qmp_discard_response("{ 'execute': 'block_resize', " - " 'arguments': { 'device': 'drive0', " - " 'size': %d } }", n_size); + qobject_unref(qmp("{ 'execute': 'block_resize', " + " 'arguments': { 'device': 'drive0', " + " 'size': %d } }", n_size)); qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US); =20 capacity =3D qvirtio_config_readq(&dev->vdev, 0); @@ -459,9 +460,9 @@ static void pci_msix(void) =20 qvirtio_set_driver_ok(&dev->vdev); =20 - qmp_discard_response("{ 'execute': 'block_resize', " - " 'arguments': { 'device': 'drive0', " - " 'size': %d } }", n_size); + qobject_unref(qmp("{ 'execute': 'block_resize', " + " 'arguments': { 'device': 'drive0', " + " 'size': %d } }", n_size)); =20 qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US); =20 @@ -725,9 +726,9 @@ static void mmio_basic(void) =20 test_basic(&dev->vdev, alloc, vq); =20 - qmp_discard_response("{ 'execute': 'block_resize', " - " 'arguments': { 'device': 'drive0', " - " 'size': %d } }", n_size); + qobject_unref(qmp("{ 'execute': 'block_resize', " + " 'arguments': { 'device': 'drive0', " + " 'size': %d } }", n_size)); =20 qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US); =20 --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1532940454257608.1570049839753; Mon, 30 Jul 2018 01:47:34 -0700 (PDT) Received: from localhost ([::1]:51245 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3py-0006mO-RW for importer@patchew.org; Mon, 30 Jul 2018 04:47:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39552) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cO-0003Qr-TQ for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Zg-CM for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:41606 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cJ-0004Y7-57 for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:23 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7E14A402315B; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1452F2156701; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id C9BAB1133070; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:16 +0200 Message-Id: <20180730083317.11765-23-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 22/23] libqtest: Replace qtest_startf() by qtest_initf() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" qtest_init() creates a new QTestState, and leaves @global_qtest alone. qtest_start() additionally assigns it to @global_qtest, but qtest_startf() additionally assigns NULL to @global_qtest. This makes no sense. Replace it by qtest_initf() that works like qtest_init(), i.e. leaves @global_qtest alone. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/boot-order-test.c | 8 ++++---- tests/boot-serial-test.c | 10 +++++----- tests/cdrom-test.c | 6 +++--- tests/endianness-test.c | 24 ++++++++++++------------ tests/ipmi-bt-test.c | 2 +- tests/libqtest.c | 9 ++++----- tests/libqtest.h | 17 ++++++++--------- tests/m25p80-test.c | 6 +++--- tests/m48t59-test.c | 2 +- tests/machine-none-test.c | 2 +- tests/numa-test.c | 4 ++-- tests/pnv-xscom-test.c | 8 ++++---- tests/prom-env-test.c | 10 +++++----- tests/qmp-test.c | 2 +- tests/sdhci-test.c | 6 +++--- tests/tco-test.c | 6 +++--- tests/test-filter-mirror.c | 2 +- tests/test-filter-redirector.c | 4 ++-- tests/virtio-balloon-test.c | 4 ++-- tests/virtio-blk-test.c | 8 ++++---- tests/virtio-console-test.c | 12 ++++++------ tests/virtio-serial-test.c | 4 ++-- tests/vmgenid-test.c | 6 +++--- 23 files changed, 80 insertions(+), 82 deletions(-) diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c index 2ec86c0ee2..bf0702945b 100644 --- a/tests/boot-order-test.c +++ b/tests/boot-order-test.c @@ -30,10 +30,10 @@ static void test_a_boot_order(const char *machine, { uint64_t actual; =20 - global_qtest =3D qtest_startf("-nodefaults%s%s %s", - machine ? " -M " : "", - machine ?: "", - test_args); + global_qtest =3D qtest_initf("-nodefaults%s%s %s", + machine ? " -M " : "", + machine ?: "", + test_args); actual =3D read_boot_order(); g_assert_cmphex(actual, =3D=3D, expected_boot); qobject_unref(qmp("{ 'execute': 'system_reset' }")); diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c index 952a2e7ead..1355df924d 100644 --- a/tests/boot-serial-test.c +++ b/tests/boot-serial-test.c @@ -172,11 +172,11 @@ static void test_machine(const void *data) * Make sure that this test uses tcg if available: It is used as a * fast-enough smoketest for that. */ - global_qtest =3D qtest_startf("%s %s -M %s,accel=3Dtcg:kvm " - "-chardev file,id=3Dserial0,path=3D%s " - "-no-shutdown -serial chardev:serial0 %s", - codeparam, code ? codetmp : "", - test->machine, serialtmp, test->extra); + global_qtest =3D qtest_initf("%s %s -M %s,accel=3Dtcg:kvm " + "-chardev file,id=3Dserial0,path=3D%s " + "-no-shutdown -serial chardev:serial0 %s", + codeparam, code ? codetmp : "", + test->machine, serialtmp, test->extra); if (code) { unlink(codetmp); } diff --git a/tests/cdrom-test.c b/tests/cdrom-test.c index 7a1fce5dfb..9b43dc9ab4 100644 --- a/tests/cdrom-test.c +++ b/tests/cdrom-test.c @@ -99,7 +99,7 @@ static void test_cdrom_param(gconstpointer data) QTestState *qts; char *resp; =20 - qts =3D qtest_startf("-M %s -cdrom %s", (const char *)data, isoimage); + qts =3D qtest_initf("-M %s -cdrom %s", (const char *)data, isoimage); resp =3D qtest_hmp(qts, "info block"); g_assert(strstr(resp, isoimage) !=3D 0); g_free(resp); @@ -120,8 +120,8 @@ static void test_cdboot(gconstpointer data) { QTestState *qts; =20 - qts =3D qtest_startf("-accel kvm:tcg -no-shutdown %s%s", (const char *= )data, - isoimage); + qts =3D qtest_initf("-accel kvm:tcg -no-shutdown %s%s", (const char *)= data, + isoimage); boot_sector_test(qts); qtest_quit(qts); } diff --git a/tests/endianness-test.c b/tests/endianness-test.c index 546e0969e4..48680cd131 100644 --- a/tests/endianness-test.c +++ b/tests/endianness-test.c @@ -115,10 +115,10 @@ static void test_endianness(gconstpointer data) { const TestCase *test =3D data; =20 - global_qtest =3D qtest_startf("-M %s%s%s -device pc-testdev", - test->machine, - test->superio ? " -device " : "", - test->superio ?: ""); + global_qtest =3D qtest_initf("-M %s%s%s -device pc-testdev", + test->machine, + test->superio ? " -device " : "", + test->superio ?: ""); isa_outl(test, 0xe0, 0x87654321); g_assert_cmphex(isa_inl(test, 0xe0), =3D=3D, 0x87654321); g_assert_cmphex(isa_inw(test, 0xe2), =3D=3D, 0x8765); @@ -187,10 +187,10 @@ static void test_endianness_split(gconstpointer data) { const TestCase *test =3D data; =20 - global_qtest =3D qtest_startf("-M %s%s%s -device pc-testdev", - test->machine, - test->superio ? " -device " : "", - test->superio ?: ""); + global_qtest =3D qtest_initf("-M %s%s%s -device pc-testdev", + test->machine, + test->superio ? " -device " : "", + test->superio ?: ""); isa_outl(test, 0xe8, 0x87654321); g_assert_cmphex(isa_inl(test, 0xe0), =3D=3D, 0x87654321); g_assert_cmphex(isa_inw(test, 0xe2), =3D=3D, 0x8765); @@ -231,10 +231,10 @@ static void test_endianness_combine(gconstpointer dat= a) { const TestCase *test =3D data; =20 - global_qtest =3D qtest_startf("-M %s%s%s -device pc-testdev", - test->machine, - test->superio ? " -device " : "", - test->superio ?: ""); + global_qtest =3D qtest_initf("-M %s%s%s -device pc-testdev", + test->machine, + test->superio ? " -device " : "", + test->superio ?: ""); isa_outl(test, 0xe0, 0x87654321); g_assert_cmphex(isa_inl(test, 0xe8), =3D=3D, 0x87654321); g_assert_cmphex(isa_inw(test, 0xea), =3D=3D, 0x8765); diff --git a/tests/ipmi-bt-test.c b/tests/ipmi-bt-test.c index 8be18e3f42..f4a81b5265 100644 --- a/tests/ipmi-bt-test.c +++ b/tests/ipmi-bt-test.c @@ -414,7 +414,7 @@ int main(int argc, char **argv) /* Run the tests */ g_test_init(&argc, &argv, NULL); =20 - global_qtest =3D qtest_startf( + global_qtest =3D qtest_initf( " -chardev socket,id=3Dipmi0,host=3Dlocalhost,port=3D%d,reconnect= =3D10" " -device ipmi-bmc-extern,chardev=3Dipmi0,id=3Dbmc0" " -device isa-ipmi-bt,bmc=3Dbmc0", emu_port); diff --git a/tests/libqtest.c b/tests/libqtest.c index 2f81bc6382..a0d44793fa 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -259,24 +259,23 @@ QTestState *qtest_init(const char *extra_args) return s; } =20 -QTestState *qtest_vstartf(const char *fmt, va_list ap) +QTestState *qtest_vinitf(const char *fmt, va_list ap) { char *args =3D g_strdup_vprintf(fmt, ap); QTestState *s; =20 - s =3D qtest_start(args); + s =3D qtest_init(args); g_free(args); - global_qtest =3D NULL; return s; } =20 -QTestState *qtest_startf(const char *fmt, ...) +QTestState *qtest_initf(const char *fmt, ...) { va_list ap; QTestState *s; =20 va_start(ap, fmt); - s =3D qtest_vstartf(fmt, ap); + s =3D qtest_vinitf(fmt, ap); va_end(ap); return s; } diff --git a/tests/libqtest.h b/tests/libqtest.h index 58dea82c76..3848086928 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -22,33 +22,32 @@ typedef struct QTestState QTestState; extern QTestState *global_qtest; =20 /** - * qtest_startf: + * qtest_initf: * @fmt...: Format for creating other arguments to pass to QEMU, formatted * like sprintf(). * - * Start QEMU and return the resulting #QTestState (but unlike qtest_start= (), - * #global_qtest is left at NULL). + * Convenience wrapper around qtest_start(). * * Returns: #QTestState instance. */ -QTestState *qtest_startf(const char *fmt, ...) GCC_FMT_ATTR(1, 2); +QTestState *qtest_initf(const char *fmt, ...) GCC_FMT_ATTR(1, 2); =20 /** - * qtest_vstartf: + * qtest_vinitf: * @fmt: Format for creating other arguments to pass to QEMU, formatted * like vsprintf(). * @ap: Format arguments. * - * Start QEMU and return the resulting #QTestState (but unlike qtest_start= (), - * #global_qtest is left at NULL). + * Convenience wrapper around qtest_start(). * * Returns: #QTestState instance. */ -QTestState *qtest_vstartf(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0); +QTestState *qtest_vinitf(const char *fmt, va_list ap) GCC_FMT_ATTR(1, 0); =20 /** * qtest_init: - * @extra_args: other arguments to pass to QEMU. + * @extra_args: other arguments to pass to QEMU. CAUTION: these + * arguments are subject to word splitting and shell evaluation. * * Returns: #QTestState instance. */ diff --git a/tests/m25p80-test.c b/tests/m25p80-test.c index c276e738e9..055f7246a8 100644 --- a/tests/m25p80-test.c +++ b/tests/m25p80-test.c @@ -363,9 +363,9 @@ int main(int argc, char **argv) g_assert(ret =3D=3D 0); close(fd); =20 - global_qtest =3D qtest_startf("-m 256 -machine palmetto-bmc " - "-drive file=3D%s,format=3Draw,if=3Dmtd", - tmp_path); + global_qtest =3D qtest_initf("-m 256 -machine palmetto-bmc " + "-drive file=3D%s,format=3Draw,if=3Dmtd", + tmp_path); =20 qtest_add_func("/m25p80/read_jedec", test_read_jedec); qtest_add_func("/m25p80/erase_sector", test_erase_sector); diff --git a/tests/m48t59-test.c b/tests/m48t59-test.c index 5b695971c7..4abf9c605c 100644 --- a/tests/m48t59-test.c +++ b/tests/m48t59-test.c @@ -146,7 +146,7 @@ static void cmos_get_date_time(QTestState *s, struct tm= *date) =20 static QTestState *m48t59_qtest_start(void) { - return qtest_startf("-M %s -rtc clock=3Dvm", base_machine); + return qtest_initf("-M %s -rtc clock=3Dvm", base_machine); } =20 static void bcd_check_time(void) diff --git a/tests/machine-none-test.c b/tests/machine-none-test.c index f286557b3e..7e72466354 100644 --- a/tests/machine-none-test.c +++ b/tests/machine-none-test.c @@ -84,7 +84,7 @@ static void test_machine_cpu_cli(void) } return; /* TODO: die here to force all targets have a test */ } - global_qtest =3D qtest_startf("-machine none -cpu '%s'", cpu_model); + global_qtest =3D qtest_initf("-machine none -cpu '%s'", cpu_model); =20 response =3D qmp("{ 'execute': 'quit' }"); g_assert(qdict_haskey(response, "return")); diff --git a/tests/numa-test.c b/tests/numa-test.c index 893f826acb..9824fdd587 100644 --- a/tests/numa-test.c +++ b/tests/numa-test.c @@ -267,8 +267,8 @@ static void pc_dynamic_cpu_cfg(const void *data) QList *cpus; QTestState *qs; =20 - qs =3D qtest_startf("%s %s", data ? (char *)data : "", - "-nodefaults --preconfig -smp 2"); + qs =3D qtest_initf("%s -nodefaults --preconfig -smp 2", + data ? (char *)data : ""); =20 /* create 2 numa nodes */ g_assert(!qmp_rsp_is_err(qtest_qmp(qs, "{ 'execute': 'set-numa-node'," diff --git a/tests/pnv-xscom-test.c b/tests/pnv-xscom-test.c index efb7c838b5..70f4c84d1b 100644 --- a/tests/pnv-xscom-test.c +++ b/tests/pnv-xscom-test.c @@ -79,8 +79,8 @@ static void test_cfam_id(const void *data) { const PnvChip *chip =3D data; =20 - global_qtest =3D qtest_startf("-M powernv,accel=3Dtcg -cpu %s", - chip->cpu_model); + global_qtest =3D qtest_initf("-M powernv,accel=3Dtcg -cpu %s", + chip->cpu_model); test_xscom_cfam_id(chip); qtest_quit(global_qtest); } @@ -114,8 +114,8 @@ static void test_core(const void *data) { const PnvChip *chip =3D data; =20 - global_qtest =3D qtest_startf("-M powernv,accel=3Dtcg -cpu %s", - chip->cpu_model); + global_qtest =3D qtest_initf("-M powernv,accel=3Dtcg -cpu %s", + chip->cpu_model); test_xscom_core(chip); qtest_quit(global_qtest); } diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c index 8c867e631a..198d007f1b 100644 --- a/tests/prom-env-test.c +++ b/tests/prom-env-test.c @@ -49,11 +49,11 @@ static void test_machine(const void *machine) /* The pseries firmware boots much faster without the default devices = */ extra_args =3D strcmp(machine, "pseries") =3D=3D 0 ? "-nodefaults" : "= "; =20 - global_qtest =3D qtest_startf("-M %s,accel=3Dtcg %s " - "-prom-env 'use-nvramrc?=3Dtrue' " - "-prom-env 'nvramrc=3D%x %x l!' ", - (const char *)machine, extra_args, - MAGIC, ADDRESS); + global_qtest =3D qtest_initf("-M %s,accel=3Dtcg %s " + "-prom-env 'use-nvramrc?=3Dtrue' " + "-prom-env 'nvramrc=3D%x %x l!' ", + (const char *)machine, extra_args, + MAGIC, ADDRESS); check_guest_memory(); qtest_quit(global_qtest); } diff --git a/tests/qmp-test.c b/tests/qmp-test.c index 5eb15daebc..487ef946ed 100644 --- a/tests/qmp-test.c +++ b/tests/qmp-test.c @@ -436,7 +436,7 @@ static void add_query_tests(QmpSchema *schema) static void test_qmp_preconfig(void) { QDict *rsp, *ret; - QTestState *qs =3D qtest_startf("%s --preconfig", common_args); + QTestState *qs =3D qtest_initf("%s --preconfig", common_args); =20 /* preconfig state */ /* enabled commands, no error expected */ diff --git a/tests/sdhci-test.c b/tests/sdhci-test.c index 1d825eb010..982f5ebbb2 100644 --- a/tests/sdhci-test.c +++ b/tests/sdhci-test.c @@ -184,8 +184,8 @@ static QSDHCI *machine_start(const struct sdhci_t *test) uint16_t vendor_id, device_id; uint64_t barsize; =20 - global_qtest =3D qtest_startf("-machine %s -device sdhci-pci", - test->machine); + global_qtest =3D qtest_initf("-machine %s -device sdhci-pci", + test->machine); =20 s->pci.bus =3D qpci_init_pc(global_qtest, NULL); =20 @@ -200,7 +200,7 @@ static QSDHCI *machine_start(const struct sdhci_t *test) qpci_device_enable(s->pci.dev); } else { /* SysBus */ - global_qtest =3D qtest_startf("-machine %s", test->machine); + global_qtest =3D qtest_initf("-machine %s", test->machine); s->addr =3D test->sdhci.addr; } =20 diff --git a/tests/tco-test.c b/tests/tco-test.c index 9945fb8469..6bee9a37d3 100644 --- a/tests/tco-test.c +++ b/tests/tco-test.c @@ -58,9 +58,9 @@ static void test_init(TestData *d) { QTestState *qs; =20 - qs =3D qtest_startf("-machine q35 %s %s", - d->noreboot ? "" : "-global ICH9-LPC.noreboot=3Dfals= e", - !d->args ? "" : d->args); + qs =3D qtest_initf("-machine q35 %s %s", + d->noreboot ? "" : "-global ICH9-LPC.noreboot=3Dfalse= ", + !d->args ? "" : d->args); global_qtest =3D qs; qtest_irq_intercept_in(qs, "ioapic"); =20 diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c index 1ab4759b80..1d66b5dbb0 100644 --- a/tests/test-filter-mirror.c +++ b/tests/test-filter-mirror.c @@ -37,7 +37,7 @@ static void test_mirror(void) ret =3D mkstemp(sock_path); g_assert_cmpint(ret, !=3D, -1); =20 - global_qtest =3D qtest_startf( + global_qtest =3D qtest_initf( "-netdev socket,id=3Dqtest-bn0,fd=3D%d " "-device %s,netdev=3Dqtest-bn0,id=3Dqtest-e0 " "-chardev socket,id=3Dmirror0,path=3D%s,server,nowait " diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c index 5b6c594867..934ddee427 100644 --- a/tests/test-filter-redirector.c +++ b/tests/test-filter-redirector.c @@ -87,7 +87,7 @@ static void test_redirector_tx(void) ret =3D mkstemp(sock_path1); g_assert_cmpint(ret, !=3D, -1); =20 - global_qtest =3D qtest_startf( + global_qtest =3D qtest_initf( "-netdev socket,id=3Dqtest-bn0,fd=3D%d " "-device %s,netdev=3Dqtest-bn0,id=3Dqtest-e0 " "-chardev socket,id=3Dredirector0,path=3D%s,server,nowait " @@ -156,7 +156,7 @@ static void test_redirector_rx(void) ret =3D mkstemp(sock_path1); g_assert_cmpint(ret, !=3D, -1); =20 - global_qtest =3D qtest_startf( + global_qtest =3D qtest_initf( "-netdev socket,id=3Dqtest-bn0,fd=3D%d " "-device %s,netdev=3Dqtest-bn0,id=3Dqtest-e0 " "-chardev socket,id=3Dredirector0,path=3D%s,server,nowait " diff --git a/tests/virtio-balloon-test.c b/tests/virtio-balloon-test.c index 0a07e036bb..5a1d0ccbb7 100644 --- a/tests/virtio-balloon-test.c +++ b/tests/virtio-balloon-test.c @@ -23,8 +23,8 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); qtest_add_func("/virtio/balloon/nop", balloon_nop); =20 - global_qtest =3D qtest_startf("-device virtio-balloon-%s", - qvirtio_get_dev_type()); + global_qtest =3D qtest_initf("-device virtio-balloon-%s", + qvirtio_get_dev_type()); ret =3D g_test_run(); =20 qtest_end(); diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c index 5955bf6d57..d9893516bb 100644 --- a/tests/virtio-blk-test.c +++ b/tests/virtio-blk-test.c @@ -90,10 +90,10 @@ static void arm_test_start(void) =20 tmp_path =3D drive_create(); =20 - global_qtest =3D qtest_startf("-machine virt " - "-drive if=3Dnone,id=3Ddrive0,file=3D%s,fo= rmat=3Draw " - "-device virtio-blk-device,drive=3Ddrive0", - tmp_path); + global_qtest =3D qtest_initf("-machine virt " + "-drive if=3Dnone,id=3Ddrive0,file=3D%s,for= mat=3Draw " + "-device virtio-blk-device,drive=3Ddrive0", + tmp_path); unlink(tmp_path); g_free(tmp_path); } diff --git a/tests/virtio-console-test.c b/tests/virtio-console-test.c index 945bae5a15..a7c6f167c3 100644 --- a/tests/virtio-console-test.c +++ b/tests/virtio-console-test.c @@ -14,17 +14,17 @@ /* Tests only initialization so far. TODO: Replace with functional tests */ static void console_nop(void) { - global_qtest =3D qtest_startf("-device virtio-serial-%s,id=3Dvser0 " - "-device virtconsole,bus=3Dvser0.0", - qvirtio_get_dev_type()); + global_qtest =3D qtest_initf("-device virtio-serial-%s,id=3Dvser0 " + "-device virtconsole,bus=3Dvser0.0", + qvirtio_get_dev_type()); qtest_end(); } =20 static void serialport_nop(void) { - global_qtest =3D qtest_startf("-device virtio-serial-%s,id=3Dvser0 " - "-device virtserialport,bus=3Dvser0.0", - qvirtio_get_dev_type()); + global_qtest =3D qtest_initf("-device virtio-serial-%s,id=3Dvser0 " + "-device virtserialport,bus=3Dvser0.0", + qvirtio_get_dev_type()); qtest_end(); } =20 diff --git a/tests/virtio-serial-test.c b/tests/virtio-serial-test.c index e4b18b1c8a..8da9980a24 100644 --- a/tests/virtio-serial-test.c +++ b/tests/virtio-serial-test.c @@ -31,8 +31,8 @@ int main(int argc, char **argv) qtest_add_func("/virtio/serial/nop", virtio_serial_nop); qtest_add_func("/virtio/serial/hotplug", hotplug); =20 - global_qtest =3D qtest_startf("-device virtio-serial-%s", - qvirtio_get_dev_type()); + global_qtest =3D qtest_initf("-device virtio-serial-%s", + qvirtio_get_dev_type()); ret =3D g_test_run(); =20 qtest_end(); diff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c index 8d915c610c..0a6fb55f2e 100644 --- a/tests/vmgenid-test.c +++ b/tests/vmgenid-test.c @@ -142,7 +142,7 @@ static void vmgenid_set_guid_test(void) =20 g_assert(qemu_uuid_parse(VGID_GUID, &expected) =3D=3D 0); =20 - global_qtest =3D qtest_startf(GUID_CMD(VGID_GUID)); + global_qtest =3D qtest_initf(GUID_CMD(VGID_GUID)); =20 /* Read the GUID from accessing guest memory */ read_guid_from_memory(&measured); @@ -155,7 +155,7 @@ static void vmgenid_set_guid_auto_test(void) { QemuUUID measured; =20 - global_qtest =3D qtest_startf(GUID_CMD("auto")); + global_qtest =3D qtest_initf(GUID_CMD("auto")); =20 read_guid_from_memory(&measured); =20 @@ -171,7 +171,7 @@ static void vmgenid_query_monitor_test(void) =20 g_assert(qemu_uuid_parse(VGID_GUID, &expected) =3D=3D 0); =20 - global_qtest =3D qtest_startf(GUID_CMD(VGID_GUID)); + global_qtest =3D qtest_initf(GUID_CMD(VGID_GUID)); =20 /* Read the GUID via the monitor */ read_guid_from_monitor(&measured); --=20 2.17.1 From nobody Wed Nov 5 02:32:13 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 153294010704610.8528860285071; Mon, 30 Jul 2018 01:41:47 -0700 (PDT) Received: from localhost ([::1]:51212 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3kE-0001QG-D4 for importer@patchew.org; Mon, 30 Jul 2018 04:41:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39421) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fk3cL-0003P5-KJ for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fk3cJ-0004YU-2k for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:51116 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fk3cI-0004Y1-SE for qemu-devel@nongnu.org; Mon, 30 Jul 2018 04:33:22 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 528D7CFB46; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-135.ams2.redhat.com [10.36.116.135]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2C5002026D68; Mon, 30 Jul 2018 08:33:22 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id CD3B11133071; Mon, 30 Jul 2018 10:33:17 +0200 (CEST) From: Markus Armbruster To: qemu-devel@nongnu.org Date: Mon, 30 Jul 2018 10:33:17 +0200 Message-Id: <20180730083317.11765-24-armbru@redhat.com> In-Reply-To: <20180730083317.11765-1-armbru@redhat.com> References: <20180730083317.11765-1-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 30 Jul 2018 08:33:22 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'armbru@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v3 23/23] libqtest: Rename qtest_FOOv() to qtest_vFOO() for consistency X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: thuth@redhat.com, f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 13 of 13 C99 library function pairs taking ... or a va_list parameter are called FOO() and vFOO(). In QEMU, we sometimes call the one taking a va_list FOOv() instead. Bad taste. libqtest.h uses both spellings. Normalize it to the standard spelling. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/libqtest.c | 12 ++++++------ tests/libqtest.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index a0d44793fa..3706f30aa2 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -538,7 +538,7 @@ QDict *qmp_fdv(int fd, const char *fmt, va_list ap) return qmp_fd_receive(fd); } =20 -QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap) +QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap) { qtest_qmp_vsend(s, fmt, ap); =20 @@ -572,7 +572,7 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...) QDict *response; =20 va_start(ap, fmt); - response =3D qtest_qmpv(s, fmt, ap); + response =3D qtest_vqmp(s, fmt, ap); va_end(ap); return response; } @@ -608,7 +608,7 @@ void qtest_qmp_eventwait(QTestState *s, const char *eve= nt) qobject_unref(response); } =20 -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap) +char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap) { char *cmd; QDict *resp; @@ -637,7 +637,7 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...) char *ret; =20 va_start(ap, fmt); - ret =3D qtest_hmpv(s, fmt, ap); + ret =3D qtest_vhmp(s, fmt, ap); va_end(ap); return ret; } @@ -943,7 +943,7 @@ QDict *qmp(const char *fmt, ...) QDict *response; =20 va_start(ap, fmt); - response =3D qtest_qmpv(global_qtest, fmt, ap); + response =3D qtest_vqmp(global_qtest, fmt, ap); va_end(ap); return response; } @@ -963,7 +963,7 @@ char *hmp(const char *fmt, ...) char *ret; =20 va_start(ap, fmt); - ret =3D qtest_hmpv(global_qtest, fmt, ap); + ret =3D qtest_vhmp(global_qtest, fmt, ap); va_end(ap); return ret; } diff --git a/tests/libqtest.h b/tests/libqtest.h index 3848086928..7e60abc9fd 100644 --- a/tests/libqtest.h +++ b/tests/libqtest.h @@ -106,7 +106,7 @@ void qtest_qmp_send(QTestState *s, const char *fmt, ...) * * Sends a QMP message to QEMU and returns the response. */ -QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap) +QDict *qtest_vqmp(QTestState *s, const char *fmt, va_list ap) GCC_FMT_ATTR(2, 0); =20 /** @@ -189,7 +189,7 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...) GC= C_FMT_ATTR(2, 3); * * Returns: the command's output. The caller should g_free() it. */ -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap) +char *qtest_vhmp(QTestState *s, const char *fmt, va_list ap) GCC_FMT_ATTR(2, 0); =20 /** --=20 2.17.1