• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <glib/gstdio.h>
2 #include <gio/gio.h>
3 #include <gio/gdesktopappinfo.h>
4 
5 static gboolean
strv_equal(gchar ** strv,...)6 strv_equal (gchar **strv, ...)
7 {
8   gint count;
9   va_list list;
10   const gchar *str;
11   gboolean res;
12 
13   res = TRUE;
14   count = 0;
15   va_start (list, strv);
16   while (1)
17     {
18       str = va_arg (list, const gchar *);
19       if (str == NULL)
20         break;
21       if (g_strcmp0 (str, strv[count]) != 0)
22         {
23           res = FALSE;
24           break;
25         }
26       count++;
27     }
28   va_end (list);
29 
30   if (res)
31     res = g_strv_length (strv) == count;
32 
33   return res;
34 }
35 
36 const gchar *myapp_data =
37   "[Desktop Entry]\n"
38   "Encoding=UTF-8\n"
39   "Version=1.0\n"
40   "Type=Application\n"
41   "Exec=true %f\n"
42   "Name=my app\n";
43 
44 const gchar *myapp2_data =
45   "[Desktop Entry]\n"
46   "Encoding=UTF-8\n"
47   "Version=1.0\n"
48   "Type=Application\n"
49   "Exec=sleep %f\n"
50   "Name=my app 2\n";
51 
52 const gchar *myapp3_data =
53   "[Desktop Entry]\n"
54   "Encoding=UTF-8\n"
55   "Version=1.0\n"
56   "Type=Application\n"
57   "Exec=sleep 1\n"
58   "Name=my app 3\n"
59   "MimeType=image/png;";
60 
61 const gchar *myapp4_data =
62   "[Desktop Entry]\n"
63   "Encoding=UTF-8\n"
64   "Version=1.0\n"
65   "Type=Application\n"
66   "Exec=echo %f\n"
67   "Name=my app 4\n"
68   "MimeType=image/bmp;";
69 
70 const gchar *myapp5_data =
71   "[Desktop Entry]\n"
72   "Encoding=UTF-8\n"
73   "Version=1.0\n"
74   "Type=Application\n"
75   "Exec=true %f\n"
76   "Name=my app 5\n"
77   "MimeType=image/bmp;x-scheme-handler/ftp;";
78 
79 const gchar *nosuchapp_data =
80   "[Desktop Entry]\n"
81   "Encoding=UTF-8\n"
82   "Version=1.0\n"
83   "Type=Application\n"
84   "Exec=no_such_application %f\n"
85   "Name=no such app\n";
86 
87 const gchar *defaults_data =
88   "[Default Applications]\n"
89   "image/bmp=myapp4.desktop;\n"
90   "image/png=myapp3.desktop;\n"
91   "x-scheme-handler/ftp=myapp5.desktop;\n";
92 
93 const gchar *mimecache_data =
94   "[MIME Cache]\n"
95   "image/bmp=myapp4.desktop;myapp5.desktop;\n"
96   "image/png=myapp3.desktop;\n";
97 
98 typedef struct
99 {
100   gchar *mimeapps_list_home;  /* (owned) */
101 } Fixture;
102 
103 /* Set up XDG_DATA_HOME and XDG_DATA_DIRS.
104  * XDG_DATA_DIRS/applications will contain mimeapps.list
105  * XDG_DATA_HOME/applications will contain myapp.desktop
106  * and myapp2.desktop, and no mimeapps.list
107  */
108 static void
setup(Fixture * fixture,gconstpointer test_data)109 setup (Fixture       *fixture,
110        gconstpointer  test_data)
111 {
112   const gchar *xdgdatahome;
113   const gchar * const *xdgdatadirs;
114   gchar *appdir;
115   gchar *apphome;
116   gchar *mimeapps;
117   gchar *name;
118   gint res;
119   GError *error = NULL;
120 
121   /* These are already set to a temporary directory through our use of
122    * %G_TEST_OPTION_ISOLATE_DIRS below. */
123   xdgdatahome = g_get_user_data_dir ();
124   xdgdatadirs = g_get_system_data_dirs ();
125 
126   appdir = g_build_filename (xdgdatadirs[0], "applications", NULL);
127   g_test_message ("creating '%s'", appdir);
128   res = g_mkdir_with_parents (appdir, 0700);
129   g_assert_cmpint (res, ==, 0);
130 
131   name = g_build_filename (appdir, "mimeapps.list", NULL);
132   g_test_message ("creating '%s'", name);
133   g_file_set_contents (name, defaults_data, -1, &error);
134   g_assert_no_error (error);
135   g_free (name);
136 
137   apphome = g_build_filename (xdgdatahome, "applications", NULL);
138   g_test_message ("creating '%s'", apphome);
139   res = g_mkdir_with_parents (apphome, 0700);
140   g_assert_cmpint (res, ==, 0);
141 
142   name = g_build_filename (apphome, "myapp.desktop", NULL);
143   g_test_message ("creating '%s'", name);
144   g_file_set_contents (name, myapp_data, -1, &error);
145   g_assert_no_error (error);
146   g_free (name);
147 
148   name = g_build_filename (apphome, "myapp2.desktop", NULL);
149   g_test_message ("creating '%s'", name);
150   g_file_set_contents (name, myapp2_data, -1, &error);
151   g_assert_no_error (error);
152   g_free (name);
153 
154   name = g_build_filename (apphome, "myapp3.desktop", NULL);
155   g_test_message ("creating '%s'", name);
156   g_file_set_contents (name, myapp3_data, -1, &error);
157   g_assert_no_error (error);
158   g_free (name);
159 
160   name = g_build_filename (apphome, "myapp4.desktop", NULL);
161   g_test_message ("creating '%s'", name);
162   g_file_set_contents (name, myapp4_data, -1, &error);
163   g_assert_no_error (error);
164   g_free (name);
165 
166   name = g_build_filename (apphome, "myapp5.desktop", NULL);
167   g_test_message ("creating '%s'", name);
168   g_file_set_contents (name, myapp5_data, -1, &error);
169   g_assert_no_error (error);
170   g_free (name);
171 
172   name = g_build_filename (apphome, "nosuchapp.desktop", NULL);
173   g_test_message ("creating '%s'", name);
174   g_file_set_contents (name, nosuchapp_data, -1, &error);
175   g_assert_no_error (error);
176   g_free (name);
177 
178   mimeapps = g_build_filename (apphome, "mimeapps.list", NULL);
179   g_test_message ("removing '%s'", mimeapps);
180   g_remove (mimeapps);
181 
182   name = g_build_filename (apphome, "mimeinfo.cache", NULL);
183   g_test_message ("creating '%s'", name);
184   g_file_set_contents (name, mimecache_data, -1, &error);
185   g_assert_no_error (error);
186   g_free (name);
187 
188   g_free (apphome);
189   g_free (appdir);
190   g_free (mimeapps);
191 
192   /* Pointer to one of the temporary directories. */
193   fixture->mimeapps_list_home = g_build_filename (g_get_user_config_dir (), "mimeapps.list", NULL);
194 }
195 
196 static void
teardown(Fixture * fixture,gconstpointer test_data)197 teardown (Fixture       *fixture,
198           gconstpointer  test_data)
199 {
200   g_free (fixture->mimeapps_list_home);
201 }
202 
203 static void
test_mime_api(Fixture * fixture,gconstpointer test_data)204 test_mime_api (Fixture       *fixture,
205                gconstpointer  test_data)
206 {
207   GAppInfo *appinfo;
208   GAppInfo *appinfo2;
209   GError *error = NULL;
210   GAppInfo *def;
211   GList *list;
212   const gchar *contenttype = "application/pdf";
213 
214   /* clear things out */
215   g_app_info_reset_type_associations (contenttype);
216 
217   appinfo = (GAppInfo*)g_desktop_app_info_new ("myapp.desktop");
218   appinfo2 = (GAppInfo*)g_desktop_app_info_new ("myapp2.desktop");
219 
220   def = g_app_info_get_default_for_type (contenttype, FALSE);
221   list = g_app_info_get_recommended_for_type (contenttype);
222   g_assert_null (def);
223   g_assert_null (list);
224 
225   /* 1. add a non-default association */
226   g_app_info_add_supports_type (appinfo, contenttype, &error);
227   g_assert_no_error (error);
228 
229   def = g_app_info_get_default_for_type (contenttype, FALSE);
230   list = g_app_info_get_recommended_for_type (contenttype);
231   g_assert_true (g_app_info_equal (def, appinfo));
232   g_assert_cmpint (g_list_length (list), ==, 1);
233   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo));
234   g_object_unref (def);
235   g_list_free_full (list, g_object_unref);
236 
237   /* 2. add another non-default association */
238   g_app_info_add_supports_type (appinfo2, contenttype, &error);
239   g_assert_no_error (error);
240 
241   def = g_app_info_get_default_for_type (contenttype, FALSE);
242   list = g_app_info_get_recommended_for_type (contenttype);
243   g_assert_true (g_app_info_equal (def, appinfo));
244   g_assert_cmpint (g_list_length (list), ==, 2);
245   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo));
246   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2));
247   g_object_unref (def);
248   g_list_free_full (list, g_object_unref);
249 
250   /* 3. make the first app the default */
251   g_app_info_set_as_default_for_type (appinfo, contenttype, &error);
252   g_assert_no_error (error);
253 
254   def = g_app_info_get_default_for_type (contenttype, FALSE);
255   list = g_app_info_get_recommended_for_type (contenttype);
256   g_assert_true (g_app_info_equal (def, appinfo));
257   g_assert_cmpint (g_list_length (list), ==, 2);
258   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo));
259   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2));
260   g_object_unref (def);
261   g_list_free_full (list, g_object_unref);
262 
263   /* 4. make the second app the last used one */
264   g_app_info_set_as_last_used_for_type (appinfo2, contenttype, &error);
265   g_assert_no_error (error);
266 
267   def = g_app_info_get_default_for_type (contenttype, FALSE);
268   list = g_app_info_get_recommended_for_type (contenttype);
269   g_assert_true (g_app_info_equal (def, appinfo));
270   g_assert_cmpint (g_list_length (list), ==, 2);
271   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo2));
272   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo));
273   g_object_unref (def);
274   g_list_free_full (list, g_object_unref);
275 
276   /* 5. reset everything */
277   g_app_info_reset_type_associations (contenttype);
278 
279   def = g_app_info_get_default_for_type (contenttype, FALSE);
280   list = g_app_info_get_recommended_for_type (contenttype);
281   g_assert_null (def);
282   g_assert_null (list);
283 
284   g_object_unref (appinfo);
285   g_object_unref (appinfo2);
286 }
287 
288 /* Repeat the same tests, this time checking that we handle
289  * mimeapps.list as expected. These tests are different from
290  * the ones in test_mime_api() in that we directly parse
291  * mimeapps.list to verify the results.
292  */
293 static void
test_mime_file(Fixture * fixture,gconstpointer test_data)294 test_mime_file (Fixture       *fixture,
295                 gconstpointer  test_data)
296 {
297   gchar **assoc;
298   GAppInfo *appinfo;
299   GAppInfo *appinfo2;
300   GError *error = NULL;
301   GKeyFile *keyfile;
302   gchar *str;
303   gboolean res;
304   GAppInfo *def;
305   GList *list;
306   const gchar *contenttype = "application/pdf";
307 
308   /* clear things out */
309   g_app_info_reset_type_associations (contenttype);
310 
311   appinfo = (GAppInfo*)g_desktop_app_info_new ("myapp.desktop");
312   appinfo2 = (GAppInfo*)g_desktop_app_info_new ("myapp2.desktop");
313 
314   def = g_app_info_get_default_for_type (contenttype, FALSE);
315   list = g_app_info_get_recommended_for_type (contenttype);
316   g_assert_null (def);
317   g_assert_null (list);
318 
319   /* 1. add a non-default association */
320   g_app_info_add_supports_type (appinfo, contenttype, &error);
321   g_assert_no_error (error);
322 
323   keyfile = g_key_file_new ();
324   g_key_file_load_from_file (keyfile, fixture->mimeapps_list_home, G_KEY_FILE_NONE, &error);
325   g_assert_no_error (error);
326 
327   assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error);
328   g_assert_no_error (error);
329   g_assert_true (strv_equal (assoc, "myapp.desktop", NULL));
330   g_strfreev (assoc);
331 
332   /* we've unset XDG_DATA_DIRS so there should be no default */
333   assoc = g_key_file_get_string_list (keyfile, "Default Applications", contenttype, NULL, &error);
334   g_assert_nonnull (error);
335   g_clear_error (&error);
336 
337   g_key_file_free (keyfile);
338 
339   /* 2. add another non-default association */
340   g_app_info_add_supports_type (appinfo2, contenttype, &error);
341   g_assert_no_error (error);
342 
343   keyfile = g_key_file_new ();
344   g_key_file_load_from_file (keyfile, fixture->mimeapps_list_home, G_KEY_FILE_NONE, &error);
345   g_assert_no_error (error);
346 
347   assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error);
348   g_assert_no_error (error);
349   g_assert_true (strv_equal (assoc, "myapp.desktop", "myapp2.desktop", NULL));
350   g_strfreev (assoc);
351 
352   assoc = g_key_file_get_string_list (keyfile, "Default Applications", contenttype, NULL, &error);
353   g_assert_nonnull (error);
354   g_clear_error (&error);
355 
356   g_key_file_free (keyfile);
357 
358   /* 3. make the first app the default */
359   g_app_info_set_as_default_for_type (appinfo, contenttype, &error);
360   g_assert_no_error (error);
361 
362   keyfile = g_key_file_new ();
363   g_key_file_load_from_file (keyfile, fixture->mimeapps_list_home, G_KEY_FILE_NONE, &error);
364   g_assert_no_error (error);
365 
366   assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error);
367   g_assert_no_error (error);
368   g_assert_true (strv_equal (assoc, "myapp.desktop", "myapp2.desktop", NULL));
369   g_strfreev (assoc);
370 
371   str = g_key_file_get_string (keyfile, "Default Applications", contenttype, &error);
372   g_assert_no_error (error);
373   g_assert_cmpstr (str, ==, "myapp.desktop");
374   g_free (str);
375 
376   g_key_file_free (keyfile);
377 
378   /* 4. make the second app the last used one */
379   g_app_info_set_as_last_used_for_type (appinfo2, contenttype, &error);
380   g_assert_no_error (error);
381 
382   keyfile = g_key_file_new ();
383   g_key_file_load_from_file (keyfile, fixture->mimeapps_list_home, G_KEY_FILE_NONE, &error);
384   g_assert_no_error (error);
385 
386   assoc = g_key_file_get_string_list (keyfile, "Added Associations", contenttype, NULL, &error);
387   g_assert_no_error (error);
388   g_assert_true (strv_equal (assoc, "myapp2.desktop", "myapp.desktop", NULL));
389   g_strfreev (assoc);
390 
391   g_key_file_free (keyfile);
392 
393   /* 5. reset everything */
394   g_app_info_reset_type_associations (contenttype);
395 
396   keyfile = g_key_file_new ();
397   g_key_file_load_from_file (keyfile, fixture->mimeapps_list_home, G_KEY_FILE_NONE, &error);
398   g_assert_no_error (error);
399 
400   res = g_key_file_has_key (keyfile, "Added Associations", contenttype, NULL);
401   g_assert_false (res);
402 
403   res = g_key_file_has_key (keyfile, "Default Applications", contenttype, NULL);
404   g_assert_false (res);
405 
406   g_key_file_free (keyfile);
407 
408   g_object_unref (appinfo);
409   g_object_unref (appinfo2);
410 }
411 
412 /* test interaction between mimeapps.list at different levels */
413 static void
test_mime_default(Fixture * fixture,gconstpointer test_data)414 test_mime_default (Fixture       *fixture,
415                    gconstpointer  test_data)
416 {
417   GAppInfo *appinfo;
418   GAppInfo *appinfo2;
419   GAppInfo *appinfo3;
420   GError *error = NULL;
421   GAppInfo *def;
422   GList *list;
423   const gchar *contenttype = "image/png";
424 
425   /* clear things out */
426   g_app_info_reset_type_associations (contenttype);
427 
428   appinfo = (GAppInfo*)g_desktop_app_info_new ("myapp.desktop");
429   appinfo2 = (GAppInfo*)g_desktop_app_info_new ("myapp2.desktop");
430   appinfo3 = (GAppInfo*)g_desktop_app_info_new ("myapp3.desktop");
431 
432   /* myapp3 is set as the default in defaults.list */
433   def = g_app_info_get_default_for_type (contenttype, FALSE);
434   list = g_app_info_get_recommended_for_type (contenttype);
435   g_assert_true (g_app_info_equal (def, appinfo3));
436   g_assert_cmpint (g_list_length (list), ==, 1);
437   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo3));
438   g_object_unref (def);
439   g_list_free_full (list, g_object_unref);
440 
441   /* 1. add a non-default association */
442   g_app_info_add_supports_type (appinfo, contenttype, &error);
443   g_assert_no_error (error);
444 
445   def = g_app_info_get_default_for_type (contenttype, FALSE);
446   list = g_app_info_get_recommended_for_type (contenttype);
447   g_assert_true (g_app_info_equal (def, appinfo3)); /* default is unaffected */
448   g_assert_cmpint (g_list_length (list), ==, 2);
449   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo));
450   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo3));
451   g_object_unref (def);
452   g_list_free_full (list, g_object_unref);
453 
454   /* 2. add another non-default association */
455   g_app_info_add_supports_type (appinfo2, contenttype, &error);
456   g_assert_no_error (error);
457 
458   def = g_app_info_get_default_for_type (contenttype, FALSE);
459   list = g_app_info_get_recommended_for_type (contenttype);
460   g_assert_true (g_app_info_equal (def, appinfo3));
461   g_assert_cmpint (g_list_length (list), ==, 3);
462   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo));
463   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2));
464   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->next->data, appinfo3));
465   g_object_unref (def);
466   g_list_free_full (list, g_object_unref);
467 
468   /* 3. make the first app the default */
469   g_app_info_set_as_default_for_type (appinfo, contenttype, &error);
470   g_assert_no_error (error);
471 
472   def = g_app_info_get_default_for_type (contenttype, FALSE);
473   list = g_app_info_get_recommended_for_type (contenttype);
474   g_assert_true (g_app_info_equal (def, appinfo));
475   g_assert_cmpint (g_list_length (list), ==, 3);
476   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo));
477   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo2));
478   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->next->data, appinfo3));
479   g_object_unref (def);
480   g_list_free_full (list, g_object_unref);
481 
482   g_object_unref (appinfo);
483   g_object_unref (appinfo2);
484   g_object_unref (appinfo3);
485 }
486 
487 /* test interaction between mimeinfo.cache, defaults.list and mimeapps.list
488  * to ensure g_app_info_set_as_last_used_for_type doesn't incorrectly
489  * change the default
490  */
491 static void
test_mime_default_last_used(Fixture * fixture,gconstpointer test_data)492 test_mime_default_last_used (Fixture       *fixture,
493                              gconstpointer  test_data)
494 {
495   GAppInfo *appinfo4;
496   GAppInfo *appinfo5;
497   GError *error = NULL;
498   GAppInfo *def;
499   GList *list;
500   const gchar *contenttype = "image/bmp";
501 
502   /* clear things out */
503   g_app_info_reset_type_associations (contenttype);
504 
505   appinfo4 = (GAppInfo*)g_desktop_app_info_new ("myapp4.desktop");
506   appinfo5 = (GAppInfo*)g_desktop_app_info_new ("myapp5.desktop");
507 
508   /* myapp4 is set as the default in defaults.list */
509   /* myapp4 and myapp5 can both handle image/bmp */
510   def = g_app_info_get_default_for_type (contenttype, FALSE);
511   list = g_app_info_get_recommended_for_type (contenttype);
512   g_assert_true (g_app_info_equal (def, appinfo4));
513   g_assert_cmpint (g_list_length (list), ==, 2);
514   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo4));
515   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo5));
516   g_object_unref (def);
517   g_list_free_full (list, g_object_unref);
518 
519   /* 1. set default (myapp4) as last used */
520   g_app_info_set_as_last_used_for_type (appinfo4, contenttype, &error);
521   g_assert_no_error (error);
522 
523   def = g_app_info_get_default_for_type (contenttype, FALSE);
524   list = g_app_info_get_recommended_for_type (contenttype);
525   g_assert_true (g_app_info_equal (def, appinfo4)); /* default is unaffected */
526   g_assert_cmpint (g_list_length (list), ==, 2);
527   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo4));
528   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo5));
529   g_object_unref (def);
530   g_list_free_full (list, g_object_unref);
531 
532   /* 2. set other (myapp5) as last used */
533   g_app_info_set_as_last_used_for_type (appinfo5, contenttype, &error);
534   g_assert_no_error (error);
535 
536   def = g_app_info_get_default_for_type (contenttype, FALSE);
537   list = g_app_info_get_recommended_for_type (contenttype);
538   g_assert_true (g_app_info_equal (def, appinfo4));
539   g_assert_cmpint (g_list_length (list), ==, 2);
540   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo5));
541   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo4));
542   g_object_unref (def);
543   g_list_free_full (list, g_object_unref);
544 
545   /* 3. change the default to myapp5 */
546   g_app_info_set_as_default_for_type (appinfo5, contenttype, &error);
547   g_assert_no_error (error);
548 
549   def = g_app_info_get_default_for_type (contenttype, FALSE);
550   list = g_app_info_get_recommended_for_type (contenttype);
551   g_assert_true (g_app_info_equal (def, appinfo5));
552   g_assert_cmpint (g_list_length (list), ==, 2);
553   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo5));
554   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo4));
555   g_object_unref (def);
556   g_list_free_full (list, g_object_unref);
557 
558   /* 4. set myapp4 as last used */
559   g_app_info_set_as_last_used_for_type (appinfo4, contenttype, &error);
560   g_assert_no_error (error);
561 
562   def = g_app_info_get_default_for_type (contenttype, FALSE);
563   list = g_app_info_get_recommended_for_type (contenttype);
564   g_assert_true (g_app_info_equal (def, appinfo5));
565   g_assert_cmpint (g_list_length (list), ==, 2);
566   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo4));
567   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo5));
568   g_object_unref (def);
569   g_list_free_full (list, g_object_unref);
570 
571   /* 5. set myapp5 as last used again */
572   g_app_info_set_as_last_used_for_type (appinfo5, contenttype, &error);
573   g_assert_no_error (error);
574 
575   def = g_app_info_get_default_for_type (contenttype, FALSE);
576   list = g_app_info_get_recommended_for_type (contenttype);
577   g_assert_true (g_app_info_equal (def, appinfo5));
578   g_assert_cmpint (g_list_length (list), ==, 2);
579   g_assert_true (g_app_info_equal ((GAppInfo*)list->data, appinfo5));
580   g_assert_true (g_app_info_equal ((GAppInfo*)list->next->data, appinfo4));
581   g_object_unref (def);
582   g_list_free_full (list, g_object_unref);
583 
584   g_object_unref (appinfo4);
585   g_object_unref (appinfo5);
586 }
587 
588 static void
test_scheme_handler(Fixture * fixture,gconstpointer test_data)589 test_scheme_handler (Fixture       *fixture,
590                      gconstpointer  test_data)
591 {
592   GAppInfo *info, *info5;
593 
594   info5 = (GAppInfo*)g_desktop_app_info_new ("myapp5.desktop");
595   info = g_app_info_get_default_for_uri_scheme ("ftp");
596   g_assert_true (g_app_info_equal (info, info5));
597 
598   g_object_unref (info);
599   g_object_unref (info5);
600 }
601 
602 /* test that g_app_info_* ignores desktop files with nonexisting executables
603  */
604 static void
test_mime_ignore_nonexisting(Fixture * fixture,gconstpointer test_data)605 test_mime_ignore_nonexisting (Fixture       *fixture,
606                               gconstpointer  test_data)
607 {
608   GAppInfo *appinfo;
609 
610   appinfo = (GAppInfo*)g_desktop_app_info_new ("nosuchapp.desktop");
611   g_assert_null (appinfo);
612 }
613 
614 static void
test_all(Fixture * fixture,gconstpointer test_data)615 test_all (Fixture       *fixture,
616           gconstpointer  test_data)
617 {
618   GList *all, *l;
619 
620   all = g_app_info_get_all ();
621 
622   for (l = all; l; l = l->next)
623     g_assert_true (G_IS_APP_INFO (l->data));
624 
625   g_list_free_full (all, g_object_unref);
626 }
627 
628 int
main(int argc,char * argv[])629 main (int argc, char *argv[])
630 {
631   g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
632 
633   g_test_add ("/appinfo/mime/api", Fixture, NULL, setup,
634               test_mime_api, teardown);
635   g_test_add ("/appinfo/mime/default", Fixture, NULL, setup,
636               test_mime_default, teardown);
637   g_test_add ("/appinfo/mime/file", Fixture, NULL, setup,
638               test_mime_file, teardown);
639   g_test_add ("/appinfo/mime/scheme-handler", Fixture, NULL, setup,
640               test_scheme_handler, teardown);
641   g_test_add ("/appinfo/mime/default-last-used", Fixture, NULL, setup,
642               test_mime_default_last_used, teardown);
643   g_test_add ("/appinfo/mime/ignore-nonexisting", Fixture, NULL, setup,
644               test_mime_ignore_nonexisting, teardown);
645   g_test_add ("/appinfo/all", Fixture, NULL, setup, test_all, teardown);
646 
647   return g_test_run ();
648 }
649