- * Handle to a group of GNUnet peers.
- */
-struct GNUNET_TESTING_PeerGroup;
-
-
-/**
- * Prototype of a function that will be called whenever
- * two daemons are connected by the testing library.
- *
- * @param cls closure
- * @param first peer id for first daemon
- * @param second peer id for the second daemon
- * @param distance distance between the connected peers
- * @param first_cfg config for the first daemon
- * @param second_cfg config for the second daemon
- * @param first_daemon handle for the first daemon
- * @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);
-
-/**
- * Prototype of a callback function indicating that two peers
- * are currently connected.
- *
- * @param cls closure
- * @param first peer id for first daemon
- * @param second peer id for the second daemon
- * @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, const char *emsg);
-
-/**
- * Starts a GNUnet daemon. GNUnet must be installed on the target
- * system and available in the PATH. The machine must furthermore be
- * reachable via "ssh" (unless the hostname is "NULL") without the
- * need to enter a password.
- *
- * @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)
- * @param hostkey_cls closure for hostkey callback
- * @param cb function to call once peer is up, or failed to start
- * @param cb_cls closure for cb
- * @return handle to the daemon (actual start will be completed asynchronously)
- */
-struct GNUNET_TESTING_Daemon *
-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);
-
-/**
- * Continues GNUnet daemon startup when user wanted to be notified
- * once a hostkey was generated (for creating friends files, blacklists,
- * etc.).
- *
- * @param daemon the daemon to finish starting
- */
-void
-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);
-
-/**
- * Restart (stop and start) a GNUnet daemon.
- *
- * @param d the daemon that should be restarted
- * @param cb function called once the daemon is (re)started
- * @param cb_cls closure for cb
- */
-void
-GNUNET_TESTING_daemon_restart (struct GNUNET_TESTING_Daemon *d,
- GNUNET_TESTING_NotifyDaemonRunning cb,
- void *cb_cls);
-
-/**
- * Start a peer that has previously been stopped using the daemon_stop
- * call (and files weren't deleted and the allow restart flag)
- *
- * @param daemon the daemon to start (has been previously stopped)
- * @param timeout how long to wait for restart
- * @param cb the callback for notification when the peer is running
- * @param cb_cls closure for the callback
- */
-void
-GNUNET_TESTING_daemon_start_stopped (struct GNUNET_TESTING_Daemon *daemon,
- struct GNUNET_TIME_Relative timeout,
- 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,
- 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.
- *
- * @param pg handle to the set of running peers
- * @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);
-
-
-/**
- * Get a daemon by peer identity, so callers can
- * retrieve the daemon without knowing it's offset.
- *
- * @param pg the peer group to retrieve the daemon from
- * @param peer_id the peer identity of the daemon to retrieve
- *
- * @return the daemon on success, or NULL if no such peer identity is found
- */
-struct GNUNET_TESTING_Daemon *
-GNUNET_TESTING_daemon_get_by_id (struct GNUNET_TESTING_PeerGroup *pg,
- struct GNUNET_PeerIdentity *peer_id);
-
-
-/**
- * Stops a GNUnet daemon.
- *
- * @param d the daemon that should be stopped
- * @param timeout how long to wait for process for shutdown to complete
- * @param cb function called once the daemon was stopped
- * @param cb_cls closure for cb
- * @param delete_files GNUNET_YES to remove files, GNUNET_NO
- * to leave them (i.e. for restarting at a later time,
- * or logfile inspection once finished)
- * @param allow_restart GNUNET_YES to restart peer later (using this API)
- * GNUNET_NO to kill off and clean up for good
- */
-void
-GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d,
- struct GNUNET_TIME_Relative timeout,
- GNUNET_TESTING_NotifyCompletion cb, void *cb_cls,
- int delete_files, int allow_restart);
-
-
-/**
- * Changes the configuration of a GNUnet daemon.
- *
- * @param d the daemon that should be modified
- * @param cfg the new configuration for the daemon
- * @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);
-
-
-/**
- * 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 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
+ * Create a system handle. There must only be one system handle per operating
+ * system. Uses a default range for allowed ports. Ports are still tested for
+ * availability.
+ *
+ * @param testdir only the directory name without any path. This is used for all
+ * service homes; the directory will be created in a temporary location
+ * depending on the underlying OS. This variable will be
+ * overridden with the value of the environmental variable
+ * GNUNET_TESTING_PREFIX, if it exists.
+ * @param trusted_ip the ip address which will be set as TRUSTED HOST in all
+ * service configurations generated to allow control connections from
+ * this ip. This can either be a single ip address or a network address
+ * in CIDR notation.
+ * @param hostname the hostname of the system we are using for testing; NULL for
+ * localhost
+ * @param shared_services NULL terminated array describing services that are to
+ * be shared among peers
+ * @return handle to this system, NULL on error
+ */
+struct GNUNET_TESTING_System *
+GNUNET_TESTING_system_create (const char *testdir,
+ const char *trusted_ip,
+ const char *hostname,
+ const struct GNUNET_TESTING_SharedService *
+ shared_services);
+
+
+/**
+ * Create a system handle. There must only be one system
+ * handle per operating system. Use this function directly
+ * if multiple system objects are created for the same host
+ * (only really useful when testing --- or to make the port
+ * range configureable).
+ *
+ * @param testdir only the directory name without any path. This is used for
+ * all service homes; the directory will be created in a temporary
+ * location depending on the underlying OS. This variable will be
+ * overridden with the value of the environmental variable
+ * GNUNET_TESTING_PREFIX, if it exists.
+ * @param trusted_ip the ip address which will be set as TRUSTED HOST in all
+ * service configurations generated to allow control connections from
+ * this ip. This can either be a single ip address or a network address
+ * in CIDR notation.
+ * @param hostname the hostname of the system we are using for testing; NULL for
+ * localhost
+ * @param shared_services NULL terminated array describing services that are to
+ * be shared among peers
+ * @param lowport lowest port number this system is allowed to allocate (inclusive)
+ * @param highport highest port number this system is allowed to allocate (exclusive)
+ * @return handle to this system, NULL on error
+ */
+struct GNUNET_TESTING_System *
+GNUNET_TESTING_system_create_with_portrange (const char *testdir,
+ const char *trusted_ip,
+ const char *hostname,
+ const struct GNUNET_TESTING_SharedService *shared_services,
+ uint16_t lowport,
+ uint16_t highport);
+
+
+/**
+ * Free system resources.
+ *
+ * @param system system to be freed
+ * @param remove_paths should the 'testdir' and all subdirectories
+ * be removed (clean up on shutdown)?