[libglnx: 3/8] Run the fdio test in its own temporary directory



commit 04c11c7390c5e044aa0079c3b5b5e7a3c8b7f577
Author: Simon McVittie <smcv collabora com>
Date:   Thu May 2 19:01:38 2019 +0100

    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>

 tests/libglnx-testlib.c   | 66 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/libglnx-testlib.h   | 14 ++++++++++
 tests/meson.build         |  6 ++++-
 tests/test-libglnx-fdio.c |  1 +
 4 files changed, 86 insertions(+), 1 deletion(-)
---
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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]