- remove dead assignments
[oweals/gnunet.git] / src / testbed / test_testbed_api_testbed_run.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_testbed_api_testbed_run.c
23  * @brief Test cases for testing high-level testbed management
24  * @author Sree Harsha Totakura <sreeharsha@totakura.in>
25  */
26
27 #include "platform.h"
28 #include "gnunet_common.h"
29 #include "gnunet_testbed_service.h"
30
31 /**
32  * Number of peers we want to start
33  */
34 #define NUM_PEERS 5
35
36 /**
37  * The array of peers; we fill this as the peers are given to us by the testbed
38  */
39 static struct GNUNET_TESTBED_Peer *peers[NUM_PEERS];
40
41 /**
42  * Operation handle
43  */
44 static struct GNUNET_TESTBED_Operation *op;
45
46 /**
47  * Abort task identifier
48  */
49 static GNUNET_SCHEDULER_TaskIdentifier abort_task;
50
51 /**
52  * Current peer id
53  */
54 static unsigned int peer_id;
55
56 /**
57  * Testing result
58  */
59 static int result;
60
61 /**
62  * Should we wait forever after testbed is initialized?
63  */
64 static int wait_forever;
65
66
67 /**
68  * Shutdown nicely
69  *
70  * @param cls NULL
71  * @param tc the task context
72  */
73 static void
74 do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
75 {
76   if (GNUNET_SCHEDULER_NO_TASK != abort_task)
77     GNUNET_SCHEDULER_cancel (abort_task);
78   GNUNET_SCHEDULER_shutdown (); /* Stop scheduler to shutdown testbed run */
79 }
80
81
82 /**
83  * abort task to run on test timed out
84  *
85  * @param cls NULL
86  * @param tc the task context
87  */
88 static void
89 do_abort (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
90 {
91   GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Test timedout -- Aborting\n");
92   abort_task = GNUNET_SCHEDULER_NO_TASK;
93   (void) GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
94 }
95
96
97 /**
98  * Signature of a main function for a testcase.
99  *
100  * @param cls closure
101  * @param num_peers number of peers in 'peers'
102  * @param peers_ handle to peers run in the testbed
103  * @param links_succeeded the number of overlay link connection attempts that
104  *          succeeded
105  * @param links_failed the number of overlay link connection attempts that
106  *          failed
107  */
108 static void
109 test_master (void *cls, unsigned int num_peers,
110              struct GNUNET_TESTBED_Peer **peers_,
111              unsigned int links_succeeded,
112              unsigned int links_failed)
113 {
114   result = GNUNET_OK;
115   if (GNUNET_YES == wait_forever)
116   {
117     GNUNET_SCHEDULER_cancel (abort_task);
118     abort_task = GNUNET_SCHEDULER_NO_TASK;
119     (void) GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
120                                          &do_shutdown, NULL);
121     return;
122   }
123   GNUNET_assert (NULL != peers[0]);
124   op = GNUNET_TESTBED_peer_stop (NULL, peers[0], NULL, NULL);
125   GNUNET_assert (NULL != op);
126 }
127
128
129 /**
130  * Controller event callback
131  *
132  * @param cls NULL
133  * @param event the controller event
134  */
135 static void
136 controller_event_cb (void *cls,
137                      const struct GNUNET_TESTBED_EventInformation *event)
138 {
139
140   switch (event->type)
141   {
142   case GNUNET_TESTBED_ET_PEER_START:
143     GNUNET_assert (NULL == peers[peer_id]);
144     GNUNET_assert (NULL != event->details.peer_start.peer);
145     peers[peer_id++] = event->details.peer_start.peer;
146     break;
147   case GNUNET_TESTBED_ET_PEER_STOP:
148     GNUNET_assert (NULL != op);
149     GNUNET_TESTBED_operation_done (op);
150     GNUNET_assert (peers[0] == event->details.peer_stop.peer);
151     GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
152     break;
153   default:
154     GNUNET_assert (0);
155   }
156 }
157
158
159 /**
160  * Main run function.
161  *
162  * @param cls NULL
163  * @param args arguments passed to GNUNET_PROGRAM_run
164  * @param cfgfile the path to configuration file
165  * @param cfg the configuration file handle
166  */
167 static void
168 run (void *cls, char *const *args, const char *cfgfile,
169      const struct GNUNET_CONFIGURATION_Handle *config)
170 {
171   uint64_t event_mask;
172
173   event_mask = 0;
174   event_mask |= (1LL << GNUNET_TESTBED_ET_PEER_START);
175   event_mask |= (1LL << GNUNET_TESTBED_ET_PEER_STOP);
176   GNUNET_TESTBED_run (NULL, config, NUM_PEERS, event_mask, &controller_event_cb,
177                       NULL, &test_master, NULL);
178   abort_task =
179       GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
180                                     (GNUNET_TIME_UNIT_SECONDS, 300), &do_abort,
181                                     NULL);
182 }
183
184
185 /**
186  * Main function
187  */
188 int
189 main (int argc, char **argv)
190 {
191   char *argv2[] = {
192     "test_testbed_api_testbed_run",
193     "-c", NULL,
194     NULL
195   };
196   struct GNUNET_GETOPT_CommandLineOption options[] = {
197     GNUNET_GETOPT_OPTION_END
198   };
199   char *testname;
200   char *config_filename;
201   int ret;
202
203   if (NULL == (testname = strrchr (argv[0], (int) '_')))
204   {
205     GNUNET_break (0);
206     return 1;
207   }
208   testname++;
209   testname = GNUNET_strdup (testname);
210 #ifdef MINGW
211   {
212     char *period;
213
214     /* check and remove .exe extension */
215     period = strrchr (testname, (int) '.');
216     if (NULL != period)
217       *period = '\0';
218     else
219       GNUNET_break (0);         /* Windows with no .exe? */
220   }
221 #endif
222   if (0 == strcmp ("waitforever", testname))
223     wait_forever = GNUNET_YES;
224   if ( (GNUNET_YES != wait_forever) && (0 != strcmp ("run", testname)) )
225   {
226     GNUNET_asprintf (&config_filename, "test_testbed_api_testbed_run_%s.conf",
227                      testname);
228   }
229   else
230     config_filename = GNUNET_strdup ("test_testbed_api.conf");
231   GNUNET_free (testname);
232   argv2[2] = config_filename;
233   result = GNUNET_SYSERR;
234   ret =
235       GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2,
236                           "test_testbed_api_testbed_run", "nohelp", options,
237                           &run, NULL);
238   GNUNET_free (config_filename);
239   if ((GNUNET_OK != ret) || (GNUNET_OK != result))
240     return 1;
241   return 0;
242 }
243
244 /* end of test_testbed_api_testbed_run.c */