X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Ftest_testbed_api_test.c;h=94e94cc372096b76060f0f362faed11722e07ed7;hb=27c12911f4f2aba2d90099270d70de846e83854f;hp=e93c5872adfaca63e95e727e4c195f454eb3691d;hpb=a58166f25e49799aa9a4a5447f857f59e6a3a828;p=oweals%2Fgnunet.git diff --git a/src/testbed/test_testbed_api_test.c b/src/testbed/test_testbed_api_test.c index e93c5872a..94e94cc37 100644 --- a/src/testbed/test_testbed_api_test.c +++ b/src/testbed/test_testbed_api_test.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2008--2012 Christian Grothoff (and other contributing authors) + (C) 2008--2013 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -25,9 +25,16 @@ */ #include "platform.h" -#include "gnunet_common.h" +#include "gnunet_util_lib.h" #include "gnunet_testbed_service.h" + +/** + * Generic logging shortcut + */ +#define LOG(kind,...) \ + GNUNET_log (kind, __VA_ARGS__) + /** * Number of peers we want to start */ @@ -43,6 +50,16 @@ static struct GNUNET_TESTBED_Peer **peers; */ static struct GNUNET_TESTBED_Operation *op; +/** + * Abort task identifier + */ +static GNUNET_SCHEDULER_TaskIdentifier abort_task; + +/** + * shutdown task identifier + */ +static GNUNET_SCHEDULER_TaskIdentifier shutdown_task; + /** * Testing result */ @@ -58,9 +75,46 @@ static int result; static void do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { + shutdown_task = GNUNET_SCHEDULER_NO_TASK; + if (GNUNET_SCHEDULER_NO_TASK != abort_task) + GNUNET_SCHEDULER_cancel (abort_task); + if (NULL != op) + GNUNET_TESTBED_operation_done (op); GNUNET_SCHEDULER_shutdown (); } +/** + * shortcut to exit during failure + */ +#define FAIL_TEST(cond) do { \ + if (!(cond)) { \ + GNUNET_break(0); \ + if (GNUNET_SCHEDULER_NO_TASK != abort_task) \ + GNUNET_SCHEDULER_cancel (abort_task); \ + abort_task = GNUNET_SCHEDULER_NO_TASK; \ + if (GNUNET_SCHEDULER_NO_TASK == shutdown_task) \ + shutdown_task = GNUNET_SCHEDULER_add_now (do_shutdown, NULL); \ + return; \ + } \ + } while (0) + + +/** + * abort task to run on test timed out + * + * @param cls NULL + * @param tc the task context + */ +static void +do_abort (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + LOG (GNUNET_ERROR_TYPE_WARNING, "Test timedout -- Aborting\n"); + abort_task = GNUNET_SCHEDULER_NO_TASK; + if (GNUNET_SCHEDULER_NO_TASK != shutdown_task) + GNUNET_SCHEDULER_cancel (shutdown_task); + do_shutdown (cls, tc); +} + /** * Callback to be called when the requested peer information is available @@ -71,19 +125,20 @@ do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * @param emsg error message if the operation has failed; will be NULL if the * operation is successfull */ -static void +static void peerinfo_cb (void *cb_cls, struct GNUNET_TESTBED_Operation *op_, - const struct GNUNET_TESTBED_PeerInformation *pinfo, - const char *emsg) + const struct GNUNET_TESTBED_PeerInformation *pinfo, + const char *emsg) { - GNUNET_assert (op == op_); - GNUNET_assert (NULL == cb_cls); - GNUNET_assert (NULL == emsg); - GNUNET_assert (GNUNET_TESTBED_PIT_IDENTITY == pinfo->pit); - GNUNET_assert (NULL != pinfo->result.id); + FAIL_TEST (op == op_); + FAIL_TEST (NULL == cb_cls); + FAIL_TEST (NULL == emsg); + FAIL_TEST (GNUNET_TESTBED_PIT_IDENTITY == pinfo->pit); + FAIL_TEST (NULL != pinfo->result.id); GNUNET_TESTBED_operation_done (op); + op = NULL; result = GNUNET_OK; - GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); } @@ -95,16 +150,20 @@ peerinfo_cb (void *cb_cls, struct GNUNET_TESTBED_Operation *op_, * @param emsg error message in case the operation has failed; will be NULL if * operation has executed successfully. */ -static void +static void op_comp_cb (void *cls, struct GNUNET_TESTBED_Operation *op_, const char *emsg) { - GNUNET_assert (NULL == cls); - GNUNET_assert (op == op_); - GNUNET_assert (NULL == emsg); + FAIL_TEST (NULL == cls); + FAIL_TEST (op == op_); + if (NULL != emsg) + { + LOG (GNUNET_ERROR_TYPE_WARNING, "%s\n", emsg); + FAIL_TEST (0); + } GNUNET_TESTBED_operation_done (op); op = GNUNET_TESTBED_peer_get_information (peers[0], - GNUNET_TESTBED_PIT_IDENTITY, - &peerinfo_cb, NULL); + GNUNET_TESTBED_PIT_IDENTITY, + &peerinfo_cb, NULL); } @@ -121,12 +180,12 @@ controller_event_cb (void *cls, switch (event->type) { case GNUNET_TESTBED_ET_CONNECT: - GNUNET_assert (event->details.peer_connect.peer1 == peers[0]); - GNUNET_assert (event->details.peer_connect.peer2 == peers[1]); + FAIL_TEST (event->details.peer_connect.peer1 == peers[0]); + FAIL_TEST (event->details.peer_connect.peer2 == peers[1]); break; default: - GNUNET_assert (0); - } + FAIL_TEST (0); + } } @@ -134,22 +193,36 @@ controller_event_cb (void *cls, * 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 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, unsigned int num_peers, - struct GNUNET_TESTBED_Peer **peers_) +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); - GNUNET_assert (NUM_PEERS == num_peers); - GNUNET_assert (NULL != peers_); + FAIL_TEST (NULL == cls); + FAIL_TEST (NUM_PEERS == num_peers); + FAIL_TEST (NULL != peers_); for (peer = 0; peer < num_peers; peer++) - GNUNET_assert (NULL != peers_[peer]); + FAIL_TEST (NULL != peers_[peer]); peers = peers_; - op = GNUNET_TESTBED_overlay_connect (NULL, &op_comp_cb, NULL, peers[0], peers[1]); + op = GNUNET_TESTBED_overlay_connect (NULL, &op_comp_cb, NULL, peers[0], + peers[1]); + abort_task = + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_MINUTES, 3), &do_abort, + NULL); } @@ -165,9 +238,10 @@ main (int argc, char **argv) event_mask = 0; event_mask |= (1LL << GNUNET_TESTBED_ET_CONNECT); event_mask |= (1LL << GNUNET_TESTBED_ET_OPERATION_FINISHED); - GNUNET_TESTBED_test_run ("test_testbed_api_test", "test_testbed_api.conf", - NUM_PEERS, event_mask, &controller_event_cb, NULL, - &test_master, NULL); + (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;