From 9f649cbc9454317228c4a4d3580de3a8f8f008a8 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 18 Sep 2016 21:28:49 +0000 Subject: [PATCH] adapting test_service to new service API, fixing misc issues found by test --- src/util/service_new.c | 29 ++++- src/util/test_service.c | 271 ++++++++++++++-------------------------- 2 files changed, 120 insertions(+), 180 deletions(-) diff --git a/src/util/service_new.c b/src/util/service_new.c index 30fb88f7d..d6eda3250 100644 --- a/src/util/service_new.c +++ b/src/util/service_new.c @@ -1229,6 +1229,7 @@ setup_service (struct GNUNET_SERVICE_Handle *sh) struct ServiceListenContext *slc; slc = GNUNET_new (struct ServiceListenContext); + slc->sh = sh; slc->listen_socket = *ls; GNUNET_CONTAINER_DLL_insert (sh->slc_head, sh->slc_tail, @@ -1254,6 +1255,7 @@ setup_service (struct GNUNET_SERVICE_Handle *sh) struct ServiceListenContext *slc; slc = GNUNET_new (struct ServiceListenContext); + slc->sh = sh; slc->listen_socket = open_listen_socket (addrs[i], addrlens[i]); GNUNET_break (NULL != slc->listen_socket); @@ -1576,6 +1578,9 @@ GNUNET_SERVICE_ruN_ (int argc, GNUNET_GETOPT_OPTION_END }; + memset (&sh, + 0, + sizeof (sh)); xdg = getenv ("XDG_CONFIG_HOME"); if (NULL != xdg) GNUNET_asprintf (&cfg_filename, @@ -1585,7 +1590,7 @@ GNUNET_SERVICE_ruN_ (int argc, GNUNET_OS_project_data_get ()->config_file); else cfg_filename = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file); - + sh.ready_confirm_fd = -1; sh.options = options; sh.cfg = cfg = GNUNET_CONFIGURATION_create (); sh.service_init_cb = service_init_cb; @@ -1593,8 +1598,13 @@ GNUNET_SERVICE_ruN_ (int argc, sh.disconnect_cb = disconnect_cb; sh.cb_cls = cls; sh.handlers = handlers; + sh.service_name = service_name; /* setup subsystems */ + loglev = NULL; + logfile = NULL; + opt_cfg_filename = NULL; + do_daemonize = 0; ret = GNUNET_GETOPT_run (service_name, service_options, argc, @@ -1683,8 +1693,11 @@ GNUNET_SERVICE_ruN_ (int argc, shutdown: if (-1 != sh.ready_confirm_fd) { - if (1 != WRITE (sh.ready_confirm_fd, err ? "I" : "S", 1)) - LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, "write"); + if (1 != WRITE (sh.ready_confirm_fd, + err ? "I" : "S", + 1)) + LOG_STRERROR (GNUNET_ERROR_TYPE_WARNING, + "write"); GNUNET_break (0 == CLOSE (sh.ready_confirm_fd)); } #if HAVE_MALLINFO @@ -1897,7 +1910,8 @@ service_client_recv (void *cls) GNUNET_YES); if (GNUNET_SYSERR == ret) { - GNUNET_break (0); + /* client closed connection (or IO error) */ + GNUNET_assert (GNUNET_NO == client->needs_continue); GNUNET_SERVICE_client_drop (client); return; } @@ -1907,6 +1921,8 @@ service_client_recv (void *cls) GNUNET_assert (GNUNET_OK == ret); if (GNUNET_YES == client->needs_continue) return; + if (NULL != client->recv_task) + return; /* MST needs more data, re-schedule read job */ client->recv_task = GNUNET_SCHEDULER_add_read_net (GNUNET_TIME_UNIT_FOREVER_REL, @@ -2185,8 +2201,9 @@ GNUNET_SERVICE_client_continue (struct GNUNET_SERVICE_Client *c) GNUNET_SCHEDULER_cancel (c->warn_task); c->warn_task = NULL; } - c->recv_task = GNUNET_SCHEDULER_add_now (&resume_client_receive, - c); + c->recv_task + = GNUNET_SCHEDULER_add_now (&resume_client_receive, + c); } diff --git a/src/util/test_service.c b/src/util/test_service.c index 707f8658b..dc9d16ed9 100644 --- a/src/util/test_service.c +++ b/src/util/test_service.c @@ -25,134 +25,90 @@ #include "platform.h" #include "gnunet_util_lib.h" - -#define PORT 12435 - /** * Message type we use for testing. */ #define MY_TYPE 256 -static struct GNUNET_SERVICE_Context *sctx; - -static int ok = 1; +static int global_ret = 1; static struct GNUNET_MQ_Handle *mq; static void -do_stop (void *cls) -{ - if (NULL != mq) - { - GNUNET_MQ_destroy (mq); - mq = NULL; - } - if (NULL != sctx) - { - GNUNET_SERVICE_stop (sctx); - sctx = NULL; - } - else - { - GNUNET_SCHEDULER_shutdown (); - } -} - - -static void -ready (void *cls, - int result) +handle_recv (void *cls, + const struct GNUNET_MessageHeader *message) { - const struct GNUNET_CONFIGURATION_Handle *cfg = cls; - struct GNUNET_MQ_Envelope *env; - struct GNUNET_MessageHeader *msg; - - GNUNET_assert (GNUNET_YES == result); + struct GNUNET_SERVICE_Client *client = cls; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Service confirmed running\n"); - mq = GNUNET_CLIENT_connecT (cfg, - "test_service", - NULL, - NULL, - NULL); - GNUNET_assert (NULL != mq); - env = GNUNET_MQ_msg (msg, - MY_TYPE); - GNUNET_MQ_send (mq, - env); + "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 *sc, - 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_assert (NULL != message); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving client message...\n"); - GNUNET_SERVER_receive_done (sc, GNUNET_OK); - GNUNET_SCHEDULER_add_now (&do_stop, NULL); - 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_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 ("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", - NULL - }; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting service\n"); - GNUNET_assert (GNUNET_OK == - GNUNET_SERVICE_run (3, argv, "test_service", - GNUNET_SERVICE_OPTION_NONE, &runner, &ok)); - GNUNET_assert (0 == ok); - return ok; -} - - static void -ready6 (void *cls, - int result) +service_init (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_SERVICE_Handle *sh) { - const struct GNUNET_CONFIGURATION_Handle *cfg = cls; + const char *service_name = cls; struct GNUNET_MQ_Envelope *env; struct GNUNET_MessageHeader *msg; - - GNUNET_assert (GNUNET_YES == result); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "V6 ready\n"); + mq = GNUNET_CLIENT_connecT (cfg, - "test_service6", + service_name, NULL, NULL, NULL); @@ -164,87 +120,50 @@ ready6 (void *cls, } -static void -runner6 (void *cls, - 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 ("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", - 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 (3, argv, "test_service6", - GNUNET_SERVICE_OPTION_NONE, &runner6, - &ok)); - GNUNET_assert (0 == ok); - return ok; -} - - -static void -start_stop_main (void *cls, - 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", - cfg, - GNUNET_SERVICE_OPTION_NONE); - GNUNET_assert (NULL != sctx); - runner (cls, 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", NULL }; - const struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_END - }; - int ret = 1; - - GNUNET_assert (GNUNET_OK == - GNUNET_PROGRAM_run (3, 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; @@ -252,18 +171,22 @@ main (int argc, char *argv[]) GNUNET_log_setup ("test-service", "WARNING", 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"); + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "socket"); return 1; } FPRINTF (stderr, @@ -272,10 +195,10 @@ main (int argc, char *argv[]) } else { - GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (s)); - ret += check6 (); + GNUNET_break (GNUNET_OK == + GNUNET_NETWORK_socket_close (s)); + ret += check ("test_service6"); } - ret += check_start_stop (); return ret; } -- 2.25.1