gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] branch master updated: TNG: Added performance test case.


From: gnunet
Subject: [gnunet] branch master updated: TNG: Added performance test case.
Date: Wed, 08 Feb 2023 12:10:23 +0100

This is an automated email from the git hooks/post-receive script.

t3sserakt pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 6b83e9a45 TNG: Added performance test case.
6b83e9a45 is described below

commit 6b83e9a453ffc9ea0347a7e725c3a9b6d2a32517
Author: t3sserakt <t3ss@posteo.de>
AuthorDate: Wed Feb 8 10:37:33 2023 +0100

    TNG: Added performance test case.
---
 src/transport/Makefile.am                          |  23 +-
 ..._transport_plugin_cmd_simple_send_performance.c | 508 +++++++++++++++++++++
 .../test_transport_simple_send_performance.sh      |  11 +
 ...est_transport_simple_send_performance_topo.conf |   6 +
 src/transport/transport-testing-cmds.h             |  22 +
 src/transport/transport-testing2.h                 |  23 +
 .../transport_api_cmd_send_simple_performance.c    | 219 +++++++++
 7 files changed, 811 insertions(+), 1 deletion(-)

diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index 5acba3a4e..eeafab840 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -130,6 +130,7 @@ libgnunettransporttesting2_la_SOURCES = \
   transport_api_cmd_start_peer.c \
   transport_api_cmd_stop_peer.c \
   transport_api_cmd_send_simple.c \
+  transport_api_cmd_send_simple_performance.c \
   transport-testing2.c transport-testing2.h \
   transport-testing-cmds.h \
   transport-testing-filenames2.c \
@@ -357,6 +358,7 @@ plugin_LTLIBRARIES = \
   $(HTTPS_SERVER_PLUGIN_LA) \
   $(WLAN_PLUGIN_LA) \
   $(BT_PLUGIN_LA) \
+  libgnunet_test_transport_plugin_cmd_simple_send_performance.la \
   libgnunet_test_transport_plugin_cmd_nat_upnp.la \
   libgnunet_test_transport_plugin_cmd_simple_send.la \
   libgnunet_test_transport_plugin_cmd_simple_send_broadcast.la \
@@ -414,6 +416,23 @@ libgnunet_test_transport_plugin_cmd_simple_send_la_LIBADD 
= \
 libgnunet_test_transport_plugin_cmd_simple_send_la_LDFLAGS = \
   $(GN_PLUGIN_LDFLAGS)
 
+libgnunet_test_transport_plugin_cmd_simple_send_performance_la_SOURCES = \
+ test_transport_plugin_cmd_simple_send_performance.c
+libgnunet_test_transport_plugin_cmd_simple_send_performance_la_LIBADD = \
+  libgnunettransporttesting2.la \
+  libgnunettransportapplication.la \
+  libgnunettransportcore.la \
+  $(top_builddir)/src/testing/libgnunettesting.la \
+  $(top_builddir)/src/peerstore/libgnunetpeerstore.la \
+  $(top_builddir)/src/statistics/libgnunetstatistics.la \
+  $(top_builddir)/src/hello/libgnunethello.la \
+  $(top_builddir)/src/ats/libgnunetats.la \
+  $(top_builddir)/src/arm/libgnunetarm.la \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  $(LTLIBINTL)
+libgnunet_test_transport_plugin_cmd_simple_send_performance_la_LDFLAGS = \
+  $(GN_PLUGIN_LDFLAGS)
+
 libgnunet_test_transport_plugin_cmd_simple_send_broadcast_la_SOURCES = \
  test_transport_plugin_cmd_simple_send_broadcast.c
 libgnunet_test_transport_plugin_cmd_simple_send_broadcast_la_LIBADD = \
@@ -760,7 +779,8 @@ endif
 # Only test TNG if we run experimental
 if HAVE_EXPERIMENTAL
 check_SCRIPTS= \
