summaryrefslogtreecommitdiff
path: root/src/integration-tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/integration-tests')
-rw-r--r--src/integration-tests/Makefile.am113
-rw-r--r--src/integration-tests/Makefile.in715
-rw-r--r--src/integration-tests/confs/c_bootstrap_server.conf355
-rw-r--r--src/integration-tests/confs/c_nat_client.conf354
-rw-r--r--src/integration-tests/confs/c_no_nat_client.conf356
-rw-r--r--src/integration-tests/confs/c_no_nat_client_2.conf344
-rw-r--r--src/integration-tests/gnunet_pyexpect.py.in83
-rw-r--r--src/integration-tests/gnunet_testing.py.in232
-rw-r--r--src/integration-tests/hostkeys/0000-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0001-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0002-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0003-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0004-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0005-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0006-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0007-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0008-hostkeybin0 -> 914 bytes
-rw-r--r--src/integration-tests/hostkeys/0009-hostkeybin0 -> 914 bytes
-rwxr-xr-xsrc/integration-tests/test_integration_bootstrap_and_connect.py.in135
-rwxr-xr-xsrc/integration-tests/test_integration_bootstrap_and_connect_and_disconnect.py.in147
-rwxr-xr-xsrc/integration-tests/test_integration_bootstrap_and_connect_and_disconnect_nat.py.in147
-rwxr-xr-xsrc/integration-tests/test_integration_clique.py.in197
-rwxr-xr-xsrc/integration-tests/test_integration_clique_nat.py.in197
-rwxr-xr-xsrc/integration-tests/test_integration_disconnect.py.in156
-rwxr-xr-xsrc/integration-tests/test_integration_restart.py.in171
25 files changed, 3702 insertions, 0 deletions
diff --git a/src/integration-tests/Makefile.am b/src/integration-tests/Makefile.am
new file mode 100644
index 0000000..d948b3d
--- /dev/null
+++ b/src/integration-tests/Makefile.am
@@ -0,0 +1,113 @@
+INCLUDES = -I$(top_srcdir)/src/include
+
+if MINGW
+ WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols
+endif
+
+if USE_COVERAGE
+ AM_CFLAGS = --coverage -O0
+ XLIB = -lgcov
+endif
+
+bin_PROGRAMS =
+
+check_PROGRAMS =
+
+noinst_SCRIPTS = \
+ gnunet_testing.py \
+ gnunet_pyexpect.py
+
+if HAVE_PYTHON_PEXPECT
+check_SCRIPTS = \
+ test_integration_bootstrap_and_connect.py \
+ test_integration_bootstrap_and_connect_and_disconnect.py \
+ test_integration_bootstrap_and_connect_and_disconnect_nat.py \
+ test_integration_restart.py \
+ test_integration_clique.py \
+ test_integration_clique_nat.py
+endif
+# test_integration_disconnect.py
+
+
+if ENABLE_TEST_RUN
+TESTS = \
+ $(check_SCRIPTS)
+endif
+
+do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
+
+%.py: %.py.in Makefile
+ $(do_subst) < $(srcdir)/$< > $@
+ chmod +x $@
+
+gnunet_testing.py: gnunet_testing.py.in Makefile
+ $(do_subst) < $(srcdir)/gnunet_testing.py.in > gnunet_testing.py
+ chmod +x gnunet_testing.py
+
+gnunet_pyexpect.py: gnunet_pyexpect.py.in Makefile
+ $(do_subst) < $(srcdir)/gnunet_pyexpect.py.in > gnunet_pyexpect.py
+ chmod +x gnunet_pyexpect.py
+
+test_integration_bootstrap_and_connect.py: test_integration_bootstrap_and_connect.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_bootstrap_and_connect.py.in > test_integration_bootstrap_and_connect.py
+ chmod +x test_integration_bootstrap_and_connect.py
+
+test_integration_bootstrap_and_connect_and_disconnect.py: test_integration_bootstrap_and_connect_and_disconnect.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_bootstrap_and_connect_and_disconnect.py.in > test_integration_bootstrap_and_connect_and_disconnect.py
+ chmod +x test_integration_bootstrap_and_connect_and_disconnect.py
+
+test_integration_bootstrap_and_connect_and_disconnect_nat.py: test_integration_bootstrap_and_connect_and_disconnect_nat.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_bootstrap_and_connect_and_disconnect_nat.py.in > test_integration_bootstrap_and_connect_and_disconnect_nat.py
+ chmod +x test_integration_bootstrap_and_connect_and_disconnect_nat.py
+
+
+test_integration_disconnect.py: test_integration_disconnect.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_disconnect.py.in > test_integration_disconnect.py
+ chmod +x test_integration_disconnect.py
+
+#test_integration_disconnect_nat.py: test_integration_disconnect_nat.py.in Makefile
+# $(do_subst) < $(srcdir)/test_integration_disconnect_nat.py.in > test_integration_disconnect_nat.py
+# chmod +x test_integration_disconnect_nat.py
+
+test_integration_restart.py: test_integration_restart.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_restart.py.in > test_integration_restart.py
+ chmod +x test_integration_restart.py
+
+test_integration_clique.py: test_integration_clique.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_clique.py.in > test_integration_clique.py
+ chmod +x test_integration_clique.py
+
+test_integration_clique_nat.py: test_integration_clique_nat.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_clique_nat.py.in > test_integration_clique_nat.py
+ chmod +x test_integration_clique_nat.py
+
+
+EXTRA_DIST = \
+ gnunet_testing.py.in \
+ gnunet_pyexpect.py.in \
+ test_integration_bootstrap_and_connect.py.in \
+ test_integration_bootstrap_and_connect_and_disconnect.py.in \
+ test_integration_bootstrap_and_connect_and_disconnect_nat.py.in \
+ test_integration_disconnect.py.in \
+ test_integration_restart.py.in \
+ test_integration_clique.py.in \
+ test_integration_clique_nat.py.in \
+ confs/c_bootstrap_server.conf \
+ confs/c_nat_client.conf \
+ confs/c_no_nat_client_2.conf \
+ confs/c_no_nat_client.conf \
+ hostkeys/0000-hostkey \
+ hostkeys/0001-hostkey \
+ hostkeys/0002-hostkey \
+ hostkeys/0003-hostkey \
+ hostkeys/0004-hostkey \
+ hostkeys/0005-hostkey \
+ hostkeys/0006-hostkey \
+ hostkeys/0007-hostkey \
+ hostkeys/0008-hostkey \
+ hostkeys/0009-hostkey
+# test_integration_disconnect_nat.py
+
+CLEANFILES = \
+ $(check_SCRIPTS) \
+ gnunet_testing.py
diff --git a/src/integration-tests/Makefile.in b/src/integration-tests/Makefile.in
new file mode 100644
index 0000000..20b13d6
--- /dev/null
+++ b/src/integration-tests/Makefile.in
@@ -0,0 +1,715 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+bin_PROGRAMS =
+check_PROGRAMS =
+subdir = src/integration-tests
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/absolute-header.m4 \
+ $(top_srcdir)/m4/align.m4 $(top_srcdir)/m4/argz.m4 \
+ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+ $(top_srcdir)/m4/libgcrypt.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/ltdl.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/gnunet_config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+SCRIPTS = $(noinst_SCRIPTS)
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+ARGZ_H = @ARGZ_H@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFAULT_INTERFACE = @DEFAULT_INTERFACE@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLDIR = @DLLDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXT_LIBS = @EXT_LIBS@
+EXT_LIB_PATH = @EXT_LIB_PATH@
+FGREP = @FGREP@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNUNETDNS_GROUP = @GNUNETDNS_GROUP@
+GN_DAEMON_CONFIG_DIR = @GN_DAEMON_CONFIG_DIR@
+GN_DAEMON_HOME_DIR = @GN_DAEMON_HOME_DIR@
+GN_INTLINCL = @GN_INTLINCL@
+GN_LIBINTL = @GN_LIBINTL@
+GN_LIB_LDFLAGS = @GN_LIB_LDFLAGS@
+GN_PLUGIN_LDFLAGS = @GN_PLUGIN_LDFLAGS@
+GN_USER_HOME_DIR = @GN_USER_HOME_DIR@
+GREP = @GREP@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+INCLTDL = @INCLTDL@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBADD_DL = @LIBADD_DL@
+LIBADD_DLD_LINK = @LIBADD_DLD_LINK@
+LIBADD_DLOPEN = @LIBADD_DLOPEN@
+LIBADD_SHL_LOAD = @LIBADD_SHL_LOAD@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBLTDL = @LIBLTDL@
+LIBOBJS = @LIBOBJS@
+LIBPREFIX = @LIBPREFIX@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBUNISTRING = @LIBUNISTRING@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTDLDEPS = @LTDLDEPS@
+LTDLINCL = @LTDLINCL@
+LTDLOPEN = @LTDLOPEN@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+LT_CONFIG_H = @LT_CONFIG_H@
+LT_DLLOADERS = @LT_DLLOADERS@
+LT_DLPREOPEN = @LT_DLPREOPEN@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+MYSQL_CPPFLAGS = @MYSQL_CPPFLAGS@
+MYSQL_LDFLAGS = @MYSQL_LDFLAGS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSTGRES_CPPFLAGS = @POSTGRES_CPPFLAGS@
+POSTGRES_LDFLAGS = @POSTGRES_LDFLAGS@
+POSUB = @POSUB@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SQLITE_CPPFLAGS = @SQLITE_CPPFLAGS@
+SQLITE_LDFLAGS = @SQLITE_LDFLAGS@
+STRIP = @STRIP@
+SUDO_BINARY = @SUDO_BINARY@
+UNIXONLY = @UNIXONLY@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XMKMF = @XMKMF@
+X_CFLAGS = @X_CFLAGS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_LIBS = @X_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+_libcurl_config = @_libcurl_config@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_target = @build_target@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+lt_ECHO = @lt_ECHO@
+ltdl_LIBOBJS = @ltdl_LIBOBJS@
+ltdl_LTLIBOBJS = @ltdl_LTLIBOBJS@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sys_symbol_underscore = @sys_symbol_underscore@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+INCLUDES = -I$(top_srcdir)/src/include
+@MINGW_TRUE@WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols
+@USE_COVERAGE_TRUE@AM_CFLAGS = --coverage -O0
+@USE_COVERAGE_TRUE@XLIB = -lgcov
+noinst_SCRIPTS = \
+ gnunet_testing.py \
+ gnunet_pyexpect.py
+
+@HAVE_PYTHON_PEXPECT_TRUE@check_SCRIPTS = \
+@HAVE_PYTHON_PEXPECT_TRUE@ test_integration_bootstrap_and_connect.py \
+@HAVE_PYTHON_PEXPECT_TRUE@ test_integration_bootstrap_and_connect_and_disconnect.py \
+@HAVE_PYTHON_PEXPECT_TRUE@ test_integration_bootstrap_and_connect_and_disconnect_nat.py \
+@HAVE_PYTHON_PEXPECT_TRUE@ test_integration_restart.py \
+@HAVE_PYTHON_PEXPECT_TRUE@ test_integration_clique.py \
+@HAVE_PYTHON_PEXPECT_TRUE@ test_integration_clique_nat.py
+
+# test_integration_disconnect.py
+@ENABLE_TEST_RUN_TRUE@TESTS = \
+@ENABLE_TEST_RUN_TRUE@ $(check_SCRIPTS)
+
+do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g'
+EXTRA_DIST = \
+ gnunet_testing.py.in \
+ gnunet_pyexpect.py.in \
+ test_integration_bootstrap_and_connect.py.in \
+ test_integration_bootstrap_and_connect_and_disconnect.py.in \
+ test_integration_bootstrap_and_connect_and_disconnect_nat.py.in \
+ test_integration_disconnect.py.in \
+ test_integration_restart.py.in \
+ test_integration_clique.py.in \
+ test_integration_clique_nat.py.in \
+ confs/c_bootstrap_server.conf \
+ confs/c_nat_client.conf \
+ confs/c_no_nat_client_2.conf \
+ confs/c_no_nat_client.conf \
+ hostkeys/0000-hostkey \
+ hostkeys/0001-hostkey \
+ hostkeys/0002-hostkey \
+ hostkeys/0003-hostkey \
+ hostkeys/0004-hostkey \
+ hostkeys/0005-hostkey \
+ hostkeys/0006-hostkey \
+ hostkeys/0007-hostkey \
+ hostkeys/0008-hostkey \
+ hostkeys/0009-hostkey
+
+# test_integration_disconnect_nat.py
+CLEANFILES = \
+ $(check_SCRIPTS) \
+ gnunet_testing.py
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/integration-tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/integration-tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ $(am__tty_colors); \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=XPASS; \
+ ;; \
+ *) \
+ col=$$grn; res=PASS; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$tst[\ \ ]*) \
+ xfail=`expr $$xfail + 1`; \
+ col=$$lgn; res=XFAIL; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ col=$$red; res=FAIL; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ col=$$blu; res=SKIP; \
+ fi; \
+ echo "$${col}$$res$${std}: $$tst"; \
+ done; \
+ if test "$$all" -eq 1; then \
+ tests="test"; \
+ All=""; \
+ else \
+ tests="tests"; \
+ All="All "; \
+ fi; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="$$All$$all $$tests passed"; \
+ else \
+ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all $$tests failed"; \
+ else \
+ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ if test "$$skip" -eq 1; then \
+ skipped="($$skip test was not run)"; \
+ else \
+ skipped="($$skip tests were not run)"; \
+ fi; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ if test "$$failed" -eq 0; then \
+ echo "$$grn$$dashes"; \
+ else \
+ echo "$$red$$dashes"; \
+ fi; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes$$std"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-binPROGRAMS \
+ clean-checkPROGRAMS clean-generic clean-libtool distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-binPROGRAMS
+
+
+%.py: %.py.in Makefile
+ $(do_subst) < $(srcdir)/$< > $@
+ chmod +x $@
+
+gnunet_testing.py: gnunet_testing.py.in Makefile
+ $(do_subst) < $(srcdir)/gnunet_testing.py.in > gnunet_testing.py
+ chmod +x gnunet_testing.py
+
+gnunet_pyexpect.py: gnunet_pyexpect.py.in Makefile
+ $(do_subst) < $(srcdir)/gnunet_pyexpect.py.in > gnunet_pyexpect.py
+ chmod +x gnunet_pyexpect.py
+
+test_integration_bootstrap_and_connect.py: test_integration_bootstrap_and_connect.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_bootstrap_and_connect.py.in > test_integration_bootstrap_and_connect.py
+ chmod +x test_integration_bootstrap_and_connect.py
+
+test_integration_bootstrap_and_connect_and_disconnect.py: test_integration_bootstrap_and_connect_and_disconnect.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_bootstrap_and_connect_and_disconnect.py.in > test_integration_bootstrap_and_connect_and_disconnect.py
+ chmod +x test_integration_bootstrap_and_connect_and_disconnect.py
+
+test_integration_bootstrap_and_connect_and_disconnect_nat.py: test_integration_bootstrap_and_connect_and_disconnect_nat.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_bootstrap_and_connect_and_disconnect_nat.py.in > test_integration_bootstrap_and_connect_and_disconnect_nat.py
+ chmod +x test_integration_bootstrap_and_connect_and_disconnect_nat.py
+
+test_integration_disconnect.py: test_integration_disconnect.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_disconnect.py.in > test_integration_disconnect.py
+ chmod +x test_integration_disconnect.py
+
+#test_integration_disconnect_nat.py: test_integration_disconnect_nat.py.in Makefile
+# $(do_subst) < $(srcdir)/test_integration_disconnect_nat.py.in > test_integration_disconnect_nat.py
+# chmod +x test_integration_disconnect_nat.py
+
+test_integration_restart.py: test_integration_restart.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_restart.py.in > test_integration_restart.py
+ chmod +x test_integration_restart.py
+
+test_integration_clique.py: test_integration_clique.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_clique.py.in > test_integration_clique.py
+ chmod +x test_integration_clique.py
+
+test_integration_clique_nat.py: test_integration_clique_nat.py.in Makefile
+ $(do_subst) < $(srcdir)/test_integration_clique_nat.py.in > test_integration_clique_nat.py
+ chmod +x test_integration_clique_nat.py
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/integration-tests/confs/c_bootstrap_server.conf b/src/integration-tests/confs/c_bootstrap_server.conf
new file mode 100644
index 0000000..0b919f9
--- /dev/null
+++ b/src/integration-tests/confs/c_bootstrap_server.conf
@@ -0,0 +1,355 @@
+[PATHS]
+SERVICEHOME = /tmp/c_bootstrap_server/
+DEFAULTCONFIG = confs/c_bootstrap_server.conf
+
+[gnunetd]
+#HOSTKEY = $SERVICEHOME/.hostkey
+HOSTKEY = hostkeys/0000-hostkey
+
+[vpn]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/gnunet-service-vpn-15
+
+[resolver]
+AUTOSTART = YES
+PORT = 20017
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-resolver
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-resolver-14
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = NO
+
+[mesh]
+AUTOSTART = YES
+PORT = 20016
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-mesh
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-mesh-13
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nse]
+AUTOSTART = YES
+PORT = 20015
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-nse
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-nse-12
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PROOFFILE = $SERVICEHOME/.nse-proof
+HISTOGRAM = $SERVICEHOME/nse-history.log
+WORKDELAY = 5 ms
+INTERVAL = 1 h
+WORKBITS = 26
+
+[topology]
+MINIMUM-FRIENDS = 0
+FRIENDS-ONLY = NO
+AUTOCONNECT = YES
+TARGET-CONNECTION-COUNT = 16
+FRIENDS = $SERVICEHOME/friends
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-topology
+
+[datastore]
+AUTOSTART = YES
+UNIXPATH = /tmp/test-service-datastore-11
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PORT = 20014
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-datastore
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+QUOTA = 100 MB
+BLOOMFILTER = $SERVICEHOME/fs/bloomfilter
+DATABASE = sqlite
+
+[datastore-sqlite]
+FILENAME = $SERVICEHOME/datastore/sqlite.db
+
+[datastore-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[datastore-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[peerinfo]
+AUTOSTART = YES
+PORT = 20013
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-peerinfo
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-peerinfo-10
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+HOSTS = $SERVICEHOME/data/hosts/
+
+[client]
+HOME = $SERVICEHOME
+
+[TESTING]
+WEAKRANDOM = YES
+CONNECT_TIMEOUT = 30 s
+CONNECT_ATTEMPTS = 3
+MAX_OUTSTANDING_CONNECTIONS = 50
+DELETE_FILES = YES
+
+[ats]
+AUTOSTART = YES
+PORT = 20012
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-ats
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-ats-9
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+WAN_QUOTA_IN = 65536
+WAN_QUOTA_OUT = 65536
+DUMP_MLP = NO
+DUMP_SOLUTION = NO
+DUMP_OVERWRITE = NO
+DUMP_MIN_PEERS = 0
+DUMP_MIN_ADDRS = 0
+ATS_MIN_INTERVAL = 15000
+ATS_EXEC_INTERVAL = 30000
+
+[transport]
+AUTOSTART = YES
+PORT = 20011
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-transport
+NEIGHBOUR_LIMIT = 50
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+PLUGINS = tcp
+UNIXPATH = /tmp/test-service-transport-8
+BLACKLIST_FILE = $SERVICEHOME/blacklist
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[transport-tcp]
+USE_LOCALADDR = YES
+PORT = 20010
+ADVERTISED_PORT = 20010
+MAX_CONNECTIONS = 128
+TIMEOUT = 5 s
+
+[transport-udp]
+USE_LOCALADDR = YES
+PORT = 20009
+BROADCAST = YES
+BROADCAST_INTERVAL = 30000
+MAX_BPS = 1000000
+
+[transport-http]
+PORT = 20008
+MAX_CONNECTIONS = 128
+
+[transport-https]
+PORT = 20007
+CRYPTO_INIT = NORMAL
+KEY_FILE = https.key
+CERT_FILE = https.cert
+MAX_CONNECTIONS = 128
+
+[transport-wlan]
+INTERFACE = mon0
+TESTMODE = 0
+
+[datacache-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[datacache-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[template]
+AUTOSTART = NO
+PORT = 20006
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-template
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-template-7
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[fs]
+AUTOSTART = YES
+INDEXDB = $SERVICEHOME/idxinfo.lst
+TRUST = $SERVICEHOME/data/credit/
+IDENTITY_DIR = $SERVICEHOME/identities/
+STATE_DIR = $SERVICEHOME/persistence/
+UPDATE_DIR = $SERVICEHOME/updates/
+PORT = 20005
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-fs
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DELAY = YES
+CONTENT_CACHING = YES
+CONTENT_PUSHING = YES
+UNIXPATH = /tmp/test-service-fs-6
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+MAX_PENDING_REQUESTS = 65536
+MIN_MIGRATION_DELAY = 100 ms
+EXPECTED_NEIGHBOUR_COUNT = 128
+
+[vpn]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-vpn
+IPV6ADDR = 1234::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.11.10.1
+IPV4MASK = 255.255.0.0
+VIRTDNS = 10.11.10.2
+VIRTDNS6 = 1234::17
+IFNAME = vpn-gnunet
+
+[exit]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-exit
+IPV6ADDR = 1234:1::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.10.1.1
+IPV4MASK = 255.255.0.0
+IFNAME = exit-gnunet
+ENABLE_UDP = NO
+ENABLE_TCP = NO
+
+[dns]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-dns-5
+PROVIDE_EXIT = NO
+
+[arm]
+PORT = 20004
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-arm
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DEFAULTSERVICES = topology hostlist fs
+UNIXPATH = /tmp/test-service-arm-4
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[hostlist]
+HTTPPORT = 8080
+HOME = $SERVICEHOME
+HOSTLISTFILE = $SERVICEHOME/hostlist/learned.data
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-hostlist
+OPTIONS = -p
+#SERVERS = http://v9.gnunet.org:58080/
+HTTP-PROXY =
+
+[core]
+AUTOSTART = YES
+PORT = 20003
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-core
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-core-3
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nat]
+EXTERNAL_ADDRESS = 127.0.0.1
+INTERNAL_ADDRESS = 127.0.0.1
+BINDTO = 127.0.0.1
+BEHIND_NAT = NO
+PUNCHED_NAT = NO
+ENABLE_UPNP = NO
+USE_LOCALADDR = YES
+USE_HOSTNAME = NO
+ENABLE_ICMP_CLIENT = NO
+ENABLE_ICMP_SERVER = NO
+DISABLEV6 = YES
+RETURN_LOCAL_ADDRESSES = NO
+HOSTNAME_DNS_FREQUENCY = 1200000
+IFC_SCAN_FREQUENCY = 3000000
+DYNDNS_FREQUENCY = 140000
+
+[gnunet-nat-server]
+HOSTNAME = gnunet.org
+PORT = 20002
+
+[statistics]
+AUTOSTART = YES
+PORT = 20001
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-statistics
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-statistics-2
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+
+[dht]
+AUTOSTART = YES
+PORT = 20000
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dht
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+BUCKET_SIZE = 4
+UNIXPATH = /tmp/test-service-dht-1
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[dhtcache]
+DATABASE = sqlite
+QUOTA = 1 MB
+
diff --git a/src/integration-tests/confs/c_nat_client.conf b/src/integration-tests/confs/c_nat_client.conf
new file mode 100644
index 0000000..59fa0f7
--- /dev/null
+++ b/src/integration-tests/confs/c_nat_client.conf
@@ -0,0 +1,354 @@
+[PATHS]
+SERVICEHOME = /tmp/c_nat_client
+DEFAULTCONFIG = confs/c_nat_client.conf
+
+[gnunetd]
+HOSTKEY = hostkeys/0002-hostkey
+
+[client]
+HOME = $SERVICEHOME
+
+[vpn]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/gnunet-service-vpn-57
+
+
+[resolver]
+AUTOSTART = YES
+PORT = 20071
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-resolver
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-resolver-56
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = NO
+
+[mesh]
+AUTOSTART = YES
+PORT = 20070
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-mesh
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-mesh-55
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nse]
+AUTOSTART = YES
+PORT = 20069
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-nse
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-nse-54
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PROOFFILE = $SERVICEHOME/.nse-proof
+HISTOGRAM = $SERVICEHOME/nse-history.log
+WORKDELAY = 5 ms
+INTERVAL = 1 h
+WORKBITS = 26
+
+[topology]
+MINIMUM-FRIENDS = 0
+FRIENDS-ONLY = NO
+AUTOCONNECT = YES
+TARGET-CONNECTION-COUNT = 16
+FRIENDS = $SERVICEHOME/friends
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-topology
+
+[datastore]
+AUTOSTART = YES
+UNIXPATH = /tmp/test-service-datastore-53
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PORT = 20068
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-datastore
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+QUOTA = 100 MB
+BLOOMFILTER = $SERVICEHOME/fs/bloomfilter
+DATABASE = sqlite
+
+[datastore-sqlite]
+FILENAME = $SERVICEHOME/datastore/sqlite.db
+
+[datastore-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[datastore-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[peerinfo]
+AUTOSTART = YES
+PORT = 20067
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-peerinfo
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-peerinfo-52
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+HOSTS = $SERVICEHOME/data/hosts/
+
+[TESTING]
+WEAKRANDOM = NO
+CONNECT_TIMEOUT = 30 s
+CONNECT_ATTEMPTS = 3
+MAX_OUTSTANDING_CONNECTIONS = 50
+DELETE_FILES = YES
+
+[ats]
+AUTOSTART = YES
+PORT = 20066
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-ats
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-ats-51
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+WAN_QUOTA_IN = 65536
+WAN_QUOTA_OUT = 65536
+DUMP_MLP = NO
+DUMP_SOLUTION = NO
+DUMP_OVERWRITE = NO
+DUMP_MIN_PEERS = 0
+DUMP_MIN_ADDRS = 0
+ATS_MIN_INTERVAL = 15000
+ATS_EXEC_INTERVAL = 30000
+
+[transport]
+AUTOSTART = YES
+PORT = 20065
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-transport
+NEIGHBOUR_LIMIT = 50
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+PLUGINS = tcp
+UNIXPATH = /tmp/test-service-transport-50
+BLACKLIST_FILE = $SERVICEHOME/blacklist
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[transport-tcp]
+PORT = 0
+ADVERTISED_PORT = 20064
+MAX_CONNECTIONS = 128
+TIMEOUT = 5 s
+USE_LOCALADDR = YES
+
+[transport-udp]
+PORT = 0
+BROADCAST = YES
+BROADCAST_INTERVAL = 30000
+MAX_BPS = 1000000
+USE_LOCALADDR = YES
+
+[transport-http]
+PORT = 0
+MAX_CONNECTIONS = 128
+
+[transport-https]
+PORT = 0
+CRYPTO_INIT = NORMAL
+KEY_FILE = https.key
+CERT_FILE = https.cert
+MAX_CONNECTIONS = 128
+
+[transport-wlan]
+INTERFACE = mon0
+TESTMODE = 0
+
+[datacache-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[datacache-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[template]
+AUTOSTART = NO
+PORT = 20060
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-template
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-template-49
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[fs]
+AUTOSTART = YES
+INDEXDB = $SERVICEHOME/idxinfo.lst
+TRUST = $SERVICEHOME/data/credit/
+IDENTITY_DIR = $SERVICEHOME/identities/
+STATE_DIR = $SERVICEHOME/persistence/
+UPDATE_DIR = $SERVICEHOME/updates/
+PORT = 20059
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-fs
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DELAY = YES
+CONTENT_CACHING = YES
+CONTENT_PUSHING = YES
+UNIXPATH = /tmp/test-service-fs-48
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+MAX_PENDING_REQUESTS = 65536
+MIN_MIGRATION_DELAY = 100 ms
+EXPECTED_NEIGHBOUR_COUNT = 128
+
+[vpn]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-vpn
+IPV6ADDR = 1234::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.11.10.1
+IPV4MASK = 255.255.0.0
+VIRTDNS = 10.11.10.2
+VIRTDNS6 = 1234::17
+IFNAME = vpn-gnunet
+
+[exit]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-exit
+IPV6ADDR = 1234:1::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.10.1.1
+IPV4MASK = 255.255.0.0
+IFNAME = exit-gnunet
+ENABLE_UDP = NO
+ENABLE_TCP = NO
+
+[dns]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-dns-47
+PROVIDE_EXIT = NO
+
+[arm]
+PORT = 20058
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-arm
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DEFAULTSERVICES = topology hostlist fs
+UNIXPATH = /tmp/test-service-arm-46
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[hostlist]
+HTTPPORT = 8080
+HOME = $SERVICEHOME
+HOSTLISTFILE = $SERVICEHOME/hostlist/learned.data
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-hostlist
+OPTIONS = -b
+SERVERS = http://localhost:8080/
+HTTP-PROXY =
+
+[core]
+AUTOSTART = YES
+PORT = 20057
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-core
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-core-45
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nat]
+BEHIND_NAT = YES
+PUNCHED_NAT = NO
+ENABLE_UPNP = NO
+USE_LOCALADDR = YES
+USE_HOSTNAME = NO
+ENABLE_ICMP_CLIENT = NO
+ENABLE_ICMP_SERVER = NO
+DISABLEV6 = YES
+RETURN_LOCAL_ADDRESSES = NO
+HOSTNAME_DNS_FREQUENCY = 1200000
+IFC_SCAN_FREQUENCY = 3000000
+DYNDNS_FREQUENCY = 140000
+EXTERNAL_ADDRESS = 127.0.0.1
+INTERNAL_ADDRESS = 127.0.0.1
+BINDTO = 127.0.0.1
+
+[gnunet-nat-server]
+HOSTNAME = gnunet.org
+PORT = 20056
+
+[statistics]
+AUTOSTART = YES
+PORT = 20055
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-statistics
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-statistics-44
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+
+[dht]
+AUTOSTART = YES
+PORT = 20054
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dht
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+BUCKET_SIZE = 4
+UNIXPATH = /tmp/test-service-dht-43
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[dhtcache]
+DATABASE = sqlite
+QUOTA = 1 MB \ No newline at end of file
diff --git a/src/integration-tests/confs/c_no_nat_client.conf b/src/integration-tests/confs/c_no_nat_client.conf
new file mode 100644
index 0000000..4ec077c
--- /dev/null
+++ b/src/integration-tests/confs/c_no_nat_client.conf
@@ -0,0 +1,356 @@
+[PATHS]
+SERVICEHOME = /tmp/c_no_nat_client/
+DEFAULTCONFIG = confs/c_no_nat_client.conf
+
+[gnunetd]
+#HOSTKEY = $SERVICEHOME/.hostkey
+HOSTKEY = hostkeys/0001-hostkey
+
+[vpn]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/gnunet-service-vpn-29
+
+[resolver]
+AUTOSTART = YES
+PORT = 20035
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-resolver
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-resolver-28
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = NO
+
+[mesh]
+AUTOSTART = YES
+PORT = 20034
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-mesh
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-mesh-27
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nse]
+AUTOSTART = YES
+PORT = 20033
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-nse
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-nse-26
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PROOFFILE = $SERVICEHOME/.nse-proof
+HISTOGRAM = $SERVICEHOME/nse-history.log
+WORKDELAY = 5 ms
+INTERVAL = 1 h
+WORKBITS = 26
+
+[topology]
+MINIMUM-FRIENDS = 0
+FRIENDS-ONLY = NO
+AUTOCONNECT = YES
+TARGET-CONNECTION-COUNT = 16
+FRIENDS = $SERVICEHOME/friends
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-topology
+
+[datastore]
+AUTOSTART = YES
+UNIXPATH = /tmp/test-service-datastore-25
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PORT = 20032
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-datastore
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+QUOTA = 100 MB
+BLOOMFILTER = $SERVICEHOME/fs/bloomfilter
+DATABASE = sqlite
+
+[datastore-sqlite]
+FILENAME = $SERVICEHOME/datastore/sqlite.db
+
+[datastore-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[datastore-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[peerinfo]
+AUTOSTART = YES
+PORT = 20031
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-peerinfo
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-peerinfo-24
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+HOSTS = $SERVICEHOME/data/hosts/
+
+[client]
+HOME = $SERVICEHOME
+
+[TESTING]
+WEAKRANDOM = NO
+CONNECT_TIMEOUT = 30 s
+CONNECT_ATTEMPTS = 3
+MAX_OUTSTANDING_CONNECTIONS = 50
+DELETE_FILES = YES
+
+[ats]
+AUTOSTART = YES
+PORT = 20030
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-ats
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-ats-23
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+WAN_QUOTA_IN = 65536
+WAN_QUOTA_OUT = 65536
+DUMP_MLP = NO
+DUMP_SOLUTION = NO
+DUMP_OVERWRITE = NO
+DUMP_MIN_PEERS = 0
+DUMP_MIN_ADDRS = 0
+ATS_MIN_INTERVAL = 15000
+ATS_EXEC_INTERVAL = 30000
+
+[transport]
+#DEBUG = YES
+AUTOSTART = YES
+PORT = 20029
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-transport
+NEIGHBOUR_LIMIT = 50
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+PLUGINS = tcp
+UNIXPATH = /tmp/test-service-transport-22
+BLACKLIST_FILE = $SERVICEHOME/blacklist
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[transport-tcp]
+USE_LOCALADDR = YES
+PORT = 20028
+ADVERTISED_PORT = 20028
+MAX_CONNECTIONS = 128
+TIMEOUT = 5 s
+
+[transport-udp]
+USE_LOCALADDR = YES
+PORT = 20027
+BROADCAST = YES
+BROADCAST_INTERVAL = 30000
+MAX_BPS = 1000000
+
+[transport-http]
+PORT = 20026
+MAX_CONNECTIONS = 128
+
+[transport-https]
+PORT = 20025
+CRYPTO_INIT = NORMAL
+KEY_FILE = https.key
+CERT_FILE = https.cert
+MAX_CONNECTIONS = 128
+
+[transport-wlan]
+INTERFACE = mon0
+TESTMODE = 0
+
+[datacache-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[datacache-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[template]
+AUTOSTART = NO
+PORT = 20024
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-template
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-template-21
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[fs]
+AUTOSTART = YES
+INDEXDB = $SERVICEHOME/idxinfo.lst
+TRUST = $SERVICEHOME/data/credit/
+IDENTITY_DIR = $SERVICEHOME/identities/
+STATE_DIR = $SERVICEHOME/persistence/
+UPDATE_DIR = $SERVICEHOME/updates/
+PORT = 20023
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-fs
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DELAY = YES
+CONTENT_CACHING = YES
+CONTENT_PUSHING = YES
+UNIXPATH = /tmp/test-service-fs-20
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+MAX_PENDING_REQUESTS = 65536
+MIN_MIGRATION_DELAY = 100 ms
+EXPECTED_NEIGHBOUR_COUNT = 128
+
+[vpn]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-vpn
+IPV6ADDR = 1234::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.11.10.1
+IPV4MASK = 255.255.0.0
+VIRTDNS = 10.11.10.2
+VIRTDNS6 = 1234::17
+IFNAME = vpn-gnunet
+
+[exit]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-exit
+IPV6ADDR = 1234:1::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.10.1.1
+IPV4MASK = 255.255.0.0
+IFNAME = exit-gnunet
+ENABLE_UDP = NO
+ENABLE_TCP = NO
+
+[dns]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-dns-19
+PROVIDE_EXIT = NO
+
+[arm]
+PORT = 20022
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-arm
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DEFAULTSERVICES = topology hostlist fs
+UNIXPATH = /tmp/test-service-arm-18
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[hostlist]
+HTTPPORT = 8080
+HOME = $SERVICEHOME
+HOSTLISTFILE = $SERVICEHOME/hostlist/learned.data
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-hostlist
+OPTIONS = -b
+SERVERS = http://localhost:8080/
+HTTP-PROXY =
+
+[core]
+AUTOSTART = YES
+PORT = 20021
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-core
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-core-17
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nat]
+EXTERNAL_ADDRESS = 127.0.0.1
+INTERNAL_ADDRESS = 127.0.0.1
+BINDTO = 127.0.0.1
+BEHIND_NAT = NO
+PUNCHED_NAT = NO
+ENABLE_UPNP = NO
+USE_LOCALADDR = YES
+USE_HOSTNAME = NO
+ENABLE_ICMP_CLIENT = NO
+ENABLE_ICMP_SERVER = NO
+DISABLEV6 = YES
+RETURN_LOCAL_ADDRESSES = NO
+HOSTNAME_DNS_FREQUENCY = 1200000
+IFC_SCAN_FREQUENCY = 3000000
+DYNDNS_FREQUENCY = 140000
+
+[gnunet-nat-server]
+HOSTNAME = gnunet.org
+PORT = 20020
+
+[statistics]
+AUTOSTART = YES
+PORT = 20019
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-statistics
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-statistics-16
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+
+[dht]
+AUTOSTART = YES
+PORT = 20018
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dht
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+BUCKET_SIZE = 4
+UNIXPATH = /tmp/test-service-dht-15
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[dhtcache]
+DATABASE = sqlite
+QUOTA = 1 MB
+
diff --git a/src/integration-tests/confs/c_no_nat_client_2.conf b/src/integration-tests/confs/c_no_nat_client_2.conf
new file mode 100644
index 0000000..bd675d7
--- /dev/null
+++ b/src/integration-tests/confs/c_no_nat_client_2.conf
@@ -0,0 +1,344 @@
+[PATHS]
+SERVICEHOME = /tmp/c_no_nat_client_2/
+DEFAULTCONFIG = confs/c_no_nat_client_2.conf
+
+[gnunetd]
+#HOSTKEY = $SERVICEHOME/.hostkey
+HOSTKEY = hostkeys/0002-hostkey
+
+[resolver]
+AUTOSTART = YES
+PORT = 20053
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-resolver
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-resolver-42
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = NO
+
+[mesh]
+AUTOSTART = YES
+PORT = 20052
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-mesh
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-mesh-41
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nse]
+AUTOSTART = YES
+PORT = 20051
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-nse
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-nse-40
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PROOFFILE = $SERVICEHOME/.nse-proof
+HISTOGRAM = $SERVICEHOME/nse-history.log
+WORKDELAY = 5 ms
+INTERVAL = 1 h
+WORKBITS = 26
+
+[topology]
+MINIMUM-FRIENDS = 0
+FRIENDS-ONLY = NO
+AUTOCONNECT = YES
+TARGET-CONNECTION-COUNT = 16
+FRIENDS = $SERVICEHOME/friends
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-topology
+
+[datastore]
+AUTOSTART = YES
+UNIXPATH = /tmp/test-service-datastore-39
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+PORT = 20050
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-datastore
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+QUOTA = 100 MB
+BLOOMFILTER = $SERVICEHOME/fs/bloomfilter
+DATABASE = sqlite
+
+[datastore-sqlite]
+FILENAME = $SERVICEHOME/datastore/sqlite.db
+
+[datastore-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[datastore-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[peerinfo]
+AUTOSTART = YES
+PORT = 20049
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-peerinfo
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-peerinfo-38
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+HOSTS = $SERVICEHOME/data/hosts/
+
+[client]
+HOME = $SERVICEHOME
+
+[TESTING]
+WEAKRANDOM = NO
+CONNECT_TIMEOUT = 30 s
+CONNECT_ATTEMPTS = 3
+MAX_OUTSTANDING_CONNECTIONS = 50
+DELETE_FILES = YES
+
+[ats]
+AUTOSTART = YES
+PORT = 20048
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-ats
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-ats-37
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+WAN_QUOTA_IN = 65536
+WAN_QUOTA_OUT = 65536
+DUMP_MLP = NO
+DUMP_SOLUTION = NO
+DUMP_OVERWRITE = NO
+DUMP_MIN_PEERS = 0
+DUMP_MIN_ADDRS = 0
+ATS_MIN_INTERVAL = 15000
+ATS_EXEC_INTERVAL = 30000
+
+[transport]
+AUTOSTART = YES
+PORT = 20047
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-transport
+NEIGHBOUR_LIMIT = 50
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+PLUGINS = tcp
+UNIXPATH = /tmp/test-service-transport-36
+BLACKLIST_FILE = $SERVICEHOME/blacklist
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[transport-tcp]
+PORT = 20046
+ADVERTISED_PORT = 20046
+MAX_CONNECTIONS = 128
+TIMEOUT = 5 s
+USE_LOCALADDR = YES
+
+[transport-udp]
+PORT = 20045
+BROADCAST = YES
+BROADCAST_INTERVAL = 30000
+MAX_BPS = 1000000
+USE_LOCALADDR = YES
+
+[transport-http]
+PORT = 20044
+MAX_CONNECTIONS = 128
+
+[transport-https]
+PORT = 20043
+CRYPTO_INIT = NORMAL
+KEY_FILE = https.key
+CERT_FILE = https.cert
+MAX_CONNECTIONS = 128
+
+[transport-wlan]
+INTERFACE = mon0
+TESTMODE = 0
+
+[datacache-mysql]
+DATABASE = gnunet
+CONFIG = ~/.my.cnf
+
+[datacache-postgres]
+CONFIG = connect_timeout=10; dbname=gnunet
+
+[template]
+AUTOSTART = NO
+PORT = 20042
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-template
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-template-35
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[fs]
+AUTOSTART = YES
+INDEXDB = $SERVICEHOME/idxinfo.lst
+TRUST = $SERVICEHOME/data/credit/
+IDENTITY_DIR = $SERVICEHOME/identities/
+STATE_DIR = $SERVICEHOME/persistence/
+UPDATE_DIR = $SERVICEHOME/updates/
+PORT = 20041
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-fs
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DELAY = YES
+CONTENT_CACHING = YES
+CONTENT_PUSHING = YES
+UNIXPATH = /tmp/test-service-fs-34
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+MAX_PENDING_REQUESTS = 65536
+MIN_MIGRATION_DELAY = 100 ms
+EXPECTED_NEIGHBOUR_COUNT = 128
+
+[vpn]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-vpn
+IPV6ADDR = 1234::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.11.10.1
+IPV4MASK = 255.255.0.0
+VIRTDNS = 10.11.10.2
+VIRTDNS6 = 1234::17
+IFNAME = vpn-gnunet
+
+[exit]
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-exit
+IPV6ADDR = 1234:1::1
+IPV6PREFIX = 32
+IPV4ADDR = 10.10.1.1
+IPV4MASK = 255.255.0.0
+IFNAME = exit-gnunet
+ENABLE_UDP = NO
+ENABLE_TCP = NO
+
+[dns]
+AUTOSTART = YES
+PORT = 0
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dns
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-dns-33
+PROVIDE_EXIT = NO
+
+[arm]
+PORT = 20040
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-arm
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+DEFAULTSERVICES = topology hostlist fs
+UNIXPATH = /tmp/test-service-arm-32
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[hostlist]
+HTTPPORT = 8080
+HOME = $SERVICEHOME
+HOSTLISTFILE = $SERVICEHOME/hostlist/learned.data
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-daemon-hostlist
+OPTIONS = -b
+SERVERS = http://localhost:8080/
+HTTP-PROXY =
+
+[core]
+AUTOSTART = YES
+PORT = 20039
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-core
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-core-31
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[nat]
+BEHIND_NAT = NO
+PUNCHED_NAT = NO
+ENABLE_UPNP = NO
+USE_LOCALADDR = YES
+USE_HOSTNAME = NO
+ENABLE_ICMP_CLIENT = NO
+ENABLE_ICMP_SERVER = NO
+DISABLEV6 = YES
+RETURN_LOCAL_ADDRESSES = NO
+HOSTNAME_DNS_FREQUENCY = 1200000
+IFC_SCAN_FREQUENCY = 3000000
+DYNDNS_FREQUENCY = 140000
+EXTERNAL_ADDRESS = 127.0.0.1
+INTERNAL_ADDRESS = 127.0.0.1
+BINDTO = 127.0.0.1
+
+[gnunet-nat-server]
+HOSTNAME = gnunet.org
+PORT = 20038
+
+[statistics]
+AUTOSTART = YES
+PORT = 20037
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-statistics
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+UNIXPATH = /tmp/test-service-statistics-30
+UNIX_MATCH_UID = NO
+UNIX_MATCH_GID = YES
+
+[dht]
+AUTOSTART = YES
+PORT = 20036
+HOSTNAME = localhost
+HOME = $SERVICEHOME
+CONFIG = $DEFAULTCONFIG
+BINARY = gnunet-service-dht
+ACCEPT_FROM = 127.0.0.1;
+ACCEPT_FROM6 = ::1;
+BUCKET_SIZE = 4
+UNIXPATH = /tmp/test-service-dht-29
+UNIX_MATCH_UID = YES
+UNIX_MATCH_GID = YES
+
+[dhtcache]
+DATABASE = sqlite
+QUOTA = 1 MB
+
diff --git a/src/integration-tests/gnunet_pyexpect.py.in b/src/integration-tests/gnunet_pyexpect.py.in
new file mode 100644
index 0000000..9e5c83f
--- /dev/null
+++ b/src/integration-tests/gnunet_pyexpect.py.in
@@ -0,0 +1,83 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+# Testcase for gnunet-peerinfo
+from __future__ import print_function
+import os
+import re
+import subprocess
+import sys
+import shutil
+import time
+
+class pexpect (object):
+ def __init__ (self):
+ super (pexpect, self).__init__ ()
+
+ def spawn (self, stdin, arglist, *pargs, **kwargs):
+ env = kwargs.pop ('env', None)
+ if env is None:
+ env = os.environ.copy ()
+ # This messes up some testcases, disable log redirection
+ env.pop ('GNUNET_FORCE_LOGFILE', None)
+ self.proc = subprocess.Popen (arglist, *pargs, env=env, **kwargs)
+ if self.proc is None:
+ print ("Failed to spawn a process {0}".format (arglist))
+ sys.exit (1)
+ if stdin is not None:
+ self.stdo, self.stde = self.proc.communicate (stdin)
+ else:
+ self.stdo, self.stde = self.proc.communicate ()
+ return self.proc
+
+ def expect (self, s, r, flags=0):
+ stream = self.stdo if s == 'stdout' else self.stde
+ if isinstance (r, str):
+ if r == "EOF":
+ if len (stream) == 0:
+ return True
+ else:
+ print ("Failed to find `{1}' in {0}, which is `{2}' ({3})".format (s, r, stream, len (stream)))
+ sys.exit (2)
+ raise ValueError ("Argument `r' should be an instance of re.RegexObject or a special string, but is `{0}'".format (r))
+ m = r.search (stream, flags)
+ if not m:
+ print ("Failed to find `{1}' in {0}, which is is `{2}'".format (s, r.pattern, stream))
+ sys.exit (2)
+ stream = stream[m.end ():]
+ if s == 'stdout':
+ self.stdo = stream
+ else:
+ self.stde = stream
+ return m
+
+ def read (self, s, size=-1):
+ stream = self.stdo if s == 'stdout' else self.stde
+ result = ""
+ if size < 0:
+ result = stream
+ new_stream = ""
+ else:
+ result = stream[0:size]
+ new_stream = stream[size:]
+ if s == 'stdout':
+ self.stdo = new_stream
+ else:
+ self.stde = new_stream
+ return result
diff --git a/src/integration-tests/gnunet_testing.py.in b/src/integration-tests/gnunet_testing.py.in
new file mode 100644
index 0000000..79cbfe9
--- /dev/null
+++ b/src/integration-tests/gnunet_testing.py.in
@@ -0,0 +1,232 @@
+#!/usr/bin/python
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+# Functions for integration testing
+import os
+import subprocess
+import sys
+import shutil
+import time
+from gnunet_pyexpect import pexpect
+
+class Check:
+ def __init__(self, test):
+ self.fulfilled = False
+ self.conditions = list()
+ self.test = test
+ def add (self, condition):
+ self.conditions.append(condition)
+ def run (self):
+ fulfilled = True
+ pos = 0
+ neg = 0
+ for c in self.conditions:
+ if (False == c.check ()):
+ fulfilled = False
+ neg += 1
+ else:
+ pos += 1
+ self.test.p (str(pos) +' out of '+ str (pos+neg) + ' conditions fulfilled')
+ return fulfilled
+ def run_blocking (self, timeout, pos_cont, neg_cont):
+ execs = 0;
+ res = False
+ while ((False == res) and (execs < timeout)):
+ res = self.run()
+ time.sleep(1)
+ execs += 1
+ if (res == False):
+ neg_cont (self)
+ else:
+ pos_cont (self)
+ def evaluate (self, failed_only):
+ pos = 0
+ neg = 0
+ for c in self.conditions:
+ if (False == c.evaluate (failed_only)):
+ neg += 1
+ else:
+ pos += 1
+ print (str(pos) +' out of '+ str (pos+neg) + ' conditions fulfilled')
+ return self.fulfilled
+
+class Condition:
+ def __init__(self):
+ self.fulfilled = False
+ self.type = 'generic'
+ def __init__(self, type):
+ self.fulfilled = False
+ self.type = type
+ def check(self):
+ return False;
+ def evaluate (self, failed_only):
+ if ((self.fulfilled == False) and (failed_only == True)):
+ print str(self.type) + 'condition for was ' + str(self.fulfilled)
+ elif (failed_only == False):
+ print str(self.type) + 'condition for was ' + str(self.fulfilled)
+ return self.fulfilled
+
+class FileExistCondition (Condition):
+ def __init__(self, file):
+ self.fulfilled = False
+ self.type = 'file'
+ self.file = file
+ def check(self):
+ if (self.fulfilled == False):
+ res = os.path.isfile(self.file)
+ if (res == True):
+ self.fulfilled = True
+ return True
+ else:
+ return False
+ else:
+ return True
+ def evaluate (self, failed_only):
+ if ((self.fulfilled == False) and (failed_only == True)):
+ print str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled)
+ elif (failed_only == False):
+ print str(self.type) + 'condition for file '+self.file+' was ' + str(self.fulfilled)
+ return self.fulfilled
+
+class StatisticsCondition (Condition):
+ def __init__(self, peer, subsystem, name, value):
+ self.fulfilled = False
+ self.type = 'statistics'
+ self.peer = peer;
+ self.subsystem = subsystem;
+ self.name = name;
+ self.value = value;
+ self.result = -1;
+ def check(self):
+ if (self.fulfilled == False):
+ self.result = self.peer.get_statistics_value (self.subsystem, self.name);
+ if (str(self.result) == str(self.value)):
+ self.fulfilled = True
+ return True
+ else:
+ return False
+ else:
+ return True
+ def evaluate (self, failed_only):
+ if (self.result == -1):
+ res = 'NaN'
+ else:
+ res = str(self.result)
+ if (self.fulfilled == False):
+ fail = " FAIL!"
+ op = " != "
+ else:
+ fail = ""
+ op = " == "
+ if ((self.fulfilled == False) and (failed_only == True)):
+ print self.peer.id[:4] + " " +self.peer.cfg + " " + str(self.type) + ' condition in subsystem "' + self.subsystem.ljust(12) +'" : "' + self.name.ljust(30) +'" : (expected/real value) ' + str(self.value) + op + res + fail
+ elif (failed_only == False):
+ print self.peer.id[:4] + " " +self.peer.cfg + " " + str(self.type) + ' condition in subsystem "' + self.subsystem.ljust(12) +'" : "' + self.name.ljust(30) +'" : (expected/real value) ' + str(self.value) + op + res + fail
+ return self.fulfilled
+
+class Test:
+ def __init__(self, testname, verbose):
+ self.peers = list()
+ self.verbose = verbose;
+ self.name = testname;
+ srcdir = "../.."
+ gnunet_pyexpect_dir = os.path.join (srcdir, "contrib")
+ if gnunet_pyexpect_dir not in sys.path:
+ sys.path.append (gnunet_pyexpect_dir)
+ self.gnunetarm = ''
+ self.gnunetstatistics = ''
+ if os.name == 'posix':
+ self.gnunetarm = 'gnunet-arm'
+ self.gnunetstatistics = 'gnunet-statistics'
+ self.gnunetpeerinfo = 'gnunet-peerinfo'
+ elif os.name == 'nt':
+ self.gnunetarm = 'gnunet-arm.exe'
+ self.gnunetstatistics = 'gnunet-statistics.exe'
+ self.gnunetpeerinfo = 'gnunet-peerinfo.exe'
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), testname), True)
+ else:
+ shutil.rmtree ("/tmp/" + testname, True)
+ def add_peer (self, peer):
+ self.peers.append(peer)
+ def p (self, msg):
+ if (self.verbose == True):
+ print msg
+
+class Peer:
+ def __init__(self, test, cfg_file):
+ if (False == os.path.isfile(cfg_file)):
+ print ("Peer cfg " + cfg_file + ": FILE NOT FOUND")
+ self.id = "<NaN>"
+ self.test = test
+ self.started = False
+ self.cfg = cfg_file
+ def __del__(self):
+ if (self.started == True):
+ print 'ERROR! Peer using cfg ' + self.cfg + ' was not stopped'
+ ret = self.stop ()
+ if (False == ret):
+ print 'ERROR! Peer using cfg ' + self.cfg + ' could not be stopped'
+ self.started = False
+ return ret
+ else:
+ return False
+ def start (self):
+ self.test.p ("Starting peer using cfg " + self.cfg)
+ try:
+ server = subprocess.Popen ([self.test.gnunetarm, '-sq', '-c', self.cfg])
+ server.communicate ()
+ except OSError:
+ print "Can not start peer"
+ self.started = False
+ return False
+ self.started = True;
+ test = ''
+ try:
+ server = pexpect ()
+ server.spawn (None, [self.test.gnunetpeerinfo, '-c', self.cfg ,'-s'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ test = server.read("stdout", 1024)
+ except OSError:
+ print "Can not get peer identity"
+ test = (test.split('`')[1])
+ self.id = test.split('\'')[0]
+ return True
+ def stop (self):
+ if (self.started == False):
+ return False
+ self.test.p ("Stopping peer using cfg " + self.cfg)
+ try:
+ server = subprocess.Popen ([self.test.gnunetarm, '-eq', '-c', self.cfg])
+ server.communicate ()
+ except OSError:
+ print "Can not stop peer"
+ return False
+ self.started = False
+ return True;
+ def get_statistics_value (self, subsystem, name):
+ server = pexpect ()
+ server.spawn (None, [self.test.gnunetstatistics, '-c', self.cfg ,'-q','-n', name, '-s', subsystem ], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ #server.expect ("stdout", re.compile (r""))
+ test = server.read("stdout", 10240)
+ tests = test.partition('\n')[0]
+ if (tests.isdigit() == True):
+ return tests
+ else:
+ return -1
+ \ No newline at end of file
diff --git a/src/integration-tests/hostkeys/0000-hostkey b/src/integration-tests/hostkeys/0000-hostkey
new file mode 100644
index 0000000..c3c2123
--- /dev/null
+++ b/src/integration-tests/hostkeys/0000-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0001-hostkey b/src/integration-tests/hostkeys/0001-hostkey
new file mode 100644
index 0000000..871fc90
--- /dev/null
+++ b/src/integration-tests/hostkeys/0001-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0002-hostkey b/src/integration-tests/hostkeys/0002-hostkey
new file mode 100644
index 0000000..2ffb55f
--- /dev/null
+++ b/src/integration-tests/hostkeys/0002-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0003-hostkey b/src/integration-tests/hostkeys/0003-hostkey
new file mode 100644
index 0000000..13bc889
--- /dev/null
+++ b/src/integration-tests/hostkeys/0003-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0004-hostkey b/src/integration-tests/hostkeys/0004-hostkey
new file mode 100644
index 0000000..a15a073
--- /dev/null
+++ b/src/integration-tests/hostkeys/0004-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0005-hostkey b/src/integration-tests/hostkeys/0005-hostkey
new file mode 100644
index 0000000..4bcfffe
--- /dev/null
+++ b/src/integration-tests/hostkeys/0005-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0006-hostkey b/src/integration-tests/hostkeys/0006-hostkey
new file mode 100644
index 0000000..c595d91
--- /dev/null
+++ b/src/integration-tests/hostkeys/0006-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0007-hostkey b/src/integration-tests/hostkeys/0007-hostkey
new file mode 100644
index 0000000..f7e9dbc
--- /dev/null
+++ b/src/integration-tests/hostkeys/0007-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0008-hostkey b/src/integration-tests/hostkeys/0008-hostkey
new file mode 100644
index 0000000..559a69c
--- /dev/null
+++ b/src/integration-tests/hostkeys/0008-hostkey
Binary files differ
diff --git a/src/integration-tests/hostkeys/0009-hostkey b/src/integration-tests/hostkeys/0009-hostkey
new file mode 100644
index 0000000..7d8ce5e
--- /dev/null
+++ b/src/integration-tests/hostkeys/0009-hostkey
Binary files differ
diff --git a/src/integration-tests/test_integration_bootstrap_and_connect.py.in b/src/integration-tests/test_integration_bootstrap_and_connect.py.in
new file mode 100755
index 0000000..32995d2
--- /dev/null
+++ b/src/integration-tests/test_integration_bootstrap_and_connect.py.in
@@ -0,0 +1,135 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+#definitions
+
+testname = "test_integration_bootstrap_and_connect"
+verbose = True
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-ns"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+
+def success_cont (check):
+ global success
+ success = True;
+
+def fail_cont (check):
+ global success
+ success = False;
+ check.evaluate(True)
+
+def check ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_cont, fail_cont)
+
+#
+# Test execution
+#
+
+def run ():
+ global success
+ global test
+ global server
+ global client
+
+ success = False
+ test = Test ('test_integration_bootstrap_and_connect.py', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ client = Peer(test, './confs/c_no_nat_client.conf');
+
+ assert (True == server.start());
+ assert (True == client.start());
+
+ if ((client.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ time.sleep(5)
+ check ()
+ server.stop ()
+ client.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return False
+ else:
+ return True
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+ \ No newline at end of file
diff --git a/src/integration-tests/test_integration_bootstrap_and_connect_and_disconnect.py.in b/src/integration-tests/test_integration_bootstrap_and_connect_and_disconnect.py.in
new file mode 100755
index 0000000..b426182
--- /dev/null
+++ b/src/integration-tests/test_integration_bootstrap_and_connect_and_disconnect.py.in
@@ -0,0 +1,147 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+#definitions
+
+testname = "test_integration_bootstrap_and_connect"
+verbose = True
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-ns"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+
+def success_server_stop_cont (check):
+ global success
+ success = True;
+
+def success_cont (check):
+ server.stop()
+
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',0))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',0))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',0))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',0))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',0))
+
+ check.run_blocking (check_timeout, success_server_stop_cont, fail_cont)
+
+def fail_cont (check):
+ global success
+ success = False;
+ check.evaluate(True)
+
+def check ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_cont, fail_cont)
+
+#
+# Test execution
+#
+
+def run ():
+ global success
+ global test
+ global server
+ global client
+
+ success = False
+ test = Test ('test_integration_bootstrap_and_connect.py', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ client = Peer(test, './confs/c_no_nat_client.conf');
+
+ assert (True == server.start());
+ assert (True == client.start());
+
+ if ((client.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ time.sleep(5)
+ check ()
+ server.stop ()
+ client.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return False
+ else:
+ return True
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+ \ No newline at end of file
diff --git a/src/integration-tests/test_integration_bootstrap_and_connect_and_disconnect_nat.py.in b/src/integration-tests/test_integration_bootstrap_and_connect_and_disconnect_nat.py.in
new file mode 100755
index 0000000..f055e79
--- /dev/null
+++ b/src/integration-tests/test_integration_bootstrap_and_connect_and_disconnect_nat.py.in
@@ -0,0 +1,147 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+#definitions
+
+testname = "test_integration_bootstrap_and_connect"
+verbose = True
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-ns"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+
+def success_server_stop_cont (check):
+ global success
+ success = True;
+
+def success_cont (check):
+ server.stop()
+
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',0))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',0))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',0))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',0))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',0))
+
+ check.run_blocking (check_timeout, success_server_stop_cont, fail_cont)
+
+def fail_cont (check):
+ global success
+ success = False;
+ check.evaluate(True)
+
+def check ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_cont, fail_cont)
+
+#
+# Test execution
+#
+
+def run ():
+ global success
+ global test
+ global server
+ global client
+
+ success = False
+ test = Test ('test_integration_bootstrap_and_connect.py', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ client = Peer(test, './confs/c_nat_client.conf');
+
+ assert (True == server.start());
+ assert (True == client.start());
+
+ if ((client.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ time.sleep(5)
+ check ()
+ server.stop ()
+ client.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return False
+ else:
+ return True
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+ \ No newline at end of file
diff --git a/src/integration-tests/test_integration_clique.py.in b/src/integration-tests/test_integration_clique.py.in
new file mode 100755
index 0000000..49a2c59
--- /dev/null
+++ b/src/integration-tests/test_integration_clique.py.in
@@ -0,0 +1,197 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+#
+# This test starts 3 peers and expects bootstrap and a connected clique
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#definitions
+
+testname = "test_integration_clique"
+verbose = True
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-ns"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client_2"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client_2/", True)
+
+
+def success_cont (check):
+ global success
+ success = True;
+
+def fail_cont (check):
+ global success
+ success= False;
+ check.evaluate(True)
+
+
+def check_disconnect_client ():
+ test.p ('Shutting down bootstrap client')
+ client.stop ()
+ check = Check (test)
+
+ check.add (StatisticsCondition (client2, 'transport', '# peers connected',0))
+ check.add (StatisticsCondition (client2, 'core', '# neighbour entries allocated',0))
+ check.add (StatisticsCondition (client2, 'core', '# entries in session map',0))
+ check.add (StatisticsCondition (client2, 'topology', '# peers connected',0))
+ check.add (StatisticsCondition (client2, 'fs', '# peers connected',0))
+
+ check.run_blocking (check_timeout, success_cont, fail_cont)
+
+
+def success_disconnect_server_cont (check):
+ check_disconnect_client ()
+
+
+def fail_disconnect_server_cont (check):
+ global success
+ success= False;
+ check.evaluate(True)
+
+
+def check_disconnect_server ():
+ test.p ('Shutting down bootstrap server')
+ server.stop ()
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+ check.add (StatisticsCondition (client2, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client2, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client2, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client2, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client2, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_disconnect_server_cont, fail_disconnect_server_cont)
+
+
+def success_connect_cont (check):
+ check_disconnect_server ()
+
+
+def fail_connect_cont (check):
+ global success
+ success= False;
+ check.evaluate(True)
+
+
+def check_connect ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',2))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',2))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',2))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',2))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',2))
+
+ check.add (StatisticsCondition (client2, 'transport', '# peers connected',2))
+ check.add (StatisticsCondition (client2, 'core', '# neighbour entries allocated',2))
+ check.add (StatisticsCondition (client2, 'core', '# entries in session map',2))
+ check.add (StatisticsCondition (client2, 'topology', '# peers connected',2))
+ check.add (StatisticsCondition (client2, 'fs', '# peers connected',2))
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',2))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',2))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',2))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',2))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',2))
+
+ check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont)
+
+#
+# Test execution
+#
+def run ():
+ global success
+ global test
+ global server
+ global client
+ global client2
+
+ success = False
+
+ test = Test ('test_integration_disconnect', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ server.start();
+
+ client = Peer(test, './confs/c_no_nat_client.conf');
+ client.start();
+
+ client2 = Peer(test, './confs/c_no_nat_client_2.conf');
+ client2.start();
+
+ if ((client.started == True) and (client2.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ check_connect ()
+
+ server.stop ()
+ client.stop ()
+ client2.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return False
+ else:
+ return True
+
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ client2.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+
+
diff --git a/src/integration-tests/test_integration_clique_nat.py.in b/src/integration-tests/test_integration_clique_nat.py.in
new file mode 100755
index 0000000..e8f7719
--- /dev/null
+++ b/src/integration-tests/test_integration_clique_nat.py.in
@@ -0,0 +1,197 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+#
+# This test starts 3 peers (1 bootstrap server, 1 not nat'ed peer, 1 nat'ed peer)
+# and expects bootstrap and a connected clique
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs
+
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#definitions
+testname = "test_integration_clique_nat"
+verbose = True
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_bootstrap_server"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_nat_client"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+ shutil.rmtree ("/tmp/c_nat_client/", True)
+
+
+def success_cont (check):
+ global success
+ success = True;
+
+def fail_cont (check):
+ global success
+ success= False;
+ check.evaluate(True)
+
+
+def check_disconnect_client ():
+ test.p ('Shutting down bootstrap client')
+ client.stop ()
+ check = Check (test)
+
+ check.add (StatisticsCondition (client2, 'transport', '# peers connected',0))
+ check.add (StatisticsCondition (client2, 'core', '# neighbour entries allocated',0))
+ check.add (StatisticsCondition (client2, 'core', '# entries in session map',0))
+ check.add (StatisticsCondition (client2, 'topology', '# peers connected',0))
+ check.add (StatisticsCondition (client2, 'fs', '# peers connected',0))
+
+ check.run_blocking (check_timeout, success_cont, fail_cont)
+
+
+def success_disconnect_server_cont (check):
+ check_disconnect_client ()
+
+
+def fail_disconnect_server_cont (check):
+ global success
+ success= False;
+ check.evaluate(False)
+
+
+def check_disconnect_server ():
+ test.p ('Shutting down bootstrap server')
+ server.stop ()
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+ check.add (StatisticsCondition (client2, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client2, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client2, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client2, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client2, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_disconnect_server_cont, fail_disconnect_server_cont)
+
+
+def success_connect_cont (check):
+ check_disconnect_server ()
+
+
+def fail_connect_cont (check):
+ global success
+ success= False;
+ check.evaluate(False)
+
+
+def check_connect ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',2))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',2))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',2))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',2))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',2))
+
+ check.add (StatisticsCondition (client2, 'transport', '# peers connected',2))
+ check.add (StatisticsCondition (client2, 'core', '# neighbour entries allocated',2))
+ check.add (StatisticsCondition (client2, 'core', '# entries in session map',2))
+ check.add (StatisticsCondition (client2, 'topology', '# peers connected',2))
+ check.add (StatisticsCondition (client2, 'fs', '# peers connected',2))
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',2))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',2))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',2))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',2))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',2))
+
+ check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont)
+
+#
+# Test execution
+#
+def run ():
+ global success
+ global test
+ global server
+ global client
+ global client2
+
+ success = False
+
+ test = Test ('test_integration_disconnect', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ server.start();
+
+ client = Peer(test, './confs/c_no_nat_client.conf');
+ client.start();
+
+ client2 = Peer(test, './confs/c_nat_client.conf');
+ client2.start();
+
+ if ((client.started == True) and (client2.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ check_connect ()
+
+ server.stop ()
+ client.stop ()
+ client2.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return False
+ else:
+ return True
+
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ client2.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+
+
diff --git a/src/integration-tests/test_integration_disconnect.py.in b/src/integration-tests/test_integration_disconnect.py.in
new file mode 100755
index 0000000..5e137cf
--- /dev/null
+++ b/src/integration-tests/test_integration_disconnect.py.in
@@ -0,0 +1,156 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server. When both peers are connected
+# in transport, core, topology, fs, the server is shutdown
+#
+# Conditions for successful exit:
+# Both peers have 0 connected peer in transport, core, topology, fs
+
+#definitions
+
+testname = "test_integration_disconnect"
+verbose = True
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_bootstrap_server"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+
+
+def success_disconnect_cont (check):
+ global success
+ success = True;
+
+
+def fail_disconnect_cont (check):
+ global success
+ success = False;
+ check.evaluate(True)
+
+
+def check_disconnect ():
+ test.p ('Shutting down bootstrap server')
+ server.stop ()
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',0))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',0))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',0))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',0))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',0))
+ check.run_blocking (check_timeout, success_disconnect_cont, fail_disconnect_cont)
+
+
+def success_connect_cont (check):
+ check_disconnect ()
+
+
+def fail_connect_cont (check):
+ global success
+ success= False;
+ check.evaluate(True)
+
+
+def check_connect ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont)
+
+#
+# Test execution
+#
+
+def run ():
+ global success
+ global test
+ global server
+ global client
+
+ success = False
+
+ test = Test ('test_integration_disconnect', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ server.start();
+
+ client = Peer(test, './confs/c_no_nat_client.conf');
+ client.start();
+
+
+ if ((client.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ check_connect ()
+
+ server.stop ()
+ client.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return True
+ else:
+ return False
+
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+ \ No newline at end of file
diff --git a/src/integration-tests/test_integration_restart.py.in b/src/integration-tests/test_integration_restart.py.in
new file mode 100755
index 0000000..e2a72e7
--- /dev/null
+++ b/src/integration-tests/test_integration_restart.py.in
@@ -0,0 +1,171 @@
+#!@PYTHON@
+# This file is part of GNUnet.
+# (C) 2010 Christian Grothoff (and other contributing authors)
+#
+# GNUnet is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNUnet; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+#
+#
+import sys
+import os
+import subprocess
+import re
+import shutil
+import time
+import pexpect
+from gnunet_testing import Peer
+from gnunet_testing import Test
+from gnunet_testing import Check
+from gnunet_testing import Condition
+from gnunet_testing import *
+
+
+#
+# This test tests if a fresh peer bootstraps from a hostlist server and then
+# successfully connects to the server. When both peers are connected
+# in transport, core, topology, fs, botth peers are shutdown and restarted
+#
+# Conditions for successful exit:
+# Both peers have 1 connected peer in transport, core, topology, fs after restart
+
+#definitions
+
+
+testname = "test_integration_restart"
+verbose = False
+check_timeout = 30
+
+
+def cleanup ():
+ if os.name == "nt":
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "gnunet-test-fs-py-ns"), True)
+ shutil.rmtree (os.path.join (os.getenv ("TEMP"), "c_no_nat_client"), True)
+ else:
+ shutil.rmtree ("/tmp/c_bootstrap_server/", True)
+ shutil.rmtree ("/tmp/c_no_nat_client/", True)
+
+
+def success_restart_cont (check):
+ global success
+ test.p ('Shutting down client & server')
+ server.stop ()
+ client.stop ()
+ success = True;
+
+
+def fail_restart_cont (check):
+ global success
+ success = False;
+ check.evaluate(True)
+
+
+def success_connect_cont (check):
+ test.p ('Shutting down client & server for restart')
+ server.stop ()
+ client.stop ()
+
+ time.sleep(5)
+
+ test.p ('Restarting client & server')
+ server.start ()
+ client.start ()
+
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_restart_cont, fail_restart_cont)
+
+
+def fail_connect_cont (check):
+ global success
+ success= False;
+ check.evaluate(True)
+
+
+def check_connect ():
+ check = Check (test)
+ check.add (StatisticsCondition (client, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (client, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (client, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (client, 'fs', '# peers connected',1))
+
+ check.add (StatisticsCondition (server, 'transport', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'core', '# neighbour entries allocated',1))
+ check.add (StatisticsCondition (server, 'core', '# entries in session map',1))
+ check.add (StatisticsCondition (server, 'topology', '# peers connected',1))
+ check.add (StatisticsCondition (server, 'fs', '# peers connected',1))
+
+ check.run_blocking (check_timeout, success_connect_cont, fail_connect_cont)
+
+#
+# Test execution
+#
+
+def run ():
+ global success
+ global test
+ global server
+ global client
+
+ success = False
+
+ test = Test ('test_integration_disconnect', verbose)
+
+ server = Peer(test, './confs/c_bootstrap_server.conf');
+ server.start();
+
+ client = Peer(test, './confs/c_no_nat_client.conf');
+ client.start();
+
+
+ if ((client.started == True) and (server.started == True)):
+ test.p ('Peers started, running check')
+ check_connect ()
+
+ server.stop ()
+ client.stop ()
+
+ cleanup ()
+
+ if (success == False):
+ print ('Test failed')
+ return True
+ else:
+ return False
+
+
+try:
+ run ()
+except (KeyboardInterrupt, SystemExit):
+ print 'Test interrupted'
+ server.stop ()
+ client.stop ()
+ cleanup ()
+if (success == False):
+ sys.exit(1)
+else:
+ sys.exit(0)
+ \ No newline at end of file