X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftestbed%2Ftest_testbed_api_controllerlink.c;h=16a3f7b916657fde00066551c29ce4ace35cb1e3;hb=d17a17ea785f91c18b5694eab3372c4e4564d95e;hp=030b65117eb4c6733455383a7e46673fc5126217;hpb=e5853128ecf0bd76956f54175ae755006aa56682;p=oweals%2Fgnunet.git diff --git a/src/testbed/test_testbed_api_controllerlink.c b/src/testbed/test_testbed_api_controllerlink.c index 030b65117..16a3f7b91 100644 --- a/src/testbed/test_testbed_api_controllerlink.c +++ b/src/testbed/test_testbed_api_controllerlink.c @@ -1,21 +1,21 @@ /* This file is part of GNUnet - (C) 2008--2013 Christian Grothoff (and other contributing authors) + 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 General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. + 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 - General Public License for more details. + Affero General Public License for more details. - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later */ /** @@ -45,21 +45,18 @@ /** * Generic logging shortcut */ -#define LOG(kind,...) \ - GNUNET_log (kind, __VA_ARGS__) +#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__) /** * Debug logging shorthand */ -#define LOG_DEBUG(...) \ - LOG(GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__) +#define LOG_DEBUG(...) LOG (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__) /** * Different stages in testing */ enum Stage { - /** * Initial stage */ @@ -181,7 +178,12 @@ enum Stage SLAVE3_LINK_SUCCESS, /** - * Destory master peer and mark test as success + * Master peer destoryed. Destory slave 3 peer + */ + MASTER_PEER_DESTROY_SUCCESS, + + /** + * Slave 3 peer destroyed. Mark test as success */ SUCCESS, @@ -239,7 +241,7 @@ static struct GNUNET_CONFIGURATION_Handle *cfg3; /** * Abort task */ -static GNUNET_SCHEDULER_TaskIdentifier abort_task; +static struct GNUNET_SCHEDULER_Task *abort_task; /** * Operation handle for linking controllers @@ -269,17 +271,17 @@ static struct GNUNET_TESTBED_Peer *master_peer; /** * The handle for whether a host is habitable or not */ -struct GNUNET_TESTBED_HostHabitableCheckHandle *hc_handle; +static struct GNUNET_TESTBED_HostHabitableCheckHandle *hc_handle; /** * The task handle for the delay task */ -GNUNET_SCHEDULER_TaskIdentifier delay_task_id; +static struct GNUNET_SCHEDULER_Task *delay_task_id; /** * Event mask */ -uint64_t event_mask; +static uint64_t event_mask; /** * Global testing status @@ -289,15 +291,18 @@ static enum Stage result; /** * 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; \ - GNUNET_SCHEDULER_add_now (do_shutdown, NULL); \ - return; \ - } \ +#define FAIL_TEST(cond) \ + do \ + { \ + if (! (cond)) \ + { \ + GNUNET_break (0); \ + if (NULL != abort_task) \ + GNUNET_SCHEDULER_cancel (abort_task); \ + abort_task = NULL; \ + GNUNET_SCHEDULER_shutdown (); \ + return; \ + } \ } while (0) @@ -305,20 +310,24 @@ static enum Stage result; * Shutdown nicely * * @param cls NULL - * @param tc the task context */ static void -do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +do_shutdown (void *cls) { - if (GNUNET_SCHEDULER_NO_TASK != abort_task) + if (NULL != abort_task) GNUNET_SCHEDULER_cancel (abort_task); - if (GNUNET_SCHEDULER_NO_TASK != delay_task_id) + if (NULL != delay_task_id) { GNUNET_SCHEDULER_cancel (delay_task_id); - delay_task_id = GNUNET_SCHEDULER_NO_TASK; + delay_task_id = NULL; } if (NULL != hc_handle) GNUNET_TESTBED_is_host_habitable_cancel (hc_handle); + if (NULL != op) + { + GNUNET_TESTBED_operation_done (op); + op = NULL; + } if (NULL != mc) GNUNET_TESTBED_controller_disconnect (mc); if (NULL != cp) @@ -344,14 +353,13 @@ do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) * 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) +do_abort (void *cls) { - LOG (GNUNET_ERROR_TYPE_WARNING, "Aborting\n"); - abort_task = GNUNET_SCHEDULER_NO_TASK; - do_shutdown (cls, tc); + LOG (GNUNET_ERROR_TYPE_WARNING, "Aborting in stage %d\n", result); + abort_task = NULL; + GNUNET_SCHEDULER_shutdown (); } @@ -364,7 +372,7 @@ do_abort (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) static void do_abort_now (void *cls) { - if (GNUNET_SCHEDULER_NO_TASK != abort_task) + if (NULL != abort_task) GNUNET_SCHEDULER_cancel (abort_task); abort_task = GNUNET_SCHEDULER_add_now (&do_abort, NULL); } @@ -387,23 +395,26 @@ registration_cont (void *cls, const char *emsg); * @return */ static void -delay_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +delay_task (void *cls) { - delay_task_id = GNUNET_SCHEDULER_NO_TASK; + delay_task_id = NULL; switch (result) { case SLAVE2_PEER_CREATE_SUCCESS: op = GNUNET_TESTBED_peer_stop (NULL, slave1_peer, NULL, NULL); FAIL_TEST (NULL != op); break; + case MASTER_SLAVE2_PEERS_CONNECTED: slave3 = GNUNET_TESTBED_host_create_with_id (3, "127.0.0.1", NULL, cfg, 0); rh = GNUNET_TESTBED_register_host (mc, slave3, ®istration_cont, NULL); break; + case SLAVE2_SLAVE3_PEERS_CONNECTED: op = GNUNET_TESTBED_peer_stop (NULL, slave2_peer, NULL, NULL); FAIL_TEST (NULL != op); break; + default: FAIL_TEST (0); } @@ -432,28 +443,32 @@ peer_create_cb (void *cls, struct GNUNET_TESTBED_Peer *peer, const char *emsg) GNUNET_TESTBED_operation_done (op); op = GNUNET_TESTBED_peer_start (NULL, master_peer, NULL, NULL); break; + case SLAVE1_LINK_SUCCESS: result = SLAVE1_PEER_CREATE_SUCCESS; slave1_peer = peer; GNUNET_TESTBED_operation_done (op); op = GNUNET_TESTBED_peer_start (NULL, slave1_peer, NULL, NULL); break; + case SLAVE2_LINK_SUCCESS: result = SLAVE2_PEER_CREATE_SUCCESS; slave2_peer = peer; GNUNET_TESTBED_operation_done (op); - delay_task_id = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, 1), - &delay_task, - NULL); - break; + op = NULL; + delay_task_id = GNUNET_SCHEDULER_add_delayed ( + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), + &delay_task, + NULL); + return; + case SLAVE3_STARTED: result = SLAVE3_PEER_CREATE_SUCCESS; slave3_peer = peer; GNUNET_TESTBED_operation_done (op); op = GNUNET_TESTBED_peer_start (NULL, slave3_peer, NULL, NULL); break; + default: FAIL_TEST (0); } @@ -501,6 +516,7 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) op = GNUNET_TESTBED_peer_create (mc, slave, cfg, peer_create_cb, NULL); FAIL_TEST (NULL != op); break; + case SLAVE1_PEER_START_SUCCESS: check_operation_success (event); GNUNET_TESTBED_operation_done (op); @@ -508,26 +524,29 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) op = GNUNET_TESTBED_peer_create (mc, slave2, cfg, peer_create_cb, NULL); FAIL_TEST (NULL != op); break; + case MASTER_PEER_CREATE_SUCCESS: FAIL_TEST (GNUNET_TESTBED_ET_PEER_START == event->type); FAIL_TEST (event->details.peer_start.host == host); FAIL_TEST (event->details.peer_start.peer == master_peer); GNUNET_TESTBED_operation_done (op); + op = NULL; result = MASTER_PEER_START_SUCCESS; slave = GNUNET_TESTBED_host_create_with_id (1, "127.0.0.1", NULL, cfg, 0); FAIL_TEST (NULL != slave); rh = GNUNET_TESTBED_register_host (mc, slave, ®istration_cont, NULL); FAIL_TEST (NULL != rh); break; + case SLAVE1_PEER_CREATE_SUCCESS: FAIL_TEST (GNUNET_TESTBED_ET_PEER_START == event->type); FAIL_TEST (event->details.peer_start.host == slave); FAIL_TEST (event->details.peer_start.peer == slave1_peer); GNUNET_TESTBED_operation_done (op); result = SLAVE1_PEER_START_SUCCESS; - op = GNUNET_TESTBED_controller_link (NULL, mc, slave2, slave, cfg, - GNUNET_YES); + op = GNUNET_TESTBED_controller_link (NULL, mc, slave2, slave, GNUNET_YES); break; + case SLAVE2_PEER_CREATE_SUCCESS: FAIL_TEST (GNUNET_TESTBED_ET_PEER_STOP == event->type); FAIL_TEST (event->details.peer_stop.peer == slave1_peer); @@ -536,16 +555,20 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) op = GNUNET_TESTBED_peer_start (NULL, slave2_peer, NULL, NULL); FAIL_TEST (NULL != op); break; + case SLAVE3_PEER_CREATE_SUCCESS: FAIL_TEST (GNUNET_TESTBED_ET_PEER_START == event->type); FAIL_TEST (event->details.peer_start.host == slave3); FAIL_TEST (event->details.peer_start.peer == slave3_peer); GNUNET_TESTBED_operation_done (op); result = SLAVE3_PEER_START_SUCCESS; - op = GNUNET_TESTBED_overlay_connect (mc, NULL, NULL, slave2_peer, - slave3_peer); + sleep (1); + LOG_DEBUG ("**************************************\n"); + op = + GNUNET_TESTBED_overlay_connect (mc, NULL, NULL, slave2_peer, slave3_peer); FAIL_TEST (NULL != op); break; + case SLAVE3_PEER_START_SUCCESS: FAIL_TEST (NULL != event); FAIL_TEST (GNUNET_TESTBED_ET_CONNECT == event->type); @@ -554,20 +577,22 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) result = SLAVE2_SLAVE3_PEERS_CONNECTED; GNUNET_TESTBED_operation_done (op); op = NULL; - delay_task_id = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, 1), &delay_task, - NULL); + delay_task_id = GNUNET_SCHEDULER_add_delayed ( + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), + &delay_task, + NULL); break; + case SLAVE1_PEER_STOP_SUCCESS: FAIL_TEST (GNUNET_TESTBED_ET_PEER_START == event->type); FAIL_TEST (event->details.peer_start.host == slave2); FAIL_TEST (event->details.peer_start.peer == slave2_peer); GNUNET_TESTBED_operation_done (op); result = SLAVE2_PEER_START_SUCCESS; - op = GNUNET_TESTBED_overlay_connect (mc, NULL, NULL, master_peer, - slave2_peer); + op = + GNUNET_TESTBED_overlay_connect (mc, NULL, NULL, master_peer, slave2_peer); break; + case SLAVE2_PEER_START_SUCCESS: FAIL_TEST (NULL != event); FAIL_TEST (GNUNET_TESTBED_ET_CONNECT == event->type); @@ -576,11 +601,12 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) result = MASTER_SLAVE2_PEERS_CONNECTED; GNUNET_TESTBED_operation_done (op); op = NULL; - delay_task_id = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, 1), &delay_task, - NULL); + delay_task_id = GNUNET_SCHEDULER_add_delayed ( + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1), + &delay_task, + NULL); break; + case SLAVE2_SLAVE3_PEERS_CONNECTED: FAIL_TEST (GNUNET_TESTBED_ET_PEER_STOP == event->type); FAIL_TEST (event->details.peer_stop.peer == slave2_peer); @@ -589,6 +615,7 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) op = GNUNET_TESTBED_peer_destroy (slave1_peer); FAIL_TEST (NULL != op); break; + case SLAVE2_PEER_STOP_SUCCESS: check_operation_success (event); GNUNET_TESTBED_operation_done (op); @@ -596,6 +623,7 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) op = GNUNET_TESTBED_peer_destroy (slave2_peer); FAIL_TEST (NULL != op); break; + case SLAVE1_PEER_DESTROY_SUCCESS: check_operation_success (event); GNUNET_TESTBED_operation_done (op); @@ -604,6 +632,7 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) op = GNUNET_TESTBED_get_slave_config (NULL, mc, slave3); FAIL_TEST (NULL != op); break; + case SLAVE2_PEER_DESTROY_SUCCESS: FAIL_TEST (NULL != event); FAIL_TEST (GNUNET_TESTBED_ET_OPERATION_FINISHED == event->type); @@ -613,31 +642,37 @@ controller_cb (void *cls, const struct GNUNET_TESTBED_EventInformation *event) cfg3 = GNUNET_CONFIGURATION_dup (event->details.operation_finished.generic); GNUNET_TESTBED_operation_done (op); result = SLAVE3_GET_CONFIG_SUCCESS; - op = GNUNET_TESTBED_controller_link (NULL, mc, slave3, slave, cfg3, - GNUNET_NO); + op = GNUNET_TESTBED_controller_link (NULL, mc, slave3, slave, GNUNET_NO); break; + case SLAVE3_REGISTERED: check_operation_success (event); GNUNET_TESTBED_operation_done (op); - op = NULL; result = SLAVE3_STARTED; op = GNUNET_TESTBED_peer_create (mc, slave3, cfg, peer_create_cb, NULL); FAIL_TEST (NULL != op); break; + case SLAVE3_GET_CONFIG_SUCCESS: result = SLAVE3_LINK_SUCCESS; GNUNET_TESTBED_operation_done (op); op = GNUNET_TESTBED_peer_destroy (master_peer); break; + case SLAVE3_LINK_SUCCESS: check_operation_success (event); + result = MASTER_PEER_DESTROY_SUCCESS; + GNUNET_TESTBED_operation_done (op); + op = GNUNET_TESTBED_peer_destroy (slave3_peer); + break; + + case MASTER_PEER_DESTROY_SUCCESS: result = SUCCESS; GNUNET_TESTBED_operation_done (op); op = NULL; - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, 1), &do_shutdown, - NULL); + GNUNET_SCHEDULER_shutdown (); break; + default: FAIL_TEST (0); } @@ -665,30 +700,32 @@ registration_cont (void *cls, const char *emsg) rh = GNUNET_TESTBED_register_host (mc, slave2, ®istration_cont, NULL); FAIL_TEST (NULL != rh); break; + case SLAVE1_REGISTERED: FAIL_TEST (NULL == emsg); FAIL_TEST (NULL != mc); result = SLAVE2_REGISTERED; FAIL_TEST (NULL != cfg); - op = GNUNET_TESTBED_controller_link (NULL, mc, slave, NULL, cfg, - GNUNET_YES); + op = GNUNET_TESTBED_controller_link (NULL, mc, slave, NULL, GNUNET_YES); FAIL_TEST (NULL != op); break; + case MASTER_SLAVE2_PEERS_CONNECTED: FAIL_TEST (NULL == emsg); FAIL_TEST (NULL != mc); FAIL_TEST (NULL == op); result = SLAVE3_REGISTERED; - op = GNUNET_TESTBED_controller_link (NULL, mc, slave3, NULL, cfg, - GNUNET_YES); + op = GNUNET_TESTBED_controller_link (NULL, mc, slave3, NULL, GNUNET_YES); FAIL_TEST (NULL != op); break; + default: GNUNET_break (0); do_abort_now (NULL); } } + /** * Callback to signal successfull startup of the controller process * @@ -699,7 +736,8 @@ registration_cont (void *cls, const char *emsg) * GNUNET_TESTBED_controller_stop() shouldn't be called in this case */ static void -status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, +status_cb (void *cls, + const struct GNUNET_CONFIGURATION_Handle *config, int status) { switch (result) @@ -711,13 +749,16 @@ status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, event_mask |= (1L << GNUNET_TESTBED_ET_PEER_STOP); event_mask |= (1L << GNUNET_TESTBED_ET_CONNECT); event_mask |= (1L << GNUNET_TESTBED_ET_OPERATION_FINISHED); - mc = GNUNET_TESTBED_controller_connect (host, event_mask, - &controller_cb, NULL); + mc = GNUNET_TESTBED_controller_connect (host, + event_mask, + &controller_cb, + NULL); FAIL_TEST (NULL != mc); result = MASTER_STARTED; op = GNUNET_TESTBED_peer_create (mc, host, cfg, peer_create_cb, NULL); FAIL_TEST (NULL != op); break; + default: GNUNET_break (0); cp = NULL; @@ -727,34 +768,34 @@ status_cb (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, /** - * Callbacks of this type are called by GNUNET_TESTBED_is_host_habitable to + * Callbacks of this type are called by #GNUNET_TESTBED_is_host_habitable to * inform whether the given host is habitable or not. The Handle returned by * GNUNET_TESTBED_is_host_habitable() is invalid after this callback is called * * @param cls NULL * @param host the host whose status is being reported; will be NULL if the host * given to GNUNET_TESTBED_is_host_habitable() is NULL - * @param status GNUNET_YES if it is habitable; GNUNET_NO if not + * @param status #GNUNET_YES if it is habitable; #GNUNET_NO if not */ static void -host_habitable_cb (void *cls, const struct GNUNET_TESTBED_Host *_host, +host_habitable_cb (void *cls, + const struct GNUNET_TESTBED_Host *_host, int status) { hc_handle = NULL; if (GNUNET_NO == status) { - (void) PRINTF ("%s", + (void) printf ("%s", "Unable to run the test as this system is not configured " "to use password less SSH logins to localhost.\n" "Skipping test\n"); GNUNET_SCHEDULER_cancel (abort_task); - abort_task = GNUNET_SCHEDULER_NO_TASK; - (void) GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + abort_task = NULL; + GNUNET_SCHEDULER_shutdown (); result = SKIP; return; } - cp = GNUNET_TESTBED_controller_start ("127.0.0.1", host, status_cb, - NULL); + cp = GNUNET_TESTBED_controller_start ("127.0.0.1", host, status_cb, NULL); } @@ -762,37 +803,40 @@ host_habitable_cb (void *cls, const struct GNUNET_TESTBED_Host *_host, * Main run function. * * @param cls NULL - * @param args arguments passed to GNUNET_PROGRAM_run + * @param args arguments passed to #GNUNET_PROGRAM_run() * @param cfgfile the path to configuration file * @param cfg the configuration file handle */ static void -run (void *cls, char *const *args, const char *cfgfile, +run (void *cls, + char *const *args, + const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *config) { cfg = GNUNET_CONFIGURATION_dup (config); host = GNUNET_TESTBED_host_create (NULL, NULL, cfg, 0); FAIL_TEST (NULL != host); - if (NULL == - (hc_handle = - GNUNET_TESTBED_is_host_habitable (host, config, &host_habitable_cb, - NULL))) + if (NULL == (hc_handle = GNUNET_TESTBED_is_host_habitable (host, + config, + &host_habitable_cb, + NULL))) { GNUNET_TESTBED_host_destroy (host); GNUNET_CONFIGURATION_destroy (cfg); cfg = NULL; host = NULL; - (void) PRINTF ("%s", + (void) printf ("%s", "Unable to run the test as this system is not configured " "to use password less SSH logins to localhost.\n" "Marking test as successful\n"); result = SKIP; return; } - abort_task = - GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_MINUTES, 5), &do_abort, - NULL); + abort_task = GNUNET_SCHEDULER_add_delayed ( + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 5), + &do_abort, + NULL); + GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); } @@ -803,30 +847,35 @@ int main (int argc, char **argv) { char *const argv2[] = { "test_testbed_api_controllerlink", - "-c", "test_testbed_api.conf", - NULL - }; - struct GNUNET_GETOPT_CommandLineOption options[] = { - GNUNET_GETOPT_OPTION_END - }; + "-c", + "test_testbed_api.conf", + NULL }; + struct GNUNET_GETOPT_CommandLineOption options[] = + { GNUNET_GETOPT_OPTION_END }; int ret; result = INIT; - ret = - GNUNET_PROGRAM_run ((sizeof (argv2) / sizeof (char *)) - 1, argv2, - "test_testbed_api_controllerlink", "nohelp", options, - &run, NULL); + ret = GNUNET_PROGRAM_run ((sizeof(argv2) / sizeof(char *)) - 1, + argv2, + "test_testbed_api_controllerlink", + "nohelp", + options, + &run, + NULL); if (GNUNET_OK != ret) return 1; switch (result) { case SUCCESS: return 0; + case SKIP: - return 77; /* Mark test as skipped */ + return 77; /* Mark test as skipped */ + default: return 1; } } + /* end of test_testbed_api_controllerlink.c */