aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-07-17 11:18:27 +0000
committerChristian Grothoff <christian@grothoff.org>2009-07-17 11:18:27 +0000
commit426e5a72e448e87c25766c6bd792f7056a818461 (patch)
tree646c3b7f4fc38f19fb427a0d5dbb789c8d2e6d83 /src/transport
parentdad8ccb2bacdea35b803737cdaf0a7b6605d2e14 (diff)
downloadgnunet-426e5a72e448e87c25766c6bd792f7056a818461.tar.gz
gnunet-426e5a72e448e87c25766c6bd792f7056a818461.zip
updating code to include first actual test
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/Makefile.am3
-rw-r--r--src/transport/test_plugin_transport.c210
-rw-r--r--src/transport/test_plugin_transport_data.conf24
3 files changed, 190 insertions, 47 deletions
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index b3c1a94c8..870083baf 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -93,4 +93,5 @@ test_plugin_transport_LDADD = \
93EXTRA_DIST = \ 93EXTRA_DIST = \
94 test_transport_api_data.conf \ 94 test_transport_api_data.conf \
95 test_transport_api_peer1.conf \ 95 test_transport_api_peer1.conf \
96 test_transport_api_peer2.conf 96 test_transport_api_peer2.conf \
97 test_plugin_transport_data.conf
diff --git a/src/transport/test_plugin_transport.c b/src/transport/test_plugin_transport.c
index 378425471..a106470ea 100644
--- a/src/transport/test_plugin_transport.c
+++ b/src/transport/test_plugin_transport.c
@@ -31,15 +31,22 @@
31#include "gnunet_peerinfo_service.h" 31#include "gnunet_peerinfo_service.h"
32#include "gnunet_plugin_lib.h" 32#include "gnunet_plugin_lib.h"
33#include "gnunet_protocols.h" 33#include "gnunet_protocols.h"
34#include "gnunet_service_lib.h" 34#include "gnunet_program_lib.h"
35#include "gnunet_signatures.h" 35#include "gnunet_signatures.h"
36#include "plugin_transport.h" 36#include "plugin_transport.h"
37#include "transport.h" 37#include "transport.h"
38 38
39#define VERBOSE GNUNET_YES
40
41/**
42 * How long until we give up on transmitting the message?
43 */
44#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
45
39/** 46/**
40 * Our public key. 47 * Our public key.
41 */ 48 */
42static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *my_public_key; 49static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded my_public_key;
43 50
44/** 51/**
45 * Our identity. 52 * Our identity.
@@ -61,20 +68,6 @@ struct GNUNET_SCHEDULER_Handle *sched;
61 */ 68 */
62struct GNUNET_CONFIGURATION_Handle *cfg; 69struct GNUNET_CONFIGURATION_Handle *cfg;
63 70
64
65
66/**
67 * All loaded plugins.
68 */
69static struct TransportPlugin *plugins;
70
71/**
72 * Our server.
73 */
74static struct GNUNET_SERVER_Handle *server;
75
76
77
78/** 71/**
79 * Number of neighbours we'd like to have. 72 * Number of neighbours we'd like to have.
80 */ 73 */
@@ -91,6 +84,11 @@ struct GNUNET_TRANSPORT_PluginEnvironment env;
91struct GNUNET_TRANSPORT_PluginFunctions *api; 84struct GNUNET_TRANSPORT_PluginFunctions *api;
92 85
93/** 86/**
87 * Did the test pass or fail?
88 */
89static int ok;
90
91/**
94 * Initialize Environment for this plugin 92 * Initialize Environment for this plugin
95 */ 93 */
96struct ReadyList * 94struct ReadyList *
@@ -128,31 +126,136 @@ void lookup (void *cls,
128} 126}
129 127
130 128
129/**
130 * Function called when the service shuts
131 * down. Unloads our plugins.
132 *
133 * @param cls closure
134 * @param cfg configuration to use
135 */
136static void
137unload_plugins (void *cls, struct GNUNET_CONFIGURATION_Handle *cfg)
138{
139 GNUNET_assert (NULL == GNUNET_PLUGIN_unload ("libgnunet_plugin_transport_tcp",api));
140 if (my_private_key != NULL)
141 GNUNET_CRYPTO_rsa_key_free (my_private_key);
142
143}
144
145
146static GNUNET_SCHEDULER_TaskIdentifier validation_timeout_task;
147
148
149static void
150validation_notification (void *cls,
151 const char *name,
152 const struct GNUNET_PeerIdentity *peer,
153 uint32_t challenge,
154 const char *sender_addr)
155{
156 /* Sailor: 'test_validation' should get here
157 if the validation worked; so we cancel the
158 "delayed" task that will cause failure */
159 if (validation_timeout_task != GNUNET_SCHEDULER_NO_PREREQUISITE_TASK)
160 {
161 GNUNET_SCHEDULER_cancel (sched, validation_timeout_task);
162 validation_timeout_task = GNUNET_SCHEDULER_NO_PREREQUISITE_TASK;
163 }
164
165 GNUNET_assert (challenge == 42);
166
167 /* Sailor: if this is the last test, calling this function
168 here will end the process. */
169 ok = 0; /* if the last test succeeded, report success */
170 unload_plugins (NULL, cfg);
171}
172
173
174static void
175validation_failed (void *cls,
176 const struct GNUNET_SCHEDULER_TaskContext *tc)
177{
178 validation_timeout_task = GNUNET_SCHEDULER_NO_PREREQUISITE_TASK;
179 GNUNET_break (0); /* output error */
180 /* the "validation_notification" was not called
181 in a timely fashion; we should set an error
182 code for main and shut down */
183 unload_plugins (NULL, cfg);
184}
185
186
187/**
188 * Simple example test that invokes
189 * the "validate" function of the plugin
190 * and tries to see if the plugin would
191 * succeed to validate its own address.
192 * (This test is not well-written since
193 * we hand-compile the address which
194 * kind-of works for TCP but would not
195 * work for other plugins; we should ask
196 * the plugin about its address instead...).
197 */
198static void
199test_validation ()
200{
201 struct sockaddr_in soaddr;
202
203 memset (&soaddr, 0, sizeof(soaddr));
204 soaddr.sin_family = AF_INET;
205 /* Sailor: set this port to 2367 to see the
206 testcase fail after 30s (because validation
207 fails); obviously the test should be
208 modified to test both successful and
209 unsuccessful validation in the end... */
210 soaddr.sin_port = htons(2368 /* FIXME: get from config! */);
211 soaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
212 api->validate (api->cls,
213 &my_identity,
214 42,
215 TIMEOUT,
216 &soaddr,
217 sizeof(soaddr));
218 /* add job to catch failure (timeout) */
219 validation_timeout_task =
220 GNUNET_SCHEDULER_add_delayed (sched,
221 GNUNET_NO,
222 GNUNET_SCHEDULER_PRIORITY_KEEP,
223 GNUNET_SCHEDULER_NO_PREREQUISITE_TASK,
224 TIMEOUT,
225 &validation_failed,
226 NULL);
227}
228
229
131static void setup_plugin_environment() 230static void setup_plugin_environment()
132{ 231{
133 env.cfg = cfg; 232 env.cfg = cfg;
134 env.sched = sched; 233 env.sched = sched;
135 env.my_public_key = my_public_key; 234 env.my_public_key = &my_public_key;
235 env.my_private_key = my_private_key;
236 env.my_identity = &my_identity;
136 env.cls=&env; 237 env.cls=&env;
137 env.receive=&receive; 238 env.receive=&receive;
138 env.lookup=&lookup; 239 env.lookup=&lookup;
139 env.notify_address=&notify_address; 240 env.notify_address=&notify_address;
241 env.notify_validation = &validation_notification;
140 env.max_connections = max_connect_per_transport; 242 env.max_connections = max_connect_per_transport;
141} 243}
142 244
143 245
144/** 246/**
145 * Initiate transport service. 247 * Runs the test.
146 * 248 *
147 * @param cls closure 249 * @param cls closure
148 * @param s scheduler to use 250 * @param s scheduler to use
149 * @param serv the initialized server
150 * @param c configuration to use 251 * @param c configuration to use
151 */ 252 */
152static void 253static void
153run (void *cls, 254run (void *cls,
154 struct GNUNET_SCHEDULER_Handle *s, 255 struct GNUNET_SCHEDULER_Handle *s,
155 struct GNUNET_SERVER_Handle *serv, struct GNUNET_CONFIGURATION_Handle *c) 256 char *const *args,
257 const char *cfgfile,
258 struct GNUNET_CONFIGURATION_Handle *c)
156{ 259{
157 unsigned long long tneigh; 260 unsigned long long tneigh;
158 char *keyfile; 261 char *keyfile;
@@ -160,7 +263,6 @@ run (void *cls,
160 263
161 sched = s; 264 sched = s;
162 cfg = c; 265 cfg = c;
163 server = serv;
164 /* parse configuration */ 266 /* parse configuration */
165 if ((GNUNET_OK != 267 if ((GNUNET_OK !=
166 GNUNET_CONFIGURATION_get_value_number (c, 268 GNUNET_CONFIGURATION_get_value_number (c,
@@ -187,9 +289,11 @@ run (void *cls,
187 GNUNET_SCHEDULER_shutdown (s); 289 GNUNET_SCHEDULER_shutdown (s);
188 return; 290 return;
189 } 291 }
190 GNUNET_CRYPTO_rsa_key_get_public (my_private_key, &my_public_key); 292 GNUNET_CRYPTO_rsa_key_get_public (my_private_key,
293 &my_public_key);
191 GNUNET_CRYPTO_hash (&my_public_key, 294 GNUNET_CRYPTO_hash (&my_public_key,
192 sizeof (my_public_key), &my_identity.hashPubKey); 295 sizeof (my_public_key),
296 &my_identity.hashPubKey);
193 297
194 298
195 299
@@ -204,25 +308,21 @@ run (void *cls,
204 { 308 {
205 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 309 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
206 _("Failed to load transport plugin for tcp\n")); 310 _("Failed to load transport plugin for tcp\n"));
311 /* FIXME: set some error code for main */
312 return;
207 } 313 }
208 314 /* Sailor: if we had no real tests, we
209} 315 could call this function
210 316 here to end the process; instead, I'll
211 317 show how one could run a single test below.
212/** 318 Note that the test is not particularly well-written,
213 * Function called when the service shuts 319 it just serves to illustrate (also,
214 * down. Unloads our plugins. 320 the "validation_notification" function above is
215 * 321 part of the test.*/
216 * @param cls closure 322 if (0)
217 * @param cfg configuration to use 323 unload_plugins (NULL, cfg);
218 */ 324 else
219static void 325 test_validation ();
220unload_plugins (void *cls, struct GNUNET_CONFIGURATION_Handle *cfg)
221{
222 GNUNET_assert (NULL == GNUNET_PLUGIN_unload ("libgnunet_plugin_transport_tcp",api));
223 if (my_private_key != NULL)
224 GNUNET_CRYPTO_rsa_key_free (my_private_key);
225
226} 326}
227 327
228 328
@@ -236,18 +336,36 @@ unload_plugins (void *cls, struct GNUNET_CONFIGURATION_Handle *cfg)
236int 336int
237main (int argc, char *const *argv) 337main (int argc, char *const *argv)
238{ 338{
239 GNUNET_log_setup ("test-puglin-transport", 339 static struct GNUNET_GETOPT_CommandLineOption options[] = {
340 GNUNET_GETOPT_OPTION_END
341 };
342 char *const argv_prog[] = {
343 "test_plugin_transport",
344 "-c",
345 "test_plugin_transport_data.conf",
346 "-L",
347#if VERBOSE
348 "DEBUG",
349#else
350 "WARNING",
351#endif
352 NULL
353 };
354 GNUNET_log_setup ("test-plugin-transport",
240#if VERBOSE 355#if VERBOSE
241 "DEBUG", 356 "DEBUG",
242#else 357#else
243 "WARNING", 358 "WARNING",
244#endif 359#endif
245 NULL); 360 NULL);
361 ok = 1; /* set to fail */
246 return (GNUNET_OK == 362 return (GNUNET_OK ==
247 GNUNET_SERVICE_run (argc, 363 GNUNET_PROGRAM_run (5,
248 argv, 364 argv_prog,
249 "transport", 365 "test-plugin-transport",
250 &run, NULL, &unload_plugins, NULL)) ? 0 : 1; 366 "testcase",
367 options,
368 &run, NULL)) ? ok : 1;
251} 369}
252 370
253/* end of test_plugin_transport.c */ 371/* end of test_plugin_transport.c */
diff --git a/src/transport/test_plugin_transport_data.conf b/src/transport/test_plugin_transport_data.conf
new file mode 100644
index 000000000..fe05589d9
--- /dev/null
+++ b/src/transport/test_plugin_transport_data.conf
@@ -0,0 +1,24 @@
1[PATHS]
2SERVICEHOME = /tmp/test-plugin-transport/
3
4[resolver]
5PORT = 2364
6
7[transport]
8PORT = 2365
9PLUGINS = tcp
10
11[arm]
12PORT = 2366
13
14[statistics]
15PORT = 2367
16
17[transport-tcp]
18PORT = 2368
19
20[peerinfo]
21PORT = 2369
22
23[testing]
24WEAKRANDOM = YES