diff mbox series

[3/3] tests: more strict command batching test

Message ID 20180321065506.21091-4-peterx@redhat.com
State New
Headers show
Series tests: trivial enhancements for OOB | expand

Commit Message

Peter Xu March 21, 2018, 6:55 a.m. UTC
Add "id" fields to the commands, and check that the command returns are
in order.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 tests/qmp-test.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

Comments

Eric Blake March 21, 2018, 12:55 p.m. UTC | #1
On 03/21/2018 01:55 AM, Peter Xu wrote:
> Add "id" fields to the commands, and check that the command returns are
> in order.
> 
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
>   tests/qmp-test.c | 8 +++++++-
>   1 file changed, 7 insertions(+), 1 deletion(-)
> 

> +++ b/tests/qmp-test.c
> @@ -83,6 +83,7 @@ static void test_qmp_protocol(void)
>       const QListEntry *entry;
>       QString *qstr;
>       int i;
> +    char buf[128];

Eww, we shouldn't need this.

>   
>       qts = qtest_init_without_qmp_handshake(common_args);
>   
> @@ -150,7 +151,10 @@ static void test_qmp_protocol(void)
>        * best-effort test.
>        */
>       for (i = 0; i < 16; i++) {
> -        qtest_async_qmp(qts, "{ 'execute': 'query-version' }");
> +        snprintf(buf, sizeof(buf) - 1, "{ 'execute': 'query-version', "
> +                 "'id': %d }", i);
> +        buf[sizeof(buf) - 1] = '\0';
> +        qtest_async_qmp(qts, buf);

snprintf() of JSON strings is prone to failures especially when the JSON 
string is reinterpreted as a printf argument in qtest_async_qmp.  Better 
is to let qtest_async_qmp() directly do the formatting, as in:

qtest_async_qmp(qts, "{ 'execute':'query-version', 'id':%d}", i);

And then I was right - you don't need buf.

Otherwise the addition is good.
Peter Xu March 22, 2018, 3:48 a.m. UTC | #2
On Wed, Mar 21, 2018 at 07:55:19AM -0500, Eric Blake wrote:
> On 03/21/2018 01:55 AM, Peter Xu wrote:
> > Add "id" fields to the commands, and check that the command returns are
> > in order.
> > 
> > Signed-off-by: Peter Xu <peterx@redhat.com>
> > ---
> >   tests/qmp-test.c | 8 +++++++-
> >   1 file changed, 7 insertions(+), 1 deletion(-)
> > 
> 
> > +++ b/tests/qmp-test.c
> > @@ -83,6 +83,7 @@ static void test_qmp_protocol(void)
> >       const QListEntry *entry;
> >       QString *qstr;
> >       int i;
> > +    char buf[128];
> 
> Eww, we shouldn't need this.
> 
> >       qts = qtest_init_without_qmp_handshake(common_args);
> > @@ -150,7 +151,10 @@ static void test_qmp_protocol(void)
> >        * best-effort test.
> >        */
> >       for (i = 0; i < 16; i++) {
> > -        qtest_async_qmp(qts, "{ 'execute': 'query-version' }");
> > +        snprintf(buf, sizeof(buf) - 1, "{ 'execute': 'query-version', "
> > +                 "'id': %d }", i);
> > +        buf[sizeof(buf) - 1] = '\0';
> > +        qtest_async_qmp(qts, buf);
> 
> snprintf() of JSON strings is prone to failures especially when the JSON
> string is reinterpreted as a printf argument in qtest_async_qmp.  Better is
> to let qtest_async_qmp() directly do the formatting, as in:
> 
> qtest_async_qmp(qts, "{ 'execute':'query-version', 'id':%d}", i);
> 
> And then I was right - you don't need buf.

Ouch. :)

Will fix that. Thanks,

> 
> Otherwise the addition is good.
> 
> -- 
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.           +1-919-301-3266
> Virtualization:  qemu.org | libvirt.org
diff mbox series

Patch

diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 07c0b87e27..c861c3b550 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -83,6 +83,7 @@  static void test_qmp_protocol(void)
     const QListEntry *entry;
     QString *qstr;
     int i;
+    char buf[128];
 
     qts = qtest_init_without_qmp_handshake(common_args);
 
@@ -150,7 +151,10 @@  static void test_qmp_protocol(void)
      * best-effort test.
      */
     for (i = 0; i < 16; i++) {
-        qtest_async_qmp(qts, "{ 'execute': 'query-version' }");
+        snprintf(buf, sizeof(buf) - 1, "{ 'execute': 'query-version', "
+                 "'id': %d }", i);
+        buf[sizeof(buf) - 1] = '\0';
+        qtest_async_qmp(qts, buf);
     }
     /* Verify the replies to make sure no command is dropped. */
     for (i = 0; i < 16; i++) {
@@ -158,6 +162,8 @@  static void test_qmp_protocol(void)
         /* It should never be dropped.  Each of them should be a reply. */
         g_assert(qdict_haskey(resp, "return"));
         g_assert(!qdict_haskey(resp, "event"));
+        g_assert(qdict_haskey(resp, "id"));
+        g_assert(qdict_get_int(resp, "id") == i);
         QDECREF(resp);
     }