From f47503cc5ae10de6dee319ba6cff257eddabf33e Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Tue, 30 May 2023 11:52:38 +0100
Subject: [PATCH] gio/tests/portal-support: Fix snap test ordering race

When the gnome test runner executes the tests, the test appear to execute in disk
order. This means it sometimes works and sometimes we see breakage in portal-support-snap
and portal-support-snap-classic.

The issue is that some tests create config files but some don't. If they run
in the wrong order, tests see config files they shouldn't and break.

Fix this by deleting the files after each test run, properly cleaning up after
themselves. The cleanup code is based upon gtestutils.c:rm_rf().

Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/glib/-/commit/c63cf19d9a8a6ae315a7f9a3fe4ea60c8cf5dece]

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 gio/tests/portal-support-snap-classic.c |  3 +++
 gio/tests/portal-support-snap.c         |  3 +++
 gio/tests/portal-support-utils.c        | 27 +++++++++++++++++++++++++
 gio/tests/portal-support-utils.h        |  2 ++
 4 files changed, 35 insertions(+)

diff --git a/gio/tests/portal-support-snap-classic.c b/gio/tests/portal-support-snap-classic.c
index 8c0ed90c2..5b67865e7 100644
--- a/gio/tests/portal-support-snap-classic.c
+++ b/gio/tests/portal-support-snap-classic.c
@@ -66,6 +66,9 @@ tests_teardown (SetupData *setup_data,
   else
     g_unsetenv ("SNAP");
 
+  cleanup_snapfiles (setup_data->snap_path);
+  cleanup_snapfiles (setup_data->bin_path);
+
   g_clear_pointer (&setup_data->old_path, g_free);
   g_clear_pointer (&setup_data->old_snap, g_free);
 }
diff --git a/gio/tests/portal-support-snap.c b/gio/tests/portal-support-snap.c
index 7dd14d82f..cd904678f 100644
--- a/gio/tests/portal-support-snap.c
+++ b/gio/tests/portal-support-snap.c
@@ -67,6 +67,9 @@ tests_teardown (SetupData *setup_data,
   else
     g_unsetenv ("SNAP");
 
+  cleanup_snapfiles (setup_data->snap_path);
+  cleanup_snapfiles (setup_data->bin_path);
+
   g_clear_pointer (&setup_data->old_path, g_free);
   g_clear_pointer (&setup_data->old_snap, g_free);
 }
diff --git a/gio/tests/portal-support-utils.c b/gio/tests/portal-support-utils.c
index ae7073a3a..b7ee22630 100644
--- a/gio/tests/portal-support-utils.c
+++ b/gio/tests/portal-support-utils.c
@@ -26,6 +26,33 @@
 #include <glib.h>
 #include <glib/gstdio.h>
 
+
+void
+cleanup_snapfiles (const gchar *path)
+{
+  GDir *dir = NULL;
+  const gchar *entry;
+
+  dir = g_dir_open (path, 0, NULL);
+  if (dir == NULL)
+    {
+      /* Assume it’s a file. Ignore failure. */
+      (void) g_remove (path);
+      return;
+    }
+
+  while ((entry = g_dir_read_name (dir)) != NULL)
+    {
+      gchar *sub_path = g_build_filename (path, entry, NULL);
+      cleanup_snapfiles (sub_path);
+      g_free (sub_path);
+    }
+
+  g_dir_close (dir);
+
+  g_rmdir (path);
+}
+
 void
 create_fake_snapctl (const char *path,
                      const char *supported_op)
diff --git a/gio/tests/portal-support-utils.h b/gio/tests/portal-support-utils.h
index 40c035b43..defbdcd4e 100644
--- a/gio/tests/portal-support-utils.h
+++ b/gio/tests/portal-support-utils.h
@@ -23,6 +23,8 @@
 
 #include <glib.h>
 
+void cleanup_snapfiles (const gchar *path);
+
 void create_fake_snap_yaml (const char *snap_path,
                             gboolean is_classic);
 
-- 
2.39.2

