[glib: 1/5] Convert tests/gio-test.c to g_test framework




commit dbe8e52bde8194d52adc5d7b28a51ac4b5b30a63
Author: Emmanuel Fleury <emmanuel fleury gmail com>
Date:   Thu Feb 24 11:54:14 2022 +0100

    Convert tests/gio-test.c to g_test framework

 tests/gio-test.c | 499 ++++++++++++++++++++++++++++---------------------------
 1 file changed, 255 insertions(+), 244 deletions(-)
---
diff --git a/tests/gio-test.c b/tests/gio-test.c
index d203d0b27a..3bab515eba 100644
--- a/tests/gio-test.c
+++ b/tests/gio-test.c
@@ -19,9 +19,6 @@
  * Just run it. Optional parameter is number of sub-processes.
  */
 
-#undef G_DISABLE_ASSERT
-#undef G_LOG_DOMAIN
-
 #include "config.h"
 
 #include <glib.h>
@@ -47,11 +44,11 @@
 static int nrunning;
 static GMainLoop *main_loop;
 
-#define BUFSIZE 5000           /* Larger than the circular buffer in
-                                * giowin32.c on purpose.
-                                */
+/* Larger than the circular buffer in giowin32.c on purpose */
+#define BUFSIZE 5000
 
 static int nkiddies;
