Files
flatpak/tests/test-portal-impl.c
Alexander Larsson 91d9fe9c60 tests: Add simple testing portal backend and wire it up to the tests
This only supports the AccessDialog call, and always just allows
everything. Still, it tests the entire codepath for authentication.
2019-10-02 14:57:11 +02:00

145 lines
5.0 KiB
C

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <gio/gio.h>
static guint name_owner_id = 0;
static GMainLoop *main_loop;
static void
access_method_call (GDBusConnection *connection,
const gchar *sender,
const gchar *object_path,
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
GDBusMethodInvocation *invocation,
gpointer user_data)
{
if (g_strcmp0 (method_name, "AccessDialog") == 0)
{
GVariantBuilder res_builder;
/* Always allow */
g_variant_builder_init (&res_builder, G_VARIANT_TYPE_VARDICT);
g_dbus_method_invocation_return_value (invocation,
g_variant_new ("(u@a{sv})",
0,
g_variant_builder_end (&res_builder)));
}
else
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD,
"Method %s is not implemented on interface %s",
method_name, interface_name);
}
static const GDBusArgInfo access_dialog_IN_ARG_handle = { -1, (gchar *) "handle", (gchar *) "o", NULL };
static const GDBusArgInfo access_dialog_IN_ARG_app_id = { -1, (gchar *) "app_id", (gchar *) "s", NULL };
static const GDBusArgInfo access_dialog_IN_ARG_parent_window = { -1, (gchar *) "parent_window", (gchar *) "s", NULL };
static const GDBusArgInfo access_dialog_IN_ARG_title = { -1, (gchar *) "title", (gchar *) "s", NULL };
static const GDBusArgInfo access_dialog_IN_ARG_subtitle = { -1, (gchar *) "subtitle", (gchar *) "s", NULL };
static const GDBusArgInfo access_dialog_IN_ARG_body = { -1, (gchar *) "body", (gchar *) "s", NULL };
static const GDBusArgInfo access_dialog_IN_ARG_options = { -1, (gchar *) "options", (gchar *) "a{sv}", NULL };
static const GDBusArgInfo * const access_dialog_IN_ARG_pointers[] = {
&access_dialog_IN_ARG_handle,
&access_dialog_IN_ARG_app_id,
&access_dialog_IN_ARG_parent_window,
&access_dialog_IN_ARG_title,
&access_dialog_IN_ARG_subtitle,
&access_dialog_IN_ARG_body,
&access_dialog_IN_ARG_options,
NULL
};
static const GDBusArgInfo access_dialog_OUT_ARG_response = { -1, (gchar *) "response", (gchar *) "u", NULL };
static const GDBusArgInfo access_dialog_OUT_ARG_results = { -1, (gchar *) "results", (gchar *) "a{sv}", NULL };
static const GDBusArgInfo * const access_dialog_OUT_ARG_pointers[] = {
&access_dialog_OUT_ARG_response,
&access_dialog_OUT_ARG_results,
NULL
};
static const GDBusMethodInfo access_dialog = {
-1,
(gchar *) "AccessDialog",
(GDBusArgInfo **) &access_dialog_IN_ARG_pointers,
(GDBusArgInfo **) &access_dialog_OUT_ARG_pointers,
NULL
};
static const GDBusMethodInfo * const access_dialog_methods[] = {
&access_dialog,
NULL
};
static const GDBusInterfaceInfo access_interface_info = {
-1,
"org.freedesktop.impl.portal.Access",
(GDBusMethodInfo **) &access_dialog_methods,
(GDBusSignalInfo **) NULL,
(GDBusPropertyInfo **) NULL,
NULL,
};
static const GDBusInterfaceVTable access_vtable = {
access_method_call, /* _method_call */
NULL, /* _get_property */
NULL /* _set_property */
};
static void
on_bus_acquired (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
GError *error = NULL;
guint registration_id;
g_debug ("Bus acquired, creating skeleton");
registration_id = g_dbus_connection_register_object (connection,
"/org/freedesktop/portal/desktop",
(GDBusInterfaceInfo *) &access_interface_info,
&access_vtable,
NULL, NULL, &error);
g_assert (registration_id != 0);
}
static void
on_name_acquired (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
g_debug ("Name acquired");
}
static void
on_name_lost (GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
g_debug ("Name lost");
}
int
main (int argc, char *argv[])
{
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
"org.freedesktop.impl.portal.desktop.test",
G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT,
on_bus_acquired,
on_name_acquired,
on_name_lost,
NULL,
NULL);
main_loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (main_loop);
return 0;
}