X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_testing_lib.h;h=b170670d1ffe92a3d8230dd73142c77783759f23;hb=211fd52268a5ae7856273dd8d8b3b3ed427beadb;hp=a00e5997654e17d0891282961ff43ca89983e879;hpb=d8abe51562c11473ebcb823ad67c529be2c9dc92;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_testing_lib.h b/src/include/gnunet_testing_lib.h index a00e59976..b170670d1 100644 --- a/src/include/gnunet_testing_lib.h +++ b/src/include/gnunet_testing_lib.h @@ -43,6 +43,8 @@ extern "C" #endif #endif +#define HOSTKEYFILESIZE 914 + /** * Handle for a GNUnet daemon (technically a set of * daemons; the handle is really for the master ARM @@ -86,10 +88,12 @@ struct GNUNET_TESTING_Host * @param d handle for the daemon * @param emsg error message (NULL on success) */ -typedef void (*GNUNET_TESTING_NotifyHostkeyCreated)(void *cls, - const struct GNUNET_PeerIdentity *id, - struct GNUNET_TESTING_Daemon *d, - const char *emsg); +typedef void (*GNUNET_TESTING_NotifyHostkeyCreated) (void *cls, + const struct + GNUNET_PeerIdentity * id, + struct + GNUNET_TESTING_Daemon * d, + const char *emsg); /** * Prototype of a function that will be called whenever @@ -101,12 +105,14 @@ typedef void (*GNUNET_TESTING_NotifyHostkeyCreated)(void *cls, * @param d handle for the daemon * @param emsg error message (NULL on success) */ -typedef void (*GNUNET_TESTING_NotifyDaemonRunning)(void *cls, - const struct GNUNET_PeerIdentity *id, - const struct GNUNET_CONFIGURATION_Handle *cfg, - struct GNUNET_TESTING_Daemon *d, - const char *emsg); - +typedef void (*GNUNET_TESTING_NotifyDaemonRunning) (void *cls, + const struct + GNUNET_PeerIdentity * id, + const struct + GNUNET_CONFIGURATION_Handle + * cfg, + struct GNUNET_TESTING_Daemon + * d, const char *emsg); /** * Handle to an entire testbed of GNUnet peers. @@ -155,6 +161,11 @@ enum GNUNET_TESTING_StartPhase */ SP_START_CORE, + /** + * CORE is up, now make sure we get the HELLO for this peer. + */ + SP_GET_HELLO, + /** * Core has notified us that we've established a connection to the service. * The main FSM halts here and waits to be moved to UPDATE or CLEANUP. @@ -168,6 +179,18 @@ enum GNUNET_TESTING_StartPhase */ SP_SHUTDOWN_START, + /** + * We should shutdown a *single* service via gnunet-arm. Call the dead_cb + * upon notification from gnunet-arm that the service has been stopped. + */ + SP_SERVICE_SHUTDOWN_START, + + /** + * We should start a *single* service via gnunet-arm. Call the daemon cb + * upon notification from gnunet-arm that the service has been started. + */ + SP_SERVICE_START, + /** * We've received a configuration update and are currently waiting for * the copy process for the update to complete. Once it is, we will @@ -184,8 +207,7 @@ enum GNUNET_TESTING_StartPhase * @param cls closure * @param emsg NULL on success */ -typedef void (*GNUNET_TESTING_NotifyCompletion)(void *cls, - const char *emsg); +typedef void (*GNUNET_TESTING_NotifyCompletion) (void *cls, const char *emsg); /** * Prototype of a function that will be called with the @@ -194,8 +216,8 @@ typedef void (*GNUNET_TESTING_NotifyCompletion)(void *cls, * @param cls closure * @param num_connections the number of connections created */ -typedef void (*GNUNET_TESTING_NotifyConnections)(void *cls, - unsigned int num_connections); +typedef void (*GNUNET_TESTING_NotifyConnections) (void *cls, + unsigned int num_connections); /** * Handle for a GNUnet daemon (technically a set of @@ -204,11 +226,6 @@ typedef void (*GNUNET_TESTING_NotifyConnections)(void *cls, */ struct GNUNET_TESTING_Daemon { - /** - * Our scheduler. - */ - struct GNUNET_SCHEDULER_Handle *sched; - /** * Our configuration. */ @@ -287,32 +304,34 @@ struct GNUNET_TESTING_Daemon void *update_cb_cls; /** - * Identity of this peer (once started). + * PID of the process we used to run gnunet-arm or SSH to start the peer. */ - struct GNUNET_PeerIdentity id; + struct GNUNET_OS_Process *proc_arm_start; /** - * Flag to indicate that we've already been asked - * to terminate (but could not because some action - * was still pending). + * PID of the process we used to run gnunet-arm or SSH to stop the peer. */ - int dead; + struct GNUNET_OS_Process *proc_arm_stop; /** - * PID of the process that we started last. + * PID of the process we used to run gnunet-arm or SSH to manage services at the peer. */ - struct GNUNET_OS_Process *proc; + struct GNUNET_OS_Process *proc_arm_srv_start; /** - * In which phase are we during the start of - * this process? + * PID of the process we used to run gnunet-arm or SSH to manage services at the peer. */ - enum GNUNET_TESTING_StartPhase phase; + struct GNUNET_OS_Process *proc_arm_srv_stop; /** - * ID of the current task. + * PID of the process we used to run copy files */ - GNUNET_SCHEDULER_TaskIdentifier task; + struct GNUNET_OS_Process *proc_arm_copying; + + /** + * PID of the process we used to run gnunet-peerinfo. + */ + struct GNUNET_OS_Process *proc_arm_peerinfo; /** * Handle to the server. @@ -324,6 +343,11 @@ struct GNUNET_TESTING_Daemon */ struct GNUNET_TRANSPORT_Handle *th; + /** + * Handle for getting HELLOs from transport + */ + struct GNUNET_TRANSPORT_GetHelloHandle *ghh; + /** * HELLO message for this peer */ @@ -335,9 +359,41 @@ struct GNUNET_TESTING_Daemon struct GNUNET_DISK_PipeHandle *pipe_stdout; /** - * Output from gnunet-peerinfo is read into this buffer. + * Currently, a single char * pointing to a service + * that has been churned off. + * + * FIXME: make this a linked list of services that have been churned off!!! */ - char hostkeybuf[105]; + char *churned_services; + + /** + * ID of the current task. + */ + GNUNET_SCHEDULER_TaskIdentifier task; + + /** + * Identity of this peer (once started). + */ + struct GNUNET_PeerIdentity id; + + /** + * Flag to indicate that we've already been asked + * to terminate (but could not because some action + * was still pending). + */ + int dead; + + /** + * GNUNET_YES if the hostkey has been created + * for this peer, GNUNET_NO otherwise. + */ + int have_hostkey; + + /** + * In which phase are we during the start of + * this process? + */ + enum GNUNET_TESTING_StartPhase phase; /** * Current position in 'hostkeybuf' (for reading from gnunet-peerinfo) @@ -354,6 +410,12 @@ struct GNUNET_TESTING_Daemon * (if it's going to be restarted later) */ int churn; + + /** + * Output from gnunet-peerinfo is read into this buffer. + */ + char hostkeybuf[105]; + }; @@ -377,15 +439,24 @@ struct GNUNET_TESTING_PeerGroup; * @param second_daemon handle for the second daemon * @param emsg error message (NULL on success) */ -typedef void (*GNUNET_TESTING_NotifyConnection)(void *cls, - const struct GNUNET_PeerIdentity *first, - const struct GNUNET_PeerIdentity *second, - uint32_t distance, - const struct GNUNET_CONFIGURATION_Handle *first_cfg, - const struct GNUNET_CONFIGURATION_Handle *second_cfg, - struct GNUNET_TESTING_Daemon *first_daemon, - struct GNUNET_TESTING_Daemon *second_daemon, - const char *emsg); +typedef void (*GNUNET_TESTING_NotifyConnection) (void *cls, + const struct + GNUNET_PeerIdentity * first, + const struct + GNUNET_PeerIdentity * second, + uint32_t distance, + const struct + GNUNET_CONFIGURATION_Handle * + first_cfg, + const struct + GNUNET_CONFIGURATION_Handle * + second_cfg, + struct GNUNET_TESTING_Daemon * + first_daemon, + struct GNUNET_TESTING_Daemon * + second_daemon, + const char *emsg); + /** * Prototype of a callback function indicating that two peers @@ -397,12 +468,12 @@ typedef void (*GNUNET_TESTING_NotifyConnection)(void *cls, * @param distance distance between the connected peers * @param emsg error message (NULL on success) */ -typedef void (*GNUNET_TESTING_NotifyTopology)(void *cls, - const struct GNUNET_PeerIdentity *first, - const struct GNUNET_PeerIdentity *second, - struct GNUNET_TIME_Relative latency, - uint32_t distance, - const char *emsg); +typedef void (*GNUNET_TESTING_NotifyTopology) (void *cls, + const struct GNUNET_PeerIdentity + * first, + const struct GNUNET_PeerIdentity + * second, const char *emsg); + /** * Starts a GNUnet daemon. GNUnet must be installed on the target @@ -410,13 +481,15 @@ typedef void (*GNUNET_TESTING_NotifyTopology)(void *cls, * reachable via "ssh" (unless the hostname is "NULL") without the * need to enter a password. * - * @param sched scheduler to use * @param cfg configuration to use * @param timeout how long to wait starting up peers + * @param pretend GNUNET_YES to set up files but not start peer GNUNET_NO + * to really start the peer (default) * @param hostname name of the machine where to run GNUnet * (use NULL for localhost). * @param ssh_username ssh username to use when connecting to hostname * @param sshport port to pass to ssh process when connecting to hostname + * @param hostkey pointer to a hostkey to be written to disk (instead of being generated) * @param hostkey_callback function to call once the hostkey has been * generated for this peer, but it hasn't yet been started * (NULL to start immediately, otherwise waits on GNUNET_TESTING_daemon_continue_start) @@ -426,14 +499,12 @@ typedef void (*GNUNET_TESTING_NotifyTopology)(void *cls, * @return handle to the daemon (actual start will be completed asynchronously) */ struct GNUNET_TESTING_Daemon * -GNUNET_TESTING_daemon_start (struct GNUNET_SCHEDULER_Handle *sched, - const struct GNUNET_CONFIGURATION_Handle *cfg, - struct GNUNET_TIME_Relative timeout, - const char *hostname, - const char *ssh_username, - uint16_t sshport, - GNUNET_TESTING_NotifyHostkeyCreated hostkey_callback, - void *hostkey_cls, +GNUNET_TESTING_daemon_start (const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_TIME_Relative timeout, int pretend, + const char *hostname, const char *ssh_username, + uint16_t sshport, const char *hostkey, + GNUNET_TESTING_NotifyHostkeyCreated + hostkey_callback, void *hostkey_cls, GNUNET_TESTING_NotifyDaemonRunning cb, void *cb_cls); @@ -445,18 +516,33 @@ GNUNET_TESTING_daemon_start (struct GNUNET_SCHEDULER_Handle *sched, * @param daemon the daemon to finish starting */ void -GNUNET_TESTING_daemon_continue_startup(struct GNUNET_TESTING_Daemon *daemon); +GNUNET_TESTING_daemon_continue_startup (struct GNUNET_TESTING_Daemon *daemon); + /** * Check whether the given daemon is running. * * @param daemon the daemon to check - * * @return GNUNET_YES if the daemon is up, GNUNET_NO if the * daemon is down, GNUNET_SYSERR on error. */ int -GNUNET_TESTING_daemon_running (struct GNUNET_TESTING_Daemon *daemon); +GNUNET_TESTING_test_daemon_running (struct GNUNET_TESTING_Daemon *daemon); + + +/** + * Obtain the peer identity of the peer with the given configuration + * handle. This function reads the private key of the peer, obtains + * the public key and hashes it. + * + * @param cfg configuration of the peer + * @param pid where to store the peer identity + * @return GNUNET_OK on success, GNUNET_SYSERR on failure + */ +int +GNUNET_TESTING_get_peer_identity (const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_PeerIdentity *pid); + /** * Restart (stop and start) a GNUnet daemon. @@ -467,7 +553,9 @@ GNUNET_TESTING_daemon_running (struct GNUNET_TESTING_Daemon *daemon); */ void GNUNET_TESTING_daemon_restart (struct GNUNET_TESTING_Daemon *d, - GNUNET_TESTING_NotifyDaemonRunning cb, void *cb_cls); + GNUNET_TESTING_NotifyDaemonRunning cb, + void *cb_cls); + /** * Start a peer that has previously been stopped using the daemon_stop @@ -484,6 +572,42 @@ GNUNET_TESTING_daemon_start_stopped (struct GNUNET_TESTING_Daemon *daemon, GNUNET_TESTING_NotifyDaemonRunning cb, void *cb_cls); + +/** + * Starts a GNUnet daemon's service. + * + * @param d the daemon for which the service should be started + * @param service the name of the service to start + * @param timeout how long to wait for process for startup + * @param cb function called once gnunet-arm returns + * @param cb_cls closure for cb + */ +void +GNUNET_TESTING_daemon_start_service (struct GNUNET_TESTING_Daemon *d, + const char *service, + struct GNUNET_TIME_Relative timeout, + GNUNET_TESTING_NotifyDaemonRunning cb, + void *cb_cls); + + +/** + * Starts a GNUnet daemon's service which has been previously turned off. + * + * @param d the daemon for which the service should be started + * @param service the name of the service to start + * @param timeout how long to wait for process for startup + * @param cb function called once gnunet-arm returns + * @param cb_cls closure for cb + */ +void +GNUNET_TESTING_daemon_start_stopped_service (struct GNUNET_TESTING_Daemon *d, + char *service, + struct GNUNET_TIME_Relative + timeout, + GNUNET_TESTING_NotifyDaemonRunning + cb, void *cb_cls); + + /** * Get a certain testing daemon handle. * @@ -491,10 +615,11 @@ GNUNET_TESTING_daemon_start_stopped (struct GNUNET_TESTING_Daemon *daemon, * @param position the number of the peer to return */ struct GNUNET_TESTING_Daemon * -GNUNET_TESTING_daemon_get (struct GNUNET_TESTING_PeerGroup *pg, - unsigned int position); +GNUNET_TESTING_daemon_get (struct GNUNET_TESTING_PeerGroup *pg, + unsigned int position); -/* + +/** * Get a daemon by peer identity, so callers can * retrieve the daemon without knowing it's offset. * @@ -505,7 +630,8 @@ GNUNET_TESTING_daemon_get (struct GNUNET_TESTING_PeerGroup *pg, */ struct GNUNET_TESTING_Daemon * GNUNET_TESTING_daemon_get_by_id (struct GNUNET_TESTING_PeerGroup *pg, - struct GNUNET_PeerIdentity *peer_id); + const struct GNUNET_PeerIdentity *peer_id); + /** * Stops a GNUnet daemon. @@ -527,6 +653,29 @@ GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d, int delete_files, int allow_restart); + +/** + * Create a new configuration using the given configuration + * as a template; however, each PORT in the existing cfg + * must be renumbered by incrementing "*port". If we run + * out of "*port" numbers, return NULL. + * + * @param cfg template configuration + * @param off the current peer offset + * @param port port numbers to use, update to reflect + * port numbers that were used + * @param upnum number to make unix domain socket names unique + * @param hostname hostname of the controlling host, to allow control connections from + * @param fdnum number used to offset the unix domain socket for grouped processes + * (such as statistics or peerinfo, which can be shared among others) + * + * @return new configuration, NULL on error + */ +struct GNUNET_CONFIGURATION_Handle * +GNUNET_TESTING_create_cfg (const struct GNUNET_CONFIGURATION_Handle *cfg, uint32_t off, + uint16_t * port, uint32_t * upnum, const char *hostname, + uint32_t * fdnum); + /** * Changes the configuration of a GNUnet daemon. * @@ -535,43 +684,58 @@ GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d, * @param cb function called once the configuration was changed * @param cb_cls closure for cb */ -void GNUNET_TESTING_daemon_reconfigure (struct GNUNET_TESTING_Daemon *d, - struct GNUNET_CONFIGURATION_Handle *cfg, - GNUNET_TESTING_NotifyCompletion cb, - void * cb_cls); +void +GNUNET_TESTING_daemon_reconfigure (struct GNUNET_TESTING_Daemon *d, + struct GNUNET_CONFIGURATION_Handle *cfg, + GNUNET_TESTING_NotifyCompletion cb, + void *cb_cls); /** - * Establish a connection between two GNUnet daemons. + * Stops a single service of a GNUnet daemon. Used like daemon_stop, + * only doesn't stop the entire peer in any case. If the service + * is not currently running, this call is likely to fail after + * timeout! * - * @param d1 handle for the first daemon - * @param d2 handle for the second daemon - * @param timeout how long is the connection attempt - * allowed to take? - * @param max_connect_attempts how many times should we try to reconnect - * (within timeout) - * @param cb function to call at the end + * @param d the daemon that should be stopped + * @param service the name of the service to stop + * @param timeout how long to wait for process for shutdown to complete + * @param cb function called once the service was stopped * @param cb_cls closure for cb */ -void GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, - struct GNUNET_TESTING_Daemon *d2, - struct GNUNET_TIME_Relative timeout, - unsigned int max_connect_attempts, - GNUNET_TESTING_NotifyConnection cb, - void *cb_cls); +void +GNUNET_TESTING_daemon_stop_service (struct GNUNET_TESTING_Daemon *d, + const char *service, + struct GNUNET_TIME_Relative timeout, + GNUNET_TESTING_NotifyCompletion cb, + void *cb_cls); +/** + * Read a testing hosts file based on a configuration. + * Returns a DLL of hosts (caller must free!) on success + * or NULL on failure. + * + * @param cfg a configuration with a testing section + * + * @return DLL of hosts on success, NULL on failure + */ +struct GNUNET_TESTING_Host * +GNUNET_TESTING_hosts_load (const struct GNUNET_CONFIGURATION_Handle *cfg); /** - * Start count gnunetd processes with the same set of transports and + * Start count gnunet instances with the same set of transports and * applications. The port numbers (any option called "PORT") will be * adjusted to ensure that no two peers running on the same system * have the same port(s) in their respective configurations. * - * @param sched scheduler to use * @param cfg configuration template to use * @param total number of daemons to start + * @param max_concurrent_connections for testing, how many peers can +* we connect to simultaneously + * @param max_concurrent_ssh when starting with ssh, how many ssh + * connections will we allow at once (based on remote hosts allowed!) * @param timeout total time allowed for peers to start * @param hostkey_callback function to call on each peers hostkey generation * if NULL, peers will be started by this call, if non-null, @@ -582,23 +746,26 @@ void GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, * @param cb_cls closure for cb * @param connect_callback function to call each time two hosts are connected * @param connect_callback_cls closure for connect_callback - * @param hostnames linked list of hosts to use to start peers on (NULL to run on localhost only) + * @param hostnames linked list of host structs to use to start peers on + * (NULL to run on localhost only) * * @return NULL on error, otherwise handle to control peer group */ struct GNUNET_TESTING_PeerGroup * -GNUNET_TESTING_daemons_start (struct GNUNET_SCHEDULER_Handle *sched, - const struct GNUNET_CONFIGURATION_Handle *cfg, +GNUNET_TESTING_daemons_start (const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int total, + unsigned int max_concurrent_connections, + unsigned int max_concurrent_ssh, struct GNUNET_TIME_Relative timeout, - GNUNET_TESTING_NotifyHostkeyCreated hostkey_callback, - void *hostkey_cls, + GNUNET_TESTING_NotifyHostkeyCreated + hostkey_callback, void *hostkey_cls, GNUNET_TESTING_NotifyDaemonRunning cb, void *cb_cls, - GNUNET_TESTING_NotifyConnection - connect_callback, void *connect_callback_cls, + GNUNET_TESTING_NotifyConnection connect_callback, + void *connect_callback_cls, const struct GNUNET_TESTING_Host *hostnames); + /** * Function which continues a peer group starting up * after successfully generating hostkeys for each peer. @@ -606,7 +773,54 @@ GNUNET_TESTING_daemons_start (struct GNUNET_SCHEDULER_Handle *sched, * @param pg the peer group to continue starting */ void -GNUNET_TESTING_daemons_continue_startup(struct GNUNET_TESTING_PeerGroup *pg); +GNUNET_TESTING_daemons_continue_startup (struct GNUNET_TESTING_PeerGroup *pg); + + +/** + * Handle for an active request to connect two peers. + */ +struct GNUNET_TESTING_ConnectContext; + + +/** + * Establish a connection between two GNUnet daemons. The daemons + * must both be running and not be stopped until either the + * 'cb' callback is called OR the connection request has been + * explicitly cancelled. + * + * @param d1 handle for the first daemon + * @param d2 handle for the second daemon + * @param timeout how long is the connection attempt + * allowed to take? + * @param max_connect_attempts how many times should we try to reconnect + * (within timeout) + * @param send_hello GNUNET_YES to send the HELLO, GNUNET_NO to assume + * the HELLO has already been exchanged + * @param cb function to call at the end + * @param cb_cls closure for cb + * @return handle to cancel the request, NULL on error + */ +struct GNUNET_TESTING_ConnectContext * +GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, + struct GNUNET_TESTING_Daemon *d2, + struct GNUNET_TIME_Relative timeout, + unsigned int max_connect_attempts, + int send_hello, + GNUNET_TESTING_NotifyConnection cb, + void *cb_cls); + + + +/** + * Cancel an attempt to connect two daemons. + * + * @param cc connect context + */ +void +GNUNET_TESTING_daemons_connect_cancel (struct GNUNET_TESTING_ConnectContext + *cc); + + /** * Restart all peers in the given group. @@ -630,10 +844,9 @@ GNUNET_TESTING_daemons_restart (struct GNUNET_TESTING_PeerGroup *pg, * @param cb_cls closure for cb */ void -GNUNET_TESTING_daemons_stop (struct GNUNET_TESTING_PeerGroup *pg, +GNUNET_TESTING_daemons_stop (struct GNUNET_TESTING_PeerGroup *pg, struct GNUNET_TIME_Relative timeout, - GNUNET_TESTING_NotifyCompletion cb, - void *cb_cls); + GNUNET_TESTING_NotifyCompletion cb, void *cb_cls); /** @@ -646,6 +859,7 @@ GNUNET_TESTING_daemons_stop (struct GNUNET_TESTING_PeerGroup *pg, unsigned int GNUNET_TESTING_daemons_running (struct GNUNET_TESTING_PeerGroup *pg); + /** * Simulate churn by stopping some peers (and possibly * re-starting others if churn is called multiple times). This @@ -659,6 +873,7 @@ GNUNET_TESTING_daemons_running (struct GNUNET_TESTING_PeerGroup *pg); * running even though the "peer" is being varied offline. * * @param pg handle for the peer group + * @param service the service to churn on/off, NULL for all * @param voff number of peers that should go offline * @param von number of peers that should come back online; * must be zero on first call (since "testbed_start" @@ -670,11 +885,30 @@ GNUNET_TESTING_daemons_running (struct GNUNET_TESTING_PeerGroup *pg); */ void GNUNET_TESTING_daemons_churn (struct GNUNET_TESTING_PeerGroup *pg, - unsigned int voff, + char *service, unsigned int voff, unsigned int von, struct GNUNET_TIME_Relative timeout, - GNUNET_TESTING_NotifyCompletion cb, - void *cb_cls); + GNUNET_TESTING_NotifyCompletion cb, void *cb_cls); + + +/** + * Start a given service for each of the peers in the peer group. + * + * @param pg handle for the peer group + * @param service the service to start + * @param timeout how long to wait for operations to finish before + * giving up + * @param cb function to call once finished + * @param cb_cls closure for cb + * + */ +void +GNUNET_TESTING_daemons_start_service (struct GNUNET_TESTING_PeerGroup *pg, + char *service, + struct GNUNET_TIME_Relative timeout, + GNUNET_TESTING_NotifyCompletion cb, + void *cb_cls); + /** * Callback function to process statistic values. @@ -688,20 +922,29 @@ GNUNET_TESTING_daemons_churn (struct GNUNET_TESTING_PeerGroup *pg, * @return GNUNET_OK to continue, GNUNET_SYSERR to abort iteration */ typedef int (*GNUNET_TESTING_STATISTICS_Iterator) (void *cls, - const struct GNUNET_PeerIdentity *peer, + const struct + GNUNET_PeerIdentity * peer, const char *subsystem, const char *name, uint64_t value, int is_persistent); + /** * Iterate over all (running) peers in the peer group, retrieve * all statistics from each. + * + * @param pg the peergroup to iterate statistics of + * @param cont continuation to call once call is completed(?) + * @param proc processing function for each statistic retrieved + * @param cls closure to pass to proc */ void GNUNET_TESTING_get_statistics (struct GNUNET_TESTING_PeerGroup *pg, GNUNET_STATISTICS_Callback cont, - GNUNET_TESTING_STATISTICS_Iterator proc, void *cls); + GNUNET_TESTING_STATISTICS_Iterator proc, + void *cls); + /** * Topologies supported for testbeds. @@ -757,7 +1000,12 @@ enum GNUNET_TESTING_Topology /** * All peers are disconnected. */ - GNUNET_TESTING_TOPOLOGY_NONE + GNUNET_TESTING_TOPOLOGY_NONE, + + /** + * Read a topology from a given file. + */ + GNUNET_TESTING_TOPOLOGY_FROM_FILE }; /** @@ -812,8 +1060,9 @@ enum GNUNET_TESTING_TopologyOption * known topology, GNUNET_NO if not */ int -GNUNET_TESTING_topology_get(enum GNUNET_TESTING_Topology *topology, - const char * topology_string); +GNUNET_TESTING_topology_get (enum GNUNET_TESTING_Topology *topology, + const char *topology_string); + /** * Get connect topology option from string input. @@ -825,8 +1074,9 @@ GNUNET_TESTING_topology_get(enum GNUNET_TESTING_Topology *topology, * known topology, GNUNET_NO if not */ int -GNUNET_TESTING_topology_option_get(enum GNUNET_TESTING_TopologyOption *topology_option, - const char * topology_string); +GNUNET_TESTING_topology_option_get (enum GNUNET_TESTING_TopologyOption + *topology_option, + const char *topology_string); /** @@ -871,6 +1121,7 @@ GNUNET_TESTING_create_topology (struct GNUNET_TESTING_PeerGroup *pg, enum GNUNET_TESTING_Topology restrict_topology, const char *restrict_transports); + /** * Iterate over all (running) peers in the peer group, retrieve * all connections that each currently has. @@ -881,7 +1132,26 @@ GNUNET_TESTING_create_topology (struct GNUNET_TESTING_PeerGroup *pg, */ void GNUNET_TESTING_get_topology (struct GNUNET_TESTING_PeerGroup *pg, - GNUNET_TESTING_NotifyTopology cb, void *cls); + GNUNET_TESTING_NotifyTopology cb, void *cls); + + +/** + * Stop the connection process temporarily. + * + * @param pg the peer group to stop connecting + */ +void +GNUNET_TESTING_stop_connections (struct GNUNET_TESTING_PeerGroup *pg); + + +/** + * Resume the connection process. + * + * @param pg the peer group to resume connecting + */ +void +GNUNET_TESTING_resume_connections (struct GNUNET_TESTING_PeerGroup *pg); + /** * There are many ways to connect peers that are supported by this function. @@ -896,20 +1166,25 @@ GNUNET_TESTING_get_topology (struct GNUNET_TESTING_PeerGroup *pg, * @param topology which topology to connect the peers in * @param options options for connecting the topology * @param option_modifier modifier for options that take a parameter + * @param connect_timeout how long to wait before giving up on connecting + * two peers + * @param connect_attempts how many times to attempt to connect two peers + * over the connect_timeout duration * @param notify_callback notification to be called once all connections completed * @param notify_cls closure for notification callback * - * @return the number of connections that will be attempted (multiple of two, - * each bidirectional connection counts twice!), GNUNET_SYSERR on error - * + * @return the number of connections that will be attempted, GNUNET_SYSERR on error */ int GNUNET_TESTING_connect_topology (struct GNUNET_TESTING_PeerGroup *pg, enum GNUNET_TESTING_Topology topology, enum GNUNET_TESTING_TopologyOption options, double option_modifier, - GNUNET_TESTING_NotifyCompletion notify_callback, - void *notify_cls); + struct GNUNET_TIME_Relative connect_timeout, + unsigned int connect_attempts, + GNUNET_TESTING_NotifyCompletion + notify_callback, void *notify_cls); + /** * Start or stop an individual peer from the given group. @@ -922,12 +1197,53 @@ GNUNET_TESTING_connect_topology (struct GNUNET_TESTING_PeerGroup *pg, * @param cb_cls closure for cb */ void -GNUNET_TESTING_daemons_vary (struct GNUNET_TESTING_PeerGroup *pg, - unsigned int offset, - int desired_status, - struct GNUNET_TIME_Relative timeout, - GNUNET_TESTING_NotifyCompletion cb, - void *cb_cls); +GNUNET_TESTING_daemons_vary (struct GNUNET_TESTING_PeerGroup *pg, + unsigned int offset, int desired_status, + struct GNUNET_TIME_Relative timeout, + GNUNET_TESTING_NotifyCompletion cb, void *cb_cls); + + +/** + * Start a peer group with a given number of peers. Notify + * on completion of peer startup and connection based on given + * topological constraints. Optionally notify on each + * established connection. + * + * @param cfg configuration template to use + * @param total number of daemons to start + * @param timeout total time allowed for peers to start + * @param connect_cb function to call each time two daemons are connected + * @param peergroup_cb function to call once all peers are up and connected + * @param peergroup_cls closure for peergroup callbacks + * @param hostnames linked list of host structs to use to start peers on + * (NULL to run on localhost only) + * + * @return NULL on error, otherwise handle to control peer group + */ +struct GNUNET_TESTING_PeerGroup * +GNUNET_TESTING_peergroup_start (const struct GNUNET_CONFIGURATION_Handle *cfg, + unsigned int total, + struct GNUNET_TIME_Relative timeout, + GNUNET_TESTING_NotifyConnection connect_cb, + GNUNET_TESTING_NotifyCompletion peergroup_cb, + void *peergroup_cls, + const struct GNUNET_TESTING_Host *hostnames); + + +/** + * Print current topology to a graphviz readable file. + * + * @param pg a currently running peergroup to print to file + * @param output_filename the file to write the topology to + * @param notify_cb callback to call upon completion or failure + * @param notify_cb_cls closure for notify_cb + * + */ +void +GNUNET_TESTING_peergroup_topology_to_file (struct GNUNET_TESTING_PeerGroup *pg, + const char *output_filename, + GNUNET_TESTING_NotifyCompletion + notify_cb, void *notify_cb_cls); #if 0 /* keep Emacsens' auto-indent happy */