1
0
Fork 0
gnome-software/plugins/dummy/gs-self-test.c
Daniel Baumann 68ee05b3fd
Adding upstream version 48.2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 21:00:23 +02:00

948 lines
36 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
* vi:set noexpandtab tabstop=8 shiftwidth=8:
*
* Copyright (C) 2013-2017 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "config.h"
#include <glib/gstdio.h>
#include <locale.h>
#include "gnome-software-private.h"
#include "gs-test.h"
const gchar * const allowlist[] = {
"appstream",
"dummy",
"generic-updates",
"hardcoded-blocklist",
"icons",
"provenance",
"provenance-license",
NULL
};
static guint _status_changed_cnt = 0;
static void
gs_plugin_loader_status_changed_cb (GsPluginLoader *plugin_loader,
GsApp *app,
GsPluginStatus status,
gpointer user_data)
{
_status_changed_cnt++;
}
static void
gs_plugins_dummy_install_func (GsPluginLoader *plugin_loader)
{
gboolean ret;
g_autoptr(GsApp) app = NULL;
g_autoptr(GsAppList) app_list = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
g_autoptr(GError) error = NULL;
GsPlugin *plugin;
/* install */
app = gs_app_new ("chiron.desktop");
plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy");
gs_app_set_management_plugin (app, plugin);
gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
app_list = gs_app_list_new ();
gs_app_list_add (app_list, app);
plugin_job = gs_plugin_job_install_apps_new (app_list,
GS_PLUGIN_INSTALL_APPS_FLAGS_NONE);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED);
/* remove */
g_object_unref (plugin_job);
plugin_job = gs_plugin_job_uninstall_apps_new (app_list,
GS_PLUGIN_UNINSTALL_APPS_FLAGS_NONE);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE);
}
static void
gs_plugins_dummy_error_func (GsPluginLoader *plugin_loader)
{
const GError *app_error;
gboolean ret;
g_autoptr(GError) error = NULL;
g_autoptr(GPtrArray) events = NULL;
g_autoptr(GsApp) app = NULL;
g_autoptr(GsAppList) list = NULL;
g_autoptr(GsPluginEvent) event = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
GsPlugin *plugin;
/* drop all caches */
gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL);
gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL);
/* update, which should cause an error to be emitted */
app = gs_app_new ("chiron.desktop");
plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy");
gs_app_set_management_plugin (app, plugin);
gs_app_set_state (app, GS_APP_STATE_AVAILABLE);
list = gs_app_list_new ();
gs_app_list_add (list, app);
plugin_job = gs_plugin_job_update_apps_new (list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
/* get last active event */
event = gs_plugin_loader_get_event_default (plugin_loader);
g_assert (event != NULL);
g_assert (gs_plugin_event_get_app (event) == app);
/* check all the events */
events = gs_plugin_loader_get_events (plugin_loader);
g_assert_cmpint (events->len, ==, 1);
event = g_ptr_array_index (events, 0);
g_assert (gs_plugin_event_get_app (event) == app);
app_error = gs_plugin_event_get_error (event);
g_assert (app_error != NULL);
g_assert_error (app_error,
GS_PLUGIN_ERROR,
GS_PLUGIN_ERROR_DOWNLOAD_FAILED);
}
static void
gs_plugins_dummy_refine_func (GsPluginLoader *plugin_loader)
{
gboolean ret;
g_autoptr(GsApp) app = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
GsPlugin *plugin;
/* get the extra bits */
app = gs_app_new ("chiron.desktop");
plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy");
gs_app_set_management_plugin (app, plugin);
plugin_job = gs_plugin_job_refine_new_for_app (app,
GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_URL);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert_cmpstr (gs_app_get_license (app), ==, "GPL-2.0-or-later");
g_assert_cmpstr (gs_app_get_description (app), !=, NULL);
g_assert_cmpstr (gs_app_get_url (app, AS_URL_KIND_HOMEPAGE), ==, "http://www.test.org/");
}
static void
gs_plugins_dummy_metadata_quirks (GsPluginLoader *plugin_loader)
{
gboolean ret;
g_autoptr(GsApp) app = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
GsPlugin *plugin;
/* get the extra bits */
app = gs_app_new ("chiron.desktop");
plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy");
gs_app_set_management_plugin (app, plugin);
plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert_cmpstr (gs_app_get_description (app), !=, NULL);
/* check the not-launchable quirk */
g_assert (!gs_app_has_quirk(app, GS_APP_QUIRK_NOT_LAUNCHABLE));
gs_app_set_metadata (app, "GnomeSoftware::quirks::not-launchable", "true");
g_object_unref (plugin_job);
plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert (gs_app_has_quirk(app, GS_APP_QUIRK_NOT_LAUNCHABLE));
gs_app_set_metadata (app, "GnomeSoftware::quirks::not-launchable", NULL);
gs_app_set_metadata (app, "GnomeSoftware::quirks::not-launchable", "false");
g_object_unref (plugin_job);
plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_DESCRIPTION);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert (!gs_app_has_quirk(app, GS_APP_QUIRK_NOT_LAUNCHABLE));
}
static void
gs_plugins_dummy_key_colors_func (GsPluginLoader *plugin_loader)
{
GArray *array;
gboolean ret;
guint i;
g_autoptr(GsApp) app = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
g_autoptr(GError) error = NULL;
/* get the extra bits */
app = gs_app_new ("chiron.desktop");
plugin_job = gs_plugin_job_refine_new_for_app (app, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
array = gs_app_get_key_colors (app);
g_assert_cmpint (array->len, <=, 3);
g_assert_cmpint (array->len, >, 0);
/* check values are in range */
for (i = 0; i < array->len; i++) {
const GdkRGBA *kc = &g_array_index (array, GdkRGBA, i);
g_assert_cmpfloat (kc->red, >=, 0.f);
g_assert_cmpfloat (kc->red, <=, 1.f);
g_assert_cmpfloat (kc->green, >=, 0.f);
g_assert_cmpfloat (kc->green, <=, 1.f);
g_assert_cmpfloat (kc->blue, >=, 0.f);
g_assert_cmpfloat (kc->blue, <=, 1.f);
g_assert_cmpfloat (kc->alpha, >=, 0.f);
g_assert_cmpfloat (kc->alpha, <=, 1.f);
}
}
static void
gs_plugins_dummy_updates_func (GsPluginLoader *plugin_loader)
{
GsApp *app;
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list = NULL;
g_autoptr(GsAppQuery) query = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
/* get the updates list */
query = gs_app_query_new ("is-for-update", GS_APP_QUERY_TRISTATE_TRUE,
"refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_UPDATE_DETAILS,
"sort-func", gs_utils_app_sort_name,
NULL);
plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE);
list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list != NULL);
/* make sure there are three entries */
g_assert_cmpint (gs_app_list_length (list), ==, 3);
app = gs_app_list_index (list, 0);
g_assert_cmpstr (gs_app_get_id (app), ==, "chiron.desktop");
g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE_LIVE);
g_assert_cmpstr (gs_app_get_update_details_markup (app), ==, "Do not crash when using libvirt.");
g_assert_cmpint (gs_app_get_update_urgency (app), ==, AS_URGENCY_KIND_HIGH);
/* get the virtual non-apps OS update */
app = gs_app_list_index (list, 2);
g_assert_cmpstr (gs_app_get_id (app), ==, "org.gnome.Software.OsUpdate");
g_assert_cmpstr (gs_app_get_name (app), ==, "System Updates");
g_assert_cmpstr (gs_app_get_summary (app), ==, "General system updates, such as security or bug fixes, and performance improvements.");
g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_GENERIC);
g_assert_cmpint (gs_app_get_special_kind (app), ==, GS_APP_SPECIAL_KIND_OS_UPDATE);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE);
g_assert_cmpint (gs_app_list_length (gs_app_get_related (app)), ==, 2);
/* get the virtual non-apps OS update */
app = gs_app_list_index (list, 1);
g_assert_cmpstr (gs_app_get_id (app), ==, "proxy.desktop");
g_assert (gs_app_has_quirk (app, GS_APP_QUIRK_IS_PROXY));
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE_LIVE);
g_assert_cmpint (gs_app_list_length (gs_app_get_related (app)), ==, 2);
}
static void
gs_plugins_dummy_distro_upgrades_func (GsPluginLoader *plugin_loader)
{
GsApp *app;
gboolean ret;
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
/* get the updates list */
plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE,
GS_PLUGIN_REFINE_FLAGS_NONE);
list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list != NULL);
/* make sure there is one entry */
g_assert_cmpint (gs_app_list_length (list), ==, 1);
app = gs_app_list_index (list, 0);
g_assert_cmpstr (gs_app_get_id (app), ==, "org.fedoraproject.release-rawhide.upgrade");
g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_OPERATING_SYSTEM);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_AVAILABLE);
/* this should be set with a higher priority by AppStream */
g_assert_cmpstr (gs_app_get_summary (app), ==, "Release specific tagline");
/* download the update */
g_object_unref (plugin_job);
plugin_job = gs_plugin_job_download_upgrade_new (app, GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE);
/* trigger the update */
g_object_unref (plugin_job);
plugin_job = gs_plugin_job_trigger_upgrade_new (app, GS_PLUGIN_TRIGGER_UPGRADE_FLAGS_NONE);
ret = gs_plugin_loader_job_action (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (ret);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_UPDATABLE);
}
static gboolean
filter_valid_cb (GsApp *app,
gpointer user_data)
{
return gs_plugin_loader_app_is_valid (app, GS_PLUGIN_REFINE_FLAGS_NONE);
}
static void
gs_plugins_dummy_installed_func (GsPluginLoader *plugin_loader)
{
GsApp *app;
GsApp *addon;
g_autoptr(GsAppList) addons = NULL;
g_autofree gchar *menu_path = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list = NULL;
g_autoptr(GsAppQuery) query = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
g_autoptr(GIcon) icon = NULL;
GsPluginRefineFlags refine_flags;
/* get installed packages */
refine_flags = (GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_ADDONS |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_LICENSE |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_KUDOS |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_CATEGORIES |
GS_PLUGIN_REFINE_FLAGS_REQUIRE_PROVENANCE);
query = gs_app_query_new ("is-installed", GS_APP_QUERY_TRISTATE_TRUE,
"refine-flags", refine_flags,
"dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT,
"filter-func", filter_valid_cb,
NULL);
plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE);
list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list != NULL);
/* make sure there is one entry */
g_assert_cmpint (gs_app_list_length (list), ==, 1);
app = gs_app_list_index (list, 0);
g_assert_cmpstr (gs_app_get_id (app), ==, "zeus.desktop");
g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP);
g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED);
g_assert_cmpstr (gs_app_get_name (app), ==, "Zeus");
g_assert_cmpstr (gs_app_get_source_default (app), ==, "zeus");
icon = gs_app_get_icon_for_size (app, 48, 1, NULL);
g_assert_nonnull (icon);
g_assert_true (G_IS_THEMED_ICON (icon));
g_clear_object (&icon);
/* check various bitfields */
g_assert (gs_app_has_quirk (app, GS_APP_QUIRK_PROVENANCE));
g_assert_cmpstr (gs_app_get_license (app), ==, "GPL-2.0-or-later");
g_assert (gs_app_get_license_is_free (app));
/* check kudos */
g_assert_true (gs_app_has_kudo (app, GS_APP_KUDO_MY_LANGUAGE));
/* check categories */
g_assert (gs_app_has_category (app, "Player"));
g_assert (gs_app_has_category (app, "AudioVideo"));
g_assert (!gs_app_has_category (app, "ImageProcessing"));
g_assert (gs_app_get_menu_path (app) != NULL);
menu_path = g_strjoinv ("->", gs_app_get_menu_path (app));
g_assert_cmpstr (menu_path, ==, "Create->Music Players");
/* check addon */
addons = gs_app_dup_addons (app);
g_assert_nonnull (addons);
g_assert_cmpint (gs_app_list_length (addons), ==, 1);
addon = gs_app_list_index (addons, 0);
g_assert_cmpstr (gs_app_get_id (addon), ==, "zeus-spell.addon");
g_assert_cmpint (gs_app_get_kind (addon), ==, AS_COMPONENT_KIND_ADDON);
g_assert_cmpint (gs_app_get_state (addon), ==, GS_APP_STATE_AVAILABLE);
g_assert_cmpstr (gs_app_get_name (addon), ==, "Spell Check");
g_assert_cmpstr (gs_app_get_source_default (addon), ==, "zeus-spell");
g_assert_cmpstr (gs_app_get_license (addon), ==,
"LicenseRef-free=https://www.debian.org/");
/* The app has a non-existent icon */
g_assert_true (gs_app_has_icons (addon));
icon = gs_app_get_icon_for_size (addon, 48, 1, NULL);
g_assert_null (icon);
}
static void
gs_plugins_dummy_search_func (GsPluginLoader *plugin_loader)
{
GsApp *app;
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
g_autoptr(GsAppQuery) query = NULL;
const gchar *keywords[2] = { NULL, };
/* get search result based on addon keyword */
keywords[0] = "zeus";
query = gs_app_query_new ("keywords", keywords,
"refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON,
"dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT,
"sort-func", gs_utils_app_sort_match_value,
NULL);
plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE);
list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list != NULL);
/* make sure there is at least one entry, the parent app, which must be first */
g_assert_cmpint (gs_app_list_length (list), >=, 1);
app = gs_app_list_index (list, 0);
g_assert_cmpstr (gs_app_get_id (app), ==, "zeus.desktop");
g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP);
}
static void
gs_plugins_dummy_search_alternate_func (GsPluginLoader *plugin_loader)
{
GsApp *app_tmp;
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list = NULL;
g_autoptr(GsApp) app = NULL;
g_autoptr(GsAppQuery) query = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
/* get search result based on addon keyword */
app = gs_app_new ("zeus.desktop");
query = gs_app_query_new ("alternate-of", app,
"refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON,
"dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT,
"sort-func", gs_utils_app_sort_priority,
NULL);
plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE);
list = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list != NULL);
/* make sure there is the original app, and the alternate */
g_assert_cmpint (gs_app_list_length (list), ==, 2);
app_tmp = gs_app_list_index (list, 0);
g_assert_cmpstr (gs_app_get_id (app_tmp), ==, "chiron.desktop");
g_assert_cmpint (gs_app_get_kind (app_tmp), ==, AS_COMPONENT_KIND_DESKTOP_APP);
app_tmp = gs_app_list_index (list, 1);
g_assert_cmpstr (gs_app_get_id (app_tmp), ==, "zeus.desktop");
g_assert_cmpint (gs_app_get_kind (app_tmp), ==, AS_COMPONENT_KIND_DESKTOP_APP);
}
static void
gs_plugins_dummy_url_to_app_func (GsPluginLoader *plugin_loader)
{
g_autoptr(GError) error = NULL;
g_autoptr(GsApp) app = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
plugin_job = gs_plugin_job_url_to_app_new ("dummy://chiron.desktop", GS_PLUGIN_URL_TO_APP_FLAGS_NONE);
gs_plugin_job_set_refine_flags (plugin_job, GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON);
app = gs_plugin_loader_job_process_app (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (app != NULL);
g_assert_cmpstr (gs_app_get_id (app), ==, "chiron.desktop");
g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_DESKTOP_APP);
}
static void
gs_plugins_dummy_plugin_cache_func (GsPluginLoader *plugin_loader)
{
GsApp *app1;
GsApp *app2;
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list1 = NULL;
g_autoptr(GsAppList) list2 = NULL;
g_autoptr(GsPluginJob) plugin_job = NULL;
/* ensure we get the same results back from calling the methods twice */
plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE,
GS_PLUGIN_REFINE_FLAGS_NONE);
list1 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list1 != NULL);
g_assert_cmpint (gs_app_list_length (list1), ==, 1);
app1 = gs_app_list_index (list1, 0);
g_object_unref (plugin_job);
plugin_job = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE,
GS_PLUGIN_REFINE_FLAGS_NONE);
list2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list2 != NULL);
g_assert_cmpint (gs_app_list_length (list2), ==, 1);
app2 = gs_app_list_index (list2, 0);
/* make sure there is one GObject */
g_assert_cmpstr (gs_app_get_id (app1), ==, gs_app_get_id (app2));
g_assert (app1 == app2);
}
static void
gs_plugins_dummy_wildcard_func (GsPluginLoader *plugin_loader)
{
g_autoptr(GError) error = NULL;
g_autoptr(GsAppList) list1 = NULL;
g_autoptr(GsAppList) list2 = NULL;
const gchar *expected_apps2[] = { "chiron.desktop", "zeus.desktop", NULL };
g_autoptr(GsPluginJob) plugin_job = NULL;
g_autoptr(GsAppQuery) query = NULL;
/* use the plugin's default curated list, indicated by setting max-results=5 */
query = gs_app_query_new ("is-curated", GS_APP_QUERY_TRISTATE_TRUE,
"max-results", 5,
"refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON,
NULL);
plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE);
list1 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list1 != NULL);
g_assert_cmpint (gs_app_list_length (list1), ==, 1);
g_object_unref (plugin_job);
g_object_unref (query);
/* use the plugins second list, indicated by setting max-results=6 */
query = gs_app_query_new ("is-curated", GS_APP_QUERY_TRISTATE_TRUE,
"max-results", 6,
"refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ICON,
NULL);
plugin_job = gs_plugin_job_list_apps_new (query, GS_PLUGIN_LIST_APPS_FLAGS_NONE);
list2 = gs_plugin_loader_job_process (plugin_loader, plugin_job, NULL, &error);
gs_test_flush_main_context ();
g_assert_no_error (error);
g_assert (list2 != NULL);
g_assert_cmpint (gs_app_list_length (list2), ==, g_strv_length ((gchar **) expected_apps2));
for (guint i = 0; i < gs_app_list_length (list2); ++i) {
GsApp *app = gs_app_list_index (list2, i);
g_assert (g_strv_contains (expected_apps2, gs_app_get_id (app)));
}
}
static void
async_result_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
GAsyncResult **result_out = user_data;
g_assert (result_out != NULL && *result_out == NULL);
*result_out = g_object_ref (result);
g_main_context_wakeup (g_main_context_get_thread_default ());
}
static void
gs_plugins_dummy_limit_parallel_ops_func (GsPluginLoader *plugin_loader)
{
g_autoptr(GsAppList) list = NULL;
GsApp *app1 = NULL;
g_autoptr(GsApp) app2 = NULL;
g_autoptr(GsAppList) app2_list = NULL;
g_autoptr(GsApp) app3 = NULL;
g_autoptr(GsAppList) app3_list = NULL;
GsPlugin *plugin;
g_autoptr(GsPluginJob) plugin_job1 = NULL;
g_autoptr(GsPluginJob) plugin_job2 = NULL;
g_autoptr(GsPluginJob) plugin_job3 = NULL;
g_autoptr(GMainContext) context = NULL;
g_autoptr(GAsyncResult) result1 = NULL;
g_autoptr(GAsyncResult) result2 = NULL;
g_autoptr(GAsyncResult) result3 = NULL;
g_autoptr(GError) local_error = NULL;
/* drop all caches */
gs_utils_rmtree (g_getenv ("GS_SELF_TEST_CACHEDIR"), NULL);
gs_test_reinitialise_plugin_loader (plugin_loader, allowlist, NULL);
/* get the updates list */
plugin_job1 = gs_plugin_job_list_distro_upgrades_new (GS_PLUGIN_LIST_DISTRO_UPGRADES_FLAGS_NONE,
GS_PLUGIN_REFINE_FLAGS_NONE);
list = gs_plugin_loader_job_process (plugin_loader, plugin_job1, NULL, &local_error);
gs_test_flush_main_context ();
g_assert_no_error (local_error);
g_assert (list != NULL);
g_assert_cmpint (gs_app_list_length (list), ==, 1);
app1 = gs_app_list_index (list, 0);
g_assert_cmpstr (gs_app_get_id (app1), ==, "org.fedoraproject.release-rawhide.upgrade");
g_assert_cmpint (gs_app_get_kind (app1), ==, AS_COMPONENT_KIND_OPERATING_SYSTEM);
g_assert_cmpint (gs_app_get_state (app1), ==, GS_APP_STATE_AVAILABLE);
/* allow only one operation at a time */
gs_plugin_loader_set_max_parallel_ops (plugin_loader, 1);
app2 = gs_app_new ("chiron.desktop");
plugin = gs_plugin_loader_find_plugin (plugin_loader, "dummy");
gs_app_set_management_plugin (app2, plugin);
gs_app_set_state (app2, GS_APP_STATE_AVAILABLE);
/* use "proxy" prefix so the update function succeeds... */
app3 = gs_app_new ("proxy-zeus.desktop");
gs_app_set_management_plugin (app3, plugin);
gs_app_set_state (app3, GS_APP_STATE_UPDATABLE_LIVE);
context = g_main_context_new ();
g_main_context_push_thread_default (context);
/* call a few operations at the "same time" */
/* download an upgrade */
g_object_unref (plugin_job1);
plugin_job1 = gs_plugin_job_download_upgrade_new (app1, GS_PLUGIN_DOWNLOAD_UPGRADE_FLAGS_NONE);
gs_plugin_loader_job_process_async (plugin_loader,
plugin_job1,
NULL,
async_result_cb,
&result1);
/* install an app */
app2_list = gs_app_list_new ();
gs_app_list_add (app2_list, app2);
plugin_job2 = gs_plugin_job_install_apps_new (app2_list,
GS_PLUGIN_INSTALL_APPS_FLAGS_NONE);
gs_plugin_loader_job_process_async (plugin_loader,
plugin_job2,
NULL,
async_result_cb,
&result2);
/* update an app */
app3_list = gs_app_list_new ();
gs_app_list_add (app3_list, app3);
plugin_job3 = gs_plugin_job_update_apps_new (app3_list, GS_PLUGIN_UPDATE_APPS_FLAGS_NO_DOWNLOAD);
gs_plugin_loader_job_process_async (plugin_loader,
plugin_job3,
NULL,
async_result_cb,
&result3);
/* wait for all operations to finish */
while (result1 == NULL || result2 == NULL || result3 == NULL)
g_main_context_iteration (context, TRUE);
g_main_context_pop_thread_default (context);
gs_test_flush_main_context ();
gs_plugin_loader_job_action_finish (plugin_loader, result1, &local_error);
g_assert_no_error (local_error);
gs_plugin_loader_job_action_finish (plugin_loader, result2, &local_error);
g_assert_no_error (local_error);
gs_plugin_loader_job_action_finish (plugin_loader, result3, &local_error);
g_assert_no_error (local_error);
g_assert_cmpint (gs_app_get_state (app1), ==, GS_APP_STATE_UPDATABLE);
g_assert_cmpint (gs_app_get_state (app2), ==, GS_APP_STATE_INSTALLED);
g_assert_cmpint (gs_app_get_state (app3), ==, GS_APP_STATE_INSTALLED);
/* set the default max parallel ops */
gs_plugin_loader_set_max_parallel_ops (plugin_loader, 0);
}
static void
gs_plugins_dummy_app_size_calc_func (GsPluginLoader *loader)
{
g_autoptr(GsApp) app1 = NULL;
g_autoptr(GsApp) app2 = NULL;
g_autoptr(GsApp) runtime = NULL;
guint64 value = 0;
app1 = gs_app_new ("app1");
gs_app_set_state (app1, GS_APP_STATE_AVAILABLE);
gs_app_set_size_download (app1, GS_SIZE_TYPE_VALID, 1);
gs_app_set_size_installed (app1, GS_SIZE_TYPE_VALID, 1000);
g_assert_cmpint (gs_app_get_size_download (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 1);
g_assert_cmpint (gs_app_get_size_download_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
g_assert_cmpint (gs_app_get_size_installed (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 1000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
app2 = gs_app_new ("app2");
gs_app_set_state (app2, GS_APP_STATE_AVAILABLE);
gs_app_set_size_download (app2, GS_SIZE_TYPE_VALID, 20);
gs_app_set_size_installed (app2, GS_SIZE_TYPE_VALID, 20000);
g_assert_cmpint (gs_app_get_size_download (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20);
g_assert_cmpint (gs_app_get_size_download_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
g_assert_cmpint (gs_app_get_size_installed (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
runtime = gs_app_new ("runtime");
gs_app_set_state (runtime, GS_APP_STATE_AVAILABLE);
gs_app_set_size_download (runtime, GS_SIZE_TYPE_VALID, 300);
gs_app_set_size_installed (runtime, GS_SIZE_TYPE_VALID, 300000);
g_assert_cmpint (gs_app_get_size_download (runtime, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 300);
g_assert_cmpint (gs_app_get_size_download_dependencies (runtime, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
g_assert_cmpint (gs_app_get_size_installed (runtime, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 300000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (runtime, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
gs_app_set_runtime (app1, runtime);
g_assert_cmpint (gs_app_get_size_download (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 1);
g_assert_cmpint (gs_app_get_size_download_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 300);
g_assert_cmpint (gs_app_get_size_installed (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 1000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
gs_app_set_runtime (app2, runtime);
g_assert_cmpint (gs_app_get_size_download (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20);
g_assert_cmpint (gs_app_get_size_download_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 300);
g_assert_cmpint (gs_app_get_size_installed (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
gs_app_add_related (app1, app2);
g_assert_cmpint (gs_app_get_size_download (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 1);
g_assert_cmpint (gs_app_get_size_download_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 320);
g_assert_cmpint (gs_app_get_size_installed (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 1000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (app1, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20000);
g_assert_cmpint (gs_app_get_size_download (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20);
g_assert_cmpint (gs_app_get_size_download_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 300);
g_assert_cmpint (gs_app_get_size_installed (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 20000);
g_assert_cmpint (gs_app_get_size_installed_dependencies (app2, &value), ==, GS_SIZE_TYPE_VALID);
g_assert_cmpint (value, ==, 0);
}
int
main (int argc, char **argv)
{
g_autofree gchar *tmp_root = NULL;
gboolean ret;
int retval;
g_autofree gchar *xml = NULL;
g_autoptr(GError) error = NULL;
g_autoptr(GsPluginLoader) plugin_loader = NULL;
/* While we use %G_TEST_OPTION_ISOLATE_DIRS to create temporary directories
* for each of the tests, we want to use the system MIME registry, assuming
* that it exists and correctly has shared-mime-info installed. */
g_content_type_set_mime_dirs (NULL);
/* Force the GTK resources to be registered, needed for fallback icons. */
gtk_init_check ();
/* Similarly, add the system-wide icon theme path before its
* overwritten by %G_TEST_OPTION_ISOLATE_DIRS. */
gs_test_expose_icon_theme_paths ();
gs_test_init (&argc, &argv);
g_setenv ("GS_XMLB_VERBOSE", "1", TRUE);
/* set all the things required as a dummy test harness */
setlocale (LC_MESSAGES, "en_GB.UTF-8");
g_setenv ("GS_SELF_TEST_DUMMY_ENABLE", "1", TRUE);
g_setenv ("GS_SELF_TEST_PROVENANCE_SOURCES", "london*,boston", TRUE);
g_setenv ("GS_SELF_TEST_PROVENANCE_LICENSE_SOURCES", "london*,boston", TRUE);
g_setenv ("GS_SELF_TEST_PROVENANCE_LICENSE_URL", "https://www.debian.org/", TRUE);
/* Use a common cache directory for all tests, since the appstream
* plugin uses it and cannot be reinitialised for each test. */
tmp_root = g_dir_make_tmp ("gnome-software-dummy-test-XXXXXX", NULL);
g_assert (tmp_root != NULL);
g_setenv ("GS_SELF_TEST_CACHEDIR", tmp_root, TRUE);
xml = g_strdup ("<?xml version=\"1.0\"?>\n"
"<components version=\"0.9\">\n"
" <component type=\"desktop\">\n"
" <id>chiron.desktop</id>\n"
" <name>Chiron</name>\n"
" <pkgname>chiron</pkgname>\n"
" </component>\n"
" <component type=\"desktop\">\n"
" <id>zeus.desktop</id>\n"
" <name>Zeus</name>\n"
" <summary>A teaching application</summary>\n"
" <pkgname>zeus</pkgname>\n"
" <icon type=\"stock\">org.gnome.Software.Dummy</icon>\n"
" <categories>\n"
" <category>AudioVideo</category>\n"
" <category>Player</category>\n"
" </categories>\n"
" <languages>\n"
" <lang percentage=\"100\">en_GB</lang>\n"
" </languages>\n"
" </component>\n"
" <component type=\"desktop\">\n"
" <id>mate-spell.desktop</id>\n"
" <name>Spell</name>\n"
" <summary>A spelling application for MATE</summary>\n"
" <pkgname>mate-spell</pkgname>\n"
" <icon type=\"stock\">org.gnome.Software.Dummy</icon>\n"
" <project_group>MATE</project_group>\n"
" </component>\n"
" <component type=\"addon\">\n"
" <id>zeus-spell.addon</id>\n"
" <extends>zeus.desktop</extends>\n"
" <name>Spell Check</name>\n"
" <summary>Check the spelling when teaching</summary>\n"
" <pkgname>zeus-spell</pkgname>\n"
" <icon type=\"stock\">non-existent</icon>\n"
" </component>\n"
" <component type=\"desktop\">\n"
" <id>Uninstall Zeus.desktop</id>\n"
" <name>Uninstall Zeus</name>\n"
" <summary>Uninstall the teaching application</summary>\n"
" <icon type=\"stock\">org.gnome.Software.Dummy</icon>\n"
" </component>\n"
" <component type=\"os-upgrade\">\n"
" <id>org.fedoraproject.release-rawhide.upgrade</id>\n"
" <name>Fedora Rawhide</name>\n"
" <summary>Release specific tagline</summary>\n"
" <pkgname>fedora-release</pkgname>\n"
" </component>\n"
" <info>\n"
" <scope>user</scope>\n"
" </info>\n"
"</components>\n");
g_setenv ("GS_SELF_TEST_APPSTREAM_XML", xml, TRUE);
/* we can only load this once per process */
plugin_loader = gs_plugin_loader_new (NULL, NULL);
g_signal_connect (plugin_loader, "status-changed",
G_CALLBACK (gs_plugin_loader_status_changed_cb), NULL);
gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR);
gs_plugin_loader_add_location (plugin_loader, LOCALPLUGINDIR_CORE);
ret = gs_plugin_loader_setup (plugin_loader,
allowlist,
NULL,
NULL,
&error);
g_assert_no_error (error);
g_assert (ret);
g_assert (!gs_plugin_loader_get_enabled (plugin_loader, "notgoingtoexist"));
g_assert (gs_plugin_loader_get_enabled (plugin_loader, "appstream"));
g_assert (gs_plugin_loader_get_enabled (plugin_loader, "dummy"));
/* plugin tests go here */
g_test_add_data_func ("/gnome-software/plugins/dummy/wildcard",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_wildcard_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/plugin-cache",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_plugin_cache_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/key-colors",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_key_colors_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/search",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_search_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/search-alternate",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_search_alternate_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/url-to-app",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_url_to_app_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/install",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_install_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/error",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_error_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/installed",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_installed_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/refine",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_refine_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/updates",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_updates_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/distro-upgrades",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_distro_upgrades_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/metadata-quirks",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_metadata_quirks);
g_test_add_data_func ("/gnome-software/plugins/dummy/limit-parallel-ops",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_limit_parallel_ops_func);
g_test_add_data_func ("/gnome-software/plugins/dummy/app-size-calc",
plugin_loader,
(GTestDataFunc) gs_plugins_dummy_app_size_calc_func);
retval = g_test_run ();
/* Clean up. */
gs_utils_rmtree (tmp_root, NULL);
return retval;
}