+static char *exec_name;
 
 static struct {
   int fd;
@@ -60,10 +57,10 @@ static struct {
 
 static GIOError
 read_all (int         fd,
-         GIOChannel *channel,
-         char       *buffer,
-         guint       nbytes,
-         guint      *bytes_read)
+          GIOChannel *channel,
+          char       *buffer,
+          guint       nbytes,
+          guint      *bytes_read)
 {
   guint left = nbytes;
   gsize nb;
@@ -77,16 +74,16 @@ read_all (int         fd,
   while (left)
     {
       error = g_io_channel_read (channel, bufp, left, &nb);
-      
+
       if (error != G_IO_ERROR_NONE)
-       {
-         g_print ("gio-test: ...from %d: %d\n", fd, error);
-         if (error == G_IO_ERROR_AGAIN)
-           continue;
-         break;
-       }
+        {
+          g_print ("gio-test: ...from %d: %d\n", fd, error);
+          if (error == G_IO_ERROR_AGAIN)
+            continue;
+          break;
+        }
       if (nb == 0)
-       return error;
+        return error;
       left -= nb;
       bufp += nb;
       *bytes_read += nb;
@@ -101,23 +98,23 @@ shutdown_source (gpointer data)
     {
       nrunning--;
       if (nrunning == 0)
-       g_main_loop_quit (main_loop);
+        g_main_loop_quit (main_loop);
     }
 }
 
 static gboolean
 recv_message (GIOChannel  *channel,
-             GIOCondition cond,
-             gpointer    data)
+              GIOCondition cond,
+              gpointer    data)
 {
   gint fd = g_io_channel_unix_get_fd (channel);
   gboolean retval = TRUE;
 
   g_debug ("gio-test: ...from %d:%s%s%s%s", fd,
-          (cond & G_IO_ERR) ? " ERR" : "",
-          (cond & G_IO_HUP) ? " HUP" : "",
-          (cond & G_IO_IN)  ? " IN"  : "",
-          (cond & G_IO_PRI) ? " PRI" : "");
+           (cond & G_IO_ERR) ? " ERR" : "",
+           (cond & G_IO_HUP) ? " HUP" : "",
+           (cond & G_IO_IN)  ? " IN"  : "",
+           (cond & G_IO_PRI) ? " PRI" : "");
 
   if (cond & (G_IO_ERR | G_IO_HUP))
     {
@@ -133,96 +130,93 @@ recv_message (GIOChannel  *channel,
       guint j;
       int i, seq;
       GIOError error;
-      
+
       error = read_all (fd, channel, (gchar *) &seq, sizeof (seq), &nb);
       if (error == G_IO_ERROR_NONE)
-       {
-         if (nb == 0)
-           {
-             g_debug ("gio-test: ...from %d: EOF", fd);
-             shutdown_source (data);
-             return FALSE;
-           }
-         
-         g_assert (nb == sizeof (nbytes));
-
-         for (i = 0; i < nkiddies; i++)
-           if (seqtab[i].fd == fd)
-             {
+        {
+          if (nb == 0)
+            {
+              g_debug ("gio-test: ...from %d: EOF", fd);
+              shutdown_source (data);
+              return FALSE;
+            }
+          g_assert_cmpuint (nb, ==, sizeof (nbytes));
+
+          for (i = 0; i < nkiddies; i++)
+            if (seqtab[i].fd == fd)
+              {
                 g_assert_cmpint (seq, ==, seqtab[i].seq);
-               seqtab[i].seq++;
-               break;
-             }
+                seqtab[i].seq++;
+                break;
+              }
 
-         error = read_all (fd, channel, (gchar *) &nbytes, sizeof (nbytes), &nb);
-       }
+          error =
+            read_all (fd, channel, (gchar *) &nbytes, sizeof (nbytes), &nb);
+        }
 
       if (error != G_IO_ERROR_NONE)
-       return FALSE;
-      
+        return FALSE;
+
       if (nb == 0)
-       {
-         g_debug ("gio-test: ...from %d: EOF", fd);
-         shutdown_source (data);
-         return FALSE;
-       }
-      
-      g_assert (nb == sizeof (nbytes));
-
-      g_assert_cmpint (nbytes, <, BUFSIZE);
-      g_assert (nbytes < BUFSIZE);
+        {
+          g_debug ("gio-test: ...from %d: EOF", fd);
+          shutdown_source (data);
+          return FALSE;
+        }
+      g_assert_cmpuint (nb, ==, sizeof (nbytes));
+
+      g_assert_cmpuint (nbytes, <, BUFSIZE);
       g_debug ("gio-test: ...from %d: %d bytes", fd, nbytes);
       if (nbytes > 0)
-       {
-         error = read_all (fd, channel, buf, nbytes, &nb);
-
-         if (error != G_IO_ERROR_NONE)
-           return FALSE;
-
-         if (nb == 0)
-           {
-             g_debug ("gio-test: ...from %d: EOF", fd);
-             shutdown_source (data);
-             return FALSE;
-           }
-      
-         for (j = 0; j < nbytes; j++)
-            g_assert (buf[j] == ' ' + (char) ((nbytes + j) % 95));
-         g_debug ("gio-test: ...from %d: OK", fd);
-       }
+        {
+          error = read_all (fd, channel, buf, nbytes, &nb);
+
+          if (error != G_IO_ERROR_NONE)
+            return FALSE;
+
+          if (nb == 0)
+            {
+              g_debug ("gio-test: ...from %d: EOF", fd);
+              shutdown_source (data);
+              return FALSE;
+            }
+
+          for (j = 0; j < nbytes; j++)
+            g_assert_cmpint (buf[j], ==, ' ' + (char) ((nbytes + j) % 95));
+          g_debug ("gio-test: ...from %d: OK", fd);
+        }
     }
   return retval;
 }
 
 #ifdef G_OS_WIN32
-
 static gboolean
 recv_windows_message (GIOChannel  *channel,
-                     GIOCondition cond,
-                     gpointer    data)
+                      GIOCondition cond,
+                      gpointer    data)
 {
   GIOError error;
   MSG msg;
   gsize nb;
-  
+
   while (1)
     {
       error = g_io_channel_read (channel, (gchar *) &msg, sizeof (MSG), &nb);
-      
+
       if (error != G_IO_ERROR_NONE)
-       {
-         g_print ("gio-test: ...reading Windows message: G_IO_ERROR_%s\n",
-                  (error == G_IO_ERROR_AGAIN ? "AGAIN" :
-                   (error == G_IO_ERROR_INVAL ? "INVAL" :
-                    (error == G_IO_ERROR_UNKNOWN ? "UNKNOWN" : "???"))));
-         if (error == G_IO_ERROR_AGAIN)
-           continue;
-       }
+        {
+          g_print ("gio-test: ...reading Windows message: G_IO_ERROR_%s\n",
+                   (error == G_IO_ERROR_AGAIN ? "AGAIN" :
+                    (error == G_IO_ERROR_INVAL ? "INVAL" :
+                     (error == G_IO_ERROR_UNKNOWN ? "UNKNOWN" : "???"))));
+          if (error == G_IO_ERROR_AGAIN)
+            continue;
+        }
       break;
     }
 
   g_print ("gio-test: ...Windows message for 0x%p: %d,%" G_GUINTPTR_FORMAT ",%" G_GINTPTR_FORMAT "\n",
-          msg.hwnd, msg.message, msg.wParam, (gintptr)msg.lParam);
+           msg.hwnd, msg.message, msg.wParam, (gintptr) msg.lParam);
 
   return TRUE;
 }