-test_transport_nat_icmp_tcp.sh \
+  test_transport_simple_send_performance.sh \
+  test_transport_nat_icmp_tcp.sh \
   test_transport_nat_upnp.sh \
   test_transport_simple_send_string.sh \
   test_transport_simple_send.sh \
@@ -1510,6 +1530,7 @@ test_transport_api_slow_ats_LDADD = \
 
 
 EXTRA_DIST = \
+test_transport_simple_send_performance.sh \
 test_transport_nat_icmp_tcp.sh \
 test_transport_nat_upnp.sh \
 test_transport_simple_send_string.sh \
diff --git a/src/transport/test_transport_plugin_cmd_simple_send_performance.c 
b/src/transport/test_transport_plugin_cmd_simple_send_performance.c
new file mode 100644
index 000000000..17325e369
--- /dev/null
+++ b/src/transport/test_transport_plugin_cmd_simple_send_performance.c
@@ -0,0 +1,508 @@
+/*
+      This file is part of GNUnet
+      Copyright (C) 2021 GNUnet e.V.
+
+      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
+      Affero General Public License for more details.
+
+      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 testbed/plugin_cmd_simple_send.c
+ * @brief a plugin to provide the API for running test cases.
+ * @author t3sserakt
+ */
+#include "platform.h"
+#include "gnunet_testing_barrier.h"
+#include "gnunet_testing_netjail_lib.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_transport_application_service.h"
+#include "transport-testing2.h"
+#include "transport-testing-cmds.h"
+#include "gnunet_testing_barrier.h"
+
+/**
+ * Generic logging shortcut
+ */
+#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
+
+#define BASE_DIR "testdir"
+
+#define TOPOLOGY_CONFIG "test_transport_simple_send_topo.conf"
+
+#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 600)
+
+#define MAX_RECEIVED 1000
+
+#define MESSAGE_SIZE 65000
+
+static struct GNUNET_TESTING_Command block_send;
+
+static struct GNUNET_TESTING_Command block_receive;
+
+static struct GNUNET_TESTING_Command connect_peers;
+
+static struct GNUNET_TESTING_Command local_prepared;
+
+static struct GNUNET_TESTING_Command start_peer;
+
+static struct GNUNET_TESTING_Interpreter *is;
+
+static struct GNUNET_CONTAINER_MultiPeerMap *senders;
+
+struct Sender
+{
+  /**
+   * Number of received messages from sender.
+   */
+  unsigned long long num_received;
+
+  /**
+   * Sample mean time the message traveled.
+   */
+  struct GNUNET_TIME_Relative mean_time;
+
+  /**
+   * Time the first message was send.
+   */
+  struct GNUNET_TIME_Absolute time_first;
+};
+
+/**
+ * Function called to check a message of type 
GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE being
+ * received.
+ *
+ */
+static int
+check_test (void *cls,
+            const struct GNUNET_TRANSPORT_TESTING_PerformanceTestMessage 
*message)
+{
+  return GNUNET_OK;
+}
+
+
+/**
+ * Function called to handle a message of type 
GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE
+ * being received.
+ *
+ */
+static void
+handle_test (void *cls,
+             const struct GNUNET_TRANSPORT_TESTING_PerformanceTestMessage 
*message)
+{
+  struct GNUNET_PeerIdentity *peer = cls;
+  const struct GNUNET_TESTING_AsyncContext *ac;
+  struct Sender *sender;
+  struct GNUNET_TIME_Absolute time_send;
+  struct GNUNET_TIME_Absolute now;
+  struct GNUNET_TIME_Relative time_traveled;
+  uint32_t num;
+  struct GNUNET_TRANSPORT_CoreHandle *ch;
+  const struct StartPeerState *sps;
+
+
+  GNUNET_TRANSPORT_get_trait_state (&start_peer,
+                                    &sps);
+  ch = sps->th;
+  num = ntohl (message->num);
+  GNUNET_TESTING_get_trait_async_context (&block_receive,
+                                          &ac);
+  GNUNET_assert  (NULL != ac);
+
+  sender = GNUNET_CONTAINER_multipeermap_get (senders, peer);
+
+  now = GNUNET_TIME_absolute_get ();
+  time_send = GNUNET_TIME_absolute_ntoh (message->time_send);
+
+  time_traveled = GNUNET_TIME_absolute_get_difference (time_send, now);
+
+  if (NULL == sender)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "time traveled init %s\n",
+                GNUNET_i2s(peer));
+    sender = GNUNET_new (struct Sender);
+    sender->time_first = time_send;
+    sender->mean_time = GNUNET_TIME_UNIT_ZERO;
+    GNUNET_CONTAINER_multipeermap_put (senders, peer, sender, 
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+  }
+
+  if (GNUNET_TIME_UNIT_ZERO.rel_value_us == sender->mean_time.rel_value_us)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "time traveld mean zero\n");
+    sender->mean_time = time_traveled;
+  }
+  else
+  {
+    double factor = sender->num_received/(sender->num_received + 1);
+    struct GNUNET_TIME_Relative s1;
+    struct GNUNET_TIME_Relative s2;
+
+    s1 = GNUNET_TIME_relative_multiply (sender->mean_time,
+                                        factor);
+    s2 = GNUNET_TIME_relative_divide (time_traveled,
+                                      sender->num_received + 1);
+    sender->mean_time = GNUNET_TIME_relative_add (s1, s2);
+  }
+
+  sender->num_received++;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "time traveled: %llu\n",
+              time_traveled.rel_value_us);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "mean time traveled: %s %llu messages received with message 
number %u\n",
+              GNUNET_STRINGS_relative_time_to_string (sender->mean_time, 
GNUNET_NO),
+              sender->num_received,
+              num);
+  if (MAX_RECEIVED <= sender->num_received && NULL == ac->cont)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "time traveled failed\n");
+    GNUNET_TESTING_async_fail ((struct GNUNET_TESTING_AsyncContext *) ac);
+  }
+  else if (MAX_RECEIVED <= sender->num_received)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "time traveled finish\n");
+    GNUNET_TESTING_async_finish ((struct GNUNET_TESTING_AsyncContext *) ac);
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "time traveled end\n");
+  GNUNET_TRANSPORT_core_receive_continue (ch, peer);
+}
+
+
+struct GNUNET_TESTING_BarrierList*
+get_waiting_for_barriers ()
+{
+  struct GNUNET_TESTING_BarrierList* barriers;
+  struct GNUNET_TESTING_BarrierListEntry *ble;
+
+  barriers = GNUNET_new (struct GNUNET_TESTING_BarrierList);
+  ble = GNUNET_new (struct GNUNET_TESTING_BarrierListEntry);
+  ble->barrier_name = "ready-to-connect";
+  ble->expected_reaches = 1;
+  GNUNET_CONTAINER_DLL_insert (barriers->head,
+                               barriers->tail,
+                               ble);
+
+  ble = GNUNET_new (struct GNUNET_TESTING_BarrierListEntry);
+  ble->barrier_name = "test-case-finished";
+  ble->expected_reaches = 1;
+  GNUNET_CONTAINER_DLL_insert (barriers->head,
+                               barriers->tail,
+                               ble);
+  return barriers;
+}
+
+
+/**
+ * Callback to set the flag indicating all peers started. Will be called via 
the plugin api.
+ *
+ */
+static void
+all_peers_started ()
+{
+  const struct GNUNET_TESTING_AsyncContext *ac;
+
+  GNUNET_TESTING_get_trait_async_context (&block_send,
+                                          &ac);
+  GNUNET_assert  (NULL != ac);
+  if (NULL == ac->cont)
+    GNUNET_TESTING_async_fail ((struct GNUNET_TESTING_AsyncContext *) ac);
+  else
+    GNUNET_TESTING_async_finish ((struct GNUNET_TESTING_AsyncContext *) ac);
+}
+
+
+/**
+ * Function called with the final result of the test.
+ *
+ * @param cls the `struct MainParams`
+ * @param rv #GNUNET_OK if the test passed
+ */
+static void
+handle_result (void *cls,
+               enum GNUNET_GenericReturnValue rv)
+{
+  struct TestState *ts = cls;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Local test exits with status %d\n",
+              rv);
+
+  ts->finished_cb (rv);
+  GNUNET_free (ts->testdir);
+  GNUNET_free (ts->cfgname);
+  GNUNET_TESTING_free_topology (ts->topology);
+  GNUNET_free (ts);
+}
+
+
+/**
+ * Callback from start peer cmd for signaling a peer got connected.
+ *
+ */
+static void *
+notify_connect (struct GNUNET_TESTING_Interpreter *is,
+                const struct GNUNET_PeerIdentity *peer)
+{
+  const struct ConnectPeersState *cps;
+  const struct GNUNET_TESTING_Command *cmd;
+
+  cmd = GNUNET_TESTING_interpreter_lookup_command (is,
+                                                   "connect-peers");
+  GNUNET_TRANSPORT_get_trait_connect_peer_state (cmd,
+                                                 &cps);
+  void *ret = NULL;
+
+  cps->notify_connect (is,
+                       peer);
+  return ret;
+}
+
+
+/**
+ * Callback to set the flag indicating all peers are prepared to finish. Will 
be called via the plugin api.
+ */
+static void
+all_local_tests_prepared ()
+{
+  const struct GNUNET_TESTING_LocalPreparedState *lfs;
+
+  GNUNET_TESTING_get_trait_local_prepared_state (&local_prepared,
+                                                 &lfs);
+  GNUNET_assert (NULL != &lfs->ac);
+  if (NULL == lfs->ac.cont)
+    GNUNET_TESTING_async_fail ((struct GNUNET_TESTING_AsyncContext *) 
&lfs->ac);
+  else
+    GNUNET_TESTING_async_finish ((struct
+                                  GNUNET_TESTING_AsyncContext *) &lfs->ac);
+}
+
+
+/**
+ * Function to start a local test case.
+ *
+ * @param write_message Callback to send a message to the master loop.
+ * @param router_ip Global address of the network namespace.
+ * @param node_ip The IP address of the node.
+ * @param m The number of the node in a network namespace.
+ * @param n The number of the network namespace.
+ * @param local_m The number of nodes in a network namespace.
+ * @param topology_data A file name for the file containing the topology 
configuration, or a string containing
+ *        the topology configuration.
+ * @param read_file If read_file is GNUNET_YES this string is the filename for 
the topology configuration,
+ *        if read_file is GNUNET_NO the string contains the topology 
configuration.
+ * @param finish_cb Callback function which writes a message from the helper 
process running on a netjail 
+ *                  node to the master process * signaling that the test case 
running on the netjail node finished.
+ * @return Returns the struct GNUNET_TESTING_Interpreter of the command loop 
running on this netjail node.
+ */
+static struct GNUNET_TESTING_Interpreter *
+start_testcase (GNUNET_TESTING_cmd_helper_write_cb write_message,
+                const char *router_ip,
+                const char *node_ip,
+                const char *m,
+                const char *n,
+                const char *local_m,
+                const char *topology_data,
+                unsigned int *read_file,
+                GNUNET_TESTING_cmd_helper_finish_cb finished_cb)
+{
+
+  unsigned int n_int;
+  unsigned int m_int;
+  unsigned int local_m_int;
+  unsigned int num;
+  struct TestState *ts = GNUNET_new (struct TestState);
+  struct GNUNET_TESTING_NetjailTopology *topology;
+  unsigned int sscanf_ret = 0;
+
+  senders = GNUNET_CONTAINER_multipeermap_create (1, GNUNET_NO);
+  ts->finished_cb = finished_cb;
+  LOG (GNUNET_ERROR_TYPE_ERROR,
+       "n %s m %s\n",
+       n,
+       m);
+
+  if (GNUNET_YES == *read_file)
+  {
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "read from file\n");
+    topology = GNUNET_TESTING_get_topo_from_file (topology_data);
+  }
+  else
+    topology = GNUNET_TESTING_get_topo_from_string (topology_data);
+
+  ts->topology = topology;
+
+  errno = 0;
+  sscanf_ret = sscanf (m, "%u", &m_int);
+  if (errno != 0)
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sscanf");
+  }
+  GNUNET_assert (0 < sscanf_ret);
+  errno = 0;
+  sscanf_ret = sscanf (n, "%u", &n_int);
+  if (errno != 0)
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sscanf");
+  }
+  GNUNET_assert (0 < sscanf_ret);
+  errno = 0;
+  sscanf_ret = sscanf (local_m, "%u", &local_m_int);
+  if (errno != 0)
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sscanf");
+  }
+  GNUNET_assert (0 < sscanf_ret);
+
+  if (0 == n_int)
+    num = m_int;
+  else
+    num = (n_int - 1) * local_m_int + m_int + topology->nodes_x;
+
+  block_send = GNUNET_TESTING_cmd_block_until_external_trigger (
+    "block");
+  block_receive = GNUNET_TESTING_cmd_block_until_external_trigger (
+    "block-receive");
+  connect_peers = GNUNET_TRANSPORT_cmd_connect_peers ("connect-peers",
+                                                      "start-peer",
+                                                      "system-create",
+                                                      num,
+                                                      topology,
+                                                      0);
+  local_prepared = GNUNET_TESTING_cmd_local_test_prepared (
+    "local-test-prepared",
+    write_message);
+
+
+  GNUNET_asprintf (&ts->cfgname,
+                   "test_transport_api2_tcp_node1.conf");
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "plugin cfgname: %s\n",
+       ts->cfgname);
+
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "node ip: %s\n",
+       node_ip);
+
+  GNUNET_asprintf (&ts->testdir,
+                   "%s%s%s",
+                   BASE_DIR,
+                   m,
+                   n);
+
+  struct GNUNET_MQ_MessageHandler handlers[] = {
+    GNUNET_MQ_hd_var_size (test,
+                           GNUNET_TRANSPORT_TESTING_SIMPLE_PERFORMANCE_MTYPE,
+                           struct 
GNUNET_TRANSPORT_TESTING_PerformanceTestMessage,
+                           ts),
+    GNUNET_MQ_handler_end ()
+  };
+
+  start_peer = GNUNET_TRANSPORT_cmd_start_peer ("start-peer",
+                                   "system-create",
+                                   num,
+                                   node_ip,
+                                   handlers,
+                                   ts->cfgname,
+                                   notify_connect,
+                                   GNUNET_NO);
+
+  struct GNUNET_TESTING_Command commands[] = {
+    GNUNET_TESTING_cmd_system_create ("system-create",
+                                      ts->testdir),
+    start_peer,
+    GNUNET_TESTING_cmd_barrier_reached ("ready-to-connect-reached",
+                                        "ready-to-connect",
+                                        GNUNET_NO,
+                                        num,
+                                        GNUNET_NO,
+                                        write_message),
+    connect_peers,
+    GNUNET_TRANSPORT_cmd_send_simple_performance ("send-simple",
+                                      "start-peer",
+                                      "system-create",
+                                      num,
+                                      MESSAGE_SIZE,
+                                      MAX_RECEIVED,
+                                      topology),
+    block_receive,
+    GNUNET_TESTING_cmd_barrier_reached ("test-case-finished-reached",
+                                        "test-case-finished",
+                                        GNUNET_NO,
+                                        num,
+                                        GNUNET_NO,
+                                        write_message),
+    GNUNET_TRANSPORT_cmd_stop_peer ("stop-peer",
+                                    "start-peer"),
+    GNUNET_TESTING_cmd_system_destroy ("system-destroy",
+                                       "system-create"),
+    GNUNET_TESTING_cmd_end ()
+  };
+
+  ts->write_message = write_message;
+
+  is = GNUNET_TESTING_run (commands,
+                      TIMEOUT,
+                      &handle_result,
+                      ts);
+  return is;
+}
+
+
+/**
+ * Entry point for the plugin.
+ *
+ * @param cls NULL
+ * @return the exported block API
+ */
+void *
+libgnunet_test_transport_plugin_cmd_simple_send_performance_init (void *cls)
+{
+  struct GNUNET_TESTING_PluginFunctions *api;
+
+  GNUNET_log_setup ("simple-send",
+                    "DEBUG",
+                    NULL);
+
+  api = GNUNET_new (struct GNUNET_TESTING_PluginFunctions);
+  api->start_testcase = &start_testcase;
+  api->get_waiting_for_barriers = get_waiting_for_barriers;
+  return api;
+}
+
+
+/**
+ * Exit point from the plugin.
+ *
+ * @param cls the return value from 
#libgnunet_test_transport_plugin_simple_send_performance_init
+ * @return NULL
+ */
+void *
+libgnunet_test_transport_plugin_cmd_simple_send_performance_done (void *cls)
+{
+  struct GNUNET_TESTING_PluginFunctions *api = cls;
+
+  GNUNET_free (api);
+  return NULL;
+}
+
+
+/* end of plugin_cmd_simple_send.c */
diff --git a/src/transport/test_transport_simple_send_performance.sh 
b/src/transport/test_transport_simple_send_performance.sh
new file mode 100755
index 000000000..12798c2f0
--- /dev/null
+++ b/src/transport/test_transport_simple_send_performance.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+if ! [ -d "/run/netns" ]; then
+    echo You have to create the directory /run/netns.
+fi
+if [ -f /proc/sys/kernel/unprivileged_userns_clone ]; then
+  if  [ "$(cat /proc/sys/kernel/unprivileged_userns_clone)" != 1 ]; then
+    echo -e "Error during test setup: The kernel parameter 
kernel.unprivileged_userns_clone has to be set to 1! One has to execute\n\n 
sysctl kernel.unprivileged_userns_clone=1\n"
+    exit 78
+  fi
+fi
+exec unshare -r -nmU bash -c "mount -t tmpfs --make-rshared tmpfs /run/netns; 
./test_transport_start_with_config 
test_transport_simple_send_performance_topo.conf"
diff --git a/src/transport/test_transport_simple_send_performance_topo.conf 
b/src/transport/test_transport_simple_send_performance_topo.conf
new file mode 100644
index 000000000..1c73952d2
--- /dev/null
+++ b/src/transport/test_transport_simple_send_performance_topo.conf
@@ -0,0 +1,6 @@
+M:2
+N:1
+X:0
+T:libgnunet_test_transport_plugin_cmd_simple_send_performance
+P:1:1|{connect:{P:1:2:tcp}}
+P:1:2|{connect:{P:1:1:tcp}}
\ No newline at end of file
diff --git a/src/transport/transport-testing-cmds.h 
b/src/transport/transport-testing-cmds.h
index 46f6045dc..6e3c761f2 100644
--- a/src/transport/transport-testing-cmds.h
+++ b/src/transport/transport-testing-cmds.h
@@ -304,6 +304,28 @@ GNUNET_TRANSPORT_cmd_send_simple (const char *label,
                                   struct GNUNET_TESTING_NetjailTopology *
                                   topology);
 
