/* This file is part of GNUnet Copyright (C) 2008--2013 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. */ /** * @file src/testbed/test_testbed_api_topology.c * @brief testing cases for testing high level testbed api helper functions * @author Sree Harsha Totakura */ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_testbed_service.h" /** * Number of peers we want to start */ #define NUM_PEERS 10 /** * Array of peers */ static struct GNUNET_TESTBED_Peer **peers; /** * Operation handle */ static struct GNUNET_TESTBED_Operation *op; /** * Shutdown task */ static struct GNUNET_SCHEDULER_Task * shutdown_task; /** * Testing result */ static int result; /** * Counter for counting overlay connections */ static unsigned int overlay_connects; /** * Shutdown nicely * * @param cls NULL */ static void do_shutdown (void *cls) { shutdown_task = NULL; if (NULL != op) { GNUNET_TESTBED_operation_done (op); op = NULL; } GNUNET_SCHEDULER_shutdown (); } /** * Controller event callback * * @param cls NULL * @param event the controller event */ static void controller_event_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) { switch (event->type) { case GNUNET_TESTBED_ET_CONNECT: overlay_connects++; if ((NUM_PEERS * (NUM_PEERS - 1)) == overlay_connects) { result = GNUNET_OK; GNUNET_SCHEDULER_cancel (shutdown_task); shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); } break; case GNUNET_TESTBED_ET_OPERATION_FINISHED: GNUNET_assert (NULL != event->details.operation_finished.emsg); break; default: GNUNET_break (0); result = GNUNET_SYSERR; GNUNET_SCHEDULER_cancel (shutdown_task); shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); } } /** * Signature of a main function for a testcase. * * @param cls closure * @param h the run handle * @param num_peers number of peers in 'peers' * @param peers_ handle to peers run in the testbed * @param links_succeeded the number of overlay link connection attempts that * succeeded * @param links_failed the number of overlay link connection attempts that * failed */ static void test_master (void *cls, struct GNUNET_TESTBED_RunHandle *h, unsigned int num_peers, struct GNUNET_TESTBED_Peer **peers_, unsigned int links_succeeded, unsigned int links_failed) { unsigned int peer; GNUNET_assert (NULL == cls); if (NULL == peers_) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failing test due to timeout\n"); return; } GNUNET_assert (NUM_PEERS == num_peers); for (peer = 0; peer < num_peers; peer++) GNUNET_assert (NULL != peers_[peer]); peers = peers_; overlay_connects = 0; op = GNUNET_TESTBED_overlay_configure_topology (NULL, NUM_PEERS, peers, NULL, NULL, NULL, GNUNET_TESTBED_TOPOLOGY_CLIQUE, /* GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI, */ /* NUM_PEERS, */ GNUNET_TESTBED_TOPOLOGY_OPTION_END); GNUNET_assert (NULL != op); shutdown_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300), do_shutdown, NULL); } /** * Main function */ int main (int argc, char **argv) { uint64_t event_mask; result = GNUNET_SYSERR; event_mask = 0; event_mask |= (1LL << GNUNET_TESTBED_ET_CONNECT); event_mask |= (1LL << GNUNET_TESTBED_ET_OPERATION_FINISHED); (void) GNUNET_TESTBED_test_run ("test_testbed_api_test", "test_testbed_api.conf", NUM_PEERS, event_mask, &controller_event_cb, NULL, &test_master, NULL); if (GNUNET_OK != result) return 1; return 0; } /* end of test_testbed_api_topology.c */