forked from Mirrors/flatpak-builder
922 lines
29 KiB
C
922 lines
29 KiB
C
#include "config.h"
|
||
#include <string.h>
|
||
#include <glib.h>
|
||
#include "libglnx/libglnx.h"
|
||
#include "flatpak.h"
|
||
|
||
static char *testdir;
|
||
static char *flatpak_runtimedir;
|
||
static char *flatpak_systemdir;
|
||
static char *flatpak_configdir;
|
||
static char *flatpak_installationsdir;
|
||
static char *gpg_homedir;
|
||
static char *gpg_args;
|
||
static char *repo_url;
|
||
#ifdef FLATPAK_ENABLE_P2P
|
||
static char *repo_collection_id;
|
||
#endif /* FLATPAK_ENABLE_P2P */
|
||
int httpd_pid = -1;
|
||
|
||
static const char *gpg_id = "7B0961FD";
|
||
const char *repo_name = "test-repo";
|
||
|
||
typedef struct
|
||
{
|
||
const char *id;
|
||
const char *display_name;
|
||
gint priority;
|
||
FlatpakStorageType storage_type;
|
||
} InstallationExtraData;
|
||
|
||
static void
|
||
test_library_version (void)
|
||
{
|
||
g_autofree char *version = NULL;
|
||
|
||
version = g_strdup_printf ("%d.%d.%d",
|
||
FLATPAK_MAJOR_VERSION,
|
||
FLATPAK_MINOR_VERSION,
|
||
FLATPAK_MICRO_VERSION);
|
||
g_assert_cmpstr (version, ==, PACKAGE_VERSION);
|
||
}
|
||
|
||
static void
|
||
test_user_installation (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autoptr(GFile) dir = NULL;
|
||
g_autofree char *path = NULL;
|
||
g_autofree char *expected_path = NULL;
|
||
|
||
inst = flatpak_installation_new_user (NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_nonnull (inst);
|
||
|
||
g_assert_true (flatpak_installation_get_is_user (inst));
|
||
|
||
dir = flatpak_installation_get_path (inst);
|
||
path = g_file_get_path (dir);
|
||
expected_path = g_build_filename (g_get_user_data_dir (), "flatpak", NULL);
|
||
g_assert_cmpstr (path, ==, expected_path);
|
||
}
|
||
|
||
static void
|
||
test_system_installation (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autoptr(GFile) dir = NULL;
|
||
g_autofree char *path = NULL;
|
||
|
||
inst = flatpak_installation_new_system (NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_nonnull (inst);
|
||
|
||
g_assert_false (flatpak_installation_get_is_user (inst));
|
||
|
||
dir = flatpak_installation_get_path (inst);
|
||
path = g_file_get_path (dir);
|
||
g_assert_cmpstr (path, ==, flatpak_systemdir);
|
||
}
|
||
|
||
static void
|
||
test_multiple_system_installations (void)
|
||
{
|
||
/* This is sorted according to the specific priority of each installation */
|
||
static InstallationExtraData expected_installations[] = {
|
||
{ "extra-installation-2", "Extra system installation 2", 25, FLATPAK_STORAGE_TYPE_SDCARD},
|
||
{ "extra-installation-1", "Extra system installation 1", 10, FLATPAK_STORAGE_TYPE_MMC},
|
||
{ "extra-installation-3", NULL, 0, FLATPAK_STORAGE_TYPE_DEFAULT},
|
||
{ "default", "Default system directory", 0, FLATPAK_STORAGE_TYPE_DEFAULT},
|
||
};
|
||
|
||
g_autoptr(GPtrArray) system_dirs = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
|
||
FlatpakInstallation *installation = NULL;
|
||
const char *current_id = NULL;
|
||
const char *current_display_name = NULL;
|
||
gint current_priority = 0;
|
||
FlatpakStorageType current_storage_type = FLATPAK_STORAGE_TYPE_DEFAULT;
|
||
int i;
|
||
|
||
system_dirs = flatpak_get_system_installations (NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_nonnull (system_dirs);
|
||
g_assert_cmpint (system_dirs->len, ==, 4);
|
||
|
||
for (i = 0; i < system_dirs->len; i++)
|
||
{
|
||
g_autoptr (FlatpakInstallation) new_install = NULL;
|
||
g_autoptr(GFile) installation_path = NULL;
|
||
g_autofree char *path_str = NULL;
|
||
|
||
installation = (FlatpakInstallation*) g_ptr_array_index (system_dirs, i);
|
||
g_assert_false (flatpak_installation_get_is_user (installation));
|
||
|
||
installation_path = flatpak_installation_get_path (installation);
|
||
g_assert_nonnull (installation_path);
|
||
|
||
current_id = flatpak_installation_get_id (installation);
|
||
g_assert_cmpstr (current_id, ==, expected_installations[i].id);
|
||
|
||
path_str = g_file_get_path (installation_path);
|
||
if (g_strcmp0 (current_id, "default") == 0)
|
||
g_assert_cmpstr (path_str, ==, flatpak_systemdir);
|
||
else
|
||
g_assert_cmpstr (path_str, !=, flatpak_systemdir);
|
||
|
||
current_display_name = flatpak_installation_get_display_name (installation);
|
||
g_assert_cmpstr (current_display_name, ==, expected_installations[i].display_name);
|
||
|
||
current_priority = flatpak_installation_get_priority (installation);
|
||
g_assert_cmpint (current_priority, ==, expected_installations[i].priority);
|
||
|
||
current_storage_type = flatpak_installation_get_storage_type (installation);
|
||
g_assert_cmpint (current_storage_type, ==, expected_installations[i].storage_type);
|
||
|
||
/* Now test that flatpak_installation_new_system_with_id() works too */
|
||
|
||
new_install = flatpak_installation_new_system_with_id (current_id, NULL, &error);
|
||
g_assert_nonnull (new_install);
|
||
|
||
g_assert_cmpstr(current_id, ==, flatpak_installation_get_id (new_install));
|
||
g_assert_cmpstr(current_display_name, ==, flatpak_installation_get_display_name (new_install));
|
||
g_assert_cmpint(current_priority, ==, flatpak_installation_get_priority (new_install));
|
||
g_assert_cmpint(current_storage_type, ==, flatpak_installation_get_storage_type (new_install));
|
||
}
|
||
}
|
||
|
||
static void
|
||
test_arches (void)
|
||
{
|
||
const char *default_arch;
|
||
const char *const *supported_arches;
|
||
|
||
default_arch = flatpak_get_default_arch ();
|
||
supported_arches = flatpak_get_supported_arches ();
|
||
|
||
g_assert_nonnull (default_arch);
|
||
g_assert_cmpstr (default_arch, !=, "");
|
||
|
||
g_assert_nonnull (supported_arches);
|
||
g_assert (g_strv_contains (supported_arches, default_arch));
|
||
}
|
||
|
||
static void
|
||
test_ref (void)
|
||
{
|
||
g_autoptr(FlatpakRef) ref = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autofree char *formatted = NULL;
|
||
const char *valid;
|
||
|
||
ref = flatpak_ref_parse ("", &error);
|
||
g_assert_null (ref);
|
||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
||
g_clear_error (&error);
|
||
|
||
ref = flatpak_ref_parse ("ref/or not", &error);
|
||
g_assert_null (ref);
|
||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
||
g_clear_error (&error);
|
||
|
||
ref = flatpak_ref_parse ("ref/one/2/3", &error);
|
||
g_assert_null (ref);
|
||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
||
g_clear_error (&error);
|
||
|
||
ref = flatpak_ref_parse ("app/a/b/c", &error);
|
||
g_assert_null (ref);
|
||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
||
g_clear_error (&error);
|
||
|
||
ref = flatpak_ref_parse ("app/org.flatpak.Hello/b/.", &error);
|
||
g_assert_null (ref);
|
||
g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED);
|
||
g_clear_error (&error);
|
||
|
||
valid = "app/org.flatpak.Hello/x86_64/master";
|
||
ref = flatpak_ref_parse (valid, &error);
|
||
g_assert_no_error (error);
|
||
g_assert (FLATPAK_IS_REF (ref));
|
||
g_assert_cmpint (flatpak_ref_get_kind (ref), ==, FLATPAK_REF_KIND_APP);
|
||
g_assert_cmpstr (flatpak_ref_get_name (ref), ==, "org.flatpak.Hello");
|
||
g_assert_cmpstr (flatpak_ref_get_arch (ref), ==, "x86_64");
|
||
g_assert_cmpstr (flatpak_ref_get_branch (ref), ==, "master");
|
||
#ifdef FLATPAK_ENABLE_P2P
|
||
g_assert_null (flatpak_ref_get_collection_id (ref));
|
||
#endif /* FLATPAK_ENABLE_P2P */
|
||
|
||
formatted = flatpak_ref_format_ref (ref);
|
||
g_assert_cmpstr (formatted, ==, valid);
|
||
}
|
||
|
||
static void
|
||
test_list_remotes (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autoptr(GPtrArray) remotes = NULL;
|
||
FlatpakRemote *remote;
|
||
|
||
inst = flatpak_installation_new_user (NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
remotes = flatpak_installation_list_remotes (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_nonnull (remotes);
|
||
g_assert (remotes->len == 1);
|
||
|
||
remote = g_ptr_array_index (remotes, 0);
|
||
g_assert (FLATPAK_IS_REMOTE (remote));
|
||
}
|
||
|
||
static void
|
||
test_remote_by_name (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
FlatpakRemote *remote;
|
||
|
||
inst = flatpak_installation_new_user (NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
remote = flatpak_installation_get_remote_by_name (inst, repo_name, NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
g_assert (FLATPAK_IS_REMOTE (remote));
|
||
g_assert_cmpstr (flatpak_remote_get_name (remote), ==, repo_name);
|
||
g_assert_cmpstr (flatpak_remote_get_url (remote), ==, repo_url);
|
||
g_assert_cmpstr (flatpak_remote_get_title (remote), ==, NULL);
|
||
g_assert_false (flatpak_remote_get_noenumerate (remote));
|
||
g_assert_false (flatpak_remote_get_disabled (remote));
|
||
g_assert_true (flatpak_remote_get_gpg_verify (remote));
|
||
g_assert_cmpint (flatpak_remote_get_prio (remote), ==, 1);
|
||
|
||
#ifdef FLATPAK_ENABLE_P2P
|
||
g_assert_cmpstr (flatpak_remote_get_collection_id (remote), ==, repo_collection_id);
|
||
#endif /* FLATPAK_ENABLE_P2P */
|
||
}
|
||
|
||
static void
|
||
test_remote (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autoptr(FlatpakRemote) remote = NULL;
|
||
gboolean res;
|
||
|
||
inst = flatpak_installation_new_user (NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
remote = flatpak_installation_get_remote_by_name (inst, repo_name, NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
#ifdef FLATPAK_ENABLE_P2P
|
||
g_assert_cmpstr (flatpak_remote_get_collection_id (remote), ==, NULL);
|
||
flatpak_remote_set_collection_id (remote, "org.example.CollectionID");
|
||
g_assert_cmpstr (flatpak_remote_get_collection_id (remote), ==, "org.example.CollectionID");
|
||
/* Don’t leave the collection ID set since the repos aren’t configured with one. */
|
||
flatpak_remote_set_collection_id (remote, NULL);
|
||
g_assert_cmpstr (flatpak_remote_get_collection_id (remote), ==, NULL);
|
||
#endif /* FLATPAK_ENABLE_P2P */
|
||
|
||
g_assert_cmpstr (flatpak_remote_get_title (remote), ==, NULL);
|
||
flatpak_remote_set_title (remote, "Test Repo");
|
||
g_assert_cmpstr (flatpak_remote_get_title (remote), ==, "Test Repo");
|
||
|
||
g_assert_cmpint (flatpak_remote_get_prio (remote), ==, 1);
|
||
flatpak_remote_set_prio (remote, 15);
|
||
g_assert_cmpint (flatpak_remote_get_prio (remote), ==, 15);
|
||
|
||
res = flatpak_installation_modify_remote (inst, remote, NULL, &error);
|
||
g_assert_true (res);
|
||
g_assert_no_error (error);
|
||
|
||
g_clear_object (&remote);
|
||
|
||
remote = flatpak_installation_get_remote_by_name (inst, repo_name, NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
g_assert_cmpstr (flatpak_remote_get_title (remote), ==, "Test Repo");
|
||
g_assert_cmpint (flatpak_remote_get_prio (remote), ==, 15);
|
||
}
|
||
|
||
static void
|
||
test_list_refs (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autoptr(GPtrArray) refs = NULL;
|
||
|
||
inst = flatpak_installation_new_user (NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
refs = flatpak_installation_list_installed_refs (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_nonnull (refs);
|
||
g_assert_cmpint (refs->len, ==, 0);
|
||
}
|
||
|
||
static void
|
||
progress_cb (const char *status,
|
||
guint progress,
|
||
gboolean estimating,
|
||
gpointer user_data)
|
||
{
|
||
int *count = user_data;
|
||
*count += 1;
|
||
}
|
||
|
||
static int changed_count;
|
||
|
||
static void
|
||
changed_cb (GFileMonitor *monitor,
|
||
GFile *file,
|
||
GFile *other_file,
|
||
GFileMonitorEvent event_type,
|
||
gpointer user_data)
|
||
{
|
||
GMainLoop *loop = user_data;
|
||
g_main_loop_quit (loop);
|
||
changed_count += 1;
|
||
}
|
||
|
||
static gboolean
|
||
quit (gpointer data)
|
||
{
|
||
GMainLoop *loop = data;
|
||
g_main_loop_quit (loop);
|
||
return G_SOURCE_CONTINUE;
|
||
}
|
||
|
||
static void
|
||
test_install_launch_uninstall (void)
|
||
{
|
||
g_autoptr(FlatpakInstallation) inst = NULL;
|
||
g_autoptr(GFileMonitor) monitor = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autoptr(FlatpakInstalledRef) ref = NULL;
|
||
g_autoptr(FlatpakInstalledRef) runtime_ref = NULL;
|
||
FlatpakInstalledRef *ref1 = NULL;
|
||
GPtrArray *refs = NULL;
|
||
g_autofree char *s = NULL;
|
||
g_autofree char *s1 = NULL;
|
||
int progress_count;
|
||
g_autoptr(GMainLoop) loop = NULL;
|
||
guint quit_id;
|
||
gboolean res;
|
||
const char *bwrap = g_getenv ("FLATPAK_BWRAP");
|
||
|
||
if (bwrap != NULL)
|
||
{
|
||
gint exit_code = 0;
|
||
char *argv[] = { (char *)bwrap, "--ro-bind", "/", "/", "/bin/true", NULL };
|
||
g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &exit_code, &error);
|
||
g_assert_no_error (error);
|
||
if (exit_code != 0)
|
||
{
|
||
g_test_skip ("bwrap not supported");
|
||
return;
|
||
}
|
||
}
|
||
|
||
inst = flatpak_installation_new_user (NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
monitor = flatpak_installation_create_monitor (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert (G_IS_FILE_MONITOR (monitor));
|
||
g_file_monitor_set_rate_limit (monitor, 100);
|
||
|
||
loop = g_main_loop_new (NULL, TRUE);
|
||
|
||
g_signal_connect (monitor, "changed", G_CALLBACK (changed_cb), loop);
|
||
|
||
refs = flatpak_installation_list_installed_refs (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (refs->len, ==, 0);
|
||
g_ptr_array_unref (refs);
|
||
|
||
changed_count = 0;
|
||
progress_count = 0;
|
||
ref = flatpak_installation_install (inst,
|
||
repo_name,
|
||
FLATPAK_REF_KIND_RUNTIME,
|
||
"org.test.Platform",
|
||
NULL,
|
||
NULL,
|
||
progress_cb,
|
||
&progress_count,
|
||
NULL,
|
||
&error);
|
||
g_assert_no_error (error);
|
||
g_assert (FLATPAK_IS_INSTALLED_REF (ref));
|
||
g_assert_cmpint (progress_count, >, 0);
|
||
|
||
quit_id = g_timeout_add (1000, quit, loop);
|
||
g_main_loop_run (loop);
|
||
g_source_remove (quit_id);
|
||
|
||
g_assert_cmpint (changed_count, >, 0);
|
||
|
||
g_assert_cmpstr (flatpak_ref_get_name (FLATPAK_REF (ref)), ==, "org.test.Platform");
|
||
g_assert_cmpstr (flatpak_ref_get_arch (FLATPAK_REF (ref)), ==, flatpak_get_default_arch ());
|
||
g_assert_cmpstr (flatpak_ref_get_branch (FLATPAK_REF (ref)), ==, "master");
|
||
g_assert_cmpint (flatpak_ref_get_kind (FLATPAK_REF (ref)), ==, FLATPAK_REF_KIND_RUNTIME);
|
||
#ifdef FLATPAK_ENABLE_P2P
|
||
g_assert_null (flatpak_ref_get_collection_id (FLATPAK_REF (ref)));
|
||
#endif /* FLATPAK_ENABLE_P2P */
|
||
|
||
g_assert_cmpuint (flatpak_installed_ref_get_installed_size (ref), >, 0);
|
||
|
||
refs = flatpak_installation_list_installed_refs (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (refs->len, ==, 1);
|
||
|
||
ref1 = g_ptr_array_index (refs, 0);
|
||
g_assert_cmpstr (flatpak_ref_get_commit (FLATPAK_REF (ref1)), ==, flatpak_ref_get_commit (FLATPAK_REF (ref)));
|
||
|
||
s = flatpak_ref_format_ref (FLATPAK_REF (ref));
|
||
s1 = flatpak_ref_format_ref (FLATPAK_REF (ref1));
|
||
g_assert_cmpstr (s, ==, s1);
|
||
|
||
g_ptr_array_unref (refs);
|
||
|
||
runtime_ref = g_object_ref (ref);
|
||
g_clear_object (&ref);
|
||
|
||
changed_count = 0;
|
||
progress_count = 0;
|
||
ref = flatpak_installation_install (inst,
|
||
repo_name,
|
||
FLATPAK_REF_KIND_APP,
|
||
"org.test.Hello",
|
||
NULL,
|
||
NULL,
|
||
progress_cb,
|
||
&progress_count,
|
||
NULL,
|
||
&error);
|
||
g_assert_no_error (error);
|
||
g_assert (FLATPAK_IS_INSTALLED_REF (ref));
|
||
g_assert_cmpint (progress_count, >, 0);
|
||
|
||
quit_id = g_timeout_add (1000, quit, loop);
|
||
g_main_loop_run (loop);
|
||
g_source_remove (quit_id);
|
||
|
||
g_assert_cmpint (changed_count, >, 0);
|
||
|
||
g_assert_cmpstr (flatpak_ref_get_name (FLATPAK_REF (ref)), ==, "org.test.Hello");
|
||
g_assert_cmpstr (flatpak_ref_get_arch (FLATPAK_REF (ref)), ==, flatpak_get_default_arch ());
|
||
g_assert_cmpstr (flatpak_ref_get_branch (FLATPAK_REF (ref)), ==, "master");
|
||
g_assert_cmpint (flatpak_ref_get_kind (FLATPAK_REF (ref)), ==, FLATPAK_REF_KIND_APP);
|
||
#ifdef FLATPAK_ENABLE_P2P
|
||
g_assert_null (flatpak_ref_get_collection_id (FLATPAK_REF (ref)));
|
||
#endif /* FLATPAK_ENABLE_P2P */
|
||
|
||
g_assert_cmpuint (flatpak_installed_ref_get_installed_size (ref), >, 0);
|
||
g_assert_true (flatpak_installed_ref_get_is_current (ref));
|
||
|
||
refs = flatpak_installation_list_installed_refs (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (refs->len, ==, 2);
|
||
|
||
g_ptr_array_unref (refs);
|
||
|
||
res = flatpak_installation_launch (inst, "org.test.Hello", NULL, NULL, NULL, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_true (res);
|
||
|
||
quit_id = g_timeout_add (500, quit, loop);
|
||
g_main_loop_run (loop);
|
||
g_source_remove (quit_id);
|
||
|
||
changed_count = 0;
|
||
progress_count = 0;
|
||
res = flatpak_installation_uninstall (inst,
|
||
flatpak_ref_get_kind (FLATPAK_REF (ref)),
|
||
flatpak_ref_get_name (FLATPAK_REF (ref)),
|
||
flatpak_ref_get_arch (FLATPAK_REF (ref)),
|
||
flatpak_ref_get_branch (FLATPAK_REF (ref)),
|
||
progress_cb,
|
||
&progress_count,
|
||
NULL,
|
||
&error);
|
||
g_assert_no_error (error);
|
||
g_assert_true (res);
|
||
//FIXME: no progress for uninstall
|
||
//g_assert_cmpint (progress_count, >, 0);
|
||
|
||
quit_id = g_timeout_add (500, quit, loop);
|
||
g_main_loop_run (loop);
|
||
g_source_remove (quit_id);
|
||
|
||
refs = flatpak_installation_list_installed_refs (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (refs->len, ==, 1);
|
||
|
||
g_ptr_array_unref (refs);
|
||
|
||
changed_count = 0;
|
||
progress_count = 0;
|
||
res = flatpak_installation_uninstall (inst,
|
||
flatpak_ref_get_kind (FLATPAK_REF (runtime_ref)),
|
||
flatpak_ref_get_name (FLATPAK_REF (runtime_ref)),
|
||
flatpak_ref_get_arch (FLATPAK_REF (runtime_ref)),
|
||
flatpak_ref_get_branch (FLATPAK_REF (runtime_ref)),
|
||
progress_cb,
|
||
&progress_count,
|
||
NULL,
|
||
&error);
|
||
g_assert_no_error (error);
|
||
g_assert_true (res);
|
||
//FIXME: no progress for uninstall
|
||
//g_assert_cmpint (progress_count, >, 0);
|
||
|
||
quit_id = g_timeout_add (500, quit, loop);
|
||
g_main_loop_run (loop);
|
||
g_source_remove (quit_id);
|
||
|
||
refs = flatpak_installation_list_installed_refs (inst, NULL, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (refs->len, ==, 0);
|
||
|
||
g_ptr_array_unref (refs);
|
||
}
|
||
|
||
static void
|
||
make_test_runtime (void)
|
||
{
|
||
int status;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autofree char *arg0 = NULL;
|
||
char *argv[] = {
|
||
NULL, "test", "org.test.Platform", "", "bash", "ls", "cat", "echo", "readlink", NULL
|
||
};
|
||
GSpawnFlags flags = G_SPAWN_DEFAULT;
|
||
|
||
arg0 = g_test_build_filename (G_TEST_DIST, "make-test-runtime.sh", NULL);
|
||
argv[0] = arg0;
|
||
|
||
if (g_test_verbose ())
|
||
{
|
||
g_autofree char *commandline = g_strjoinv (" ", argv);
|
||
g_print ("running %s\n", commandline);
|
||
}
|
||
else
|
||
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||
|
||
g_spawn_sync (NULL, (char **)argv, NULL, flags, NULL, NULL, NULL, NULL, &status, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (status, ==, 0);
|
||
}
|
||
|
||
static void
|
||
make_test_app (void)
|
||
{
|
||
int status;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autofree char *arg0 = NULL;
|
||
char *argv[] = { NULL, "test", "", NULL };
|
||
GSpawnFlags flags = G_SPAWN_DEFAULT;
|
||
|
||
arg0 = g_test_build_filename (G_TEST_DIST, "make-test-app.sh", NULL);
|
||
argv[0] = arg0;
|
||
|
||
if (g_test_verbose ())
|
||
{
|
||
g_autofree char *commandline = g_strjoinv (" ", argv);
|
||
g_print ("running %s\n", commandline);
|
||
}
|
||
else
|
||
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||
|
||
g_spawn_sync (NULL, (char **)argv, NULL, flags, NULL, NULL, NULL, NULL, &status, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (status, ==, 0);
|
||
}
|
||
|
||
static void
|
||
update_repo (void)
|
||
{
|
||
int status;
|
||
g_autoptr(GError) error = NULL;
|
||
char *argv[] = { "flatpak", "build-update-repo", "--gpg-homedir=", "--gpg-sign=", "repos/test", NULL };
|
||
GSpawnFlags flags = G_SPAWN_SEARCH_PATH;
|
||
g_auto(GStrv) gpgargs = NULL;
|
||
|
||
gpgargs = g_strsplit (gpg_args, " ", 0);
|
||
argv[2] = gpgargs[0];
|
||
argv[3] = gpgargs[1];
|
||
|
||
if (g_test_verbose ())
|
||
{
|
||
g_autofree char *commandline = g_strjoinv (" ", argv);
|
||
g_print ("running %s\n", commandline);
|
||
}
|
||
else
|
||
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||
|
||
g_spawn_sync (NULL, (char **)argv, NULL, flags, NULL, NULL, NULL, NULL, &status, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (status, ==, 0);
|
||
}
|
||
|
||
static void
|
||
launch_httpd (void)
|
||
{
|
||
int status;
|
||
g_autoptr(GError) error = NULL;
|
||
g_autofree char *path = g_test_build_filename (G_TEST_DIST, "test-webserver.sh", NULL);
|
||
char *argv[] = {path , "repos", NULL };
|
||
GSpawnFlags flags = G_SPAWN_SEARCH_PATH;
|
||
|
||
if (g_test_verbose ())
|
||
{
|
||
g_autofree char *commandline = g_strjoinv (" ", argv);
|
||
g_print ("running %s\n", commandline);
|
||
}
|
||
else
|
||
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||
|
||
g_spawn_sync (NULL, (char **)argv, NULL, flags, NULL, NULL, NULL, NULL, &status, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (status, ==, 0);
|
||
}
|
||
|
||
static void
|
||
add_remote (void)
|
||
{
|
||
int status;
|
||
g_autoptr(GError) error = NULL;
|
||
char *argv[] = { "flatpak", "remote-add", "--user", "--gpg-import=", "name", "url", NULL };
|
||
g_autofree char *gpgimport = NULL;
|
||
g_autofree char *port = NULL;
|
||
g_autofree char *pid = NULL;
|
||
GSpawnFlags flags = G_SPAWN_SEARCH_PATH;
|
||
|
||
launch_httpd ();
|
||
|
||
g_file_get_contents ("httpd-pid", &pid, NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
httpd_pid = atoi (pid);
|
||
g_assert_cmpint (httpd_pid, !=, 0);
|
||
|
||
g_file_get_contents ("httpd-port", &port, NULL, &error);
|
||
g_assert_no_error (error);
|
||
|
||
if (port[strlen (port) - 1] == '\n')
|
||
port[strlen (port) - 1] = '\0';
|
||
|
||
gpgimport = g_strdup_printf ("--gpg-import=%s/pubring.gpg", gpg_homedir);
|
||
repo_url = g_strdup_printf ("http://127.0.0.1:%s/test", port);
|
||
|
||
argv[3] = gpgimport;
|
||
argv[4] = (char *)repo_name;
|
||
argv[5] = repo_url;
|
||
|
||
if (g_test_verbose ())
|
||
{
|
||
g_autofree char *commandline = g_strjoinv (" ", argv);
|
||
g_print ("running %s\n", commandline);
|
||
}
|
||
else
|
||
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||
|
||
g_spawn_sync (NULL, (char **)argv, NULL, flags, NULL, NULL, NULL, NULL, &status, &error);
|
||
g_assert_no_error (error);
|
||
g_assert_cmpint (status, ==, 0);
|
||
}
|
||
|
||
static void
|
||
add_extra_installation (const char *id,
|
||
const char *display_name,
|
||
const char *storage_type,
|
||
const char *priority)
|
||
{
|
||
g_autofree char *conffile_path = NULL;
|
||
g_autofree char *contents_string = NULL;
|
||
g_autofree char *path = NULL;
|
||
g_autoptr(GPtrArray) contents_array = NULL;
|
||
g_autoptr(GError) error = NULL;
|
||
|
||
path = g_strconcat (testdir, "/system-", id, NULL);
|
||
g_mkdir_with_parents (path, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
|
||
contents_array = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
|
||
|
||
g_ptr_array_add (contents_array,
|
||
g_strdup_printf ("[Installation \"%s\"]\n"
|
||
"Path=%s",
|
||
id, path));
|
||
|
||
if (display_name != NULL)
|
||
g_ptr_array_add (contents_array, g_strdup_printf ("DisplayName=%s", display_name));
|
||
|
||
if (storage_type != NULL)
|
||
g_ptr_array_add (contents_array, g_strdup_printf ("StorageType=%s", storage_type));
|
||
|
||
if (priority != NULL)
|
||
g_ptr_array_add (contents_array, g_strdup_printf ("Priority=%s", priority));
|
||
|
||
g_ptr_array_add (contents_array, NULL);
|
||
contents_string = g_strjoinv ("\n", (char**)contents_array->pdata);
|
||
|
||
conffile_path = g_strconcat (flatpak_installationsdir, "/", id, ".conf", NULL);
|
||
g_file_set_contents (conffile_path, contents_string, -1, &error);
|
||
g_assert_no_error (error);
|
||
}
|
||
|
||
static void
|
||
setup_multiple_installations (void)
|
||
{
|
||
flatpak_installationsdir = g_strconcat (flatpak_configdir, "/installations.d", NULL);
|
||
g_mkdir_with_parents (flatpak_installationsdir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
|
||
add_extra_installation ("extra-installation-1", "Extra system installation 1", "mmc", "10");
|
||
add_extra_installation ("extra-installation-2", "Extra system installation 2", "sdcard", "25");
|
||
add_extra_installation ("extra-installation-3", NULL, NULL, NULL);
|
||
}
|
||
|
||
static void
|
||
setup_repo (void)
|
||
{
|
||
make_test_runtime ();
|
||
make_test_app ();
|
||
update_repo ();
|
||
add_remote ();
|
||
}
|
||
|
||
static void
|
||
copy_file (const char *src, const char *dest)
|
||
{
|
||
gchar *buffer = NULL;
|
||
gsize length;
|
||
g_autoptr(GError) error = NULL;
|
||
|
||
if (g_test_verbose ())
|
||
g_print ("copying %s to %s\n", src, dest);
|
||
|
||
if (g_file_get_contents (src, &buffer, &length, &error))
|
||
g_file_set_contents (dest, buffer, length, &error);
|
||
g_assert_no_error (error);
|
||
g_free (buffer);
|
||
}
|
||
|
||
static void
|
||
copy_gpg (void)
|
||
{
|
||
char *src;
|
||
char *dest;
|
||
|
||
src = g_test_build_filename (G_TEST_DIST, "test-keyring", "pubring.gpg", NULL);
|
||
dest = g_strconcat (gpg_homedir, "/pubring.gpg", NULL);
|
||
copy_file (src, dest);
|
||
g_free (src);
|
||
g_free (dest);
|
||
|
||
src = g_test_build_filename (G_TEST_DIST, "test-keyring", "secring.gpg", NULL);
|
||
dest = g_strconcat (gpg_homedir, "/secring.gpg", NULL);
|
||
copy_file (src, dest);
|
||
g_free (src);
|
||
g_free (dest);
|
||
}
|
||
|
||
static void
|
||
global_setup (void)
|
||
{
|
||
g_autofree char *cachedir = NULL;
|
||
g_autofree char *configdir = NULL;
|
||
g_autofree char *datadir = NULL;
|
||
g_autofree char *homedir = NULL;
|
||
|
||
testdir = g_strdup ("/var/tmp/flatpak-test-XXXXXX");
|
||
g_mkdtemp (testdir);
|
||
if (g_test_verbose ())
|
||
g_print ("testdir: %s\n", testdir);
|
||
|
||
homedir = g_strconcat (testdir, "/home", NULL);
|
||
g_mkdir_with_parents (homedir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("HOME", homedir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting HOME=%s\n", datadir);
|
||
|
||
cachedir = g_strconcat (testdir, "/home/cache", NULL);
|
||
g_mkdir_with_parents (cachedir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("XDG_CACHE_HOME", cachedir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting XDG_CACHE_HOME=%s\n", cachedir);
|
||
|
||
configdir = g_strconcat (testdir, "/home/config", NULL);
|
||
g_mkdir_with_parents (configdir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("XDG_CONFIG_HOME", configdir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting XDG_CONFIG_HOME=%s\n", configdir);
|
||
|
||
datadir = g_strconcat (testdir, "/home/share", NULL);
|
||
g_mkdir_with_parents (datadir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("XDG_DATA_HOME", datadir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting XDG_DATA_HOME=%s\n", datadir);
|
||
|
||
flatpak_runtimedir = g_strconcat (testdir, "/runtime", NULL);
|
||
g_mkdir_with_parents (flatpak_runtimedir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("XDG_RUNTIME_DIR", flatpak_runtimedir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting XDG_RUNTIME_DIR=%s\n", flatpak_runtimedir);
|
||
|
||
flatpak_systemdir = g_strconcat (testdir, "/system", NULL);
|
||
g_mkdir_with_parents (flatpak_systemdir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("FLATPAK_SYSTEM_DIR", flatpak_systemdir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting FLATPAK_SYSTEM_DIR=%s\n", flatpak_systemdir);
|
||
|
||
flatpak_configdir = g_strconcat (testdir, "/config", NULL);
|
||
g_mkdir_with_parents (flatpak_configdir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
g_setenv ("FLATPAK_CONFIG_DIR", flatpak_configdir, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting FLATPAK_CONFIG_DIR=%s\n", flatpak_configdir);
|
||
|
||
gpg_homedir = g_strconcat (testdir, "/gpghome", NULL);
|
||
g_mkdir_with_parents (gpg_homedir, S_IRWXU|S_IRWXG|S_IRWXO);
|
||
|
||
gpg_args = g_strdup_printf ("--gpg-homedir=%s --gpg-sign=%s", gpg_homedir, gpg_id);
|
||
g_setenv ("GPGARGS", gpg_args, TRUE);
|
||
if (g_test_verbose ())
|
||
g_print ("setting GPGARGS=%s\n", gpg_args);
|
||
|
||
copy_gpg ();
|
||
setup_multiple_installations();
|
||
setup_repo ();
|
||
}
|
||
|
||
static void
|
||
global_teardown (void)
|
||
{
|
||
int status;
|
||
g_autoptr (GError) error = NULL;
|
||
char *argv[] = { "gpg-connect-agent", "--homedir", "<placeholder>", "killagent", "/bye", NULL };
|
||
GSpawnFlags flags = G_SPAWN_SEARCH_PATH;
|
||
|
||
if (g_getenv ("SKIP_TEARDOWN"))
|
||
return;
|
||
|
||
argv[2] = gpg_homedir;
|
||
|
||
if (g_test_verbose ())
|
||
{
|
||
g_autofree char *commandline = g_strjoinv (" ", argv);
|
||
g_print ("running %s\n", commandline);
|
||
}
|
||
else
|
||
{
|
||
flags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||
}
|
||
|
||
if (httpd_pid != -1)
|
||
kill (httpd_pid, SIGKILL);
|
||
|
||
/* mostly ignore failure here */
|
||
if (!g_spawn_sync (NULL, (char **)argv, NULL, flags, NULL, NULL, NULL, NULL, &status, &error) ||
|
||
!g_spawn_check_exit_status (status, &error))
|
||
{
|
||
g_print ("# failed to run gpg-connect-agent to stop gpg-agent: %s\n", error->message);
|
||
}
|
||
|
||
glnx_shutil_rm_rf_at (-1, testdir, NULL, NULL);
|
||
g_free (testdir);
|
||
}
|
||
|
||
int
|
||
main (int argc, char *argv[])
|
||
{
|
||
int res;
|
||
|
||
g_test_init (&argc, &argv, NULL);
|
||
|
||
g_test_add_func ("/library/version", test_library_version);
|
||
g_test_add_func ("/library/user-installation", test_user_installation);
|
||
g_test_add_func ("/library/system-installation", test_system_installation);
|
||
g_test_add_func ("/library/multiple-system-installation", test_multiple_system_installations);
|
||
g_test_add_func ("/library/arches", test_arches);
|
||
g_test_add_func ("/library/ref", test_ref);
|
||
g_test_add_func ("/library/list-remotes", test_list_remotes);
|
||
g_test_add_func ("/library/remote-by-name", test_remote_by_name);
|
||
g_test_add_func ("/library/remote", test_remote);
|
||
g_test_add_func ("/library/list-refs", test_list_refs);
|
||
g_test_add_func ("/library/install-launch-uninstall", test_install_launch_uninstall);
|
||
|
||
global_setup ();
|
||
|
||
res = g_test_run ();
|
||
|
||
global_teardown ();
|
||
|
||
return res;
|
||
}
|