{"id":1571503,"url":"http://patchwork.ozlabs.org/api/patches/1571503/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20211221065855.142578-29-marcandre.lureau@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20211221065855.142578-29-marcandre.lureau@redhat.com>","list_archive_url":null,"date":"2021-12-21T06:58:47","name":"[PULL,v2,28/36] tests: start dbus-display-test","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"85bffcc83f17e5478df1e7f838636d1978a41bf5","submitter":{"id":66774,"url":"http://patchwork.ozlabs.org/api/people/66774/?format=json","name":"Marc-André Lureau","email":"marcandre.lureau@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20211221065855.142578-29-marcandre.lureau@redhat.com/mbox/","series":[{"id":277865,"url":"http://patchwork.ozlabs.org/api/series/277865/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=277865","date":"2021-12-21T06:58:19","name":"[PULL,v2,01/36] ui/vdagent: add CHECK_SPICE_PROTOCOL_VERSION","version":2,"mbox":"http://patchwork.ozlabs.org/series/277865/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/1571503/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/1571503/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["bilbo.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=Ne/hCt3P;\n\tdkim-atps=neutral","ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=<UNKNOWN>)","relay.mimecast.com;\n auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=marcandre.lureau@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby bilbo.ozlabs.org (Postfix) with ESMTPS id 4JJ81J01djz9s3q\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 21 Dec 2021 18:56:51 +1100 (AEDT)","from localhost ([::1]:55250 helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1mza0v-0003sk-Oc\n\tfor incoming@patchwork.ozlabs.org; Tue, 21 Dec 2021 02:56:49 -0500","from eggs.gnu.org ([209.51.188.92]:59120)\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1mzZEo-0001go-Jc\n for qemu-devel@nongnu.org; Tue, 21 Dec 2021 02:07:09 -0500","from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:31258)\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1mzZEm-0002Tx-LW\n for qemu-devel@nongnu.org; Tue, 21 Dec 2021 02:07:06 -0500","from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com\n [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n us-mta-569-xbxpD_fuOU6wZvhbCYtqrw-1; Tue, 21 Dec 2021 02:07:01 -0500","from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com\n [10.5.11.12])\n (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n (No client certificate requested)\n by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8968F344AF;\n Tue, 21 Dec 2021 07:06:58 +0000 (UTC)","from localhost (unknown [10.39.208.37])\n by smtp.corp.redhat.com (Postfix) with ESMTP id C9A2D7EDAD;\n Tue, 21 Dec 2021 07:06:52 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1640070424;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Od6lCCUOGkAPzq9jfcCfkBnwxs1xDBQI7592Jvxm+Co=;\n b=Ne/hCt3PfLPr0n7zgPNqW/YDTcakPw+L6OnhtIR2Vd5LmkFlnzjoRul7VCeHpVbNo9Y4e+\n NrF+aXXbB7x6iwZzzIugxfXiyNg0fUvzEgscFfMckvLc1USOXYmgpkifQXSHUKeRfslamr\n +oiyUOv9XfusEZ52NP3+SbvXvgW7j0E=","X-MC-Unique":"xbxpD_fuOU6wZvhbCYtqrw-1","From":"marcandre.lureau@redhat.com","To":"qemu-devel@nongnu.org","Subject":"[PULL v2 28/36] tests: start dbus-display-test","Date":"Tue, 21 Dec 2021 10:58:47 +0400","Message-Id":"<20211221065855.142578-29-marcandre.lureau@redhat.com>","In-Reply-To":"<20211221065855.142578-1-marcandre.lureau@redhat.com>","References":"<20211221065855.142578-1-marcandre.lureau@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.12","X-Mimecast-Spam-Score":"0","X-Mimecast-Originator":"redhat.com","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=170.10.129.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-29","X-Spam_score":"-3.0","X-Spam_bar":"---","X-Spam_report":"(-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.203,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001,\n SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"peter.maydell@linaro.org, richard.henderson@linaro.org, =?utf-8?q?Marc-A?=\n\t=?utf-8?q?ndr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n <qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"From: Marc-André Lureau <marcandre.lureau@redhat.com>\n\nCover basic display interface usage. More cases to be added to cover\ndisconnections, multiple connections, corner cases. At this point, they\nwould be better written in Rust or Python though.\n\nThe proxy also covers reading the properties, since they are\nautomatically loaded at creation.\n\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\nAcked-by: Gerd Hoffmann <kraxel@redhat.com>\n---\n tests/qtest/dbus-display-test.c | 257 ++++++++++++++++++++++++++++++++\n tests/qtest/meson.build         |   8 +\n 2 files changed, 265 insertions(+)\n create mode 100644 tests/qtest/dbus-display-test.c","diff":"diff --git a/tests/qtest/dbus-display-test.c b/tests/qtest/dbus-display-test.c\nnew file mode 100644\nindex 000000000000..43c77aff045c\n--- /dev/null\n+++ b/tests/qtest/dbus-display-test.c\n@@ -0,0 +1,257 @@\n+#include \"qemu/osdep.h\"\n+#include \"qemu/dbus.h\"\n+#include <gio/gio.h>\n+#include <gio/gunixfdlist.h>\n+#include \"libqos/libqtest.h\"\n+#include \"qemu-common.h\"\n+#include \"dbus-display1.h\"\n+\n+static GDBusConnection*\n+test_dbus_p2p_from_fd(int fd)\n+{\n+    g_autoptr(GError) err = NULL;\n+    g_autoptr(GSocket) socket = NULL;\n+    g_autoptr(GSocketConnection) socketc = NULL;\n+    GDBusConnection *conn;\n+\n+    socket = g_socket_new_from_fd(fd, &err);\n+    g_assert_no_error(err);\n+\n+    socketc = g_socket_connection_factory_create_connection(socket);\n+    g_assert(socketc != NULL);\n+\n+    conn = g_dbus_connection_new_sync(\n+        G_IO_STREAM(socketc), NULL,\n+        G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |\n+        G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING,\n+        NULL, NULL, &err);\n+    g_assert_no_error(err);\n+\n+    return conn;\n+}\n+\n+static void\n+test_setup(QTestState **qts, GDBusConnection **conn)\n+{\n+    int pair[2];\n+\n+    *qts = qtest_init(\"-display dbus,p2p=yes -name dbus-test\");\n+\n+    g_assert_cmpint(socketpair(AF_UNIX, SOCK_STREAM, 0, pair), ==, 0);\n+\n+    qtest_qmp_add_client(*qts, \"@dbus-display\", pair[1]);\n+\n+    *conn = test_dbus_p2p_from_fd(pair[0]);\n+    g_dbus_connection_start_message_processing(*conn);\n+}\n+\n+static void\n+test_dbus_display_vm(void)\n+{\n+    g_autoptr(GError) err = NULL;\n+    g_autoptr(GDBusConnection) conn = NULL;\n+    g_autoptr(QemuDBusDisplay1VMProxy) vm = NULL;\n+    QTestState *qts = NULL;\n+\n+    test_setup(&qts, &conn);\n+\n+    vm = QEMU_DBUS_DISPLAY1_VM_PROXY(\n+        qemu_dbus_display1_vm_proxy_new_sync(\n+            conn,\n+            G_DBUS_PROXY_FLAGS_NONE,\n+            NULL,\n+            DBUS_DISPLAY1_ROOT \"/VM\",\n+            NULL,\n+            &err));\n+    g_assert_no_error(err);\n+\n+    g_assert_cmpstr(\n+        qemu_dbus_display1_vm_get_name(QEMU_DBUS_DISPLAY1_VM(vm)),\n+        ==,\n+        \"dbus-test\");\n+    qtest_quit(qts);\n+}\n+\n+typedef struct TestDBusConsoleRegister {\n+    GMainLoop *loop;\n+    GThread *thread;\n+    GDBusConnection *listener_conn;\n+    GDBusObjectManagerServer *server;\n+} TestDBusConsoleRegister;\n+\n+static gboolean listener_handle_scanout(\n+    QemuDBusDisplay1Listener *object,\n+    GDBusMethodInvocation *invocation,\n+    guint arg_width,\n+    guint arg_height,\n+    guint arg_stride,\n+    guint arg_pixman_format,\n+    GVariant *arg_data,\n+    TestDBusConsoleRegister *test)\n+{\n+    g_main_loop_quit(test->loop);\n+\n+    return DBUS_METHOD_INVOCATION_HANDLED;\n+}\n+\n+static void\n+test_dbus_console_setup_listener(TestDBusConsoleRegister *test)\n+{\n+    g_autoptr(GDBusObjectSkeleton) listener = NULL;\n+    g_autoptr(QemuDBusDisplay1ListenerSkeleton) iface = NULL;\n+\n+    test->server = g_dbus_object_manager_server_new(DBUS_DISPLAY1_ROOT);\n+    listener = g_dbus_object_skeleton_new(DBUS_DISPLAY1_ROOT \"/Listener\");\n+    iface = QEMU_DBUS_DISPLAY1_LISTENER_SKELETON(\n+        qemu_dbus_display1_listener_skeleton_new());\n+    g_object_connect(iface,\n+                     \"signal::handle-scanout\", listener_handle_scanout, test,\n+                     NULL);\n+    g_dbus_object_skeleton_add_interface(listener,\n+                                         G_DBUS_INTERFACE_SKELETON(iface));\n+    g_dbus_object_manager_server_export(test->server, listener);\n+    g_dbus_object_manager_server_set_connection(test->server,\n+                                                test->listener_conn);\n+\n+    g_dbus_connection_start_message_processing(test->listener_conn);\n+}\n+\n+static void\n+test_dbus_console_registered(GObject *source_object,\n+                             GAsyncResult *res,\n+                             gpointer user_data)\n+{\n+    TestDBusConsoleRegister *test = user_data;\n+    g_autoptr(GError) err = NULL;\n+\n+    qemu_dbus_display1_console_call_register_listener_finish(\n+        QEMU_DBUS_DISPLAY1_CONSOLE(source_object),\n+        NULL, res, &err);\n+    g_assert_no_error(err);\n+\n+    test->listener_conn = g_thread_join(test->thread);\n+    test_dbus_console_setup_listener(test);\n+}\n+\n+static gpointer\n+test_dbus_p2p_server_setup_thread(gpointer data)\n+{\n+    return test_dbus_p2p_from_fd(GPOINTER_TO_INT(data));\n+}\n+\n+static void\n+test_dbus_display_console(void)\n+{\n+    g_autoptr(GError) err = NULL;\n+    g_autoptr(GDBusConnection) conn = NULL;\n+    g_autoptr(QemuDBusDisplay1ConsoleProxy) console = NULL;\n+    g_autoptr(GUnixFDList) fd_list = NULL;\n+    g_autoptr(GMainLoop) loop = NULL;\n+    QTestState *qts = NULL;\n+    int pair[2], idx;\n+    TestDBusConsoleRegister test;\n+\n+    test_setup(&qts, &conn);\n+\n+    g_assert_cmpint(socketpair(AF_UNIX, SOCK_STREAM, 0, pair), ==, 0);\n+    fd_list = g_unix_fd_list_new();\n+    idx = g_unix_fd_list_append(fd_list, pair[1], NULL);\n+\n+    console = QEMU_DBUS_DISPLAY1_CONSOLE_PROXY(\n+        qemu_dbus_display1_console_proxy_new_sync(\n+            conn,\n+            G_DBUS_PROXY_FLAGS_NONE,\n+            NULL,\n+            \"/org/qemu/Display1/Console_0\",\n+            NULL,\n+            &err));\n+    g_assert_no_error(err);\n+\n+    test.loop = loop = g_main_loop_new(NULL, FALSE);\n+    test.thread = g_thread_new(NULL, test_dbus_p2p_server_setup_thread,\n+                               GINT_TO_POINTER(pair[0]));\n+\n+    qemu_dbus_display1_console_call_register_listener(\n+        QEMU_DBUS_DISPLAY1_CONSOLE(console),\n+        g_variant_new_handle(idx),\n+        G_DBUS_CALL_FLAGS_NONE,\n+        -1,\n+        fd_list,\n+        NULL,\n+        test_dbus_console_registered,\n+        &test);\n+\n+    g_main_loop_run(loop);\n+\n+    g_clear_object(&test.server);\n+    g_clear_object(&test.listener_conn);\n+    qtest_quit(qts);\n+}\n+\n+static void\n+test_dbus_display_keyboard(void)\n+{\n+    g_autoptr(GError) err = NULL;\n+    g_autoptr(GDBusConnection) conn = NULL;\n+    g_autoptr(QemuDBusDisplay1KeyboardProxy) keyboard = NULL;\n+    QTestState *qts = NULL;\n+\n+    test_setup(&qts, &conn);\n+\n+    keyboard = QEMU_DBUS_DISPLAY1_KEYBOARD_PROXY(\n+        qemu_dbus_display1_keyboard_proxy_new_sync(\n+            conn,\n+            G_DBUS_PROXY_FLAGS_NONE,\n+            NULL,\n+            \"/org/qemu/Display1/Console_0\",\n+            NULL,\n+            &err));\n+    g_assert_no_error(err);\n+\n+\n+    g_assert_cmpint(qtest_inb(qts, 0x64) & 0x1, ==, 0);\n+    g_assert_cmpint(qtest_inb(qts, 0x60), ==, 0);\n+\n+    qemu_dbus_display1_keyboard_call_press_sync(\n+        QEMU_DBUS_DISPLAY1_KEYBOARD(keyboard),\n+        0x1C, /* qnum enter */\n+        G_DBUS_CALL_FLAGS_NONE,\n+        -1,\n+        NULL,\n+        &err);\n+    g_assert_no_error(err);\n+\n+    /* may be should wait for interrupt? */\n+    g_assert_cmpint(qtest_inb(qts, 0x64) & 0x1, ==, 1);\n+    g_assert_cmpint(qtest_inb(qts, 0x60), ==, 0x5A); /* scan code 2 enter */\n+\n+    qemu_dbus_display1_keyboard_call_release_sync(\n+        QEMU_DBUS_DISPLAY1_KEYBOARD(keyboard),\n+        0x1C, /* qnum enter */\n+        G_DBUS_CALL_FLAGS_NONE,\n+        -1,\n+        NULL,\n+        &err);\n+    g_assert_no_error(err);\n+\n+    g_assert_cmpint(qtest_inb(qts, 0x64) & 0x1, ==, 1);\n+    g_assert_cmpint(qtest_inb(qts, 0x60), ==, 0xF0); /* scan code 2 release */\n+    g_assert_cmpint(qtest_inb(qts, 0x60), ==, 0x5A); /* scan code 2 enter */\n+\n+    g_assert_cmpint(qemu_dbus_display1_keyboard_get_modifiers(\n+                        QEMU_DBUS_DISPLAY1_KEYBOARD(keyboard)), ==, 0);\n+\n+    qtest_quit(qts);\n+}\n+\n+int\n+main(int argc, char **argv)\n+{\n+    g_test_init(&argc, &argv, NULL);\n+\n+    qtest_add_func(\"/dbus-display/vm\", test_dbus_display_vm);\n+    qtest_add_func(\"/dbus-display/console\", test_dbus_display_console);\n+    qtest_add_func(\"/dbus-display/keyboard\", test_dbus_display_keyboard);\n+\n+    return g_test_run();\n+}\ndiff --git a/tests/qtest/meson.build b/tests/qtest/meson.build\nindex 913e987409d5..1b2bde666037 100644\n--- a/tests/qtest/meson.build\n+++ b/tests/qtest/meson.build\n@@ -92,6 +92,10 @@ qtests_i386 = \\\n    'test-x86-cpuid-compat',\n    'numa-test']\n \n+if dbus_display\n+  qtests_i386 += ['dbus-display-test']\n+endif\n+\n dbus_daemon = find_program('dbus-daemon', required: false)\n if dbus_daemon.found() and config_host.has_key('GDBUS_CODEGEN')\n   # Temporarily disabled due to Patchew failures:\n@@ -265,6 +269,10 @@ qtests = {\n   'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),\n }\n \n+if dbus_display\n+qtests += {'dbus-display-test': [dbus_display1, gio]}\n+endif\n+\n qtest_executables = {}\n foreach dir : target_dirs\n   if not dir.endswith('-softmmu')\n","prefixes":["PULL","v2","28/36"]}