-remove async ecc key generation, not needed
[oweals/gnunet.git] / src / util / test_server_disconnect.c
index 84e9c7ccd1d201d5f0e8f4dc34f06746cae135ca..b54df48893616e365310f23525c825fc559a63f6 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2009 Christian Grothoff (and other contributing authors)
+     (C) 2009, 2010 Christian Grothoff (and other contributing authors)
 
      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
 */
 /**
  * @file util/test_server_disconnect.c
 */
 /**
  * @file util/test_server_disconnect.c
- * @brief tests for server.c and client.c,
- *       specifically client_disconnect
+ * @brief tests for server.c,  specifically GNUNET_SERVER_client_disconnect
  */
 #include "platform.h"
 #include "gnunet_common.h"
  */
 #include "platform.h"
 #include "gnunet_common.h"
-#include "gnunet_scheduler_lib.h"
 #include "gnunet_client_lib.h"
 #include "gnunet_client_lib.h"
+#include "gnunet_scheduler_lib.h"
 #include "gnunet_server_lib.h"
 #include "gnunet_time_lib.h"
 
 #include "gnunet_server_lib.h"
 #include "gnunet_time_lib.h"
 
-#define VERBOSE GNUNET_NO
 
 
-#define PORT 22335
+#define PORT 12435
 
 
-#define MY_TYPE 128
+#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 250)
 
 
+#define MY_TYPE 128
 
 static struct GNUNET_SERVER_Handle *server;
 
 
 static struct GNUNET_SERVER_Handle *server;
 
-static struct GNUNET_CLIENT_Connection *client;
-
-static struct GNUNET_SCHEDULER_Handle *sched;
+static struct GNUNET_CLIENT_Connection *cc;
 
 static struct GNUNET_CONFIGURATION_Handle *cfg;
 
 static int ok;
 
 
 static struct GNUNET_CONFIGURATION_Handle *cfg;
 
 static int ok;
 
-static void
-send_done (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
-  struct GNUNET_SERVER_Client *argclient = cls;
-  GNUNET_assert (ok == 3);
-  ok++;
-  GNUNET_SERVER_receive_done (argclient, GNUNET_OK);
-}
 
 static void
 
 static void
-server_disconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+finish_up (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
 {
-  struct GNUNET_SERVER_Client *argclient = cls;
   GNUNET_assert (ok == 5);
   GNUNET_assert (ok == 5);
-  ok++;
-  GNUNET_SERVER_client_disconnect (argclient);
+  ok = 0;
+  GNUNET_SERVER_destroy (server);
+  GNUNET_CLIENT_disconnect (cc);
+  GNUNET_CONFIGURATION_destroy (cfg);
 }
 
 
 static void
 }
 
 
 static void
-recv_cb (void *cls,
-         struct GNUNET_SERVER_Client *argclient,
-         const struct GNUNET_MessageHeader *message)
-{
-  void *addr;
-  size_t addrlen;
-  struct sockaddr_in sa;
-  struct sockaddr_in *have;
-
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_SERVER_client_get_address (argclient,
-                                                   &addr, &addrlen));
-
-  GNUNET_assert (addrlen == sizeof (struct sockaddr_in));
-  have = addr;
-  memset (&sa, 0, sizeof (sa));
-#if HAVE_SOCKADDR_IN_SIN_LEN
-  sa.sin_len = sizeof (sa);
-#endif
-  sa.sin_family = AF_INET;
-  sa.sin_port = have->sin_port;
-  sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
-  GNUNET_assert (0 == memcmp (&sa, addr, addrlen));
-  GNUNET_free (addr);
-  switch (ok)
-    {
-    case 2:
-      ok++;
-      GNUNET_SCHEDULER_add_delayed (sched,
-                                    GNUNET_YES,
-                                    GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                    GNUNET_SCHEDULER_NO_TASK,
-                                    GNUNET_TIME_relative_multiply
-                                    (GNUNET_TIME_UNIT_MILLISECONDS, 50),
-                                    &send_done, argclient);
-      break;
-    case 4:
-      ok++;
-      GNUNET_SCHEDULER_add_delayed (sched,
-                                    GNUNET_YES,
-                                    GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                    GNUNET_SCHEDULER_NO_TASK,
-                                    GNUNET_TIME_relative_multiply
-                                    (GNUNET_TIME_UNIT_MILLISECONDS, 50),
-                                    &server_disconnect, argclient);
-      GNUNET_SERVER_receive_done (argclient, GNUNET_OK);
-      break;
-    default:
-      GNUNET_assert (0);
-    }
-
-}
-
-static void
-disconnect_notify (void *cls, const struct GNUNET_MessageHeader *msg)
+notify_disconnect (void *cls, struct GNUNET_SERVER_Client *clientarg)
 {
 {
-  GNUNET_assert (msg == NULL);
-  GNUNET_assert (ok == 7);
-  ok = 0;
-  GNUNET_CLIENT_disconnect (client);
-  GNUNET_SCHEDULER_shutdown (sched);
-  GNUNET_CONFIGURATION_destroy (cfg);
+  if (clientarg == NULL)
+    return;
+  GNUNET_assert (ok == 4);
+  ok = 5;
+  GNUNET_SCHEDULER_add_now (&finish_up, NULL);
 }
 
 
 }
 
 
