7d993d4d94aed8c35412c1505a6628d1ec2afbb6
[oweals/gnunet.git] / src / namestore / test_namestore_api_remove.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2013 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 /**
19  * @file namestore/test_namestore_api.c
20  * @brief testcase for namestore_api.c to: remove record
21  */
22 #include "platform.h"
23 #include "gnunet_namestore_service.h"
24 #include "gnunet_testing_lib.h"
25 #include "gnunet_dnsparser_lib.h"
26
27 #define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT
28
29 #define TEST_RECORD_DATALEN 123
30
31 #define TEST_RECORD_DATA 'a'
32
33 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 100)
34
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 int removed;
47
48 static struct GNUNET_NAMESTORE_QueueEntry *nsqe;
49
50
51 static void
52 cleanup ()
53 {
54   if (NULL != nsh)
55   {
56     GNUNET_NAMESTORE_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_NAMESTORE_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 remove_cont (void *cls,
96              int32_t success,
97              const char *emsg)
98 {
99   nsqe = NULL;
100   if (GNUNET_YES != success)
101   {
102     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
103                 _("Records could not be removed: `%s'\n"),
104                 emsg);
105     if (NULL != endbadly_task)
106       GNUNET_SCHEDULER_cancel (endbadly_task);
107     endbadly_task =  GNUNET_SCHEDULER_add_now (&endbadly,
108                                                NULL);
109     return;
110   }
111   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
112               "Records were removed, perform lookup\n");
113   removed = GNUNET_YES;
114   if (NULL != endbadly_task)
115     GNUNET_SCHEDULER_cancel (endbadly_task);
116   GNUNET_SCHEDULER_add_now (&end, NULL);
117 }
118
119
120 static void
121 put_cont (void *cls,
122           int32_t success,
123           const char *emsg)
124 {
125   const char *name = cls;
126
127   GNUNET_assert (NULL != cls);
128   if (GNUNET_SYSERR == success)
129   {
130     GNUNET_break (0);
131     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
132                 "Namestore could not store record: `%s'\n",
133                 emsg);
134     if (endbadly_task != NULL)
135       GNUNET_SCHEDULER_cancel (endbadly_task);
136     endbadly_task =  GNUNET_SCHEDULER_add_now (&endbadly, NULL);
137     return;
138   }
139
140   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
141               "Name store added record for `%s': %s\n",
142               name,
143               (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
144   nsqe = GNUNET_NAMESTORE_records_store (nsh,
145                                          privkey,
146                                          name,
147                                          0, NULL,
148                                          &remove_cont, (void *) name);
149 }
150
151
152 static void
153 run (void *cls,
154      const struct GNUNET_CONFIGURATION_Handle *cfg,
155      struct GNUNET_TESTING_Peer *peer)
156 {
157   struct GNUNET_GNSRECORD_Data rd;
158   const char * name = "dummy.dummy.gnunet";
159
160   endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
161                                                 &endbadly,
162                                                 NULL);
163   privkey = GNUNET_CRYPTO_ecdsa_key_create ();
164   GNUNET_assert (privkey != NULL);
165   GNUNET_CRYPTO_ecdsa_key_get_public (privkey,
166                                       &pubkey);
167
168   removed = GNUNET_NO;
169
170   rd.expiration_time = GNUNET_TIME_absolute_get().abs_value_us;
171   rd.record_type = TEST_RECORD_TYPE;
172   rd.data_size = TEST_RECORD_DATALEN;
173   rd.data = GNUNET_malloc (TEST_RECORD_DATALEN);
174   rd.flags = 0;
175   memset ((char *) rd.data,
176           'a',
177           TEST_RECORD_DATALEN);
178
179   nsh = GNUNET_NAMESTORE_connect (cfg);
180   GNUNET_break (NULL != nsh);
181   nsqe = GNUNET_NAMESTORE_records_store (nsh,
182                                          privkey,
183                                          name,
184                                          1,
185                                          &rd,
186                                          &put_cont,
187                                          (void *) name);
188   if (NULL == nsqe)
189   {
190     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
191               _("Namestore cannot store no block\n"));
192   }
193   GNUNET_free ((void *)rd.data);
194 }
195
196
197 int
198 main (int argc, char *argv[])
199 {
200   const char *plugin_name;
201   char *cfg_name;
202
203   plugin_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]);
204   GNUNET_asprintf (&cfg_name,
205                    "test_namestore_api_%s.conf",
206                    plugin_name);
207   GNUNET_DISK_purge_cfg_dir (cfg_name,
208                              "GNUNET_TEST_HOME");
209   res = 1;
210   if (0 !=
211       GNUNET_TESTING_peer_run ("test-namestore-api-remove",
212                                cfg_name,
213                                &run,
214                                NULL))
215   {
216     res = 1;
217   }
218   GNUNET_DISK_purge_cfg_dir (cfg_name,
219                              "GNUNET_TEST_HOME");
220   GNUNET_free (cfg_name);
221   return res;
222 }
223
224 /* end of test_namestore_api_remove.c */