summaryrefslogtreecommitdiffstats
path: root/plugins/epiphany/gs-self-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/epiphany/gs-self-test.c')
-rw-r--r--plugins/epiphany/gs-self-test.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/plugins/epiphany/gs-self-test.c b/plugins/epiphany/gs-self-test.c
new file mode 100644
index 0000000..1b91021
--- /dev/null
+++ b/plugins/epiphany/gs-self-test.c
@@ -0,0 +1,240 @@
+/* -*- 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>
+ * Copyright (C) 2021 Matthew Leeds <mwleeds@protonmail.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include "config.h"
+
+#include "gnome-software-private.h"
+
+#include "gs-test.h"
+#include "gs-dynamic-launcher-portal-iface.h"
+#include "gs-epiphany-generated.h"
+
+#include <libglib-testing/dbus-queue.h>
+
+/* This is run in a worker thread */
+static void
+epiphany_and_portal_mock_server_cb (GtDBusQueue *queue,
+ gpointer user_data)
+{
+ {
+ g_autoptr(GDBusMethodInvocation) invocation = NULL;
+ g_autoptr(GVariant) properties_variant = NULL;
+ const char *property_interface;
+ invocation = gt_dbus_queue_assert_pop_message (queue,
+ "/org/gnome/Epiphany/WebAppProvider",
+ "org.freedesktop.DBus.Properties",
+ "GetAll", "(&s)",
+ &property_interface);
+ g_assert_cmpstr (property_interface, ==, "org.gnome.Epiphany.WebAppProvider");
+ properties_variant = g_variant_new_parsed ("({'Version': <@u 1>},)");
+ g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&properties_variant));
+ }
+ {
+ g_autoptr(GDBusMethodInvocation) invocation = NULL;
+ g_autoptr(GVariant) properties_variant = NULL;
+ const char *property_interface, *props_dict;
+ invocation = gt_dbus_queue_assert_pop_message (queue,
+ "/org/freedesktop/portal/desktop",
+ "org.freedesktop.DBus.Properties",
+ "GetAll", "(&s)",
+ &property_interface);
+ g_assert_cmpstr (property_interface, ==, "org.freedesktop.portal.DynamicLauncher");
+ props_dict = "({'version': <@u 1>,'SupportedLauncherTypes': <@u 3>},)";
+ properties_variant = g_variant_new_parsed (props_dict);
+ g_dbus_method_invocation_return_value (invocation, g_steal_pointer (&properties_variant));
+ }
+ {
+ g_autoptr(GDBusMethodInvocation) invocation = NULL;
+ const char *installed_apps[] = {"org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043.desktop", NULL};
+ invocation = gt_dbus_queue_assert_pop_message (queue,
+ "/org/gnome/Epiphany/WebAppProvider",
+ "org.gnome.Epiphany.WebAppProvider",
+ "GetInstalledApps", "()", NULL);
+ g_dbus_method_invocation_return_value (invocation, g_variant_new ("(^as)", installed_apps));
+ }
+}
+
+static GtDBusQueue *
+bus_set_up (void)
+{
+ g_autoptr(GError) local_error = NULL;
+ g_autoptr(GtDBusQueue) queue = NULL;
+
+ queue = gt_dbus_queue_new ();
+
+ gt_dbus_queue_connect (queue, &local_error);
+ g_assert_no_error (local_error);
+
+ gt_dbus_queue_own_name (queue, "org.freedesktop.portal.Desktop");
+
+ gt_dbus_queue_export_object (queue,
+ "/org/freedesktop/portal/desktop",
+ (GDBusInterfaceInfo *) &org_freedesktop_portal_dynamic_launcher_interface,
+ &local_error);
+ g_assert_no_error (local_error);
+
+ gt_dbus_queue_own_name (queue, "org.gnome.Epiphany.WebAppProvider");
+
+ gt_dbus_queue_export_object (queue,
+ "/org/gnome/Epiphany/WebAppProvider",
+ gs_ephy_web_app_provider_interface_info (),
+ &local_error);
+ g_assert_no_error (local_error);
+
+ gt_dbus_queue_set_server_func (queue, epiphany_and_portal_mock_server_cb,
+ NULL);
+
+ return g_steal_pointer (&queue);
+}
+
+static void
+gs_plugins_epiphany_func (GsPluginLoader *plugin_loader)
+{
+ g_assert_true (gs_plugin_loader_get_enabled (plugin_loader, "epiphany"));
+}
+
+static char *
+create_fake_desktop_file (const char *app_id)
+{
+ g_autofree char *contents = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autofree char *desktop_path = NULL;
+ g_autofree char *icon_path = NULL;
+
+ /* Use an icon we already have locally */
+ icon_path = gs_test_get_filename (TESTDATADIR, "icons/hicolor/scalable/org.gnome.Software.svg");
+ g_assert (icon_path != NULL);
+
+ /* Use true instead of epiphany in Exec and TryExec; otherwise
+ * g_desktop_app_info_new() in the plugin code will look for an
+ * epiphany binary and fail.
+ */
+ contents = g_strdup_printf ("[Desktop Entry]\n"
+ "Name=Pinafore\n"
+ "Exec=true --application-mode \"--profile=/home/nobody/.local/share/%s\" https://pinafore.social/\n"
+ "StartupNotify=true\n"
+ "Terminal=false\n"
+ "Type=Application\n"
+ "Categories=GNOME;GTK;\n"
+ "Icon=%s\n"
+ "StartupWMClass=%s\n"
+ "X-Purism-FormFactor=Workstation;Mobile;\n"
+ "TryExec=true\n",
+ app_id, icon_path, app_id);
+
+ desktop_path = g_strconcat (g_get_user_data_dir (), G_DIR_SEPARATOR_S,
+ "applications", G_DIR_SEPARATOR_S,
+ app_id, ".desktop", NULL);
+
+ g_debug ("Creating a fake desktop file at path: %s", desktop_path);
+ gs_mkdir_parent (desktop_path, &error);
+ g_assert_no_error (error);
+ g_file_set_contents (desktop_path, contents, -1, &error);
+ g_assert_no_error (error);
+
+ return g_steal_pointer (&desktop_path);
+}
+
+static void
+gs_plugins_epiphany_installed_func (GsPluginLoader *plugin_loader)
+{
+ g_autoptr(GsAppQuery) query = NULL;
+ g_autoptr(GsPluginJob) plugin_job = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GIcon) icon = NULL;
+ g_autoptr(GsAppList) list = NULL;
+ GsApp *app;
+ const char *app_id = "org.gnome.Epiphany.WebApp_e9d0e1e4b0a10856aa3b38d9eb4375de4070d043";
+ const char *metainfo_app_id = "org.gnome.Software.WebApp_e636aa5f2069f6e9c02deccc7b65f43da7985e32.desktop";
+ const char *launchable_app_id;
+ g_autofree char *app_id_desktop = NULL;
+ g_autofree char *desktop_path = NULL;
+ g_autofree char *origin_ui = NULL;
+
+ app_id_desktop = g_strdup_printf ("%s.desktop", app_id);
+ desktop_path = create_fake_desktop_file (app_id);
+
+ query = gs_app_query_new ("is-installed", GS_APP_QUERY_TRISTATE_TRUE,
+ "refine-flags", GS_PLUGIN_REFINE_FLAGS_REQUIRE_ORIGIN,
+ "dedupe-flags", GS_PLUGIN_JOB_DEDUPE_FLAGS_DEFAULT,
+ 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_nonnull (list);
+
+ g_assert_cmpint (gs_app_list_length (list), ==, 1);
+ app = gs_app_list_index (list, 0);
+ g_assert_cmpstr (gs_app_get_id (app), ==, metainfo_app_id);
+ launchable_app_id = gs_app_get_launchable (app, AS_LAUNCHABLE_KIND_DESKTOP_ID);
+ g_assert_cmpstr (launchable_app_id, ==, app_id_desktop);
+ g_assert_cmpint (gs_app_get_kind (app), ==, AS_COMPONENT_KIND_WEB_APP);
+ g_assert_cmpint (gs_app_get_scope (app), ==, AS_COMPONENT_SCOPE_USER);
+ g_assert_cmpint (gs_app_get_state (app), ==, GS_APP_STATE_INSTALLED);
+ g_assert_cmpstr (gs_app_get_name (app), ==, "Pinafore");
+ g_assert_cmpstr (gs_app_get_summary (app), ==, "pinafore.social");
+ g_assert_cmpstr (gs_app_get_origin (app), ==, "gnome-web");
+ origin_ui = gs_app_dup_origin_ui (app, TRUE);
+ g_assert_cmpstr (origin_ui, ==, "GNOME Web");
+ icon = gs_app_get_icon_for_size (app, 4096, 1, NULL);
+ g_assert_nonnull (icon);
+ g_clear_object (&icon);
+
+ gs_utils_unlink (desktop_path, NULL);
+}
+
+int
+main (int argc, char **argv)
+{
+ gboolean ret;
+ g_autofree gchar *fn = NULL;
+ g_autofree gchar *xml = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GsPluginLoader) plugin_loader = NULL;
+ g_autoptr(GtDBusQueue) queue = NULL;
+ int res;
+ const gchar *allowlist[] = {
+ "epiphany",
+ "icons",
+ NULL
+ };
+
+ gs_test_init (&argc, &argv);
+ g_setenv ("GS_XMLB_VERBOSE", "1", TRUE);
+
+ /* Set up mock D-Bus services for the Epiphany WebAppProvider and the
+ * DynamicLauncher portal
+ */
+ queue = bus_set_up ();
+
+ /* we can only load this once per process */
+ plugin_loader = gs_plugin_loader_new (gt_dbus_queue_get_client_connection (queue), 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_true (ret);
+
+ /* plugin tests go here */
+ g_test_add_data_func ("/gnome-software/plugins/epiphany/enabled",
+ plugin_loader,
+ (GTestDataFunc) gs_plugins_epiphany_func);
+ g_test_add_data_func ("/gnome-software/plugins/epiphany/installed",
+ plugin_loader,
+ (GTestDataFunc) gs_plugins_epiphany_installed_func);
+
+ res = g_test_run ();
+ gt_dbus_queue_disconnect (queue, TRUE);
+ return res;
+}