From: Simon McVittie Date: Tue, 14 Feb 2017 19:49:46 +0000 (+0000) Subject: tests: Wrap file-deletion functions to handle EINTR X-Git-Tag: dbus-1.11.12~51 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=898ae926dfa0346ad49ed652bd3004705dfc069d;p=thirdparty%2Fdbus.git 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 [smcv: add Windows fixes from a later commit, also reviewed by Philip] Signed-off-by: Simon McVittie --- diff --git a/test/dbus-daemon.c b/test/dbus-daemon.c index 35538c686..d0b44d72c 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 bf0542aa0..5232a09a5 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 f90244c3f..c5059edbe 100644 --- a/test/test-utils-glib.c +++ b/test/test-utils-glib.c @@ -27,13 +27,13 @@ #include #include "test-utils-glib.h" +#include #include #ifdef DBUS_WIN # include # include #else -# include # include # include # include @@ -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 4016f73f7..e62ef3d63 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