test porting
[oweals/gnunet.git] / src / gns / test_gns_simple_shorten.c
1 /*
2      This file is part of GNUnet.
3      (C) 2009 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 gns/test_gns_simple_shorten.c
22  * @brief basic shorten test for gns api
23  *
24  */
25 #include "platform.h"
26 #include "gnunet_testing_lib-new.h"
27 #include "gnunet_core_service.h"
28 #include "block_dns.h"
29 #include "gnunet_signatures.h"
30 #include "gnunet_namestore_service.h"
31 #include "../namestore/namestore.h"
32 #include "gnunet_dnsparser_lib.h"
33 #include "gnunet_gns_service.h"
34
35 /* DEFINES */
36 #define VERBOSE GNUNET_YES
37
38 /* Timeout for entire testcase */
39 #define TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 20)
40
41 /* If number of peers not in config file, use this number */
42 #define DEFAULT_NUM_PEERS 2
43
44 /* test records to resolve */
45 #define TEST_DOMAIN "www.alice.bob.gnunet"
46 #define TEST_IP "127.0.0.1"
47 #define TEST_RECORD_NAME "www"
48
49 #define TEST_AUTHORITY_BOB "bob"
50 #define TEST_AUTHORITY_ALICE "alice"
51 #define TEST_ALICE_PSEU "carol"
52 #define TEST_EXPECTED_RESULT "www.carol.gnunet"
53
54 #define KEYFILE_BOB "../namestore/zonefiles/HGU0A0VCU334DN7F2I9UIUMVQMM7JMSD142LIMNUGTTV9R0CF4EG.zkey"
55 #define KEYFILE_ALICE "../namestore/zonefiles/N0UJMP015AFUNR2BTNM3FKPBLG38913BL8IDMCO2H0A1LIB81960.zkey"
56
57
58 /* Task handle to use to schedule test failure */
59 GNUNET_SCHEDULER_TaskIdentifier die_task;
60
61 /* Global return value (0 for success, anything else for failure) */
62 static int ok;
63
64 static struct GNUNET_NAMESTORE_Handle *namestore_handle;
65
66 static struct GNUNET_GNS_Handle *gns_handle;
67
68 const struct GNUNET_CONFIGURATION_Handle *cfg;
69
70 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded priv_pkey;
71 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded short_pkey;
72 struct GNUNET_CRYPTO_RsaPrivateKey *priv_key;
73 struct GNUNET_CRYPTO_RsaPrivateKey *short_key;
74
75 struct GNUNET_CRYPTO_ShortHashCode priv_zone;
76 struct GNUNET_CRYPTO_ShortHashCode short_zone;
77
78 /**
79  * Called when gns shorten finishes
80  */
81 static void
82 process_shorten_result(void* cls, const char* sname)
83 {
84   GNUNET_GNS_disconnect(gns_handle);
85
86
87   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
88               "Disconnecting from namestore\n");
89   GNUNET_NAMESTORE_disconnect (namestore_handle);
90   ok = 0;
91
92   if (sname == NULL)
93   {
94     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
95                 "Shorten test failed!\n");
96     ok = 1;
97   }
98   else
99   {
100     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
101                 "%s shortened to %s\n", (char*)cls, sname);
102     if (0 != strcmp(sname, TEST_EXPECTED_RESULT))
103     {
104       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
105                   "Shorten test failed! (wanted: %s got: %s\n",
106                   (char*)cls, sname);
107       ok = 1;
108     }
109
110     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shorten test succeeded!\n");
111     ok = 0;
112   }
113
114   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutting down peer!\n");
115   GNUNET_SCHEDULER_shutdown ();
116 }
117
118 /**
119  * Function scheduled to be run on the successful start of services
120  * tries to shorten the name TEST_DOMAIN using gns
121  */
122 static void
123 commence_testing (void *cls, int32_t success, const char *emsg)
124 {
125   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
126               "Connecting to gns\n");
127   gns_handle = GNUNET_GNS_connect(cfg);
128   if (NULL == gns_handle)
129   {
130     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
131                 "Failed to connect to gns\n");
132     ok = 1;
133     return;
134   }
135
136   GNUNET_assert (NULL != GNUNET_GNS_shorten (gns_handle, TEST_DOMAIN,
137                       &priv_zone,
138                       &short_zone,
139                       &process_shorten_result,
140                       TEST_DOMAIN));
141 }
142
143
144 /**
145  * Check if the get_handle is being used, if so stop the request.  Either
146  * way, schedule the end_badly_cont function which actually shuts down the
147  * test.
148  */
149 static void
150 end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
151 {
152   ok = 1;
153 }
154
155
156 void do_check (void *cls,
157               const struct GNUNET_CONFIGURATION_Handle *ccfg,
158               struct GNUNET_TESTING_Peer *peer)
159 {
160   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded our_pkey;
161   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded alice_pkey;
162   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded bob_pkey;
163   struct GNUNET_CRYPTO_RsaPrivateKey *our_key;
164   struct GNUNET_CRYPTO_RsaPrivateKey *alice_key;
165   struct GNUNET_CRYPTO_RsaPrivateKey *bob_key;
166   struct GNUNET_CRYPTO_ShortHashCode bob_hash;
167   struct GNUNET_CRYPTO_ShortHashCode alice_hash;
168   struct GNUNET_CRYPTO_RsaSignature *sig;
169   char* our_keyfile;
170   char* private_keyfile;
171   char* shorten_keyfile;
172
173   cfg = ccfg;
174   die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL);
175   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Running test\n");
176
177
178   /* put records into namestore */
179   namestore_handle = GNUNET_NAMESTORE_connect(cfg);
180   if (NULL == namestore_handle)
181   {
182     GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to connect to namestore\n");
183     ok = -1;
184     return;
185   }
186
187   if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns",
188                                                           "ZONEKEY",
189                                                           &our_keyfile))
190   {
191     GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to get key from cfg\n");
192     ok = -1;
193     return;
194   }
195   
196   if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns",
197                                                             "SHORTEN_ZONEKEY",
198                                                             &shorten_keyfile))
199   {
200     GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
201                "Failed to get shorten zone key from cfg\n");
202     ok = -1;
203     return;
204   }
205   
206   if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns",
207                                                             "PRIVATE_ZONEKEY",
208                                                             &private_keyfile))
209   {
210     GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
211                "Failed to get private zone key from cfg\n");
212     ok = -1;
213     return;
214   }
215
216   our_key = GNUNET_CRYPTO_rsa_key_create_from_file (our_keyfile);
217   GNUNET_free(our_keyfile);
218
219   bob_key = GNUNET_CRYPTO_rsa_key_create_from_file (KEYFILE_BOB);
220   alice_key = GNUNET_CRYPTO_rsa_key_create_from_file (KEYFILE_ALICE);
221   priv_key = GNUNET_CRYPTO_rsa_key_create_from_file (private_keyfile);
222   short_key = GNUNET_CRYPTO_rsa_key_create_from_file (shorten_keyfile);
223
224   GNUNET_free(shorten_keyfile);
225   GNUNET_free(private_keyfile);
226   
227   GNUNET_CRYPTO_rsa_key_get_public (our_key, &our_pkey);
228   GNUNET_CRYPTO_rsa_key_get_public (alice_key, &alice_pkey);
229   GNUNET_CRYPTO_rsa_key_get_public (bob_key, &bob_pkey);
230   GNUNET_CRYPTO_rsa_key_get_public (priv_key, &priv_pkey);
231   GNUNET_CRYPTO_rsa_key_get_public (short_key, &short_pkey);
232
233   GNUNET_CRYPTO_short_hash(&priv_pkey, sizeof(priv_pkey), &priv_zone);
234   GNUNET_CRYPTO_short_hash(&short_pkey, sizeof(short_pkey), &short_zone);
235
236   struct GNUNET_NAMESTORE_RecordData rd;
237   char* ip = TEST_IP;
238   struct in_addr *web = GNUNET_malloc(sizeof(struct in_addr));
239   rd.expiration_time = UINT64_MAX;
240   GNUNET_assert(1 == inet_pton (AF_INET, ip, web));
241   
242   GNUNET_CRYPTO_short_hash(&bob_pkey, sizeof(bob_pkey), &bob_hash);
243
244   rd.data_size = sizeof(struct GNUNET_CRYPTO_ShortHashCode);
245   rd.data = &bob_hash;
246   rd.record_type = GNUNET_GNS_RECORD_PKEY;
247   rd.flags = GNUNET_NAMESTORE_RF_AUTHORITY;
248   
249   /* put bob into our zone */
250   GNUNET_NAMESTORE_record_create (namestore_handle,
251                                   our_key,
252                                   TEST_AUTHORITY_BOB,
253                                   &rd,
254                                   NULL,
255                                   NULL);
256   
257   /* put alice into bobs zone */
258   GNUNET_CRYPTO_short_hash(&alice_pkey, sizeof(alice_pkey), &alice_hash);
259   rd.data = &alice_hash;
260   sig = GNUNET_NAMESTORE_create_signature(bob_key,
261                                           GNUNET_TIME_UNIT_FOREVER_ABS,
262                                           TEST_AUTHORITY_ALICE,
263                                           &rd, 1);
264
265   GNUNET_NAMESTORE_record_put (namestore_handle,
266                                &bob_pkey,
267                                TEST_AUTHORITY_ALICE,
268                                GNUNET_TIME_UNIT_FOREVER_ABS,
269                                1,
270                                &rd,
271                                sig,
272                                NULL,
273                                NULL);
274   GNUNET_free(sig);
275   /* put www A record and PSEU into alice's zone */
276
277   rd.data_size = sizeof(struct in_addr);
278   rd.data = web;
279   rd.record_type = GNUNET_DNSPARSER_TYPE_A;
280   sig = GNUNET_NAMESTORE_create_signature(alice_key,
281                                           GNUNET_TIME_UNIT_FOREVER_ABS,
282                                           TEST_RECORD_NAME,
283                                           &rd, 1);
284
285   GNUNET_NAMESTORE_record_put (namestore_handle,
286                                &alice_pkey,
287                                TEST_RECORD_NAME,
288                                GNUNET_TIME_UNIT_FOREVER_ABS,
289                                1,
290                                &rd,
291                                sig,
292                                NULL,
293                                NULL);
294   
295   rd.data_size = sizeof(struct GNUNET_CRYPTO_ShortHashCode);
296   rd.data = &alice_hash;
297   rd.record_type = GNUNET_GNS_RECORD_PKEY;
298   GNUNET_free(sig);
299
300   GNUNET_NAMESTORE_record_create (namestore_handle,
301                                our_key,
302                                TEST_ALICE_PSEU,
303                                &rd,
304                                &commence_testing,
305                                NULL);
306
307   GNUNET_free(web);
308   GNUNET_CRYPTO_rsa_key_free(our_key);
309   GNUNET_CRYPTO_rsa_key_free(bob_key);
310   GNUNET_CRYPTO_rsa_key_free(alice_key);
311   GNUNET_CRYPTO_rsa_key_free(priv_key);
312   GNUNET_CRYPTO_rsa_key_free(short_key);
313
314 }
315
316 int
317 main (int argc, char *argv[])
318 {
319   ok = 1;
320
321   GNUNET_log_setup ("test-gns-simple-shorten",
322 #if VERBOSE
323                     "DEBUG",
324 #else
325                     "WARNING",
326 #endif
327                     NULL);
328
329   GNUNET_TESTING_peer_run ("test-gns-simple-shorten", "test_gns_simple_lookup.conf", &do_check, NULL);
330
331   return ok;
332 }
333
334 /* end of test_gns_twopeer.c */