-try with finished
[oweals/gnunet.git] / src / util / test_os_start_process.c
index 8114f399fd4be4c2de3dcf97a90c8071fe508177..f66e741d9f7be9b3f473597e3a62707c961478e2 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -24,7 +24,6 @@
  * This testcase simply calls the os start process code
  * giving a file descriptor to write stdout to.  If the
  * correct data "HELLO" is read then all is well.
  * This testcase simply calls the os start process code
  * giving a file descriptor to write stdout to.  If the
  * correct data "HELLO" is read then all is well.
- *
  */
 #include "platform.h"
 #include "gnunet_common.h"
  */
 #include "platform.h"
 #include "gnunet_common.h"
 #include "gnunet_scheduler_lib.h"
 #include "disk.h"
 
 #include "gnunet_scheduler_lib.h"
 #include "disk.h"
 
-#define VERBOSE GNUNET_NO
+#define VERBOSE GNUNET_EXTRA_LOGGING
 
 
-static int
-check ()
+static char *test_phrase = "HELLO WORLD";
+static int ok;
+
+static struct GNUNET_OS_Process *proc;
+
+/* Pipe to write to started processes stdin (on write end) */
+static struct GNUNET_DISK_PipeHandle *hello_pipe_stdin;
+
+/* Pipe to read from started processes stdout (on read end) */
+static struct GNUNET_DISK_PipeHandle *hello_pipe_stdout;
+
+static GNUNET_SCHEDULER_TaskIdentifier die_task;
+
+static void
+end_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+
+  if (0 != GNUNET_OS_process_kill (proc, SIGTERM))
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
+  }
+  GNUNET_OS_process_wait (proc);
+  GNUNET_OS_process_close (proc);
+  proc = NULL;
+  GNUNET_DISK_pipe_close (hello_pipe_stdout);
+  GNUNET_DISK_pipe_close (hello_pipe_stdin);
+}
+
+static void
+read_call (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct GNUNET_DISK_FileHandle *stdout_read_handle = cls;
+  char buf[16];
+
+  memset (&buf, 0, sizeof (buf));
+  int bytes;
+
+  bytes = GNUNET_DISK_file_read (stdout_read_handle, &buf, sizeof (buf));
+
+#if VERBOSE
+  FPRINTF (stderr, "bytes is %d\n", bytes);
+#endif
+
+  if (bytes < 1)
+  {
+    GNUNET_break (0);
+    ok = 1;
+    GNUNET_SCHEDULER_cancel (die_task);
+    GNUNET_SCHEDULER_add_now (&end_task, NULL);
+    return;
+  }
+
+  ok = strncmp (&buf[0], test_phrase, strlen (test_phrase));
+#if VERBOSE
+  FPRINTF (stderr, "read %s\n", &buf[0]);
+#endif
+  if (ok == 0)
+  {
+    GNUNET_SCHEDULER_cancel (die_task);
+    GNUNET_SCHEDULER_add_now (&end_task, NULL);
+    return;
+  }
+
+  GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                  stdout_read_handle, &read_call,
+                                  stdout_read_handle);
+
+}
+
+
+static void
+task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   char *fn;
 {
   char *fn;
-  pid_t pid;
-  char *buf;
-  int fd_stdout;
-  int fd_stdin;
-  int ret;
-  static char *test_phrase = "HELLO WORLD";
-  /* Pipe to write to started processes stdin (on write end) */
-  struct GNUNET_DISK_PipeHandle *hello_pipe_stdin;
-  /* Pipe to read from started processes stdout (on read end) */
-  struct GNUNET_DISK_PipeHandle *hello_pipe_stdout;
+  const struct GNUNET_DISK_FileHandle *stdout_read_handle;
+  const struct GNUNET_DISK_FileHandle *wh;
 
 
-  buf = GNUNET_malloc(strlen(test_phrase) + 1);
-  GNUNET_asprintf(&fn, "cat");
+  GNUNET_asprintf (&fn, "cat");
 
 
-  hello_pipe_stdin = GNUNET_DISK_pipe(GNUNET_YES);
-  hello_pipe_stdout = GNUNET_DISK_pipe(GNUNET_YES);
+  hello_pipe_stdin = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_YES, GNUNET_NO);
+  hello_pipe_stdout = GNUNET_DISK_pipe (GNUNET_YES, GNUNET_YES, GNUNET_NO, GNUNET_YES);
 
   if ((hello_pipe_stdout == NULL) || (hello_pipe_stdin == NULL))
 
   if ((hello_pipe_stdout == NULL) || (hello_pipe_stdin == NULL))
