From 27db702ceb9e3b4c612eaa7eb6502bb1e8b8fee0 Mon Sep 17 00:00:00 2001 From: James Henstridge Date: Mon, 16 Sep 2019 14:04:30 +0200 Subject: [PATCH] gio/tests: add a fake implementation of the document portal --- gio/tests/fake-document-portal.c | 136 ++++++++++++++++++ gio/tests/gdbus-sessionbus.c | 13 ++ gio/tests/gdbus-test-fixture.c | 12 +- gio/tests/meson.build | 21 ++- gio/tests/services/meson.build | 30 ++++ ...rg.freedesktop.portal.Documents.service.in | 3 + 6 files changed, 209 insertions(+), 6 deletions(-) create mode 100644 gio/tests/fake-document-portal.c create mode 100644 gio/tests/services/meson.build create mode 100644 gio/tests/services/org.freedesktop.portal.Documents.service.in diff --git a/gio/tests/fake-document-portal.c b/gio/tests/fake-document-portal.c new file mode 100644 index 000000000..bb2b4e95d --- /dev/null +++ b/gio/tests/fake-document-portal.c @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2019 Canonical Limited + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see . + * + * Authors: James Henstridge + */ + +/* A stub implementation of xdg-document-portal covering enough to + * support g_document_portal_add_documents */ + +#include "fake-document-portal-generated.h" + +static gboolean +on_handle_get_mount_point (FakeDocuments *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + fake_documents_complete_get_mount_point (object, + invocation, + "/document-portal"); + return TRUE; +} + +static gboolean +on_handle_add_full (FakeDocuments *object, + GDBusMethodInvocation *invocation, + GVariant *o_path_fds, + guint flags, + const gchar *app_id, + const gchar *permissions, + gpointer user_data) +{ + const gchar **doc_ids = NULL; + GVariant *extra_out = NULL; + gsize length, i; + + length = g_variant_get_size (o_path_fds); + doc_ids = g_new0 (const gchar *, length); + for (i = 0; i < length; i++) + { + doc_ids[i] = "document-id"; + } + extra_out = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0); + + fake_documents_complete_add_full (object, + invocation, + NULL, + doc_ids, + extra_out); + + g_free (doc_ids); + + return TRUE; +} + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + FakeDocuments *interface; + GError *error = NULL; + + g_test_message ("Acquired a message bus connection"); + + interface = fake_documents_skeleton_new (); + g_signal_connect (interface, + "handle-get-mount-point", + G_CALLBACK (on_handle_get_mount_point), + NULL); + g_signal_connect (interface, + "handle-add-full", + G_CALLBACK (on_handle_add_full), + NULL); + + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (interface), + connection, + "/org/freedesktop/portal/documents", + &error); + g_assert_no_error (error); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_test_message ("Acquired the name %s", name); +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_test_message ("Lost the name %s", name); +} + + +gint +main (gint argc, gchar *argv[]) +{ + GMainLoop *loop; + guint id; + + loop = g_main_loop_new (NULL, FALSE); + + id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.freedesktop.portal.Documents", + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + loop, + NULL); + + g_main_loop_run (loop); + + g_bus_unown_name (id); + g_main_loop_unref (loop); + + return 0; +} diff --git a/gio/tests/gdbus-sessionbus.c b/gio/tests/gdbus-sessionbus.c index e90096973..29f05d414 100644 --- a/gio/tests/gdbus-sessionbus.c +++ b/gio/tests/gdbus-sessionbus.c @@ -25,8 +25,21 @@ static GTestDBus *singleton = NULL; void session_bus_up (void) { + gchar *relative, *servicesdir; g_assert (singleton == NULL); singleton = g_test_dbus_new (G_TEST_DBUS_NONE); + + /* We ignore deprecations here so that gdbus-test-codegen-old can + * build successfully despite these two functions not being + * available in GLib 2.36 */ + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + relative = g_test_build_filename (G_TEST_BUILT, "services", NULL); + servicesdir = g_canonicalize_filename (relative, NULL); + G_GNUC_END_IGNORE_DEPRECATIONS + g_free (relative); + + g_test_dbus_add_service_dir (singleton, servicesdir); + g_free (servicesdir); g_test_dbus_up (singleton); } diff --git a/gio/tests/gdbus-test-fixture.c b/gio/tests/gdbus-test-fixture.c index f8b9b93b6..2071bbad9 100644 --- a/gio/tests/gdbus-test-fixture.c +++ b/gio/tests/gdbus-test-fixture.c @@ -15,16 +15,20 @@ static void fixture_setup (TestFixture *fixture, gconstpointer unused) { GError *error = NULL; + gchar *relative, *servicesdir; /* Create the global dbus-daemon for this test suite */ fixture->dbus = g_test_dbus_new (G_TEST_DBUS_NONE); - /* Add the private directory with our in-tree service files, - * TEST_SERVICES is defined by the build system to point - * to the right directory. + /* Add the private directory with our in-tree service files. */ - g_test_dbus_add_service_dir (fixture->dbus, TEST_SERVICES); + relative = g_test_build_filename (G_TEST_BUILT, "services", NULL); + servicesdir = g_canonicalize_filename (relative, NULL); + g_free (relative); + + g_test_dbus_add_service_dir (fixture->dbus, servicesdir); + g_free (servicesdir); /* Start the private D-Bus daemon */ diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 890f7b74d..7a664d493 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -7,7 +7,6 @@ common_gio_tests_deps = [ test_c_args = [ '-DG_LOG_DOMAIN="GLib-GIO"', - '-DTEST_SERVICES="@0@/gio/tests/services"'.format(meson.build_root()), '-DGLIB_MKENUMS="@0@"'.format(glib_mkenums), '-DGLIB_COMPILE_SCHEMAS="@0@"'.format(glib_compile_schemas.full_path()), '-UG_DISABLE_ASSERT', @@ -311,6 +310,24 @@ if host_machine.system() != 'windows' }, } endif + + fake_document_portal_generated = custom_target('fake-document-portal-generated', + input : ['../org.freedesktop.portal.Documents.xml'], + output : ['fake-document-portal-generated.h', + 'fake-document-portal-generated.c'], + depend_files : gdbus_codegen_built_files, + command : [python, gdbus_codegen, + '--interface-prefix', 'org.freedesktop.portal.', + '--output-directory', '@OUTDIR@', + '--generate-c-code', 'fake-document-portal-generated', + '--c-namespace', 'Fake', + '@INPUT@']) + + test_extra_programs += { + 'fake-document-portal' : { + 'extra_sources': fake_document_portal_generated, + }, + } endif # have_dbus_daemon # This test is currently unreliable @@ -781,5 +798,5 @@ if installed_tests_enabled ) endif -# FIXME: subdir('services') +subdir('services') subdir('modules') diff --git a/gio/tests/services/meson.build b/gio/tests/services/meson.build new file mode 100644 index 000000000..059eeb667 --- /dev/null +++ b/gio/tests/services/meson.build @@ -0,0 +1,30 @@ +dbus_service_files = [ + 'org.freedesktop.portal.Documents.service', +] + +srcdir_cdata = configuration_data() +srcdir_cdata.set('installed_tests_dir', meson.current_build_dir() / '..') + +installed_cdata = configuration_data() +installed_cdata.set('installed_tests_dir', installed_tests_execdir) + +foreach service_file : dbus_service_files + configure_file( + input: service_file + '.in', + output: service_file, + configuration: srcdir_cdata, + ) + if installed_tests_enabled + # Build a second copy of the service file for the installed + # version of the tests. + configure_file( + input: service_file + '.in', + output: service_file + '.to-install', + configuration: installed_cdata, + ) + install_data(meson.current_build_dir() / service_file + '.to-install', + install_dir: installed_tests_execdir / 'services', + rename: [service_file], + ) + endif +endforeach diff --git a/gio/tests/services/org.freedesktop.portal.Documents.service.in b/gio/tests/services/org.freedesktop.portal.Documents.service.in new file mode 100644 index 000000000..2769ff7b6 --- /dev/null +++ b/gio/tests/services/org.freedesktop.portal.Documents.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.freedesktop.portal.Documents +Exec=@installed_tests_dir@/fake-document-portal