-/**
- * Functions with this signature are called whenever a client
- * is disconnected on the network level.
- *
- * @param cls closure
- * @param client identification of the client
- */
 static void
 static void
-notify_disconnect (void *cls, struct GNUNET_SERVER_Client *clientarg)
+server_disconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
 {
-  GNUNET_assert (ok == 6);
-  ok++;
-  GNUNET_CLIENT_receive (client,
-                         &disconnect_notify,
-                         NULL, GNUNET_TIME_UNIT_FOREVER_REL);
+  struct GNUNET_SERVER_Client *argclient = cls;
+
+  GNUNET_assert (ok == 3);
+  ok = 4;
+  GNUNET_SERVER_client_disconnect (argclient);
+  GNUNET_SERVER_client_drop (argclient);
 }
 
 
 }
 
 
-static size_t
-notify_ready (void *cls, size_t size, void *buf)
+static void
+recv_cb (void *cls, struct GNUNET_SERVER_Client *client,
+         const struct GNUNET_MessageHeader *message)
 {
 {
-  struct GNUNET_MessageHeader *msg;
-
-  GNUNET_assert (size >= 256);
-  GNUNET_assert (1 == ok);
-  ok++;
-  msg = buf;
-  msg->type = htons (MY_TYPE);
-  msg->size = htons (sizeof (struct GNUNET_MessageHeader));
-  msg++;
-  msg->type = htons (MY_TYPE);
-  msg->size = htons (sizeof (struct GNUNET_MessageHeader));
-  return 2 * sizeof (struct GNUNET_MessageHeader);
+  GNUNET_assert (ok == 2);
+  ok = 3;
+  GNUNET_SERVER_client_keep (client);
+  GNUNET_SCHEDULER_add_now (&server_disconnect, client);
+  GNUNET_assert (sizeof (struct GNUNET_MessageHeader) == ntohs (message->size));
+  GNUNET_assert (MY_TYPE == ntohs (message->type));
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
 
 }
 
 
@@ -173,44 +98,57 @@ static struct GNUNET_SERVER_MessageHandler handlers[] = {
 };
 
 
 };
 
 
+static size_t
+transmit_initial_message (void *cls, size_t size, void *buf)
+{
+  struct GNUNET_MessageHeader msg;
+
+  GNUNET_assert (ok == 1);
+  ok = 2;
+  GNUNET_assert (size >= sizeof (struct GNUNET_MessageHeader));
+  msg.type = htons (MY_TYPE);
+  msg.size = htons (sizeof (struct GNUNET_MessageHeader));
+  memcpy (buf, &msg, sizeof (struct GNUNET_MessageHeader));
+  return sizeof (struct GNUNET_MessageHeader);
+}
+
+
 static void
 task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct sockaddr_in sa;
 static void
 task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct sockaddr_in sa;
