X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Ftest_service.c;h=d2136b42f0a8881a89a175e506e79e26ec6eda7b;hb=bf5f92d9429a556f68c950df7be3dc25907e0d6c;hp=6c78a4eb9c097b7297423e29897dcb76b4758359;hpb=1c07f1fdcb46dece710954411547520128fce94c;p=oweals%2Fgnunet.git diff --git a/src/util/test_service.c b/src/util/test_service.c index 6c78a4eb9..d2136b42f 100644 --- a/src/util/test_service.c +++ b/src/util/test_service.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2009 Christian Grothoff (and other contributing authors) + Copyright (C) 2009, 2013, 2016 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,297 +14,191 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** * @file util/test_service.c * @brief tests for service.c + * @author Christian Grothoff */ #include "platform.h" -#include "gnunet_common.h" -#include "gnunet_client_lib.h" -#include "gnunet_getopt_lib.h" -#include "gnunet_program_lib.h" -#include "gnunet_service_lib.h" -#include "gnunet_scheduler_lib.h" -#include "gnunet_time_lib.h" - - -#define VERBOSE GNUNET_NO - -#define PORT 12435 +#include "gnunet_util_lib.h" +/** + * Message type we use for testing. + */ #define MY_TYPE 256 -static struct GNUNET_SCHEDULER_Handle *sched; +static int global_ret = 1; -static struct GNUNET_SERVICE_Context *sctx; - -static int ok = 1; - - -static size_t -build_msg (void *cls, size_t size, void *buf) -{ - struct GNUNET_CLIENT_Connection *client = cls; - struct GNUNET_MessageHeader *msg = buf; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client connected, transmitting\n"); - GNUNET_assert (size >= sizeof (struct GNUNET_MessageHeader)); - msg->type = htons (MY_TYPE); - msg->size = htons (sizeof (struct GNUNET_MessageHeader)); - GNUNET_CLIENT_disconnect (client, GNUNET_NO); - return sizeof (struct GNUNET_MessageHeader); -} +static struct GNUNET_MQ_Handle *mq; static void -ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +handle_recv (void *cls, + const struct GNUNET_MessageHeader *message) { - const struct GNUNET_CONFIGURATION_Handle *cfg = cls; - struct GNUNET_CLIENT_Connection *client; - - GNUNET_assert (0 != (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Service confirmed running\n"); - sched = tc->sched; - client = GNUNET_CLIENT_connect (tc->sched, "test_service", cfg); - GNUNET_assert (client != NULL); + struct GNUNET_SERVICE_Client *client = cls; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Client connecting, waiting to transmit\n"); - GNUNET_CLIENT_notify_transmit_ready (client, - sizeof (struct GNUNET_MessageHeader), - GNUNET_TIME_UNIT_SECONDS, - GNUNET_NO, &build_msg, client); -} - -static void -do_stop (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - GNUNET_SERVICE_stop (sctx); + "Received client message...\n"); + GNUNET_SERVICE_client_continue (client); + global_ret = 2; + GNUNET_MQ_destroy (mq); + mq = NULL; } -static void -recv_cb (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +/** + * Function called when the client connects to the service. + * + * @param cls the name of the service + * @param c connecting client + * @param mq message queue to talk to the client + * @return @a c so we have the client handle in the future + */ +static void * +connect_cb (void *cls, + struct GNUNET_SERVICE_Client *c, + struct GNUNET_MQ_Handle *mq) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving client message...\n"); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - if (sctx != NULL) - GNUNET_SCHEDULER_add_now (sched, &do_stop, NULL); - else - GNUNET_SCHEDULER_shutdown (sched); - ok = 0; + /* FIXME: in the future, do something with mq + to test sending messages to the client! */ + return c; } -static struct GNUNET_SERVER_MessageHandler myhandlers[] = { - {&recv_cb, NULL, MY_TYPE, sizeof (struct GNUNET_MessageHeader)}, - {NULL, NULL, 0, 0} -}; - - - +/** + * Function called when the client disconnects. + * + * @param cls our service name + * @param c disconnecting client + * @param internal_cls must match @a c + */ static void -runner (void *cls, - struct GNUNET_SCHEDULER_Handle *sched, - struct GNUNET_SERVER_Handle *server, - const struct GNUNET_CONFIGURATION_Handle *cfg) +disconnect_cb (void *cls, + struct GNUNET_SERVICE_Client *c, + void *internal_cls) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Service initializing\n"); - GNUNET_SERVER_add_handlers (server, myhandlers); - GNUNET_CLIENT_service_test (sched, - "test_service", - cfg, GNUNET_TIME_UNIT_SECONDS, &ready, - (void *) cfg); + GNUNET_assert (c == internal_cls); + if (2 == global_ret) + { + GNUNET_SCHEDULER_shutdown (); + global_ret = 0; + } } /** - * Main method, starts scheduler with task1, - * checks that "ok" is correct at the end. + * Initialization function of the service. Starts + * a client to connect to the service. + * + * @param cls the name of the service (const char *) + * @param cfg the configuration we use + * @param sh handle to the service */ -static int -check () -{ - ok = 1; - char *const argv[] = { - "test_service", - "-c", - "test_service_data.conf", - "-L", -#if VERBOSE - "DEBUG", -#else - "WARNING", -#endif - NULL - }; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting service\n"); - GNUNET_assert (GNUNET_OK == - GNUNET_SERVICE_run (5, - argv, - "test_service", - GNUNET_SERVICE_OPTION_NONE, - &runner, &ok)); - GNUNET_assert (0 == ok); - return ok; -} - static void -ready6 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +service_init (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_SERVICE_Handle *sh) { - const struct GNUNET_CONFIGURATION_Handle *cfg = cls; - struct GNUNET_CLIENT_Connection *client; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "V6 ready\n"); - sched = tc->sched; - GNUNET_assert (0 != (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)); - client = GNUNET_CLIENT_connect (tc->sched, "test_service6", cfg); - GNUNET_assert (client != NULL); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "V6 client connected\n"); - GNUNET_CLIENT_notify_transmit_ready (client, - sizeof (struct GNUNET_MessageHeader), - GNUNET_TIME_UNIT_SECONDS, - GNUNET_NO, &build_msg, client); + const char *service_name = cls; + struct GNUNET_MQ_Envelope *env; + struct GNUNET_MessageHeader *msg; + + mq = GNUNET_CLIENT_connect (cfg, + service_name, + NULL, + NULL, + NULL); + GNUNET_assert (NULL != mq); + env = GNUNET_MQ_msg (msg, + MY_TYPE); + GNUNET_MQ_send (mq, + env); } -static void -runner6 (void *cls, - struct GNUNET_SCHEDULER_Handle *sched, - struct GNUNET_SERVER_Handle *server, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initializing v6 service\n"); - GNUNET_SERVER_add_handlers (server, myhandlers); - GNUNET_CLIENT_service_test (sched, - "test_service6", - cfg, GNUNET_TIME_UNIT_SECONDS, &ready6, - (void *) cfg); -} /** - * Main method, starts scheduler with task1, - * checks that "ok" is correct at the end. + * Main method, starts the service and initiates + * the running of the test. + * + * @param sname name of the service to run */ static int -check6 () +check (const char *sname) { - char *const argv[] = { - "test_service6", - "-c", - "test_service_data.conf", - "-L", -#if VERBOSE - "DEBUG", -#else - "WARNING", -#endif - NULL + struct GNUNET_MQ_MessageHandler myhandlers[] = { + GNUNET_MQ_hd_fixed_size (recv, + MY_TYPE, + struct GNUNET_MessageHeader, + NULL), + GNUNET_MQ_handler_end () }; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting v6 service\n"); - GNUNET_assert (GNUNET_OK == - GNUNET_SERVICE_run (5, - argv, - "test_service6", - GNUNET_SERVICE_OPTION_NONE, - &runner6, &ok)); - GNUNET_assert (0 == ok); - return ok; -} - - - -static void -start_stop_main (void *cls, - struct GNUNET_SCHEDULER_Handle *sched, - char *const *args, - const char *cfgfile, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - int *ret = cls; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting service using start method\n"); - sctx = GNUNET_SERVICE_start ("test_service", sched, cfg); - GNUNET_assert (NULL != sctx); - runner (cls, sched, GNUNET_SERVICE_get_server (sctx), cfg); - *ret = 0; -} - - -static int -check_start_stop () -{ char *const argv[] = { - "test-service-program", + (char *) sname, "-c", "test_service_data.conf", - "-L", -#if VERBOSE - "DEBUG", -#else - "WARNING", -#endif NULL }; - const struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_END - }; - int ret = 1; - GNUNET_assert (GNUNET_OK == - GNUNET_PROGRAM_run (5, - argv, - "test-service-program", - "no help", - options, &start_stop_main, &ret)); - - GNUNET_break (0 == ret); - return ret; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Starting `%s' service\n", + sname); + global_ret = 1; + GNUNET_assert (0 == + GNUNET_SERVICE_ruN_ (3, + argv, + sname, + GNUNET_SERVICE_OPTION_NONE, + &service_init, + &connect_cb, + &disconnect_cb, + (void *) sname, + myhandlers)); + return global_ret; } int -main (int argc, char *argv[]) +main (int argc, + char *argv[]) { int ret = 0; struct GNUNET_NETWORK_Handle *s = NULL; GNUNET_log_setup ("test-service", -#if VERBOSE - "DEBUG", -#else "WARNING", -#endif NULL); - ret += check (); - ret += check (); - - // FIXME + ret += check ("test_service"); + ret += check ("test_service"); #ifndef MINGW - s = GNUNET_NETWORK_socket_create (PF_INET6, SOCK_STREAM, 0); + s = GNUNET_NETWORK_socket_create (PF_INET6, + SOCK_STREAM, + 0); #endif if (NULL == s) + { + if ( (errno == ENOBUFS) || + (errno == ENOMEM) || + (errno == ENFILE) || + (errno == EACCES) ) { - if ((errno == ENOBUFS) || - (errno == ENOMEM) || (errno == ENFILE) || (errno == EACCES)) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "socket"); - return 1; - } - fprintf (stderr, - "IPv6 support seems to not be available (%s), not testing it!\n", - strerror (errno)); + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "socket"); + return 1; } + FPRINTF (stderr, + "IPv6 support seems to not be available (%s), not testing it!\n", + strerror (errno)); + } else - { - GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (s)); - ret += check6 (); - } - ret += check_start_stop (); - + { + GNUNET_break (GNUNET_OK == + GNUNET_NETWORK_socket_close (s)); + ret += check ("test_service6"); + } return ret; }