| /* Unit tests for GFile thumbnails | |
| * GIO - GLib Input, Output and Streaming Library | |
| * | |
| * Copyright (C) 2022 Marco Trevisan | |
| * | |
| * SPDX-License-Identifier: LGPL-2.1-or-later | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General | |
| * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
| * | |
| * Author: Marco Trevisan <marco.trevisan@canonical.com> | |
| */ | |
| #include <gio/gio.h> | |
| #define THUMBNAIL_FAIL_SIZE "fail" | |
| #define THUMBNAILS_ATTRIBS ( \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_PATH "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAILING_FAILED "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_PATH_NORMAL "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_NORMAL "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_NORMAL "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_PATH_LARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_LARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_LARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XLARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XLARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XLARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XXLARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XXLARGE "," \ | |
| G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XXLARGE "," \ | |
| ) | |
| /* Must be kept in order, for priority */ | |
| static const char * SIZES_NAMES[] = { | |
| "normal", | |
| "large", | |
| "x-large", | |
| "xx-large", | |
| }; | |
| static GFile * | |
| get_thumbnail_src_file (const gchar *name) | |
| { | |
| const gchar *thumbnail_path; | |
| thumbnail_path = g_test_get_filename (G_TEST_DIST, "thumbnails", | |
| name, NULL); | |
| g_assert_true (g_file_test (thumbnail_path, G_FILE_TEST_IS_REGULAR)); | |
| return g_file_new_for_path (thumbnail_path); | |
| } | |
| static gchar * | |
| get_thumbnail_basename (GFile *source) | |
| { | |
| GChecksum *checksum; | |
| gchar *uri = g_file_get_uri (source); | |
| gchar *basename; | |
| checksum = g_checksum_new (G_CHECKSUM_MD5); | |
| g_checksum_update (checksum, (const guchar *) uri, strlen (uri)); | |
| basename = g_strconcat (g_checksum_get_string (checksum), ".png", NULL); | |
| g_checksum_free (checksum); | |
| g_free (uri); | |
| return basename; | |
| } | |
| static GFile * | |
| get_expected_thumbnail_file (GFile *source, | |
| const gchar *size) | |
| { | |
| GFile *file; | |
| gchar *basename; | |
| basename = get_thumbnail_basename (source); | |
| file = g_file_new_build_filename (g_get_user_cache_dir (), | |
| "thumbnails", | |
| size, | |
| basename, | |
| NULL); | |
| g_free (basename); | |
| return file; | |
| } | |
| static GFile * | |
| get_failed_thumbnail_file (GFile *source) | |
| { | |
| GFile *file; | |
| gchar *basename; | |
| basename = get_thumbnail_basename (source); | |
| file = g_file_new_build_filename (g_get_user_cache_dir (), | |
| "thumbnails", THUMBNAIL_FAIL_SIZE, | |
| "gnome-thumbnail-factory", | |
| basename, | |
| NULL); | |
| g_free (basename); | |
| return file; | |
| } | |
| static gboolean | |
| check_thumbnail_exists (GFile *source, | |
| const gchar *size) | |
| { | |
| GFile *thumbnail; | |
| gboolean ret; | |
| thumbnail = get_expected_thumbnail_file (source, size); | |
| g_assert_nonnull (thumbnail); | |
| ret = g_file_query_exists (thumbnail, NULL); | |
| g_clear_object (&thumbnail); | |
| return ret; | |
| } | |
| static gboolean | |
| check_failed_thumbnail_exists (GFile *source) | |
| { | |
| GFile *thumbnail; | |
| gboolean ret; | |
| thumbnail = get_failed_thumbnail_file (source); | |
| g_assert_nonnull (thumbnail); | |
| ret = g_file_query_exists (thumbnail, NULL); | |
| g_clear_object (&thumbnail); | |
| return ret; | |
| } | |
| static GFile * | |
| create_thumbnail (GFile *source, | |
| const gchar *size) | |
| { | |
| GFile *thumbnail; | |
| GFile *thumbnail_dir; | |
| GError *error = NULL; | |
| gchar *thumbnail_path; | |
| /* TODO: This is just a stub implementation to create a fake thumbnail file | |
| * We should implement a real thumbnail generator, but we don't care here. | |
| */ | |
| if (!size || g_strcmp0 (size, THUMBNAIL_FAIL_SIZE) == 0) | |
| thumbnail = get_failed_thumbnail_file (source); | |
| else | |
| thumbnail = get_expected_thumbnail_file (source, size); | |
| thumbnail_dir = g_file_get_parent (thumbnail); | |
| if (!g_file_query_exists (thumbnail_dir, NULL)) | |
| { | |
| g_file_make_directory_with_parents (thumbnail_dir, NULL, &error); | |
| g_assert_no_error (error); | |
| g_clear_error (&error); | |
| } | |
| g_file_copy (source, thumbnail, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (g_file_query_exists (thumbnail, NULL)); | |
| thumbnail_path = g_file_get_path (thumbnail); | |
| g_test_message ("Created test thumbnail at %s", thumbnail_path); | |
| g_clear_object (&thumbnail_dir); | |
| g_clear_error (&error); | |
| g_free (thumbnail_path); | |
| return thumbnail; | |
| } | |
| static GFile * | |
| create_thumbnail_from_test_file (const gchar *source_name, | |
| const gchar *size, | |
| GFile **out_source) | |
| { | |
| GFile *thumbnail; | |
| GFile *source = get_thumbnail_src_file (source_name); | |
| thumbnail = create_thumbnail (source, size); | |
| if (!size || g_strcmp0 (size, THUMBNAIL_FAIL_SIZE) == 0) | |
| { | |
| g_assert_true (check_failed_thumbnail_exists (source)); | |
| } | |
| else | |
| { | |
| g_assert_false (check_failed_thumbnail_exists (source)); | |
| g_assert_true (check_thumbnail_exists (source, size)); | |
| } | |
| if (out_source) | |
| *out_source = g_steal_pointer (&source); | |
| g_clear_object (&source); | |
| return thumbnail; | |
| } | |
| static gboolean | |
| get_size_attributes (const char *size, | |
| const gchar **path, | |
| const gchar **is_valid, | |
| const gchar **failed) | |
| { | |
| if (g_str_equal (size, "normal")) | |
| { | |
| *path = G_FILE_ATTRIBUTE_THUMBNAIL_PATH_NORMAL; | |
| *is_valid = G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_NORMAL; | |
| *failed = G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_NORMAL; | |
| return TRUE; | |
| } | |
| else if (g_str_equal (size, "large")) | |
| { | |
| *path = G_FILE_ATTRIBUTE_THUMBNAIL_PATH_LARGE; | |
| *is_valid = G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_LARGE; | |
| *failed = G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_LARGE; | |
| return TRUE; | |
| } | |
| else if (g_str_equal (size, "x-large")) | |
| { | |
| *path = G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XLARGE; | |
| *is_valid = G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XLARGE; | |
| *failed = G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XLARGE; | |
| return TRUE; | |
| } | |
| else if (g_str_equal (size, "xx-large")) | |
| { | |
| *path = G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XXLARGE; | |
| *is_valid = G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XXLARGE; | |
| *failed = G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XXLARGE; | |
| return TRUE; | |
| } | |
| *path = NULL; | |
| *is_valid = NULL; | |
| *failed = NULL; | |
| return FALSE; | |
| } | |
| static void | |
| test_valid_thumbnail_size (gconstpointer data) | |
| { | |
| GFile *source; | |
| GFile *thumbnail; | |
| GFile *f; | |
| GError *error = NULL; | |
| GFileInfo *info; | |
| const gchar *size = data; | |
| const gchar *path_attr, *failed_attr, *is_valid_attr; | |
| thumbnail = create_thumbnail_from_test_file ("valid.png", size, &source); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, G_FILE_QUERY_INFO_NONE, | |
| NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_cmpstr ( | |
| g_file_peek_path (f), | |
| ==, | |
| g_file_peek_path (thumbnail) | |
| ); | |
| g_clear_object (&f); | |
| /* TODO: We can't really test this without having a proper thumbnail created | |
| g_assert_true ( | |
| g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| */ | |
| g_assert_true (get_size_attributes (size, &path_attr, &is_valid_attr, &failed_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, path_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, is_valid_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, failed_attr)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, path_attr)); | |
| g_assert_cmpstr ( | |
| g_file_info_get_attribute_byte_string (info, path_attr), | |
| ==, | |
| g_file_peek_path (thumbnail) | |
| ); | |
| g_clear_object (&f); | |
| /* TODO: We can't really test this without having a proper thumbnail created | |
| g_assert_true (g_file_info_get_attribute_boolean (info, is_valid_attr)); | |
| */ | |
| g_clear_object (&source); | |
| g_clear_object (&thumbnail); | |
| g_clear_error (&error); | |
| g_clear_object (&info); | |
| g_clear_object (&f); | |
| } | |
| static void | |
| test_unknown_thumbnail_size (gconstpointer data) | |
| { | |
| GFile *source; | |
| GFile *thumbnail; | |
| GError *error = NULL; | |
| GFileInfo *info; | |
| const gchar *size = data; | |
| thumbnail = create_thumbnail_from_test_file ("valid.png", size, &source); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, G_FILE_QUERY_INFO_NONE, | |
| NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH_NORMAL)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_NORMAL)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_NORMAL)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH_LARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_LARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_LARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XLARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XLARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XLARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XXLARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XXLARGE)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XXLARGE)); | |
| g_clear_object (&source); | |
| g_clear_object (&thumbnail); | |
| g_clear_error (&error); | |
| g_clear_object (&info); | |
| } | |
| static void | |
| test_failed_thumbnail (void) | |
| { | |
| GFile *source; | |
| GFile *thumbnail; | |
| GError *error = NULL; | |
| GFileInfo *info; | |
| thumbnail = create_thumbnail_from_test_file ("valid.png", NULL, &source); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, G_FILE_QUERY_INFO_NONE, | |
| NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| g_assert_false ( | |
| g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_true ( | |
| g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| g_clear_object (&source); | |
| g_clear_object (&thumbnail); | |
| g_clear_error (&error); | |
| g_clear_object (&info); | |
| } | |
| static void | |
| test_thumbnails_size_priority (void) | |
| { | |
| GPtrArray *sized_thumbnails; | |
| GError *error = NULL; | |
| GFileInfo *info; | |
| GFile *source; | |
| GFile *failed_thumbnail; | |
| gsize i; | |
| failed_thumbnail = create_thumbnail_from_test_file ("valid.png", NULL, &source); | |
| sized_thumbnails = g_ptr_array_new_with_free_func (g_object_unref); | |
| /* Checking that each thumbnail with higher priority override the previous */ | |
| for (i = 0; i < G_N_ELEMENTS (SIZES_NAMES); i++) | |
| { | |
| GFile *thumbnail = create_thumbnail (source, SIZES_NAMES[i]); | |
| const gchar *path_attr, *failed_attr, *is_valid_attr; | |
| GFile *f; | |
| g_ptr_array_add (sized_thumbnails, thumbnail); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, | |
| G_FILE_QUERY_INFO_NONE, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_cmpstr ( | |
| g_file_peek_path (f), | |
| ==, | |
| g_file_peek_path (thumbnail) | |
| ); | |
| g_clear_object (&f); | |
| g_assert_true (get_size_attributes (SIZES_NAMES[i], | |
| &path_attr, &is_valid_attr, &failed_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, path_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, is_valid_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, failed_attr)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, path_attr)); | |
| g_assert_cmpstr ( | |
| g_file_peek_path (f), | |
| ==, | |
| g_file_peek_path (thumbnail) | |
| ); | |
| g_clear_object (&info); | |
| g_clear_object (&f); | |
| } | |
| g_assert_cmpuint (sized_thumbnails->len, ==, G_N_ELEMENTS (SIZES_NAMES)); | |
| /* Ensuring we can access to all the thumbnails by explicit size request */ | |
| for (i = 0; i < G_N_ELEMENTS (SIZES_NAMES); i++) | |
| { | |
| GFile *thumbnail = g_ptr_array_index (sized_thumbnails, i); | |
| const gchar *path_attr, *failed_attr, *is_valid_attr; | |
| GFile *f; | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, | |
| G_FILE_QUERY_INFO_NONE, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (get_size_attributes (SIZES_NAMES[i], | |
| &path_attr, &is_valid_attr, &failed_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, path_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, is_valid_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, failed_attr)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, path_attr)); | |
| g_assert_cmpstr ( | |
| g_file_peek_path (f), | |
| ==, | |
| g_file_peek_path (thumbnail) | |
| ); | |
| g_clear_object (&f); | |
| g_clear_object (&info); | |
| } | |
| /* Now removing them in the inverse order, to check this again */ | |
| for (i = G_N_ELEMENTS (SIZES_NAMES); i > 1; i--) | |
| { | |
| GFile *thumbnail = g_ptr_array_index (sized_thumbnails, i - 1); | |
| GFile *less_priority_thumbnail = g_ptr_array_index (sized_thumbnails, i - 2); | |
| const gchar *path_attr, *failed_attr, *is_valid_attr; | |
| GFile *f; | |
| g_file_delete (thumbnail, NULL, &error); | |
| g_assert_no_error (error); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, | |
| G_FILE_QUERY_INFO_NONE, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_cmpstr ( | |
| g_file_peek_path (f), | |
| ==, | |
| g_file_peek_path (less_priority_thumbnail) | |
| ); | |
| g_clear_object (&f); | |
| g_assert_true (get_size_attributes (SIZES_NAMES[i-2], | |
| &path_attr, &is_valid_attr, &failed_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, path_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, is_valid_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, failed_attr)); | |
| f = g_file_new_for_path (g_file_info_get_attribute_byte_string (info, path_attr)); | |
| g_assert_cmpstr ( | |
| g_file_peek_path (f), | |
| ==, | |
| g_file_peek_path (less_priority_thumbnail) | |
| ); | |
| g_clear_object (&info); | |
| g_clear_object (&f); | |
| } | |
| /* And now let's remove the last valid one, so that failed should have priority */ | |
| g_file_delete (G_FILE (g_ptr_array_index (sized_thumbnails, 0)), NULL, &error); | |
| g_assert_no_error (error); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, G_FILE_QUERY_INFO_NONE, | |
| NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_true (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| g_assert_false ( | |
| g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_true ( | |
| g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| g_clear_object (&info); | |
| /* And check if we get the failed state for all explicit requests */ | |
| for (i = 0; i < G_N_ELEMENTS (SIZES_NAMES); i++) | |
| { | |
| const gchar *path_attr, *failed_attr, *is_valid_attr; | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, | |
| G_FILE_QUERY_INFO_NONE, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (get_size_attributes (SIZES_NAMES[i], | |
| &path_attr, &is_valid_attr, &failed_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, path_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, is_valid_attr)); | |
| g_assert_true (g_file_info_has_attribute (info, failed_attr)); | |
| g_assert_false (g_file_info_get_attribute_boolean (info, is_valid_attr)); | |
| g_assert_true (g_file_info_get_attribute_boolean (info, failed_attr)); | |
| g_clear_object (&info); | |
| } | |
| /* Removing the failed thumbnail too, so no thumbnail should be available */ | |
| g_file_delete (failed_thumbnail, NULL, &error); | |
| g_assert_no_error (error); | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, G_FILE_QUERY_INFO_NONE, | |
| NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_PATH)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID)); | |
| g_assert_false (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_THUMBNAILING_FAILED)); | |
| g_clear_object (&info); | |
| for (i = 0; i < G_N_ELEMENTS (SIZES_NAMES); i++) | |
| { | |
| const gchar *path_attr, *failed_attr, *is_valid_attr; | |
| info = g_file_query_info (source, THUMBNAILS_ATTRIBS, | |
| G_FILE_QUERY_INFO_NONE, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_true (get_size_attributes (SIZES_NAMES[i], | |
| &path_attr, &is_valid_attr, &failed_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, path_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, is_valid_attr)); | |
| g_assert_false (g_file_info_has_attribute (info, failed_attr)); | |
| g_clear_object (&info); | |
| } | |
| g_clear_object (&source); | |
| g_clear_pointer (&sized_thumbnails, g_ptr_array_unref); | |
| g_clear_object (&failed_thumbnail); | |
| g_clear_error (&error); | |
| g_clear_object (&info); | |
| } | |
| int | |
| main (int argc, | |
| char *argv[]) | |
| { | |
| gsize i; | |
| g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); | |
| for (i = 0; i < G_N_ELEMENTS (SIZES_NAMES); i++) | |
| { | |
| gchar *test_path; | |
| test_path = g_strconcat ("/file-thumbnail/valid/", SIZES_NAMES[i], NULL); | |
| g_test_add_data_func (test_path, SIZES_NAMES[i], test_valid_thumbnail_size); | |
| g_free (test_path); | |
| } | |
| g_test_add_data_func ("/file-thumbnail/unknown/super-large", "super-large", test_unknown_thumbnail_size); | |
| g_test_add_func ("/file-thumbnail/fail", test_failed_thumbnail); | |
| g_test_add_func ("/file-thumbnail/size-priority", test_thumbnails_size_priority); | |
| return g_test_run (); | |
| } |