aboutsummaryrefslogtreecommitdiff
path: root/src/namestore/test_namestore_api_remove.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-03-01 16:17:42 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-03-01 16:17:42 +0000
commit9121b5fdbb38b5ee48695edf5c45bfca1eeb0a29 (patch)
tree4f068c748a15f56427bab8669ec4b16a75d8f67c /src/namestore/test_namestore_api_remove.c
parent95fe108b12cbc93c5e4ea6504931b5c3239ff4c5 (diff)
downloadgnunet-9121b5fdbb38b5ee48695edf5c45bfca1eeb0a29.tar.gz
gnunet-9121b5fdbb38b5ee48695edf5c45bfca1eeb0a29.zip
- more changes: sign & verify working and tested
Diffstat (limited to 'src/namestore/test_namestore_api_remove.c')
-rw-r--r--src/namestore/test_namestore_api_remove.c343
1 files changed, 343 insertions, 0 deletions
diff --git a/src/namestore/test_namestore_api_remove.c b/src/namestore/test_namestore_api_remove.c
new file mode 100644
index 000000000..69e9d34f3
--- /dev/null
+++ b/src/namestore/test_namestore_api_remove.c
@@ -0,0 +1,343 @@
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_REMOVE_RECORD_TYPE 4321
38#define TEST_REMOVE_RECORD_DATALEN 255
39#define TEST_REMOVE_RECORD_DATA 'b'
40
41#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
42
43static struct GNUNET_NAMESTORE_Handle * nsh;
44
45static GNUNET_SCHEDULER_TaskIdentifier endbadly_task;
46static struct GNUNET_OS_Process *arm;
47
48static struct GNUNET_CRYPTO_RsaPrivateKey * privkey;
49static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey;
50struct GNUNET_CRYPTO_RsaSignature s_signature;
51static GNUNET_HashCode s_zone;
52struct GNUNET_NAMESTORE_RecordData *s_rd;
53static char *s_name;
54
55
56
57static int res;
58
59static void
60start_arm (const char *cfgname)
61{
62 arm = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-service-arm",
63 "gnunet-service-arm", "-c", cfgname,
64#if VERBOSE_PEERS
65 "-L", "DEBUG",
66#else
67 "-L", "ERROR",
68#endif
69 NULL);
70}
71
72static void
73stop_arm ()
74{
75 if (NULL != arm)
76 {
77 if (0 != GNUNET_OS_process_kill (arm, SIGTERM))
78 GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
79 GNUNET_OS_process_wait (arm);
80 GNUNET_OS_process_close (arm);
81 arm = NULL;
82 }
83}
84
85/**
86 * Re-establish the connection to the service.
87 *
88 * @param cls handle to use to re-connect.
89 * @param tc scheduler context
90 */
91static void
92endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
93{
94 if (nsh != NULL)
95 GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES);
96 nsh = NULL;
97
98 if (privkey != NULL)
99 GNUNET_CRYPTO_rsa_key_free (privkey);
100 privkey = NULL;
101
102 if (NULL != arm)
103 stop_arm();
104
105 res = 1;
106}
107
108
109static void
110end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
111{
112 if (endbadly_task != GNUNET_SCHEDULER_NO_TASK)
113 {
114 GNUNET_SCHEDULER_cancel (endbadly_task);
115 endbadly_task = GNUNET_SCHEDULER_NO_TASK;
116 }
117
118 int c;
119 for (c = 0; c < RECORDS; c++)
120 GNUNET_free_non_null((void *) s_rd[c].data);
121 GNUNET_free (s_rd);
122
123 if (privkey != NULL)
124 GNUNET_CRYPTO_rsa_key_free (privkey);
125 privkey = NULL;
126
127 if (nsh != NULL)
128 GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES);
129 nsh = NULL;
130
131 if (NULL != arm)
132 stop_arm();
133}
134
135void name_lookup_proc (void *cls,
136 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key,
137 struct GNUNET_TIME_Absolute expire,
138 const char *n,
139 unsigned int rd_count,
140 const struct GNUNET_NAMESTORE_RecordData *rd,
141 const struct GNUNET_CRYPTO_RsaSignature *signature)
142{
143 static int found = GNUNET_NO;
144 int failed = GNUNET_NO;
145 int c;
146
147 if (n != NULL)
148 {
149 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Lookup for name `%s' returned %u records\n", n, rd_count);
150 if (0 != memcmp (zone_key, &pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded)))
151 {
152 GNUNET_break (0);
153 failed = GNUNET_YES;
154 }
155
156 if (0 != strcmp(n, s_name))
157 {
158 GNUNET_break (0);
159 failed = GNUNET_YES;
160 }
161
162 if (RECORDS-1 != rd_count)
163 {
164 GNUNET_break (0);
165 failed = GNUNET_YES;
166 }
167
168 for (c = 0; c < rd_count; c++)
169 {
170 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Record [%u]: type: %u, size %u\n", c, rd[c].record_type, rd[c].data_size);
171 GNUNET_break (rd[c].expiration.abs_value == s_rd[c+1].expiration.abs_value);
172 GNUNET_break (rd[c].record_type == TEST_RECORD_TYPE);
173 GNUNET_break (rd[c].data_size == TEST_RECORD_DATALEN);
174 GNUNET_break (0 == memcmp (rd[c].data, s_rd[c+1].data, TEST_RECORD_DATALEN));
175 }
176
177 found = GNUNET_YES;
178 if (failed == GNUNET_NO)
179 res = 0;
180 else
181 res = 1;
182 }
183 else
184 {
185 if (found != GNUNET_YES)
186 {
187 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to lookup records for name `%s'\n", s_name);
188 res = 1;
189 }
190 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Lookup done for name %s'\n", s_name);
191 }
192 GNUNET_SCHEDULER_add_now(&end, NULL);
193}
194
195void
196remove_cont (void *cls, int32_t success, const char *emsg)
197{
198 char *name = cls;
199 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Remove record for `%s': %s\n", name, (success == GNUNET_YES) ? "SUCCESS" : "FAIL", emsg);
200 if (success == GNUNET_OK)
201 {
202 res = 0;
203 GNUNET_NAMESTORE_lookup_record (nsh, &s_zone, name, 0, &name_lookup_proc, name);
204 }
205 else
206 {
207 res = 1;
208 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to put records for name `%s'\n", name);
209 GNUNET_SCHEDULER_add_now(&end, NULL);
210 }
211
212}
213
214void
215put_cont (void *cls, int32_t success, const char *emsg)
216{
217 char *name = cls;
218 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name store added record for `%s': %s\n", name, (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
219 if (success == GNUNET_OK)
220 {
221 res = 0;
222 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing record for `%s'\n", name);
223
224 GNUNET_NAMESTORE_record_remove (nsh, privkey, name, &s_rd[0], &remove_cont, name);
225 }
226 else
227 {
228 res = 1;
229 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to put records for name `%s'\n", name);
230 GNUNET_SCHEDULER_add_now(&end, NULL);
231 }
232}
233
234static struct GNUNET_NAMESTORE_RecordData *
235create_record (int count)
236{
237 int c;
238 struct GNUNET_NAMESTORE_RecordData * rd;
239 rd = GNUNET_malloc (count * sizeof (struct GNUNET_NAMESTORE_RecordData));
240
241 rd[0].expiration = GNUNET_TIME_absolute_get();
242 rd[0].record_type = 0;
243 rd[0].data_size = TEST_REMOVE_RECORD_DATALEN;
244 rd[0].data = GNUNET_malloc(TEST_RECORD_DATALEN);
245 memset ((char *) rd[0].data, TEST_RECORD_DATA, TEST_RECORD_DATALEN);
246
247
248 for (c = 1; c < RECORDS; c++)
249 {
250 rd[c].expiration = GNUNET_TIME_absolute_get();
251 rd[c].record_type = TEST_RECORD_TYPE;
252 rd[c].data_size = TEST_RECORD_DATALEN;
253 rd[c].data = GNUNET_malloc(TEST_RECORD_DATALEN);
254 memset ((char *) rd[c].data, TEST_RECORD_DATA, TEST_RECORD_DATALEN);
255 }
256
257 return rd;
258}
259
260static void
261run (void *cls, char *const *args, const char *cfgfile,
262 const struct GNUNET_CONFIGURATION_Handle *cfg)
263{
264 endbadly_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT,endbadly, NULL);
265 size_t rd_ser_len;
266
267 /* load privat key */
268 privkey = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey");
269 GNUNET_assert (privkey != NULL);
270 /* get public key */
271 GNUNET_CRYPTO_rsa_key_get_public(privkey, &pubkey);
272
273 /* create record */
274 s_name = "dummy.dummy.gnunet";
275 s_rd = create_record (RECORDS);
276
277 rd_ser_len = GNUNET_NAMESTORE_records_get_size(RECORDS, s_rd);
278 char rd_ser[rd_ser_len];
279 GNUNET_NAMESTORE_records_serialize(RECORDS, s_rd, rd_ser_len, rd_ser);
280
281 /* sign */
282 struct GNUNET_CRYPTO_RsaSignaturePurpose *sig_purpose = GNUNET_malloc(sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) + rd_ser_len);
283 sig_purpose->size = htonl (sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose)+ rd_ser_len);
284 sig_purpose->purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
285 memcpy (&sig_purpose[1], rd_ser, rd_ser_len);
286 GNUNET_CRYPTO_rsa_sign (privkey, sig_purpose, &s_signature);
287 GNUNET_free (sig_purpose);
288
289 /* create random zone hash */
290 GNUNET_CRYPTO_hash (&pubkey, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &s_zone);
291
292 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Name: `%s' Zone: `%s' \n", s_name, GNUNET_h2s_full(&s_zone));
293
294
295 start_arm (cfgfile);
296 GNUNET_assert (arm != NULL);
297
298 nsh = GNUNET_NAMESTORE_connect (cfg);
299 GNUNET_break (NULL != nsh);
300
301
302
303 GNUNET_break (s_rd != NULL);
304 GNUNET_break (s_name != NULL);
305
306 GNUNET_NAMESTORE_record_put (nsh, &pubkey, s_name,
307 GNUNET_TIME_absolute_get_forever(),
308 RECORDS, s_rd, &s_signature, put_cont, s_name);
309
310}
311
312static int
313check ()
314{
315 static char *const argv[] = { "test-namestore-api",
316 "-c",
317 "test_namestore_api.conf",
318#if VERBOSE
319 "-L", "DEBUG",
320#endif
321 NULL
322 };
323 static struct GNUNET_GETOPT_CommandLineOption options[] = {
324 GNUNET_GETOPT_OPTION_END
325 };
326
327 res = 1;
328 GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, argv, "test-namestore-api",
329 "nohelp", options, &run, &res);
330 return res;
331}
332
333int
334main (int argc, char *argv[])
335{
336 int ret;
337
338 ret = check ();
339
340 return ret;
341}
342
343/* end of test_namestore_api.c */