diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-07-17 11:18:27 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-07-17 11:18:27 +0000 |
commit | 426e5a72e448e87c25766c6bd792f7056a818461 (patch) | |
tree | 646c3b7f4fc38f19fb427a0d5dbb789c8d2e6d83 /src | |
parent | dad8ccb2bacdea35b803737cdaf0a7b6605d2e14 (diff) | |
download | gnunet-426e5a72e448e87c25766c6bd792f7056a818461.tar.gz gnunet-426e5a72e448e87c25766c6bd792f7056a818461.zip |
updating code to include first actual test
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/Makefile.am | 3 | ||||
-rw-r--r-- | src/transport/test_plugin_transport.c | 210 | ||||
-rw-r--r-- | src/transport/test_plugin_transport_data.conf | 24 |
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 = \ | |||
93 | EXTRA_DIST = \ | 93 | EXTRA_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 | */ |
42 | static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *my_public_key; | 49 | static 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 | */ |
62 | struct GNUNET_CONFIGURATION_Handle *cfg; | 69 | struct GNUNET_CONFIGURATION_Handle *cfg; |
63 | 70 | ||
64 | |||
65 | |||
66 | /** | ||
67 | * All loaded plugins. | ||
68 | */ | ||
69 | static struct TransportPlugin *plugins; | ||
70 | |||
71 | /** | ||
72 | * Our server. | ||
73 | */ | ||
74 | static 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; | |||
91 | struct GNUNET_TRANSPORT_PluginFunctions *api; | 84 | struct GNUNET_TRANSPORT_PluginFunctions *api; |
92 | 85 | ||
93 | /** | 86 | /** |
87 | * Did the test pass or fail? | ||
88 | */ | ||
89 | static int ok; | ||
90 | |||
91 | /** | ||
94 | * Initialize Environment for this plugin | 92 | * Initialize Environment for this plugin |
95 | */ | 93 | */ |
96 | struct ReadyList * | 94 | struct 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 | */ | ||
136 | static void | ||
137 | unload_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 | |||
146 | static GNUNET_SCHEDULER_TaskIdentifier validation_timeout_task; | ||
147 | |||
148 | |||
149 | static void | ||
150 | validation_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 | |||
174 | static void | ||
175 | validation_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 | */ | ||
198 | static void | ||
199 | test_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 | |||
131 | static void setup_plugin_environment() | 230 | static 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=¬ify_address; | 240 | env.notify_address=¬ify_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 | */ |
152 | static void | 253 | static void |
153 | run (void *cls, | 254 | run (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 |
219 | static void | 325 | test_validation (); |
220 | unload_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) | |||
236 | int | 336 | int |
237 | main (int argc, char *const *argv) | 337 | main (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] | ||
2 | SERVICEHOME = /tmp/test-plugin-transport/ | ||
3 | |||
4 | [resolver] | ||
5 | PORT = 2364 | ||
6 | |||
7 | [transport] | ||
8 | PORT = 2365 | ||
9 | PLUGINS = tcp | ||
10 | |||
11 | [arm] | ||
12 | PORT = 2366 | ||
13 | |||
14 | [statistics] | ||
15 | PORT = 2367 | ||
16 | |||
17 | [transport-tcp] | ||
18 | PORT = 2368 | ||
19 | |||
20 | [peerinfo] | ||
21 | PORT = 2369 | ||
22 | |||
23 | [testing] | ||
24 | WEAKRANDOM = YES | ||