gio/tests: add a fake implementation of the document portal

This commit is contained in:
James Henstridge 2019-09-16 14:04:30 +02:00
parent 457d4c9fe0
commit 27db702ceb
6 changed files with 209 additions and 6 deletions

View File

@ -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 <http://www.gnu.org/licenses/>.
*
* Authors: James Henstridge <james.henstridge@canonical.com>
*/
/* 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;
}

View File

@ -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);
}

View File

@ -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
*/

View File

@ -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')

View File

@ -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

View File

@ -0,0 +1,3 @@
[D-BUS Service]
Name=org.freedesktop.portal.Documents
Exec=@installed_tests_dir@/fake-document-portal