From 6d8ba0321cde6cf5dd240b9cbcf36dc95bfdc798 Mon Sep 17 00:00:00 2001 From: "Schanzenbach, Martin" Date: Sun, 22 Dec 2019 12:41:26 +0900 Subject: rename test as it is now communicator-independent --- src/transport/test_communicator.c | 281 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 src/transport/test_communicator.c (limited to 'src/transport/test_communicator.c') diff --git a/src/transport/test_communicator.c b/src/transport/test_communicator.c new file mode 100644 index 000000000..34be5d66a --- /dev/null +++ b/src/transport/test_communicator.c @@ -0,0 +1,281 @@ +/* + This file is part of GNUnet. + Copyright (C) 2019 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 . + + SPDX-License-Identifier: AGPL3.0-or-later +*/ + +/** +* @file transport/test_communicator.c +* @brief test the communicators +* @author Julius Bünger +* @author Martin Schanzenbach +*/ +#include "platform.h" +#include "gnunet_util_lib.h" +#include "transport-testing2.h" +#include "gnunet_ats_transport_service.h" +#include "gnunet_signatures.h" +#include "gnunet_testing_lib.h" +#include "transport.h" + +#include + + +#define LOG(kind, ...) GNUNET_log_from (kind, \ + "test_transport_communicator", \ + __VA_ARGS__) + +#define NUM_PEERS 2 + +static struct GNUNET_PeerIdentity peer_id[NUM_PEERS]; + +static char *communicator_binary; + +static struct +GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle *tc_hs[NUM_PEERS]; + +static struct GNUNET_CONFIGURATION_Handle *cfg_peers[NUM_PEERS]; + +static char **cfg_peers_name; + +static int ret; + +// static char *addresses[NUM_PEERS]; + + +#define PAYLOAD_SIZE 256 + +// static char payload[PAYLOAD_SIZE] = "TEST PAYLOAD"; +// static char payload[] = "TEST PAYLOAD"; +static uint32_t payload = 42; + +static void +communicator_available_cb (void *cls, + struct + GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle + *tc_h, + enum GNUNET_TRANSPORT_CommunicatorCharacteristics cc, + char *address_prefix) +{ + LOG (GNUNET_ERROR_TYPE_INFO, + "Communicator available. (cc: %u, prefix: %s)\n", + cc, + address_prefix); +} + + +static void +add_address_cb (void *cls, + struct GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle * + tc_h, + const char *address, + struct GNUNET_TIME_Relative expiration, + uint32_t aid, + enum GNUNET_NetworkType nt) +{ + LOG (GNUNET_ERROR_TYPE_DEBUG, + "New address. (addr: %s, expir: %" PRIu32 ", ID: %" PRIu32 ", nt: %u\n", + address, + expiration.rel_value_us, + aid, + nt); + // addresses[1] = GNUNET_strdup (address); + if (0 == strcmp ((char*) cls, cfg_peers_name[NUM_PEERS - 1])) + GNUNET_TRANSPORT_TESTING_transport_communicator_open_queue (tc_hs[0], + &peer_id[ + NUM_PEERS + - 1], + address); +} + + +/** + * @brief Callback that informs whether the requested queue will be + * established + * + * Implements #GNUNET_TRANSPORT_TESTING_QueueCreateReplyCallback. + * + * @param cls Closure - unused + * @param tc_h Communicator handle - unused + * @param will_try #GNUNET_YES if queue will be established + * #GNUNET_NO if queue will not be established (bogous address) + */ +static void +queue_create_reply_cb (void *cls, + struct + GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle * + tc_h, + int will_try) +{ + if (GNUNET_YES == will_try) + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Queue will be established!\n"); + else + LOG (GNUNET_ERROR_TYPE_WARNING, + "Queue won't be established (bougus address?)!\n"); +} + + +/** + * @brief Handle opening of queue + * + * Issues sending of test data + * + * Implements #GNUNET_TRANSPORT_TESTING_AddQueueCallback + * + * @param cls Closure + * @param tc_h Communicator handle + * @param tc_queue Handle to newly opened queue + */ +static void +add_queue_cb (void *cls, + struct GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle *tc_h, + struct GNUNET_TRANSPORT_TESTING_TransportCommunicatorQueue * + tc_queue) +{ + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Got Queue!\n"); + GNUNET_TRANSPORT_TESTING_transport_communicator_send (tc_queue, + &payload, + sizeof(payload)); +} + + +/** + * @brief Handle an incoming message + * + * Implements #GNUNET_TRANSPORT_TESTING_IncomingMessageCallback + + * @param cls Closure + * @param tc_h Handle to the receiving communicator + * @param msg Received message + */ +void +incoming_message_cb (void *cls, + struct GNUNET_TRANSPORT_TESTING_TransportCommunicatorHandle + *tc_h, + const struct GNUNET_TRANSPORT_IncomingMessage *msg) +{ + char *payload_ptr; + if (0 != strcmp ((char*) cls, cfg_peers_name[NUM_PEERS - 1])) + return; // TODO? + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "%s received data (%lu bytes payload)\n", + (char*) cls, + ntohs (msg->header.size) - sizeof (struct GNUNET_TRANSPORT_IncomingMessage)); + payload_ptr = (char*)&msg[1] + sizeof (struct GNUNET_MessageHeader); + ret = memcmp (payload_ptr, &payload, sizeof (payload)); + GNUNET_SCHEDULER_shutdown (); +} + +/** + * @brief Main function called by the scheduler + * + * @param cls Closure - Handle to configuration + */ +static void +run (void *cls) +{ + for (int i = 0; i < NUM_PEERS; i++) + { + tc_hs[i] = GNUNET_TRANSPORT_TESTING_transport_communicator_service_start ( + "transport", + communicator_binary, + cfg_peers_name[i], + &communicator_available_cb, + &add_address_cb, + &queue_create_reply_cb, + &add_queue_cb, + &incoming_message_cb, + cfg_peers_name[i]); /* cls */ + } +} + + +int +main (int argc, + char *const *argv) +{ + struct GNUNET_CRYPTO_EddsaPrivateKey *private_key; + char *communicator_name; + char *cfg_peer; + ret = 1; + + communicator_name = GNUNET_TESTING_get_testname_from_underscore (argv[0]); + GNUNET_asprintf (&communicator_binary, "gnunet-communicator-%s", + communicator_name); + cfg_peers_name = GNUNET_malloc (sizeof(char*) * NUM_PEERS); + if (GNUNET_OK != GNUNET_log_setup ("test_communicator", + "DEBUG", + "test_communicator.log")) + { + fprintf (stderr, "Unable to setup log\n"); + GNUNET_break (0); + return 2; + } + for (int i = 0; i < NUM_PEERS; i++) + { + GNUNET_asprintf ((&cfg_peer), + "test_communicator_%s_peer%u.conf", + communicator_name, i + 1); + cfg_peers_name[i] = cfg_peer; + cfg_peers[i] = GNUNET_CONFIGURATION_create (); + if (GNUNET_YES == + GNUNET_DISK_file_test (cfg_peers_name[i])) + { + if (GNUNET_SYSERR == + GNUNET_CONFIGURATION_load (cfg_peers[i], + cfg_peers_name[i])) + { + fprintf (stderr, + "Malformed configuration file `%s', exiting ...\n", + cfg_peers_name[i]); + return 1; + } + } + else + { + if (GNUNET_SYSERR == + GNUNET_CONFIGURATION_load (cfg_peers[i], + NULL)) + { + fprintf (stderr, + "Configuration file %s does not exist, exiting ...\n", + cfg_peers_name[i]); + return 1; + } + } + private_key = + GNUNET_CRYPTO_eddsa_key_create_from_configuration (cfg_peers[i]); + if (NULL == private_key) + { + LOG (GNUNET_ERROR_TYPE_ERROR, + "Unable to get peer ID\n"); + return 1; + } + GNUNET_CRYPTO_eddsa_key_get_public (private_key, + &peer_id[i].public_key); + GNUNET_free (private_key); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Identity of peer %u is %s\n", + i, GNUNET_i2s_full (&peer_id[i])); + } + fprintf (stderr, "Starting test...\n"); + GNUNET_SCHEDULER_run (&run, + NULL); + return ret; +} -- cgit v1.2.3