summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2019-05-02 19:01:38 +0100
committerSimon McVittie <smcv@collabora.com>2019-05-02 19:14:50 +0100
commit04c11c7390c5e044aa0079c3b5b5e7a3c8b7f577 (patch)
treef7bb0adeb404f0183f264fd0ae79b5a9ae131e6c
parent5920f9f3fc3c1c0fb029296b91938d103fb7886a (diff)
downloadlibglnx-04c11c7390c5e044aa0079c3b5b5e7a3c8b7f577.tar.gz
Run the fdio test in its own temporary directory
The temporary directory will be deleted on success, but will remain intact on failure. Signed-off-by: Simon McVittie <smcv@collabora.com>
-rw-r--r--tests/libglnx-testlib.c66
-rw-r--r--tests/libglnx-testlib.h14
-rw-r--r--tests/meson.build6
-rw-r--r--tests/test-libglnx-fdio.c1
4 files changed, 86 insertions, 1 deletions
diff --git a/tests/libglnx-testlib.c b/tests/libglnx-testlib.c
new file mode 100644
index 0000000..5687d80
--- /dev/null
+++ b/tests/libglnx-testlib.c
@@ -0,0 +1,66 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright 2019 Collabora Ltd.
+ *
+ * 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 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, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+#include "libglnx-testlib.h"
+
+#include <errno.h>
+
+#include "libglnx.h"
+
+struct _GLnxTestAutoTempDir
+{
+ gchar *old_cwd;
+ int old_cwd_fd;
+ GLnxTmpDir temp_dir;
+};
+
+_GLnxTestAutoTempDir *
+_glnx_test_auto_temp_dir_enter (void)
+{
+ GError *error = NULL;
+ _GLnxTestAutoTempDir *ret = g_new0 (_GLnxTestAutoTempDir, 1);
+
+ glnx_mkdtemp ("glnx-test-XXXXXX", 0700, &ret->temp_dir, &error);
+ g_assert_no_error (error);
+
+ /* just for better diagnostics */
+ ret->old_cwd = g_get_current_dir ();
+
+ glnx_opendirat (-1, ".", TRUE, &ret->old_cwd_fd, &error);
+ g_assert_no_error (error);
+
+ if (fchdir (ret->temp_dir.fd) != 0)
+ g_error ("fchdir(<fd for \"%s\">): %s", ret->temp_dir.path, g_strerror (errno));
+
+ return ret;
+}
+
+void
+_glnx_test_auto_temp_dir_leave (_GLnxTestAutoTempDir *dir)
+{
+ GError *error = NULL;
+
+ if (fchdir (dir->old_cwd_fd) != 0)
+ g_error ("fchdir(<fd for \"%s\">): %s", dir->old_cwd, g_strerror (errno));
+
+ glnx_tmpdir_delete (&dir->temp_dir, NULL, &error);
+ g_assert_no_error (error);
+}
diff --git a/tests/libglnx-testlib.h b/tests/libglnx-testlib.h
index ee750e4..0d3a075 100644
--- a/tests/libglnx-testlib.h
+++ b/tests/libglnx-testlib.h
@@ -1,6 +1,7 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
*
* Copyright (C) 2017 Red Hat, Inc.
+ * Copyright 2019 Collabora Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,6 +21,10 @@
#pragma once
+#include <glib.h>
+
+#include "glnx-backport-autoptr.h"
+
typedef GError _GLnxTestAutoError;
static inline void
_glnx_test_auto_error_cleanup (_GLnxTestAutoError *autoerror)
@@ -32,3 +37,12 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(_GLnxTestAutoError, _glnx_test_auto_error_cleanup)
#define _GLNX_TEST_DECLARE_ERROR(local_error, error) \
g_autoptr(_GLnxTestAutoError) local_error = NULL; \
GError **error = &local_error
+
+typedef struct _GLnxTestAutoTempDir _GLnxTestAutoTempDir;
+
+_GLnxTestAutoTempDir *_glnx_test_auto_temp_dir_enter (void);
+void _glnx_test_auto_temp_dir_leave (_GLnxTestAutoTempDir *dir);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(_GLnxTestAutoTempDir, _glnx_test_auto_temp_dir_leave);
+
+#define _GLNX_TEST_SCOPED_TEMP_DIR \
+ g_autoptr(_GLnxTestAutoTempDir) temp_dir = _glnx_test_auto_temp_dir_enter ()
diff --git a/tests/meson.build b/tests/meson.build
index d3eddf0..de141c5 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -9,7 +9,11 @@ test_names = [
foreach test_name : test_names
exe = executable(test_name,
- ['test-libglnx-' + test_name + '.c', 'libglnx-testlib.h'],
+ [
+ 'libglnx-testlib.c',
+ 'libglnx-testlib.h',
+ 'test-libglnx-' + test_name + '.c',
+ ],
dependencies: [
libglnx_dep,
libglnx_deps,
diff --git a/tests/test-libglnx-fdio.c b/tests/test-libglnx-fdio.c
index 81636e5..84ebb14 100644
--- a/tests/test-libglnx-fdio.c
+++ b/tests/test-libglnx-fdio.c
@@ -237,6 +237,7 @@ test_filecopy (void)
int main (int argc, char **argv)
{
+ _GLNX_TEST_SCOPED_TEMP_DIR;
int ret;
g_test_init (&argc, &argv, NULL);