This file is part of GNUnet.
Copyright (C) 2016 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., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ SPDX-License-Identifier: AGPL3.0-or-later
+ */
/**
* @file transport-testing-main.c
* @brief convenience main function for tests
* Peer being connected.
*/
struct GNUNET_TRANSPORT_TESTING_PeerContext *p2;
-
};
GNUNET_SCHEDULER_cancel (ccc->timeout_task);
ccc->timeout_task = NULL;
}
+ if (NULL != ccc->connect_task)
+ {
+ GNUNET_SCHEDULER_cancel (ccc->connect_task);
+ ccc->connect_task = NULL;
+ }
while (NULL != (crl = ccc->crl_head))
{
GNUNET_CONTAINER_DLL_remove (ccc->crl_head,
GNUNET_TRANSPORT_TESTING_connect_peers_cancel (crl->cr);
GNUNET_free (crl);
}
- for (unsigned int i=0;i<ccc->num_peers;i++)
+ for (unsigned int i = 0; i < ccc->num_peers; i++)
{
if (NULL != ccc->p[i])
{
/**
- * Function called when we connected two peers.
- * Once we have gotten to the clique, launch
- * test-specific logic.
+ * Information tracked per connected peer.
+ */
+struct ConnectPairInfo
+{
+ /**
+ * Peer this is about.
+ */
+ const struct GNUNET_PeerIdentity *sender;
+
+ /**
+ * Information about the receiving peer.
+ */
+ struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi;
+};
+
+
+/**
+ * Function called when we connected two peers. Once we have gotten
+ * to the clique, launch test-specific logic.
*
* @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *`
*/
* @return NULL if @a peer was not found
*/
struct GNUNET_TRANSPORT_TESTING_PeerContext *
-GNUNET_TRANSPORT_TESTING_find_peer (struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc,
+GNUNET_TRANSPORT_TESTING_find_peer (struct
+ GNUNET_TRANSPORT_TESTING_ConnectCheckContext
+ *ccc,
const struct GNUNET_PeerIdentity *peer)
{
- for (unsigned int i=0;i<ccc->num_peers;i++)
- if ( (NULL != ccc->p[i]) &&
- (0 == memcmp (peer,
- &ccc->p[i]->id,
- sizeof (*peer))) )
+ for (unsigned int i = 0; i < ccc->num_peers; i++)
+ if ((NULL != ccc->p[i]) &&
+ (0 == memcmp (peer,
+ &ccc->p[i]->id,
+ sizeof(*peer))))
return ccc->p[i];
return NULL;
}
*
* @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
* @param peer peer we got connected to
+ * @param mq message queue for transmissions to @a peer
+ * @return closure for message handlers
*/
-static void
+static void *
my_nc (void *cls,
- const struct GNUNET_PeerIdentity *peer)
+ const struct GNUNET_PeerIdentity *peer,
+ struct GNUNET_MQ_Handle *mq)
{
struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
+ struct ConnectPairInfo *cpi;
if (NULL != ccc->nc)
ccc->nc (ccc->cls,
ccc->p[ipi->off],
peer);
+ cpi = GNUNET_new (struct ConnectPairInfo);
+ cpi->ipi = ipi;
+ cpi->sender = peer; /* valid until disconnect */
+ return cpi;
}
-
/**
* Wrapper around peers disconnecting. Calls client's nd function.
*
* @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
* @param peer peer we got disconnected from
+ * @param custom_cls return value from @my_nc
*/
static void
my_nd (void *cls,
- const struct GNUNET_PeerIdentity *peer)
+ const struct GNUNET_PeerIdentity *peer,
+ void *custom_cls)
{
struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
+ struct ConnectPairInfo *cpi = custom_cls;
if (NULL != ccc->nd)
ccc->nd (ccc->cls,
ccc->p[ipi->off],
peer);
+ GNUNET_free (cpi);
}
/**
* Wrapper around receiving data. Calls client's rec function.
*
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
- * @param peer peer we got a message from
+ * @param cls our `struct ConnectPairInfo *`
+ * @param message message we received
+ * @return #GNUNET_OK (all messages are fine)
+ */
+static int
+check_test (void *cls,
+ const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
+{
+ return GNUNET_OK;
+}
+
+
+/**
+ * Wrapper around receiving data. Calls client's rec function.
+ *
+ * @param cls our `struct ConnectPairInfo *`
* @param message message we received
*/
static void
-my_rec (void *cls,
- const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_MessageHeader *message)
+handle_test (void *cls,
+ const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
{
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
+ struct ConnectPairInfo *cpi = cls;
+ struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cpi->ipi;
struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
if (NULL != ccc->rec)
ccc->rec (ccc->cls,
ccc->p[ipi->off],
- peer,
+ cpi->sender,
message);
}
/**
- * Function called once we have successfully launched a peer.
- * Once all peers have been launched, we connect all of them
- * in a clique.
+ * Wrapper around receiving data. Calls client's rec function.
*
- * @param p peer that was launched (redundant, kill ASAP)
- * @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
+ * @param cls our `struct ConnectPairInfo *`
+ * @param message message we received
+ * @return #GNUNET_OK (all messages are fine)
+ */
+static int
+check_test2 (void *cls,
+ const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
+{
+ return GNUNET_OK;
+}
+
+
+/**
+ * Wrapper around receiving data. Calls client's rec function.
+ *
+ * @param cls our `struct ConnectPairInfo *`
+ * @param message message we received
*/
static void
-start_cb (struct GNUNET_TRANSPORT_TESTING_PeerContext *p,
- void *cls)
+handle_test2 (void *cls,
+ const struct GNUNET_TRANSPORT_TESTING_TestMessage *message)
{
- struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
+ struct ConnectPairInfo *cpi = cls;
+ struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cpi->ipi;
struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
- ccc->started++;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "Peer %u (`%s') started\n",
- p->no,
- GNUNET_i2s (&p->id));
- if (ccc->started != ccc->num_peers)
- return;
+ if (NULL != ccc->rec)
+ ccc->rec (ccc->cls,
+ ccc->p[ipi->off],
+ cpi->sender,
+ message);
+}
+
- for (unsigned int i=0;i<ccc->num_peers;i++)
- for (unsigned int j=i+1;j<ccc->num_peers;j++)
+/**
+ * Connect the peers as a clique.
+ *
+ * @param cls our `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
+ */
+static void
+do_connect (void *cls)
+{
+ struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
+
+ ccc->connect_task = NULL;
+ for (unsigned int i = 0; i < ccc->num_peers; i++)
+ for (unsigned int j = (ccc->bi_directional ? 0 : i + 1); j < ccc->num_peers;
+ j++)
{
struct GNUNET_TRANSPORT_TESTING_ConnectRequestList *crl;
+ if (i == j)
+ continue;
crl = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_ConnectRequestList);
GNUNET_CONTAINER_DLL_insert (ccc->crl_head,
ccc->crl_tail,
}
+/**
+ * Function called once we have successfully launched a peer.
+ * Once all peers have been launched, we connect all of them
+ * in a clique.
+ *
+ * @param cls our `struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *`
+ */
+static void
+start_cb (void *cls)
+{
+ struct GNUNET_TRANSPORT_TESTING_InternalPeerContext *ipi = cls;
+ struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = ipi->ccc;
+ struct GNUNET_TRANSPORT_TESTING_PeerContext *p = ccc->p[ipi->off];
+
+ ccc->started++;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Peer %u (`%s') started\n",
+ p->no,
+ GNUNET_i2s (&p->id));
+ if (ccc->started != ccc->num_peers)
+ return;
+ if (NULL != ccc->pre_connect_task)
+ {
+ /* Run the custom per-connect job, then give it a second to
+ go into effect before we continue connecting peers. */
+ ccc->pre_connect_task (ccc->pre_connect_task_cls);
+ ccc->connect_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
+ &do_connect,
+ ccc);
+ }
+ else
+ {
+ do_connect (ccc);
+ }
+}
+
+
/**
* Function run from #GNUNET_TRANSPORT_TESTING_connect_check
* once the scheduler is up. Should launch the peers and
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
ccc);
ok = GNUNET_OK;
- for (unsigned int i=0;i<ccc->num_peers;i++)
+ for (unsigned int i = 0; i < ccc->num_peers; i++)
{
+ struct GNUNET_MQ_MessageHandler handlers[] = {
+ GNUNET_MQ_hd_var_size (test,
+ GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
+ struct GNUNET_TRANSPORT_TESTING_TestMessage,
+ NULL),
+ GNUNET_MQ_hd_var_size (test2,
+ GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2,
+ struct GNUNET_TRANSPORT_TESTING_TestMessage,
+ NULL),
+ GNUNET_MQ_handler_end ()
+ };
ccc->p[i] = GNUNET_TRANSPORT_TESTING_start_peer (ccc->tth,
ccc->cfg_files[i],
i + 1,
- &my_rec,
+ handlers,
&my_nc,
&my_nd,
+ &ccc->ip[i],
&start_cb,
&ccc->ip[i]);
if (NULL == ccc->p[i])
*/
int
GNUNET_TRANSPORT_TESTING_connect_check (void *cls,
- struct GNUNET_TRANSPORT_TESTING_Handle *tth_,
+ struct GNUNET_TRANSPORT_TESTING_Handle *
+ tth_,
const char *test_plugin_,
const char *test_name_,
unsigned int num_peers,
struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc = cls;
struct GNUNET_TRANSPORT_TESTING_PeerContext *p[num_peers];
struct GNUNET_TRANSPORT_TESTING_InternalPeerContext ip[num_peers];
- char * argv[] = {
+ char *argv[] = {
(char *) test_name_,
"-c",
(char *) ccc->config_file,
ccc->global_ret = GNUNET_OK;
ccc->p = p;
ccc->ip = ip;
- for (unsigned int i=0;i<num_peers;i++)
+ for (unsigned int i = 0; i < num_peers; i++)
{
ip[i].off = i;
ip[i].ccc = ccc;
}
- GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
- argv,
- test_name_,
- "nohelp",
- options,
- &connect_check_run,
- ccc);
+ if (GNUNET_OK !=
+ GNUNET_PROGRAM_run ((sizeof(argv) / sizeof(char *)) - 1,
+ argv,
+ test_name_,
+ "nohelp",
+ options,
+ &connect_check_run,
+ ccc))
+ return GNUNET_SYSERR;
return ccc->global_ret;
}
test_source = GNUNET_TRANSPORT_TESTING_get_test_source_name (filename);
test_plugin = GNUNET_TRANSPORT_TESTING_get_test_plugin_name (argv0,
test_source);
- for (unsigned int i=0;i<num_peers;i++)
+ for (unsigned int i = 0; i < num_peers; i++)
cfg_names[i] = GNUNET_TRANSPORT_TESTING_get_config_name (argv0,
- i+1);
+ i + 1);
tth = GNUNET_TRANSPORT_TESTING_init ();
if (NULL == tth)
{
cfg_names);
GNUNET_TRANSPORT_TESTING_done (tth);
}
- for (unsigned int i=0;i<num_peers;i++)
+ for (unsigned int i = 0; i < num_peers; i++)
GNUNET_free (cfg_names[i]);
GNUNET_free (test_source);
- GNUNET_free (test_plugin);
+ GNUNET_free_non_null (test_plugin);
GNUNET_free (test_name);
return ret;
}
+
/* end of transport-testing-main.c */