error handling
[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 it
6      under the terms of the GNU Affero General Public License as published
7      by the Free Software Foundation, either version 3 of the License,
8      or (at your 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      Affero General Public License for more details.
14
15      You should have received a copy of the GNU Affero General Public License
16      along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
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 #include "gnunet_dnsparser_lib.h"
28
29 #define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT
30
31 #define TEST_RECORD_DATALEN 123
32
33 #define TEST_RECORD_DATA 'a'
34
35 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
36
37 static struct GNUNET_NAMESTORE_Handle *nsh;
38
39 static struct GNUNET_SCHEDULER_Task *endbadly_task;
40
41 static struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey;
42
43 static struct GNUNET_CRYPTO_EcdsaPublicKey pubkey;
44
45 static int res;
46
47 static struct GNUNET_NAMESTORE_QueueEntry *nsqe;
48
49 // static const char * name = "dummy.dummy.gnunet";
50 static const char *name = "d";
51
52
53 static void
54 cleanup ()
55 {
56   if (NULL != nsh)
57   {
58     GNUNET_NAMESTORE_disconnect (nsh);
59     nsh = NULL;
60   }
61   if (NULL != privkey)
62   {
63     GNUNET_free (privkey);
64     privkey = NULL;
65   }
66   GNUNET_SCHEDULER_shutdown ();
67 }
68
69
70 /**
71  * Re-establish the connection to the service.
72  *
73  * @param cls handle to use to re-connect.
74  */
75 static void
76 endbadly (void *cls)
77 {
78   endbadly_task = NULL;
79   if (NULL != nsqe)
80   {
81     GNUNET_NAMESTORE_cancel (nsqe);
82     nsqe = NULL;
83   }
84   cleanup ();
85   res = 1;
86 }
87
88
89 static void
90 end (void *cls)
91 {
92   cleanup ();
93   res = 0;
94 }
95
96
97 static void
98 lookup_it (void *cls,
99            const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone,
100            const char *label,
101            unsigned int rd_count,
102            const struct GNUNET_GNSRECORD_Data *rd)
103 {
104   nsqe = NULL;
105
106   if (0 != GNUNET_memcmp (privkey,
107                           zone))
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 #include "test_common.c"
226
227
228 int
229 main (int argc, char *argv[])
230 {
231   const char *plugin_name;
232   char *cfg_name;
233
234   SETUP_CFG (plugin_name, cfg_name);
235   res = 1;
236   if (0 !=
237       GNUNET_TESTING_peer_run ("test-namestore-api-lookup-private",
238                                cfg_name,
239                                &run,
240                                NULL))
241   {
242     res = 1;
243   }
244   GNUNET_DISK_purge_cfg_dir (cfg_name,
245                              "GNUNET_TEST_HOME");
246   GNUNET_free (cfg_name);
247   return res;
248 }
249
250
251 /* end of test_namestore_api_lookup_private.c */