- warn on missing cases
[oweals/gnunet.git] / src / arm / test_gnunet_service_arm.c
index bd7fe5fa95bedbdfe749c3365175b95d92f2dc38..816bf4cfb81bca9b3bdf95b2edac708a57a3fb53 100644 (file)
 
 static int ret = 1;
 
+static int resolved_ok = 0;
+
+static int asked_for_a_list = 0;
+
 static struct GNUNET_ARM_Handle *arm;
 
 static void
 trigger_disconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  GNUNET_ARM_disconnect (arm);
+  GNUNET_ARM_disconnect_and_free (arm);
   arm = NULL;
 }
 
+
 static void
-arm_stop_cb (void *cls, struct GNUNET_ARM_Handle *h, enum GNUNET_ARM_RequestStatus status, const char *servicename, enum GNUNET_ARM_Result result)
+arm_stop_cb (void *cls, 
+            struct GNUNET_ARM_Handle *h, 
+            enum GNUNET_ARM_RequestStatus status, 
+            const char *servicename, 
+            enum GNUNET_ARM_Result result)
 {
   GNUNET_break (status == GNUNET_ARM_REQUEST_SENT_OK);
   GNUNET_break (result == GNUNET_ARM_RESULT_STOPPING);
@@ -59,27 +68,51 @@ arm_stop_cb (void *cls, struct GNUNET_ARM_Handle *h, enum GNUNET_ARM_RequestStat
   GNUNET_SCHEDULER_add_now (trigger_disconnect, NULL);
 }
 
+
+static void
+service_list (void *cls, struct GNUNET_ARM_Handle *arm,
+             enum GNUNET_ARM_RequestStatus rs,
+             unsigned int count, const char *const*list)
+{
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
+             "%u services are are currently running\n", 
+             count);
+  GNUNET_break (count == 1);
+  GNUNET_break (0 == strcasecmp (list[0], "resolver (gnunet-service-resolver)"));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Got service list, now stopping arm\n");
+  ret = 0;
+  GNUNET_ARM_request_service_stop (arm, "arm", TIMEOUT, arm_stop_cb, NULL);
+}
+
+
 static void
 hostNameResolveCB (void *cls, const struct sockaddr *addr, socklen_t addrlen)
 {
-  if ((ret == 0) || (ret == 4))
+  if ((ret == 0) || (ret == 4) || (resolved_ok == 1))
     return;
   if (NULL == addr)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Name not resolved!\n");
     ret = 3;
+    GNUNET_ARM_request_service_stop (arm, "arm", TIMEOUT, arm_stop_cb, NULL);
   }
-  else
+  else if (asked_for_a_list == 0)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-        "Resolved hostname, now stopping ARM\n");
-    ret = 0;
+        "Resolved hostname, now checking the service list\n");
+    GNUNET_ARM_request_service_list (arm, TIMEOUT, service_list, NULL);
+    asked_for_a_list = 1;
+    resolved_ok = 1;
   }
-  GNUNET_ARM_request_service_stop (arm, "arm", TIMEOUT, arm_stop_cb, NULL);
 }
 
+
 static void
-arm_start_cb (void *cls, struct GNUNET_ARM_Handle *h, enum GNUNET_ARM_RequestStatus status, const char *servicename, enum GNUNET_ARM_Result result)
+arm_start_cb (void *cls, 
+             struct GNUNET_ARM_Handle *h, 
+             enum GNUNET_ARM_RequestStatus status, 
+             const char *servicename, 
+             enum GNUNET_ARM_Result result)
 {
   GNUNET_break (status == GNUNET_ARM_REQUEST_SENT_OK);
   GNUNET_break (result == GNUNET_ARM_RESULT_STARTING);
@@ -96,6 +129,7 @@ arm_start_cb (void *cls, struct GNUNET_ARM_Handle *h, enum GNUNET_ARM_RequestSta
   }
 }
 
+
 static void
 run (void *cls, char *const *args, const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *c)
@@ -115,8 +149,7 @@ run (void *cls, char *const *args, const char *cfgfile,
     else
       GNUNET_free (armconfig);
   }
-  arm = GNUNET_ARM_alloc (c);
-  GNUNET_ARM_connect (arm, NULL, NULL);
+  arm = GNUNET_ARM_connect (c, NULL, NULL);
   GNUNET_ARM_request_service_start (arm, "arm",
       GNUNET_OS_INHERIT_STD_OUT_AND_ERR, START_TIMEOUT, arm_start_cb, NULL);
 }
@@ -153,10 +186,10 @@ main (int argc, char *av[])
   GNUNET_log_setup ("test-gnunet-service-arm",
                    "WARNING",
                    NULL);
-  GNUNET_assert (GNUNET_OK ==
-                GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
-                                    argv, "test-gnunet-service-arm",
-                                    "nohelp", options, &run, NULL));
+  GNUNET_break (GNUNET_OK ==
+               GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
+                                   argv, "test-gnunet-service-arm",
+                                   "nohelp", options, &run, NULL));
   return ret;
 }