2 This file is part of GNUnet.
3 Copyright (C) 2016 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
21 * @file transport-testing-send.c
22 * @brief convenience transmission function for tests
23 * @author Christian Grothoff
25 #include "transport-testing.h"
28 * Acceptable transmission delay.
30 #define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply ( \
31 GNUNET_TIME_UNIT_SECONDS, 30)
35 * Return @a cx in @a cls.
39 struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cx)
41 struct GNUNET_TRANSPORT_TESTING_ConnectRequest **cr = cls;
43 if (GNUNET_NO == cx->connected)
50 * Send a test message of type @a mtype and size @a msize from
51 * peer @a sender to peer @a receiver. The peers should be
52 * connected when this function is called.
54 * @param sender the sending peer
55 * @param receiver the receiving peer
56 * @param mtype message type to use
57 * @param msize size of the message, at least `sizeof (struct GNUNET_TRANSPORT_TESTING_TestMessage)`
58 * @param num unique message number
59 * @param cont continuation to call after transmission
60 * @param cont_cls closure for @a cont
61 * @return #GNUNET_OK if message was queued,
62 * #GNUNET_NO if peers are not connected
63 * #GNUNET_SYSERR if @a msize is illegal
66 GNUNET_TRANSPORT_TESTING_send (struct
67 GNUNET_TRANSPORT_TESTING_PeerContext *sender,
68 struct GNUNET_TRANSPORT_TESTING_PeerContext *
73 GNUNET_SCHEDULER_TaskCallback cont,
76 struct GNUNET_TRANSPORT_TESTING_ConnectRequest *cr;
77 struct GNUNET_MQ_Envelope *env;
78 struct GNUNET_TRANSPORT_TESTING_TestMessage *test;
80 if (msize < sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage))
86 GNUNET_TRANSPORT_TESTING_find_connecting_context (sender,
91 GNUNET_TRANSPORT_TESTING_find_connecting_context (receiver,
106 char *receiver_s = GNUNET_strdup (GNUNET_i2s (&receiver->id));
108 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
109 "Sending message from peer %u (`%s') -> peer %u (`%s') !\n",
111 GNUNET_i2s (&sender->id),
114 GNUNET_free (receiver_s);
116 env = GNUNET_MQ_msg_extra (test,
117 msize - sizeof(*test),
119 test->num = htonl (num);
122 msize - sizeof(*test));
123 GNUNET_MQ_notify_sent (env,
126 GNUNET_MQ_send (cr->mq,
133 * Task that sends a test message from the
134 * first peer to the second peer.
136 * @param ccc context which should contain at least two peers, the
137 * first two of which should be currently connected
138 * @param size desired message size
139 * @param cont continuation to call after transmission
140 * @param cont_cls closure for @a cont
143 do_send (struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc,
145 GNUNET_SCHEDULER_TaskCallback cont,
150 ccc->global_ret = GNUNET_SYSERR;
151 ret = GNUNET_TRANSPORT_TESTING_send (ccc->p[0],
153 GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE,
158 GNUNET_assert (GNUNET_SYSERR != ret);
159 if (GNUNET_NO == ret)
162 ccc->global_ret = GNUNET_SYSERR;
163 GNUNET_SCHEDULER_shutdown ();
169 * Task that sends a minimalistic test message from the
170 * first peer to the second peer.
172 * @param cls the `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
173 * which should contain at least two peers, the first two
174 * of which should be currently connected
177 GNUNET_TRANSPORT_TESTING_simple_send (void *cls)
179 struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
183 if (0 < sc->num_messages)
186 done = (0 == sc->num_messages);
190 done = 0; /* infinite loop */
192 msize = sizeof(struct GNUNET_TRANSPORT_TESTING_TestMessage);
193 if (NULL != sc->get_size_cb)
194 msize = sc->get_size_cb (sc->num_messages);
195 /* if this was the last message, call the continuation,
196 otherwise call this function again */
199 done ? sc->cont : &GNUNET_TRANSPORT_TESTING_simple_send,
200 done ? sc->cont_cls : sc);
205 * Task that sends a large test message from the
206 * first peer to the second peer.
208 * @param cls the `struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext`
209 * which should contain at least two peers, the first two
210 * of which should be currently connected
213 GNUNET_TRANSPORT_TESTING_large_send (void *cls)
215 struct GNUNET_TRANSPORT_TESTING_SendClosure *sc = cls;
219 if (0 < sc->num_messages)
222 done = (0 == sc->num_messages);
226 done = 0; /* infinite loop */
229 if (NULL != sc->get_size_cb)
230 msize = sc->get_size_cb (sc->num_messages);
231 /* if this was the last message, call the continuation,
232 otherwise call this function again */
235 done ? sc->cont : &GNUNET_TRANSPORT_TESTING_large_send,
236 done ? sc->cont_cls : sc);
240 /* end of transport-testing-send.c */