reduce loop counters to more practical levels
[oweals/gnunet.git] / src / namestore / test_namestore_api_lookup_private.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2012 GNUnet e.V.
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., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, 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_RECORD_DATA 'a'
33
34 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
35
36 static struct GNUNET_NAMESTORE_Handle *nsh;
37
38 static struct GNUNET_SCHEDULER_Task * endbadly_task;
39
40 static struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
41
42 static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
43
44 static int res;
45
46 static struct GNUNET_NAMESTORE_QueueEntry *nsqe;
47
48 //static const char * name = "dummy.dummy.gnunet";
49 static const char * name = "d";
50
51
52 static void
53 cleanup ()
54 {
55   if (NULL != nsh)
56   {
57     GNUNET_NAMESTORE_disconnect (nsh);
58     nsh = NULL;
59   }
60   if (NULL != privkey)
61   {
62     GNUNET_free (privkey);
63     privkey = NULL;
64   }
65   GNUNET_SCHEDULER_shutdown ();
66 }
67
68
69 /**
70  * Re-establish the connection to the service.
71  *
72  * @param cls handle to use to re-connect.
73  */
74 static void
75 endbadly (void *cls)
76 {
77   endbadly_task = NULL;
78   if (NULL != nsqe)
79   {
80     GNUNET_NAMESTORE_cancel (nsqe);
81     nsqe = NULL;
82   }
83   cleanup ();
84   res = 1;
85 }
86
87
88 static void
89 end (void *cls)
90 {
91   cleanup ();
92   res = 0;
93 }
94
95
96 static void
97 lookup_it (void *cls,
98            const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
99            const char *label,
100            unsigned int rd_count,
101            const struct GNUNET_GNSRECORD_Data *rd)
102 {
103   nsqe = NULL;
104
105   if (0 != memcmp (privkey,
106                    zone,
107                    sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey)))
108   {
109     GNUNET_break(0);
110     GNUNET_SCHEDULER_cancel (endbadly_task);
111     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
112     return;
113   }
114
115
116   if (NULL == label)
117   {
118     GNUNET_break(0);
119     GNUNET_SCHEDULER_cancel (endbadly_task);
120     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
121     return;
122   }
123
124   if (0 != strcmp (label, name))
125   {
126     GNUNET_break(0);
127     GNUNET_SCHEDULER_cancel (endbadly_task);
128     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
129     return;
130   }
131
132   if (1 != rd_count)
133   {
134     GNUNET_break(0);
135     GNUNET_SCHEDULER_cancel (endbadly_task);
136     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
137     return;
138   }
139
140   /* Done */
141   GNUNET_SCHEDULER_cancel (endbadly_task);
142   endbadly_task = NULL;
143   GNUNET_SCHEDULER_add_now (&end, NULL);
144 }
145
146
147 static void
148 fail_cb (void *cls)
149 {
150   GNUNET_assert (0);
151 }
152
153
154 static void
155 put_cont (void *cls,
156           int32_t success,
157           const char *emsg)
158 {
159   const char *name = cls;
160
161   nsqe = NULL;
162   GNUNET_assert (NULL != cls);
163   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
164               "Name store added record for `%s': %s\n",
165               name,
166               (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
167
168   if (GNUNET_OK != success)
169   {
170     GNUNET_SCHEDULER_cancel (endbadly_task);
171     endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
172     return;
173   }
174   /* Lookup */
175   nsqe = GNUNET_NAMESTORE_records_lookup (nsh,
176                                           privkey,
177                                           name,
178                                           &fail_cb,
179                                           NULL,
180                                           &lookup_it,
181                                           NULL);
182 }
183
184
185 static void
186 run (void *cls,
187      const struct GNUNET_CONFIGURATION_Handle *cfg,
188      struct GNUNET_TESTING_Peer *peer)
189 {
190   struct GNUNET_GNSRECORD_Data rd;
191
192   endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
193                                                 &endbadly,
194                                                 NULL);
195   privkey = GNUNET_CRYPTO_ecdsa_key_create ();
196   GNUNET_assert (privkey != NULL);
197   GNUNET_CRYPTO_ecdsa_key_get_public (privkey, &pubkey);
198
199   rd.expiration_time = GNUNET_TIME_absolute_get().abs_value_us;
200   rd.record_type = TEST_RECORD_TYPE;
201   rd.data_size = TEST_RECORD_DATALEN;
202   rd.data = GNUNET_malloc (TEST_RECORD_DATALEN);
203   rd.flags = 0;
204   memset ((char *) rd.data, 'a', TEST_RECORD_DATALEN);
205
206   nsh = GNUNET_NAMESTORE_connect (cfg);
207   GNUNET_break (NULL != nsh);
208   nsqe = GNUNET_NAMESTORE_records_store (nsh,
209                                          privkey,
210                                          name,
211                                          1,
212                                          &rd,
213                                          &put_cont,
214                                          (void *) name);
215   if (NULL == nsqe)
216   {
217     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
218               _("Namestore cannot store no block\n"));
219   }
220
221   GNUNET_free ((void *)rd.data);
222 }
223
224
225 int
226 main (int argc, char *argv[])
227 {
228   const char *plugin_name;
229   char *cfg_name;
230
231   plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
232   GNUNET_asprintf (&cfg_name,
233                    "test_namestore_api_%s.conf",
234                    plugin_name);
235   GNUNET_DISK_purge_cfg_dir (cfg_name,
236                              "GNUNET_TEST_HOME");
237   res = 1;
238   if (0 !=
239       GNUNET_TESTING_peer_run ("test-namestore-api-lookup-private",
240                                cfg_name,
241                                &run,
242                                NULL))
243   {
244     res = 1;
245   }
246   GNUNET_DISK_purge_cfg_dir (cfg_name,
247                              "GNUNET_TEST_HOME");
248   GNUNET_free (cfg_name);
249   return res;
250 }
251
252
253 /* end of test_namestore_api_lookup_private.c */