uncrustify as demanded.
[oweals/gnunet.git] / src / namecache / test_namecache_api_cache_block.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 namecache/test_namecache_api.c
22  * @brief testcase for namecache_api.c: store a record and perform a lookup
23  */
24 #include "platform.h"
25 #include "gnunet_namecache_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, 100)
36
37
38 static struct GNUNET_NAMECACHE_Handle *nsh;
39
40 static struct GNUNET_SCHEDULER_Task * 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_NAMECACHE_QueueEntry *nsqe;
49
50
51 static void
52 cleanup()
53 {
54   if (NULL != nsh)
55     {
56       GNUNET_NAMECACHE_disconnect(nsh);
57       nsh = NULL;
58     }
59   if (NULL != privkey)
60     {
61       GNUNET_free(privkey);
62       privkey = NULL;
63     }
64   GNUNET_SCHEDULER_shutdown();
65 }
66
67
68 /**
69  * Re-establish the connection to the service.
70  *
71  * @param cls handle to use to re-connect.
72  */
73 static void
74 endbadly(void *cls)
75 {
76   if (NULL != nsqe)
77     {
78       GNUNET_NAMECACHE_cancel(nsqe);
79       nsqe = NULL;
80     }
81   cleanup();
82   res = 1;
83 }
84
85
86 static void
87 end(void *cls)
88 {
89   cleanup();
90   res = 0;
91 }
92
93
94 static void
95 rd_decrypt_cb(void *cls,
96               unsigned int rd_count,
97               const struct GNUNET_GNSRECORD_Data *rd)
98 {
99   char rd_cmp_data[TEST_RECORD_DATALEN];
100
101   GNUNET_assert(1 == rd_count);
102   GNUNET_assert(NULL != rd);
103
104   memset(rd_cmp_data, 'a', TEST_RECORD_DATALEN);
105
106   GNUNET_assert(TEST_RECORD_TYPE == rd[0].record_type);
107   GNUNET_assert(TEST_RECORD_DATALEN == rd[0].data_size);
108   GNUNET_assert(0 == memcmp(&rd_cmp_data, rd[0].data, TEST_RECORD_DATALEN));
109
110   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
111              "Block was decrypted successfully \n");
112
113   GNUNET_SCHEDULER_add_now(&end, NULL);
114 }
115
116
117 static void
118 name_lookup_proc(void *cls,
119                  const struct GNUNET_GNSRECORD_Block *block)
120 {
121   const char *name = cls;
122
123   nsqe = NULL;
124
125   GNUNET_assert(NULL != cls);
126
127   if (endbadly_task != NULL)
128     {
129       GNUNET_SCHEDULER_cancel(endbadly_task);
130       endbadly_task = NULL;
131     }
132
133   if (NULL == block)
134     {
135       GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
136                  _("Namecache returned no block\n"));
137       if (NULL != endbadly_task)
138         GNUNET_SCHEDULER_cancel(endbadly_task);
139       endbadly_task = GNUNET_SCHEDULER_add_now(&endbadly, NULL);
140       return;
141     }
142
143   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
144              "Namecache returned block, decrypting \n");
145   GNUNET_assert(GNUNET_OK == GNUNET_GNSRECORD_block_decrypt(block,
146                                                             &pubkey, name, &rd_decrypt_cb, (void *)name));
147 }
148
149 static void
150 cache_cont(void *cls, int32_t success, const char *emsg)
151 {
152   const char *name = cls;
153   struct GNUNET_HashCode derived_hash;
154
155   GNUNET_assert(NULL != cls);
156
157   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
158              "Name store cached record for `%s': %s\n",
159              name,
160              (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
161
162   /* Create derived hash */
163   GNUNET_GNSRECORD_query_from_public_key(&pubkey, name, &derived_hash);
164
165   nsqe = GNUNET_NAMECACHE_lookup_block(nsh, &derived_hash,
166                                        &name_lookup_proc, (void *)name);
167 }
168
169
170 static void
171 run(void *cls,
172     const struct GNUNET_CONFIGURATION_Handle *cfg,
173     struct GNUNET_TESTING_Peer *peer)
174 {
175   struct GNUNET_GNSRECORD_Data rd;
176   struct GNUNET_GNSRECORD_Block *block;
177   char *hostkey_file;
178   const char * name = "dummy.dummy.gnunet";
179
180   endbadly_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT,
181                                                &endbadly, NULL);
182   GNUNET_asprintf(&hostkey_file,
183                   "zonefiles%s%s",
184                   DIR_SEPARATOR_STR,
185                   "N0UJMP015AFUNR2BTNM3FKPBLG38913BL8IDMCO2H0A1LIB81960.zkey");
186   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Using zonekey file `%s' \n", hostkey_file);
187   privkey = GNUNET_CRYPTO_ecdsa_key_create_from_file(hostkey_file);
188   GNUNET_free(hostkey_file);
189   GNUNET_assert(privkey != NULL);
190   GNUNET_CRYPTO_ecdsa_key_get_public(privkey, &pubkey);
191
192
193   rd.expiration_time = GNUNET_TIME_absolute_get().abs_value_us + 10000000000;
194   rd.record_type = TEST_RECORD_TYPE;
195   rd.data_size = TEST_RECORD_DATALEN;
196   rd.data = GNUNET_malloc(TEST_RECORD_DATALEN);
197   rd.flags = 0;
198   memset((char *)rd.data, 'a', TEST_RECORD_DATALEN);
199   block = GNUNET_GNSRECORD_block_create(privkey,
200                                         GNUNET_TIME_UNIT_FOREVER_ABS,
201                                         name, &rd, 1);
202   if (NULL == block)
203     {
204       GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
205                  "Namecache cannot cache no block!\n");
206       GNUNET_SCHEDULER_shutdown();
207       GNUNET_free(block);
208       return;
209     }
210
211   nsh = GNUNET_NAMECACHE_connect(cfg);
212   if (NULL == nsh)
213     {
214       GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
215                  _("Namecache cannot connect to namecache\n"));
216       GNUNET_SCHEDULER_shutdown();
217       GNUNET_free(block);
218       return;
219     }
220   GNUNET_break(NULL != nsh);
221
222   nsqe = GNUNET_NAMECACHE_block_cache(nsh,
223                                       block,
224                                       &cache_cont, (void *)name);
225   if (NULL == nsqe)
226     {
227       GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
228                  _("Namecache cannot cache no block\n"));
229     }
230   GNUNET_free(block);
231   GNUNET_free((void *)rd.data);
232 }
233
234
235 int
236 main(int argc, char *argv[])
237 {
238   GNUNET_DISK_directory_remove("/tmp/test-gnunet-namecache/");
239   res = 1;
240   if (0 !=
241       GNUNET_TESTING_service_run("test-namecache-api",
242                                  "namecache",
243                                  "test_namecache_api.conf",
244                                  &run,
245                                  NULL))
246     return 1;
247   return res;
248 }
249
250
251 /* end of test_namecache_api_cache_block.c */