From f195d42a6b8e24b8e2f31709b49e2be72e25983f Mon Sep 17 00:00:00 2001 From: Sree Harsha Totakura Date: Wed, 18 Jul 2012 13:25:11 +0000 Subject: [PATCH] API internal function call changes --- src/testbed/Makefile.am | 8 + src/testbed/gnunet-testbed-helper.c | 2 +- src/testbed/test_testbed_api_2peers.c | 249 ++++++++++++++++++++++++++ src/testbed/testbed_api.c | 56 +++++- src/testbed/testbed_api.h | 23 ++- src/testbed/testbed_api_hosts.c | 39 ---- src/testbed/testbed_api_hosts.h | 13 -- src/testbed/testbed_api_peers.c | 10 +- 8 files changed, 328 insertions(+), 72 deletions(-) create mode 100644 src/testbed/test_testbed_api_2peers.c diff --git a/src/testbed/Makefile.am b/src/testbed/Makefile.am index 707040a75..fd667b8d1 100644 --- a/src/testbed/Makefile.am +++ b/src/testbed/Makefile.am @@ -66,6 +66,7 @@ libgnunettestbed_la_LDFLAGS = \ check_PROGRAMS = \ test_testbed_api_hosts \ + test_testbed_api_2peers \ test_testbed_api \ test_gnunet_testbed_helper @@ -89,6 +90,13 @@ test_testbed_api_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ libgnunettestbed.la +test_testbed_api_2peers_SOURCES = \ + test_testbed_api_2peers.c +test_testbed_api_2peers_LDADD = \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(top_builddir)/src/testing/libgnunettesting.la \ + libgnunettestbed.la + test_gnunet_testbed_helper_SOURCES = \ test_gnunet_testbed_helper.c test_gnunet_testbed_helper_LDADD = \ diff --git a/src/testbed/gnunet-testbed-helper.c b/src/testbed/gnunet-testbed-helper.c index 9327518a6..91219a49c 100644 --- a/src/testbed/gnunet-testbed-helper.c +++ b/src/testbed/gnunet-testbed-helper.c @@ -318,7 +318,7 @@ tokenizer_cb (void *cls, void *client, GNUNET_DISK_pipe_close_end (pipe_in, GNUNET_DISK_PIPE_END_READ); done_reading = GNUNET_YES; config = GNUNET_CONFIGURATION_serialize (cfg, &config_size); - xconfig_size = GNUNET_TESTBED_compress_config (config, config_size, &xconfig); + xconfig_size = GNUNET_TESTBED_compress_config_ (config, config_size, &xconfig); wc = GNUNET_malloc (sizeof (struct WriteContext)); wc->length = xconfig_size + sizeof (struct GNUNET_TESTBED_HelperReply); reply = GNUNET_realloc (xconfig, wc->length); diff --git a/src/testbed/test_testbed_api_2peers.c b/src/testbed/test_testbed_api_2peers.c new file mode 100644 index 000000000..6378fd9cc --- /dev/null +++ b/src/testbed/test_testbed_api_2peers.c @@ -0,0 +1,249 @@ +/* + This file is part of GNUnet + (C) 2008--2012 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 3, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + 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. + */ + +/** + * @file testbed/test_testbed_api.c + * @brief testcases for the testbed api + * @author Sree Harsha Totakura + */ + +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_testing_lib-new.h" +#include "gnunet_testbed_service.h" + + +/** + * Generic logging shortcut + */ +#define LOG(kind,...) \ + GNUNET_log (kind, __VA_ARGS__) + +/** + * Relative time seconds shorthand + */ +#define TIME_REL_SECS(sec) \ + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, sec) + +/** + * Our localhost + */ +static struct GNUNET_TESTBED_Host *host; + +/** + * The controller process + */ +static struct GNUNET_TESTBED_ControllerProc *cp; + +/** + * The controller handle + */ +static struct GNUNET_TESTBED_Controller *controller; + +/** + * A neighbouring host + */ +static struct GNUNET_TESTBED_Host *neighbour; + +/** + * Handle for neighbour registration + */ +static struct GNUNET_TESTBED_HostRegistrationHandle *reg_handle; + +/** + * Handle for a peer + */ +static struct GNUNET_TESTBED_Peer *peer; + +/** + * Handle to configuration + */ +static struct GNUNET_CONFIGURATION_Handle *cfg; + +/** + * Handle to operation + */ +static struct GNUNET_TESTBED_Operation *operation; + +/** + * Abort task identifier + */ +static GNUNET_SCHEDULER_TaskIdentifier abort_task; + +/** + * The testing result + */ +static int result; + + +/** + * Shutdown nicely + * + * @param cls NULL + * @param tc the task context + */ +static void +do_shutdown (void *cls, const const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + if (GNUNET_SCHEDULER_NO_TASK != abort_task) + GNUNET_SCHEDULER_cancel (abort_task); + if (NULL != reg_handle) + GNUNET_TESTBED_cancel_registration (reg_handle); + GNUNET_TESTBED_controller_disconnect (controller); + GNUNET_CONFIGURATION_destroy (cfg); + if (NULL != cp) + GNUNET_TESTBED_controller_stop (cp); + GNUNET_TESTBED_host_destroy (neighbour); + GNUNET_TESTBED_host_destroy (host); +} + + +/** + * abort task to run on test timed out + * + * @param cls NULL + * @param tc the task context + */ +static void +do_abort (void *cls, const const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + LOG (GNUNET_ERROR_TYPE_WARNING, "Test timedout -- Aborting\n"); + abort_task = GNUNET_SCHEDULER_NO_TASK; + do_shutdown (cls, tc); +} + + +/** + * Signature of the event handler function called by the + * respective event controller. + * + * @param cls closure + * @param event information about the event + */ +static void +controller_cb(void *cls, const struct GNUNET_TESTBED_EventInformation *event) +{ + GNUNET_assert (GNUNET_TESTBED_ET_OPERATION_FINISHED == event->type); + GNUNET_assert (event->details.operation_finished.operation == operation); + GNUNET_assert (NULL == event->details.operation_finished.op_cls); + GNUNET_assert (NULL == event->details.operation_finished.emsg); + GNUNET_assert (GNUNET_TESTBED_PIT_GENERIC == + event->details.operation_finished.pit); + GNUNET_assert (NULL == event->details.operation_finished.op_result.generic); + result = GNUNET_YES; + GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); +} + + +/** + * Callback which will be called to after a host registration succeeded or failed + * + * @param cls the host which has been registered + * @param emsg the error message; NULL if host registration is successful + */ +static void +registration_comp (void *cls, const char *emsg) +{ + GNUNET_assert (cls == neighbour); + reg_handle = NULL; + peer = GNUNET_TESTBED_peer_create (controller, host, cfg); + GNUNET_assert (NULL != peer); + operation = GNUNET_TESTBED_peer_destroy (peer); + GNUNET_assert (NULL != operation); +} + + +/** + * Callback to signal successfull startup of the controller process + * + * @param cls the closure from GNUNET_TESTBED_controller_start() + * @param cfg the configuration with which the controller has been started; + * NULL if status is not GNUNET_OK + * @param status GNUNET_OK if the startup is successfull; GNUNET_SYSERR if not, + * GNUNET_TESTBED_controller_stop() shouldn't be called in this case + */ +static void +status_cb (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg, int status) +{ + uint64_t event_mask; + + GNUNET_assert (GNUNET_OK == status); + event_mask = 0; + event_mask |= (1L << GNUNET_TESTBED_ET_PEER_START); + event_mask |= (1L << GNUNET_TESTBED_ET_PEER_STOP); + event_mask |= (1L << GNUNET_TESTBED_ET_CONNECT); + event_mask |= (1L << GNUNET_TESTBED_ET_OPERATION_FINISHED); + controller = GNUNET_TESTBED_controller_connect (cfg, host, event_mask, + &controller_cb, NULL); + GNUNET_assert (NULL != controller); + neighbour = GNUNET_TESTBED_host_create ("localhost", NULL, 0); + GNUNET_assert (NULL != neighbour); + reg_handle = + GNUNET_TESTBED_register_host (controller, neighbour, ®istration_comp, + neighbour); + GNUNET_assert (NULL != reg_handle); +} + + + +/** + * Main run function. + * + * @param cls NULL + * @param args arguments passed to GNUNET_PROGRAM_run + * @param cfgfile the path to configuration file + * @param cfg the configuration file handle + */ +static void +run (void *cls, char *const *args, const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *config) +{ + host = GNUNET_TESTBED_host_create (NULL, NULL, 0); + GNUNET_assert (NULL != host); + cfg = GNUNET_CONFIGURATION_dup (config); + cp = GNUNET_TESTBED_controller_start ("127.0.0.1", host, cfg, status_cb, NULL); + abort_task = GNUNET_SCHEDULER_add_delayed + (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5), &do_abort, NULL); +} + + +/** + * Main function + */ +int main (int argc, char **argv) +{ + int ret; + + char *const argv2[] = { "test_testbed_api", + "-c", "test_testbed_api.conf", + NULL + }; + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + result = GNUNET_SYSERR; + ret = GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2, + "test_testbed_api", "nohelp", options, &run, + NULL); + if ((GNUNET_OK != ret) || (GNUNET_OK != result)) + return 1; + return 0; +} diff --git a/src/testbed/testbed_api.c b/src/testbed/testbed_api.c index 6cdcabdd6..e03c0e87f 100644 --- a/src/testbed/testbed_api.c +++ b/src/testbed/testbed_api.c @@ -393,8 +393,8 @@ transmit_ready_notify (void *cls, size_t size, void *buf) * @param msg the message to queue */ void -GNUNET_TESTBED_queue_message (struct GNUNET_TESTBED_Controller *controller, - struct GNUNET_MessageHeader *msg) +GNUNET_TESTBED_queue_message_ (struct GNUNET_TESTBED_Controller *controller, + struct GNUNET_MessageHeader *msg) { struct MessageQueue *mq_entry; uint16_t type; @@ -732,7 +732,7 @@ GNUNET_TESTBED_controller_connect (const struct GNUNET_CONFIGURATION_Handle *cfg msg->header.size = htons (sizeof (struct GNUNET_TESTBED_InitMessage)); msg->host_id = htonl (GNUNET_TESTBED_host_get_id_ (host)); msg->event_mask = GNUNET_htonll (controller->event_mask); - GNUNET_TESTBED_queue_message (controller, (struct GNUNET_MessageHeader *) msg); + GNUNET_TESTBED_queue_message_ (controller, (struct GNUNET_MessageHeader *) msg); return controller; } @@ -768,7 +768,7 @@ GNUNET_TESTBED_controller_configure_sharing (struct GNUNET_TESTBED_Controller *c msg->host_id = htonl (GNUNET_TESTBED_host_get_id_ (controller->host)); msg->num_peers = htonl (num_peers); memcpy (&msg[1], service_name, service_name_size); - GNUNET_TESTBED_queue_message (controller, (struct GNUNET_MessageHeader *) msg); + GNUNET_TESTBED_queue_message_ (controller, (struct GNUNET_MessageHeader *) msg); } @@ -864,7 +864,7 @@ GNUNET_TESTBED_register_host (struct GNUNET_TESTBED_Controller *controller, if (NULL != username) memcpy (&msg[1], username, user_name_length); strcpy (((void *) &msg[1]) + user_name_length, hostname); - GNUNET_TESTBED_queue_message (controller, (struct GNUNET_MessageHeader *) msg); + GNUNET_TESTBED_queue_message_ (controller, (struct GNUNET_MessageHeader *) msg); return rh; } @@ -932,7 +932,7 @@ GNUNET_TESTBED_controller_link_2 (struct GNUNET_TESTBED_Controller *master, msg->config_size = htons ((uint16_t) scfg_size); msg->is_subordinate = (GNUNET_YES == is_subordinate) ? 1 : 0; memcpy (&msg[1], sxcfg, sxcfg_size); - GNUNET_TESTBED_queue_message (master, (struct GNUNET_MessageHeader *) msg); + GNUNET_TESTBED_queue_message_ (master, (struct GNUNET_MessageHeader *) msg); } @@ -946,8 +946,8 @@ GNUNET_TESTBED_controller_link_2 (struct GNUNET_TESTBED_Controller *master, * @return the size of the xconfig */ size_t -GNUNET_TESTBED_compress_config (const char *config, size_t size, - char **xconfig) +GNUNET_TESTBED_compress_config_ (const char *config, size_t size, + char **xconfig) { size_t xsize; @@ -999,7 +999,7 @@ GNUNET_TESTBED_controller_link (struct GNUNET_TESTBED_Controller *master, GNUNET_assert (GNUNET_YES == GNUNET_TESTBED_is_host_registered_ (slave_host, master)); config = GNUNET_CONFIGURATION_serialize (slave_cfg, &config_size); - cc_size = GNUNET_TESTBED_compress_config (config, config_size, &cconfig); + cc_size = GNUNET_TESTBED_compress_config_ (config, config_size, &cconfig); GNUNET_free (config); GNUNET_assert ((UINT16_MAX - sizeof (struct GNUNET_TESTBED_ControllerLinkMessage)) @@ -1028,5 +1028,43 @@ GNUNET_TESTBED_overlay_write_topology_to_file (struct GNUNET_TESTBED_Controller } +/** + * Creates a helper initialization message. Only for testing. + * + * @param cname the ip address of the controlling host + * @param cfg the configuration that has to used to start the testbed service + * thru helper + * @return the initialization message + */ +struct GNUNET_TESTBED_HelperInit * +GNUNET_TESTBED_create_helper_init_msg_ (const char *cname, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + struct GNUNET_TESTBED_HelperInit *msg; + char *config; + char *xconfig; + size_t config_size; + size_t xconfig_size; + uint16_t cname_len; + uint16_t msg_size; + + config = GNUNET_CONFIGURATION_serialize (cfg, &config_size); + GNUNET_assert (NULL != config); + xconfig_size = + GNUNET_TESTBED_compress_config_ (config, config_size, &xconfig); + GNUNET_free (config); + cname_len = strlen (cname); + msg_size = xconfig_size + cname_len + 1 + + sizeof (struct GNUNET_TESTBED_HelperInit); + msg = GNUNET_realloc (xconfig, msg_size); + (void) memmove ( ((void *) &msg[1]) + cname_len + 1, msg, xconfig_size); + msg->header.size = htons (msg_size); + msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_HELPER_INIT); + msg->cname_size = htons (cname_len); + msg->config_size = htons (config_size); + (void) strcpy ((char *) &msg[1], cname); + return msg; +} + /* end of testbed_api.c */ diff --git a/src/testbed/testbed_api.h b/src/testbed/testbed_api.h index c598d3ec2..2eaf0227b 100644 --- a/src/testbed/testbed_api.h +++ b/src/testbed/testbed_api.h @@ -191,8 +191,8 @@ struct GNUNET_TESTBED_Controller * @param msg the message to queue */ void -GNUNET_TESTBED_queue_message (struct GNUNET_TESTBED_Controller *controller, - struct GNUNET_MessageHeader *msg); +GNUNET_TESTBED_queue_message_ (struct GNUNET_TESTBED_Controller *controller, + struct GNUNET_MessageHeader *msg); /** @@ -205,8 +205,8 @@ GNUNET_TESTBED_queue_message (struct GNUNET_TESTBED_Controller *controller, * @return the size of the xconfig */ size_t -GNUNET_TESTBED_compress_config (const char *config, size_t size, - char **xconfig); +GNUNET_TESTBED_compress_config_ (const char *config, size_t size, + char **xconfig); /** @@ -215,6 +215,19 @@ GNUNET_TESTBED_compress_config (const char *config, size_t size, * @param op the operation to add */ void -GNUNET_TESTBED_operation_add (struct GNUNET_TESTBED_Operation *op); +GNUNET_TESTBED_operation_add_ (struct GNUNET_TESTBED_Operation *op); + + +/** + * Creates a helper initialization message. Only for testing. + * + * @param cname the ip address of the controlling host + * @param cfg the configuration that has to used to start the testbed service + * thru helper + * @return the initialization message + */ +struct GNUNET_TESTBED_HelperInit * +GNUNET_TESTBED_create_helper_init_msg_ (const char *cname, + const struct GNUNET_CONFIGURATION_Handle *cfg); #endif diff --git a/src/testbed/testbed_api_hosts.c b/src/testbed/testbed_api_hosts.c index dd08d3a50..066f0a254 100644 --- a/src/testbed/testbed_api_hosts.c +++ b/src/testbed/testbed_api_hosts.c @@ -390,43 +390,4 @@ GNUNET_TESTBED_is_host_registered_ (const struct GNUNET_TESTBED_Host *host, } -/** - * Creates a helper initialization message. Only for testing. - * - * @param cname the ip address of the controlling host - * @param cfg the configuration that has to used to start the testbed service - * thru helper - * @return the initialization message - */ -struct GNUNET_TESTBED_HelperInit * -GNUNET_TESTBED_create_helper_init_msg_ (const char *cname, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - struct GNUNET_TESTBED_HelperInit *msg; - char *config; - char *xconfig; - size_t config_size; - size_t xconfig_size; - uint16_t cname_len; - uint16_t msg_size; - - config = GNUNET_CONFIGURATION_serialize (cfg, &config_size); - GNUNET_assert (NULL != config); - xconfig_size = - GNUNET_TESTBED_compress_config (config, config_size, &xconfig); - GNUNET_free (config); - cname_len = strlen (cname); - msg_size = xconfig_size + cname_len + 1 + - sizeof (struct GNUNET_TESTBED_HelperInit); - msg = GNUNET_realloc (xconfig, msg_size); - (void) memmove ( ((void *) &msg[1]) + cname_len + 1, msg, xconfig_size); - msg->header.size = htons (msg_size); - msg->header.type = htons (GNUNET_MESSAGE_TYPE_TESTBED_HELPER_INIT); - msg->cname_size = htons (cname_len); - msg->config_size = htons (config_size); - (void) strcpy ((char *) &msg[1], cname); - return msg; -} - - /* end of testbed_api_hosts.c */ diff --git a/src/testbed/testbed_api_hosts.h b/src/testbed/testbed_api_hosts.h index 2c89e29ac..de62b376d 100644 --- a/src/testbed/testbed_api_hosts.h +++ b/src/testbed/testbed_api_hosts.h @@ -164,19 +164,6 @@ GNUNET_TESTBED_is_host_registered_ (const struct GNUNET_TESTBED_Host *host, *controller); -/** - * Creates a helper initialization message. Only for testing. - * - * @param cname the ip address of the controlling host - * @param cfg the configuration that has to used to start the testbed service - * thru helper - * @return the initialization message - */ -struct GNUNET_TESTBED_HelperInit * -GNUNET_TESTBED_create_helper_init_msg_ (const char *cname, - const struct GNUNET_CONFIGURATION_Handle *cfg); - - #endif /* end of testbed_api_hosts.h */ diff --git a/src/testbed/testbed_api_peers.c b/src/testbed/testbed_api_peers.c index 16dc57d23..f2dc4dbe2 100644 --- a/src/testbed/testbed_api_peers.c +++ b/src/testbed/testbed_api_peers.c @@ -93,7 +93,7 @@ GNUNET_TESTBED_peer_create_with_id_ (uint32_t unique_id, peer->host = host; peer->unique_id = unique_id; config = GNUNET_CONFIGURATION_serialize (cfg, &c_size); - xc_size = GNUNET_TESTBED_compress_config (config, c_size, &xconfig); + xc_size = GNUNET_TESTBED_compress_config_ (config, c_size, &xconfig); GNUNET_free (config); msize = xc_size + sizeof (struct GNUNET_TESTBED_PeerCreateMessage); msg = GNUNET_realloc (xconfig, msize); @@ -103,8 +103,8 @@ GNUNET_TESTBED_peer_create_with_id_ (uint32_t unique_id, msg->host_id = htonl (GNUNET_TESTBED_host_get_id_ (peer->host)); msg->peer_id = htonl (peer->unique_id); msg->config_size = htonl (c_size); - GNUNET_TESTBED_queue_message (controller, - (struct GNUNET_MessageHeader *) msg); + GNUNET_TESTBED_queue_message_ (controller, + (struct GNUNET_MessageHeader *) msg); return peer; } @@ -245,8 +245,8 @@ GNUNET_TESTBED_peer_destroy (struct GNUNET_TESTBED_Peer *peer) msg->operation_id = GNUNET_htonll (op->operation_id); GNUNET_CONTAINER_DLL_insert_tail (peer->controller->op_head, peer->controller->op_tail, op); - GNUNET_TESTBED_queue_message (peer->controller, - (struct GNUNET_MessageHeader *) msg); + GNUNET_TESTBED_queue_message_ (peer->controller, + (struct GNUNET_MessageHeader *) msg); return op; } -- 2.25.1