summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2020-08-27 16:31:58 +0100
committerAlexander Larsson <alexander.larsson@gmail.com>2020-08-27 17:48:50 +0200
commit354b9a2257341c4b9ff313d547fe0aafc25c43f6 (patch)
tree43f656925eaa046e88271678fab8f0a919d14b8c
parent09424423b93e9ea263a9e3f2de1579814b941054 (diff)
downloadflatpak-354b9a2257341c4b9ff313d547fe0aafc25c43f6.tar.gz
tests: Use a temporary HOME directory to test contexts and exports
This gives us control over the paths that get shared (or not) and whether they are symlinks, so that we can expand coverage later. Signed-off-by: Simon McVittie <smcv@collabora.com>
-rw-r--r--tests/test-exports.c143
1 files changed, 115 insertions, 28 deletions
diff --git a/tests/test-exports.c b/tests/test-exports.c
index f27b7a21..6e6aeab6 100644
--- a/tests/test-exports.c
+++ b/tests/test-exports.c
@@ -28,17 +28,63 @@
#include "flatpak-exports-private.h"
#include "flatpak-run-private.h"
-/* This differs from g_file_test (path, G_FILE_TEST_IS_DIR) which
- returns true if the path is a symlink to a dir */
-static gboolean
-path_is_dir (const char *path)
+static char *testdir;
+
+static void
+global_setup (void)
{
- struct stat s;
+ g_autofree char *cachedir = NULL;
+ g_autofree char *configdir = NULL;
+ g_autofree char *datadir = NULL;
+ g_autofree char *homedir = NULL;
+ g_autofree char *runtimedir = NULL;
+
+ testdir = g_strdup ("/tmp/flatpak-test-XXXXXX");
+ g_mkdtemp (testdir);
+ g_test_message ("testdir: %s", testdir);
+
+ homedir = g_strconcat (testdir, "/home", NULL);
+ g_mkdir_with_parents (homedir, S_IRWXU | S_IRWXG | S_IRWXO);
+
+ g_setenv ("HOME", homedir, TRUE);
+ g_test_message ("setting HOME=%s", homedir);
+
+ 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);
+ g_test_message ("setting XDG_CACHE_HOME=%s", 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);
+ g_test_message ("setting XDG_CONFIG_HOME=%s", 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);
+ g_test_message ("setting XDG_DATA_HOME=%s", datadir);
+
+ runtimedir = g_strconcat (testdir, "/runtime", NULL);
+ g_mkdir_with_parents (runtimedir, S_IRWXU);
+ g_setenv ("XDG_RUNTIME_DIR", runtimedir, TRUE);
+ g_test_message ("setting XDG_RUNTIME_DIR=%s", runtimedir);
+
+ g_reload_user_special_dirs_cache ();
+
+ g_assert_cmpstr (g_get_user_cache_dir (), ==, cachedir);
+ g_assert_cmpstr (g_get_user_config_dir (), ==, configdir);
+ g_assert_cmpstr (g_get_user_data_dir (), ==, datadir);
+ g_assert_cmpstr (g_get_user_runtime_dir (), ==, runtimedir);
+}
- if (lstat (path, &s) != 0)
- return FALSE;
+static void
+global_teardown (void)
+{
+ if (g_getenv ("SKIP_TEARDOWN"))
+ return;
- return S_ISDIR (s.st_mode);
+ glnx_shutil_rm_rf_at (-1, testdir, NULL, NULL);
+ g_free (testdir);
}
/*
@@ -411,27 +457,60 @@ test_empty (void)
static void
test_full (void)
{
+ g_autoptr(GError) error = NULL;
g_autoptr(FlatpakBwrap) bwrap = flatpak_bwrap_new (NULL);
g_autoptr(FlatpakExports) exports = flatpak_exports_new ();
+ g_autofree gchar *subdir = g_build_filename (testdir, "test_full", NULL);
+ g_autofree gchar *expose_rw = g_build_filename (subdir, "expose-rw", NULL);
+ g_autofree gchar *expose_ro = g_build_filename (subdir, "expose-ro", NULL);
+ g_autofree gchar *hide = g_build_filename (subdir, "hide", NULL);
+ g_autofree gchar *dont_hide = g_build_filename (subdir, "dont-hide", NULL);
+ g_autofree gchar *hide_below_expose = g_build_filename (subdir,
+ "expose-ro",
+ "hide-me",
+ NULL);
gsize i;
+ glnx_shutil_rm_rf_at (-1, subdir, NULL, &error);
+
+ if (error != NULL)
+ {
+ g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND);
+ g_clear_error (&error);
+ }
+
+ if (g_mkdir_with_parents (expose_rw, S_IRWXU) != 0)
+ g_error ("mkdir: %s", g_strerror (errno));
+
+ if (g_mkdir_with_parents (expose_ro, S_IRWXU) != 0)
+ g_error ("mkdir: %s", g_strerror (errno));
+
+ if (g_mkdir_with_parents (hide_below_expose, S_IRWXU) != 0)
+ g_error ("mkdir: %s", g_strerror (errno));
+
+ if (g_mkdir_with_parents (hide, S_IRWXU) != 0)
+ g_error ("mkdir: %s", g_strerror (errno));
+
+ if (g_mkdir_with_parents (dont_hide, S_IRWXU) != 0)
+ g_error ("mkdir: %s", g_strerror (errno));
+
flatpak_exports_add_host_etc_expose (exports,
FLATPAK_FILESYSTEM_MODE_READ_WRITE);
flatpak_exports_add_host_os_expose (exports,
FLATPAK_FILESYSTEM_MODE_READ_ONLY);
flatpak_exports_add_path_expose (exports,
FLATPAK_FILESYSTEM_MODE_READ_WRITE,
- "/tmp");
+ expose_rw);
flatpak_exports_add_path_expose (exports,
FLATPAK_FILESYSTEM_MODE_READ_ONLY,
- "/var");
- flatpak_exports_add_path_tmpfs (exports, "/var/tmp");
+ expose_ro);
+ flatpak_exports_add_path_tmpfs (exports, hide_below_expose);
flatpak_exports_add_path_expose_or_hide (exports,
FLATPAK_FILESYSTEM_MODE_NONE,
- "/home");
+ hide);
flatpak_exports_add_path_expose_or_hide (exports,
FLATPAK_FILESYSTEM_MODE_READ_ONLY,
- "/srv");
+ dont_hide);
flatpak_bwrap_add_arg (bwrap, "bwrap");
flatpak_exports_append_bwrap_args (exports, bwrap);
@@ -442,24 +521,20 @@ test_full (void)
g_assert_cmpuint (i, <, bwrap->argv->len);
g_assert_cmpstr (bwrap->argv->pdata[i++], ==, "bwrap");
- /* Hiding /home just uses --dir because / is not exposed. */
- if (path_is_dir ("/home"))
- i = assert_next_is_dir (bwrap, i, "/home");
-
- if (path_is_dir ("/srv"))
- i = assert_next_is_bind (bwrap, i, "--ro-bind", "/srv");
-
- if (path_is_dir ("/tmp"))
- i = assert_next_is_bind (bwrap, i, "--bind", "/tmp");
-
- if (path_is_dir ("/var"))
- i = assert_next_is_bind (bwrap, i, "--ro-bind", "/var");
+ i = assert_next_is_bind (bwrap, i, "--ro-bind", dont_hide);
+ i = assert_next_is_bind (bwrap, i, "--ro-bind", expose_ro);
/* We don't create a FAKE_MODE_TMPFS in the container unless there is
* a directory on the host to mount it on.
- * Hiding /var/tmp has to use --tmpfs because /var *is* exposed. */
- if (path_is_dir ("/var") && path_is_dir ("/var/tmp"))
- i = assert_next_is_tmpfs (bwrap, i, "/var/tmp");
+ * Hiding $subdir/expose-ro/hide-me has to use --tmpfs because
+ * $subdir/expose-ro *is* exposed. */
+ i = assert_next_is_tmpfs (bwrap, i, hide_below_expose);
+
+ i = assert_next_is_bind (bwrap, i, "--bind", expose_rw);
+
+ /* Hiding $subdir/hide just uses --dir, because $subdir is not
+ * exposed. */
+ i = assert_next_is_dir (bwrap, i, hide);
while (i < bwrap->argv->len && bwrap->argv->pdata[i] != NULL)
{
@@ -474,6 +549,14 @@ test_full (void)
g_assert_cmpuint (i, ==, bwrap->argv->len - 1);
g_assert_cmpstr (bwrap->argv->pdata[i++], ==, NULL);
g_assert_cmpuint (i, ==, bwrap->argv->len);
+
+ glnx_shutil_rm_rf_at (-1, subdir, NULL, &error);
+
+ if (error != NULL)
+ {
+ g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND);
+ g_clear_error (&error);
+ }
}
int
@@ -481,6 +564,8 @@ main (int argc, char *argv[])
{
int res;
+ global_setup ();
+
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/context/empty", test_empty_context);
@@ -491,5 +576,7 @@ main (int argc, char *argv[])
res = g_test_run ();
+ global_teardown ();
+
return res;
}