+/**
+ * 
+ *
+ * @param label name for command.
+ * @param start_peer_label Label of the cmd to start a peer.
+ * @param create_label Label of the cmd which started the test system.
+ * @param num Number globally identifying the node.
+ * @param size The size of the test message to send.
+ * @param max_send The number of messages to send.
+ * @param topology The topology for the test setup.
+ * @return command.
+ */
+struct GNUNET_TESTING_Command
+GNUNET_TRANSPORT_cmd_send_simple_performance (const char *label,
+                                  const char *start_peer_label,
+                                  const char *create_label,
+                                  uint32_t num,
+                                  int size,
+                                  int max_send,
+                                  struct GNUNET_TESTING_NetjailTopology *
+                                  topology);
+
 
 /**
  * Create command.
diff --git a/src/transport/transport-testing2.h 
b/src/transport/transport-testing2.h
index b5db28500..b9e492219 100644
--- a/src/transport/transport-testing2.h
+++ b/src/transport/transport-testing2.h
@@ -435,6 +435,25 @@ struct GNUNET_TRANSPORT_TESTING_TestMessage
    */
   uint32_t num GNUNET_PACKED;
 };
+
+struct GNUNET_TRANSPORT_TESTING_PerformanceTestMessage
+{
+  /**
+   * Type is (usually) #GNUNET_TRANSPORT_TESTING_SIMPLE_PERFORMANCE_MTYPE.
+   */
+  struct GNUNET_MessageHeader header;
+
+  /**
+   * Time this message was send via transport api.
+   */
+  struct GNUNET_TIME_AbsoluteNBO time_send;
+  
+  /**
+   * Monotonically increasing counter throughout the test.
+   */
+  uint32_t num GNUNET_PACKED;
+};
+
 GNUNET_NETWORK_STRUCT_END
 
 
