continue to fix extract result
[oweals/gnunet.git] / src / dht / test_dht_api.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2009, 2015 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 dht/test_dht_api.c
22  * @brief base test case for dht api
23  *
24  * This test case tests DHT api to DUMMY DHT service communication.
25  */
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
28 #include "gnunet_hello_lib.h"
29 #include "gnunet_testing_lib.h"
30 #include "gnunet_dht_service.h"
31
32
33 /**
34  * How long until we really give up on a particular testcase portion?
35  */
36 #define TOTAL_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 600)
37
38 /**
39  * How long until we give up on any particular operation (and retry)?
40  */
41 #define BASE_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
42
43 #define MTYPE 12345
44
45
46 struct RetryContext
47 {
48   /**
49    * When to really abort the operation.
50    */
51   struct GNUNET_TIME_Absolute real_timeout;
52
53   /**
54    * What timeout to set for the current attempt (increases)
55    */
56   struct GNUNET_TIME_Relative next_timeout;
57
58   /**
59    * The task identifier of the retry task, so it can be cancelled.
60    */
61   struct GNUNET_SCHEDULER_Task * retry_task;
62
63 };
64
65
66 static struct GNUNET_DHT_Handle *dht_handle;
67
68 static struct GNUNET_DHT_GetHandle *get_handle;
69
70 struct RetryContext retry_context;
71
72 static int ok = 1;
73
74 static struct GNUNET_SCHEDULER_Task * die_task;
75
76
77 #if VERBOSE
78 #define OKPP do { ok++; FPRINTF (stderr, "Now at stage %u at %s:%u\n", ok, __FILE__, __LINE__); } while (0)
79 #else
80 #define OKPP do { ok++; } while (0)
81 #endif
82
83
84 static void
85 end (void *cls)
86 {
87   GNUNET_SCHEDULER_cancel (die_task);
88   die_task = NULL;
89   GNUNET_DHT_disconnect (dht_handle);
90   dht_handle = NULL;
91   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
92               "DHT disconnected, returning success!\n");
93   ok = 0;
94 }
95
96
97 static void
98 end_badly ()
99 {
100   /* do work here */
101   FPRINTF (stderr, "%s",  "Ending on an unhappy note.\n");
102   if (get_handle != NULL)
103   {
104     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping get request!\n");
105     GNUNET_DHT_get_stop (get_handle);
106   }
107   if (retry_context.retry_task != NULL)
108     GNUNET_SCHEDULER_cancel (retry_context.retry_task);
109   GNUNET_DHT_disconnect (dht_handle);
110   dht_handle = NULL;
111   ok = 1;
112 }
113
114
115 /**
116  * Signature of the main function of a task.
117  *
118  * @param cls closure
119  */
120 static void
121 test_get_stop (void *cls)
122 {
123   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
124               "Called test_get_stop!\n");
125   GNUNET_assert (NULL != dht_handle);
126   GNUNET_DHT_get_stop (get_handle);
127   get_handle = NULL;
128   GNUNET_SCHEDULER_add_now (&end, NULL);
129 }
130
131
132 static void
133 test_get_iterator (void *cls, struct GNUNET_TIME_Absolute exp,
134                    const struct GNUNET_HashCode * key,
135                    const struct GNUNET_PeerIdentity *get_path,
136                    unsigned int get_path_length,
137                    const struct GNUNET_PeerIdentity *put_path,
138                    unsigned int put_path_length,
139                    enum GNUNET_BLOCK_Type type,
140                    size_t size, const void *data)
141 {
142   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
143               "test_get_iterator called (we got a result), stopping get request!\n");
144   GNUNET_SCHEDULER_add_now (&test_get_stop,
145                             NULL);
146 }
147
148
149 /**
150  * Signature of the main function of a task.
151  *
152  * @param cls closure
153  * @param success result of PUT
154  */
155 static void
156 test_get (void *cls, int success)
157 {
158   struct GNUNET_HashCode hash;
159
160   memset (&hash,
161           42,
162           sizeof (struct GNUNET_HashCode));
163
164   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
165               "Called test_get!\n");
166   GNUNET_assert (dht_handle != NULL);
167   retry_context.real_timeout = GNUNET_TIME_relative_to_absolute (TOTAL_TIMEOUT);
168   retry_context.next_timeout = BASE_TIMEOUT;
169
170   get_handle =
171       GNUNET_DHT_get_start (dht_handle,
172                             GNUNET_BLOCK_TYPE_TEST, &hash, 1,
173                             GNUNET_DHT_RO_NONE, NULL, 0, &test_get_iterator,
174                             NULL);
175
176   if (get_handle == NULL)
177   {
178     GNUNET_break (0);
179     GNUNET_SCHEDULER_cancel (die_task);
180     die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL);
181     return;
182   }
183 }
184
185
186 static void
187 run (void *cls,
188      const struct GNUNET_CONFIGURATION_Handle *cfg,
189      struct GNUNET_TESTING_Peer *peer)
190 {
191   struct GNUNET_HashCode hash;
192   char *data;
193   size_t data_size = 42;
194
195   GNUNET_assert (ok == 1);
196   OKPP;
197   die_task =
198       GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
199                                     (GNUNET_TIME_UNIT_MINUTES, 1), &end_badly,
200                                     NULL);
201
202
203   memset (&hash, 42, sizeof (struct GNUNET_HashCode));
204   data = GNUNET_malloc (data_size);
205   memset (data, 43, data_size);
206   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Called test_put!\n");
207   dht_handle = GNUNET_DHT_connect (cfg, 100);
208   GNUNET_assert (dht_handle != NULL);
209   GNUNET_DHT_put (dht_handle, &hash, 1, GNUNET_DHT_RO_NONE,
210                   GNUNET_BLOCK_TYPE_TEST, data_size, data,
211                   GNUNET_TIME_relative_to_absolute (TOTAL_TIMEOUT),
212                   TOTAL_TIMEOUT, &test_get, NULL);
213   GNUNET_free (data);
214 }
215
216
217 int
218 main (int argc, char *argv[])
219 {
220   if (0 != GNUNET_TESTING_peer_run ("test-dht-api",
221                                     "test_dht_api_data.conf",
222                                     &run, NULL))
223     return 1;
224   return ok;
225 }
226
227 /* end of test_dht_api.c */