From bd6d53b9caba0093c535988463cdf4f726f6c7f8 Mon Sep 17 00:00:00 2001 From: Bart Polot Date: Thu, 20 Oct 2011 18:20:49 +0000 Subject: Changed testcase to include real multicast tests --- src/mesh/gnunet-service-mesh.c | 4 + src/mesh/mesh_api_new.c | 1 + src/mesh/test_mesh_small.c | 240 +++++++++++++++++++++++++++-------------- src/mesh/test_mesh_small.conf | 4 +- 4 files changed, 168 insertions(+), 81 deletions(-) (limited to 'src/mesh') diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c index 0f2bbe3cf..8d37ae7ab 100644 --- a/src/mesh/gnunet-service-mesh.c +++ b/src/mesh/gnunet-service-mesh.c @@ -1238,6 +1238,9 @@ peer_info_connect (struct MeshPeerInfo *peer, struct MeshTunnel *t) path_info = GNUNET_malloc(sizeof(struct MeshPathInfo)); path_info->peer = peer; path_info->t = t; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "MESH: Starting DHT GET for peer %s\n", + GNUNET_i2s (&id)); peer->dhtget = GNUNET_DHT_get_start(dht_handle, /* handle */ GNUNET_TIME_UNIT_FOREVER_REL, /* timeout */ @@ -1297,6 +1300,7 @@ tunnel_notify_connection_broken (struct MeshTunnel *t, struct MeshPeerInfo *peer, GNUNET_PEER_Id p1, GNUNET_PEER_Id p2); + /** * Remove all paths that rely on a direct connection between p1 and p2 * from the peer itself and notify all tunnels about it. diff --git a/src/mesh/mesh_api_new.c b/src/mesh/mesh_api_new.c index 81933e858..7c45cd7b8 100644 --- a/src/mesh/mesh_api_new.c +++ b/src/mesh/mesh_api_new.c @@ -1347,6 +1347,7 @@ GNUNET_MESH_peer_request_connect_add (struct GNUNET_MESH_Tunnel *tunnel, { if (tunnel->peers[i]->id == peer_id) { + /* Peer already exists in tunnel */ GNUNET_PEER_change_rc (peer_id, -1); GNUNET_break (0); return; diff --git a/src/mesh/test_mesh_small.c b/src/mesh/test_mesh_small.c index 9fe2c1292..1cb9d6181 100644 --- a/src/mesh/test_mesh_small.c +++ b/src/mesh/test_mesh_small.c @@ -55,7 +55,7 @@ struct StatsContext /** * Time to wait for stuff that should be rather fast */ -#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) +#define SHORT_TIME GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10) /** * DIFFERENT TESTS TO RUN @@ -74,6 +74,10 @@ static int test; */ static int ok; +static int peers_in_tunnel; + +static int peers_responded; + /** * Be verbose */ @@ -144,14 +148,20 @@ static GNUNET_PEER_Id pid1; static struct GNUNET_TESTING_Daemon *d2; +static struct GNUNET_TESTING_Daemon *d3; + static struct GNUNET_MESH_Handle *h1; static struct GNUNET_MESH_Handle *h2; +static struct GNUNET_MESH_Handle *h3; + static struct GNUNET_MESH_Tunnel *t; static struct GNUNET_MESH_Tunnel *incoming_t; +static struct GNUNET_MESH_Tunnel *incoming_t2; + static uint16_t *mesh_peers; /** @@ -163,14 +173,14 @@ shutdown_callback (void *cls, const char *emsg) if (emsg != NULL) { #if VERBOSE - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Shutdown of peers failed!\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Shutdown of peers failed!\n"); #endif ok--; } else { #if VERBOSE - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: All peers successfully shut down!\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: All peers successfully shut down!\n"); #endif } } @@ -180,7 +190,7 @@ static void shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { #if VERBOSE - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Ending test.\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Ending test.\n"); #endif if (disconnect_task != GNUNET_SCHEDULER_NO_TASK) @@ -200,12 +210,17 @@ static void disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: disconnecting mesh service of peers\n"); + "***************** test: disconnecting mesh service of peers\n"); disconnect_task = GNUNET_SCHEDULER_NO_TASK; GNUNET_MESH_disconnect(h1); GNUNET_MESH_disconnect(h2); - GNUNET_SCHEDULER_cancel (shutdown_handle); - shutdown_handle = GNUNET_SCHEDULER_add_now(&shutdown_task, NULL); + if (test == MULTICAST) + GNUNET_MESH_disconnect(h3); + if (GNUNET_SCHEDULER_NO_TASK != shutdown_handle) + { + GNUNET_SCHEDULER_cancel (shutdown_handle); + shutdown_handle = GNUNET_SCHEDULER_add_now(&shutdown_task, NULL); + } } @@ -217,7 +232,7 @@ tmt_rdy (void *cls, size_t size, void *buf) { struct GNUNET_MessageHeader *msg = buf; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: tmt_rdy called\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: tmt_rdy called\n"); if (size < sizeof(struct GNUNET_MessageHeader) || NULL == buf) return 0; msg->size = htons (sizeof(struct GNUNET_MessageHeader)); @@ -252,19 +267,27 @@ data_callback (void *cls, { case 1L: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Origin client got a response!\n"); + "***************** test: Origin client got a response!\n"); ok++; - GNUNET_MESH_tunnel_destroy (tunnel); - GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, + peers_responded++; + if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) + { + GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, &disconnect_mesh_peers, NULL); + } + if (test == MULTICAST && peers_responded < 2) + return GNUNET_OK; + GNUNET_MESH_tunnel_destroy (tunnel); break; case 2L: + case 3L: GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Destination client got a message \n"); + "***************** test: Destination client %u got a message.\n", + client); ok++; - GNUNET_MESH_notify_transmit_ready(incoming_t, + GNUNET_MESH_notify_transmit_ready(tunnel, GNUNET_NO, 0, GNUNET_TIME_UNIT_FOREVER_REL, @@ -272,10 +295,13 @@ data_callback (void *cls, sizeof(struct GNUNET_MessageHeader), &tmt_rdy, (void *) 1L); - GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, - &disconnect_mesh_peers, - NULL); + if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) + { + GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, + &disconnect_mesh_peers, + NULL); + } break; default: break; @@ -311,14 +337,21 @@ incoming_tunnel (void *cls, const struct GNUNET_ATS_Information * atsi) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Incoming tunnel from %s\n", - GNUNET_i2s(initiator)); + "***************** test: Incoming tunnel from %s to peer %d\n", + GNUNET_i2s(initiator), + (long) cls); ok++; - incoming_t = tunnel; - GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, - &disconnect_mesh_peers, - NULL); + if ((long) cls == 1L) + incoming_t = tunnel; + else + incoming_t2 = tunnel; + if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) + { + GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, + &disconnect_mesh_peers, + NULL); + } return NULL; } @@ -338,14 +371,26 @@ tunnel_cleaner (void *cls, const struct GNUNET_MESH_Tunnel *tunnel, long i = (long) cls; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Incoming tunnel disconnected at peer %d\n", + "***************** test: Incoming tunnel disconnected at peer %d\n", i); if (2L == i) ok++; - - GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, NULL); - + else if (3L == i) + ok++; + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "***************** test: Unknown peer! %d\n", + i); + peers_in_tunnel--; + if (peers_in_tunnel > 0) + return; + + if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) + { + GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_now (&disconnect_mesh_peers, NULL); + } + return; } @@ -360,7 +405,7 @@ static void dh (void *cls, const struct GNUNET_PeerIdentity *peer) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: peer %s disconnected\n", + "***************** test: peer %s disconnected\n", GNUNET_i2s(peer)); return; } @@ -379,30 +424,39 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer, { struct GNUNET_PeerIdentity *dest; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "***************** test: peer %s connected\n", + GNUNET_i2s(peer)); + + if (0 == memcmp(&d2->id, peer, sizeof(d2->id)) && (long) cls == 1L) + ok++; + if (test == MULTICAST && + 0 == memcmp(&d3->id, peer, sizeof(d3->id)) && + (long) cls == 1L) + ok++; switch (test) { case UNICAST: dest = &d2->id; break; case MULTICAST: + peers_in_tunnel++; + if (peers_in_tunnel < 2) + return; dest = NULL; break; default: return; } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: peer %s connected\n", - GNUNET_i2s(peer)); - if (0 == memcmp(&d2->id, peer, sizeof(d2->id)) && (long) cls == 1L) - ok++; if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) { GNUNET_SCHEDULER_cancel (disconnect_task); disconnect_task = GNUNET_SCHEDULER_add_delayed(SHORT_TIME, &disconnect_mesh_peers, NULL); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Sending data...\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "***************** test: Sending data...\n"); + peers_responded = 0; GNUNET_MESH_notify_transmit_ready(t, GNUNET_NO, 0, @@ -414,8 +468,8 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer, } else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Disconnect already run?\n"); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Aborting...\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Disconnect already run?\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Aborting...\n"); } return; } @@ -424,12 +478,20 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer, static void do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: test_task\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: test_task\n"); GNUNET_MESH_peer_request_connect_add(t, &d2->id); - GNUNET_SCHEDULER_cancel (disconnect_task); - disconnect_task = GNUNET_SCHEDULER_add_delayed( - GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 30), - &disconnect_mesh_peers, NULL); + if (test == MULTICAST) + { + GNUNET_MESH_peer_request_connect_add(t, &d3->id); + } + if (GNUNET_SCHEDULER_NO_TASK != disconnect_task) + { + GNUNET_SCHEDULER_cancel (disconnect_task); + disconnect_task = GNUNET_SCHEDULER_add_delayed( + GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 30), + &disconnect_mesh_peers, + NULL); + } } @@ -462,7 +524,7 @@ topo_cb (void *cls, GNUNET_assert(p2 > 0); mesh_peers[p2]++; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: %s IS a neighbor\n", + "***************** test: %s IS a neighbor\n", GNUNET_i2s(second)); return; } @@ -474,7 +536,7 @@ topo_cb (void *cls, GNUNET_assert(p2 > 0); mesh_peers[p2]++; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: %s IS a neighbor\n", + "***************** test: %s IS a neighbor\n", GNUNET_i2s(first)); return; } @@ -491,13 +553,13 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) unsigned int i; struct GNUNET_PeerIdentity id; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: connect_mesh_service\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: connect_mesh_service\n"); for (i = 1; i <= num_peers; i++) { GNUNET_PEER_resolve(i, &id); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: peer %s has %u conns to d1\n", + "***************** test: peer %s has %u conns to d1\n", GNUNET_i2s (&id), mesh_peers[i]); if (mesh_peers[i] == 0) @@ -505,20 +567,39 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } GNUNET_assert (i < num_peers); d2 = GNUNET_TESTING_daemon_get_by_id (pg, &id); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Peer searched: %s\n", - GNUNET_i2s (&d2->id)); + if (test == MULTICAST) + { + for (i++; i <= num_peers; i++) + { + GNUNET_PEER_resolve(i, &id); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "***************** test: peer %s has %u conns to d1\n", + GNUNET_i2s (&id), + mesh_peers[i]); + if (mesh_peers[i] == 0) + break; + } + GNUNET_assert (i < num_peers); + d3 = GNUNET_TESTING_daemon_get_by_id (pg, &id); + } app = (GNUNET_MESH_ApplicationType) 0; #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: connecting to mesh service of peer %s (%u)\n", + "***************** test: connecting to mesh service of peer %s (%u)\n", GNUNET_i2s (&d1->id), mesh_peers[0]); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: connecting to mesh service of peer %s (%u)\n", + "***************** test: connecting to mesh service of peer %s (%u)\n", GNUNET_i2s (&d2->id), i); + if (test == MULTICAST) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "***************** test: connecting to mesh service of peer %s (%u)\n", + GNUNET_i2s (&d3->id), + i); + } #endif h1 = GNUNET_MESH_connect (d1->cfg, 10, @@ -534,15 +615,18 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) &tunnel_cleaner, handlers, &app); -#if VERBOSE - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: connected to mesh service of peer %s\n", - GNUNET_i2s (&d1->id)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: connected to mesh service of peer %s\n", - GNUNET_i2s (&d2->id)); -#endif + if (test == MULTICAST) + { + h3 = GNUNET_MESH_connect (d3->cfg, + 10, + (void *) 3L, + &incoming_tunnel, + &tunnel_cleaner, + handlers, + &app); + } t = GNUNET_MESH_tunnel_create (h1, NULL, &ch, &dh, (void *) 1L); + peers_in_tunnel = 0; test_task = GNUNET_SCHEDULER_add_delayed( GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 6), @@ -566,9 +650,9 @@ peergroup_ready (void *cls, const char *emsg) if (emsg != NULL) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Peergroup callback called with error, aborting test!\n"); + "***************** test: Peergroup callback called with error, aborting test!\n"); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Error from testing: `%s'\n", emsg); + "***************** test: Error from testing: `%s'\n", emsg); ok--; GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL); return; @@ -577,9 +661,9 @@ peergroup_ready (void *cls, const char *emsg) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "************************************************************\n"); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Peer Group started successfully!\n"); + "***************** test: Peer Group started successfully!\n"); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Have %u connections\n", + "***************** test: Have %u connections\n", total_connections); #endif @@ -596,13 +680,13 @@ peergroup_ready (void *cls, const char *emsg) { d1 = GNUNET_TESTING_daemon_get (pg, i); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: %u: %s\n", + "***************** test: %u: %s\n", GNUNET_PEER_intern(&d1->id), GNUNET_i2s (&d1->id)); } d1 = GNUNET_TESTING_daemon_get (pg, 0); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Peer looking: %s\n", + "***************** test: Peer looking: %s\n", GNUNET_i2s (&d1->id)); pid1 = GNUNET_PEER_intern(&d1->id); mesh_peers[pid1] = 100; @@ -648,7 +732,7 @@ connect_cb (void *cls, const struct GNUNET_PeerIdentity *first, else { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: Problem with new connection (%s)\n", + "***************** test: Problem with new connection (%s)\n", emsg); } @@ -682,7 +766,7 @@ run (void *cls, char *const *args, const char *cfgfile, NULL); #if VERBOSE - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Starting daemons.\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Starting daemons.\n"); GNUNET_CONFIGURATION_set_value_string (testing_cfg, "testing", "use_progressbars", "YES"); #endif @@ -801,22 +885,22 @@ main (int argc, char *argv[]) }; int ok_goal; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Start\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: Start\n"); if (strstr (argv[0], "test_mesh_small_unicast") != NULL) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: UNICAST\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: UNICAST\n"); test = UNICAST; ok_goal = 5; } else if (strstr (argv[0], "test_mesh_small_multicast") != NULL) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: MULTICAST\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: MULTICAST\n"); test = MULTICAST; - ok_goal = 5; + ok_goal = 10; } else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: UNKNOWN\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "***************** test: UNKNOWN\n"); test = SETUP; ok_goal = 0; } @@ -831,13 +915,11 @@ main (int argc, char *argv[]) if (ok_goal != ok) { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - "test: %s FAILED! (%d/%d)\n", - argv[0], ok, ok_goal); + "***************** test: FAILED! (%d/%d)\n", ok, ok_goal); return 1; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: %s success\n", - argv[0]); + "***************** test: success\n"); return 0; } diff --git a/src/mesh/test_mesh_small.conf b/src/mesh/test_mesh_small.conf index d3cd98429..90bae9ab2 100644 --- a/src/mesh/test_mesh_small.conf +++ b/src/mesh/test_mesh_small.conf @@ -40,8 +40,8 @@ INTERNAL_ADDRESS = 127.0.0.1 EXTERNAL_ADDRESS = 127.0.0.1 [core] -TOTAL_QUOTA_IN = 1024000 -TOTAL_QUOTA_OUT = 1024000 +TOTAL_QUOTA_IN = 4000000 +TOTAL_QUOTA_OUT = 4000000 AUTOSTART = YES PORT = 10003 -- cgit v1.2.3