-    return GNUNET_SYSERR;
-
-  pid = GNUNET_OS_start_process (hello_pipe_stdin, hello_pipe_stdout, fn,
-                                 "test_gnunet_echo_hello", NULL);
+  {
+    GNUNET_break (0);
+    ok = 1;
+    GNUNET_free (fn);
+    return;
+  }
+
+  proc =
+      GNUNET_OS_start_process (hello_pipe_stdin, hello_pipe_stdout, fn,
+                               "test_gnunet_echo_hello", "-", NULL);
+  GNUNET_free (fn);
 
   /* Close the write end of the read pipe */
 
   /* Close the write end of the read pipe */
-  GNUNET_DISK_pipe_close_end(hello_pipe_stdout, GNUNET_DISK_PIPE_END_WRITE);
+  GNUNET_DISK_pipe_close_end (hello_pipe_stdout, GNUNET_DISK_PIPE_END_WRITE);
   /* Close the read end of the write pipe */
   /* Close the read end of the write pipe */
-  GNUNET_DISK_pipe_close_end(hello_pipe_stdin, GNUNET_DISK_PIPE_END_READ);
-  /* Get the FD to read from */
-  GNUNET_DISK_internal_file_handle_ (GNUNET_DISK_pipe_handle(hello_pipe_stdout, GNUNET_DISK_PIPE_END_READ), &fd_stdout, sizeof (int));
-  /* Get the FD to write to */
-  GNUNET_DISK_internal_file_handle_ (GNUNET_DISK_pipe_handle(hello_pipe_stdin, GNUNET_DISK_PIPE_END_WRITE), &fd_stdin, sizeof (int));
+  GNUNET_DISK_pipe_close_end (hello_pipe_stdin, GNUNET_DISK_PIPE_END_READ);
+
+  wh = GNUNET_DISK_pipe_handle (hello_pipe_stdin, GNUNET_DISK_PIPE_END_WRITE);
 
   /* Write the test_phrase to the cat process */
 
   /* Write the test_phrase to the cat process */
-  ret = write(fd_stdin, test_phrase, strlen(test_phrase) + 1);
+  if (GNUNET_DISK_file_write (wh, test_phrase, strlen (test_phrase) + 1) !=
+      strlen (test_phrase) + 1)
+  {
+    GNUNET_break (0);
+    ok = 1;
+    return;
+  }
 
   /* Close the write end to end the cycle! */
 
   /* Close the write end to end the cycle! */
-  GNUNET_DISK_pipe_close_end(hello_pipe_stdin, GNUNET_DISK_PIPE_END_WRITE);
-
-  ret = 0;
-  /* Read from the cat process, hopefully get the phrase we wrote to it! */
-  while (read(fd_stdout, buf, strlen(test_phrase) + 1) > 0)
-    {
-      ret = strncmp(buf, test_phrase, strlen(test_phrase));
-    }
-
-  if (0 != PLIBC_KILL (pid, SIGTERM))
-    {
-      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
-    }
-  GNUNET_OS_process_wait (pid);
-  GNUNET_DISK_pipe_close(hello_pipe_stdout);
-  GNUNET_DISK_pipe_close(hello_pipe_stdin);
+  GNUNET_DISK_pipe_close_end (hello_pipe_stdin, GNUNET_DISK_PIPE_END_WRITE);
 
 
-  return ret;
+  stdout_read_handle =
+      GNUNET_DISK_pipe_handle (hello_pipe_stdout, GNUNET_DISK_PIPE_END_READ);
+
+  die_task =
+      GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
+                                    (GNUNET_TIME_UNIT_MINUTES, 1), &end_task,
+                                    NULL);
+
+  GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                  stdout_read_handle, &read_call,
+                                  (void *) stdout_read_handle);
+
+}
+
+/**
+ * Main method, starts scheduler with task1,
+ * checks that "ok" is correct at the end.
+ */
+static int
+check ()
+{
+  ok = 1;
+  GNUNET_SCHEDULER_run (&task, &ok);
+  return ok;
 }
 
 }
 
+
 int
 main (int argc, char *argv[])
 {
   int ret;
 
 int
 main (int argc, char *argv[])
 {
   int ret;
 
-  GNUNET_log_setup ("test-start-process",
+  GNUNET_log_setup ("test-os-start-process",
 #if VERBOSE
                     "DEBUG",
 #else
 #if VERBOSE
                     "DEBUG",
 #else