Commit 898ae926 authored by Simon McVittie's avatar Simon McVittie

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=99825Reviewed-by: Philip Withnall's avatarPhilip Withnall <withnall@endlessm.com>
[smcv: add Windows fixes from a later commit, also reviewed by Philip]
Signed-off-by: default avatarSimon McVittie <simon.mcvittie@collabora.co.uk>
parent eef176eb
......@@ -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)
......
......@@ -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)
......
......@@ -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));
}
}
......@@ -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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment