1f5755989SMarc-André Lureau /* 2f5755989SMarc-André Lureau * VNC display tests 3f5755989SMarc-André Lureau * 4f5755989SMarc-André Lureau * Copyright (c) 2022 Red Hat, Inc. 5f5755989SMarc-André Lureau * 6f5755989SMarc-André Lureau * This work is licensed under the terms of the GNU GPL, version 2 or later. 7f5755989SMarc-André Lureau * See the COPYING file in the top-level directory. 8f5755989SMarc-André Lureau */ 9f5755989SMarc-André Lureau 10f5755989SMarc-André Lureau #include "qemu/osdep.h" 11f5755989SMarc-André Lureau #include "qemu/sockets.h" 12f5755989SMarc-André Lureau #include "libqtest.h" 13f5755989SMarc-André Lureau #include <gio/gio.h> 14f5755989SMarc-André Lureau #include <gvnc.h> 15f5755989SMarc-André Lureau 16f5755989SMarc-André Lureau typedef struct Test { 17f5755989SMarc-André Lureau QTestState *qts; 18f5755989SMarc-André Lureau VncConnection *conn; 19f5755989SMarc-André Lureau GMainLoop *loop; 20f5755989SMarc-André Lureau } Test; 21f5755989SMarc-André Lureau 22*2a969c0cSPhilippe Mathieu-Daudé #if !defined(WIN32) && !defined(CONFIG_DARWIN) 236c25794fSPhilippe Mathieu-Daudé 24f5755989SMarc-André Lureau static void on_vnc_error(VncConnection* self, 25f5755989SMarc-André Lureau const char* msg) 26f5755989SMarc-André Lureau { 27f5755989SMarc-André Lureau g_error("vnc-error: %s", msg); 28f5755989SMarc-André Lureau } 29f5755989SMarc-André Lureau 30f5755989SMarc-André Lureau static void on_vnc_auth_failure(VncConnection *self, 31f5755989SMarc-André Lureau const char *msg) 32f5755989SMarc-André Lureau { 33f5755989SMarc-André Lureau g_error("vnc-auth-failure: %s", msg); 34f5755989SMarc-André Lureau } 35f5755989SMarc-André Lureau 366c25794fSPhilippe Mathieu-Daudé #endif 376c25794fSPhilippe Mathieu-Daudé 38f5755989SMarc-André Lureau static bool 39f5755989SMarc-André Lureau test_setup(Test *test) 40f5755989SMarc-André Lureau { 41f5755989SMarc-André Lureau #ifdef WIN32 42f5755989SMarc-André Lureau g_test_skip("Not supported on Windows yet"); 43f5755989SMarc-André Lureau return false; 44*2a969c0cSPhilippe Mathieu-Daudé #elif defined(CONFIG_DARWIN) 45*2a969c0cSPhilippe Mathieu-Daudé g_test_skip("Broken on Darwin"); 46*2a969c0cSPhilippe Mathieu-Daudé return false; 47f5755989SMarc-André Lureau #else 48f5755989SMarc-André Lureau int pair[2]; 49f5755989SMarc-André Lureau 50fe843ea2SPhilippe Mathieu-Daudé test->qts = qtest_init("-M none -vnc none -name vnc-test"); 51f5755989SMarc-André Lureau 52f5755989SMarc-André Lureau g_assert_cmpint(qemu_socketpair(AF_UNIX, SOCK_STREAM, 0, pair), ==, 0); 53f5755989SMarc-André Lureau 54f5755989SMarc-André Lureau qtest_qmp_add_client(test->qts, "vnc", pair[1]); 55f5755989SMarc-André Lureau 56f5755989SMarc-André Lureau test->conn = vnc_connection_new(); 57f5755989SMarc-André Lureau g_signal_connect(test->conn, "vnc-error", 58f5755989SMarc-André Lureau G_CALLBACK(on_vnc_error), NULL); 59f5755989SMarc-André Lureau g_signal_connect(test->conn, "vnc-auth-failure", 60f5755989SMarc-André Lureau G_CALLBACK(on_vnc_auth_failure), NULL); 61f5755989SMarc-André Lureau vnc_connection_set_auth_type(test->conn, VNC_CONNECTION_AUTH_NONE); 62f5755989SMarc-André Lureau vnc_connection_open_fd(test->conn, pair[0]); 63f5755989SMarc-André Lureau 64f5755989SMarc-André Lureau test->loop = g_main_loop_new(NULL, FALSE); 65f5755989SMarc-André Lureau return true; 66f5755989SMarc-André Lureau #endif 67f5755989SMarc-André Lureau } 68f5755989SMarc-André Lureau 69f5755989SMarc-André Lureau static void 70f5755989SMarc-André Lureau test_vnc_basic_on_vnc_initialized(VncConnection *self, 71f5755989SMarc-André Lureau Test *test) 72f5755989SMarc-André Lureau { 73f5755989SMarc-André Lureau const char *name = vnc_connection_get_name(test->conn); 74f5755989SMarc-André Lureau 75f5755989SMarc-André Lureau g_assert_cmpstr(name, ==, "QEMU (vnc-test)"); 76f5755989SMarc-André Lureau g_main_loop_quit(test->loop); 77f5755989SMarc-André Lureau } 78f5755989SMarc-André Lureau 79f5755989SMarc-André Lureau static void 80f5755989SMarc-André Lureau test_vnc_basic(void) 81f5755989SMarc-André Lureau { 82f5755989SMarc-André Lureau Test test; 83f5755989SMarc-André Lureau 84f5755989SMarc-André Lureau if (!test_setup(&test)) { 85f5755989SMarc-André Lureau return; 86f5755989SMarc-André Lureau } 87f5755989SMarc-André Lureau 88f5755989SMarc-André Lureau g_signal_connect(test.conn, "vnc-initialized", 89f5755989SMarc-André Lureau G_CALLBACK(test_vnc_basic_on_vnc_initialized), &test); 90f5755989SMarc-André Lureau 91f5755989SMarc-André Lureau g_main_loop_run(test.loop); 92f5755989SMarc-André Lureau 93f5755989SMarc-André Lureau qtest_quit(test.qts); 94f5755989SMarc-André Lureau g_object_unref(test.conn); 95f5755989SMarc-André Lureau g_main_loop_unref(test.loop); 96f5755989SMarc-André Lureau } 97f5755989SMarc-André Lureau 98f5755989SMarc-André Lureau int 99f5755989SMarc-André Lureau main(int argc, char **argv) 100f5755989SMarc-André Lureau { 101f5755989SMarc-André Lureau if (getenv("GTK_VNC_DEBUG")) { 102f5755989SMarc-André Lureau vnc_util_set_debug(true); 103f5755989SMarc-André Lureau } 104f5755989SMarc-André Lureau 105f5755989SMarc-André Lureau g_test_init(&argc, &argv, NULL); 106f5755989SMarc-André Lureau 107f5755989SMarc-André Lureau qtest_add_func("/vnc-display/basic", test_vnc_basic); 108f5755989SMarc-André Lureau 109f5755989SMarc-André Lureau return g_test_run(); 110f5755989SMarc-André Lureau } 111