| |
| #include <locale.h> |
| #include <string.h> |
| |
| #include <glib/gstdio.h> |
| #include <gio/gio.h> |
| #include <gio/gdesktopappinfo.h> |
| |
| static void |
| test_launch_for_app_info (GAppInfo *appinfo) |
| { |
| GError *error; |
| GFile *file; |
| GList *l; |
| const gchar *path; |
| gchar *uri; |
| |
| if (g_getenv ("DISPLAY") == NULL || g_getenv ("DISPLAY")[0] == '\0') |
| { |
| g_test_skip ("No DISPLAY set"); |
| return; |
| } |
| |
| error = NULL; |
| g_assert (g_app_info_launch (appinfo, NULL, NULL, &error)); |
| g_assert_no_error (error); |
| |
| g_assert (g_app_info_launch_uris (appinfo, NULL, NULL, &error)); |
| g_assert_no_error (error); |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| file = g_file_new_for_path (path); |
| l = NULL; |
| l = g_list_append (l, file); |
| |
| g_assert (g_app_info_launch (appinfo, l, NULL, &error)); |
| g_assert_no_error (error); |
| g_list_free (l); |
| g_object_unref (file); |
| |
| l = NULL; |
| uri = g_strconcat ("file://", g_test_get_dir (G_TEST_DIST), "/appinfo-test.desktop", NULL); |
| l = g_list_append (l, uri); |
| l = g_list_append (l, "file:///etc/group#adm"); |
| |
| g_assert (g_app_info_launch_uris (appinfo, l, NULL, &error)); |
| g_assert_no_error (error); |
| g_list_free (l); |
| g_free (uri); |
| } |
| |
| static void |
| test_launch (void) |
| { |
| GAppInfo *appinfo; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| g_assert (appinfo != NULL); |
| |
| test_launch_for_app_info (appinfo); |
| g_object_unref (appinfo); |
| } |
| |
| static void |
| test_launch_no_app_id (void) |
| { |
| const gchar desktop_file_base_contents[] = |
| "[Desktop Entry]\n" |
| "Type=Application\n" |
| "GenericName=generic-appinfo-test\n" |
| "Name=appinfo-test\n" |
| "Name[de]=appinfo-test-de\n" |
| "X-GNOME-FullName=example\n" |
| "X-GNOME-FullName[de]=Beispiel\n" |
| "Comment=GAppInfo example\n" |
| "Comment[de]=GAppInfo Beispiel\n" |
| "Icon=testicon.svg\n" |
| "Terminal=true\n" |
| "StartupNotify=true\n" |
| "StartupWMClass=appinfo-class\n" |
| "MimeType=image/png;image/jpeg;\n" |
| "Keywords=keyword1;test keyword;\n" |
| "Categories=GNOME;GTK;\n"; |
| |
| const char *exec_line_variants[] = { |
| "Exec=./appinfo-test --option %U %i --name %c --filename %k %m %%", |
| "Exec=./appinfo-test --option %u %i --name %c --filename %k %m %%" |
| }; |
| |
| gsize i; |
| |
| g_test_bug ("791337"); |
| |
| for (i = 0; i < G_N_ELEMENTS (exec_line_variants); i++) |
| { |
| gchar *desktop_file_contents; |
| GKeyFile *fake_desktop_file; |
| GAppInfo *appinfo; |
| gboolean loaded; |
| |
| g_test_message ("Exec line variant #%" G_GSIZE_FORMAT, i); |
| |
| desktop_file_contents = g_strdup_printf ("%s\n%s", |
| desktop_file_base_contents, |
| exec_line_variants[i]); |
| |
| /* We load a desktop file from memory to force the app not |
| * to have an app ID, which would check different codepaths. |
| */ |
| fake_desktop_file = g_key_file_new (); |
| loaded = g_key_file_load_from_data (fake_desktop_file, desktop_file_contents, -1, G_KEY_FILE_NONE, NULL); |
| g_assert_true (loaded); |
| |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_keyfile (fake_desktop_file); |
| g_assert (appinfo != NULL); |
| |
| test_launch_for_app_info (appinfo); |
| |
| g_free (desktop_file_contents); |
| g_object_unref (appinfo); |
| g_key_file_unref (fake_desktop_file); |
| } |
| } |
| |
| static void |
| test_locale (const char *locale) |
| { |
| GAppInfo *appinfo; |
| gchar *orig = NULL; |
| const gchar *path; |
| |
| orig = g_strdup (setlocale (LC_ALL, NULL)); |
| g_setenv ("LANGUAGE", locale, TRUE); |
| setlocale (LC_ALL, ""); |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| |
| if (g_strcmp0 (locale, "C") == 0) |
| { |
| g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "appinfo-test"); |
| g_assert_cmpstr (g_app_info_get_description (appinfo), ==, "GAppInfo example"); |
| g_assert_cmpstr (g_app_info_get_display_name (appinfo), ==, "example"); |
| } |
| else if (g_str_has_prefix (locale, "en")) |
| { |
| g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "appinfo-test"); |
| g_assert_cmpstr (g_app_info_get_description (appinfo), ==, "GAppInfo example"); |
| g_assert_cmpstr (g_app_info_get_display_name (appinfo), ==, "example"); |
| } |
| else if (g_str_has_prefix (locale, "de")) |
| { |
| g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "appinfo-test-de"); |
| g_assert_cmpstr (g_app_info_get_description (appinfo), ==, "GAppInfo Beispiel"); |
| g_assert_cmpstr (g_app_info_get_display_name (appinfo), ==, "Beispiel"); |
| } |
| |
| g_object_unref (appinfo); |
| |
| g_setenv ("LANGUAGE", orig, TRUE); |
| setlocale (LC_ALL, ""); |
| g_free (orig); |
| } |
| |
| static void |
| test_text (void) |
| { |
| test_locale ("C"); |
| test_locale ("en_US"); |
| test_locale ("de"); |
| test_locale ("de_DE.UTF-8"); |
| } |
| |
| static void |
| test_basic (void) |
| { |
| GAppInfo *appinfo; |
| GAppInfo *appinfo2; |
| GIcon *icon, *icon2; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| |
| g_assert_cmpstr (g_app_info_get_id (appinfo), ==, "appinfo-test.desktop"); |
| g_assert (strstr (g_app_info_get_executable (appinfo), "appinfo-test") != NULL); |
| |
| icon = g_app_info_get_icon (appinfo); |
| g_assert (G_IS_THEMED_ICON (icon)); |
| icon2 = g_themed_icon_new ("testicon"); |
| g_assert (g_icon_equal (icon, icon2)); |
| g_object_unref (icon2); |
| |
| appinfo2 = g_app_info_dup (appinfo); |
| g_assert_cmpstr (g_app_info_get_id (appinfo), ==, g_app_info_get_id (appinfo2)); |
| g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); |
| |
| g_object_unref (appinfo); |
| g_object_unref (appinfo2); |
| } |
| |
| static void |
| test_show_in (void) |
| { |
| GAppInfo *appinfo; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| g_assert (g_app_info_should_show (appinfo)); |
| g_object_unref (appinfo); |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test-gnome.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| g_assert (g_app_info_should_show (appinfo)); |
| g_object_unref (appinfo); |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test-notgnome.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| g_assert (!g_app_info_should_show (appinfo)); |
| g_object_unref (appinfo); |
| } |
| |
| static void |
| test_commandline (void) |
| { |
| GAppInfo *appinfo; |
| GError *error; |
| gchar *cmdline; |
| gchar *cmdline_out; |
| |
| cmdline = g_strconcat (g_test_get_dir (G_TEST_BUILT), "/appinfo-test --option", NULL); |
| cmdline_out = g_strconcat (cmdline, " %u", NULL); |
| |
| error = NULL; |
| appinfo = g_app_info_create_from_commandline (cmdline, |
| "cmdline-app-test", |
| G_APP_INFO_CREATE_SUPPORTS_URIS, |
| &error); |
| g_assert (appinfo != NULL); |
| g_assert_no_error (error); |
| g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "cmdline-app-test"); |
| g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, cmdline_out); |
| g_assert (g_app_info_supports_uris (appinfo)); |
| g_assert (!g_app_info_supports_files (appinfo)); |
| |
| g_object_unref (appinfo); |
| |
| g_free (cmdline_out); |
| cmdline_out = g_strconcat (cmdline, " %f", NULL); |
| |
| error = NULL; |
| appinfo = g_app_info_create_from_commandline (cmdline, |
| "cmdline-app-test", |
| G_APP_INFO_CREATE_NONE, |
| &error); |
| g_assert (appinfo != NULL); |
| g_assert_no_error (error); |
| g_assert_cmpstr (g_app_info_get_name (appinfo), ==, "cmdline-app-test"); |
| g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, cmdline_out); |
| g_assert (!g_app_info_supports_uris (appinfo)); |
| g_assert (g_app_info_supports_files (appinfo)); |
| |
| g_object_unref (appinfo); |
| |
| g_free (cmdline); |
| g_free (cmdline_out); |
| } |
| |
| static void |
| test_launch_context (void) |
| { |
| GAppLaunchContext *context; |
| GAppInfo *appinfo; |
| gchar *str; |
| gchar *cmdline; |
| |
| cmdline = g_strconcat (g_test_get_dir (G_TEST_BUILT), "/appinfo-test --option", NULL); |
| |
| context = g_app_launch_context_new (); |
| appinfo = g_app_info_create_from_commandline (cmdline, |
| "cmdline-app-test", |
| G_APP_INFO_CREATE_SUPPORTS_URIS, |
| NULL); |
| |
| str = g_app_launch_context_get_display (context, appinfo, NULL); |
| g_assert (str == NULL); |
| |
| str = g_app_launch_context_get_startup_notify_id (context, appinfo, NULL); |
| g_assert (str == NULL); |
| |
| g_object_unref (appinfo); |
| g_object_unref (context); |
| |
| g_free (cmdline); |
| } |
| |
| static gboolean launched_reached; |
| |
| static void |
| launched (GAppLaunchContext *context, |
| GAppInfo *info, |
| GVariant *platform_data, |
| gpointer user_data) |
| { |
| gint pid; |
| |
| pid = 0; |
| g_assert (g_variant_lookup (platform_data, "pid", "i", &pid)); |
| g_assert (pid != 0); |
| |
| launched_reached = TRUE; |
| } |
| |
| static void |
| launch_failed (GAppLaunchContext *context, |
| const gchar *startup_notify_id) |
| { |
| g_assert_not_reached (); |
| } |
| |
| static void |
| test_launch_context_signals (void) |
| { |
| GAppLaunchContext *context; |
| GAppInfo *appinfo; |
| GError *error = NULL; |
| gchar *cmdline; |
| |
| cmdline = g_strconcat (g_test_get_dir (G_TEST_BUILT), "/appinfo-test --option", NULL); |
| |
| context = g_app_launch_context_new (); |
| g_signal_connect (context, "launched", G_CALLBACK (launched), NULL); |
| g_signal_connect (context, "launch_failed", G_CALLBACK (launch_failed), NULL); |
| appinfo = g_app_info_create_from_commandline (cmdline, |
| "cmdline-app-test", |
| G_APP_INFO_CREATE_SUPPORTS_URIS, |
| NULL); |
| |
| error = NULL; |
| g_assert (g_app_info_launch (appinfo, NULL, context, &error)); |
| g_assert_no_error (error); |
| |
| g_assert (launched_reached); |
| |
| g_object_unref (appinfo); |
| g_object_unref (context); |
| |
| g_free (cmdline); |
| } |
| |
| static void |
| test_tryexec (void) |
| { |
| GAppInfo *appinfo; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test2.desktop", NULL); |
| appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); |
| |
| g_assert (appinfo == NULL); |
| } |
| |
| /* Test that we can set an appinfo as default for a mime type or |
| * file extension, and also add and remove handled mime types. |
| */ |
| static void |
| test_associations (void) |
| { |
| GAppInfo *appinfo; |
| GAppInfo *appinfo2; |
| GError *error; |
| gboolean result; |
| GList *list; |
| gchar *cmdline; |
| |
| cmdline = g_strconcat (g_test_get_dir (G_TEST_BUILT), "/appinfo-test --option", NULL); |
| appinfo = g_app_info_create_from_commandline (cmdline, |
| "cmdline-app-test", |
| G_APP_INFO_CREATE_SUPPORTS_URIS, |
| NULL); |
| g_free (cmdline); |
| |
| error = NULL; |
| result = g_app_info_set_as_default_for_type (appinfo, "application/x-glib-test", &error); |
| |
| g_assert (result); |
| g_assert_no_error (error); |
| |
| appinfo2 = g_app_info_get_default_for_type ("application/x-glib-test", FALSE); |
| |
| g_assert (appinfo2); |
| g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); |
| |
| g_object_unref (appinfo2); |
| |
| result = g_app_info_set_as_default_for_extension (appinfo, "gio-tests", &error); |
| g_assert (result); |
| g_assert_no_error (error); |
| |
| appinfo2 = g_app_info_get_default_for_type ("application/x-extension-gio-tests", FALSE); |
| |
| g_assert (appinfo2); |
| g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); |
| |
| g_object_unref (appinfo2); |
| |
| result = g_app_info_add_supports_type (appinfo, "application/x-gio-test", &error); |
| g_assert (result); |
| g_assert_no_error (error); |
| |
| list = g_app_info_get_all_for_type ("application/x-gio-test"); |
| g_assert_cmpint (g_list_length (list), ==, 1); |
| appinfo2 = list->data; |
| g_assert_cmpstr (g_app_info_get_commandline (appinfo), ==, g_app_info_get_commandline (appinfo2)); |
| g_object_unref (appinfo2); |
| g_list_free (list); |
| |
| g_assert (g_app_info_can_remove_supports_type (appinfo)); |
| g_assert (g_app_info_remove_supports_type (appinfo, "application/x-gio-test", &error)); |
| g_assert_no_error (error); |
| |
| g_assert (g_app_info_can_delete (appinfo)); |
| g_assert (g_app_info_delete (appinfo)); |
| g_object_unref (appinfo); |
| } |
| |
| static void |
| test_environment (void) |
| { |
| GAppLaunchContext *ctx; |
| gchar **env; |
| const gchar *path; |
| |
| g_unsetenv ("FOO"); |
| g_unsetenv ("BLA"); |
| path = g_getenv ("PATH"); |
| |
| ctx = g_app_launch_context_new (); |
| |
| env = g_app_launch_context_get_environment (ctx); |
| |
| g_assert (g_environ_getenv (env, "FOO") == NULL); |
| g_assert (g_environ_getenv (env, "BLA") == NULL); |
| g_assert_cmpstr (g_environ_getenv (env, "PATH"), ==, path); |
| |
| g_strfreev (env); |
| |
| g_app_launch_context_setenv (ctx, "FOO", "bar"); |
| g_app_launch_context_setenv (ctx, "BLA", "bla"); |
| |
| env = g_app_launch_context_get_environment (ctx); |
| |
| g_assert_cmpstr (g_environ_getenv (env, "FOO"), ==, "bar"); |
| g_assert_cmpstr (g_environ_getenv (env, "BLA"), ==, "bla"); |
| g_assert_cmpstr (g_environ_getenv (env, "PATH"), ==, path); |
| |
| g_strfreev (env); |
| |
| g_app_launch_context_setenv (ctx, "FOO", "baz"); |
| g_app_launch_context_unsetenv (ctx, "BLA"); |
| |
| env = g_app_launch_context_get_environment (ctx); |
| |
| g_assert_cmpstr (g_environ_getenv (env, "FOO"), ==, "baz"); |
| g_assert (g_environ_getenv (env, "BLA") == NULL); |
| |
| g_strfreev (env); |
| |
| g_object_unref (ctx); |
| } |
| |
| static void |
| test_startup_wm_class (void) |
| { |
| GDesktopAppInfo *appinfo; |
| const char *wm_class; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| appinfo = g_desktop_app_info_new_from_filename (path); |
| wm_class = g_desktop_app_info_get_startup_wm_class (appinfo); |
| |
| g_assert_cmpstr (wm_class, ==, "appinfo-class"); |
| |
| g_object_unref (appinfo); |
| } |
| |
| static void |
| test_supported_types (void) |
| { |
| GAppInfo *appinfo; |
| const char * const *content_types; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| appinfo = G_APP_INFO (g_desktop_app_info_new_from_filename (path)); |
| content_types = g_app_info_get_supported_types (appinfo); |
| |
| g_assert_cmpint (g_strv_length ((char**)content_types), ==, 2); |
| g_assert_cmpstr (content_types[0], ==, "image/png"); |
| |
| g_object_unref (appinfo); |
| } |
| |
| static void |
| test_from_keyfile (void) |
| { |
| GDesktopAppInfo *info; |
| GKeyFile *kf; |
| GError *error = NULL; |
| const gchar *categories; |
| gchar **keywords; |
| const gchar *file; |
| const gchar *name; |
| const gchar *path; |
| |
| path = g_test_get_filename (G_TEST_DIST, "appinfo-test.desktop", NULL); |
| kf = g_key_file_new (); |
| g_key_file_load_from_file (kf, path, G_KEY_FILE_NONE, &error); |
| g_assert_no_error (error); |
| info = g_desktop_app_info_new_from_keyfile (kf); |
| g_key_file_free (kf); |
| g_assert (info != NULL); |
| |
| g_object_get (info, "filename", &file, NULL); |
| g_assert (file == NULL); |
| |
| file = g_desktop_app_info_get_filename (info); |
| g_assert (file == NULL); |
| categories = g_desktop_app_info_get_categories (info); |
| g_assert_cmpstr (categories, ==, "GNOME;GTK;"); |
| keywords = (gchar **)g_desktop_app_info_get_keywords (info); |
| g_assert_cmpint (g_strv_length (keywords), ==, 2); |
| g_assert_cmpstr (keywords[0], ==, "keyword1"); |
| g_assert_cmpstr (keywords[1], ==, "test keyword"); |
| name = g_desktop_app_info_get_generic_name (info); |
| g_assert_cmpstr (name, ==, "generic-appinfo-test"); |
| g_assert (!g_desktop_app_info_get_nodisplay (info)); |
| |
| g_object_unref (info); |
| } |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| const gchar *build_dir; |
| |
| g_setenv ("XDG_CURRENT_DESKTOP", "GNOME", TRUE); |
| |
| g_test_init (&argc, &argv, NULL); |
| g_test_bug_base ("https://bugzilla.gnome.org/show_bug.cgi?id="); |
| |
| /* With Meson build we need to change into right directory, so that the |
| * appinfo-test binary can be found. */ |
| build_dir = g_getenv ("G_TEST_BUILDDIR"); |
| if (build_dir) |
| g_chdir (build_dir); |
| |
| g_test_add_func ("/appinfo/basic", test_basic); |
| g_test_add_func ("/appinfo/text", test_text); |
| g_test_add_func ("/appinfo/launch", test_launch); |
| g_test_add_func ("/appinfo/launch/no-appid", test_launch_no_app_id); |
| g_test_add_func ("/appinfo/show-in", test_show_in); |
| g_test_add_func ("/appinfo/commandline", test_commandline); |
| g_test_add_func ("/appinfo/launch-context", test_launch_context); |
| g_test_add_func ("/appinfo/launch-context-signals", test_launch_context_signals); |
| g_test_add_func ("/appinfo/tryexec", test_tryexec); |
| g_test_add_func ("/appinfo/associations", test_associations); |
| g_test_add_func ("/appinfo/environment", test_environment); |
| g_test_add_func ("/appinfo/startup-wm-class", test_startup_wm_class); |
| g_test_add_func ("/appinfo/supported-types", test_supported_types); |
| g_test_add_func ("/appinfo/from-keyfile", test_from_keyfile); |
| |
| return g_test_run (); |
| } |
| |