From ad3870165e0c80ac5ec04d5ac78251eeba13e403 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 2 Jul 2012 14:56:30 +0000 Subject: porting transport testing to new testing lib (mantis 2453) --- src/transport/Makefile.am | 10 + src/transport/test_transport_testing.c | 28 +-- src/transport/test_transport_testing_restart.c | 152 ++++++++++++ src/transport/test_transport_testing_startstop.c | 106 ++------ src/transport/transport-testing.c | 294 ++++++++--------------- src/transport/transport-testing.h | 34 ++- 6 files changed, 310 insertions(+), 314 deletions(-) create mode 100644 src/transport/test_transport_testing_restart.c (limited to 'src/transport') diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am index 0090d3aca..0cf817db9 100644 --- a/src/transport/Makefile.am +++ b/src/transport/Makefile.am @@ -253,6 +253,7 @@ libgnunet_plugin_transport_https_la_CPPFLAGS = \ check_PROGRAMS = \ test_transport_testing_startstop \ + test_transport_testing_restart \ test_transport_testing \ test_transport_startonly \ test_transport_api_blacklisting \ @@ -298,6 +299,7 @@ check_PROGRAMS = \ if ENABLE_TEST_RUN TESTS = \ test_transport_testing_startstop \ + test_transport_testing_restart \ test_transport_testing \ test_transport_startonly \ test_transport_api_blacklisting \ @@ -349,6 +351,14 @@ test_transport_testing_startstop_LDADD = \ $(top_builddir)/src/hello/libgnunethello.la \ $(top_builddir)/src/transport/libgnunettransporttesting.la +test_transport_testing_restart_SOURCES = \ + test_transport_testing_restart.c +test_transport_testing_restart_LDADD = \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(top_builddir)/src/transport/libgnunettransport.la \ + $(top_builddir)/src/hello/libgnunethello.la \ + $(top_builddir)/src/transport/libgnunettransporttesting.la + test_transport_testing_SOURCES = \ test_transport_testing.c test_transport_testing_LDADD = \ diff --git a/src/transport/test_transport_testing.c b/src/transport/test_transport_testing.c index 842d68651..7b04d9370 100644 --- a/src/transport/test_transport_testing.c +++ b/src/transport/test_transport_testing.c @@ -29,20 +29,9 @@ #include "platform.h" #include "gnunet_common.h" #include "gnunet_hello_lib.h" -#include "gnunet_getopt_lib.h" -#include "gnunet_os_lib.h" -#include "gnunet_program_lib.h" #include "gnunet_scheduler_lib.h" #include "gnunet_transport_service.h" -#include "transport.h" #include "transport-testing.h" - -#define VERBOSE GNUNET_NO - -#define VERBOSE_ARM GNUNET_NO - -#define START_ARM GNUNET_YES - /** * How long until we give up on transmitting the message? */ @@ -81,6 +70,12 @@ end_badly () timeout_task = GNUNET_SCHEDULER_NO_TASK; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Fail! Stopping peers\n"); + if (NULL != cc) + { + GNUNET_TRANSPORT_TESTING_connect_peers_cancel (tth, cc); + cc = NULL; + } + if (p1 != NULL) GNUNET_TRANSPORT_TESTING_stop_peer (tth, p1); if (p2 != NULL) @@ -167,15 +162,11 @@ run (void *cls, char *const *args, const char *cfgfile, 1, ¬ify_receive, ¬ify_connect, ¬ify_disconnect, &start_cb, p1); - GNUNET_assert (p1->hostkeyfile != NULL); - p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth, "test_transport_api_tcp_peer2.conf", 2, ¬ify_receive, ¬ify_connect, ¬ify_disconnect, &start_cb, p2); - GNUNET_assert (p2->hostkeyfile != NULL); - if (p1 == NULL) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -198,19 +189,12 @@ int main (int argc, char *argv[]) { GNUNET_log_setup ("test_transport_testing", -#if VERBOSE - "DEBUG", -#else "WARNING", -#endif NULL); char *const argv_1[] = { "test_transport_testing", "-c", "test_transport_api_data.conf", -#if VERBOSE - "-L", "DEBUG", -#endif NULL }; diff --git a/src/transport/test_transport_testing_restart.c b/src/transport/test_transport_testing_restart.c new file mode 100644 index 000000000..ed7b2f5c1 --- /dev/null +++ b/src/transport/test_transport_testing_restart.c @@ -0,0 +1,152 @@ +/* + This file is part of GNUnet. + (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 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 transport/test_transport_testing_restart.c + * @brief test case for transport testing library: + * start the peer, get the HELLO message, restart and stop the peer + * + */ +#include "platform.h" +#include "gnunet_common.h" +#include "gnunet_transport_service.h" +#include "transport-testing.h" + +/** + * How long until we give up on transmitting the message? + */ +#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) + +GNUNET_SCHEDULER_TaskIdentifier timeout_task; + +static struct PeerContext *p; + +struct GNUNET_TRANSPORT_TESTING_handle *tth; + +static int ret = 0; + +static void +end () +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping peers\n"); + + if (timeout_task != GNUNET_SCHEDULER_NO_TASK) + GNUNET_SCHEDULER_cancel (timeout_task); + + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + GNUNET_TRANSPORT_TESTING_done (tth); +} + +static void +end_badly () +{ + timeout_task = GNUNET_SCHEDULER_NO_TASK; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Fail! Stopping peers\n"); + + if (NULL != p) + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + + if (NULL != tth) + GNUNET_TRANSPORT_TESTING_done (tth); + + ret = GNUNET_SYSERR; +} + +static void +restart_cb (struct PeerContext *p, void *cls) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') successfully restarted\n", + p->no, + GNUNET_i2s (&p->id)); + + ret = 0; + GNUNET_SCHEDULER_add_now (&end, NULL); +} + + +static void +restart_task () +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') restarting, \n", + p->no, + GNUNET_i2s (&p->id)); + GNUNET_TRANSPORT_TESTING_restart_peer (tth, p, NULL, restart_cb, p); +} + +static void +start_cb (struct PeerContext *p, void *cls) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') successfully started\n", + p->no, + GNUNET_i2s (&p->id)); + + GNUNET_SCHEDULER_add_now (&restart_task, NULL); +} + + +static void +run (void *cls, char *const *args, const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + ret = 1; + tth = GNUNET_TRANSPORT_TESTING_init (); + GNUNET_assert (NULL != tth); + + timeout_task = + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &end_badly, NULL); + + p = GNUNET_TRANSPORT_TESTING_start_peer(tth, cfgfile, 1, + NULL, /* receive cb */ + NULL, /* connect cb */ + NULL, /* disconnect cb */ + start_cb, /* startup cb */ + NULL); /* closure */ + if (NULL == p) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Failed to start peer\n"); + if (timeout_task != GNUNET_SCHEDULER_NO_TASK) + GNUNET_SCHEDULER_cancel (timeout_task); + timeout_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); + } +} + +int +main (int argc, char *argv[]) +{ + GNUNET_log_setup ("test_transport_testing_restart", + "WARNING", + NULL); + + char *const argv_1[] = { "test_transport_testing_restart", + "-c", + "test_transport_api_data.conf", + NULL + }; + + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + + GNUNET_PROGRAM_run ((sizeof (argv_1) / sizeof (char *)) - 1, argv_1, + "test_transport_testing_restart", "nohelp", options, &run, &ret); + + return ret; +} + +/* end of test_transport_testing_restart.c */ diff --git a/src/transport/test_transport_testing_startstop.c b/src/transport/test_transport_testing_startstop.c index 2d035ca70..e1c370627 100644 --- a/src/transport/test_transport_testing_startstop.c +++ b/src/transport/test_transport_testing_startstop.c @@ -25,21 +25,9 @@ */ #include "platform.h" #include "gnunet_common.h" -#include "gnunet_hello_lib.h" -#include "gnunet_getopt_lib.h" -#include "gnunet_os_lib.h" -#include "gnunet_program_lib.h" -#include "gnunet_scheduler_lib.h" #include "gnunet_transport_service.h" -#include "transport.h" #include "transport-testing.h" -#define VERBOSE GNUNET_NO - -#define VERBOSE_ARM GNUNET_NO - -#define START_ARM GNUNET_YES - /** * How long until we give up on transmitting the message? */ @@ -49,8 +37,6 @@ GNUNET_SCHEDULER_TaskIdentifier timeout_task; static struct PeerContext *p; -//static GNUNET_TRANSPORT_TESTING_ConnectRequest cc; - struct GNUNET_TRANSPORT_TESTING_handle *tth; static int ret = 0; @@ -63,8 +49,7 @@ end () if (timeout_task != GNUNET_SCHEDULER_NO_TASK) GNUNET_SCHEDULER_cancel (timeout_task); - if (NULL != p) - GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); GNUNET_TRANSPORT_TESTING_done (tth); } @@ -74,109 +59,64 @@ end_badly () timeout_task = GNUNET_SCHEDULER_NO_TASK; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Fail! Stopping peers\n"); - if (p != NULL) + if (NULL != p) GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); - GNUNET_TRANSPORT_TESTING_done (tth); + if (NULL != tth) + GNUNET_TRANSPORT_TESTING_done (tth); ret = GNUNET_SYSERR; } -#if 0 -static void -testing_connect_cb (struct PeerContext *p1, struct PeerContext *p2, void *cls) -{ - char *ps = GNUNET_strdup (GNUNET_i2s (&p1->id)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Peer %u (`%4s') connected to peer %u (`%s')!\n", p1->no, ps, - p2->no, GNUNET_i2s (&p2->id)); - GNUNET_free (ps); - GNUNET_SCHEDULER_add_now (&end, NULL); -} - - -static void -notify_connect (void *cls, const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_ATS_Information *ats, uint32_t ats_count) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer `%s' connected \n", - GNUNET_i2s (peer)); - connected++; -} static void -notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer `%s' disconnected \n", - GNUNET_i2s (peer)); -} - -static void -notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_MessageHeader *message, - const struct GNUNET_ATS_Information *ats, uint32_t ats_count) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving\n"); -} - - - -void start_cb (struct PeerContext *p, void *cls) { - static int started; - - started++; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') started\n", p->no, + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') successfully started\n", + p->no, GNUNET_i2s (&p->id)); - if (started != 2) - return; - - char *sender_c = GNUNET_strdup (GNUNET_i2s (&p->id)); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Test tries to connect peer %u (`%s') -> peer %u (`%s')\n", - p->no, sender_c, p2->no, GNUNET_i2s (&p2->id)); - GNUNET_free (sender_c); - - cc = GNUNET_TRANSPORT_TESTING_connect_peers (tth, p, p2, &testing_connect_cb, - NULL); + ret = 0; + GNUNET_SCHEDULER_add_now (&end, NULL); } -#endif + static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { + ret = 1; tth = GNUNET_TRANSPORT_TESTING_init (); GNUNET_assert (NULL != tth); timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &end_badly, NULL); - GNUNET_SCHEDULER_add_now (&end, NULL); + p = GNUNET_TRANSPORT_TESTING_start_peer(tth, cfgfile, 1, + NULL, /* receive cb */ + NULL, /* connect cb */ + NULL, /* disconnect cb */ + start_cb, /* startup cb */ + NULL); /* closure */ + if (NULL == p) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Failed to start peer\n"); + if (timeout_task != GNUNET_SCHEDULER_NO_TASK) + GNUNET_SCHEDULER_cancel (timeout_task); + timeout_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); + } } int main (int argc, char *argv[]) { GNUNET_log_setup ("test_transport_testing_startstop", -#if VERBOSE - "DEBUG", -#else "WARNING", -#endif NULL); char *const argv_1[] = { "test_transport_testing", "-c", "test_transport_api_data.conf", -#if VERBOSE - "-L", "DEBUG", -#endif NULL }; diff --git a/src/transport/transport-testing.c b/src/transport/transport-testing.c index b3c3a9399..87ce70423 100644 --- a/src/transport/transport-testing.c +++ b/src/transport/transport-testing.c @@ -27,31 +27,6 @@ #include "transport-testing.h" -#define HOSTKEYFILESIZE 914 - -static const char * -get_host_key (struct GNUNET_TRANSPORT_TESTING_handle *tth) -{ - if (tth->hostkey_data == NULL) - { - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "No precomputed hostkeys available\n"); - return NULL; - } - if (tth->hostkeys_total > tth->hostkeys_last) - { - tth->hostkeys_last++; - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "Used hostkey %u of %u available hostkeys\n", - tth->hostkeys_last, tth->hostkeys_total); - return &tth->hostkey_data[(tth->hostkeys_last - 1) * HOSTKEYFILESIZE]; - } - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "No hostkey available (%u of %u already used)\n", - tth->hostkeys_last, tth->hostkeys_total); - return NULL; -} - static struct PeerContext * find_peer_context (struct GNUNET_TRANSPORT_TESTING_handle *tth, @@ -190,20 +165,21 @@ static void get_hello (void *cb_cls, const struct GNUNET_MessageHeader *message) { struct PeerContext *p = cb_cls; + struct GNUNET_PeerIdentity hello_id; GNUNET_assert (message != NULL); GNUNET_assert (GNUNET_OK == GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) - message, &p->id)); + message, &hello_id)); + GNUNET_assert (0 == memcmp (&hello_id, &p->id, sizeof (hello_id))); GNUNET_free_non_null (p->hello); p->hello = (struct GNUNET_HELLO_Message *) GNUNET_copy_message (message); - if (p->start_cb != NULL) + if (NULL != p->start_cb) { GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", "Peer %u (`%s') successfully started\n", p->no, GNUNET_i2s (&p->id)); - p->start_cb (p, p->cb_cls); p->start_cb = NULL; } @@ -247,7 +223,7 @@ try_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * Start a peer with the given configuration * @param tth the testing handle * @param cfgname configuration file - * @param peer_id the peer_id + * @param peer_id a unique number to identify the peer * @param rec receive callback * @param nc connect callback * @param nd disconnect callback @@ -256,18 +232,20 @@ try_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * @return the peer context */ struct PeerContext * -GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle - *tth, const char *cfgname, int peer_id, +GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth, + const char *cfgname, int peer_id, GNUNET_TRANSPORT_ReceiveCallback rec, GNUNET_TRANSPORT_NotifyConnect nc, GNUNET_TRANSPORT_NotifyDisconnect nd, GNUNET_TRANSPORT_TESTING_start_cb start_cb, void *cb_cls) { - const char *hostkey = NULL; - struct GNUNET_DISK_FileHandle *fn; + char *emsg = NULL; + struct GNUNET_PeerIdentity *dummy; + + GNUNET_assert (NULL != tth); + GNUNET_assert (NULL != tth->tl_system); - GNUNET_assert (tth != NULL); if (GNUNET_DISK_file_test (cfgname) == GNUNET_NO) { GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", @@ -276,47 +254,60 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle } struct PeerContext *p = GNUNET_malloc (sizeof (struct PeerContext)); + GNUNET_CONTAINER_DLL_insert (tth->p_head, tth->p_tail, p); + /* Create configuration and call testing lib to modify it */ p->cfg = GNUNET_CONFIGURATION_create (); GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); - if (GNUNET_CONFIGURATION_have_value (p->cfg, "PATHS", "SERVICEHOME")) - GNUNET_assert (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_string (p->cfg, "PATHS", - "SERVICEHOME", - &p->servicehome)); + if (GNUNET_SYSERR == GNUNET_TESTING_configuration_create (tth->tl_system, p->cfg)) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", + "Testing library failed to create unique configuration based on `%s'\n", + cfgname); + GNUNET_free (p); + return NULL; + } - if (NULL != p->servicehome) - GNUNET_DISK_directory_remove (p->servicehome); + p->no = peer_id; + /* Configure peer with configuration */ + p->peer = GNUNET_TESTING_peer_configure (tth->tl_system, p->cfg, p->no, NULL, &emsg); + if (NULL == p->peer) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", + "Testing library failed to create unique configuration based on `%s': `%s'\n", + cfgname, emsg); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + return NULL; + } - hostkey = get_host_key (tth); - if (hostkey != NULL) + if (GNUNET_OK != GNUNET_TESTING_peer_start (p->peer)) { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", + "Testing library failed to create unique configuration based on `%s'\n", + cfgname); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + return NULL; + } - GNUNET_asprintf (&p->hostkeyfile, "%s/.hostkey", p->servicehome); - GNUNET_assert (GNUNET_OK == - GNUNET_DISK_directory_create_for_file (p->hostkeyfile)); - fn = GNUNET_DISK_file_open (p->hostkeyfile, - GNUNET_DISK_OPEN_READWRITE | - GNUNET_DISK_OPEN_CREATE, - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE); - GNUNET_assert (fn != NULL); - GNUNET_assert (HOSTKEYFILESIZE == - GNUNET_DISK_file_write (fn, hostkey, HOSTKEYFILESIZE)); - GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fn)); + memset(&dummy, '\0', sizeof (dummy)); + GNUNET_TESTING_peer_get_identity (p->peer, &p->id); + if (0 == memcmp (&dummy, &p->id, sizeof (dummy))) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", + "Testing library failed to obtain peer identity for peer %u\n", + p->no); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + return NULL; + } + else + { GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "Wrote hostkey to file: `%s' \n", p->hostkeyfile); + "Peer %u configured with identity `%s'\n", + p->no, + GNUNET_i2s (&p->id)); } - p->arm_proc = - GNUNET_OS_start_process (GNUNET_YES, - NULL, NULL, "gnunet-service-arm", - "gnunet-service-arm", "-c", cfgname, - "-L", "ERROR", - NULL); - - p->no = peer_id; p->tth = tth; p->nc = nc; p->nd = nd; @@ -327,15 +318,21 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle else p->cb_cls = p; - p->th = - GNUNET_TRANSPORT_connect (p->cfg, NULL, p, ¬ify_receive, - ¬ify_connect, ¬ify_disconnect); - GNUNET_assert (p->th != NULL); + p->th = GNUNET_TRANSPORT_connect (p->cfg, NULL, p, + ¬ify_receive, + ¬ify_connect, ¬ify_disconnect); + if (NULL == p->th) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", + "Failed to connect to transport service for peer `%s': `%s'\n", + cfgname, emsg); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); + return NULL; + } p->ghh = GNUNET_TRANSPORT_get_hello (p->th, &get_hello, p); GNUNET_assert (p->ghh != NULL); - GNUNET_CONTAINER_DLL_insert (tth->p_head, tth->p_tail, p); return p; } @@ -355,93 +352,55 @@ GNUNET_TRANSPORT_TESTING_restart_peer (struct GNUNET_TRANSPORT_TESTING_handle GNUNET_TRANSPORT_TESTING_start_cb restart_cb, void *cb_cls) { - struct GNUNET_DISK_FileHandle *fn; - GNUNET_assert (tth != NULL); GNUNET_assert (p != NULL); - GNUNET_assert (p->hostkeyfile != NULL); - GNUNET_assert (p->servicehome != NULL); + GNUNET_assert (NULL != p->peer); + + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", + "Restarting peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id)); /* shutdown */ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", "Stopping peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id)); - if (p->ghh != NULL) + if (NULL != p->ghh) GNUNET_TRANSPORT_get_hello_cancel (p->ghh); p->ghh = NULL; - if (p->th != NULL) + if (NULL != p->th) GNUNET_TRANSPORT_disconnect (p->th); - if (NULL != p->arm_proc) + if (GNUNET_SYSERR == GNUNET_TESTING_peer_stop(p->peer)) { - if (0 != GNUNET_OS_process_kill (p->arm_proc, SIGTERM)) - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); - GNUNET_OS_process_wait (p->arm_proc); - GNUNET_OS_process_destroy (p->arm_proc); - p->arm_proc = NULL; + GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", + "Failed to stop peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id)); + return GNUNET_SYSERR; } - if (p->hello != NULL) - GNUNET_free (p->hello); - p->hello = NULL; - - if (p->cfg != NULL) - GNUNET_CONFIGURATION_destroy (p->cfg); - p->cfg = NULL; - - /* start */ - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "Restarting peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id)); - sleep (5); // YUCK! + sleep (5); - if (GNUNET_DISK_file_test (cfgname) == GNUNET_NO) + /* restart */ + if (GNUNET_SYSERR == GNUNET_TESTING_peer_start(p->peer)) { GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", - "File not found: `%s' \n", cfgname); - goto fail; + "Failed to restart peer %u (`%s')\n", + p->no, GNUNET_i2s (&p->id)); + return GNUNET_SYSERR; } - p->cfg = GNUNET_CONFIGURATION_create (); - GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); - - if (!GNUNET_CONFIGURATION_have_value (p->cfg, "PATHS", "SERVICEHOME")) - goto fail; - - fn = GNUNET_DISK_file_open (p->hostkeyfile, - GNUNET_DISK_OPEN_READWRITE | - GNUNET_DISK_OPEN_CREATE, - GNUNET_DISK_PERM_USER_READ | - GNUNET_DISK_PERM_USER_WRITE); - if (fn == NULL) - goto fail; - if (GNUNET_OK != GNUNET_DISK_file_close (fn)) - goto fail; - - p->arm_proc = - GNUNET_OS_start_process (GNUNET_YES, - NULL, NULL, "gnunet-service-arm", - "gnunet-service-arm", "-c", cfgname, - "-L", "ERROR", - NULL); - - p->th = - GNUNET_TRANSPORT_connect (p->cfg, NULL, p, ¬ify_receive, - ¬ify_connect, ¬ify_disconnect); GNUNET_assert (p->th != NULL); - + GNUNET_assert (p->start_cb == NULL); p->start_cb = restart_cb; p->cb_cls = cb_cls; + p->th = GNUNET_TRANSPORT_connect (p->cfg, NULL, p, + ¬ify_receive, + ¬ify_connect, + ¬ify_disconnect); + GNUNET_assert (NULL != p->th); + p->ghh = GNUNET_TRANSPORT_get_hello (p->th, &get_hello, p); GNUNET_assert (p->ghh != NULL); return GNUNET_OK; - -fail: - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "Restarting peer %u (`%s') failed, removing peer\n", p->no, - GNUNET_i2s (&p->id)); - GNUNET_TRANSPORT_TESTING_stop_peer (tth, p); - return GNUNET_SYSERR; } @@ -461,25 +420,23 @@ GNUNET_TRANSPORT_TESTING_stop_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth, p->ghh = NULL; } if (p->th != NULL) - GNUNET_TRANSPORT_disconnect (p->th); - if (NULL != p->arm_proc) - { - if (0 != GNUNET_OS_process_kill (p->arm_proc, SIGTERM)) - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); - GNUNET_OS_process_wait (p->arm_proc); - GNUNET_OS_process_destroy (p->arm_proc); - p->arm_proc = NULL; - } - if (p->hostkeyfile != NULL) { - GNUNET_DISK_directory_remove (p->hostkeyfile); - GNUNET_free (p->hostkeyfile); + GNUNET_TRANSPORT_disconnect (p->th); + p->th = NULL; } - if (p->servicehome != NULL) + + if (p->peer != NULL) { - GNUNET_DISK_directory_remove (p->servicehome); - GNUNET_free (p->servicehome); + if (GNUNET_OK != GNUNET_TESTING_peer_stop (p->peer)) + { + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", + "Testing lib failed to stop peer %u (`%s') \n", p->no, + GNUNET_i2s (&p->id)); + } + GNUNET_TESTING_peer_destroy (p->peer); + p->peer = NULL; } + if (p->hello != NULL) { GNUNET_free (p->hello); @@ -606,8 +563,6 @@ GNUNET_TRANSPORT_TESTING_done (struct GNUNET_TRANSPORT_TESTING_handle *tth) p = t; } - GNUNET_free_non_null (tth->hostkey_data); - GNUNET_TESTING_system_destroy (tth->tl_system, GNUNET_YES); GNUNET_free (tth); @@ -623,16 +578,12 @@ struct GNUNET_TRANSPORT_TESTING_handle * GNUNET_TRANSPORT_TESTING_init () { struct GNUNET_TRANSPORT_TESTING_handle *tth; - struct GNUNET_DISK_FileHandle *fd; - uint64_t fs; - uint64_t total_hostkeys; /* prepare hostkeys */ tth = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_TESTING_handle)); /* Init testing the testing lib */ - tth->tl_system = GNUNET_TESTING_system_create ("transport-testing", - "127.0.0.1"); + tth->tl_system = GNUNET_TESTING_system_create ("transport-testing", NULL); if (NULL == tth->tl_system) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Failed to initialize testing library!\n")); @@ -640,45 +591,6 @@ GNUNET_TRANSPORT_TESTING_init () return NULL; } - tth->hostkey_data = NULL; - const char *hostkeys_file = "../../contrib/testing_hostkeys.dat"; - - if (GNUNET_YES != GNUNET_DISK_file_test (hostkeys_file)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not read hostkeys file!\n")); - } - else - { - /* Check hostkey file size, read entire thing into memory */ - fd = GNUNET_DISK_file_open (hostkeys_file, GNUNET_DISK_OPEN_READ, - GNUNET_DISK_PERM_NONE); - if (NULL == fd) - { - GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "open", hostkeys_file); - GNUNET_free (tth); - return NULL; - } - - if (GNUNET_OK != GNUNET_DISK_file_size (hostkeys_file, &fs, GNUNET_YES, GNUNET_YES)) - fs = 0; - - if (0 != (fs % HOSTKEYFILESIZE)) - { - GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing", - "File size %llu seems incorrect for hostkeys...\n", fs); - } - else - { - total_hostkeys = fs / HOSTKEYFILESIZE; - tth->hostkey_data = GNUNET_malloc_large (fs); - GNUNET_assert (fs == GNUNET_DISK_file_read (fd, tth->hostkey_data, fs)); - GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing", - "Read %llu hostkeys from file\n", total_hostkeys); - tth->hostkeys_total = total_hostkeys; - } - GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fd)); - } - return tth; } diff --git a/src/transport/transport-testing.h b/src/transport/transport-testing.h index 3129bc0a0..0b1f24591 100644 --- a/src/transport/transport-testing.h +++ b/src/transport/transport-testing.h @@ -27,9 +27,7 @@ #include "platform.h" #include "gnunet_common.h" -#include "gnunet_getopt_lib.h" #include "gnunet_hello_lib.h" -#include "gnunet_os_lib.h" #include "gnunet_program_lib.h" #include "gnunet_container_lib.h" #include "gnunet_transport_service.h" @@ -145,16 +143,6 @@ struct PeerContext */ void *cb_cls; - /** - * Peer's service home directory - */ - char *servicehome; - - /** - * Hostkey file - */ - char *hostkeyfile; - /** * An unique number to identify the peer */ @@ -179,19 +167,29 @@ struct ConnectingContext struct GNUNET_TRANSPORT_TESTING_handle { - struct ConnectingContext *cc_head; - struct ConnectingContext *cc_tail; - /** * Testing library system handle */ struct GNUNET_TESTING_System *tl_system; - char *hostkey_data; - int hostkeys_total; - int hostkeys_last; + /** + * head DLL of connect contexts + */ + struct ConnectingContext *cc_head; + + /** + * head DLL of connect contexts + */ + struct ConnectingContext *cc_tail; + /** + * head DLL of peers + */ struct PeerContext *p_head; + + /** + * tail DLL of peers + */ struct PeerContext *p_tail; }; -- cgit v1.2.3