2 This file is part of GNUnet.
3 Copyright (C) 2009, 2010, 2011, 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/test_quota_compliance.c
22 * @brief base test case for transport implementations
24 * This test case tests quota compliance both on transport level
27 #include "gnunet_transport_service.h"
28 #include "gnunet_ats_service.h"
30 #include "transport-testing.h"
35 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 480)
37 #define DURATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 80)
40 static struct GNUNET_SCHEDULER_Task *measure_task;
42 static char *gen_cfgs[2];
44 static unsigned long long quota_in[] = { 10000, 10000 };
46 static unsigned long long quota_out[] = { 10000, 10000 };
48 static struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext *ccc;
52 * Note that this value must not significantly exceed
53 * 'MAX_PENDING' in 'gnunet-service-transport.c', otherwise
54 * messages may be dropped even for a reliable transport.
56 #define TOTAL_MSGS (1024 * 32)
58 static unsigned long long total_bytes_recv;
60 static struct GNUNET_TIME_Absolute start_time;
66 unsigned long long delta;
67 unsigned long long datarate;
69 delta = GNUNET_TIME_absolute_get_duration (start_time).rel_value_us;
72 datarate = (total_bytes_recv * 1000 * 1000) / delta;
75 "Throughput was %llu b/s\n",
77 ccc->global_ret = GNUNET_OK;
78 if (datarate > 1.5 * quota_in[1])
80 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
81 "Datarate of %llu b/s significantly higher than allowed inbound quota of %llu b/s\n",
84 ccc->global_ret = GNUNET_SYSERR;
86 if (datarate > 1.5 * quota_out[0])
88 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
89 "Datarate of %llu b/s significantly higher than allowed outbound quota of %llu b/s\n",
92 ccc->global_ret = GNUNET_SYSERR;
94 if (GNUNET_OK == ccc->global_ret)
96 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
97 "Datarate of %llu b/s complied to allowed outbound quota of %llu b/s and inbound quota of %llu b/s\n",
106 custom_shutdown (void *cls)
108 if (NULL != measure_task)
110 GNUNET_SCHEDULER_cancel (measure_task);
118 get_size (unsigned int iter)
122 ret = (iter * iter * iter) % 60000;
123 ret += sizeof (struct GNUNET_TRANSPORT_TESTING_TestMessage);
129 notify_receive (void *cls,
130 struct GNUNET_TRANSPORT_TESTING_PeerContext *receiver,
131 const struct GNUNET_PeerIdentity *sender,
132 const struct GNUNET_TRANSPORT_TESTING_TestMessage *hdr)
135 if (GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE != ntohs (hdr->header.type))
137 total_bytes_recv += ntohs (hdr->header.size);
140 char *ps = GNUNET_strdup (GNUNET_i2s (&receiver->id));
142 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
143 "Peer %u (`%s') got message %u of size %u from peer (`%s')\n",
147 ntohs (hdr->header.size),
148 GNUNET_i2s (sender));
161 if ((DURATION.rel_value_us / 1000 / 1000LL) < counter)
163 FPRINTF (stderr, "%s", ".\n");
164 GNUNET_SCHEDULER_shutdown ();
167 FPRINTF (stderr, "%s", ".");
168 measure_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
175 start_task (void *cls)
177 static struct GNUNET_TRANSPORT_TESTING_SendClosure sc = {
178 .num_messages = TOTAL_MSGS,
179 .get_size_cb = &get_size
183 measure_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
186 start_time = GNUNET_TIME_absolute_get ();
187 GNUNET_SCHEDULER_add_now (&GNUNET_TRANSPORT_TESTING_simple_send,
193 generate_config (const char *cfg_file,
194 unsigned long long quota_in,
195 unsigned long long quota_out)
200 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
202 GNUNET_assert (GNUNET_OK ==
203 GNUNET_CONFIGURATION_load (cfg,
205 GNUNET_asprintf (&fname,
206 "q_in_%llu_q_out_%llu_%s",
210 GNUNET_CONFIGURATION_set_value_string (cfg,
214 for (int c = 0; c < GNUNET_NT_COUNT; c++)
216 GNUNET_asprintf (&in_name,
218 GNUNET_NT_to_string (c));
219 GNUNET_asprintf (&out_name,
221 GNUNET_NT_to_string (c));
222 GNUNET_CONFIGURATION_set_value_number (cfg,
226 GNUNET_CONFIGURATION_set_value_number (cfg,
230 GNUNET_free (in_name);
231 GNUNET_free (out_name);
233 GNUNET_assert (GNUNET_OK ==
234 GNUNET_CONFIGURATION_write (cfg,
236 GNUNET_CONFIGURATION_destroy (cfg);
243 struct GNUNET_TRANSPORT_TESTING_Handle *tth_,
244 const char *test_plugin_,
245 const char *test_name_,
246 unsigned int num_peers,
249 struct GNUNET_TRANSPORT_TESTING_ConnectCheckContext my_ccc = {
250 .connect_continuation = &start_task,
251 .config_file = "test_quota_compliance_data.conf",
252 .rec = ¬ify_receive,
253 .nc = &GNUNET_TRANSPORT_TESTING_log_connect,
254 .nd = &GNUNET_TRANSPORT_TESTING_log_disconnect,
255 .shutdown_task = &custom_shutdown,
260 if (NULL != strstr (test_name_,
263 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
264 "Running asymmetric test with sending peer unlimited, receiving peer (in/out): %llu/%llu b/s \n",
267 quota_out[0] = 1024 * 1024 * 1024;
268 quota_in[0] = 1024 * 1024 * 1024;
272 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
273 "Running symmetric test with (in/out) %llu/%llu b/s \n",
277 for (unsigned int i=0;i<2;i++)
279 gen_cfgs[i] = generate_config (cfg_files[i],
282 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
283 "Generated config file `%s'\n",
287 return GNUNET_TRANSPORT_TESTING_connect_check (&my_ccc,
301 GNUNET_TRANSPORT_TESTING_main (2,
308 for (unsigned int i=0;i<2;i++)
310 if ( (NULL != gen_cfgs[i]) &&
311 (GNUNET_YES == GNUNET_DISK_file_test (gen_cfgs[i])) )
313 GNUNET_DISK_directory_remove (gen_cfgs[i]);
314 GNUNET_free (gen_cfgs[i]);
321 /* end of test_quota_compliance.c */