-fix channel data range to make -1 legal value
[oweals/gnunet.git] / src / testbed / test_gnunet_helper_testbed.c
1 /*
2       This file is part of GNUnet
3       (C) 2008--2013 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 /**
22  * @file testbed/test_gnunet_helper_testbed.c
23  * @brief Testcase for testing gnunet-helper-testbed.c
24  * @author Sree Harsha Totakura <sreeharsha@totakura.in>
25  */
26
27 #include "platform.h"
28 #include "gnunet_util_lib.h"
29 #include "gnunet_testbed_service.h"
30 #include <zlib.h>
31
32 #include "testbed_api.h"
33 #include "testbed_helper.h"
34 #include "testbed_api_hosts.h"
35
36 /**
37  * Generic logging shortcut
38  */
39 #define LOG(kind,...)                           \
40   GNUNET_log (kind, __VA_ARGS__)
41
42
43 /**
44  * Handle to the helper process
45  */
46 static struct GNUNET_HELPER_Handle *helper;
47
48 /**
49  * Message to helper
50  */
51 static struct GNUNET_TESTBED_HelperInit *msg;
52
53 /**
54  * Message send handle
55  */
56 static struct GNUNET_HELPER_SendHandle *shandle;
57
58 /**
59  * Abort task identifier
60  */
61 static GNUNET_SCHEDULER_TaskIdentifier abort_task;
62
63 /**
64  * Shutdown task identifier
65  */
66 static GNUNET_SCHEDULER_TaskIdentifier shutdown_task;
67
68 /**
69  * Configuratin handler
70  */
71 static struct GNUNET_CONFIGURATION_Handle *cfg;
72
73 /**
74  * Global testing status
75  */
76 static int result;
77
78
79 /**
80  * Shutdown nicely
81  *
82  * @param cls NULL
83  * @param tc the task context
84  */
85 static void
86 do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
87 {
88   if (GNUNET_SCHEDULER_NO_TASK != abort_task)
89     GNUNET_SCHEDULER_cancel (abort_task);
90   if (NULL != helper)
91     GNUNET_HELPER_stop (helper, GNUNET_NO);
92   GNUNET_free_non_null (msg);
93   if (NULL != cfg)
94     GNUNET_CONFIGURATION_destroy (cfg);
95 }
96
97
98 /**
99  * abort task to run on test timed out
100  *
101  * @param cls NULL
102  * @param tc the task context
103  */
104 static void
105 do_abort (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
106 {
107   abort_task = GNUNET_SCHEDULER_NO_TASK;
108   LOG (GNUNET_ERROR_TYPE_WARNING, "Test timedout -- Aborting\n");
109   result = GNUNET_SYSERR;
110   if (NULL != shandle)
111     GNUNET_HELPER_send_cancel (shandle);
112   if (GNUNET_SCHEDULER_NO_TASK == shutdown_task)
113     shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
114 }
115
116
117 /**
118  * Continuation function.
119  *
120  * @param cls closure
121  * @param result GNUNET_OK on success,
122  *               GNUNET_NO if helper process died
123  *               GNUNET_SYSERR during GNUNET_HELPER_stop
124  */
125 static void
126 cont_cb (void *cls, int result)
127 {
128   shandle = NULL;
129   LOG (GNUNET_ERROR_TYPE_DEBUG, "Message sent\n");
130   GNUNET_assert (GNUNET_OK == result);
131 }
132
133
134 /**
135  * Functions with this signature are called whenever a
136  * complete message is received by the tokenizer.
137  *
138  * Do not call GNUNET_SERVER_mst_destroy in callback
139  *
140  * @param cls closure
141  * @param client identification of the client
142  * @param message the actual message
143  *
144  * @return GNUNET_OK on success, GNUNET_SYSERR to stop further processing
145  */
146 static int
147 mst_cb (void *cls, void *client, const struct GNUNET_MessageHeader *message)
148 {
149   const struct GNUNET_TESTBED_HelperReply *msg;
150   char *config;
151   uLongf config_size;
152   uLongf xconfig_size;
153
154   msg = (const struct GNUNET_TESTBED_HelperReply *) message;
155   config_size = 0;
156   xconfig_size = 0;
157   GNUNET_assert (sizeof (struct GNUNET_TESTBED_HelperReply) <
158                  ntohs (msg->header.size));
159   GNUNET_assert (GNUNET_MESSAGE_TYPE_TESTBED_HELPER_REPLY ==
160                  ntohs (msg->header.type));
161   config_size = (uLongf) ntohs (msg->config_size);
162   xconfig_size =
163       (uLongf) (ntohs (msg->header.size) -
164                 sizeof (struct GNUNET_TESTBED_HelperReply));
165   config = GNUNET_malloc (config_size);
166   GNUNET_assert (Z_OK ==
167                  uncompress ((Bytef *) config, &config_size,
168                              (const Bytef *) &msg[1], xconfig_size));
169   GNUNET_free (config);
170   if (GNUNET_SCHEDULER_NO_TASK == shutdown_task)
171     shutdown_task =
172         GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
173                                       (GNUNET_TIME_UNIT_SECONDS, 1),
174                                       &do_shutdown, NULL);
175   return GNUNET_OK;
176 }
177
178
179 /**
180  * Callback that will be called when the helper process dies. This is not called
181  * when the helper process is stoped using GNUNET_HELPER_stop()
182  *
183  * @param cls the closure from GNUNET_HELPER_start()
184  */
185 static void
186 exp_cb (void *cls)
187 {
188   helper = NULL;
189   result = GNUNET_SYSERR;
190 }
191
192
193 /**
194  * Main function that will be run.
195  *
196  * @param cls closure
197  * @param args remaining command-line arguments
198  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
199  * @param cfg configuration
200  */
201 static void
202 run (void *cls, char *const *args, const char *cfgfile,
203      const struct GNUNET_CONFIGURATION_Handle *cfg2)
204 {
205   static char *const binary_argv[] = {
206     "gnunet-helper-testbed",
207     NULL
208   };
209   const char *trusted_ip = "127.0.0.1";
210
211   helper =
212       GNUNET_HELPER_start (GNUNET_YES, "gnunet-helper-testbed", binary_argv,
213                            &mst_cb, &exp_cb, NULL);
214   GNUNET_assert (NULL != helper);
215   cfg = GNUNET_CONFIGURATION_dup (cfg2);
216   msg = GNUNET_TESTBED_create_helper_init_msg_ (trusted_ip, NULL, cfg);
217   shandle =
218       GNUNET_HELPER_send (helper, &msg->header, GNUNET_NO, &cont_cb, NULL);
219   GNUNET_assert (NULL != shandle);
220   abort_task =
221       GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
222                                     (GNUNET_TIME_UNIT_MINUTES, 1), &do_abort,
223                                     NULL);
224 }
225
226
227 /**
228  * Main function
229  *
230  * @param argc the number of command line arguments
231  * @param argv command line arg array
232  * @return return code
233  */
234 int
235 main (int argc, char **argv)
236 {
237   struct GNUNET_GETOPT_CommandLineOption options[] = {
238     GNUNET_GETOPT_OPTION_END
239   };
240
241   result = GNUNET_OK;
242   if (GNUNET_OK !=
243       GNUNET_PROGRAM_run (argc, argv, "test_gnunet_helper_testbed",
244                           "Testcase for testing gnunet-helper-testbed.c",
245                           options, &run, NULL))
246     return 1;
247   return (GNUNET_OK == result) ? 0 : 1;
248 }
249
250 /* end of test_gnunet_helper_testbed.c */