X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Ftest_transport_testing.c;h=9db5913066b158915db13b0ba69e9b37465003ad;hb=1947bc8ef4eb37738ffc1c566d9c6f96071b29f7;hp=b2ac507d28e3b367b90460383bf1efc881963c31;hpb=6ad7a1bffd1688f8ee1ecb37eacb3a55f671748c;p=oweals%2Fgnunet.git diff --git a/src/transport/test_transport_testing.c b/src/transport/test_transport_testing.c index b2ac507d2..9db591306 100644 --- a/src/transport/test_transport_testing.c +++ b/src/transport/test_transport_testing.c @@ -27,316 +27,181 @@ * C code apparently. */ #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? */ #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) -/** - * How long until we give up on transmitting the message? - */ -#define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60) +GNUNET_SCHEDULER_TaskIdentifier timeout_task; -#define MTYPE 12345 +static struct PeerContext *p1; +static struct PeerContext *p2; -static struct PeerContext p1; +static GNUNET_TRANSPORT_TESTING_ConnectRequest cc; -static struct PeerContext p2; +struct GNUNET_TRANSPORT_TESTING_handle *tth; -static int ok; +static int connected = GNUNET_NO; -static int is_tcp; - -static GNUNET_SCHEDULER_TaskIdentifier die_task; - -static GNUNET_SCHEDULER_TaskIdentifier tct; +static int ret = 0; +static void +end () +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping peers\n"); -#if VERBOSE -#define OKPP do { ok++; fprintf (stderr, "Now at stage %u at %s:%u\n", ok, __FILE__, __LINE__); } while (0) -#else -#define OKPP do { ok++; } while (0) -#endif + if (timeout_task != GNUNET_SCHEDULER_NO_TASK) + GNUNET_SCHEDULER_cancel (timeout_task); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p1); + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p2); + GNUNET_TRANSPORT_TESTING_done (tth); +} static void -stop_arm (struct PeerContext *p) +end_badly () { -#if START_ARM - 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_close (p->arm_proc); - p->arm_proc = NULL; - } -#endif - GNUNET_CONFIGURATION_destroy (p->cfg); -} + 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) + GNUNET_TRANSPORT_TESTING_stop_peer (tth, p2); + if (NULL != tth) + GNUNET_TRANSPORT_TESTING_done (tth); -static void -exchange_hello_last (void *cls, - const struct GNUNET_MessageHeader *message) -{ - struct PeerContext *me = cls; - - GNUNET_assert (message != NULL); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Exchanging HELLO of size %d with peer (%s)!\n", - (int) GNUNET_HELLO_size((const struct GNUNET_HELLO_Message *)message), - GNUNET_i2s (&me->id)); - GNUNET_assert (GNUNET_OK == - GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) - message, &me->id)); - GNUNET_TRANSPORT_offer_hello (p1.th, message, NULL, NULL); + ret = GNUNET_SYSERR; } - static void -exchange_hello (void *cls, - const struct GNUNET_MessageHeader *message) +testing_connect_cb (struct PeerContext *p1, struct PeerContext *p2, void *cls) { - struct PeerContext *me = cls; + char *ps = GNUNET_strdup (GNUNET_i2s (&p1->id)); - GNUNET_assert (message != NULL); - GNUNET_assert (GNUNET_OK == - GNUNET_HELLO_get_id ((const struct GNUNET_HELLO_Message *) - message, &me->id)); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Exchanging HELLO of size %d from peer %s!\n", - (int) GNUNET_HELLO_size((const struct GNUNET_HELLO_Message *)message), - GNUNET_i2s (&me->id)); - GNUNET_TRANSPORT_offer_hello (p2.th, message, NULL, NULL); + "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 -end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +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, "Disconnecting from transports!\n"); - GNUNET_break (0); - die_task = GNUNET_SCHEDULER_NO_TASK; - GNUNET_TRANSPORT_get_hello_cancel (p2.th, &exchange_hello_last, &p2); - GNUNET_TRANSPORT_get_hello_cancel (p1.th, &exchange_hello, &p1); - GNUNET_TRANSPORT_disconnect (p1.th); - GNUNET_TRANSPORT_disconnect (p2.th); - if (GNUNET_SCHEDULER_NO_TASK != tct) - { - GNUNET_SCHEDULER_cancel (tct); - tct = GNUNET_SCHEDULER_NO_TASK; - } - ok = 1; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer `%s' connected \n", + GNUNET_i2s (peer)); + connected++; } static void -end_normally (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer) { - ok = 60; - die_task = GNUNET_SCHEDULER_NO_TASK; - GNUNET_TRANSPORT_get_hello_cancel (p2.th, &exchange_hello_last, &p2); - GNUNET_TRANSPORT_get_hello_cancel (p1.th, &exchange_hello, &p1); - GNUNET_TRANSPORT_disconnect (p1.th); - GNUNET_TRANSPORT_disconnect (p2.th); - if (GNUNET_SCHEDULER_NO_TASK != tct) - { - GNUNET_SCHEDULER_cancel (tct); - tct = GNUNET_SCHEDULER_NO_TASK; - } - ok = 0; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer `%s' disconnected \n", + GNUNET_i2s (peer)); } static void -notify_connect (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TRANSPORT_ATS_Information *ats, - uint32_t ats_count) +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, - "Peer `%4s' connected to us (%p)!\n", - GNUNET_i2s (peer), - cls); - if (cls == &p1) - { - GNUNET_assert (ok >= 2); - OKPP; - OKPP; - if (GNUNET_SCHEDULER_NO_TASK != die_task) - GNUNET_SCHEDULER_cancel (die_task); - if (GNUNET_SCHEDULER_NO_TASK != tct) - GNUNET_SCHEDULER_cancel (tct); - tct = GNUNET_SCHEDULER_NO_TASK; - die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT_TRANSMIT, - &end_normally, NULL); - } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Receiving\n"); } - -static void -notify_disconnect (void *cls, - const struct GNUNET_PeerIdentity *peer) +void +start_cb (struct PeerContext *p, void *cls) { - if ( (ok != 60) && - (GNUNET_SCHEDULER_NO_TASK != die_task) ) - { - GNUNET_SCHEDULER_cancel (die_task); - die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Peer `%4s' disconnected (%p)!\n", - GNUNET_i2s (peer), cls); -} + static int started; + started++; -static void -setup_peer (struct PeerContext *p, - const char *cfgname) -{ - 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)); - GNUNET_DISK_directory_remove (p->servicehome); - } - -#if START_ARM - p->arm_proc = GNUNET_OS_start_process (NULL, NULL, "gnunet-service-arm", - "gnunet-service-arm", -#if VERBOSE_ARM - "-L", "DEBUG", -#endif - "-c", cfgname, NULL); -#endif - p->th = GNUNET_TRANSPORT_connect (p->cfg, - NULL, p, - NULL, - ¬ify_connect, ¬ify_disconnect); - GNUNET_assert (p->th != NULL); -} + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') started\n", p->no, + GNUNET_i2s (&p->id)); + if (started != 2) + return; + + char *sender_c = GNUNET_strdup (GNUNET_i2s (&p1->id)); -static void -try_connect (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) -{ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Asking peers to connect...\n"); - /* FIXME: 'pX.id' may still be all-zeros here... */ - GNUNET_TRANSPORT_try_connect (p2.th, - &p1.id); - GNUNET_TRANSPORT_try_connect (p1.th, - &p2.id); - tct = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, - &try_connect, - NULL); -} + "Test tries to connect peer %u (`%s') -> peer %u (`%s')\n", + p1->no, sender_c, p2->no, GNUNET_i2s (&p2->id)); + GNUNET_free (sender_c); + cc = GNUNET_TRANSPORT_TESTING_connect_peers (tth, p1, p2, &testing_connect_cb, + NULL); -static void -run (void *cls, - char *const *args, - const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - GNUNET_assert (ok == 1); - OKPP; - die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, - &end_badly, NULL); - if (is_tcp) - { - setup_peer (&p1, "test_transport_api_multiaddress_tcp_peer1.conf"); - setup_peer (&p2, "test_transport_api_multiaddress_tcp_peer2.conf"); - } - GNUNET_assert(p1.th != NULL); - GNUNET_assert(p2.th != NULL); - - GNUNET_TRANSPORT_get_hello (p1.th, &exchange_hello, &p1); - GNUNET_TRANSPORT_get_hello (p2.th, &exchange_hello_last, &p2); - tct = GNUNET_SCHEDULER_add_now (&try_connect, NULL); } -static int -check () +static void +run (void *cls, char *const *args, const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) { - static char *const argv[] = { "test-transport-api", - "-c", - "test_transport_api_data.conf", -#if VERBOSE - "-L", "DEBUG", -#endif - NULL - }; - static struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_END - }; - -#if WRITECONFIG - setTransportOptions("test_transport_api_data.conf"); -#endif - ok = 1; - GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, - argv, "test-transport-api", "nohelp", - options, &run, &ok); - stop_arm (&p1); - stop_arm (&p2); - - if (p1.servicehome != NULL) - { - GNUNET_DISK_directory_remove (p1.servicehome); - GNUNET_free(p1.servicehome); - } - if (p2.servicehome != NULL) - { - GNUNET_DISK_directory_remove (p2.servicehome); - GNUNET_free(p2.servicehome); - } - return ok; + tth = GNUNET_TRANSPORT_TESTING_init (); + + timeout_task = + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &end_badly, NULL); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting peer\n"); + p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth, + "test_transport_api_tcp_peer1.conf", + 1, ¬ify_receive, ¬ify_connect, + ¬ify_disconnect, &start_cb, p1); + + p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth, + "test_transport_api_tcp_peer2.conf", + 2, ¬ify_receive, ¬ify_connect, + ¬ify_disconnect, &start_cb, p2); + + if (p1 == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Peer1 was not started successfully\n"); + if (timeout_task != GNUNET_SCHEDULER_NO_TASK) + GNUNET_SCHEDULER_cancel (timeout_task); + timeout_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); + } + if (p2 == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Peer2 was not started successfully\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[]) { - int ret; - - GNUNET_log_setup ("test-transport-api", -#if VERBOSE - "DEBUG", -#else + GNUNET_log_setup ("test_transport_testing", "WARNING", -#endif NULL); - if (strstr(argv[0], "tcp") != NULL) - { - is_tcp = GNUNET_YES; - } + char *const argv_1[] = { "test_transport_testing", + "-c", + "test_transport_api_data.conf", + NULL + }; + + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; - ret = check (); + GNUNET_PROGRAM_run ((sizeof (argv_1) / sizeof (char *)) - 1, argv_1, + "test_transport_testing", "nohelp", options, &run, &ret); return ret; }