[glib: 1/3] Convert tests/spawn-test.c to glib test framework




commit 5a7a69bd99c5d013440d097733bd2dae7467806a
Author: Emmanuel Fleury <emmanuel fleury gmail com>
Date:   Tue Mar 29 00:22:49 2022 +0200

    Convert tests/spawn-test.c to glib test framework

 tests/spawn-test.c | 432 ++++++++++++++++++-----------------------------------
 1 file changed, 145 insertions(+), 287 deletions(-)
---
diff --git a/tests/spawn-test.c b/tests/spawn-test.c
index 78a7e7c7d4..0d0604d00a 100644
--- a/tests/spawn-test.c
+++ b/tests/spawn-test.c
@@ -19,17 +19,11 @@
  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
  * file for a list of people on the GLib Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
- * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
  */
 
-#undef G_DISABLE_ASSERT
-#undef G_LOG_DOMAIN
-
 #include <glib.h>
 #include <glib/gstdio.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
 
 #ifdef G_OS_WIN32
 #include <fcntl.h>
@@ -37,308 +31,166 @@
 #define pipe(fds) _pipe(fds, 4096, _O_BINARY)
 #endif
 
+#ifdef G_OS_WIN32
+static gchar *dirname = NULL;
+#endif
 
 static void
-run_tests (const gchar* argv0)
+test_spawn_basics (void)
 {
+  gboolean result;
   GError *err = NULL;
   gchar *output = NULL;
   gchar *erroutput = NULL;
-  gchar *dirname = g_path_get_dirname (argv0);
 #ifdef G_OS_WIN32
+  int n;
+  char buf[100];
   int pipedown[2], pipeup[2];
-  gchar **argv = 0;
+  gchar **argv = NULL;
   gchar spawn_binary[1000] = {0};
   gchar full_cmdline[1000] = {0};
-  g_snprintf (spawn_binary, sizeof (spawn_binary), "%s\\spawn-test-win32-gui.exe", dirname);
-#endif
+
+  g_snprintf (spawn_binary, sizeof (spawn_binary),
+              "%s\\spawn-test-win32-gui.exe", dirname);
   g_free (dirname);
-  
+#endif
+
   err = NULL;
-  if (!g_spawn_command_line_sync ("nonexistent_application foo 'bar baz' blah blah",
-                                  NULL, NULL, NULL,
-                                  &err))
-    {
-      g_error_free (err);
-    }
-  else
-    {
-      g_warning ("no error for sync spawn of nonexistent application");
-      exit (1);
-    }
+  result =
+    g_spawn_command_line_sync ("nonexistent_application foo 'bar baz' blah blah",
+                               NULL, NULL, NULL, &err);
+  g_assert_false (result);
+  g_assert_error (err, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT);
+  g_clear_error (&err);
 
   err = NULL;
-  if (!g_spawn_command_line_async ("nonexistent_application foo bar baz \"blah blah\"",
-                                   &err))
-    {
-      g_error_free (err);
-    }
-  else
-    {
-      g_warning ("no error for async spawn of nonexistent application");
-      exit (1);
-    }
+  result =
+    g_spawn_command_line_async ("nonexistent_application foo bar baz \"blah blah\"",
+                                &err);
+  g_assert_false (result);
+  g_assert_error (err, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT);
+  g_clear_error (&err);
 
   err = NULL;
 #ifdef G_OS_UNIX
-  if (!g_spawn_command_line_sync ("/bin/sh -c 'echo hello'",
-                                  &output, NULL, NULL,
-                                  &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  else
-    {
-      g_assert (output != NULL);
-      
-      if (strcmp (output, "hello\n") != 0)
-        {
-          printf ("output was '%s', should have been 'hello'\n",
-                  output);
-
-          exit (1);
-        }
-
-      g_free (output);
-      output = NULL;
-    }
+  result = g_spawn_command_line_sync ("/bin/sh -c 'echo hello'",
+                                      &output, NULL, NULL, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+  g_assert_cmpstr (output, ==, "hello\n");
+
+  g_free (output);
+  output = NULL;
 #endif
-  /* Running sort synchronously, collecting its output. 'sort' command is selected
-   * because it is non-builtin command on both unix and win32 with well-defined stdout behaviour.
+
+  /* Running sort synchronously, collecting its output. 'sort' command
+   * is selected because it is non-builtin command on both unix and
+   * win32 with well-defined stdout behaviour.
    */
-  g_file_set_contents ("spawn-test-created-file.txt", "line first\nline 2\nline last\n", -1, &err);
+  g_file_set_contents ("spawn-test-created-file.txt",
+                       "line first\nline 2\nline last\n", -1, &err);
   g_assert_no_error(err);
-  if (!g_spawn_command_line_sync ("sort spawn-test-created-file.txt",
-                                  &output, &erroutput, NULL,
-                                  &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  else
-    {
-      g_assert (output != NULL);
-      g_assert (erroutput != NULL);
-      
-      if (strstr (output, "\nline first") == 0)
-        {
-          printf ("output was '%s', should have contained 'line first' in second line\n",
-                  output);
-
-          exit (1);
-        }
-      if (erroutput[0] != '\0')
-       {
-         printf ("error output was '%s', should have been empty\n",
-                 erroutput);
-         exit (1);
-       }
-
-      g_free (output);
-      output = NULL;
-      g_free (erroutput);
-      erroutput = NULL;
-      g_unlink ("spawn-test-created-file.txt");
-    }
-
-  if (!g_spawn_command_line_sync ("sort non-existing-file.txt",
-                                  NULL, &erroutput, NULL,
-                                  &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  else
-    {
-      g_assert (erroutput != NULL);
-
-      if (erroutput[0] == '\0')
-        {
-          printf ("erroutput was empty, expected contain error message about non-existing-file.txt\n");
-          exit (1);
-        }
-      g_free (erroutput);
-      erroutput = NULL;
-    }
+
+  result = g_spawn_command_line_sync ("sort spawn-test-created-file.txt",
+                                      &output, &erroutput, NULL, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+  g_assert_cmpstr (output, ==, "line 2\nline first\nline last\n");
+  g_assert_cmpstr (erroutput, ==, "");
+
+  g_free (output);
+  output = NULL;
+  g_free (erroutput);
+  erroutput = NULL;
+
+  result = g_spawn_command_line_sync ("sort non-existing-file.txt",
+                                      NULL, &erroutput, NULL, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+  g_assert_cmpstr (erroutput, ==,
+                   "sort: cannot read: non-existing-file.txt: No such file or directory\n");
+
+  g_free (erroutput);
+  erroutput = NULL;
+  g_unlink ("spawn-test-create-file.txt");
 
 #ifdef G_OS_WIN32
-  printf ("Running spawn-test-win32-gui in various ways.\n");
+  g_test_message ("Running spawn-test-win32-gui in various ways.");
 
-  printf ("First asynchronously (without wait).\n");
+  g_test_message ("First asynchronously (without wait).");
   g_snprintf (full_cmdline, sizeof (full_cmdline), "'%s' 1", spawn_binary);
-  if (!g_spawn_command_line_async (full_cmdline, &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-
-  printf ("Now synchronously, collecting its output.\n");
+  result = g_spawn_command_line_async (full_cmdline, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+
+  g_test_message ("Now synchronously, collecting its output.");
   g_snprintf (full_cmdline, sizeof (full_cmdline), "'%s' 2", spawn_binary);
-  if (!g_spawn_command_line_sync (full_cmdline,
-                                 &output, &erroutput, NULL,
-                                 &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  else
-    {
-      g_assert (output != NULL);
-      g_assert (erroutput != NULL);
-      
-      if (strcmp (output, "This is stdout\r\n") != 0)
-        {
-          printf ("output was '%s', should have been 'This is stdout'\n",
-                  g_strescape (output, NULL));
-
-          exit (1);
-        }
-      if (strcmp (erroutput, "This is stderr\r\n") != 0)
-       {
-         printf ("error output was '%s', should have been 'This is stderr'\n",
-                 g_strescape (erroutput, NULL));
-         exit (1);
-       }
-
-      g_free (output);
-      output = NULL;
-      g_free (erroutput);
-      erroutput = NULL;
-    }
-
-  printf ("Now with G_SPAWN_FILE_AND_ARGV_ZERO.\n");
-  g_snprintf (full_cmdline, sizeof (full_cmdline), "'%s' this-should-be-argv-zero print_argv0", 
spawn_binary);
-  if (!g_shell_parse_argv (full_cmdline, NULL, &argv, &err))
-    {
-      fprintf (stderr, "Error parsing command line? %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-
-  if (!g_spawn_sync (NULL, argv, NULL,
-                     G_SPAWN_FILE_AND_ARGV_ZERO,
-                     NULL, NULL, &output, NULL, NULL,
-                     &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  else
-    {
-      if (strcmp (output, "this-should-be-argv-zero") != 0)
-       {
-         printf ("output was '%s', should have been 'this-should-be-argv-zero'\n", output);
-         exit (1);
-       }
-      g_free (output);
-      output = NULL;
-    }
-
-  printf ("Now talking to it through pipes.\n");
-
-  if (pipe (pipedown) < 0 ||
-      pipe (pipeup) < 0)
-    {
-      fprintf (stderr, "Could not create pipes\n");
-      exit (1);
-    }
-
-  g_snprintf (full_cmdline, sizeof (full_cmdline), "'%s' pipes %d %d", spawn_binary, pipedown[0], pipeup[1]);
-  if (!g_shell_parse_argv (full_cmdline,
-                           NULL, &argv,
-                           &err))
-    {
-      fprintf (stderr, "Error parsing command line? %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  
-  if (!g_spawn_async (NULL, argv, NULL,
-                     G_SPAWN_LEAVE_DESCRIPTORS_OPEN |
-                     G_SPAWN_DO_NOT_REAP_CHILD,
-                     NULL, NULL, NULL,
-                     &err))
-    {
-      fprintf (stderr, "Error: %s\n", err->message);
-      g_error_free (err);
-      exit (1);
-    }
-  else
-    {
-      int k, n;
-      char buf[100];
-
-      if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
-       {
-         int errsv = errno;
-         if (k == -1)
-           fprintf (stderr, "Read error: %s\n", g_strerror (errsv));
-         else
-           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
-                    (int)sizeof (n), k);
-         exit (1);
-       }
-
-      if ((k = read (pipeup[0], buf, n)) != n)
-       {
-         int errsv = errno;
-         if (k == -1)
-           fprintf (stderr, "Read error: %s\n", g_strerror (errsv));
-         else
-           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
-                    n, k);
-         exit (1);
-       }
-
-      n = strlen ("Bye then");
-      if (write (pipedown[1], &n, sizeof (n)) == -1 ||
-         write (pipedown[1], "Bye then", n) == -1)
-       {
-         int errsv = errno;
-         fprintf (stderr, "Write error: %s\n", g_strerror (errsv));
-         exit (1);
-       }
-
-      if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
-       {
-         int errsv = errno;
-         if (k == -1)
-           fprintf (stderr, "Read error: %s\n", g_strerror (errsv));
-         else
-           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
-                    (int)sizeof (n), k);
-         exit (1);
-       }
-      if (n != strlen ("See ya"))
-       {
-         printf ("child wrote %d bytes, expected %d", n, (int) strlen ("See ya"));
-         exit (1);
-       }
-
-      if ((k = read (pipeup[0], buf, n)) != n)
-       {
-         int errsv = errno;
-         if (k == -1)
-           fprintf (stderr, "Read error: %s\n", g_strerror (errsv));
-         else
-           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
-                    n, k);
-         exit (1);
-       }
-      buf[n] = '\0';
-      if (strcmp (buf, "See ya") != 0)
-       {
-         printf ("output was '%s', should have been 'See ya'\n", buf);
-         exit (1);
-       }
-    }
+  result =
+    g_spawn_command_line_sync (full_cmdline, &output, &erroutput, NULL, &err);
+
+  g_assert_no_error (err);
+  g_assert_true (result);
+  g_assert_cmpstr (output, ==, "This is stdout\r\n");
+  g_assert_cmpstr (erroutput, ==, "This is stderr\r\n");
+
+  g_free (output);
+  output = NULL;
+  g_free (erroutput);
+  erroutput = NULL;
+
+  g_test_message ("Now with G_SPAWN_FILE_AND_ARGV_ZERO.");
+  g_snprintf (full_cmdline, sizeof (full_cmdline),
+              "'%s' this-should-be-argv-zero print_argv0", spawn_binary);
+  result = g_shell_parse_argv (full_cmdline, NULL, &argv, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+
+  result = g_spawn_sync (NULL, argv, NULL, G_SPAWN_FILE_AND_ARGV_ZERO,
+                         NULL, NULL, &output, NULL, NULL, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+  g_assert_cmpstr (output, ==, "this-should-be-argv-zero");
+
+  g_free (output);
+  output = NULL;
+  g_free (argv);
+  argv = NULL;
+
+  g_test_message ("Now talking to it through pipes.");
+  g_assert_cmpint (pipe (pipedown), >=, 0);
+  g_assert_cmpint (pipe (pipeup), >=, 0);
+
+  g_snprintf (full_cmdline, sizeof (full_cmdline), "'%s' pipes %d %d",
+              spawn_binary, pipedown[0], pipeup[1]);
+
+  result = g_shell_parse_argv (full_cmdline, NULL, &argv, &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+
+  result = g_spawn_async (NULL, argv, NULL,
+                          G_SPAWN_LEAVE_DESCRIPTORS_OPEN |
+                          G_SPAWN_DO_NOT_REAP_CHILD,
+                          NULL, NULL, NULL,
+                          &err);
+  g_assert_no_error (err);
+  g_assert_true (result);
+  g_free (argv);
+  argv = NULL;
+
+  g_assert_cmpint (read (pipeup[0], &n, sizeof (n)), ==, sizeof (n));
+  g_assert_cmpint (read (pipeup[0], buf, n), ==, n);
+
+  n = strlen ("Bye then");
+  g_assert_cmpint (write (pipedown[1], &n, sizeof (n)), !=, -1);
+  g_assert_cmpint (write (pipedown[1], "Bye then", n), !=, -1);
+
+  g_assert_cmpint (read (pipeup[0], &n, sizeof (n)), ==, sizeof (n));
+  g_assert_cmpint (n, ==, strlen ("See ya"));
+
+  g_assert_cmpint (read (pipeup[0], buf, n), ==, n);
+
+  buf[n] = '\0';
+  g_assert_cmpstr (buf, ==, "See ya");
 #endif
 }
 
@@ -346,7 +198,13 @@ int
 main (int   argc,
       char *argv[])
 {
-  run_tests (argv[0]);
-  
-  return 0;
+#ifdef G_OS_WIN32
+  dirname = g_path_get_dirname (argv[0]);
+#endif
+
+  g_test_init (&argc, &argv, NULL);
+
+  g_test_add_func ("/spawn/basics", test_spawn_basics);
+
+  return g_test_run ();
 }


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