1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#include <gio/gio.h>
#include <gstdio.h>
typedef struct
{
gchar *applications_dir;
} Fixture;
static void
setup (Fixture *fixture,
gconstpointer user_data)
{
fixture->applications_dir = g_build_filename (g_get_user_data_dir (), "applications", NULL);
g_assert_no_errno (g_mkdir_with_parents (fixture->applications_dir, 0755));
g_test_message ("Using data directory: %s", g_get_user_data_dir ());
}
static void
teardown (Fixture *fixture,
gconstpointer user_data)
{
g_assert_no_errno (g_rmdir (fixture->applications_dir));
g_clear_pointer (&fixture->applications_dir, g_free);
}
static gboolean
create_app (gpointer data)
{
const gchar *path = data;
GError *error = NULL;
const gchar *contents =
"[Desktop Entry]\n"
"Name=Application\n"
"Version=1.0\n"
"Type=Application\n"
"Exec=true\n";
g_file_set_contents (path, contents, -1, &error);
g_assert_no_error (error);
return G_SOURCE_REMOVE;
}
static void
delete_app (gpointer data)
{
const gchar *path = data;
g_remove (path);
}
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;
if (g_main_loop_is_running (loop))
g_main_loop_quit (loop);
return G_SOURCE_REMOVE;
}
static void
test_app_monitor (Fixture *fixture,
gconstpointer user_data)
{
gchar *app_path;
GAppInfoMonitor *monitor;
GMainLoop *loop;
#ifdef G_OS_WIN32
g_test_skip (".desktop monitor on win32");
return;
#endif
app_path = g_build_filename (fixture->applications_dir, "app.desktop", NULL);
/* 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, 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_timeout_add_seconds (3, quit_loop, loop);
delete_app (app_path);
g_main_loop_run (loop);
g_assert (changed_fired);
g_main_loop_unref (loop);
g_remove (app_path);
g_object_unref (monitor);
g_free (app_path);
}
int
main (int argc, char *argv[])
{
g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
g_test_add ("/monitor/app", Fixture, NULL, setup, test_app_monitor, teardown);
return g_test_run ();
}
|