for w32 port
[oweals/gnunet.git] / src / include / gnunet_testing_lib.h
index 0a43980a2e72408b1df072b6c5b720ce6a59ecc0..3f0aeb1209255d2d1e80e944d3742f1617632a78 100644 (file)
@@ -33,6 +33,7 @@
 #define GNUNET_TESTING_LIB_H
 
 #include "gnunet_util_lib.h"
+#include "gnunet_statistics_service.h"
 
 #ifdef __cplusplus
 extern "C"
@@ -49,6 +50,33 @@ extern "C"
  */
 struct GNUNET_TESTING_Daemon;
 
+/**
+ * Linked list of hostnames and ports to use for starting daemons.
+ */
+struct GNUNET_TESTING_Host
+{
+  /**
+   * Pointer to next item in the list.
+   */
+  struct GNUNET_TESTING_Host *next;
+
+  /**
+   * Hostname to connect to.
+   */
+  char *hostname;
+
+  /**
+   * Username to use when connecting (may be null).
+   */
+  char *username;
+
+  /**
+   * Port to use for SSH connection (used for ssh
+   * connection forwarding, 0 to let ssh decide)
+   */
+  uint16_t port;
+};
+
 /**
  * Prototype of a function that will be called whenever
  * a daemon was started by the testing library.
@@ -196,6 +224,11 @@ struct GNUNET_TESTING_Daemon
    */
   char *hostname;
 
+  /**
+   * Port to use for ssh, NULL to let system choose default.
+   */
+  char *ssh_port_str;
+
   /**
    * Result of GNUNET_i2s of this peer,
    * for printing
@@ -354,6 +387,23 @@ typedef void (*GNUNET_TESTING_NotifyConnection)(void *cls,
                                                 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,
+                                              struct GNUNET_TIME_Relative latency,
+                                              uint32_t distance,
+                                              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
@@ -365,11 +415,13 @@ typedef void (*GNUNET_TESTING_NotifyConnection)(void *cls,
  * @param timeout how long to wait starting up peers
  * @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_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 with the result
+ * @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)
  */
@@ -378,6 +430,8 @@ 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_NotifyDaemonRunning cb,
@@ -393,6 +447,17 @@ GNUNET_TESTING_daemon_start (struct GNUNET_SCHEDULER_Handle *sched,
 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.
  *
@@ -429,6 +494,18 @@ 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.
@@ -505,8 +582,8 @@ 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 space-separated list of hostnames to use; can be NULL (to run
- *        everything on localhost).
+ * @param hostnames linked list of hosts 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 *
@@ -520,7 +597,7 @@ GNUNET_TESTING_daemons_start (struct GNUNET_SCHEDULER_Handle *sched,
                               void *cb_cls,
                               GNUNET_TESTING_NotifyConnection
                               connect_callback, void *connect_callback_cls,
-                              const char *hostnames);
+                              const struct GNUNET_TESTING_Host *hostnames);
 
 /**
  * Function which continues a peer group starting up
@@ -559,6 +636,16 @@ GNUNET_TESTING_daemons_stop (struct GNUNET_TESTING_PeerGroup *pg,
                              void *cb_cls);
 
 
+/**
+ * Count the number of running peers.
+ *
+ * @param pg handle for the peer group
+ *
+ * @return the number of currently running peers in the peer group
+ */
+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
@@ -589,6 +676,32 @@ GNUNET_TESTING_daemons_churn (struct GNUNET_TESTING_PeerGroup *pg,
                               GNUNET_TESTING_NotifyCompletion cb,
                               void *cb_cls);
 
+/**
+ * Callback function to process statistic values.
+ *
+ * @param cls closure
+ * @param peer the peer the statistics belong to
+ * @param subsystem name of subsystem that created the statistic
+ * @param name the name of the datum
+ * @param value the current value
+ * @param is_persistent GNUNET_YES if the value is persistent, GNUNET_NO if not
+ * @return GNUNET_OK to continue, GNUNET_SYSERR to abort iteration
+ */
+typedef int (*GNUNET_TESTING_STATISTICS_Iterator) (void *cls,
+                                                   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.
+ */
+void
+GNUNET_TESTING_get_statistics (struct GNUNET_TESTING_PeerGroup *pg,
+                               GNUNET_STATISTICS_Callback cont,
+                               GNUNET_TESTING_STATISTICS_Iterator proc, void *cls);
 
 /**
  * Topologies supported for testbeds.
@@ -675,6 +788,13 @@ enum GNUNET_TESTING_TopologyOption
    */
   GNUNET_TESTING_TOPOLOGY_OPTION_DFS,
 
+  /**
+   * Find the N closest peers to each allowed peer in the
+   * topology and make sure a connection to those peers
+   * exists in the connect topology.
+   */
+  GNUNET_TESTING_TOPOLOGY_OPTION_ADD_CLOSEST,
+
   /**
    * No options specified.
    */
@@ -733,6 +853,17 @@ GNUNET_TESTING_create_topology (struct GNUNET_TESTING_PeerGroup *pg,
                                 enum GNUNET_TESTING_Topology restrict_topology,
                                 char *restrict_transports);
 
+/**
+ * Iterate over all (running) peers in the peer group, retrieve
+ * all connections that each currently has.
+ *
+ * @param pg the peer group we are concerned with
+ * @param cb callback for topology information
+ * @param cls closure for callback
+ */
+void
+GNUNET_TESTING_get_topology (struct GNUNET_TESTING_PeerGroup *pg, GNUNET_TESTING_NotifyTopology cb, void *cls);
+
 /**
  * There are many ways to connect peers that are supported by this function.
  * To connect peers in the same topology that was created via the