/*
This file is part of GNUnet.
Copyright (C) 2009, 2012 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 nse/test_nse_multipeer.c
* @brief Testcase for the network size estimation service. Starts
* a peergroup with a given number of peers, then waits to
* receive size estimates from each peer. Expects to wait
* for one message from each peer.
*/
#include "platform.h"
#include "gnunet_testbed_service.h"
#include "gnunet_nse_service.h"
/**
* How many peers do we start?
*/
#define NUM_PEERS 4
/**
* How long do we run the test?
*/
#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300)
/**
* Information we track for each peer.
*/
struct NSEPeer
{
/**
* Handle for NSE connect operation.
*/
struct GNUNET_TESTBED_Operation *op;
/**
* Handle to NSE service.
*/
struct GNUNET_NSE_Handle *nse_handle;
};
/**
* Information for all the peers.
*/
static struct NSEPeer nse_peers[NUM_PEERS];
/**
* Return value from 'main'.
*/
static int ok;
/**
* Task run on timeout to shut everything down.
*/
static void
shutdown_task (void *cls)
{
unsigned int i;
for (i=0;iop);
if (NULL != emsg)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Failed to connect to NSE service: %s\n",
emsg);
ok = 1;
GNUNET_SCHEDULER_shutdown ();
return;
}
peer->nse_handle = nse;
}
/**
* Adapter function called to establish a connection to
* the NSE service.
*
* @param cls closure
* @param cfg configuration of the peer to connect to; will be available until
* GNUNET_TESTBED_operation_done() is called on the operation returned
* from GNUNET_TESTBED_service_connect()
* @return service handle to return in 'op_result', NULL on error
*/
static void *
nse_connect_adapter (void *cls,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
return GNUNET_NSE_connect (cfg,
&handle_estimate,
cls);
}
/**
* Adapter function called to destroy connection to
* NSE service.
*
* @param cls closure
* @param op_result service handle returned from the connect adapter
*/
static void
nse_disconnect_adapter (void *cls,
void *op_result)
{
GNUNET_NSE_disconnect (op_result);
}
/**
* Actual "main" function for the testcase.
*
* @param cls closure
* @param h the run handle
* @param num_peers number of peers in 'peers'
* @param peers handle to peers run in the testbed
* @param links_succeeded the number of overlay link connection attempts that
* succeeded
* @param links_failed the number of overlay link connection attempts that
* failed
*/
static void
run (void *cls,
struct GNUNET_TESTBED_RunHandle *h,
unsigned int num_peers,
struct GNUNET_TESTBED_Peer **peers,
unsigned int links_succeeded,
unsigned int links_failed)
{
unsigned int i;
GNUNET_assert (NUM_PEERS == num_peers);
for (i=0;i