@@ -774,6 +793,10 @@ GNUNET_TRANSPORT_TESTING_send (
  */
 #define GNUNET_TRANSPORT_TESTING_SIMPLE_MTYPE2 12346
 
+/**
+ * Message type used by #().
+ */
+#define GNUNET_TRANSPORT_TESTING_SIMPLE_PERFORMANCE_MTYPE 12347
 
 /**
  * Type of the closure argument to pass to
diff --git a/src/transport/transport_api_cmd_send_simple_performance.c 
b/src/transport/transport_api_cmd_send_simple_performance.c
new file mode 100644
index 000000000..7e195d9ef
--- /dev/null
+++ b/src/transport/transport_api_cmd_send_simple_performance.c
@@ -0,0 +1,219 @@
+/*
+      This file is part of GNUnet
+      Copyright (C) 2021 GNUnet e.V.
+
+      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
+      Affero General Public License for more details.
+
+      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 testing_api_cmd_start_peer.c
+ * @brief cmd to start a peer.
+ * @author t3sserakt
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_testing_ng_lib.h"
+#include "gnunet_testing_netjail_lib.h"
+#include "transport-testing2.h"
+#include "transport-testing-cmds.h"
+
+/**
+ * Generic logging shortcut
+ */
+#define LOG(kind, ...) GNUNET_log (kind, __VA_ARGS__)
+
+/**
+ * Struct to hold information for callbacks.
+ *
+ */
+struct SendSimplePerfState
+{
+  /**
+   * Context for our asynchronous completion.
+   */
+  struct GNUNET_TESTING_AsyncContext ac;
+
+  /**
+   * Label of the cmd to start a peer.
+   *
+   */
+  const char *start_peer_label;
+
+  /**
+   * Label of the cmd which started the test system.
+   *
+   */
+  const char *create_label;
+
+  /**
+   * The topology we get the connected nodes from.
+   */
+  struct GNUNET_TESTING_NetjailTopology *topology;
+
+  /**
+   * Size of the message in bytes.
+   */
+  int size;
+
+  /**
+   * Maximum number of messages per peer.
+   */
+  int max_send;
+};
+
+struct MQWrapper
+{
+  /**
+   * State of the command.
+   */
+  struct SendSimplePerfState *sss;
+  
+  /**
+   * Message queue for a peer.
+   */
+  struct GNUNET_MQ_Handle *mq;
+
+  /**
+   * Number of messages allready send.
+   */
+  uint32_t num_send;
+};
+
+/**
+ * The cleanup function of this cmd frees resources the cmd allocated.
+ *
+ */
+static void
+send_simple_cleanup (void *cls)
+{
+  struct SendSimpleState *sss = cls;
+
+  GNUNET_free (sss);
+}
+
+
+static void
+send_simple_single (void *cls)
+{
+  struct MQWrapper *mq_wrapper = cls;
+  struct GNUNET_MQ_Envelope *env;
+  struct GNUNET_TRANSPORT_TESTING_PerformanceTestMessage *test;
+  struct GNUNET_TIME_Absolute now;
+
+  now = GNUNET_TIME_absolute_get ();
+  mq_wrapper->num_send++;
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Sending simple test message with size %llu number %u with mq %p max 
%llu\n",
+       mq_wrapper->sss->size,
+       mq_wrapper->num_send,
+       mq_wrapper->mq,
+       mq_wrapper->sss->max_send);
+
+  env = GNUNET_MQ_msg_extra (test,
+                             mq_wrapper->sss->size - sizeof(*test),
+                             
GNUNET_TRANSPORT_TESTING_SIMPLE_PERFORMANCE_MTYPE);
+  test->num = htonl (mq_wrapper->num_send);
+  test->time_send = GNUNET_TIME_absolute_hton (now);
+  memset (&test[1],
+          '1',
+          mq_wrapper->sss->size - sizeof(*test));
+  GNUNET_MQ_send (mq_wrapper->mq,
+                  env);
+  if (mq_wrapper->sss->max_send > mq_wrapper->num_send)
+    GNUNET_SCHEDULER_add_now (&send_simple_single, mq_wrapper);
+  else
+    GNUNET_TESTING_async_finish (&mq_wrapper->sss->ac);
+}
+
+
+static int
+send_simple_cb  (void *cls,
+                 const struct GNUNET_ShortHashCode *key,
+                 void *value)
+{
+  struct SendSimplePerfState *sss = cls;
+  struct GNUNET_MQ_Handle *mq = value;
+  struct MQWrapper *mq_wrapper = GNUNET_new (struct MQWrapper);
+
+  mq_wrapper->sss = sss;
+  mq_wrapper->mq = mq;
+  send_simple_single (mq_wrapper);
+
+  return GNUNET_OK;
+}
+
+
+/**
+ * The run method of this cmd will send a simple message to the connected 
peers.
+ *
+ */
+static void
+send_simple_run (void *cls,
+                 struct GNUNET_TESTING_Interpreter *is)
+{
+  struct SendSimplePerfState *sss = cls;
+  const struct GNUNET_CONTAINER_MultiShortmap *connected_peers_map;
+  const struct GNUNET_TESTING_Command *peer1_cmd;
+  const struct GNUNET_TESTING_Command *system_cmd;
+  const struct GNUNET_TESTING_System *tl_system;
+  
+
+  peer1_cmd = GNUNET_TESTING_interpreter_lookup_command (is,
+                                                         
sss->start_peer_label);
+  GNUNET_TRANSPORT_get_trait_connected_peers_map (peer1_cmd,
+                                                  &connected_peers_map);
+
+  system_cmd = GNUNET_TESTING_interpreter_lookup_command (is,
+                                                          sss->create_label);
+  GNUNET_TESTING_get_trait_test_system (system_cmd,
+                                        &tl_system);
+
+  GNUNET_CONTAINER_multishortmap_iterate (
+    (struct GNUNET_CONTAINER_MultiShortmap *)
+    connected_peers_map, send_simple_cb,
+    sss);
+}
+
+
+struct GNUNET_TESTING_Command
+GNUNET_TRANSPORT_cmd_send_simple_performance (const char *label,
+                                  const char *start_peer_label,
+                                  const char *create_label,
+                                  uint32_t num,
+                                  int size,
+                                  int max_send,
+                                  struct GNUNET_TESTING_NetjailTopology *
+                                  topology)
+{
+  struct SendSimplePerfState *sss;
+  struct GNUNET_TESTING_Command cmd;
+
+  sss = GNUNET_new (struct SendSimplePerfState);
+  sss->start_peer_label = start_peer_label;
+  sss->create_label = create_label;
+  sss->topology = topology;
+  sss->size = size;
+  sss->max_send = max_send;
+
+  cmd = GNUNET_TESTING_command_new (sss,
+                                     label,
+                                     &send_simple_run,
+                                     &send_simple_cleanup,
+                                     NULL,
+                                     &sss->ac);
+  cmd.asynchronous_finish = GNUNET_YES;
+  return cmd;
+}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]