@@ -232,190 +226,207 @@ LRESULT CALLBACK window_procedure (HWND   hwnd,
                                    WPARAM wparam,
                                    LPARAM lparam);
 
-LRESULT CALLBACK 
+LRESULT CALLBACK
 window_procedure (HWND hwnd,
-                 UINT message,
-                 WPARAM wparam,
-                 LPARAM lparam)
+                  UINT message,
+                  WPARAM wparam,
+                  LPARAM lparam)
 {
   g_print ("gio-test: window_procedure for 0x%p: %d,%" G_GUINTPTR_FORMAT ",%" G_GINTPTR_FORMAT "\n",
-          hwnd, message, wparam, (gintptr)lparam);
+           hwnd, message, wparam, (gintptr) lparam);
   return DefWindowProc (hwnd, message, wparam, lparam);
 }
-
 #endif
 
-int
-main (int    argc,
-      char **argv)
+static void
+spawn_process (int children_nb)
 {
-  if (argc < 3)
-    {
-      /* Parent */
-      
-      GIOChannel *my_read_channel;
-      gchar *cmdline;
-      int i;
+  GIOChannel *my_read_channel;
+  gchar *cmdline;
+  int i;
+
 #ifdef G_OS_WIN32
-      GTimeVal start, end;
-      GPollFD pollfd;
-      int pollresult;
-      ATOM klass;
-      static WNDCLASS wcl;
-      HWND hwnd;
-      GIOChannel *windows_messages_channel;
-#endif
+  GTimeVal start, end;
+  GPollFD pollfd;
+  int pollresult;
+  ATOM klass;
+  static WNDCLASS wcl;
+  HWND hwnd;
+  GIOChannel *windows_messages_channel;
+
+  wcl.style = 0;
+  wcl.lpfnWndProc = window_procedure;
+  wcl.cbClsExtra = 0;
+  wcl.cbWndExtra = 0;
+  wcl.hInstance = GetModuleHandle (NULL);
+  wcl.hIcon = NULL;
+  wcl.hCursor = NULL;
+  wcl.hbrBackground = NULL;
+  wcl.lpszMenuName = NULL;
+  wcl.lpszClassName = "gio-test";
+
+  klass = RegisterClass (&wcl);
+
+  if (!klass)
+    {
+      g_print ("gio-test: RegisterClass failed\n");
+      exit (1);
+    }
 
-      nkiddies = (argc == 1 ? 1 : atoi(argv[1]));
-      seqtab = g_malloc (nkiddies * 2 * sizeof (int));
+  hwnd = CreateWindow (MAKEINTATOM(klass), "gio-test", 0, 0, 0, 10, 10,
+                       NULL, NULL, wcl.hInstance, NULL);
+  if (!hwnd)
+    {
+      g_print ("gio-test: CreateWindow failed\n");
+      exit (1);
+    }
 
-#ifdef G_OS_WIN32
-      wcl.style = 0;
-      wcl.lpfnWndProc = window_procedure;
-      wcl.cbClsExtra = 0;
-      wcl.cbWndExtra = 0;
-      wcl.hInstance = GetModuleHandle (NULL);
-      wcl.hIcon = NULL;
-      wcl.hCursor = NULL;
-      wcl.hbrBackground = NULL;
-      wcl.lpszMenuName = NULL;
-      wcl.lpszClassName = "gio-test";
-
-      klass = RegisterClass (&wcl);
-
-      if (!klass)
-       {
-         g_print ("gio-test: RegisterClass failed\n");
-         exit (1);
-       }
-
-      hwnd = CreateWindow (MAKEINTATOM(klass), "gio-test", 0, 0, 0, 10, 10,
-                          NULL, NULL, wcl.hInstance, NULL);
-      if (!hwnd)
-       {
-         g_print ("gio-test: CreateWindow failed\n");
-         exit (1);
-       }
-
-      windows_messages_channel = g_io_channel_win32_new_messages ((guint) (guintptr) hwnd);
-      g_io_add_watch (windows_messages_channel, G_IO_IN, recv_windows_message, 0);
+  windows_messages_channel =
+    g_io_channel_win32_new_messages ((guint) (guintptr) hwnd);
+  g_io_add_watch (windows_messages_channel, G_IO_IN, recv_windows_message, 0);
 #endif
 
-      for (i = 0; i < nkiddies; i++)
-       {
-         int pipe_to_sub[2], pipe_from_sub[2];
-         guint *id;
-         
-         if (pipe (pipe_to_sub) == -1 ||
-             pipe (pipe_from_sub) == -1)
-           perror ("pipe"), exit (1);
-         
-         seqtab[i].fd = pipe_from_sub[0];
-         seqtab[i].seq = 0;
-
-         my_read_channel = g_io_channel_unix_new (pipe_from_sub[0]);
-         
-         id = g_new (guint, 1);
-         *id =
-           g_io_add_watch_full (my_read_channel,
-                                G_PRIORITY_DEFAULT,
-                                G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP,
-                                recv_message,
-                                id, g_free);
-         
-         nrunning++;
-         
+  nkiddies = (children_nb > 0 ? children_nb : 1);
+  seqtab = g_malloc (nkiddies * 2 * sizeof (int));
+
+  for (i = 0; i < nkiddies; i++)
+    {
+      guint *id;
+      int pipe_to_sub[2], pipe_from_sub[2];
+
+      if (pipe (pipe_to_sub) == -1 || pipe (pipe_from_sub) == -1)
+        {
+          perror ("pipe");
+          exit (1);
+        }
+
+      seqtab[i].fd = pipe_from_sub[0];
+      seqtab[i].seq = 0;
+
+      my_read_channel = g_io_channel_unix_new (pipe_from_sub[0]);
+
+      id = g_new (guint, 1);
+      *id = g_io_add_watch_full (my_read_channel,
+                                 G_PRIORITY_DEFAULT,
+                                 G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP,
+                                 recv_message,
+                                 id, g_free);
+      nrunning++;
+
 #ifdef G_OS_WIN32
-         cmdline = g_strdup_printf ("%d:%d:0x%p",
-                                    pipe_to_sub[0],
-                                    pipe_from_sub[1],
-                                    hwnd);
-         _spawnl (_P_NOWAIT, argv[0], argv[0], "--child", cmdline, NULL);
+      /* Spawn new Win32 process */
+      cmdline =
+        g_strdup_printf ("%d:%d:0x%p", pipe_to_sub[0], pipe_from_sub[1], hwnd);
+      _spawnl (_P_NOWAIT, exec_name, exec_name, "--child", cmdline, NULL);
 #else
-         cmdline = g_strdup_printf ("%s --child %d:%d &", argv[0],
-                                    pipe_to_sub[0], pipe_from_sub[1]);
-         
-         system (cmdline);
-          g_free (cmdline);
+      /* Spawn new Unix process */
+      cmdline = g_strdup_printf ("%s --child %d:%d &",
+                                 exec_name, pipe_to_sub[0], pipe_from_sub[1]);
+      system (cmdline);
 #endif
-         close (pipe_to_sub[0]);
-         close (pipe_from_sub [1]);
+      g_free (cmdline);
+
+      /* Closing pipes */
+      close (pipe_to_sub[0]);
+      close (pipe_from_sub[1]);
 
 #ifdef G_OS_WIN32
-         g_get_current_time (&start);
-         g_io_channel_win32_make_pollfd (my_read_channel, G_IO_IN, &pollfd);
-         pollresult = g_io_channel_win32_poll (&pollfd, 1, 100);
-         g_get_current_time (&end);
-         if (end.tv_usec < start.tv_usec)
-           end.tv_sec--, end.tv_usec += 1000000;
-         g_print ("gio-test: had to wait %ld.%03ld s, result:%d\n",
-                  end.tv_sec - start.tv_sec,
-                  (end.tv_usec - start.tv_usec) / 1000,
-                  pollresult);
+      g_get_current_time (&start);
+      g_io_channel_win32_make_pollfd (my_read_channel, G_IO_IN, &pollfd);
+      pollresult = g_io_channel_win32_poll (&pollfd, 1, 100);
+      g_get_current_time (&end);
+      if (end.tv_usec < start.tv_usec)
+        end.tv_sec--, end.tv_usec += 1000000;
+      g_print ("gio-test: had to wait %ld.%03ld s, result:%d\n",
+               end.tv_sec - start.tv_sec,
+               (end.tv_usec - start.tv_usec) / 1000, pollresult);
 #endif
-          g_io_channel_unref (my_read_channel);
-       }
-      
-      main_loop = g_main_loop_new (NULL, FALSE);
-      
-      g_main_loop_run (main_loop);
-
-      g_main_loop_unref (main_loop);
-      g_free (seqtab);
+
+      g_io_channel_unref (my_read_channel);
     }
-  else if (argc == 3)
-    {
-      /* Child */
-      
-      int readfd, writefd;
+
+  main_loop = g_main_loop_new (NULL, FALSE);
+  g_main_loop_run (main_loop);
+
+  g_main_loop_unref (main_loop);
+  g_free (seqtab);
+}
+
+static void
+run_process (int argc, char *argv[])
+{
+  int readfd, writefd;
+  GTimeVal tv;
+  char buf[BUFSIZE];
+  int buflen, i, j, n;
 #ifdef G_OS_WIN32
-      HWND hwnd;
+  HWND hwnd;
 #endif
-      int i, j;
-      char buf[BUFSIZE];
-      int buflen;
-      GTimeVal tv;
-      int n;
-  
-      g_get_current_time (&tv);
-      
-      sscanf (argv[2], "%d:%d%n", &readfd, &writefd, &n);
 
+  g_get_current_time (&tv);
+
+  /* Extract parameters */
+  sscanf (argv[2], "%d:%d%n", &readfd, &writefd, &n);
 #ifdef G_OS_WIN32
-      sscanf (argv[2] + n, ":0x%p", &hwnd);
+  sscanf (argv[2] + n, ":0x%p", &hwnd);
 #endif
-      
-      srand (tv.tv_sec ^ (tv.tv_usec / 1000) ^ readfd ^ (writefd << 4));
-  
-      for (i = 0; i < 20 + rand() % 20; i++)
-       {
-         g_usleep (100 + (rand() % 10) * 5000);
-         buflen = rand() % BUFSIZE;
-         for (j = 0; j < buflen; j++)
-           buf[j] = ' ' + ((buflen + j) % 95);
-         g_debug ("gio-test: child writing %d+%d bytes to %d",
-                  (int)(sizeof(i) + sizeof(buflen)), buflen, writefd);
-         write (writefd, &i, sizeof (i));
-         write (writefd, &buflen, sizeof (buflen));
-         write (writefd, buf, buflen);
+
+  srand (tv.tv_sec ^ (tv.tv_usec / 1000) ^ readfd ^ (writefd << 4));
+
+  for (i = 0; i < 20 + rand () % 10; i++)
+    {
+      g_usleep ((100 + rand () % 10) * 2500);
+      buflen = rand () % BUFSIZE;
+      for (j = 0; j < buflen; j++)
+        buf[j] = ' ' + ((buflen + j) % 95);
+      g_debug ("gio-test: child writing %d+%d bytes to %d",
+               (int) (sizeof (i) + sizeof (buflen)), buflen, writefd);
+      write (writefd, &i, sizeof (i));
+      write (writefd, &buflen, sizeof (buflen));
+      write (writefd, buf, buflen);
 
 #ifdef G_OS_WIN32
-         if (rand() % 100 < 5)
-           {
-             int msg = WM_USER + (rand() % 100);
-             WPARAM wparam = rand ();
-             LPARAM lparam = rand ();
-             g_print ("gio-test: child posting message %d,%" G_GUINTPTR_FORMAT ",%" G_GINTPTR_FORMAT " to 
0x%p\n",
-                      msg, wparam, (gintptr)lparam, hwnd);
-             PostMessage (hwnd, msg, wparam, lparam);
-           }
+      if (i % 10 == 0)
+        {
+          int msg = WM_USER + (rand () % 100);
+          WPARAM wparam = rand ();
+          LPARAM lparam = rand ();
+          g_print ("gio-test: child posting message %d,%" G_GUINTPTR_FORMAT ",%" G_GINTPTR_FORMAT " to 
0x%p\n",
+                   msg, wparam, (gintptr) lparam, hwnd);
+          PostMessage (hwnd, msg, wparam, lparam);
+        }
 #endif
-       }
-      g_debug ("gio-test: child exiting, closing %d", writefd);
-      close (writefd);
     }
-  else
-    g_print ("Huh?\n");
-  
-  return 0;
+  g_debug ("gio-test: child exiting, closing %d", writefd);
+  close (writefd);
+}
+
+static void
+test_io_basics (void)
+{
+  spawn_process (1);
+#ifndef G_OS_WIN32
+  spawn_process (5);
+#endif
+}
+
+int
+main (int argc, char *argv[])
+{
+  /* Get executable name */
+  exec_name = argv[0];
+
+  /* Run the tests */
+  g_test_init (&argc, &argv, NULL);
+
+  /* Run subprocess, if it is the case */
+  if (argc > 2)
+    {
+      run_process (argc, argv);
+      return 0;
+    }
+
+  g_test_add_func ("/gio/io-basics", test_io_basics);
+
+  return g_test_run ();
 }


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