-fix double free, linker issue
[oweals/gnunet.git] / src / arm / test_gnunet_service_manager.c
index 2d39e392a96d159a757657cded5681553ffd20cd..2abcc95636859e1b34ce66ae2d3e724e006b81dd 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
-     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
 #include "platform.h"
 #include "gnunet_arm_service.h"
 #include "gnunet_resolver_service.h"
+#include "gnunet_os_lib.h"
 #include "gnunet_program_lib.h"
 
+/**
+ * Timeout for starting services, very short because of the strange way start works
+ * (by checking if running before starting, so really this time is always waited on
+ * startup (annoying)).
+ */
+#define START_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 50)
+
 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
 
-/* Global Variables */
-static int isOK = GNUNET_OK;
+#define START_ARM GNUNET_YES
+
+#define VERBOSE GNUNET_NO
+
+static int ret = 1;
+
 
-static void 
-hostNameResolveCB(void *cls, 
-                                 const struct sockaddr *addr, 
-                                 socklen_t addrlen)
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+#if START_ARM
+static struct GNUNET_ARM_Handle *arm;
+#endif
+
+static void
+arm_stopped (void *cls, enum GNUNET_ARM_ProcessStatus success)
 {
-       if (NULL == addr)
-               GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Name not resolved!\n");
+  if (success != GNUNET_ARM_PROCESS_DOWN)
+    {
+      GNUNET_break (0);
+      ret = 4;
+    }
+  else
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ARM stopped\n");
+    }
+#if START_ARM
+  GNUNET_ARM_disconnect (arm);
+  arm = NULL;
+#endif
+}
+
+static void
+hostNameResolveCB (void *cls, const struct sockaddr *addr, socklen_t addrlen)
+{
+  if ((ret == 0) || (ret == 4))
+    return;
+  if (NULL == addr)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Name not resolved!\n");
+#if START_ARM
+      GNUNET_ARM_stop_service (arm, "arm", TIMEOUT, &arm_stopped, NULL);
+#endif
+      ret = 3;
+      return;
+    }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Resolved hostname, now stopping ARM\n");
+  ret = 0;
+#if START_ARM
+  GNUNET_ARM_stop_service (arm, "arm", TIMEOUT, &arm_stopped, NULL);
+#endif
+}
+
+
+static void
+arm_notify (void *cls, enum GNUNET_ARM_ProcessStatus success)
+{
+  if (success != GNUNET_ARM_PROCESS_STARTING)
+    {
+      GNUNET_break (0);
+      ret = 1;
+      return;
+    }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Trying to resolve our own hostname!\n");
+  /* connect to the resolver service */
+  if (NULL ==
+      GNUNET_RESOLVER_hostname_resolve (AF_UNSPEC, TIMEOUT,
+                                       &hostNameResolveCB, NULL))
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                 "Unable initiate connection to resolver service\n");
+      ret = 2;
+#if START_ARM
+      GNUNET_ARM_stop_service (arm, "arm", TIMEOUT, &arm_stopped, NULL);
+#endif
+    }
 }
 
 
 static void
-run(void *cls, 
-       struct GNUNET_SCHEDULER_Handle *sched, 
-       char * const *args,
-    const char *cfgfile, 
-    const struct GNUNET_CONFIGURATION_Handle *cfg)
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *c)
 {
-       struct GNUNET_RESOLVER_RequestHandle *resolveRet;
-       
-       /* connect to the resolver service */
-       resolveRet =
-       GNUNET_RESOLVER_hostname_resolve (sched,
-                                         cfg, AF_UNSPEC,
-                                         TIMEOUT,
-                                         &hostNameResolveCB,
-                                         NULL);
-       if (NULL == resolveRet) {
-               GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Unable to resolve our own hostname!\n");
-               isOK = GNUNET_NO;
-       }
+  cfg = c;
+#if START_ARM
+  arm = GNUNET_ARM_connect (cfg, NULL);
+  GNUNET_ARM_start_service (arm, "arm", GNUNET_OS_INHERIT_STD_OUT_AND_ERR, START_TIMEOUT, &arm_notify, NULL);
+#else
+  arm_notify (NULL, GNUNET_YES);
+#endif
 }
 
 
-static int
-check()
+static void
+check ()
 {
-       char *const argv[] = {
-           "test-gnunet-service-manager",
-           "-c", "test_arm_api_data.conf",
-       #if VERBOSE
-           "-L", "DEBUG",
-       #endif
-           NULL
-         };
-         struct GNUNET_GETOPT_CommandLineOption options[] = {
-           GNUNET_GETOPT_OPTION_END
-         };
-         
-         /* Running ARM  and running the do_nothing task */
-         GNUNET_assert (GNUNET_OK ==
-                        GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
-                                            argv,
-                                            "test-gnunet-service-manager",
-                                            "nohelp", options, &run, NULL));
-         return isOK;
+  char *const argv[] = {
+    "test-gnunet-service-manager",
+    "-c", "test_arm_api_data.conf",
+#if VERBOSE
+    "-L", "DEBUG",
+#endif
+    NULL
+  };
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_OPTION_END
+  };
+  GNUNET_assert (GNUNET_OK ==
+                GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
+                                    argv, "test-gnunet-service-manager",
+                                    "nohelp", options, &run, NULL));
 }
 
 
 int
 main (int argc, char *argv[])
 {
-  int ret;
-  GNUNET_log_setup("test-gnunet-service-manager",
-  #if VERBOSE
-        "DEBUG",
-  #else
-        "WARNING",
-  #endif
-        NULL);
-  ret = check();
+  char hostname[GNUNET_OS_get_hostname_max_length () + 1];
+
+  if (0 != gethostname (hostname, sizeof (hostname) - 1))
+    {
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+                          "gethostname");
+      FPRINTF (stderr,
+              "%s", "Failed to determine my own hostname, testcase not run.\n");
+      return 0;
+    }
+  if (NULL == gethostbyname (hostname))
+    {
+      FPRINTF (stderr,
+              "Failed to resolve my hostname `%s', testcase not run.\n",
+              hostname);
+      return 0;
+    }
+
+  GNUNET_log_setup ("test-gnunet-service-manager",
+#if VERBOSE
+                   "DEBUG",
+#else
+                   "WARNING",
+#endif
+                   NULL);
+  check ();
   return ret;
 }