aboutsummaryrefslogtreecommitdiff
path: root/src/namestore/test_namestore_api_zone_iteration_stop.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-03-07 10:34:07 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-03-07 10:34:07 +0000
commit18d7b243b873410c7101d97bd8c9fabb36bdb404 (patch)
tree9feae8ee71f2a144938c0536afe9dd554bfd015e /src/namestore/test_namestore_api_zone_iteration_stop.c
parent55656c4720d237f883bff2d54ad7365d0ecb793d (diff)
downloadgnunet-18d7b243b873410c7101d97bd8c9fabb36bdb404.tar.gz
gnunet-18d7b243b873410c7101d97bd8c9fabb36bdb404.zip
- final zone iteration code
Diffstat (limited to 'src/namestore/test_namestore_api_zone_iteration_stop.c')
-rw-r--r--src/namestore/test_namestore_api_zone_iteration_stop.c482
1 files changed, 482 insertions, 0 deletions
diff --git a/src/namestore/test_namestore_api_zone_iteration_stop.c b/src/namestore/test_namestore_api_zone_iteration_stop.c
new file mode 100644
index 000000000..36a08d7db
--- /dev/null
+++ b/src/namestore/test_namestore_api_zone_iteration_stop.c
@@ -0,0 +1,482 @@
1/*
2 This file is part of GNUnet.
3 (C) 2009 Christian Grothoff (and other contributing authors)
4
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.
9
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.
14
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.
19*/
20/**
21 * @file namestore/test_namestore_api_zone_iteration.c
22 * @brief testcase for zone iteration functionality: iterate of a specific zone
23 */
24#include "platform.h"
25#include "gnunet_common.h"
26#include "gnunet_namestore_service.h"
27#include "namestore.h"
28
29#define VERBOSE GNUNET_NO
30
31#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
32
33static struct GNUNET_NAMESTORE_Handle * nsh;
34
35static GNUNET_SCHEDULER_TaskIdentifier endbadly_task;
36static GNUNET_SCHEDULER_TaskIdentifier stopiteration_task;
37static struct GNUNET_OS_Process *arm;
38
39static struct GNUNET_CRYPTO_RsaPrivateKey * privkey;
40static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey;
41static GNUNET_HashCode zone;
42
43static struct GNUNET_CRYPTO_RsaPrivateKey * privkey2;
44static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey2;
45static GNUNET_HashCode zone2;
46
47static struct GNUNET_NAMESTORE_ZoneIterator *zi;
48static int res;
49static int returned_records;
50
51struct GNUNET_CRYPTO_RsaSignature *sig_1;
52char * s_name_1;
53struct GNUNET_NAMESTORE_RecordData *s_rd_1;
54
55struct GNUNET_CRYPTO_RsaSignature *sig_2;
56char * s_name_2;
57struct GNUNET_NAMESTORE_RecordData *s_rd_2;
58
59struct GNUNET_CRYPTO_RsaSignature *sig_3;
60char * s_name_3;
61struct GNUNET_NAMESTORE_RecordData *s_rd_3;
62
63static void
64start_arm (const char *cfgname)
65{
66 arm = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-service-arm",
67 "gnunet-service-arm", "-c", cfgname,
68#if VERBOSE_PEERS
69 "-L", "DEBUG",
70#else
71 "-L", "ERROR",
72#endif
73 NULL);
74}
75
76static void
77stop_arm ()
78{
79 if (NULL != arm)
80 {
81 if (0 != GNUNET_OS_process_kill (arm, SIGTERM))
82 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
83 GNUNET_OS_process_wait (arm);
84 GNUNET_OS_process_close (arm);
85 arm = NULL;
86 }
87}
88
89/**
90 * Re-establish the connection to the service.
91 *
92 * @param cls handle to use to re-connect.
93 * @param tc scheduler context
94 */
95static void
96endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
97{
98 if (stopiteration_task != GNUNET_SCHEDULER_NO_TASK)
99 {
100 GNUNET_SCHEDULER_cancel (stopiteration_task);
101 stopiteration_task = GNUNET_SCHEDULER_NO_TASK;
102 }
103
104 if (nsh != NULL)
105 GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES);
106 nsh = NULL;
107
108 GNUNET_free_non_null(sig_1);
109 GNUNET_free_non_null(sig_2);
110 GNUNET_free_non_null(sig_3);
111 GNUNET_free_non_null(s_name_1);
112 GNUNET_free_non_null(s_name_2);
113 GNUNET_free_non_null(s_name_3);
114
115 if (s_rd_1 != NULL)
116 {
117 GNUNET_free ((void *)s_rd_1->data);
118 GNUNET_free (s_rd_1);
119 }
120 if (s_rd_2 != NULL)
121 {
122 GNUNET_free ((void *)s_rd_2->data);
123 GNUNET_free (s_rd_2);
124 }
125 if (s_rd_3 != NULL)
126 {
127 GNUNET_free ((void *)s_rd_3->data);
128 GNUNET_free (s_rd_3);
129 }
130
131 if (privkey != NULL)
132 GNUNET_CRYPTO_rsa_key_free (privkey);
133 privkey = NULL;
134
135 if (privkey2 != NULL)
136 GNUNET_CRYPTO_rsa_key_free (privkey2);
137 privkey2 = NULL;
138
139 if (NULL != arm)
140 stop_arm();
141
142 res = 1;
143}
144
145
146static void
147end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
148{
149 if (stopiteration_task != GNUNET_SCHEDULER_NO_TASK)
150 {
151 GNUNET_SCHEDULER_cancel (stopiteration_task);
152 stopiteration_task = GNUNET_SCHEDULER_NO_TASK;
153 }
154
155 if (endbadly_task != GNUNET_SCHEDULER_NO_TASK)
156 {
157 GNUNET_SCHEDULER_cancel (endbadly_task);
158 endbadly_task = GNUNET_SCHEDULER_NO_TASK;
159 }
160
161 if (privkey != NULL)
162 GNUNET_CRYPTO_rsa_key_free (privkey);
163 privkey = NULL;
164
165 if (privkey2 != NULL)
166 GNUNET_CRYPTO_rsa_key_free (privkey2);
167 privkey2 = NULL;
168
169 GNUNET_free (sig_1);
170 GNUNET_free (sig_2);
171 GNUNET_free (sig_3);
172 GNUNET_free (s_name_1);
173 GNUNET_free (s_name_2);
174 GNUNET_free (s_name_3);
175 if (s_rd_1 != NULL)
176 {
177 GNUNET_free ((void *)s_rd_1->data);
178 GNUNET_free (s_rd_1);
179 }
180 if (s_rd_2 != NULL)
181 {
182 GNUNET_free ((void *)s_rd_2->data);
183 GNUNET_free (s_rd_2);
184 }
185 if (s_rd_3 != NULL)
186 {
187 GNUNET_free ((void *)s_rd_3->data);
188 GNUNET_free (s_rd_3);
189 }
190
191 if (nsh != NULL)
192 GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES);
193 nsh = NULL;
194
195 if (NULL != arm)
196 stop_arm();
197 if (returned_records == 1)
198 res = 0;
199 else
200 res = 1;
201
202}
203
204void zone_proc (void *cls,
205 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key,
206 struct GNUNET_TIME_Absolute expire,
207 const char *name,
208 unsigned int rd_count,
209 const struct GNUNET_NAMESTORE_RecordData *rd,
210 const struct GNUNET_CRYPTO_RsaSignature *signature)
211{
212 int failed = GNUNET_NO;
213
214 if ((zone_key == NULL) && (name == NULL))
215 {
216 GNUNET_break (3 == returned_records);
217 if (3 == returned_records)
218 res = 0;
219 else
220 res = 1;
221
222 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received last result, iteration done after receing %u results\n",returned_records );
223 GNUNET_SCHEDULER_add_now (&end, NULL);
224 }
225 else
226 {
227 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing results name %s \n", name);
228 if (0 == strcmp (name, s_name_1))
229 {
230 if (rd_count == 1)
231 {
232 if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_1))
233 {
234 failed = GNUNET_YES;
235 GNUNET_break (0);
236 }
237 }
238 else
239 {
240 failed = GNUNET_YES;
241 GNUNET_break (0);
242 }
243 if (0 != memcmp (signature, sig_1, sizeof (struct GNUNET_CRYPTO_RsaSignature)))
244 {
245 failed = GNUNET_YES;
246 GNUNET_break (0);
247 }
248 }
249 else if (0 == strcmp (name, s_name_2))
250 {
251 if (rd_count == 1)
252 {
253 if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_2))
254 {
255 failed = GNUNET_YES;
256 GNUNET_break (0);
257 }
258 }
259 else
260 {
261 failed = GNUNET_YES;
262 GNUNET_break (0);
263 }
264 if (0 != memcmp (signature, sig_2, sizeof (struct GNUNET_CRYPTO_RsaSignature)))
265 {
266 failed = GNUNET_YES;
267 GNUNET_break (0);
268 }
269 }
270 else if (0 == strcmp (name, s_name_3))
271 {
272 if (rd_count == 1)
273 {
274 if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_3))
275 {
276 failed = GNUNET_YES;
277 GNUNET_break (0);
278 }
279 }
280 else
281 {
282 failed = GNUNET_YES;
283 GNUNET_break (0);
284 }
285 if (0 != memcmp (signature, sig_3, sizeof (struct GNUNET_CRYPTO_RsaSignature)))
286 {
287 failed = GNUNET_YES;
288 GNUNET_break (0);
289 }
290 }
291 else
292 {
293 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing result failed: got name `%s'\n", name);
294 res = 1;
295 GNUNET_break (0);
296 GNUNET_SCHEDULER_add_now (&end, NULL);
297 }
298
299 if (failed == GNUNET_NO)
300 {
301 returned_records ++;
302
303 if (1 == returned_records)
304 {
305 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping zone iteration after %u received record \n",returned_records );
306 GNUNET_NAMESTORE_zone_iteration_stop (zi);
307 if (endbadly_task != GNUNET_SCHEDULER_NO_TASK)
308 {
309 GNUNET_SCHEDULER_cancel (endbadly_task);
310 endbadly_task = GNUNET_SCHEDULER_NO_TASK;
311 }
312 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3), &end , NULL);
313 return;
314 }
315 else
316 {
317 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Telling namestore to send the next result\n");
318 GNUNET_NAMESTORE_zone_iterator_next (zi);
319 }
320 }
321 else
322 {
323 GNUNET_break (0);
324 GNUNET_SCHEDULER_add_now (&end, NULL);
325 }
326 }
327}
328
329void
330delete_existing_db (const struct GNUNET_CONFIGURATION_Handle *cfg)
331{
332 char *afsdir;
333
334 if (GNUNET_OK ==
335 GNUNET_CONFIGURATION_get_value_filename (cfg, "namestore-sqlite",
336 "FILENAME", &afsdir))
337 {
338 if (GNUNET_OK == GNUNET_DISK_file_test (afsdir))
339 if (GNUNET_OK == GNUNET_DISK_file_test (afsdir))
340 if (GNUNET_OK == GNUNET_DISK_directory_remove(afsdir))
341 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deleted existing database `%s' \n", afsdir);
342 GNUNET_free (afsdir);
343 }
344
345}
346
347void
348put_cont (void *cls, int32_t success, const char *emsg)
349{
350 static int c = 0;
351
352 if (success == GNUNET_OK)
353 {
354 c++;
355 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record %u \n", c);
356 }
357 else
358 {
359 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to created records\n");
360 GNUNET_break (0);
361 GNUNET_SCHEDULER_cancel (endbadly_task);
362 endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
363 }
364
365 if (c == 3)
366 {
367 res = 1;
368 returned_records = 0;
369 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All records created, starting iteration over all zones \n");
370 zi = GNUNET_NAMESTORE_zone_iteration_start(nsh,
371 NULL,
372 GNUNET_NAMESTORE_RF_NONE,
373 GNUNET_NAMESTORE_RF_NONE,
374 zone_proc,
375 &zone);
376 if (zi == NULL)
377 {
378 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to create zone iterator\n");
379 GNUNET_break (0);
380 GNUNET_SCHEDULER_cancel (endbadly_task);
381 endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
382 }
383 }
384}
385
386static struct GNUNET_NAMESTORE_RecordData *
387create_record (int count)
388{
389 int c;
390 struct GNUNET_NAMESTORE_RecordData * rd;
391 rd = GNUNET_malloc (count * sizeof (struct GNUNET_NAMESTORE_RecordData));
392
393 for (c = 0; c < count; c++)
394 {
395 rd[c].expiration = GNUNET_TIME_absolute_get();
396 rd[c].record_type = 1111;
397 rd[c].data_size = 50;
398 rd[c].data = GNUNET_malloc(50);
399 memset ((char *) rd[c].data, 'a', 50);
400 }
401 return rd;
402}
403
404static void
405run (void *cls, char *const *args, const char *cfgfile,
406 const struct GNUNET_CONFIGURATION_Handle *cfg)
407{
408 delete_existing_db(cfg);
409 endbadly_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT,&endbadly, NULL);
410
411 privkey = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey");
412 GNUNET_assert (privkey != NULL);
413 GNUNET_CRYPTO_rsa_key_get_public(privkey, &pubkey);
414 GNUNET_CRYPTO_hash(&pubkey, sizeof (pubkey), &zone);
415
416 privkey2 = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey2");
417 GNUNET_assert (privkey2 != NULL);
418 GNUNET_CRYPTO_rsa_key_get_public(privkey2, &pubkey2);
419 GNUNET_CRYPTO_hash(&pubkey2, sizeof (pubkey), &zone2);
420
421
422 start_arm (cfgfile);
423 GNUNET_assert (arm != NULL);
424
425 nsh = GNUNET_NAMESTORE_connect (cfg);
426 GNUNET_break (NULL != nsh);
427
428 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 1\n");
429
430 GNUNET_asprintf(&s_name_1, "dummy1");
431 s_rd_1 = create_record(1);
432 sig_1 = GNUNET_NAMESTORE_create_signature(privkey, s_name_1, s_rd_1, 1);
433 GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_1, s_rd_1, &put_cont, NULL);
434
435
436 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 2 \n");
437 GNUNET_asprintf(&s_name_2, "dummy2");
438 s_rd_2 = create_record(1);
439
440 sig_2 = GNUNET_NAMESTORE_create_signature(privkey, s_name_2, s_rd_2, 1);
441 GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_2, s_rd_2, &put_cont, NULL);
442
443 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 3\n");
444 /* name in different zone */
445 GNUNET_asprintf(&s_name_3, "dummy3");
446 s_rd_3 = create_record(1);
447 sig_3 = GNUNET_NAMESTORE_create_signature(privkey, s_name_3, s_rd_3, 1);
448 GNUNET_NAMESTORE_record_put (nsh, &pubkey2, s_name_3, GNUNET_TIME_absolute_get_forever(), 1, s_rd_3, sig_3, &put_cont, NULL);
449}
450
451static int
452check ()
453{
454 static char *const argv[] = { "test_namestore_api_zone_iteration",
455 "-c",
456 "test_namestore_api.conf",
457#if VERBOSE
458 "-L", "DEBUG",
459#endif
460 NULL
461 };
462 static struct GNUNET_GETOPT_CommandLineOption options[] = {
463 GNUNET_GETOPT_OPTION_END
464 };
465
466 res = 1;
467 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, argv, "test_namestore_api_zone_iteration",
468 "nohelp", options, &run, &res);
469 return res;
470}
471
472int
473main (int argc, char *argv[])
474{
475 int ret;
476
477 ret = check ();
478
479 return ret;
480}
481
482/* end of test_namestore_api_zone_iteration.c */