diff options
author | Simon McVittie <smcv@collabora.com> | 2020-08-27 16:31:58 +0100 |
---|---|---|
committer | Alexander Larsson <alexander.larsson@gmail.com> | 2020-08-27 17:48:50 +0200 |
commit | 354b9a2257341c4b9ff313d547fe0aafc25c43f6 (patch) | |
tree | 43f656925eaa046e88271678fab8f0a919d14b8c | |
parent | 09424423b93e9ea263a9e3f2de1579814b941054 (diff) | |
download | flatpak-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.c | 143 |
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; } |