X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Ftest_server_disconnect.c;h=b54df48893616e365310f23525c825fc559a63f6;hb=72c8645af31896829b674b575c5375706f362a30;hp=6c83961e099459d6b7d91971a9f0c21518b8a965;hpb=7cefd6d64dfd666654141492495326d11265044b;p=oweals%2Fgnunet.git diff --git a/src/util/test_server_disconnect.c b/src/util/test_server_disconnect.c index 6c83961e0..b54df4889 100644 --- a/src/util/test_server_disconnect.c +++ b/src/util/test_server_disconnect.c @@ -1,10 +1,10 @@ /* 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 - 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 @@ -19,151 +19,76 @@ */ /** * @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 "gnunet_scheduler_lib.h" #include "gnunet_client_lib.h" +#include "gnunet_scheduler_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_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 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 -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); - ok++; - GNUNET_SERVER_client_disconnect (argclient); + ok = 0; + GNUNET_SERVER_destroy (server); + GNUNET_CLIENT_disconnect (cc); + GNUNET_CONFIGURATION_destroy (cfg); } 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 -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,42 +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; + 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); - 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); - handlers[0].callback_cls = cls; GNUNET_SERVER_add_handlers (server, handlers); - GNUNET_SERVER_disconnect_notify (server, ¬ify_disconnect, cls); + GNUNET_SERVER_disconnect_notify (server, ¬ify_disconnect, NULL); 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"); - 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), - ¬ify_ready, NULL); + GNUNET_CONFIGURATION_set_value_string (cfg, "resolver", "HOSTNAME", + "localhost"); + 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)); } @@ -219,9 +159,8 @@ task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) static int check () { - ok = 1; - GNUNET_SCHEDULER_run (&task, NULL); + GNUNET_SCHEDULER_run (&task, &ok); return ok; } @@ -231,13 +170,7 @@ main (int argc, char *argv[]) { 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;