summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2017-02-14 19:49:46 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2017-02-20 16:48:23 +0000
commit898ae926dfa0346ad49ed652bd3004705dfc069d (patch)
tree60f6a8946ac45c264ddfdca741145cac4f73ac7e
parenteef176eb72c17773610ef2780133ad2a65fd26c2 (diff)
tests: Wrap file-deletion functions to handle EINTR
The GLib functions we're using don't, and it seems to be possible to be interrupted during cleanup for our tests. Windows apparently has and uses ENOENT for _unlink(), so just do the same on Windows there; but EINTR is very much a POSIX thing, so ignore that on Windows. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=99825 Reviewed-by: Philip Withnall <withnall@endlessm.com> [smcv: add Windows fixes from a later commit, also reviewed by Philip] Signed-off-by: Simon McVittie <simon.mcvittie@collabora.co.uk>
-rw-r--r--test/dbus-daemon.c5
-rw-r--r--test/loopback.c4
-rw-r--r--test/test-utils-glib.c48
-rw-r--r--test/test-utils-glib.h3
4 files changed, 55 insertions, 5 deletions
diff --git a/test/dbus-daemon.c b/test/dbus-daemon.c
index 35538c68..d0b44d72 100644
--- a/test/dbus-daemon.c
+++ b/test/dbus-daemon.c
@@ -1085,10 +1085,11 @@ teardown (Fixture *f,
/* the socket may exist */
path = g_strdup_printf ("%s/bus", f->tmp_runtime_dir);
- g_assert (g_remove (path) == 0 || errno == ENOENT);
+
+ test_remove_if_exists (path);
g_free (path);
/* there shouldn't be anything else in there */
- g_assert_cmpint (g_rmdir (f->tmp_runtime_dir), ==, 0);
+ test_rmdir_must_exist (f->tmp_runtime_dir);
/* we're relying on being single-threaded for this to be safe */
if (f->saved_runtime_dir != NULL)
diff --git a/test/loopback.c b/test/loopback.c
index bf0542aa..5232a09a 100644
--- a/test/loopback.c
+++ b/test/loopback.c
@@ -332,10 +332,10 @@ teardown_runtime (Fixture *f,
/* the socket may exist */
path = g_strdup_printf ("%s/bus", f->tmp_runtime_dir);
- g_assert (g_remove (path) == 0 || errno == ENOENT);
+ test_remove_if_exists (path);
g_free (path);
/* there shouldn't be anything else in there */
- g_assert_cmpint (g_rmdir (f->tmp_runtime_dir), ==, 0);
+ test_rmdir_must_exist (f->tmp_runtime_dir);
/* we're relying on being single-threaded for this to be safe */
if (f->saved_runtime_dir != NULL)
diff --git a/test/test-utils-glib.c b/test/test-utils-glib.c
index f90244c3..c5059edb 100644
--- a/test/test-utils-glib.c
+++ b/test/test-utils-glib.c
@@ -27,13 +27,13 @@
#include <config.h>
#include "test-utils-glib.h"
+#include <errno.h>
#include <string.h>
#ifdef DBUS_WIN
# include <io.h>
# include <windows.h>
#else
-# include <errno.h>
# include <signal.h>
# include <unistd.h>
# include <sys/types.h>
@@ -481,3 +481,49 @@ test_progress (char symbol)
if (g_test_verbose () && isatty (1))
g_print ("%c", symbol);
}
+
+/*
+ * Delete @path, with a retry loop if the system call is interrupted by
+ * an async signal. If @path does not exist, ignore; otherwise, it is
+ * required to be a non-directory.
+ */
+void
+test_remove_if_exists (const gchar *path)
+{
+ while (g_remove (path) != 0)
+ {
+ int saved_errno = errno;
+
+ if (saved_errno == ENOENT)
+ return;
+
+#ifdef G_OS_UNIX
+ if (saved_errno == EINTR)
+ continue;
+#endif
+
+ g_error ("Unable to remove file \"%s\": %s", path,
+ g_strerror (saved_errno));
+ }
+}
+
+/*
+ * Delete empty directory @path, with a retry loop if the system call is
+ * interrupted by an async signal. @path is required to exist.
+ */
+void
+test_rmdir_must_exist (const gchar *path)
+{
+ while (g_remove (path) != 0)
+ {
+ int saved_errno = errno;
+
+#ifdef G_OS_UNIX
+ if (saved_errno == EINTR)
+ continue;
+#endif
+
+ g_error ("Unable to remove directory \"%s\": %s", path,
+ g_strerror (saved_errno));
+ }
+}
diff --git a/test/test-utils-glib.h b/test/test-utils-glib.h
index 4016f73f..e62ef3d6 100644
--- a/test/test-utils-glib.h
+++ b/test/test-utils-glib.h
@@ -92,4 +92,7 @@ static inline void my_test_skip (const gchar *s)
}
#endif
+void test_remove_if_exists (const gchar *path);
+void test_rmdir_must_exist (const gchar *path);
+
#endif