wip
[oweals/gnunet.git] / src / arm / test_gnunet_service_manager.c
index 2d39e392a96d159a757657cded5681553ffd20cd..e4aecb8c47674806a108d2c5bab3749c5c5386ce 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 const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+#if START_ARM
+static struct GNUNET_ARM_Handle *arm;
+#endif
+
+static void
+arm_stopped (void *cls, int success)
+{
+  if (success != GNUNET_NO)       
+    {
+      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)
+                 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, int success)
 {
-       if (NULL == addr)
-               GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Name not resolved!\n");
+  if (success != GNUNET_YES)
+    {
+      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 (cfg, 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,
+run(void *cls,
+    char * const *args,
     const char *cfgfile, 
-    const struct GNUNET_CONFIGURATION_Handle *cfg)
+    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", START_TIMEOUT, &arm_notify, NULL);
+#else
+  arm_notify (NULL, GNUNET_YES);
+#endif
 }
 
 
-static int
+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;
+  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, "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);
-  ret = check();
+#if VERBOSE
+                  "DEBUG",
+#else
+                  "WARNING",
+#endif
+                  NULL);
+  check();
   return ret;
 }