(root)/
glib-2.79.0/
gio/
tests/
mimeapps.c
       1  #include <glib/gstdio.h>
       2  #include <gio/gio.h>
       3  #include <gio/gdesktopappinfo.h>
       4  
       5  static gboolean
       6  strv_equal (gchar **strv, ...)
       7  {
       8    gsize 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
     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
     197  teardown (Fixture       *fixture,
     198            gconstpointer  test_data)
     199  {
     200    g_free (fixture->mimeapps_list_home);
     201  }
     202  
     203  static void
     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
     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
     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
     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
     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
     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
     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
     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  }