From nobody Tue Feb 10 10:20:54 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1640073469; cv=none; d=zohomail.com; s=zohoarc; b=HqOGaDrvB9q0YdXXJ0d7rDX9d61J00JFJxZyps7D/CNrv7BHjsGnibJVe9EFTmlMLsWnWzrhp4xgne1snPh5QURoEDUgaiDmcJ6Cq0RE9Omx2Cx584vxtHgNzFax9yy/8sxjPbbRM0CGALcs7jt6QXvuAZnrALGRK2bZKlbASdg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1640073469; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Od6lCCUOGkAPzq9jfcCfkBnwxs1xDBQI7592Jvxm+Co=; b=HWIixZQb2XMATHiRsREzgpVkKNPQyobSHAgenkfPlIQfeCjwHuh3E02DbhHjOoLTncpiaIPH3sMDvE6pnmO8ifZEX5a4VVEOC6xn9yb8n0V1Pm8D45Ulz2uy2Qf8CLNqm2AqJO91v9VZTQ/LObJBsJUSWztlzvAgi4057+/3XrU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1640073469920137.67218696976295; Mon, 20 Dec 2021 23:57:49 -0800 (PST) Received: from localhost ([::1]:58208 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mza1q-00062P-KC for importer@patchew.org; Tue, 21 Dec 2021 02:57:46 -0500 Received: from eggs.gnu.org ([209.51.188.92]:59120) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mzZEo-0001go-Jc for qemu-devel@nongnu.org; Tue, 21 Dec 2021 02:07:09 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]:31258) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mzZEm-0002Tx-LW for qemu-devel@nongnu.org; Tue, 21 Dec 2021 02:07:06 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-569-xbxpD_fuOU6wZvhbCYtqrw-1; Tue, 21 Dec 2021 02:07:01 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8968F344AF; Tue, 21 Dec 2021 07:06:58 +0000 (UTC) Received: from localhost (unknown [10.39.208.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id C9A2D7EDAD; Tue, 21 Dec 2021 07:06:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1640070424; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Od6lCCUOGkAPzq9jfcCfkBnwxs1xDBQI7592Jvxm+Co=; b=Ne/hCt3PfLPr0n7zgPNqW/YDTcakPw+L6OnhtIR2Vd5LmkFlnzjoRul7VCeHpVbNo9Y4e+ NrF+aXXbB7x6iwZzzIugxfXiyNg0fUvzEgscFfMckvLc1USOXYmgpkifQXSHUKeRfslamr +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 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=marcandre.lureau@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; 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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, richard.henderson@linaro.org, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1640073470633100001 From: Marc-Andr=C3=A9 Lureau Cover basic display interface usage. More cases to be added to cover disconnections, multiple connections, corner cases. At this point, they would be better written in Rust or Python though. The proxy also covers reading the properties, since they are automatically loaded at creation. Signed-off-by: Marc-Andr=C3=A9 Lureau Acked-by: Gerd Hoffmann --- tests/qtest/dbus-display-test.c | 257 ++++++++++++++++++++++++++++++++ tests/qtest/meson.build | 8 + 2 files changed, 265 insertions(+) create mode 100644 tests/qtest/dbus-display-test.c diff --git a/tests/qtest/dbus-display-test.c b/tests/qtest/dbus-display-tes= t.c new file mode 100644 index 000000000000..43c77aff045c --- /dev/null +++ b/tests/qtest/dbus-display-test.c @@ -0,0 +1,257 @@ +#include "qemu/osdep.h" +#include "qemu/dbus.h" +#include +#include +#include "libqos/libqtest.h" +#include "qemu-common.h" +#include "dbus-display1.h" + +static GDBusConnection* +test_dbus_p2p_from_fd(int fd) +{ + g_autoptr(GError) err =3D NULL; + g_autoptr(GSocket) socket =3D NULL; + g_autoptr(GSocketConnection) socketc =3D NULL; + GDBusConnection *conn; + + socket =3D g_socket_new_from_fd(fd, &err); + g_assert_no_error(err); + + socketc =3D g_socket_connection_factory_create_connection(socket); + g_assert(socketc !=3D NULL); + + conn =3D g_dbus_connection_new_sync( + G_IO_STREAM(socketc), NULL, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | + G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, + NULL, NULL, &err); + g_assert_no_error(err); + + return conn; +} + +static void +test_setup(QTestState **qts, GDBusConnection **conn) +{ + int pair[2]; + + *qts =3D qtest_init("-display dbus,p2p=3Dyes -name dbus-test"); + + g_assert_cmpint(socketpair(AF_UNIX, SOCK_STREAM, 0, pair), =3D=3D, 0); + + qtest_qmp_add_client(*qts, "@dbus-display", pair[1]); + + *conn =3D test_dbus_p2p_from_fd(pair[0]); + g_dbus_connection_start_message_processing(*conn); +} + +static void +test_dbus_display_vm(void) +{ + g_autoptr(GError) err =3D NULL; + g_autoptr(GDBusConnection) conn =3D NULL; + g_autoptr(QemuDBusDisplay1VMProxy) vm =3D NULL; + QTestState *qts =3D NULL; + + test_setup(&qts, &conn); + + vm =3D QEMU_DBUS_DISPLAY1_VM_PROXY( + qemu_dbus_display1_vm_proxy_new_sync( + conn, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + DBUS_DISPLAY1_ROOT "/VM", + NULL, + &err)); + g_assert_no_error(err); + + g_assert_cmpstr( + qemu_dbus_display1_vm_get_name(QEMU_DBUS_DISPLAY1_VM(vm)), + =3D=3D, + "dbus-test"); + qtest_quit(qts); +} + +typedef struct TestDBusConsoleRegister { + GMainLoop *loop; + GThread *thread; + GDBusConnection *listener_conn; + GDBusObjectManagerServer *server; +} TestDBusConsoleRegister; + +static gboolean listener_handle_scanout( + QemuDBusDisplay1Listener *object, + GDBusMethodInvocation *invocation, + guint arg_width, + guint arg_height, + guint arg_stride, + guint arg_pixman_format, + GVariant *arg_data, + TestDBusConsoleRegister *test) +{ + g_main_loop_quit(test->loop); + + return DBUS_METHOD_INVOCATION_HANDLED; +} + +static void +test_dbus_console_setup_listener(TestDBusConsoleRegister *test) +{ + g_autoptr(GDBusObjectSkeleton) listener =3D NULL; + g_autoptr(QemuDBusDisplay1ListenerSkeleton) iface =3D NULL; + + test->server =3D g_dbus_object_manager_server_new(DBUS_DISPLAY1_ROOT); + listener =3D g_dbus_object_skeleton_new(DBUS_DISPLAY1_ROOT "/Listener"= ); + iface =3D QEMU_DBUS_DISPLAY1_LISTENER_SKELETON( + qemu_dbus_display1_listener_skeleton_new()); + g_object_connect(iface, + "signal::handle-scanout", listener_handle_scanout, te= st, + NULL); + g_dbus_object_skeleton_add_interface(listener, + G_DBUS_INTERFACE_SKELETON(iface)); + g_dbus_object_manager_server_export(test->server, listener); + g_dbus_object_manager_server_set_connection(test->server, + test->listener_conn); + + g_dbus_connection_start_message_processing(test->listener_conn); +} + +static void +test_dbus_console_registered(GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + TestDBusConsoleRegister *test =3D user_data; + g_autoptr(GError) err =3D NULL; + + qemu_dbus_display1_console_call_register_listener_finish( + QEMU_DBUS_DISPLAY1_CONSOLE(source_object), + NULL, res, &err); + g_assert_no_error(err); + + test->listener_conn =3D g_thread_join(test->thread); + test_dbus_console_setup_listener(test); +} + +static gpointer +test_dbus_p2p_server_setup_thread(gpointer data) +{ + return test_dbus_p2p_from_fd(GPOINTER_TO_INT(data)); +} + +static void +test_dbus_display_console(void) +{ + g_autoptr(GError) err =3D NULL; + g_autoptr(GDBusConnection) conn =3D NULL; + g_autoptr(QemuDBusDisplay1ConsoleProxy) console =3D NULL; + g_autoptr(GUnixFDList) fd_list =3D NULL; + g_autoptr(GMainLoop) loop =3D NULL; + QTestState *qts =3D NULL; + int pair[2], idx; + TestDBusConsoleRegister test; + + test_setup(&qts, &conn); + + g_assert_cmpint(socketpair(AF_UNIX, SOCK_STREAM, 0, pair), =3D=3D, 0); + fd_list =3D g_unix_fd_list_new(); + idx =3D g_unix_fd_list_append(fd_list, pair[1], NULL); + + console =3D QEMU_DBUS_DISPLAY1_CONSOLE_PROXY( + qemu_dbus_display1_console_proxy_new_sync( + conn, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "/org/qemu/Display1/Console_0", + NULL, + &err)); + g_assert_no_error(err); + + test.loop =3D loop =3D g_main_loop_new(NULL, FALSE); + test.thread =3D g_thread_new(NULL, test_dbus_p2p_server_setup_thread, + GINT_TO_POINTER(pair[0])); + + qemu_dbus_display1_console_call_register_listener( + QEMU_DBUS_DISPLAY1_CONSOLE(console), + g_variant_new_handle(idx), + G_DBUS_CALL_FLAGS_NONE, + -1, + fd_list, + NULL, + test_dbus_console_registered, + &test); + + g_main_loop_run(loop); + + g_clear_object(&test.server); + g_clear_object(&test.listener_conn); + qtest_quit(qts); +} + +static void +test_dbus_display_keyboard(void) +{ + g_autoptr(GError) err =3D NULL; + g_autoptr(GDBusConnection) conn =3D NULL; + g_autoptr(QemuDBusDisplay1KeyboardProxy) keyboard =3D NULL; + QTestState *qts =3D NULL; + + test_setup(&qts, &conn); + + keyboard =3D QEMU_DBUS_DISPLAY1_KEYBOARD_PROXY( + qemu_dbus_display1_keyboard_proxy_new_sync( + conn, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "/org/qemu/Display1/Console_0", + NULL, + &err)); + g_assert_no_error(err); + + + g_assert_cmpint(qtest_inb(qts, 0x64) & 0x1, =3D=3D, 0); + g_assert_cmpint(qtest_inb(qts, 0x60), =3D=3D, 0); + + qemu_dbus_display1_keyboard_call_press_sync( + QEMU_DBUS_DISPLAY1_KEYBOARD(keyboard), + 0x1C, /* qnum enter */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &err); + g_assert_no_error(err); + + /* may be should wait for interrupt? */ + g_assert_cmpint(qtest_inb(qts, 0x64) & 0x1, =3D=3D, 1); + g_assert_cmpint(qtest_inb(qts, 0x60), =3D=3D, 0x5A); /* scan code 2 en= ter */ + + qemu_dbus_display1_keyboard_call_release_sync( + QEMU_DBUS_DISPLAY1_KEYBOARD(keyboard), + 0x1C, /* qnum enter */ + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &err); + g_assert_no_error(err); + + g_assert_cmpint(qtest_inb(qts, 0x64) & 0x1, =3D=3D, 1); + g_assert_cmpint(qtest_inb(qts, 0x60), =3D=3D, 0xF0); /* scan code 2 re= lease */ + g_assert_cmpint(qtest_inb(qts, 0x60), =3D=3D, 0x5A); /* scan code 2 en= ter */ + + g_assert_cmpint(qemu_dbus_display1_keyboard_get_modifiers( + QEMU_DBUS_DISPLAY1_KEYBOARD(keyboard)), =3D=3D, 0); + + qtest_quit(qts); +} + +int +main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + qtest_add_func("/dbus-display/vm", test_dbus_display_vm); + qtest_add_func("/dbus-display/console", test_dbus_display_console); + qtest_add_func("/dbus-display/keyboard", test_dbus_display_keyboard); + + return g_test_run(); +} diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 913e987409d5..1b2bde666037 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -92,6 +92,10 @@ qtests_i386 =3D \ 'test-x86-cpuid-compat', 'numa-test'] =20 +if dbus_display + qtests_i386 +=3D ['dbus-display-test'] +endif + dbus_daemon =3D find_program('dbus-daemon', required: false) if dbus_daemon.found() and config_host.has_key('GDBUS_CODEGEN') # Temporarily disabled due to Patchew failures: @@ -265,6 +269,10 @@ qtests =3D { 'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'), } =20 +if dbus_display +qtests +=3D {'dbus-display-test': [dbus_display1, gio]} +endif + qtest_executables =3D {} foreach dir : target_dirs if not dir.endswith('-softmmu') --=20 2.34.1.8.g35151cf07204