From 041eecbb23c05cd13bc92d95253c8878c1196d67 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Tue, 14 Feb 2017 19:03:44 +0000 Subject: [PATCH 10/11] sd-activation test: Create and destroy a temporary XDG_RUNTIME_DIR Signed-off-by: Simon McVittie --- test/sd-activation.c | 28 ++++++++++++++++++++++------ test/test-utils-glib.c | 22 ++++++++++++++++++++++ test/test-utils-glib.h | 1 + 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/test/sd-activation.c b/test/sd-activation.c index 086edaa9..d774ebc3 100644 --- a/test/sd-activation.c +++ b/test/sd-activation.c @@ -34,6 +34,8 @@ #include #include +#include + #if defined(HAVE_APPARMOR_2_10) && defined(DBUS_TEST_APPARMOR_ACTIVATION) #include #endif @@ -62,6 +64,8 @@ typedef struct { const char *activated_name; DBusMessage *activated_message; dbus_bool_t activated_filter_added; + + gchar *tmp_runtime_dir; } Fixture; typedef struct @@ -211,6 +215,16 @@ static void setup (Fixture *f, gconstpointer context G_GNUC_UNUSED) { +#if defined(DBUS_TEST_APPARMOR_ACTIVATION) + aa_features *features; +#endif + + f->ge = NULL; + dbus_error_init (&f->e); + + f->tmp_runtime_dir = g_dir_make_tmp ("dbus-daemon-test.XXXXXX", &f->ge); + g_assert_no_error (f->ge); + #if defined(DBUS_TEST_APPARMOR_ACTIVATION) && !defined(HAVE_APPARMOR_2_10) g_test_skip ("AppArmor support not compiled or AppArmor 2.10 unavailable"); @@ -219,8 +233,6 @@ setup (Fixture *f, #else #if defined(DBUS_TEST_APPARMOR_ACTIVATION) - aa_features *features; - if (!aa_is_enabled ()) { g_test_message ("aa_is_enabled() -> %s", g_strerror (errno)); @@ -247,12 +259,9 @@ setup (Fixture *f, f->ctx = test_main_context_get (); - f->ge = NULL; - dbus_error_init (&f->e); - f->address = test_get_dbus_daemon ( "valid-config-files/systemd-activation.conf", - TEST_USER_ME, NULL, &f->daemon_pid); + TEST_USER_ME, f->tmp_runtime_dir, &f->daemon_pid); if (f->address == NULL) return; @@ -820,6 +829,13 @@ teardown (Fixture *f, test_main_context_unref (f->ctx); g_free (f->address); + + if (f->tmp_runtime_dir != NULL) + { + test_rmdir_if_exists (f->tmp_runtime_dir); + + g_free (f->tmp_runtime_dir); + } } static const Config deny_send_tests[] = diff --git a/test/test-utils-glib.c b/test/test-utils-glib.c index c81f4ea0..c48c1c40 100644 --- a/test/test-utils-glib.c +++ b/test/test-utils-glib.c @@ -539,3 +539,25 @@ test_rmdir_must_exist (const gchar *path) g_strerror (errno)); } } + +/* + * Delete empty directory @path, with a retry loop if the system call is + * interrupted by an async signal. If @path does not exist, ignore. + */ +void +test_rmdir_if_exists (const gchar *path) +{ + while (g_remove (path) != 0) + { + int saved_errno = errno; + + if (saved_errno == ENOENT) + return; + + if (saved_errno == EINTR) + continue; + + g_error ("Unable to remove directory \"%s\": %s", path, + g_strerror (errno)); + } +} diff --git a/test/test-utils-glib.h b/test/test-utils-glib.h index e62ef3d6..d29c58da 100644 --- a/test/test-utils-glib.h +++ b/test/test-utils-glib.h @@ -94,5 +94,6 @@ static inline void my_test_skip (const gchar *s) void test_remove_if_exists (const gchar *path); void test_rmdir_must_exist (const gchar *path); +void test_rmdir_if_exists (const gchar *path); #endif -- 2.11.0