diff options
Diffstat (limited to 'gio/tests/dbus-appinfo.c')
-rw-r--r-- | gio/tests/dbus-appinfo.c | 226 |
1 files changed, 220 insertions, 6 deletions
diff --git a/gio/tests/dbus-appinfo.c b/gio/tests/dbus-appinfo.c index 80861fdd1..d2f8e5074 100644 --- a/gio/tests/dbus-appinfo.c +++ b/gio/tests/dbus-appinfo.c @@ -1,5 +1,6 @@ /* * Copyright © 2013 Canonical Limited + * Copyright © 2024 GNOME Foundation Inc. * * SPDX-License-Identifier: LGPL-2.1-or-later * @@ -17,12 +18,14 @@ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. * * Authors: Ryan Lortie <desrt@desrt.ca> + * Julian Sparber <jsparber@gnome.org> */ #include <gio/gio.h> #include <gio/gdesktopappinfo.h> #include "gdbus-sessionbus.h" +#include "fake-desktop-portal.h" #include "fake-document-portal.h" static GDesktopAppInfo *appinfo; @@ -290,6 +293,11 @@ test_dbus_appinfo (void) g_object_unref (app); } +static GType test_flatpak_application_get_type (void); +typedef GApplication TestFlatpakApplication; +typedef GApplicationClass TestFlatpakApplicationClass; +G_DEFINE_TYPE (TestFlatpakApplication, test_flatpak_application, G_TYPE_APPLICATION) + static void on_flatpak_launch_uris_finish (GObject *object, GAsyncResult *result, @@ -300,6 +308,8 @@ on_flatpak_launch_uris_finish (GObject *object, g_app_info_launch_uris_finish (G_APP_INFO (object), result, &error); g_assert_no_error (error); + g_assert_true (requested_startup_id); + g_assert_true (saw_startup_id); g_application_release (app); } @@ -308,6 +318,7 @@ static void on_flatpak_activate (GApplication *app, gpointer user_data) { + GAppLaunchContext *ctx; GDesktopAppInfo *flatpak_appinfo = user_data; char *uri; GList *uris; @@ -318,8 +329,12 @@ on_flatpak_activate (GApplication *app, uri = g_filename_to_uri (g_desktop_app_info_get_filename (flatpak_appinfo), NULL, NULL); g_assert_nonnull (uri); uris = g_list_prepend (NULL, uri); - g_app_info_launch_uris_async (G_APP_INFO (flatpak_appinfo), uris, NULL, + ctx = g_object_new (test_app_launch_context_get_type (), NULL); + requested_startup_id = FALSE; + saw_startup_id = FALSE; + g_app_info_launch_uris_async (G_APP_INFO (flatpak_appinfo), uris, ctx, NULL, on_flatpak_launch_uris_finish, app); + g_object_unref (ctx); g_list_free (uris); g_free (uri); } @@ -342,6 +357,17 @@ on_flatpak_open (GApplication *app, } static void +test_flatpak_application_init (TestApplication *app) +{ +} + +static void +test_flatpak_application_class_init (GApplicationClass *class) +{ + class->before_emit = test_application_before_emit; +} + +static void test_flatpak_doc_export (void) { const gchar *argv[] = { "myapp", NULL }; @@ -364,8 +390,10 @@ test_flatpak_doc_export (void) g_assert_nonnull (flatpak_appinfo); g_free (desktop_file); - app = g_application_new ("org.gtk.test.dbusappinfo.flatpak", - G_APPLICATION_HANDLES_OPEN); + app = g_object_new (test_flatpak_application_get_type (), + "application-id", "org.gtk.test.dbusappinfo.flatpak", + "flags", G_APPLICATION_HANDLES_OPEN, + NULL); g_signal_connect (app, "activate", G_CALLBACK (on_flatpak_activate), flatpak_appinfo); g_signal_connect (app, "open", G_CALLBACK (on_flatpak_open), NULL); @@ -389,6 +417,8 @@ on_flatpak_launch_invalid_uri_finish (GObject *object, g_app_info_launch_uris_finish (G_APP_INFO (object), result, &error); g_assert_no_error (error); + g_assert_true (requested_startup_id); + g_assert_true (saw_startup_id); g_application_release (app); } @@ -397,6 +427,7 @@ static void on_flatpak_activate_invalid_uri (GApplication *app, gpointer user_data) { + GAppLaunchContext *ctx; GDesktopAppInfo *flatpak_appinfo = user_data; GList *uris; @@ -404,8 +435,12 @@ on_flatpak_activate_invalid_uri (GApplication *app, g_application_hold (app); uris = g_list_prepend (NULL, "file:///hopefully/an/invalid/path.desktop"); - g_app_info_launch_uris_async (G_APP_INFO (flatpak_appinfo), uris, NULL, + ctx = g_object_new (test_app_launch_context_get_type (), NULL); + requested_startup_id = FALSE; + saw_startup_id = FALSE; + g_app_info_launch_uris_async (G_APP_INFO (flatpak_appinfo), uris, ctx, NULL, on_flatpak_launch_invalid_uri_finish, app); + g_object_unref (ctx); g_list_free (uris); } @@ -448,8 +483,10 @@ test_flatpak_missing_doc_export (void) flatpak_appinfo = g_desktop_app_info_new_from_filename (desktop_file); g_assert_nonnull (flatpak_appinfo); - app = g_application_new ("org.gtk.test.dbusappinfo.flatpak", - G_APPLICATION_HANDLES_OPEN); + app = g_object_new (test_flatpak_application_get_type (), + "application-id", "org.gtk.test.dbusappinfo.flatpak", + "flags", G_APPLICATION_HANDLES_OPEN, + NULL); g_signal_connect (app, "activate", G_CALLBACK (on_flatpak_activate_invalid_uri), flatpak_appinfo); g_signal_connect (app, "open", G_CALLBACK (on_flatpak_open_invalid_uri), NULL); @@ -464,14 +501,191 @@ test_flatpak_missing_doc_export (void) g_clear_object (&thread); } +static void +check_portal_openuri_call (const char *expected_uri, + GFakeDesktopPortalThread *thread) +{ + const char *activation_token = NULL; + GFile *expected_file = NULL; + GFile *file = NULL; + const char *uri = NULL; + + activation_token = g_fake_desktop_portal_thread_get_last_request_activation_token (thread); + uri = g_fake_desktop_portal_thread_get_last_request_uri (thread); + + g_assert_cmpstr (activation_token, ==, "expected startup id"); + g_assert_nonnull (uri); + + expected_file = g_file_new_for_uri (expected_uri); + file = g_file_new_for_uri (uri); + g_assert_true (g_file_equal (expected_file, file)); + + g_object_unref (file); + g_object_unref (expected_file); +} + +static void +test_portal_open_file (void) +{ + GAppLaunchContext *ctx; + GError *error = NULL; + char *uri; + GFakeDesktopPortalThread *thread = NULL; + + /* Run a fake-desktop-portal */ + thread = g_fake_desktop_portal_thread_new (session_bus_get_address ()); + g_fake_desktop_portal_thread_run (thread); + + uri = g_filename_to_uri (g_test_get_filename (G_TEST_DIST, + "org.gtk.test.dbusappinfo.flatpak.desktop", + NULL), + NULL, + NULL); + + ctx = g_object_new (test_app_launch_context_get_type (), NULL); + + requested_startup_id = FALSE; + + g_app_info_launch_default_for_uri (uri, ctx, &error); + + g_assert_no_error (error); + g_assert_true (requested_startup_id); + + g_fake_desktop_portal_thread_stop (thread); + check_portal_openuri_call (uri, thread); + + g_clear_object (&ctx); + g_clear_object (&thread); + g_clear_pointer (&uri, g_free); +} + +static void +test_portal_open_uri (void) +{ + GAppLaunchContext *ctx; + GError *error = NULL; + const char *uri = "http://example.com"; + GFakeDesktopPortalThread *thread = NULL; + + /* Run a fake-desktop-portal */ + thread = g_fake_desktop_portal_thread_new (session_bus_get_address ()); + g_fake_desktop_portal_thread_run (thread); + + ctx = g_object_new (test_app_launch_context_get_type (), NULL); + + requested_startup_id = FALSE; + + g_app_info_launch_default_for_uri (uri, ctx, &error); + + g_assert_no_error (error); + g_assert_true (requested_startup_id); + + g_fake_desktop_portal_thread_stop (thread); + check_portal_openuri_call (uri, thread); + + g_clear_object (&ctx); + g_clear_object (&thread); +} + +static void +on_launch_default_for_uri_finished (GObject *object, + GAsyncResult *result, + gpointer user_data) +{ + GError *error = NULL; + gboolean *called = user_data; + + g_app_info_launch_default_for_uri_finish (result, &error); + g_assert_no_error (error); + + *called = TRUE; + + g_main_context_wakeup (NULL); +} + +static void +test_portal_open_file_async (void) +{ + GAppLaunchContext *ctx; + gboolean called = FALSE; + char *uri; + GFakeDesktopPortalThread *thread = NULL; + + /* Run a fake-desktop-portal */ + thread = g_fake_desktop_portal_thread_new (session_bus_get_address ()); + g_fake_desktop_portal_thread_run (thread); + + uri = g_filename_to_uri (g_test_get_filename (G_TEST_DIST, + "org.gtk.test.dbusappinfo.flatpak.desktop", + NULL), + NULL, + NULL); + + ctx = g_object_new (test_app_launch_context_get_type (), NULL); + + requested_startup_id = FALSE; + + g_app_info_launch_default_for_uri_async (uri, ctx, + NULL, on_launch_default_for_uri_finished, &called); + + while (!called) + g_main_context_iteration (NULL, TRUE); + + g_assert_true (requested_startup_id); + + g_fake_desktop_portal_thread_stop (thread); + check_portal_openuri_call (uri, thread); + + g_clear_pointer (&uri, g_free); + g_clear_object (&ctx); + g_clear_object (&thread); +} + +static void +test_portal_open_uri_async (void) +{ + GAppLaunchContext *ctx; + gboolean called = FALSE; + const char *uri = "http://example.com"; + GFakeDesktopPortalThread *thread = NULL; + + /* Run a fake-desktop-portal */ + thread = g_fake_desktop_portal_thread_new (session_bus_get_address ()); + g_fake_desktop_portal_thread_run (thread); + + ctx = g_object_new (test_app_launch_context_get_type (), NULL); + + requested_startup_id = FALSE; + + g_app_info_launch_default_for_uri_async (uri, ctx, + NULL, on_launch_default_for_uri_finished, &called); + + while (!called) + g_main_context_iteration (NULL, TRUE); + + g_assert_true (requested_startup_id); + + g_fake_desktop_portal_thread_stop (thread); + check_portal_openuri_call (uri, thread); + + g_clear_object (&ctx); + g_clear_object (&thread); +} + int main (int argc, char **argv) { g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); + g_setenv ("GIO_USE_PORTALS", "1", TRUE); + g_test_add_func ("/appinfo/dbusappinfo", test_dbus_appinfo); g_test_add_func ("/appinfo/flatpak-doc-export", test_flatpak_doc_export); g_test_add_func ("/appinfo/flatpak-missing-doc-export", test_flatpak_missing_doc_export); + g_test_add_func ("/appinfo/portal-open-file", test_portal_open_file); + g_test_add_func ("/appinfo/portal-open-uri", test_portal_open_uri); + g_test_add_func ("/appinfo/portal-open-file-async", test_portal_open_file_async); + g_test_add_func ("/appinfo/portal-open-uri-async", test_portal_open_uri_async); return session_bus_run (); } |