[kdbus] KDBUS_ITEM_PAYLOAD_OFF items are (once again) relative to msg header
[platform/upstream/glib.git] / tests / spawn-test.c
index 87ad8ee..806b93e 100644 (file)
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
@@ -24,6 +22,7 @@
  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN
 
 #include <glib.h>
 #include <string.h>
 #include <stdlib.h>
 
+#ifdef G_OS_WIN32
+#include <fcntl.h>
+#include <io.h>
+#define pipe(fds) _pipe(fds, 4096, _O_BINARY)
+#endif
+
 
 static void
 run_tests (void)
 {
   GError *err;
   gchar *output = NULL;
+#ifdef G_OS_WIN32
+  gchar *erroutput = NULL;
+  int pipedown[2], pipeup[2];
+  gchar **argv = 0;
+#endif
   
-  printf ("The following errors are supposed to occur:\n");
-
   err = NULL;
   if (!g_spawn_command_line_sync ("nonexistent_application foo 'bar baz' blah blah",
                                   NULL, NULL, NULL,
                                   &err))
     {
-      fprintf (stderr, "Error (normal, supposed to happen): %s\n", err->message);
       g_error_free (err);
     }
+  else
+    {
+      g_warning ("no error for sync spawn of nonexistent application");
+      exit (1);
+    }
 
   err = NULL;
   if (!g_spawn_command_line_async ("nonexistent_application foo bar baz \"blah blah\"",
                                    &err))
     {
-      fprintf (stderr, "Error (normal, supposed to happen): %s\n", err->message);
       g_error_free (err);
     }
+  else
+    {
+      g_warning ("no error for async spawn of nonexistent application");
+      exit (1);
+    }
 
-  printf ("Errors after this are not supposed to happen:\n");
-  
   err = NULL;
 #ifdef G_OS_UNIX
   if (!g_spawn_command_line_sync ("/bin/sh -c 'echo hello'",
@@ -85,8 +99,10 @@ run_tests (void)
     }
 #else
 #ifdef G_OS_WIN32
-  if (!g_spawn_command_line_sync ("ipconfig /all",
-                                  &output, NULL, NULL,
+  printf ("Running netstat synchronously, collecting its output\n");
+
+  if (!g_spawn_command_line_sync ("netstat -n",
+                                  &output, &erroutput, NULL,
                                   &err))
     {
       fprintf (stderr, "Error: %s\n", err->message);
@@ -96,18 +112,172 @@ run_tests (void)
   else
     {
       g_assert (output != NULL);
+      g_assert (erroutput != NULL);
       
-      if (strstr (output, "IP Configuration") == 0)
+      if (strstr (output, "Active Connections") == 0)
         {
-          printf ("output was '%s', should have contained 'IP Configuration'\n",
+          printf ("output was '%s', should have contained 'Active Connections'\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;
+    }
+
+  printf ("Running spawn-test-win32-gui in various ways. Click on the OK buttons.\n");
+
+  printf ("First asynchronously (without wait).\n");
+
+  if (!g_spawn_command_line_async ("'.\\spawn-test-win32-gui.exe' 1", &err))
+    {
+      fprintf (stderr, "Error: %s\n", err->message);
+      g_error_free (err);
+      exit (1);
+    }
+
+  printf ("Now synchronously, collecting its output.\n");
+  if (!g_spawn_command_line_sync ("'.\\spawn-test-win32-gui.exe' 2",
+                                 &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);
+      g_free (erroutput);
+    }
+
+  printf ("Now with G_SPAWN_FILE_AND_ARGV_ZERO.\n");
+
+  if (!g_shell_parse_argv ("'.\\spawn-test-win32-gui.exe' this-should-be-argv-zero nop", 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_FILE_AND_ARGV_ZERO,
+                     NULL, NULL, NULL,
+                     &err))
+    {
+      fprintf (stderr, "Error: %s\n", err->message);
+      g_error_free (err);
+      exit (1);
+    }
+
+  printf ("Now talking to it through pipes.\n");
+
+  if (pipe (pipedown) < 0 ||
+      pipe (pipeup) < 0)
+    {
+      fprintf (stderr, "Could not create pipes\n");
+      exit (1);
+    }
+
+  if (!g_shell_parse_argv (g_strdup_printf ("'.\\spawn-test-win32-gui.exe' pipes %d %d",
+                                           pipedown[0], pipeup[1]),
+                           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))
+       {
+         if (k == -1)
+           fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+         else
+           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+                    sizeof (n), k);
+         exit (1);
+       }
+
+      if ((k = read (pipeup[0], buf, n)) != n)
+       {
+         if (k == -1)
+           fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+         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)
+       {
+         fprintf (stderr, "Write error: %s\n", g_strerror (errno));
+         exit (1);
+       }
+
+      if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
+       {
+         if (k == -1)
+           fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+         else
+           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+                    sizeof (n), k);
+         exit (1);
+       }
+
+      if ((k = read (pipeup[0], buf, n)) != n)
+       {
+         if (k == -1)
+           fprintf (stderr, "Read error: %s\n", g_strerror (errno));
+         else
+           fprintf (stderr, "Wanted to read %d bytes, got %d\n",
+                    n, k);
+         exit (1);
+       }
+    }
 #endif
 #endif
 }
@@ -120,5 +290,3 @@ main (int   argc,
   
   return 0;
 }
-
-