[Qemu-devel] [RFC v5 26/26] tests: qmp-test: add oob test

Peter Xu posted 26 patches 8 years, 2 months ago
There is a newer version of this series
[Qemu-devel] [RFC v5 26/26] tests: qmp-test: add oob test
Posted by Peter Xu 8 years, 2 months ago
Test the new OOB capability.  Here we used the new "x-oob-test" command.
Firstly, we send a lock=true and oob=false command to hang the main
thread.  Then send another lock=false and oob=true command (which will
be run inside parser this time) to free that hanged command.

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

diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 729ec59b0a..bb12122a4e 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -157,6 +157,66 @@ static void test_qmp_protocol(void)
     qtest_end();
 }
 
+/* Tests for Out-Of-Band support. */
+static void test_qmp_oob(void)
+{
+    QDict *resp;
+    int acks = 0;
+    const char *cmd_id;
+
+    global_qtest = qtest_init_without_qmp_handshake(common_args);
+
+    /* Ignore the greeting message. */
+    resp = qmp_receive();
+    g_assert(qdict_get_qdict(resp, "QMP"));
+    QDECREF(resp);
+
+    /* Try a fake capability, it should fail. */
+    resp = qmp("{ 'execute': 'qmp_capabilities', "
+               "  'arguments': { 'enable': [ 'cap-does-not-exist' ] } }");
+    g_assert(qdict_haskey(resp, "error"));
+
+    /* Now, enable OOB in current QMP session, it should success. */
+    resp = qmp("{ 'execute': 'qmp_capabilities', "
+               "  'arguments': { 'enable': [ 'oob' ] } }");
+    g_assert(qdict_haskey(resp, "return"));
+
+    /*
+     * Try any command that does not support OOB but with OOB flag. We
+     * should get failure.
+     */
+    resp = qmp("{ 'execute': 'query-cpus',"
+               "  'control': { 'run-oob': true } }");
+    g_assert(qdict_haskey(resp, "error"));
+
+    /*
+     * Firstly send the "x-oob-test" command with lock=true and
+     * oob=false, it should hang the dispatcher and main thread;
+     * later, we send another lock=false with oob=true to continue
+     * that thread processing.  Finally we should receive replies from
+     * both commands.
+     */
+    qmp_async("{ 'execute': 'x-oob-test',"
+              "  'arguments': { 'lock': true }, "
+              "  'id': 'lock-cmd'}");
+    qmp_async("{ 'execute': 'x-oob-test', "
+              "  'arguments': { 'lock': false }, "
+              "  'control': { 'run-oob': true }, "
+              "  'id': 'unlock-cmd' }");
+
+    /* Ignore all events.  Wait for 2 acks */
+    while (acks < 2) {
+        resp = qmp_receive();
+        cmd_id = qdict_get_str(resp, "id");
+        if (!g_strcmp0(cmd_id, "lock-cmd") ||
+            !g_strcmp0(cmd_id, "unlock-cmd")) {
+            acks++;
+        }
+    }
+
+    qtest_end();
+}
+
 static int query_error_class(const char *cmd)
 {
     static struct {
@@ -335,6 +395,7 @@ int main(int argc, char *argv[])
     g_test_init(&argc, &argv, NULL);
 
     qtest_add_func("qmp/protocol", test_qmp_protocol);
+    qtest_add_func("qmp/oob", test_qmp_oob);
     qmp_schema_init(&schema);
     add_query_tests(&schema);
 
-- 
2.14.3


Re: [Qemu-devel] [RFC v5 26/26] tests: qmp-test: add oob test
Posted by Stefan Hajnoczi 8 years, 1 month ago
On Tue, Dec 05, 2017 at 01:52:00PM +0800, Peter Xu wrote:
> +    /* Try a fake capability, it should fail. */
> +    resp = qmp("{ 'execute': 'qmp_capabilities', "
> +               "  'arguments': { 'enable': [ 'cap-does-not-exist' ] } }");
> +    g_assert(qdict_haskey(resp, "error"));

Missing QDECREF(resp) here and throughout the rest of the function.

Besides that:

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Re: [Qemu-devel] [RFC v5 26/26] tests: qmp-test: add oob test
Posted by Peter Xu 8 years, 1 month ago
On Thu, Dec 14, 2017 at 02:47:12PM +0000, Stefan Hajnoczi wrote:
> On Tue, Dec 05, 2017 at 01:52:00PM +0800, Peter Xu wrote:
> > +    /* Try a fake capability, it should fail. */
> > +    resp = qmp("{ 'execute': 'qmp_capabilities', "
> > +               "  'arguments': { 'enable': [ 'cap-does-not-exist' ] } }");
> > +    g_assert(qdict_haskey(resp, "error"));
> 
> Missing QDECREF(resp) here and throughout the rest of the function.

I believe I missed four QDECREF()s.

> 
> Besides that:
> 
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

Hope my counting is correct, then I'll add the r-b.  Thanks!

-- 
Peter Xu

Re: [Qemu-devel] [RFC v5 26/26] tests: qmp-test: add oob test
Posted by Stefan Hajnoczi 8 years, 1 month ago
On Mon, Dec 18, 2017 at 05:51:45PM +0800, Peter Xu wrote:
> On Thu, Dec 14, 2017 at 02:47:12PM +0000, Stefan Hajnoczi wrote:
> > On Tue, Dec 05, 2017 at 01:52:00PM +0800, Peter Xu wrote:
> > > +    /* Try a fake capability, it should fail. */
> > > +    resp = qmp("{ 'execute': 'qmp_capabilities', "
> > > +               "  'arguments': { 'enable': [ 'cap-does-not-exist' ] } }");
> > > +    g_assert(qdict_haskey(resp, "error"));
> > 
> > Missing QDECREF(resp) here and throughout the rest of the function.
> 
> I believe I missed four QDECREF()s.

Yes.