2 This file is part of GNUnet.
3 (C) 2011 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file mesh/test_mesh_local.c
23 * @brief test mesh local: test of tunnels with just one peer
24 * @author Bartlomiej Polot
28 #include "gnunet_util_lib.h"
29 #include "gnunet_testing_lib-new.h"
30 #include "gnunet_dht_service.h"
31 #include "gnunet_mesh_service.h"
33 static struct GNUNET_MESH_Handle *mesh_peer_1;
35 static struct GNUNET_MESH_Handle *mesh_peer_2;
37 static struct GNUNET_MESH_Tunnel *t;
39 static unsigned int one = 1;
41 static unsigned int two = 2;
43 static int result = GNUNET_OK;
45 static GNUNET_SCHEDULER_TaskIdentifier abort_task;
47 static GNUNET_SCHEDULER_TaskIdentifier test_task;
54 do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
56 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: shutdown\n");
59 GNUNET_SCHEDULER_cancel (abort_task);
63 GNUNET_MESH_tunnel_destroy(t);
65 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: D1\n");
66 if (NULL != mesh_peer_1)
68 GNUNET_MESH_disconnect (mesh_peer_1);
70 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: D2\n");
71 if (NULL != mesh_peer_2)
73 GNUNET_MESH_disconnect (mesh_peer_2);
79 * Something went wrong and timed out. Kill everything and set error flag
82 do_abort (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
84 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: ABORT\n");
87 GNUNET_SCHEDULER_cancel (test_task);
89 result = GNUNET_SYSERR;
91 do_shutdown (cls, tc);
96 * Function is called whenever a message is received.
98 * @param cls closure (set from GNUNET_MESH_connect)
99 * @param tunnel connection to the other end
100 * @param tunnel_ctx place to store local state associated with the tunnel
101 * @param sender who sent the message
102 * @param message the actual message
103 * @param atsi performance data for the connection
104 * @return GNUNET_OK to keep the connection open,
105 * GNUNET_SYSERR to close it (signal serious error)
108 data_callback (void *cls, struct GNUNET_MESH_Tunnel *tunnel, void **tunnel_ctx,
109 const struct GNUNET_PeerIdentity *sender,
110 const struct GNUNET_MessageHeader *message,
111 const struct GNUNET_ATS_Information *atsi)
113 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: Data callback\n");
114 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
115 (GNUNET_TIME_UNIT_SECONDS, 2), &do_shutdown,
122 * Method called whenever another peer has added us to a tunnel
123 * the other peer initiated.
126 * @param tunnel new handle to the tunnel
127 * @param initiator peer that started the tunnel
128 * @param atsi performance information for the tunnel
129 * @return initial tunnel context for the tunnel (can be NULL -- that's not an error)
132 inbound_tunnel (void *cls, struct GNUNET_MESH_Tunnel *tunnel,
133 const struct GNUNET_PeerIdentity *initiator,
134 const struct GNUNET_ATS_Information *atsi)
136 unsigned int id = *(unsigned int *) cls;
138 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: received incoming tunnel\n");
141 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
142 "test: received incoming tunnel on peer 2\n");
143 result = GNUNET_SYSERR;
150 * Function called whenever an inbound tunnel is destroyed. Should clean up
151 * any associated state.
153 * @param cls closure (set from GNUNET_MESH_connect)
154 * @param tunnel connection to the other end (henceforth invalid)
155 * @param tunnel_ctx place where local state associated
156 * with the tunnel is stored
159 inbound_end (void *cls, const struct GNUNET_MESH_Tunnel *tunnel,
162 unsigned int id = *(unsigned int *) cls;
164 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: incoming tunnel closed\n");
167 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
168 "test: received closing tunnel on peer 2\n");
169 result = GNUNET_SYSERR;
175 * Method called whenever a peer has disconnected from the tunnel.
178 * @param peer peer identity the tunnel stopped working with
181 peer_conected (void *cls, const struct GNUNET_PeerIdentity *peer,
182 const struct GNUNET_ATS_Information *atsi)
184 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: peer connected\n");
185 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &do_shutdown, NULL);
190 * Method called whenever a peer has connected to the tunnel.
193 * @param peer peer identity the tunnel was created to, NULL on timeout
194 * @param atsi performance data for the connection
197 peer_disconnected (void *cls, const struct GNUNET_PeerIdentity *peer)
199 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: peer disconnected\n");
204 * Handler array for traffic received on peer1
206 static struct GNUNET_MESH_MessageHandler handlers1[] = {
207 {&data_callback, 1, 0},
213 * Handler array for traffic received on peer2 (none expected)
215 static struct GNUNET_MESH_MessageHandler handlers2[] = { {NULL, 0, 0} };
219 * Start looking for a peer by type
222 do_connect_peer_1 (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
224 const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
225 static const GNUNET_MESH_ApplicationType app1[] = { 1, 0 };
227 test_task = GNUNET_SCHEDULER_NO_TASK;
228 mesh_peer_1 = GNUNET_MESH_connect (cfg, /* configuration */
229 (void *) &one, /* cls */
230 &inbound_tunnel, /* inbound new hndlr */
231 &inbound_end, /* inbound end hndlr */
232 handlers1, /* traffic handlers */
233 app1); /* apps offered */
238 * Initialize framework and start test
242 const struct GNUNET_CONFIGURATION_Handle *cfg,
243 struct GNUNET_TESTING_Peer *peer)
245 static const GNUNET_MESH_ApplicationType app2[] = { 0 };
248 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
249 (GNUNET_TIME_UNIT_SECONDS, 20), &do_abort,
251 mesh_peer_2 = GNUNET_MESH_connect (cfg, /* configuration */
252 (void *) &two, /* cls */
253 &inbound_tunnel, /* inbound new hndlr */
254 &inbound_end, /* inbound end hndlr */
255 handlers2, /* traffic handlers */
256 app2); /* apps offered */
257 if (NULL == mesh_peer_2)
259 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "test: Couldn't connect to mesh :(\n");
260 result = GNUNET_SYSERR;
265 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: YAY! CONNECTED TO MESH :D\n");
267 t = GNUNET_MESH_tunnel_create (mesh_peer_2, NULL, &peer_conected,
268 &peer_disconnected, (void *) &two);
269 GNUNET_MESH_peer_request_connect_by_type (t, 1);
271 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
272 (GNUNET_TIME_UNIT_SECONDS, 5),
273 &do_connect_peer_1, (void*) cfg);
281 main (int argc, char *argv[])
283 if (0 != GNUNET_TESTING_peer_run ("test-mesh-local-2",
287 return (result == GNUNET_OK) ? 0 : 1;
290 /* end of test_mesh_local_2.c */