- Tests did not clean up: TEST_HOME with namestore db was not removed after test
[oweals/gnunet.git] / src / namestore / test_namestore_api_lookup_nick.c
1 /*
2      This file is part of GNUnet.
3      (C) 2012 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_store.c
22  * @brief testcase for namestore_api.c: store a record
23  */
24 #include "platform.h"
25 #include "gnunet_namestore_service.h"
26 #include "gnunet_testing_lib.h"
27
28 #define TEST_RECORD_TYPE 1234
29
30 #define TEST_RECORD_DATALEN 123
31
32 #define TEST_NICK "gnunettestnick"
33
34 #define TEST_RECORD_DATA 'a'
35
36 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
37
38 static struct GNUNET_NAMESTORE_Handle *nsh;
39
40 static GNUNET_SCHEDULER_TaskIdentifier endbadly_task;
41
42 static struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
43
44 static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
45
46 static int res;
47
48 static struct GNUNET_GNSRECORD_Data rd_orig;
49
50 static struct GNUNET_NAMESTORE_QueueEntry *nsqe;
51
52 //static const char * name = "dummy.dummy.gnunet";
53 static const char * name = "d";
54
55 static char *directory;
56
57 static void
58 cleanup ()
59 {
60   GNUNET_free_non_null ((void *)rd_orig.data);
61   if (NULL != nsh)
62   {
63     GNUNET_NAMESTORE_disconnect (nsh);
64     nsh = NULL;
65   }
66   if (NULL != privkey)
67   {
68     GNUNET_free (privkey);
69     privkey = NULL;
70   }
71   if (NULL != directory)
72   {
73       GNUNET_DISK_directory_remove (directory);
74       GNUNET_free (directory);
75   }
76   GNUNET_SCHEDULER_shutdown ();
77 }
78
79
80 /**
81  * Re-establish the connection to the service.
82  *
83  * @param cls handle to use to re-connect.
84  * @param tc scheduler context
85  */
86 static void
87 endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
88 {
89   if (NULL != nsqe)
90   {
91     GNUNET_NAMESTORE_cancel (nsqe);
92     nsqe = NULL;
93   }
94   cleanup ();
95   res = 1;
96 }
97
98
99 static void
100 end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
101 {
102   cleanup ();
103   res = 0;
104 }
105
106 void lookup_it (void *cls,
107                 const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
108                 const char *label,
109                 unsigned int rd_count,
110                 const struct GNUNET_GNSRECORD_Data *rd)
111 {
112   nsqe = NULL;
113   int c;
114   int found_record = GNUNET_NO;
115   int found_nick = GNUNET_NO;
116
117   if (0 != memcmp(privkey, zone, sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)))
118   {
119     GNUNET_break(0);
120     GNUNET_SCHEDULER_cancel (endbadly_task);
121     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
122     return;
123   }
124
125   if (NULL == label)
126   {
127     GNUNET_break(0);
128     GNUNET_SCHEDULER_cancel (endbadly_task);
129     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
130     return;
131   }
132
133   if (0 != strcmp (label, name))
134   {
135     GNUNET_break(0);
136     GNUNET_SCHEDULER_cancel (endbadly_task);
137     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
138     return;
139   }
140
141   if (2 != rd_count)
142   {
143     GNUNET_break(0);
144     GNUNET_SCHEDULER_cancel (endbadly_task);
145     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
146     return;
147   }
148
149   for (c = 0; c < rd_count; c++)
150   {
151     if (GNUNET_GNSRECORD_TYPE_NICK == rd[c].record_type)
152     {
153       if (rd[c].data_size != strlen(TEST_NICK)+1)
154       {
155         GNUNET_break(0);
156         GNUNET_SCHEDULER_cancel (endbadly_task);
157         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
158         return;
159       }
160       if (0 != (rd[c].flags & GNUNET_GNSRECORD_RF_PRIVATE))
161       {
162         GNUNET_break(0);
163         GNUNET_SCHEDULER_cancel (endbadly_task);
164         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
165         return;
166       }
167       if (0 != strcmp(rd[c].data, TEST_NICK))
168       {
169         GNUNET_SCHEDULER_cancel (endbadly_task);
170         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
171         return;
172       }
173       found_nick = GNUNET_YES;
174     }
175     else
176     {
177       if (rd[c].record_type != TEST_RECORD_TYPE)
178       {
179         GNUNET_break(0);
180         GNUNET_SCHEDULER_cancel (endbadly_task);
181         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
182         return;
183       }
184       if (rd[c].data_size != TEST_RECORD_DATALEN)
185       {
186         GNUNET_break(0);
187         GNUNET_SCHEDULER_cancel (endbadly_task);
188         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
189         return;
190       }
191       if (0 != memcmp (rd[c].data, rd_orig.data, TEST_RECORD_DATALEN))
192       {
193         GNUNET_break(0);
194         GNUNET_SCHEDULER_cancel (endbadly_task);
195         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
196         return;
197       }
198       if (rd[c].flags != rd->flags)
199       {
200         GNUNET_break(0);
201         GNUNET_SCHEDULER_cancel (endbadly_task);
202         endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL );
203         return;
204       }
205       found_record = GNUNET_YES;
206     }
207
208   }
209
210   /* Done */
211   if ((GNUNET_YES == found_nick) && (GNUNET_YES == found_record))
212   {
213     GNUNET_SCHEDULER_cancel (endbadly_task);
214     endbadly_task = GNUNET_SCHEDULER_NO_TASK;
215     GNUNET_SCHEDULER_add_now (&end, NULL );
216   }
217   else
218   {
219     GNUNET_break (0);
220     GNUNET_SCHEDULER_cancel (endbadly_task);
221     endbadly_task = GNUNET_SCHEDULER_NO_TASK;
222     GNUNET_SCHEDULER_add_now (&endbadly, NULL );
223   }
224 }
225
226
227 static void
228 put_cont (void *cls, int32_t success, const char *emsg)
229 {
230   const char *name = cls;
231
232   nsqe = NULL;
233   GNUNET_assert (NULL != cls);
234   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
235               "Name store added record for `%s': %s\n",
236               name,
237               (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
238
239   if (GNUNET_OK != success)
240   {
241     GNUNET_SCHEDULER_cancel (endbadly_task);
242     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
243     return;
244   }
245   /* Lookup */
246   nsqe = GNUNET_NAMESTORE_records_lookup (nsh, privkey, name, lookup_it, NULL);
247 }
248
249 static void
250 nick_cont (void *cls, int32_t success, const char *emsg)
251 {
252   const char *name = cls;
253
254   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
255               "Nick added : %s\n",
256               (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
257
258   rd_orig.expiration_time = GNUNET_TIME_absolute_get().abs_value_us;
259   rd_orig.record_type = TEST_RECORD_TYPE;
260   rd_orig.data_size = TEST_RECORD_DATALEN;
261   rd_orig.data = GNUNET_malloc (TEST_RECORD_DATALEN);
262   rd_orig.flags = 0;
263   memset ((char *) rd_orig.data, 'a', TEST_RECORD_DATALEN);
264
265   nsqe = GNUNET_NAMESTORE_records_store (nsh, privkey, name,
266                                       1, &rd_orig, &put_cont, (void *) name);
267 }
268
269
270 static void
271 run (void *cls,
272      const struct GNUNET_CONFIGURATION_Handle *cfg,
273      struct GNUNET_TESTING_Peer *peer)
274 {
275   char *hostkey_file;
276
277   directory = NULL;
278   GNUNET_CONFIGURATION_get_value_string(cfg, "PATHS", "GNUNET_TEST_HOME", &directory);
279
280   endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
281                                                 &endbadly, NULL);
282   GNUNET_asprintf (&hostkey_file,
283                    "zonefiles%s%s",
284                    DIR_SEPARATOR_STR,
285                    "N0UJMP015AFUNR2BTNM3FKPBLG38913BL8IDMCO2H0A1LIB81960.zkey");
286   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Using zonekey file `%s' \n", hostkey_file);
287   privkey = GNUNET_CRYPTO_ecdsa_key_create_from_file (hostkey_file);
288   GNUNET_free (hostkey_file);
289   GNUNET_assert (privkey != NULL);
290   GNUNET_CRYPTO_ecdsa_key_get_public (privkey, &pubkey);
291
292   nsh = GNUNET_NAMESTORE_connect (cfg);
293   GNUNET_break (NULL != nsh);
294
295   nsqe = GNUNET_NAMESTORE_set_nick (nsh, privkey, TEST_NICK, &nick_cont, (void *) name);
296   if (NULL == nsqe)
297   {
298     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
299               _("Namestore cannot store no block\n"));
300   }
301 }
302
303
304 int
305 main (int argc, char *argv[])
306 {
307   res = 1;
308   if (0 !=
309       GNUNET_TESTING_peer_run ("test-namestore-api",
310                                "test_namestore_api.conf",
311                                &run,
312                                NULL))
313     return 1;
314   return res;
315 }
316
317
318 /* end of test_namestore_api_store.c */