[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/36] test-qga: Actually test 0xff sync bytes
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH 08/36] test-qga: Actually test 0xff sync bytes |
Date: |
Wed, 30 Nov 2016 13:44:26 -0600 |
Commit 62c39b3 introduced test-qga, and at face value, appears
to be testing the 'guest-sync' behavior that is recommended for
guests in sending 0xff to QGA to force the parser to reset. But
this aspect of the test has never actually done anything: the
qmp_fd() call chain converts its string argument into QObject,
then converts that QObject back to the actual string that is
sent over the wire - and the conversion process silently drops
the 0xff byte from the string sent to QGA, thus never resetting
the QGA parser.
An upcoming patch will get rid of the wasteful round trip
through QObject, at which point the string in test-qga will be
directly sent over the wire.
But fixing qmp_fd() to actually send 0xff over the wire is not
all we have to do - the actual QMP parser loudly complains that
0xff is not valid JSON, and sends an error message _prior_ to
actually parsing the 'guest-sync' or 'guest-sync-delimited'
command. With 'guest-sync', we cannot easily tell if this error
message is a result of our command - which is WHY we invented
the 'guest-sync-delimited' command. So for the testsuite, fix
things to only check 0xff behavior on 'guest-sync-delimited',
and to loop until we've consumed all garbage prior to the
requested delimiter, which matches the documented actions that
a real QGA client is supposed to do.
Ideally, we'd fix the QGA JSON parser to silently ignore 0xff
rather than sending an error message back, at which point we
could enhance this test for 'guest-sync' as well as for
'guest-sync-delimited'. But for the sake of this patch, our
testing of 'guest-sync' is no worse than it was pre-patch,
because we have never been sending 0xff over the wire in the
first place.
Signed-off-by: Eric Blake <address@hidden>
---
tests/libqtest.c | 8 ++++++++
tests/test-qga.c | 12 +++++++-----
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 6f69752..429aaec 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -430,6 +430,14 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
va_list ap_copy;
QObject *qobj;
+ /* qobject_from_jsonv() silently eats leading 0xff as invalid
+ * JSON, but we want to test sending them over the wire to force
+ * resyncs */
+ if (*fmt == '\377') {
+ socket_send(fd, fmt, 1);
+ fmt++;
+ }
+
/* Going through qobject ensures we escape strings properly.
* This seemingly unnecessary copy is required in case va_list
* is an array type.
diff --git a/tests/test-qga.c b/tests/test-qga.c
index 868b02a..4b64630 100644
--- a/tests/test-qga.c
+++ b/tests/test-qga.c
@@ -151,9 +151,11 @@ static void test_qga_sync_delimited(gconstpointer fix)
qmp_fd_send(fixture->fd, cmd);
g_free(cmd);
- v = read(fixture->fd, &c, 1);
- g_assert_cmpint(v, ==, 1);
- g_assert_cmpint(c, ==, 0xff);
+ /* Read and ignore garbage until resynchronized */
+ do {
+ v = read(fixture->fd, &c, 1);
+ g_assert_cmpint(v, ==, 1);
+ } while (c != 0xff);
ret = qmp_fd_receive(fixture->fd);
g_assert_nonnull(ret);
@@ -172,8 +174,8 @@ static void test_qga_sync(gconstpointer fix)
QDict *ret;
gchar *cmd;
- cmd = g_strdup_printf("%c{'execute': 'guest-sync',"
- " 'arguments': {'id': %u } }", 0xff, r);
+ cmd = g_strdup_printf("{'execute': 'guest-sync',"
+ " 'arguments': {'id': %u } }", r);
ret = qmp_fd(fixture->fd, cmd);
g_free(cmd);
--
2.7.4
- [Qemu-devel] [PATCH 00/36] Rip out dynamic JSON parsing, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 01/36] pci: Use struct instead of QDict to pass back parameters, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 03/36] qlist: Add convenience helpers for wrapped appends, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 08/36] test-qga: Actually test 0xff sync bytes,
Eric Blake <=
- [Qemu-devel] [PATCH 10/36] qtest: Avoid dynamic JSON in libqtest, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 09/36] qtest: Add a new helper qmp_cmd() and friends, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 06/36] qobject-input-visitor: Avoid dynamic JSON in tests, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 04/36] qmp-event: Avoid dynamic JSON, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 05/36] qmp-dispatch: Avoid dynamic JSON, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 07/36] fdc-test: Avoid deprecated 'change' command, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 22/36] qtest: Avoid dynamic JSON in pc-cpu-test, Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 12/36] nbd: Use simpler QAPI_TO_QOBJECT(), Eric Blake, 2016/11/30
- [Qemu-devel] [PATCH 11/36] qapi: Add QAPI_TO_QOBJECT() convenience macro, Eric Blake, 2016/11/30