Message ID | 1488145424-14974-3-git-send-email-armbru@redhat.com |
---|---|
State | New |
Headers | show |
On 02/26/2017 03:43 PM, Markus Armbruster wrote: > The next commit is going to add a test that calls qmp("null"). > Curiously, this hangs. Here's why. > > qmp_fd_sendv() doesn't send newlines. Not even when @fmt contains > some. At first glance, the QMP parser seems to be fine with that. > However, it turns out that it fails to react to input until it sees > either a newline, an object or an array. To reproduce, feed to a QMP > monitor like this: > > $ echo -n 'null' | socat UNIX:/work/armbru/images/test-qmp STDIO I didn't point this out last time, but 'echo -n' is not portable. On the other hand, it is sufficient for the example in the commit message, so no need to change. > {"QMP": {"version": {"qemu": {"micro": 50, "minor": 8, "major": 2}, "package": " (v2.8.0-1195-gf84141e-dirty)"}, "capabilities": []}} > > No output after the greeting. > > Work around this QMP bug by having qmp_fd_sendv() append a newline. > > Signed-off-by: Markus Armbruster <armbru@redhat.com> > Reviewed-by: Eric Blake <eblake@redhat.com> R-b stands.
diff --git a/tests/libqtest.c b/tests/libqtest.c index e54354d..ad23ce9 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -442,14 +442,20 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap) if (qobj) { int log = getenv("QTEST_LOG") != NULL; QString *qstr = qobject_to_json(qobj); - const char *str = qstring_get_str(qstr); - size_t size = qstring_get_length(qstr); + const char *str; + + /* + * BUG: QMP doesn't react to input until it sees a newline, an + * object, or an array. Work-around: give it a newline. + */ + qstring_append_chr(qstr, '\n'); + str = qstring_get_str(qstr); if (log) { fprintf(stderr, "%s", str); } /* Send QMP request */ - socket_send(fd, str, size); + socket_send(fd, str, qstring_get_length(qstr)); QDECREF(qstr); qobject_decref(qobj);