diff options
author | Matthias Clasen <mclasen@redhat.com> | 2013-11-28 00:19:19 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2013-11-28 00:19:19 -0500 |
commit | bd932aa9f8605a3823bc32428cccb334dc1f5ee0 (patch) | |
tree | 2de2126028a85ab489e8b372a46c9a3877f2d6ad | |
parent | 36a42ab0a50c2825a8111007ff59ff2da14ecff9 (diff) | |
download | glib-bd932aa9f8605a3823bc32428cccb334dc1f5ee0.tar.gz |
Add a GAppInfoMonitor test
The test reveals that there's something fishy with this monitor.
One has to call g_app_info_get_all() for it to start working,
and then it only works once.
-rw-r--r-- | gio/tests/Makefile.am | 1 | ||||
-rw-r--r-- | gio/tests/appmonitor.c | 114 |
2 files changed, 115 insertions, 0 deletions
diff --git a/gio/tests/Makefile.am b/gio/tests/Makefile.am index 49aac1b8e..47096df17 100644 --- a/gio/tests/Makefile.am +++ b/gio/tests/Makefile.am @@ -20,6 +20,7 @@ AM_CFLAGS = $(GLIB_WARN_CFLAGS) # Test programs buildable on all platforms test_programs = \ + appmonitor \ async-close-output-stream \ async-splice-output-stream \ buffered-input-stream \ diff --git a/gio/tests/appmonitor.c b/gio/tests/appmonitor.c new file mode 100644 index 000000000..4ea9b7cb8 --- /dev/null +++ b/gio/tests/appmonitor.c @@ -0,0 +1,114 @@ +#include <gio/gio.h> +#include <gstdio.h> + +static gboolean +create_app (gpointer data) +{ + const gchar *path = data; + gchar *file; + GError *error = NULL; + const gchar *contents = + "[Desktop Entry]\n" + "Name=Application\n" + "Version=1.0\n" + "Type=Application\n" + "Exec=true\n"; + + file = g_build_filename (path, "app.desktop", NULL); + + g_file_set_contents (file, contents, -1, &error); + g_assert_no_error (error); + + g_free (file); + + return G_SOURCE_REMOVE; +} + +static gboolean +delete_app (gpointer data) +{ + const gchar *path = data; + gchar *file; + + file = g_build_filename (path, "app.desktop", NULL); + + g_remove (file); + + g_free (file); + + return G_SOURCE_REMOVE; +} + +static gboolean changed_fired; + +static void +changed_cb (GAppInfoMonitor *monitor, GMainLoop *loop) +{ + changed_fired = TRUE; + g_main_loop_quit (loop); +} + +static gboolean +quit_loop (gpointer data) +{ + GMainLoop *loop = data; + + g_main_loop_quit (loop); + + return G_SOURCE_REMOVE; +} + +static void +test_app_monitor (void) +{ + gchar *path; + GAppInfoMonitor *monitor; + GMainLoop *loop; + + path = g_build_filename (g_get_user_data_dir (), "applications", NULL); + g_mkdir (path, 0755); + + /* FIXME: this shouldn't be required */ + g_list_free_full (g_app_info_get_all (), g_object_unref); + + monitor = g_app_info_monitor_get (); + loop = g_main_loop_new (NULL, FALSE); + + g_signal_connect (monitor, "changed", G_CALLBACK (changed_cb), loop); + + g_idle_add (create_app, path); + g_timeout_add_seconds (3, quit_loop, loop); + + g_main_loop_run (loop); + g_assert (changed_fired); + changed_fired = FALSE; + + /* FIXME: this shouldn't be required */ + g_list_free_full (g_app_info_get_all (), g_object_unref); + + g_idle_add (delete_app, path); + g_timeout_add_seconds (3, quit_loop, loop); + + g_main_loop_run (loop); + g_assert (changed_fired); + + g_main_loop_unref (loop); + + g_object_unref (monitor); + g_free (path); +} + +int +main (int argc, char *argv[]) +{ + gchar *path; + + path = g_mkdtemp (g_strdup ("app_monitor_XXXXXX")); + g_setenv ("XDG_DATA_HOME", path, TRUE); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/monitor/app", test_app_monitor); + + return g_test_run (); +} |