+  struct sockaddr *sap[2];
+  socklen_t slens[2];
 
 
-  sched = tc->sched;
+  sap[0] = (struct sockaddr *) &sa;
+  slens[0] = sizeof (sa);
+  sap[1] = NULL;
+  slens[1] = 0;
   memset (&sa, 0, sizeof (sa));
 #if HAVE_SOCKADDR_IN_SIN_LEN
   sa.sin_len = sizeof (sa);
 #endif
   sa.sin_family = AF_INET;
   sa.sin_port = htons (PORT);
   memset (&sa, 0, sizeof (sa));
 #if HAVE_SOCKADDR_IN_SIN_LEN
   sa.sin_len = sizeof (sa);
 #endif
   sa.sin_family = AF_INET;
   sa.sin_port = htons (PORT);
-  server = GNUNET_SERVER_create (tc->sched,
-                                 NULL,
-                                 NULL,
-                                 (const struct sockaddr *) &sa,
-                                 sizeof (sa),
-                                 1024,
-                                 GNUNET_TIME_relative_multiply
-                                 (GNUNET_TIME_UNIT_MILLISECONDS, 250),
-                                 GNUNET_NO);
+  server = GNUNET_SERVER_create (NULL, NULL, sap, slens, TIMEOUT, GNUNET_NO);
   GNUNET_assert (server != NULL);
   GNUNET_assert (server != NULL);
-  handlers[0].callback_cls = cls;
   GNUNET_SERVER_add_handlers (server, handlers);
   GNUNET_SERVER_add_handlers (server, handlers);
-  GNUNET_SERVER_disconnect_notify (server, &notify_disconnect, cls);
+  GNUNET_SERVER_disconnect_notify (server, &notify_disconnect, NULL);
   cfg = GNUNET_CONFIGURATION_create ();
   cfg = GNUNET_CONFIGURATION_create ();
-  GNUNET_CONFIGURATION_set_value_number (cfg, "test", "PORT", PORT);
-  GNUNET_CONFIGURATION_set_value_string (cfg, "test", "HOSTNAME",
+  GNUNET_CONFIGURATION_set_value_number (cfg, "test-server", "PORT", PORT);
+  GNUNET_CONFIGURATION_set_value_string (cfg, "test-server", "HOSTNAME",
                                          "localhost");
   GNUNET_CONFIGURATION_set_value_string (cfg, "resolver", "HOSTNAME",
                                          "localhost");
                                          "localhost");
   GNUNET_CONFIGURATION_set_value_string (cfg, "resolver", "HOSTNAME",
                                          "localhost");
-  client = GNUNET_CLIENT_connect (tc->sched, "test", cfg);
-  GNUNET_assert (client != NULL);
-  GNUNET_CLIENT_notify_transmit_ready (client,
-                                       256,
-                                       GNUNET_TIME_relative_multiply
-                                       (GNUNET_TIME_UNIT_MILLISECONDS, 250),
-                                       &notify_ready, NULL);
+  cc = GNUNET_CLIENT_connect ("test-server", cfg);
+  GNUNET_assert (cc != NULL);
+  GNUNET_assert (NULL !=
+                 GNUNET_CLIENT_notify_transmit_ready (cc,
+                                                      sizeof (struct
+                                                              GNUNET_MessageHeader),
+                                                      TIMEOUT, GNUNET_YES,
+                                                      &transmit_initial_message,
+                                                      NULL));
 }
 
 
 }
 
 
@@ -221,9 +159,8 @@ task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 static int
 check ()
 {
 static int
 check ()
 {
-
   ok = 1;
   ok = 1;
-  GNUNET_SCHEDULER_run (&task, NULL);
+  GNUNET_SCHEDULER_run (&task, &ok);
   return ok;
 }
 
   return ok;
 }
 
@@ -233,13 +170,7 @@ main (int argc, char *argv[])
 {
   int ret = 0;
 
 {
   int ret = 0;
 
-  GNUNET_log_setup ("test_server_disconnect",
-#if VERBOSE
-                    "DEBUG",
-#else
-                    "WARNING",
-#endif
-                    NULL);
+  GNUNET_log_setup ("test_server_disconnect", "WARNING", NULL);
   ret += check ();
 
   return ret;
   ret += check ();
 
   return ret;