2 This file is part of GNUnet
3 Copyright (C) 2008--2013 Christian Grothoff (and other contributing authors)
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.
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.
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.
22 * @file testbed/test_testbed_api_barriers.c
23 * @brief testcase binary for testing testbed barriers API
24 * @author Sree Harsha Totakura <sreeharsha@totakura.in>
28 #include "gnunet_util_lib.h"
29 #include "gnunet_testbed_service.h"
30 #include "test_testbed_api_barriers.h"
36 #define LOG(type,...) \
37 GNUNET_log (type, __VA_ARGS__);
40 * Number of peers we start in this test case
48 struct GNUNET_TESTBED_Barrier *barrier;
51 * Identifier for the shutdown task
53 static struct GNUNET_SCHEDULER_Task * shutdown_task;
56 * Result of this test case
62 * Shutdown this test case when it takes too long
65 * @param tc scheduler task context
68 do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
73 GNUNET_TESTBED_barrier_cancel (barrier);
77 GNUNET_SCHEDULER_shutdown ();
82 * Functions of this type are to be given as callback argument to
83 * GNUNET_TESTBED_barrier_init(). The callback will be called when status
84 * information is available for the barrier.
86 * @param cls the closure given to GNUNET_TESTBED_barrier_init()
87 * @param name the name of the barrier
88 * @param barrier the barrier handle
89 * @param status status of the barrier; GNUNET_OK if the barrier is crossed;
90 * GNUNET_SYSERR upon error
91 * @param emsg if the status were to be GNUNET_SYSERR, this parameter has the
95 barrier_cb (void *cls,
97 struct GNUNET_TESTBED_Barrier *_barrier,
98 enum GNUNET_TESTBED_BarrierStatus status,
101 static enum GNUNET_TESTBED_BarrierStatus old_status;
103 GNUNET_assert (NULL == cls);
104 GNUNET_assert (_barrier == barrier);
107 case GNUNET_TESTBED_BARRIERSTATUS_INITIALISED:
108 LOG (GNUNET_ERROR_TYPE_INFO, "Barrier initialised\n");
111 case GNUNET_TESTBED_BARRIERSTATUS_ERROR:
112 LOG (GNUNET_ERROR_TYPE_ERROR, "Barrier initialisation failed: %s",
113 (NULL == emsg) ? "unknown reason" : emsg);
115 GNUNET_SCHEDULER_shutdown ();
117 case GNUNET_TESTBED_BARRIERSTATUS_CROSSED:
118 LOG (GNUNET_ERROR_TYPE_INFO, "Barrier crossed\n");
119 if (old_status == GNUNET_TESTBED_BARRIERSTATUS_INITIALISED)
122 GNUNET_SCHEDULER_shutdown ();
131 * Signature of a main function for a testcase.
134 * @param h the run handle
135 * @param num_peers number of peers in 'peers'
136 * @param peers_ handle to peers run in the testbed
137 * @param links_succeeded the number of overlay link connection attempts that
139 * @param links_failed the number of overlay link connection attempts that
143 test_master (void *cls,
144 struct GNUNET_TESTBED_RunHandle *h,
145 unsigned int num_peers,
146 struct GNUNET_TESTBED_Peer **peers_,
147 unsigned int links_succeeded,
148 unsigned int links_failed)
150 struct GNUNET_TESTBED_Controller *c;
152 GNUNET_assert (NULL == cls);
155 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failing test due to timeout\n");
158 GNUNET_assert (NUM_PEERS == num_peers);
159 c = GNUNET_TESTBED_run_get_controller_handle (h);
160 barrier = GNUNET_TESTBED_barrier_init (c, TEST_BARRIER_NAME, 100,
163 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
164 (GNUNET_TIME_UNIT_SECONDS,
165 10 * (NUM_PEERS + 1)),
172 * Assumed maximum path length (for the log file name).
174 #define PATH_MAX 4096
182 main (int argc, char **argv)
184 struct GNUNET_CONFIGURATION_Handle *cfg;
189 result = GNUNET_SYSERR;
191 cfg = GNUNET_CONFIGURATION_create ();
192 GNUNET_assert (GNUNET_YES ==
193 GNUNET_CONFIGURATION_parse (cfg,
194 "test_testbed_api_barriers.conf.in"));
195 if (NULL == getcwd (pwd, PATH_MAX))
197 GNUNET_assert (0 < GNUNET_asprintf (&binary, "%s/%s", pwd,
198 "gnunet-service-test-barriers"));
199 GNUNET_CONFIGURATION_set_value_string (cfg, "test-barriers","BINARY", binary);
200 GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_write
201 (cfg, "test_testbed_api_barriers.conf"));
202 GNUNET_CONFIGURATION_destroy (cfg);
204 GNUNET_free (binary);
206 (void) GNUNET_TESTBED_test_run ("test_testbed_api_barriers",
207 "test_testbed_api_barriers.conf", NUM_PEERS,
208 event_mask, NULL, NULL,
210 (void) unlink ("test_testbed_api_barriers.conf");
211 if (GNUNET_OK != result)