[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v4 27/27] tests: qmp-test: add oob test
From: |
Peter Xu |
Subject: |
[Qemu-devel] [RFC v4 27/27] tests: qmp-test: add oob test |
Date: |
Thu, 16 Nov 2017 21:06:10 +0800 |
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 <address@hidden>
---
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.13.6
- [Qemu-devel] [RFC v4 18/27] monitor: send event when request queue full, (continued)
- [Qemu-devel] [RFC v4 18/27] monitor: send event when request queue full, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 19/27] qapi: introduce new cmd option "allow-oob", Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 20/27] qmp: support out-of-band (oob) execution, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 21/27] qmp: let migrate-incoming allow out-of-band, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 22/27] qmp: isolate responses into io thread, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 23/27] monitor: enable IO thread for (qmp & !mux) typed, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 24/27] qmp: add command "x-oob-test", Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 25/27] docs: update QMP documents for OOB commands, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 26/27] tests: qmp-test: verify command batching, Peter Xu, 2017/11/16
- [Qemu-devel] [RFC v4 27/27] tests: qmp-test: add oob test,
Peter Xu <=