Hi On Thu, Oct 6, 2022 at 5:43 PM Daniel P. Berrangé <[email protected]> wrote:
> On Thu, Oct 06, 2022 at 05:05:13PM +0400, [email protected] > wrote: > > From: Marc-André Lureau <[email protected]> > > > > This is some of the simplest test we could perform, it simply connects > > to the VNC server via passed-in socket FDs and checks the connection can > > be established. > > > > Another series will make this test work on Windows as well. > > > > As always, more tests can be added later! :) > > This test program uses GTK-VNC's VncConnection class, which makes sense > for testing the expected behaviour, not least because GTK-VNC is what > alot of QEMU clients will use. IOW, its good to ensure we don't regress > with GTK-VNC. > > Looking at testing from a robustness POV though, it is desirable to be > able to try various bad things in an attempt to trip up QEMU's VNC server > and potentially exploit it. This will be pretty much impossible todo using > VncConnection, and would require being able to speak the raw VNC protocol > on the sockets, and take unsual actions like sending requests but not > processing the results. > > Any thoughts on the "bad" testing ? > Well, that requires some exploration I guess, using fuzzing. That's another story imho :) thanks > > > Signed-off-by: Marc-André Lureau <[email protected]> > > --- > > tests/qtest/vnc-display-test.c | 103 +++++++++++++++++++++++++++++++++ > > tests/qtest/meson.build | 8 ++- > > 2 files changed, 110 insertions(+), 1 deletion(-) > > create mode 100644 tests/qtest/vnc-display-test.c > > > > diff --git a/tests/qtest/vnc-display-test.c > b/tests/qtest/vnc-display-test.c > > new file mode 100644 > > index 0000000000..e2a9d682bb > > --- /dev/null > > +++ b/tests/qtest/vnc-display-test.c > > @@ -0,0 +1,103 @@ > > +/* > > + * VNC display tests > > + * > > + * Copyright (c) 2022 Red Hat, Inc. > > + * > > + * This work is licensed under the terms of the GNU GPL, version 2 or > later. > > + * See the COPYING file in the top-level directory. > > + */ > > + > > +#include "qemu/osdep.h" > > +#include "qemu/sockets.h" > > +#include "libqtest.h" > > +#include <gio/gio.h> > > +#include <gvnc.h> > > + > > +typedef struct Test { > > + QTestState *qts; > > + VncConnection *conn; > > + GMainLoop *loop; > > +} Test; > > + > > +static void on_vnc_error(VncConnection* self, > > + const char* msg) > > +{ > > + g_error("vnc-error: %s", msg); > > +} > > + > > +static void on_vnc_auth_failure(VncConnection *self, > > + const char *msg) > > +{ > > + g_error("vnc-auth-failure: %s", msg); > > +} > > + > > +static bool > > +test_setup(Test *test) > > +{ > > +#ifdef WIN32 > > + g_test_skip("Not supported on Windows yet"); > > + return false; > > +#else > > + int pair[2]; > > + > > + test->qts = qtest_init("-vnc none -name vnc-test"); > > + > > + g_assert_cmpint(qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, pair), ==, > 0); > > + > > + qtest_qmp_add_client(test->qts, "vnc", pair[1]); > > + > > + test->conn = vnc_connection_new(); > > + g_signal_connect(test->conn, "vnc-error", > > + G_CALLBACK(on_vnc_error), NULL); > > + g_signal_connect(test->conn, "vnc-auth-failure", > > + G_CALLBACK(on_vnc_auth_failure), NULL); > > + vnc_connection_set_auth_type(test->conn, VNC_CONNECTION_AUTH_NONE); > > + vnc_connection_open_fd(test->conn, pair[0]); > > + > > + test->loop = g_main_loop_new(NULL, FALSE); > > + return true; > > +#endif > > +} > > + > > +static void > > +test_vnc_basic_on_vnc_initialized(VncConnection *self, > > + Test *test) > > +{ > > + const char *name = vnc_connection_get_name(test->conn); > > + > > + g_assert_cmpstr(name, ==, "QEMU (vnc-test)"); > > + g_main_loop_quit(test->loop); > > +} > > + > > +static void > > +test_vnc_basic(void) > > +{ > > + Test test; > > + > > + if (!test_setup(&test)) { > > + return; > > + } > > + > > + g_signal_connect(test.conn, "vnc-initialized", > > + G_CALLBACK(test_vnc_basic_on_vnc_initialized), > &test); > > + > > + g_main_loop_run(test.loop); > > + > > + qtest_quit(test.qts); > > + g_object_unref(test.conn); > > + g_main_loop_unref(test.loop); > > +} > > + > > +int > > +main(int argc, char **argv) > > +{ > > + if (getenv("GTK_VNC_DEBUG")) { > > + vnc_util_set_debug(true); > > + } > > + > > + g_test_init(&argc, &argv, NULL); > > + > > + qtest_add_func("/vnc-display/basic", test_vnc_basic); > > + > > + return g_test_run(); > > +} > > diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build > > index 455f1bbb7e..c07a5b1a5f 100644 > > --- a/tests/qtest/meson.build > > +++ b/tests/qtest/meson.build > > @@ -306,8 +306,14 @@ qtests = { > > 'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'), > > } > > > > +gvnc = dependency('gvnc-1.0', required: false) > > +if gvnc.found() > > + qtests += {'vnc-display-test': [gvnc]} > > + qtests_generic += [ 'vnc-display-test' ] > > +endif > > + > > if dbus_display > > -qtests += {'dbus-display-test': [dbus_display1, gio]} > > + qtests += {'dbus-display-test': [dbus_display1, gio]} > > endif > > > > qtest_executables = {} > > -- > > 2.37.3 > > > > With regards, > Daniel > -- > |: https://berrange.com -o- > https://www.flickr.com/photos/dberrange :| > |: https://libvirt.org -o- > https://fstop138.berrange.com :| > |: https://entangle-photo.org -o- > https://www.instagram.com/dberrange :| > > > -- Marc-André Lureau
