[glib/halfline/test-case-pipe-confusion: 1/2] tests/desktop-app-info: Use named pipe instead of /proc




commit deeca78ab1b2778fef1b5102889f5372dd59d0b0
Author: Ray Strode <rstrode redhat com>
Date:   Mon Oct 17 14:44:14 2022 -0400

    tests/desktop-app-info: Use named pipe instead of /proc
    
    Freebsd doesn't always have /proc mounted, so relying on
    /proc for the tests isn't ideal.
    
    This commit changes the desktop-app-info tests to use
    mkfifo instead of /proc/../fd/.. to relay terminal
    arguments.
    
    Might help with this error message I'm seeing in CI:
    
    /tmp/bin-path-H1UQT1/gnome-terminal: cannot create /proc/38961/fd/6: No such file or directory

 gio/tests/desktop-app-info.c | 46 +++++++++++++++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 13 deletions(-)
---
diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c
index dcda43d6fe..00c9b50033 100644
--- a/gio/tests/desktop-app-info.c
+++ b/gio/tests/desktop-app-info.c
@@ -30,6 +30,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 static GAppInfo *
 create_command_line_app_info (const char *name,
@@ -1218,7 +1220,9 @@ test_launch_uris_with_terminal (gconstpointer data)
   /* FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/2781 */
   g_test_skip ("/proc pipe sharing currently doesn’t work reliably on FreeBSD CI");
 #else
-  int fds[2];
+  int fd;
+  int ret;
+  int flags;
   const char *terminal_exec = data;
   char *old_path;
   char *command_line;
@@ -1245,17 +1249,26 @@ test_launch_uris_with_terminal (gconstpointer data)
   old_path = g_strdup (g_getenv ("PATH"));
   g_assert_true (g_setenv ("PATH", bin_path, TRUE));
 
-  g_unix_open_pipe (fds, FD_CLOEXEC, &error);
-  g_assert_no_error (error);
-
   terminal_path = g_build_filename (bin_path, terminal_exec, NULL);
-  output_fd_path = g_strdup_printf (G_DIR_SEPARATOR_S "proc"
-                                    G_DIR_SEPARATOR_S "%" G_PID_FORMAT
-                                    G_DIR_SEPARATOR_S "fd"
-                                    G_DIR_SEPARATOR_S "%d",
-                                    getpid (), fds[0]);
+  output_fd_path = g_build_filename (bin_path, "fifo", NULL);
+
+  ret = mkfifo (output_fd_path, 0600);
+
+  g_assert_cmpint (ret, ==, 0);
+
+  fd = g_open (output_fd_path, O_RDONLY | O_CLOEXEC | O_NONBLOCK, 0);
+
+  g_assert_cmpint (fd, >=, 0);
+
+  flags = fcntl (fd, F_GETFL);
 
-  input_stream = g_unix_input_stream_new (fds[0], TRUE);
+  g_assert_cmpint (flags, >=, 0);
+
+  ret = fcntl (fd, F_SETFL,  flags & ~O_NONBLOCK);
+
+  g_assert_cmpint (ret, ==, 0);
+
+  input_stream = g_unix_input_stream_new (fd, TRUE);
   data_input_stream = g_data_input_stream_new (input_stream);
   script_contents = g_strdup_printf ("#!%s\n" \
                                      "out='%s'\n"
@@ -1289,10 +1302,13 @@ test_launch_uris_with_terminal (gconstpointer data)
   g_assert_no_error (error);
 
   output_contents =
-    g_data_input_stream_read_line (data_input_stream, NULL, NULL, &error);
+    g_data_input_stream_read_upto (data_input_stream, "\n", 1, NULL, NULL, &error);
   g_assert_no_error (error);
   g_test_message ("'%s' called with arguments: '%s'", terminal_exec, output_contents);
 
+  g_data_input_stream_read_byte (data_input_stream, NULL, &error);
+  g_assert_no_error (error);
+
   output_args = g_strsplit (output_contents, " ", -1);
   g_clear_pointer (&output_contents, g_free);
 
@@ -1305,11 +1321,15 @@ test_launch_uris_with_terminal (gconstpointer data)
   g_assert_cmpint (g_list_length (paths), ==, 1);
   g_clear_pointer (&output_args, g_strfreev);
 
+  g_usleep (G_USEC_PER_SEC);
   output_contents =
-    g_data_input_stream_read_line (data_input_stream, NULL, NULL, &error);
+    g_data_input_stream_read_upto (data_input_stream, "\n", 1, NULL, NULL, &error);
   g_assert_no_error (error);
   g_test_message ("'%s' called with arguments: '%s'", terminal_exec, output_contents);
 
+  g_data_input_stream_read_byte (data_input_stream, NULL, &error);
+  g_assert_no_error (error);
+
   output_args = g_strsplit (output_contents, " ", -1);
   g_clear_pointer (&output_contents, g_free);
   g_assert_cmpuint (g_strv_length (output_args), ==, 4);
@@ -1324,7 +1344,7 @@ test_launch_uris_with_terminal (gconstpointer data)
   g_assert_null (paths);
   g_assert_true (g_setenv ("PATH", old_path, TRUE));
 
-  g_close (fds[1], &error);
+  g_close (fd, &error);
   g_assert_no_error (error);
 
   g_free (sh);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]