diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 11:36:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 11:36:04 +0000 |
commit | 040eee1aa49b49df4698d83a05af57c220127fd1 (patch) | |
tree | f635435954e6ccde5eee9893889e24f30ca68346 /src/lib/util/unittests | |
parent | Initial commit. (diff) | |
download | isc-kea-upstream.tar.xz isc-kea-upstream.zip |
Adding upstream version 2.2.0.upstream/2.2.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib/util/unittests')
21 files changed, 1930 insertions, 0 deletions
diff --git a/src/lib/util/unittests/Makefile.am b/src/lib/util/unittests/Makefile.am new file mode 100644 index 0000000..fc339a4 --- /dev/null +++ b/src/lib/util/unittests/Makefile.am @@ -0,0 +1,33 @@ +AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib +AM_CXXFLAGS = $(KEA_CXXFLAGS) + +noinst_LTLIBRARIES = libutil_unittests.la +libutil_unittests_la_SOURCES = fork.h fork.cc +libutil_unittests_la_SOURCES += newhook.h newhook.cc +libutil_unittests_la_SOURCES += testdata.h testdata.cc +if HAVE_GTEST +libutil_unittests_la_SOURCES += resource.h resource.cc +libutil_unittests_la_SOURCES += check_valgrind.h check_valgrind.cc +libutil_unittests_la_SOURCES += run_all.h run_all.cc +libutil_unittests_la_SOURCES += textdata.h +libutil_unittests_la_SOURCES += wiredata.h wiredata.cc +libutil_unittests_la_SOURCES += interprocess_util.h interprocess_util.cc +endif + +# For now, this isn't needed for libutil_unittests +EXTRA_DIST = mock_socketsession.h + +libutil_unittests_la_CPPFLAGS = $(AM_CPPFLAGS) +if HAVE_GTEST +libutil_unittests_la_CPPFLAGS += $(GTEST_INCLUDES) +endif + +libutil_unittests_la_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) +libutil_unittests_la_LIBADD = # $(top_builddir)/src/lib/util/io/libkea-util-io.la +libutil_unittests_la_LIBADD += $(top_builddir)/src/lib/util/libkea-util.la +libutil_unittests_la_LIBADD += $(top_builddir)/src/lib/exceptions/libkea-exceptions.la +if HAVE_GTEST +libutil_unittests_la_LIBADD += $(GTEST_LDADD) +endif + +CLEANFILES = *.gcno *.gcda diff --git a/src/lib/util/unittests/Makefile.in b/src/lib/util/unittests/Makefile.in new file mode 100644 index 0000000..45d581e --- /dev/null +++ b/src/lib/util/unittests/Makefile.in @@ -0,0 +1,822 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 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@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@HAVE_GTEST_TRUE@am__append_1 = resource.h resource.cc \ +@HAVE_GTEST_TRUE@ check_valgrind.h check_valgrind.cc run_all.h \ +@HAVE_GTEST_TRUE@ run_all.cc textdata.h wiredata.h wiredata.cc \ +@HAVE_GTEST_TRUE@ interprocess_util.h interprocess_util.cc +@HAVE_GTEST_TRUE@am__append_2 = $(GTEST_INCLUDES) +@HAVE_GTEST_TRUE@am__append_3 = $(GTEST_LDADD) +subdir = src/lib/util/unittests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4macros/ax_boost_for_kea.m4 \ + $(top_srcdir)/m4macros/ax_cpp11.m4 \ + $(top_srcdir)/m4macros/ax_crypto.m4 \ + $(top_srcdir)/m4macros/ax_find_library.m4 \ + $(top_srcdir)/m4macros/ax_gssapi.m4 \ + $(top_srcdir)/m4macros/ax_gtest.m4 \ + $(top_srcdir)/m4macros/ax_isc_rpath.m4 \ + $(top_srcdir)/m4macros/ax_sysrepo.m4 \ + $(top_srcdir)/m4macros/libtool.m4 \ + $(top_srcdir)/m4macros/ltoptions.m4 \ + $(top_srcdir)/m4macros/ltsugar.m4 \ + $(top_srcdir)/m4macros/ltversion.m4 \ + $(top_srcdir)/m4macros/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +am__DEPENDENCIES_1 = +@HAVE_GTEST_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +libutil_unittests_la_DEPENDENCIES = \ + $(top_builddir)/src/lib/util/libkea-util.la \ + $(top_builddir)/src/lib/exceptions/libkea-exceptions.la \ + $(am__DEPENDENCIES_2) +am__libutil_unittests_la_SOURCES_DIST = fork.h fork.cc newhook.h \ + newhook.cc testdata.h testdata.cc resource.h resource.cc \ + check_valgrind.h check_valgrind.cc run_all.h run_all.cc \ + textdata.h wiredata.h wiredata.cc interprocess_util.h \ + interprocess_util.cc +@HAVE_GTEST_TRUE@am__objects_1 = libutil_unittests_la-resource.lo \ +@HAVE_GTEST_TRUE@ libutil_unittests_la-check_valgrind.lo \ +@HAVE_GTEST_TRUE@ libutil_unittests_la-run_all.lo \ +@HAVE_GTEST_TRUE@ libutil_unittests_la-wiredata.lo \ +@HAVE_GTEST_TRUE@ libutil_unittests_la-interprocess_util.lo +am_libutil_unittests_la_OBJECTS = libutil_unittests_la-fork.lo \ + libutil_unittests_la-newhook.lo \ + libutil_unittests_la-testdata.lo $(am__objects_1) +libutil_unittests_la_OBJECTS = $(am_libutil_unittests_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libutil_unittests_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(libutil_unittests_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = \ + ./$(DEPDIR)/libutil_unittests_la-check_valgrind.Plo \ + ./$(DEPDIR)/libutil_unittests_la-fork.Plo \ + ./$(DEPDIR)/libutil_unittests_la-interprocess_util.Plo \ + ./$(DEPDIR)/libutil_unittests_la-newhook.Plo \ + ./$(DEPDIR)/libutil_unittests_la-resource.Plo \ + ./$(DEPDIR)/libutil_unittests_la-run_all.Plo \ + ./$(DEPDIR)/libutil_unittests_la-testdata.Plo \ + ./$(DEPDIR)/libutil_unittests_la-wiredata.Plo +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libutil_unittests_la_SOURCES) +DIST_SOURCES = $(am__libutil_unittests_la_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +ASCIIDOC = @ASCIIDOC@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BOOST_INCLUDES = @BOOST_INCLUDES@ +BOOST_LIBS = @BOOST_LIBS@ +BOTAN_TOOL = @BOTAN_TOOL@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONTRIB_DIR = @CONTRIB_DIR@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CRYPTO_CFLAGS = @CRYPTO_CFLAGS@ +CRYPTO_INCLUDES = @CRYPTO_INCLUDES@ +CRYPTO_LDFLAGS = @CRYPTO_LDFLAGS@ +CRYPTO_LIBS = @CRYPTO_LIBS@ +CRYPTO_PACKAGE = @CRYPTO_PACKAGE@ +CRYPTO_RPATH = @CRYPTO_RPATH@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DISTCHECK_BOOST_CONFIGURE_FLAG = @DISTCHECK_BOOST_CONFIGURE_FLAG@ +DISTCHECK_CONTRIB_CONFIGURE_FLAG = @DISTCHECK_CONTRIB_CONFIGURE_FLAG@ +DISTCHECK_CRYPTO_CONFIGURE_FLAG = @DISTCHECK_CRYPTO_CONFIGURE_FLAG@ +DISTCHECK_GTEST_CONFIGURE_FLAG = @DISTCHECK_GTEST_CONFIGURE_FLAG@ +DISTCHECK_KEA_SHELL_CONFIGURE_FLAG = @DISTCHECK_KEA_SHELL_CONFIGURE_FLAG@ +DISTCHECK_LOG4CPLUS_CONFIGURE_FLAG = @DISTCHECK_LOG4CPLUS_CONFIGURE_FLAG@ +DISTCHECK_PERFDHCP_CONFIGURE_FLAG = @DISTCHECK_PERFDHCP_CONFIGURE_FLAG@ +DISTCHECK_PREMIUM_CONFIGURE_FLAG = @DISTCHECK_PREMIUM_CONFIGURE_FLAG@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GENHTML = @GENHTML@ +GREP = @GREP@ +GSSAPI_CFLAGS = @GSSAPI_CFLAGS@ +GSSAPI_LIBS = @GSSAPI_LIBS@ +GTEST_CONFIG = @GTEST_CONFIG@ +GTEST_INCLUDES = @GTEST_INCLUDES@ +GTEST_LDADD = @GTEST_LDADD@ +GTEST_LDFLAGS = @GTEST_LDFLAGS@ +GTEST_SOURCE = @GTEST_SOURCE@ +HAVE_SYSREPO = @HAVE_SYSREPO@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KEA_CXXFLAGS = @KEA_CXXFLAGS@ +KEA_SRCID = @KEA_SRCID@ +KRB5_CONFIG = @KRB5_CONFIG@ +LCOV = @LCOV@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOG4CPLUS_INCLUDES = @LOG4CPLUS_INCLUDES@ +LOG4CPLUS_LIBS = @LOG4CPLUS_LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MYSQL_CPPFLAGS = @MYSQL_CPPFLAGS@ +MYSQL_LIBS = @MYSQL_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +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@ +PACKAGE_VERSION_TYPE = @PACKAGE_VERSION_TYPE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PDFLATEX = @PDFLATEX@ +PERL = @PERL@ +PGSQL_CPPFLAGS = @PGSQL_CPPFLAGS@ +PGSQL_LIBS = @PGSQL_LIBS@ +PKGPYTHONDIR = @PKGPYTHONDIR@ +PKG_CONFIG = @PKG_CONFIG@ +PLANTUML = @PLANTUML@ +PREMIUM_DIR = @PREMIUM_DIR@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SEP = @SEP@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SPHINXBUILD = @SPHINXBUILD@ +SRPD_PLUGINS_PATH = @SRPD_PLUGINS_PATH@ +SR_REPO_PATH = @SR_REPO_PATH@ +STRIP = @STRIP@ +SYSREPOCPP_VERSION = @SYSREPOCPP_VERSION@ +SYSREPO_CPPFLAGS = @SYSREPO_CPPFLAGS@ +SYSREPO_INCLUDEDIR = @SYSREPO_INCLUDEDIR@ +SYSREPO_LIBS = @SYSREPO_LIBS@ +SYSREPO_VERSION = @SYSREPO_VERSION@ +USE_LCOV = @USE_LCOV@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_GCC_44_STRICT_ALIASING_CFLAG = @WARNING_GCC_44_STRICT_ALIASING_CFLAG@ +YACC = @YACC@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +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_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@ +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@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib +AM_CXXFLAGS = $(KEA_CXXFLAGS) +noinst_LTLIBRARIES = libutil_unittests.la +libutil_unittests_la_SOURCES = fork.h fork.cc newhook.h newhook.cc \ + testdata.h testdata.cc $(am__append_1) + +# For now, this isn't needed for libutil_unittests +EXTRA_DIST = mock_socketsession.h +libutil_unittests_la_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_2) +libutil_unittests_la_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS) +libutil_unittests_la_LIBADD = \ + $(top_builddir)/src/lib/util/libkea-util.la \ + $(top_builddir)/src/lib/exceptions/libkea-exceptions.la \ + $(am__append_3) +CLEANFILES = *.gcno *.gcda +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .lo .o .obj +$(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) --foreign src/lib/util/unittests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/lib/util/unittests/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + 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): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libutil_unittests.la: $(libutil_unittests_la_OBJECTS) $(libutil_unittests_la_DEPENDENCIES) $(EXTRA_libutil_unittests_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libutil_unittests_la_LINK) $(libutil_unittests_la_OBJECTS) $(libutil_unittests_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-check_valgrind.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-fork.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-interprocess_util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-newhook.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-resource.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-run_all.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-testdata.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libutil_unittests_la-wiredata.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +libutil_unittests_la-fork.lo: fork.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-fork.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-fork.Tpo -c -o libutil_unittests_la-fork.lo `test -f 'fork.cc' || echo '$(srcdir)/'`fork.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-fork.Tpo $(DEPDIR)/libutil_unittests_la-fork.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fork.cc' object='libutil_unittests_la-fork.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-fork.lo `test -f 'fork.cc' || echo '$(srcdir)/'`fork.cc + +libutil_unittests_la-newhook.lo: newhook.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-newhook.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-newhook.Tpo -c -o libutil_unittests_la-newhook.lo `test -f 'newhook.cc' || echo '$(srcdir)/'`newhook.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-newhook.Tpo $(DEPDIR)/libutil_unittests_la-newhook.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='newhook.cc' object='libutil_unittests_la-newhook.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-newhook.lo `test -f 'newhook.cc' || echo '$(srcdir)/'`newhook.cc + +libutil_unittests_la-testdata.lo: testdata.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-testdata.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-testdata.Tpo -c -o libutil_unittests_la-testdata.lo `test -f 'testdata.cc' || echo '$(srcdir)/'`testdata.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-testdata.Tpo $(DEPDIR)/libutil_unittests_la-testdata.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='testdata.cc' object='libutil_unittests_la-testdata.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-testdata.lo `test -f 'testdata.cc' || echo '$(srcdir)/'`testdata.cc + +libutil_unittests_la-resource.lo: resource.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-resource.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-resource.Tpo -c -o libutil_unittests_la-resource.lo `test -f 'resource.cc' || echo '$(srcdir)/'`resource.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-resource.Tpo $(DEPDIR)/libutil_unittests_la-resource.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='resource.cc' object='libutil_unittests_la-resource.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-resource.lo `test -f 'resource.cc' || echo '$(srcdir)/'`resource.cc + +libutil_unittests_la-check_valgrind.lo: check_valgrind.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-check_valgrind.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-check_valgrind.Tpo -c -o libutil_unittests_la-check_valgrind.lo `test -f 'check_valgrind.cc' || echo '$(srcdir)/'`check_valgrind.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-check_valgrind.Tpo $(DEPDIR)/libutil_unittests_la-check_valgrind.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='check_valgrind.cc' object='libutil_unittests_la-check_valgrind.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-check_valgrind.lo `test -f 'check_valgrind.cc' || echo '$(srcdir)/'`check_valgrind.cc + +libutil_unittests_la-run_all.lo: run_all.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-run_all.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-run_all.Tpo -c -o libutil_unittests_la-run_all.lo `test -f 'run_all.cc' || echo '$(srcdir)/'`run_all.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-run_all.Tpo $(DEPDIR)/libutil_unittests_la-run_all.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='run_all.cc' object='libutil_unittests_la-run_all.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-run_all.lo `test -f 'run_all.cc' || echo '$(srcdir)/'`run_all.cc + +libutil_unittests_la-wiredata.lo: wiredata.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-wiredata.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-wiredata.Tpo -c -o libutil_unittests_la-wiredata.lo `test -f 'wiredata.cc' || echo '$(srcdir)/'`wiredata.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-wiredata.Tpo $(DEPDIR)/libutil_unittests_la-wiredata.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wiredata.cc' object='libutil_unittests_la-wiredata.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-wiredata.lo `test -f 'wiredata.cc' || echo '$(srcdir)/'`wiredata.cc + +libutil_unittests_la-interprocess_util.lo: interprocess_util.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libutil_unittests_la-interprocess_util.lo -MD -MP -MF $(DEPDIR)/libutil_unittests_la-interprocess_util.Tpo -c -o libutil_unittests_la-interprocess_util.lo `test -f 'interprocess_util.cc' || echo '$(srcdir)/'`interprocess_util.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libutil_unittests_la-interprocess_util.Tpo $(DEPDIR)/libutil_unittests_la-interprocess_util.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='interprocess_util.cc' object='libutil_unittests_la-interprocess_util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libutil_unittests_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libutil_unittests_la-interprocess_util.lo `test -f 'interprocess_util.cc' || echo '$(srcdir)/'`interprocess_util.cc + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +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-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/libutil_unittests_la-check_valgrind.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-fork.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-interprocess_util.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-newhook.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-resource.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-run_all.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-testdata.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-wiredata.Plo + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +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-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 ./$(DEPDIR)/libutil_unittests_la-check_valgrind.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-fork.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-interprocess_util.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-newhook.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-resource.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-run_all.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-testdata.Plo + -rm -f ./$(DEPDIR)/libutil_unittests_la-wiredata.Plo + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool clean-noinstLTLIBRARIES \ + cscopelist-am ctags ctags-am distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + 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-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +# 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/lib/util/unittests/README b/src/lib/util/unittests/README new file mode 100644 index 0000000..0ed888f --- /dev/null +++ b/src/lib/util/unittests/README @@ -0,0 +1,5 @@ +This directory contains some code that is useful while writing various +unittest code. It doesn't contain any code that would actually run in +bind10. + +Because this is a test code, we do not test it explicitly. diff --git a/src/lib/util/unittests/check_valgrind.cc b/src/lib/util/unittests/check_valgrind.cc new file mode 100644 index 0000000..8412d43 --- /dev/null +++ b/src/lib/util/unittests/check_valgrind.cc @@ -0,0 +1,33 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +namespace isc { +namespace util { +namespace unittests { + +#if HAVE_VALGRIND_HEADERS +#include <valgrind/valgrind.h> +/// \brief Check if the program is run in valgrind +/// +/// \return true if valgrind headers are available, and valgrind is running, +/// false if the headers are not available, or if valgrind is not +/// running +bool +runningOnValgrind() { + return (RUNNING_ON_VALGRIND != 0); +} +#else +bool +runningOnValgrind() { + return (false); +} +#endif // HAVE_VALGRIND_HEADERS + +} // end of namespace unittests +} // end of namespace util +} // end of namespace isc diff --git a/src/lib/util/unittests/check_valgrind.h b/src/lib/util/unittests/check_valgrind.h new file mode 100644 index 0000000..0abe39f --- /dev/null +++ b/src/lib/util/unittests/check_valgrind.h @@ -0,0 +1,45 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// +// If we have the valgrind headers available, we can detect whether +// valgrind is running. This should normally never be done, as you +// want the to test the actual code in operation with valgrind. +// +// However, there is a limited set of operations where we want to +// skip some tests if run under valgrind, most notably the +// EXPECT_DEATH tests, as these would report memory leaks by +// definition. +// +// If the valgrind headers are NOT available, the method checkValgrind() +// always returns false; i.e. it always pretends the program is run +// natively +// + +#ifndef UTIL_UNITTESTS_CHECK_VALGRIND_H +#define UTIL_UNITTESTS_CHECK_VALGRIND_H 1 + +namespace isc { +namespace util { +namespace unittests { + +/// \brief Check if the program is run in valgrind +/// +/// This is used to check for valgrind and skip (parts of) tests that fork, +/// such as death tests, and general forking tests, and some threading tests; +/// These tend to cause valgrind to report errors, which would hide other +/// potential valgrind reports. +/// +/// \return true if valgrind headers are available, and valgrind is running, +/// false if the headers are not available, or if valgrind is not +/// running +bool runningOnValgrind(); + +} // end namespace unittests +} // end namespace util +} // end namespace isc + +#endif // UTIL_UNITTESTS_CHECK_VALGRIND_H diff --git a/src/lib/util/unittests/fork.cc b/src/lib/util/unittests/fork.cc new file mode 100644 index 0000000..fc8b525 --- /dev/null +++ b/src/lib/util/unittests/fork.cc @@ -0,0 +1,141 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <util/unittests/fork.h> + +#include <util/io/fd.h> + +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> +#include <signal.h> +#include <string.h> +#include <cerrno> +#include <stdlib.h> +#include <stdio.h> + +using namespace isc::util::io; + +namespace { + +// Just a NOP function to ignore a signal but let it interrupt function. +void no_handler(int) { } + +}; + +namespace isc { +namespace util { +namespace unittests { + +bool +process_ok(pid_t process) { + // Create a timeout + struct sigaction ignored, original; + memset(&ignored, 0, sizeof ignored); + ignored.sa_handler = no_handler; + if (sigaction(SIGALRM, &ignored, &original)) { + return false; + } + // It is long, but if everything is OK, it'll not happen + alarm(10); + int status; + int result(waitpid(process, &status, 0) == -1); + // Cancel the alarm and return the original handler + alarm(0); + if (sigaction(SIGALRM, &original, NULL)) { + return false; + } + // Check what we found out + if (result) { + if (errno == EINTR) + kill(process, SIGTERM); + return false; + } + return WIFEXITED(status) && WEXITSTATUS(status) == 0; +} + +/* + * This creates a pipe, forks and feeds the pipe with given data. + * Used to provide the input in non-blocking/asynchronous way. + */ +pid_t +provide_input(int *read_pipe, const void *input, const size_t length) +{ + int pipes[2]; + if (pipe(pipes)) { + return -1; + } + *read_pipe = pipes[0]; + + pid_t pid(fork()); + if (pid) { // We are in the parent + return pid; + } else { // This is in the child, just puts the data there + close(pipes[0]); + if (!write_data(pipes[1], input, length)) { + exit(1); + } else { + close(pipes[1]); + exit(0); + } + } +} + + +/* + * This creates a pipe, forks and reads the pipe and compares it + * with given data. Used to check output of run in an asynchronous way. + */ +pid_t +check_output(int *write_pipe, const void* const output, const size_t length) +{ + int pipes[2]; + if (pipe(pipes)) { + return -1; + } + *write_pipe = pipes[1]; + pid_t pid(fork()); + if (pid) { // We are in parent + close(pipes[0]); + return pid; + } else { + close(pipes[1]); + unsigned char* buffer = new unsigned char[length + 1]; + // Try to read one byte more to see if the output ends here + size_t got_length(read_data(pipes[0], buffer, length + 1)); + bool ok(true); + if (got_length != length) { + fprintf(stderr, "Different length (expected %u, got %u)\n", + static_cast<unsigned>(length), + static_cast<unsigned>(got_length)); + ok = false; + } + if(!ok || memcmp(buffer, output, length)) { + const unsigned char *output_c(static_cast<const unsigned char *>( + output)); + // If they differ, print what we have + for(size_t i(0); i != got_length; ++ i) { + fprintf(stderr, "%02hhx", buffer[i]); + } + fprintf(stderr, "\n"); + for(size_t i(0); i != length; ++ i) { + fprintf(stderr, "%02hhx", output_c[i]); + } + fprintf(stderr, "\n"); + delete [] buffer; + exit(1); + } else { + delete [] buffer; + exit(0); + } + } +} + +} +} +} diff --git a/src/lib/util/unittests/fork.h b/src/lib/util/unittests/fork.h new file mode 100644 index 0000000..68277f6 --- /dev/null +++ b/src/lib/util/unittests/fork.h @@ -0,0 +1,44 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef UTIL_UNITTESTS_FORK_H +#define UTIL_UNITTESTS_FORK_H 1 + +#include <unistd.h> + +/** + * \file fork.h + * \brief Help functions to fork the test case process. + * Various functions to fork a process and feed some data to pipe, check + * its output and such lives here. + */ + +namespace isc { +namespace util { +namespace unittests { + +/** + * @short Checks that a process terminates correctly. + * Waits for a process to terminate (with a short timeout, this should be + * used whan the process is about to terminate) and checks its exit code. + * + * @return True if the process terminates with 0, false otherwise. + * @param process The ID of process to wait for. + */ +bool +process_ok(pid_t process); + +pid_t +provide_input(int* read_pipe, const void* input, const size_t length); + +pid_t +check_output(int* write_pipe, const void* const output, const size_t length); + +} // End of the namespace +} +} + +#endif // UTIL_UNITTESTS_FORK_H diff --git a/src/lib/util/unittests/interprocess_util.cc b/src/lib/util/unittests/interprocess_util.cc new file mode 100644 index 0000000..dd639ff --- /dev/null +++ b/src/lib/util/unittests/interprocess_util.cc @@ -0,0 +1,42 @@ +// Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <gtest/gtest.h> + +#include <sys/select.h> +#include <cstddef> + +namespace isc { +namespace util { +namespace unittests { + +unsigned char +parentReadState(int fd) { + unsigned char result = 0xff; + + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + struct timeval tv = {5, 0}; + + const int nfds = select(fd + 1, &rfds, NULL, NULL, &tv); + EXPECT_EQ(1, nfds); + + if (nfds == 1) { + // Read status + const ssize_t bytes_read = read(fd, &result, sizeof(result)); + EXPECT_EQ(sizeof(result), bytes_read); + } + + return (result); +} + +} +} +} diff --git a/src/lib/util/unittests/interprocess_util.h b/src/lib/util/unittests/interprocess_util.h new file mode 100644 index 0000000..7012f7b --- /dev/null +++ b/src/lib/util/unittests/interprocess_util.h @@ -0,0 +1,23 @@ +// Copyright (C) 2013-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +namespace isc { +namespace util { +namespace unittests { +/// \brief A helper utility for a simple synchronization with another process. +/// +/// It waits for incoming data on a given file descriptor up to 5 seconds +/// (arbitrary choice), read one byte data, and return it to the caller. +/// On any failure it returns 0xff (255), so the sender process should use +/// a different value to pass. +unsigned char parentReadState(int fd); +} +} +} + +// Local Variables: +// mode: c++ +// End: diff --git a/src/lib/util/unittests/mock_socketsession.h b/src/lib/util/unittests/mock_socketsession.h new file mode 100644 index 0000000..808cddb --- /dev/null +++ b/src/lib/util/unittests/mock_socketsession.h @@ -0,0 +1,151 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef UTIL_UNITTESTS_MOCKSOCKETSESSION_H +#define UTIL_UNITTESTS_MOCKSOCKETSESSION_H 1 + +#include <exceptions/exceptions.h> + +#include <util/io/socketsession.h> +#include <util/io/sockaddr_util.h> + +#include <cassert> +#include <cstring> +#include <vector> + +#include <sys/socket.h> +#include <stdint.h> + +namespace isc { +namespace util { +namespace unittests { + +/// \brief Mock socket session forwarder. +/// +/// It emulates the behavior of SocketSessionForwarder without involving +/// network communication, and allowing the tester to customize the behavior +/// and to examine forwarded data afterwards. +class MockSocketSessionForwarder : + public isc::util::io::BaseSocketSessionForwarder +{ +public: + MockSocketSessionForwarder() : + is_connected_(false), connect_ok_(true), push_ok_(true), + close_ok_(true), + // These are not used until set, but we set them anyway here, + // partly to silence cppcheck, and partly to be cleaner. Put some + // invalid values in. + pushed_sock_(-1), pushed_family_(-1), pushed_type_(-1), + pushed_protocol_(-1) + {} + + virtual void connectToReceiver() { + if (!connect_ok_) { + isc_throw(isc::util::io::SocketSessionError, "socket session " + "forwarding connection disabled for test"); + } + if (is_connected_) { + isc_throw(isc::util::io::SocketSessionError, "duplicate connect"); + } + is_connected_ = true; + } + virtual void close() { + if (!is_connected_) { + isc_throw(isc::util::io::SocketSessionError, "duplicate close"); + } + is_connected_ = false; + } + + // Pushing a socket session. It copies the given session data + // so that the test code can check the values later via the getter + // methods. Complete deep copy will be created, so the caller doesn't + // have to keep the parameters valid after the call to this method. + virtual void push(int sock, int family, int type, int protocol, + const struct sockaddr& local_end, + const struct sockaddr& remote_end, + const void* data, size_t data_len) + { + if (!push_ok_) { + isc_throw(isc::util::io::SocketSessionError, + "socket session forwarding is disabled for test"); + } + if (!is_connected_) { + isc_throw(isc::util::io::SocketSessionError, + "socket session is being pushed before connected"); + } + + // Copy parameters for later checks + pushed_sock_ = sock; + pushed_family_ = family; + pushed_type_ = type; + pushed_protocol_ = protocol; + assert(io::internal::getSALength(local_end) <= + sizeof(pushed_local_end_ss_)); + std::memcpy(&pushed_local_end_ss_, &local_end, + io::internal::getSALength(local_end)); + assert(io::internal::getSALength(remote_end) <= + sizeof(pushed_remote_end_ss_)); + std::memcpy(&pushed_remote_end_ss_, &remote_end, + io::internal::getSALength(remote_end)); + pushed_data_.resize(data_len); + std::memcpy(&pushed_data_[0], data, data_len); + } + + // Allow the test code to check if the connection is established. + bool isConnected() const { return (is_connected_); } + + // Allow the test code to customize the forwarder behavior wrt whether + // a specific operation should succeed or fail. + void disableConnect() { connect_ok_ = false; } + void enableConnect() { connect_ok_ = true; } + void disableClose() { close_ok_ = false; } + void disablePush() { push_ok_ = false; } + void enablePush() { push_ok_ = true; } + + // Read-only accessors to recorded parameters to the previous successful + // call to push(). Return values are undefined if there has been no + // successful call to push(). + // Note that we use convertSockAddr() to convert sockaddr_storage to + // sockaddr. It should be safe since we use the storage in its literal + // sense; it was originally filled with the binary image of another + // sockaddr structure, and we are going to return the image opaquely + // as a sockaddr structure without touching the data. + int getPushedSock() const { return (pushed_sock_); } + int getPushedFamily() const { return (pushed_family_); } + int getPushedType() const { return (pushed_type_); } + int getPushedProtocol() const { return (pushed_protocol_); } + const struct sockaddr& getPushedLocalend() const { + return (*io::internal::convertSockAddr(&pushed_local_end_ss_)); + } + const struct sockaddr& getPushedRemoteend() const { + return (*io::internal::convertSockAddr(&pushed_remote_end_ss_)); + } + const std::vector<uint8_t>& getPushedData() const { + return (pushed_data_); + } + +private: + bool is_connected_; + bool connect_ok_; + bool push_ok_; + bool close_ok_; + int pushed_sock_; + int pushed_family_; + int pushed_type_; + int pushed_protocol_; + struct sockaddr_storage pushed_local_end_ss_; + struct sockaddr_storage pushed_remote_end_ss_; + std::vector<uint8_t> pushed_data_; +}; + +} // end of unittests +} // end of util +} // end of isc +#endif // UTIL_UNITTESTS_MOCKSOCKETSESSION_H + +// Local Variables: +// mode: c++ +// End: diff --git a/src/lib/util/unittests/newhook.cc b/src/lib/util/unittests/newhook.cc new file mode 100644 index 0000000..16c601a --- /dev/null +++ b/src/lib/util/unittests/newhook.cc @@ -0,0 +1,45 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <stdlib.h> + +#include <new> +#include <stdexcept> + +#include <util/unittests/newhook.h> + +#ifdef ENABLE_CUSTOM_OPERATOR_NEW +void* +operator new(size_t size) throw(std::bad_alloc) { + if (isc::util::unittests::force_throw_on_new && + size == isc::util::unittests::throw_size_on_new) { + throw std::bad_alloc(); + } + void* p = malloc(size); + if (p == NULL) { + throw std::bad_alloc(); + } + return (p); +} + +void +operator delete(void* p) throw() { + if (p != NULL) { + free(p); + } +} +#endif + +namespace isc { +namespace util { +namespace unittests { +bool force_throw_on_new = false; +size_t throw_size_on_new = 0; +} +} +} diff --git a/src/lib/util/unittests/newhook.h b/src/lib/util/unittests/newhook.h new file mode 100644 index 0000000..1fc3eba --- /dev/null +++ b/src/lib/util/unittests/newhook.h @@ -0,0 +1,74 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef UTIL_UNITTESTS_NEWHOOK_H +#define UTIL_UNITTESTS_NEWHOOK_H 1 + +/** + * \file newhook.h + * \brief Enable the use of special operator new that throws for testing. + * + * This small utility allows a test case to force the global operator new + * to throw for a given size to test a case where memory allocation fails + * (which normally doesn't happen). To enable the feature, everything must + * be built with defining ENABLE_CUSTOM_OPERATOR_NEW beforehand, and set + * \c force_throw_on_new to \c true and \c throw_size_on_new to the size + * of data that should trigger the exception, immediately before starting + * the specific test that needs the exception. + * + * Example: + * \code #include <util/unittests/newhook.h> + * ... + * TEST(SomeTest, newException) { + * isc::util::unittests::force_throw_on_new = true; + * isc::util::unittests::throw_size_on_new = sizeof(Foo); + * try { + * // this will do 'new Foo()' internally and should throw + * createFoo(); + * isc::util::unittests::force_throw_on_new = false; + * ASSERT_FALSE(true) << "Expected throw on new"; + * } catch (const std::bad_alloc&) { + * isc::util::unittests::force_throw_on_new = false; + * // do some integrity check, etc, if necessary + * } + * } \endcode + * + * Replacing the global operator new (and delete) is a dangerous technique, + * and triggering an exception solely based on the allocation size is not + * reliable, so this feature is disabled by default two-fold: The + * ENABLE_CUSTOM_OPERATOR_NEW build time variable, and run-time + * \c force_throw_on_new. + */ + +namespace isc { +namespace util { +namespace unittests { +/// Switch to enable the use of special operator new +/// +/// This is set to \c false by default. +extern bool force_throw_on_new; + +/// The allocation size that triggers an exception in the special operator new +/// +/// This is the exact size that causes an exception to be thrown; +/// for example, if it is set to 100, an attempt of allocating 100 bytes +/// will result in an exception, but allocation attempt for 101 bytes won't +/// (unless, of course, memory is really exhausted and allocation really +/// fails). +/// +/// The default value is 0. The value of this variable has no meaning +/// unless the use of the special operator is enabled at build time and +/// via \c force_throw_on_new. +extern size_t throw_size_on_new; +} +} +} + +#endif // UTIL_UNITTESTS_NEWHOOK_H + +// Local Variables: +// mode: c++ +// End: diff --git a/src/lib/util/unittests/resource.cc b/src/lib/util/unittests/resource.cc new file mode 100644 index 0000000..b4a33b3 --- /dev/null +++ b/src/lib/util/unittests/resource.cc @@ -0,0 +1,29 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <util/unittests/resource.h> + +#include <gtest/gtest.h> + +#include <sys/time.h> +#include <sys/resource.h> + +namespace isc { +namespace util { +namespace unittests { + +void +dontCreateCoreDumps() { + const rlimit core_limit = {0, 0}; + + EXPECT_EQ(setrlimit(RLIMIT_CORE, &core_limit), 0); +} + +} // end of namespace unittests +} // end of namespace util +} // end of namespace isc diff --git a/src/lib/util/unittests/resource.h b/src/lib/util/unittests/resource.h new file mode 100644 index 0000000..dfa44ee --- /dev/null +++ b/src/lib/util/unittests/resource.h @@ -0,0 +1,31 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef UTIL_UNITTESTS_RESOURCE_H +#define UTIL_UNITTESTS_RESOURCE_H 1 + +namespace isc { +namespace util { +namespace unittests { + +/// Don't create core dumps. +/// +/// This function sets the core size to 0, inhibiting the creation of +/// core dumps. It is meant to be used in testcases where EXPECT_DEATH +/// is used, where processes abort (and create cores in the process). +/// As a new process is forked to run EXPECT_DEATH tests, the rlimits of +/// the parent process that runs the other tests should be unaffected. +void dontCreateCoreDumps(); + +} // end of namespace unittests +} // end of namespace util +} // end of namespace isc + +#endif // UTIL_UNITTESTS_RESOURCE_H + +// Local Variables: +// mode: c++ +// End: diff --git a/src/lib/util/unittests/run_all.cc b/src/lib/util/unittests/run_all.cc new file mode 100644 index 0000000..82542ca --- /dev/null +++ b/src/lib/util/unittests/run_all.cc @@ -0,0 +1,89 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <stdlib.h> + +#include <iostream> +#include <iomanip> + +#include <gtest/gtest.h> +#include <exceptions/exceptions.h> +#include <util/unittests/run_all.h> + +namespace isc { +namespace util { +namespace unittests { + +int +run_all() { + int ret = 0; + + // The catching of exceptions generated in tests is controlled by the + // KEATEST_CATCH_EXCEPTION environment variable. Setting this to + // 1 enables the catching of exceptions; setting it to 0 disables it. + // Anything else causes a message to be printed to stderr and the default + // taken. (The default is to catch exceptions if compiling with clang + // and false if not.) +#ifdef __clang__ + bool catch_exception = true; +#else + bool catch_exception = false; +#endif + + const char* keatest_catch_exception = getenv("KEATEST_CATCH_EXCEPTION"); + if (keatest_catch_exception != NULL) { + if (strcmp(keatest_catch_exception, "1") == 0) { + catch_exception = true; + } else if (strcmp(keatest_catch_exception, "0") == 0) { + catch_exception = false; + } else { + std::cerr << "***ERROR: KEATEST_CATCH_EXCEPTION is '" + << keatest_catch_exception + << "': allowed values are '1' or '0'.\n" + << " The default value of " + << (catch_exception ? + "1 (exception catching enabled)": + "0 (exception catching disabled)") + << " will be used.\n"; + } + } + + // Actually run the code + if (catch_exception) { + try { + ret = RUN_ALL_TESTS(); + } catch (const isc::Exception& ex) { + // Could output more information with typeid(), but there is no + // guarantee that all compilers will support it without an explicit + // flag on the command line. + std::cerr << "*** Exception derived from isc::exception thrown:\n" + << " file: " << ex.getFile() << "\n" + << " line: " << ex.getLine() << "\n" + << " what: " << ex.what() << std::endl; + throw; + } catch (const std::exception& ex) { + std::cerr << "*** Exception derived from std::exception thrown:\n" + << " what: " << ex.what() << std::endl; + throw; + } + } else { + // This is a separate path for the case where the exception is not + // being caught. Although the other code path re-throws the exception + // after catching it, there is no guarantee that the state of the + // stack is preserved - a compiler might have unwound the stack to + // the point at which the exception is caught. This would prove + // awkward if trying to debug the program using a debugger. + ret = RUN_ALL_TESTS(); + } + + return (ret); +} + +} // namespace unittests +} // namespace util +} // namespace isc diff --git a/src/lib/util/unittests/run_all.h b/src/lib/util/unittests/run_all.h new file mode 100644 index 0000000..7415e6b --- /dev/null +++ b/src/lib/util/unittests/run_all.h @@ -0,0 +1,44 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + + + +#ifndef RUN_ALL_H +#define RUN_ALL_H + +// Avoid need for user to include this header file. + +#include <gtest/gtest.h> + +namespace isc { +namespace util { +namespace unittests { + +/// \brief Run All Tests +/// +/// A wrapper for the Google Test RUN_ALL_TESTS() macro, this calls the macro +/// but wraps the call in a try...catch block if the environment variable +/// KEATEST_CATCH_EXCEPTION is defined, and calls the macro directly if not. +/// +/// The catch block catches exceptions of types isc::Exception and +/// std::exception and prints some information about them to stderr. (In the +/// case of isc::Exception, this includes the file and line number from which +/// the exception was raised.) It then re-throws the exception. +/// +/// See: https://lists.isc.org/pipermail/bind10-dev/2011-January/001867.html +/// for some context. +/// +/// \return Return value from RUN_ALL_TESTS(). + +int run_all(); + +} // namespace unittests +} // namespace util +} // namespace isc + + + +#endif // RUN_ALL_H diff --git a/src/lib/util/unittests/testdata.cc b/src/lib/util/unittests/testdata.cc new file mode 100644 index 0000000..e3ecc91 --- /dev/null +++ b/src/lib/util/unittests/testdata.cc @@ -0,0 +1,55 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <string> +#include <stdexcept> +#include <fstream> +#include <vector> + +#include <util/unittests/testdata.h> + +using namespace std; + +namespace { +vector<string>& +getDataPaths() { + static vector<string> data_path; + return (data_path); +} +} + +namespace isc { +namespace util { +namespace unittests { + +void +addTestDataPath(const string& path) { + getDataPaths().push_back(path); +} + +void +openTestData(const char* const datafile, ifstream& ifs) { + vector<string>::const_iterator it = getDataPaths().begin(); + for (; it != getDataPaths().end(); ++it) { + string data_path = *it; + if (data_path.empty() || *data_path.rbegin() != '/') { + data_path.push_back('/'); + } + ifs.open((data_path + datafile).c_str(), ios_base::in); + if (!ifs.fail()) { + return; + } + } + + throw runtime_error("failed to open data file in data paths: " + + string(datafile)); +} + +} +} +} diff --git a/src/lib/util/unittests/testdata.h b/src/lib/util/unittests/testdata.h new file mode 100644 index 0000000..ee7c1c5 --- /dev/null +++ b/src/lib/util/unittests/testdata.h @@ -0,0 +1,46 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef UTIL_UNITTESTS_TESTDATA_H +#define UTIL_UNITTESTS_TESTDATA_H 1 + +/** + * \file testdata.h + * \brief Manipulating test data files. + * + * This utility defines functions that help test case handle test data + * stored in a file. + */ + +namespace isc { +namespace util { +namespace unittests { +/// Add a path (directory) that \c openTestData() will search for test data +/// files. +void addTestDataPath(const std::string& path); + +/// Open a file specified by 'datafile' using the data paths registered via +/// addTestDataPath(). On success, ifs will be ready for reading the data +/// stored in 'datafile'. If the data file cannot be open with any of the +/// registered paths, a runtime_error exception will be thrown. +/// +/// \note Care should be taken if you want to reuse the same single \c ifs +/// for multiple input data. Some standard C++ library implementations retain +/// the failure bit if the first stream reaches the end of the first file, +/// and make the second call to \c ifstream::open() fail. The safest way +/// is to use a different \c ifstream object for a new call to this function; +/// alternatively make sure you explicitly clear the error bit by calling +/// \c ifstream::clear() on \c ifs. +void openTestData(const char* const datafile, std::ifstream& ifs); +} +} +} + +#endif // UTIL_UNITTESTS_TESTDATA_H + +// Local Variables: +// mode: c++ +// End: diff --git a/src/lib/util/unittests/textdata.h b/src/lib/util/unittests/textdata.h new file mode 100644 index 0000000..ae132cd --- /dev/null +++ b/src/lib/util/unittests/textdata.h @@ -0,0 +1,95 @@ +// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <istream> +#include <string> +#include <sstream> + +#include <gtest/gtest.h> + +#ifndef UTIL_UNITTESTS_TEXTDATA_H +#define UTIL_UNITTESTS_TEXTDATA_H 1 + +/** + * \file textdata.h + * \brief Utilities for tests with text data. + * + * This utility provides convenient helper functions for unit tests using + * textual data. + */ + +namespace isc { +namespace util { +namespace unittests { + +/// Line-by-line text comparison. +/// +/// This templated function takes two standard input streams, extracts +/// strings from them, and compares the two sets of strings line by line. +template <typename EXPECTED_STREAM, typename ACTUAL_STREAM> +void +matchTextData(EXPECTED_STREAM& expected, ACTUAL_STREAM& actual) { + std::string actual_line; + std::string expected_line; + while (std::getline(actual, actual_line), !actual.eof()) { + std::getline(expected, expected_line); + if (expected.eof()) { + FAIL() << "Redundant line in actual output: " << actual_line; + break; + } + if (actual.bad() || actual.fail() || + expected.bad() || expected.fail()) { + throw std::runtime_error("Unexpected error in data streams"); + } + EXPECT_EQ(expected_line, actual_line); + } + while (std::getline(expected, expected_line), !expected.eof()) { + ADD_FAILURE() << "Missing line in actual output: " << expected_line; + } +} + +/// Similar to the fully templated version, but takes string for the second +/// (actual) data. +/// +/// Due to the nature of textual data, it will often be the case that test +/// data is given as a string object. This shortcut version helps such cases +/// so that the test code doesn't have to create a string stream with the +/// string data just for testing. +template <typename EXPECTED_STREAM> +void +matchTextData(EXPECTED_STREAM& expected, const std::string& actual_text) { + std::istringstream iss(actual_text); + matchTextData(expected, iss); +} + +/// Same for the previous version, but the first argument is string. +template <typename ACTUAL_STREAM> +void +matchTextData(const std::string& expected_text, ACTUAL_STREAM& actual) { + std::istringstream iss(expected_text); + matchTextData(iss, actual); +} + +/// Same for the previous two, but takes strings for both expected and +/// actual data. +void +matchTextData(const std::string& expected_text, + const std::string& actual_text) +{ + std::istringstream expected_is(expected_text); + std::istringstream actual_is(actual_text); + matchTextData(expected_is, actual_is); +} + +} +} +} + +#endif // UTIL_UNITTESTS_TEXTDATA_H + +// Local Variables: +// mode: c++ +// End: diff --git a/src/lib/util/unittests/wiredata.cc b/src/lib/util/unittests/wiredata.cc new file mode 100644 index 0000000..c14c8f1 --- /dev/null +++ b/src/lib/util/unittests/wiredata.cc @@ -0,0 +1,46 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include <config.h> + +#include <util/unittests/wiredata.h> + +#include <gtest/gtest.h> + +#include <algorithm> // for std::min +#include <stdint.h> + +using namespace std; + +namespace isc { +namespace util { +namespace unittests { + +void +matchWireData(const void* expected_data, size_t expected_len, + const void* actual_data, size_t actual_len) +{ + const size_t cmplen = std::min(expected_len, actual_len); + + for (size_t i = 0; i < cmplen; ++i) { + const int ebyte = static_cast<const uint8_t*>(expected_data)[i]; + const int abyte = static_cast<const uint8_t*>(actual_data)[i]; + // Once we find a mismatch, it's quite likely that there will be many + // mismatches after this point. So we stop here by using ASSERT not + // to be too noisy. + ASSERT_EQ(ebyte, abyte) << "Wire data mismatch at " << i << "th byte\n" + << " Actual: " << abyte << "\n" + << "Expected: " << ebyte << "\n"; + } + EXPECT_EQ(expected_len, actual_len) + << "Wire data mismatch in length:\n" + << " Actual: " << actual_len << "\n" + << "Expected: " << expected_len << "\n"; +} + +} // unittests +} // util +} // isc diff --git a/src/lib/util/unittests/wiredata.h b/src/lib/util/unittests/wiredata.h new file mode 100644 index 0000000..fee555e --- /dev/null +++ b/src/lib/util/unittests/wiredata.h @@ -0,0 +1,37 @@ +// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef UTIL_UNITTESTS_WIREDATA_H +#define UTIL_UNITTESTS_WIREDATA_H 1 + +#include <cstddef> + +/// \file wiredata.h +/// \brief Utilities for tests with wire data. +/// +/// This utility provides convenient helper functions for unit tests using +/// wire (binary) data. + +namespace isc { +namespace util { +namespace unittests { + +/// \brief Compare two sets of binary data in a google test. +/// +/// This method checks if the expected and actual data have the same length +/// and all bytes are the same. If not, it reports the point of mismatch in +/// the google test format. +void matchWireData(const void* expected_data, std::size_t expected_len, + const void* actual_data, std::size_t actual_len); +} +} +} + +#endif // UTIL_UNITTESTS_WIREDATA_H + +// Local Variables: +// mode: c++ +// End: |