aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-03-05 11:59:34 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-03-05 11:59:34 +0000
commit9743bcab91d15d1d6bfb93ae17669b53a98f80f9 (patch)
treea27da75f101754b861e3a0bfdd31565b391f6e54 /src
parentc9a1014c8b91bd121d511f807346ce69fcd08479 (diff)
downloadgnunet-9743bcab91d15d1d6bfb93ae17669b53a98f80f9.tar.gz
gnunet-9743bcab91d15d1d6bfb93ae17669b53a98f80f9.zip
- lookup specific types
Diffstat (limited to 'src')
-rw-r--r--src/namestore/Makefile.am8
-rw-r--r--src/namestore/gnunet-service-namestore.c16
-rw-r--r--src/namestore/test_namestore_api_lookup_specific_type.c393
3 files changed, 408 insertions, 9 deletions
diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am
index 7bd014fd9..23fac2eb5 100644
--- a/src/namestore/Makefile.am
+++ b/src/namestore/Makefile.am
@@ -29,6 +29,7 @@ check_PROGRAMS = \
29 test_namestore_api \ 29 test_namestore_api \
30 test_namestore_api_put \ 30 test_namestore_api_put \
31 test_namestore_api_lookup \ 31 test_namestore_api_lookup \
32 test_namestore_api_lookup_specific_type \
32 test_namestore_api_create \ 33 test_namestore_api_create \
33 test_namestore_api_create_update \ 34 test_namestore_api_create_update \
34 test_namestore_api_remove \ 35 test_namestore_api_remove \
@@ -106,6 +107,13 @@ test_namestore_api_lookup_LDADD = \
106 $(top_builddir)/src/util/libgnunetutil.la \ 107 $(top_builddir)/src/util/libgnunetutil.la \
107 $(top_builddir)/src/namestore/libgnunetnamestore.la 108 $(top_builddir)/src/namestore/libgnunetnamestore.la
108 109
110test_namestore_api_lookup_specific_type_SOURCES = \
111 test_namestore_api_lookup_specific_type.c
112test_namestore_api_lookup_specific_type_LDADD = \
113 $(top_builddir)/src/util/libgnunetutil.la \
114 $(top_builddir)/src/namestore/libgnunetnamestore.la
115
116
109test_namestore_api_create_SOURCES = \ 117test_namestore_api_create_SOURCES = \
110 test_namestore_api_create.c 118 test_namestore_api_create.c
111test_namestore_api_create_LDADD = \ 119test_namestore_api_create_LDADD = \
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c
index b7bd129e5..23d45d080 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -215,7 +215,6 @@ void drop_iterator (void *cls,
215 else 215 else
216 { 216 {
217 (*stop) = GNUNET_YES; 217 (*stop) = GNUNET_YES;
218 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "NULL \n");
219 } 218 }
220} 219}
221 220
@@ -261,7 +260,6 @@ static void handle_stop (void *cls,
261 while (stop == GNUNET_NO) 260 while (stop == GNUNET_NO)
262 { 261 {
263 GSN_database->iterate_records (GSN_database->cls, NULL, NULL, offset, &drop_iterator, &stop); 262 GSN_database->iterate_records (GSN_database->cls, NULL, NULL, offset, &drop_iterator, &stop);
264 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "STOP %u \n");
265 offset ++; 263 offset ++;
266 } 264 }
267 } 265 }
@@ -291,8 +289,6 @@ handle_lookup_name_it (void *cls,
291 size_t rd_ser_len; 289 size_t rd_ser_len;
292 struct GNUNET_CRYPTO_RsaSignature *signature_tmp; 290 struct GNUNET_CRYPTO_RsaSignature *signature_tmp;
293 291
294
295
296 size_t r_size = 0; 292 size_t r_size = 0;
297 293
298 size_t name_len = 0; 294 size_t name_len = 0;
@@ -312,6 +308,8 @@ handle_lookup_name_it (void *cls,
312 for (c = 0; c < rd_count; c ++) 308 for (c = 0; c < rd_count; c ++)
313 if (rd[c].record_type == lnc->record_type) 309 if (rd[c].record_type == lnc->record_type)
314 copied_elements++; /* found matching record */ 310 copied_elements++; /* found matching record */
311 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u records with type %u for name `%s' in zone `%s'\n",
312 copied_elements, lnc->record_type, lnc->name, GNUNET_h2s(lnc->zone));
315 rd_selected = GNUNET_malloc (copied_elements * sizeof (struct GNUNET_NAMESTORE_RecordData)); 313 rd_selected = GNUNET_malloc (copied_elements * sizeof (struct GNUNET_NAMESTORE_RecordData));
316 copied_elements = 0; 314 copied_elements = 0;
317 for (c = 0; c < rd_count; c ++) 315 for (c = 0; c < rd_count; c ++)
@@ -338,8 +336,6 @@ handle_lookup_name_it (void *cls,
338 expire = GNUNET_TIME_UNIT_ZERO_ABS; 336 expire = GNUNET_TIME_UNIT_ZERO_ABS;
339 } 337 }
340 338
341
342
343 rd_ser_len = GNUNET_NAMESTORE_records_get_size(copied_elements, rd_selected); 339 rd_ser_len = GNUNET_NAMESTORE_records_get_size(copied_elements, rd_selected);
344 char rd_ser[rd_ser_len]; 340 char rd_ser[rd_ser_len];
345 GNUNET_NAMESTORE_records_serialize(copied_elements, rd_selected, rd_ser_len, rd_ser); 341 GNUNET_NAMESTORE_records_serialize(copied_elements, rd_selected, rd_ser_len, rd_ser);
@@ -366,7 +362,7 @@ handle_lookup_name_it (void *cls,
366 lnr_msg->gns_header.header.type = ntohs (GNUNET_MESSAGE_TYPE_NAMESTORE_LOOKUP_NAME_RESPONSE); 362 lnr_msg->gns_header.header.type = ntohs (GNUNET_MESSAGE_TYPE_NAMESTORE_LOOKUP_NAME_RESPONSE);
367 lnr_msg->gns_header.header.size = ntohs (r_size); 363 lnr_msg->gns_header.header.size = ntohs (r_size);
368 lnr_msg->gns_header.r_id = htonl (lnc->request_id); 364 lnr_msg->gns_header.r_id = htonl (lnc->request_id);
369 lnr_msg->rd_count = htons (rd_count); 365 lnr_msg->rd_count = htons (copied_elements);
370 lnr_msg->rd_len = htons (rd_ser_len); 366 lnr_msg->rd_len = htons (rd_ser_len);
371 lnr_msg->name_len = htons (name_len); 367 lnr_msg->name_len = htons (name_len);
372 lnr_msg->expire = GNUNET_TIME_absolute_hton(expire); 368 lnr_msg->expire = GNUNET_TIME_absolute_hton(expire);
@@ -443,8 +439,10 @@ static void handle_lookup_name (void *cls,
443 return; 439 return;
444 } 440 }
445 441
446 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking up record for name `%s' in zone `%s'\n", name, GNUNET_h2s(&ln_msg->zone)); 442 if (0 == type)
447 443 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking up all records for name `%s' in zone `%s'\n", name, GNUNET_h2s(&ln_msg->zone));
444 else
445 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Looking up records with type %u for name `%s' in zone `%s'\n", type, name, GNUNET_h2s(&ln_msg->zone));
448 /* do the actual lookup */ 446 /* do the actual lookup */
449 lnc.request_id = rid; 447 lnc.request_id = rid;
450 lnc.nc = nc; 448 lnc.nc = nc;
diff --git a/src/namestore/test_namestore_api_lookup_specific_type.c b/src/namestore/test_namestore_api_lookup_specific_type.c
new file mode 100644
index 000000000..8ffa9ca2c
--- /dev/null
+++ b/src/namestore/test_namestore_api_lookup_specific_type.c
@@ -0,0 +1,393 @@
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.c
22 * @brief testcase for namestore_api.c
23 */
24#include "platform.h"
25#include "gnunet_common.h"
26#include "gnunet_namestore_service.h"
27#include "namestore.h"
28#include "gnunet_signatures.h"
29
30#define VERBOSE GNUNET_NO
31
32#define RECORDS 5
33#define TEST_RECORD_TYPE 1234
34#define TEST_RECORD_DATALEN 123
35#define TEST_RECORD_DATA 'a'
36
37#define TEST_RECORD_LOOKUP_TYPE_NOT_EXISTING 11111
38#define TEST_RECORD_LOOKUP_TYPE_EXISTING 22222
39
40#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
41
42static struct GNUNET_NAMESTORE_Handle * nsh;
43
44static GNUNET_SCHEDULER_TaskIdentifier endbadly_task;
45static struct GNUNET_OS_Process *arm;
46
47static struct GNUNET_CRYPTO_RsaPrivateKey * privkey;
48static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey;
49struct GNUNET_CRYPTO_RsaSignature *s_signature;
50static GNUNET_HashCode s_zone;
51struct GNUNET_NAMESTORE_RecordData *s_rd;
52static char *s_name;
53
54
55
56static int res;
57
58static void
59start_arm (const char *cfgname)
60{
61 arm = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-service-arm",
62 "gnunet-service-arm", "-c", cfgname,
63#if VERBOSE_PEERS
64 "-L", "DEBUG",
65#else
66 "-L", "ERROR",
67#endif
68 NULL);
69}
70
71static void
72stop_arm ()
73{
74 if (NULL != arm)
75 {
76 if (0 != GNUNET_OS_process_kill (arm, SIGTERM))
77 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
78 GNUNET_OS_process_wait (arm);
79 GNUNET_OS_process_close (arm);
80 arm = NULL;
81 }
82}
83
84/**
85 * Re-establish the connection to the service.
86 *
87 * @param cls handle to use to re-connect.
88 * @param tc scheduler context
89 */
90static void
91endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
92{
93 if (nsh != NULL)
94 GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES);
95 nsh = NULL;
96
97 if (privkey != NULL)
98 GNUNET_CRYPTO_rsa_key_free (privkey);
99 privkey = NULL;
100
101 if (NULL != arm)
102 stop_arm();
103
104 res = 1;
105}
106
107
108static void
109end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
110{
111 if (endbadly_task != GNUNET_SCHEDULER_NO_TASK)
112 {
113 GNUNET_SCHEDULER_cancel (endbadly_task);
114 endbadly_task = GNUNET_SCHEDULER_NO_TASK;
115 }
116
117 int c;
118 for (c = 0; c < RECORDS; c++)
119 {
120 GNUNET_free_non_null((void *) s_rd[c].data);
121 }
122 GNUNET_free (s_rd);
123
124 if (privkey != NULL)
125 GNUNET_CRYPTO_rsa_key_free (privkey);
126 privkey = NULL;
127
128 if (nsh != NULL)
129 GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES);
130 nsh = NULL;
131
132 if (NULL != arm)
133 stop_arm();
134}
135
136
137void name_lookup_existing_record_type (void *cls,
138 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key,
139 struct GNUNET_TIME_Absolute expire,
140 const char *n,
141 unsigned int rd_count,
142 const struct GNUNET_NAMESTORE_RecordData *rd,
143 const struct GNUNET_CRYPTO_RsaSignature *signature)
144{
145 int failed = GNUNET_NO;
146
147 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Namestore returned %u records\n", rd_count);
148
149 if ((NULL == n) || (0 != memcmp(zone_key, &pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))))
150 {
151 GNUNET_break(0);
152 failed = GNUNET_YES;
153 }
154 if ((NULL == n) || (0 != strcmp(n, s_name)))
155 {
156 GNUNET_break(0);
157 failed = GNUNET_YES;
158 }
159 if (1 != rd_count)
160 {
161 GNUNET_break(0);
162 failed = GNUNET_YES;
163 }
164 if (NULL == rd)
165 {
166 GNUNET_break(0);
167 failed = GNUNET_YES;
168 }
169 if (NULL != signature)
170 {
171 GNUNET_break(0);
172 failed = GNUNET_YES;
173 }
174
175 if (failed == GNUNET_YES)
176 {
177 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Namestore returned invalid response\n");
178 res = 1;
179 }
180 else
181 {
182 res = 0;
183 }
184
185 GNUNET_SCHEDULER_add_now(&end, NULL);
186}
187
188
189void name_lookup_non_existing_record_type (void *cls,
190 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key,
191 struct GNUNET_TIME_Absolute expire,
192 const char *n,
193 unsigned int rd_count,
194 const struct GNUNET_NAMESTORE_RecordData *rd,
195 const struct GNUNET_CRYPTO_RsaSignature *signature)
196{
197 int failed = GNUNET_NO;
198
199 if ((NULL == zone_key) || (0 != memcmp(zone_key, &pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))))
200 {
201 GNUNET_break(0);
202 failed = GNUNET_YES;
203 }
204 if ((NULL == n) || (0 != strcmp(n, s_name)))
205 {
206 GNUNET_break(0);
207 failed = GNUNET_YES;
208 }
209 if (0 != rd_count)
210 {
211 GNUNET_break(0);
212 failed = GNUNET_YES;
213 }
214 if (NULL != rd)
215 {
216 GNUNET_break(0);
217 failed = GNUNET_YES;
218 }
219 if (NULL != signature)
220 {
221 GNUNET_break(0);
222 failed = GNUNET_YES;
223 }
224
225 if ((rd_count == 1) && (rd != NULL))
226 {
227 if (GNUNET_NO == GNUNET_NAMESTORE_records_cmp(rd, &rd[RECORDS-1]))
228 {
229 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Records are not equal!\n");
230 failed = GNUNET_YES;
231 }
232 else
233 {
234 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Records are equal!\n");
235 }
236 }
237
238 if (failed == GNUNET_YES)
239 {
240 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Namestore returned invalid response\n");
241 res = 1;
242
243 }
244 else
245 {
246 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Namestore returned valid response\n");
247 GNUNET_NAMESTORE_lookup_record (nsh, &s_zone, s_name, TEST_RECORD_LOOKUP_TYPE_EXISTING, &name_lookup_existing_record_type, NULL);
248 res = 0;
249 }
250}
251
252void
253put_cont (void *cls, int32_t success, const char *emsg)
254{
255 char * name = cls;
256
257 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name store added record for `%s': %s\n", name, (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
258 if (success == GNUNET_OK)
259 {
260 res = 0;
261 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Looking up non-existing record type %u for name `%s'\n", TEST_RECORD_LOOKUP_TYPE_NOT_EXISTING, name);
262 GNUNET_NAMESTORE_lookup_record (nsh, &s_zone, name, TEST_RECORD_LOOKUP_TYPE_NOT_EXISTING, &name_lookup_non_existing_record_type, NULL);
263 }
264 else
265 {
266 res = 1;
267 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to put records for name `%s'\n", name);
268 GNUNET_SCHEDULER_add_now(&end, NULL);
269 }
270}
271
272static struct GNUNET_NAMESTORE_RecordData *
273create_record (int count)
274{
275 int c;
276 struct GNUNET_NAMESTORE_RecordData * rd;
277 rd = GNUNET_malloc (count * sizeof (struct GNUNET_NAMESTORE_RecordData));
278
279 for (c = 0; c < RECORDS-1; c++)
280 {
281 rd[c].expiration = GNUNET_TIME_absolute_get();
282 rd[c].record_type = 1;
283 rd[c].data_size = TEST_RECORD_DATALEN;
284 rd[c].data = GNUNET_malloc(TEST_RECORD_DATALEN);
285 memset ((char *) rd[c].data, TEST_RECORD_DATA, TEST_RECORD_DATALEN);
286 }
287
288 rd[c].expiration = GNUNET_TIME_absolute_get();
289 rd[c].record_type = TEST_RECORD_LOOKUP_TYPE_EXISTING;
290 rd[c].data_size = TEST_RECORD_DATALEN;
291 rd[c].data = GNUNET_malloc(TEST_RECORD_DATALEN);
292 memset ((char *) rd[c].data, TEST_RECORD_DATA, TEST_RECORD_DATALEN);
293
294
295 return rd;
296}
297
298void
299delete_existing_db (const struct GNUNET_CONFIGURATION_Handle *cfg)
300{
301 char *afsdir;
302
303 if (GNUNET_OK ==
304 GNUNET_CONFIGURATION_get_value_filename (cfg, "namestore-sqlite",
305 "FILENAME", &afsdir))
306 {
307 if (GNUNET_OK == GNUNET_DISK_file_test (afsdir))
308 if (GNUNET_OK == GNUNET_DISK_file_test (afsdir))
309 if (GNUNET_OK == GNUNET_DISK_directory_remove(afsdir))
310 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deleted existing database `%s' \n", afsdir);
311 GNUNET_free (afsdir);
312 }
313
314}
315
316static void
317run (void *cls, char *const *args, const char *cfgfile,
318 const struct GNUNET_CONFIGURATION_Handle *cfg)
319{
320 delete_existing_db(cfg);
321 endbadly_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT,endbadly, NULL);
322
323 size_t rd_ser_len;
324
325 /* load privat key */
326 privkey = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey");
327 GNUNET_assert (privkey != NULL);
328 /* get public key */
329 GNUNET_CRYPTO_rsa_key_get_public(privkey, &pubkey);
330
331 /* create record */
332 s_name = "dummy.dummy.gnunet";
333 s_rd = create_record (RECORDS);
334
335 rd_ser_len = GNUNET_NAMESTORE_records_get_size(RECORDS, s_rd);
336 char rd_ser[rd_ser_len];
337 GNUNET_NAMESTORE_records_serialize(RECORDS, s_rd, rd_ser_len, rd_ser);
338
339 /* sign */
340 s_signature = GNUNET_NAMESTORE_create_signature(privkey, s_name, s_rd, RECORDS);
341
342 /* create random zone hash */
343 GNUNET_CRYPTO_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &s_zone);
344
345 start_arm (cfgfile);
346 GNUNET_assert (arm != NULL);
347
348 nsh = GNUNET_NAMESTORE_connect (cfg);
349 GNUNET_break (NULL != nsh);
350
351 GNUNET_break (s_rd != NULL);
352 GNUNET_break (s_name != NULL);
353
354 GNUNET_NAMESTORE_record_put (nsh, &pubkey, s_name,
355 GNUNET_TIME_absolute_get_forever(),
356 RECORDS, s_rd, s_signature, put_cont, s_name);
357
358
359
360}
361
362static int
363check ()
364{
365 static char *const argv[] = { "test-namestore-api",
366 "-c",
367 "test_namestore_api.conf",
368#if VERBOSE
369 "-L", "DEBUG",
370#endif
371 NULL
372 };
373 static struct GNUNET_GETOPT_CommandLineOption options[] = {
374 GNUNET_GETOPT_OPTION_END
375 };
376
377 res = 1;
378 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, argv, "test-namestore-api",
379 "nohelp", options, &run, &res);
380 return res;
381}
382
383int
384main (int argc, char *argv[])
385{
386 int ret;
387
388 ret = check ();
389 GNUNET_free (s_signature);
390 return ret;
391}
392
393/* end of test_namestore_api.c */