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 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
static struct GNUNET_TESTING_PeerGroup *pg;
-static struct GNUNET_SCHEDULER_Handle *sched;
-
const struct GNUNET_CONFIGURATION_Handle *main_cfg;
GNUNET_SCHEDULER_TaskIdentifier die_task;
uint32_t uid;
};
+/**
+ * Check whether peers successfully shut down.
+ */
+void
+shutdown_callback (void *cls, const char *emsg)
+{
+ if (emsg != NULL)
+ {
+#if VERBOSE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutdown of peers failed!\n");
+#endif
+ if (ok == 0)
+ ok = 666;
+ }
+ else
+ {
+#if VERBOSE
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All peers successfully shut down!\n");
+#endif
+ }
+}
+
static void
finish_testing ()
{
GNUNET_assert (pg != NULL);
if (die_task != GNUNET_SCHEDULER_NO_TASK)
- GNUNET_SCHEDULER_cancel(sched, die_task);
+ GNUNET_SCHEDULER_cancel (die_task);
#if VERBOSE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
#endif
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Calling daemons_stop\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Calling daemons_stop\n");
#endif
- GNUNET_TESTING_daemons_stop (pg, TIMEOUT);
+ GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL);
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "daemons_stop finished\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "daemons_stop finished\n");
#endif
ok = 0;
}
static void
-end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
+end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
char *msg = cls;
+
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"End badly was called (%s)... stopping daemons.\n", msg);
if (pg != NULL)
- {
- GNUNET_TESTING_daemons_stop (pg, TIMEOUT);
- ok = 7331; /* Opposite of leet */
- }
+ {
+ GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL);
+ ok = 7331; /* Opposite of leet */
+ }
else
ok = 401; /* Never got peers started */
* @param cls closure
* @param emsg NULL on success
*/
-void churn_callback(void *cls,
- const char *emsg)
+void
+churn_callback (void *cls, const char *emsg)
{
if (emsg == NULL)
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Successfully churned peers!\n", emsg);
- GNUNET_SCHEDULER_add_now(sched, churn_ctx.next_task, NULL);
- }
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Successfully churned peers!\n",
+ emsg);
+ GNUNET_SCHEDULER_add_now (churn_ctx.next_task, NULL);
+ }
else
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Failed to churn peers with error `%s'\n", emsg);
- GNUNET_SCHEDULER_cancel(sched, die_task);
- die_task = GNUNET_SCHEDULER_add_now(sched, &end_badly, NULL);
- }
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Failed to churn peers with error `%s'\n", emsg);
+ GNUNET_SCHEDULER_cancel (die_task);
+ die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL);
+ }
}
static void
-churn_peers_both()
+churn_peers_both ()
{
churn_ctx.next_task = &finish_testing;
- GNUNET_TESTING_daemons_churn(pg, 1, 1, TIMEOUT, &churn_callback, NULL);
+ GNUNET_TESTING_daemons_churn (pg, NULL, 1, 1, TIMEOUT, &churn_callback, NULL);
}
static void
-churn_peers_off_again()
+churn_peers_off_again ()
{
churn_ctx.next_task = &churn_peers_both;
- GNUNET_TESTING_daemons_churn(pg, 2, 0, TIMEOUT, &churn_callback, NULL);
+ GNUNET_TESTING_daemons_churn (pg, NULL, 2, 0, TIMEOUT, &churn_callback, NULL);
}
static void
-churn_peers_on()
+churn_peers_on ()
{
churn_ctx.next_task = &churn_peers_off_again;
- GNUNET_TESTING_daemons_churn(pg, 0, 2, TIMEOUT, &churn_callback, NULL);
+ GNUNET_TESTING_daemons_churn (pg, NULL, 0, 2, TIMEOUT, &churn_callback, NULL);
}
static void
-churn_peers_off()
+churn_peers_off ()
{
churn_ctx.next_task = &churn_peers_on;
- GNUNET_TESTING_daemons_churn(pg, 2, 0, TIMEOUT, &churn_callback, NULL);
+ GNUNET_TESTING_daemons_churn (pg, NULL, 2, 0, TIMEOUT, &churn_callback, NULL);
}
static void
peers_started_callback (void *cls,
- const struct GNUNET_PeerIdentity *id,
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- struct GNUNET_TESTING_Daemon *d, const char *emsg)
+ const struct GNUNET_PeerIdentity *id,
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ struct GNUNET_TESTING_Daemon *d, const char *emsg)
{
if (emsg != NULL)
- {
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Failed to start daemon with error: `%s'\n",
- emsg);
- return;
- }
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Failed to start daemon with error: `%s'\n", emsg);
+ return;
+ }
GNUNET_assert (id != NULL);
#if VERBOSE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Started daemon %llu out of %llu\n",
#endif
peers_left--;
if (peers_left == 0)
- {
+ {
#if VERBOSE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "All %d daemons started, now testing churn!\n",
- num_peers);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "All %d daemons started, now testing churn!\n", num_peers);
#endif
- GNUNET_SCHEDULER_cancel (sched, die_task);
- /* Set up task in case topology creation doesn't finish
- * within a reasonable amount of time */
- die_task = GNUNET_SCHEDULER_add_delayed (sched,
- GNUNET_TIME_relative_multiply
- (GNUNET_TIME_UNIT_MINUTES, 5),
- &end_badly, "from peers_started_callback");
- churn_peers_off ();
- ok = 0;
- }
+ GNUNET_SCHEDULER_cancel (die_task);
+ /* Set up task in case topology creation doesn't finish
+ * within a reasonable amount of time */
+ die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
+ (GNUNET_TIME_UNIT_MINUTES, 5),
+ &end_badly,
+ "from peers_started_callback");
+ churn_peers_off ();
+ ok = 0;
+ }
}
static void
run (void *cls,
- struct GNUNET_SCHEDULER_Handle *s,
char *const *args,
const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
{
- sched = s;
ok = 1;
#if VERBOSE
"Starting daemons based on config file %s\n", cfgfile);
#endif
- if (GNUNET_YES != GNUNET_CONFIGURATION_get_value_string(cfg, "paths", "servicehome", &test_directory))
- {
- ok = 404;
- return;
- }
+ if (GNUNET_YES !=
+ GNUNET_CONFIGURATION_get_value_string (cfg, "paths", "servicehome",
+ &test_directory))
+ {
+ ok = 404;
+ return;
+ }
if (GNUNET_SYSERR ==
GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "num_peers",
main_cfg = cfg;
peers_left = num_peers;
+ GNUNET_assert (num_peers > 0 && num_peers < (unsigned int) -1);
/* For this specific test we only really want a CLIQUE topology as the
* overlay allowed topology, and a RING topology as the underlying connection
/* Set up a task to end testing if peer start fails */
- die_task = GNUNET_SCHEDULER_add_delayed (sched,
- GNUNET_TIME_relative_multiply
+ die_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_MINUTES, 5),
- &end_badly, "didn't start all daemons in reasonable amount of time!!!");
+ &end_badly,
+ "didn't start all daemons in reasonable amount of time!!!");
- pg = GNUNET_TESTING_daemons_start (sched, cfg,
- peers_left, TIMEOUT, NULL, NULL, &peers_started_callback, NULL,
- NULL, NULL, NULL);
+ pg = GNUNET_TESTING_daemons_start (cfg,
+ peers_left,
+ peers_left,
+ peers_left,
+ TIMEOUT, NULL, NULL,
+ &peers_started_callback, NULL, NULL,
+ NULL, NULL);
}
check ()
{
int ret;
- char *const argv[] = {"test-testing-topology-churn",
+
+ char *const argv[] = { "test-testing-topology-churn",
"-c",
"test_testing_data_topology_churn.conf",
#if VERBOSE
GNUNET_GETOPT_OPTION_END
};
ret = GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
- argv, "test-testing-topology-churn", "nohelp",
- options, &run, &ok);
+ argv, "test-testing-topology-churn", "nohelp",
+ options, &run, &ok);
if (ret != GNUNET_OK)
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "`test-testing-topology-churn': Failed with error code %d\n", ret);
- }
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "`test-testing-topology-churn': Failed with error code %d\n",
+ ret);
+ }
return ok;
}
* of by the testing framework.
*/
if (test_directory != NULL)
+ {
+ if (GNUNET_DISK_directory_remove (test_directory) != GNUNET_OK)
{
- if (GNUNET_DISK_directory_remove (test_directory) != GNUNET_OK)
- {
- GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Failed to remove testing directory %s\n", test_directory);
- }
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "Failed to remove testing directory %s\n", test_directory);
}
+ }
return ret;
}