gtestutils: Use $G_TEST_TMPDIR as temporary directory when defined

During tests in which we are isolating directories, we may still create
temporary files in the global temporary directory without cleaning them
because the value returned by g_get_tmp_dir() is cached when we isolate
the tests directory to the global TMPDIR.

To ensure that we're always isolating the temporary directories, let's
unset the cached temporary directory once we've defined $G_TEST_TMPDIR
so that the returned value of g_get_tmpdir() can be recomputed using the
test isolated temporary directory.
This commit is contained in:
Marco Trevisan (Treviño) 2022-09-13 03:04:54 +02:00
parent f520066563
commit ca0f04d1c6
4 changed files with 120 additions and 0 deletions

View File

@ -1690,6 +1690,7 @@ void
(*argv)[0], "G_TEST_TMPDIR");
exit (1);
}
_g_unset_cached_tmp_dir ();
/* And clear the traditional environment variables so subprocesses
* spawned by the code under test cant trash anything. If a test

View File

@ -1205,6 +1205,7 @@ test_dir_make_tmp (void)
name = g_dir_make_tmp ("testXXXXXXtest", &error);
g_assert_no_error (error);
g_assert_true (g_file_test (name, G_FILE_TEST_IS_DIR));
g_assert_true (g_str_has_prefix (name, g_getenv ("G_TEST_TMPDIR")));
ret = g_rmdir (name);
g_assert_cmpint (ret, ==, 0);
g_free (name);
@ -1212,6 +1213,7 @@ test_dir_make_tmp (void)
name = g_dir_make_tmp (NULL, &error);
g_assert_no_error (error);
g_assert_true (g_file_test (name, G_FILE_TEST_IS_DIR));
g_assert_true (g_str_has_prefix (name, g_getenv ("G_TEST_TMPDIR")));
ret = g_rmdir (name);
g_assert_cmpint (ret, ==, 0);
g_free (name);
@ -1238,6 +1240,7 @@ test_file_open_tmp (void)
g_assert_cmpint (fd, !=, -1);
g_assert_no_error (error);
g_assert_nonnull (name);
g_assert_true (g_str_has_prefix (name, g_getenv ("G_TEST_TMPDIR")));
unlink (name);
g_free (name);
close (fd);
@ -1246,6 +1249,7 @@ test_file_open_tmp (void)
g_assert_cmpint (fd, !=, -1);
g_assert_no_error (error);
g_assert_nonnull (name);
g_assert_true (g_str_has_prefix (name, g_getenv ("G_TEST_TMPDIR")));
g_unlink (name);
g_free (name);
close (fd);

View File

@ -158,6 +158,7 @@ glib_tests = {
'utils' : {
'c_standards': c_standards.keys(),
},
'utils-isolated' : {},
'unicode' : {},
'unicode-encoding' : {},
'unicode-normalize': {},

114
glib/tests/utils-isolated.c Normal file
View File

@ -0,0 +1,114 @@
/* Copyright (C) 2022 Marco Trevisan
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Author: Marco Trevisan <marco.trevisan@canonical.com>
*/
#include "config.h"
#include <glib/glib.h>
/* Test that all of the well-known directories returned by GLib
* are returned as children of test_tmpdir when running with
* %G_TEST_OPTION_ISOLATE_DIRS. This ensures that tests should
* not interfere with each other in `/tmp` while running.
*/
const char *test_tmpdir;
static void
test_tmp_dir (void)
{
g_assert_cmpstr (g_get_tmp_dir (), ==, test_tmpdir);
}
static void
test_home_dir (void)
{
g_assert_true (g_str_has_prefix (g_get_home_dir (), test_tmpdir));
}
static void
test_user_cache_dir (void)
{
g_assert_true (g_str_has_prefix (g_get_user_cache_dir (), test_tmpdir));
}
static void
test_system_config_dirs (void)
{
const char *const *dir;
for (dir = g_get_system_config_dirs (); *dir != NULL; dir++)
g_assert_true (g_str_has_prefix (*dir, test_tmpdir));
}
static void
test_user_config_dir (void)
{
g_assert_true (g_str_has_prefix (g_get_user_config_dir (), test_tmpdir));
}
static void
test_system_data_dirs (void)
{
const char *const *dir;
for (dir = g_get_system_data_dirs (); *dir != NULL; dir++)
g_assert_true (g_str_has_prefix (*dir, test_tmpdir));
}
static void
test_user_data_dir (void)
{
g_assert_true (g_str_has_prefix (g_get_user_data_dir (), test_tmpdir));
}
static void
test_user_state_dir (void)
{
g_assert_true (g_str_has_prefix (g_get_user_state_dir (), test_tmpdir));
}
static void
test_user_runtime_dir (void)
{
g_assert_true (g_str_has_prefix (g_get_user_runtime_dir (), test_tmpdir));
}
int
main (int argc,
char *argv[])
{
g_setenv ("LC_ALL", "C", TRUE);
g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
test_tmpdir = g_getenv ("G_TEST_TMPDIR");
g_assert_nonnull (test_tmpdir);
g_test_add_func ("/utils-isolated/tmp-dir", test_tmp_dir);
g_test_add_func ("/utils-isolated/home-dir", test_home_dir);
g_test_add_func ("/utils-isolated/user-cache-dir", test_user_cache_dir);
g_test_add_func ("/utils-isolated/system-config-dirs", test_system_config_dirs);
g_test_add_func ("/utils-isolated/user-config-dir", test_user_config_dir);
g_test_add_func ("/utils-isolated/system-data-dirs", test_system_data_dirs);
g_test_add_func ("/utils-isolated/user-data-dir", test_user_data_dir);
g_test_add_func ("/utils-isolated/user-state-dir", test_user_state_dir);
g_test_add_func ("/utils-isolated/user-runtime-dir", test_user_runtime_dir);
return g_test_run ();
}