On Fri, Feb 27, 2015 at 07:13:37PM +0200, Nikolai Kondrashov wrote:
Hi everyone,
This is my attempt to add basic integration tests. There are almost no tests
there at the moment and this is mostly about the infrastructure and the way we
might do it.
I will be glad to answer any questions and receive any comments or
suggestions. I'm sure I did a lot of things in a wrong way :)
Thank you!
CI:
http://sssd-ci.duckdns.org/logs/job/8/40/summary.html
Nick
I checked the build system changes since Michal requested another
reviwer there.
From a4e3c569d35e6f812ff641f38e89982d0254eaba Mon Sep 17 00:00:00
2001
From: Nikolai Kondrashov <Nikolai.Kondrashov(a)redhat.com>
Date: Mon, 24 Nov 2014 19:13:16 +0200
Subject: [PATCH 1/1] Add integration tests
Add --enable-intgcheck configure option, which enables "intgcheck" make
target. CI is updated to use them.
The "intgcheck" target configures and builds sssd in a sub-directory,
installs it into a prefix in another sub-directory, and then makes the
"intgcheck-installed" target from within src/tests/intg in that separate
build.
The "intgcheck-installed" target in src/tests/intg runs py.test for all
tests it can find in that directory, under fakeroot and
nss_wrapper/uid_wrapper environments emulating running under root.
The only test in src/tests/intg at the moment - ldap_test.py sets up and
starts a slapd instance, adds a few user and group entries, configures
and starts sssd and verifies that those users and groups are retrieved
correctly using various nss functions.
The above only works on Red Hat distros, mostly because Debian lacks
nss_wrapper package. The tests are very basic and error reporting on
mismatch in data received from nss is very rudimentary, at the moment.
There is also a good amount of duplication between rfc2307 and
rfc2307bis cases, which might be dealt with later.
---
Makefile.am | 29 ++++-
configure.ac | 15 ++-
contrib/ci/configure.sh | 6 +
contrib/ci/deps.sh | 11 +-
contrib/ci/run | 9 ++
src/external/fakeroot.m4 | 2 +
src/external/intgcheck.m4 | 23 ++++
src/external/ldap.m4 | 6 +
src/external/pytest.m4 | 3 +
src/external/python.m4 | 49 +++++++
src/tests/intg/Makefile.am | 59 +++++++++
src/tests/intg/config.py.m4 | 13 ++
src/tests/intg/ent.py | 163 +++++++++++++++++++++++
src/tests/intg/ldap_test.py | 296 ++++++++++++++++++++++++++++++++++++++++++
src/tests/intg/misc.py | 49 +++++++
src/tests/intg/slapd_setup | 246 +++++++++++++++++++++++++++++++++++
src/tests/intg/slapd_teardown | 49 +++++++
17 files changed, 1024 insertions(+), 4 deletions(-)
create mode 100644 src/external/fakeroot.m4
create mode 100644 src/external/intgcheck.m4
create mode 100644 src/external/pytest.m4
create mode 100644 src/tests/intg/Makefile.am
create mode 100644 src/tests/intg/config.py.m4
create mode 100644 src/tests/intg/ent.py
create mode 100644 src/tests/intg/ldap_test.py
create mode 100644 src/tests/intg/misc.py
create mode 100755 src/tests/intg/slapd_setup
create mode 100755 src/tests/intg/slapd_teardown
diff --git a/Makefile.am b/Makefile.am
index 8f0ce4b..647f1e8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -19,7 +19,7 @@ if HAVE_MANPAGES
SUBDIRS += src/man
endif
-SUBDIRS += . src/tests/cwrap
+SUBDIRS += . src/tests/cwrap src/tests/intg
# Some old versions of automake don't define builddir
builddir ?= .
@@ -2280,6 +2280,33 @@ autofs_test_client_CFLAGS = $(AM_CFLAGS)
autofs_test_client_LDADD = -lpopt $(CLIENT_LIBS)
endif
+#####################
+# Integration tests #
+#####################
+
+if ENABLE_INTGCHECK
+intgcheck:
+ set -e; \
+ rm -Rf intg; \
+ $(MKDIR_P) intg/bld; \
+ : Use /hopefully/ short prefix to keep D-Bus socket path short; \
I admit I don't know what are these lines that start with a colon?
+ prefix=`mktemp --tmpdir --directory sssd-intg.XXXXXXXX`; \
+ $(LN_S) "$$prefix" intg/pfx; \
+ cd intg/bld; \
+ $(abs_top_srcdir)/configure \
+ --prefix="$$prefix" \
+ --with-ldb-lib-dir="$$prefix"/lib/ldb \
+ $(INTGCHECK_CONFIGURE_FLAGS); \
+ $(MAKE) $(AM_MAKEFLAGS); \
+ : Force single-thread install to workaround concurrency issues; \
+ $(MAKE) $(AM_MAKEFLAGS) -j1 install; \
+ : Remove .la files from LDB module directory to avoid loader warnings; \
+ rm "$$prefix"/lib/ldb/*.la; \
+ $(MAKE) $(AM_MAKEFLAGS) -C src/tests/intg intgcheck-installed; \
+ cd ../..; \
+ rm -Rf "$$prefix" intg
+endif # ENABLE_INTGCHECK
+
####################
# Client Libraries #
####################
diff --git a/configure.ac b/configure.ac
index e30405f..225ff64 100644
--- a/configure.ac
+++ b/configure.ac
@@ -174,6 +174,9 @@ m4_include([src/external/configlib.m4])
m4_include([src/external/libnfsidmap.m4])
m4_include([src/external/cwrap.m4])
m4_include([src/external/libresolv.m4])
+m4_include([src/external/fakeroot.m4])
+m4_include([src/external/pytest.m4])
+m4_include([src/external/intgcheck.m4])
if test x$build_config_lib = xyes; then
m4_include([src/external/libaugeas.m4])
@@ -248,8 +251,8 @@ AM_CONDITIONAL([HAVE_PROFILE_CATALOGS], [test
"x$HAVE_PROFILE_CATALOGS" != "x"])
AM_CONDITIONAL([HAVE_MANPAGES], [test "x$HAVE_MANPAGES" != "x"])
AM_CONDITIONAL([HAVE_PO4A], [test "x$PO4A" != "xno"])
+AC_PATH_PROG(PYTHON2, python2)
if test x$HAVE_PYTHON2_BINDINGS = x1; then
- AC_PATH_PROG(PYTHON2, python2)
PYTHON=$PYTHON2
AM_PATH_PYTHON([2.6])
AM_PYTHON_CONFIG([python2])
@@ -268,9 +271,10 @@ if test x$HAVE_PYTHON2_BINDINGS = x1; then
SSS_CLEAN_PYTHON_VARIABLES
fi
+AM_CONDITIONAL([HAVE_PYTHON2], [test x"$PYTHON2" != x])
+AC_PATH_PROG(PYTHON3, python3)
if test x$HAVE_PYTHON3_BINDINGS = x1; then
- AC_PATH_PROG(PYTHON3, python3)
PYTHON=$PYTHON3
AM_PATH_PYTHON([3.3])
AM_PYTHON_CONFIG([python3])
@@ -289,11 +293,15 @@ if test x$HAVE_PYTHON3_BINDINGS = x1; then
SSS_CLEAN_PYTHON_VARIABLES
fi
+AM_CONDITIONAL([HAVE_PYTHON3], [test x"$PYTHON3" != x])
I think the HAVE_PYTHON changes should be in a separate patch.
AM_CONDITIONAL([BUILD_PYTHON_BINDINGS],
[test x"$with_python2_bindings" = xyes \
-o x"$with_python3_bindings" = xyes])
+AM_PYTHON2_MODULE([ldap])
+AM_CONDITIONAL([HAVE_PY2MOD_LDAP], [test x"$HAVE_PY2MOD_LDAP" == xyes])
+
if test x$HAVE_SELINUX != x; then
AM_CHECK_SELINUX
AM_CHECK_SELINUX_LOGIN_DIR
@@ -366,6 +374,8 @@ AM_CHECK_CMOCKA
AM_CHECK_UID_WRAPPER
AM_CHECK_NSS_WRAPPER
+AM_ENABLE_INTGCHECK
[...]
diff --git a/src/tests/intg/Makefile.am b/src/tests/intg/Makefile.am
new file mode 100644
index 0000000..dc1d6f0
--- /dev/null
+++ b/src/tests/intg/Makefile.am
@@ -0,0 +1,59 @@
+dist_noinst_SCRIPTS = \
+ slapd_setup \
+ slapd_teardown \
+ $(NULL)
+
+dist_noinst_DATA = \
+ config.py.m4 \
+ ent.py \
+ ldap_test.py \
+ misc.py \
+ $(NULL)
+
+config.py: config.py.m4
+ m4 -D "prefix=\`$(prefix)'" \
+ -D "sysconfdir=\`$(sysconfdir)'" \
+ -D "dbpath=\`$(dbpath)'" \
+ -D "pidpath=\`$(pidpath)'" \
+ -D "logpath=\`$(logpath)'" \
+ -D "mcpath=\`$(mcpath)'" \
+ $< > $@
+
+root:
+ $(MKDIR_P) -m 0700 root/.dbus-keyrings
Can we add a comment why we need the dbus-keyring directory?
+
+passwd: root
+ echo "root:x:0:0:root:$(abs_builddir)/root:/bin/bash" > $@
+
+group:
+ echo "root:x:0:" > $@
+
+CLEANFILES=config.py config.pyc passwd group
+
+clean-local:
+ rm -Rf root
+
+intgcheck-installed: config.py passwd group
+ pipepath="$(DESTDIR)$(pipepath)"; \
+ if test $${#pipepath} -gt 80; then \
+ echo "error: Pipe directory path too long," \
+ "D-Bus won't be able to open sockets" >&2; \
+ exit 1; \
+ fi
+ set -e; \
+ nss_wrapper=$$(pkg-config --libs nss_wrapper); \
+ uid_wrapper=$$(pkg-config --libs uid_wrapper); \
+ PATH="$$(dirname -- $(SLAPD)):$$PATH" \
Interesting ^, is slapd typically out of $PATH?
+ PATH="$(DESTDIR)$(sbindir):$(DESTDIR)$(bindir):$$PATH" \
+ PATH="$(abs_builddir):$(abs_srcdir):$$PATH" \
+ PYTHONPATH="$(abs_builddir):$(abs_srcdir)" \
+ LDB_MODULES_PATH="$(DESTDIR)$(ldblibdir)" \
+ LD_PRELOAD="$$nss_wrapper $$uid_wrapper" \
+ NSS_WRAPPER_PASSWD="$(abs_builddir)/passwd" \
+ NSS_WRAPPER_GROUP="$(abs_builddir)/group" \
+ NSS_WRAPPER_MODULE_SO_PATH="$(DESTDIR)$(nsslibdir)/libnss_sss.so.2" \
+ NSS_WRAPPER_MODULE_FN_PREFIX="sss" \
+ UID_WRAPPER=1 \
+ UID_WRAPPER_ROOT=1 \
+ fakeroot $(PYTHON2) $(PYTEST) --tb=native "$(abs_srcdir)"
+ rm -f $(DESTDIR)$(logpath)/*
diff --git a/src/tests/intg/config.py.m4 b/src/tests/intg/config.py.m4
new file mode 100644
index 0000000..563127c
--- /dev/null
+++ b/src/tests/intg/config.py.m4
@@ -0,0 +1,13 @@
+"""
+Build configuration variables.
+"""
+
+PREFIX = "prefix"
+SYSCONFDIR = "sysconfdir"
+SSSDCONFDIR = SYSCONFDIR + "/sssd"
+CONF_PATH = SSSDCONFDIR + "/sssd.conf"
+DB_PATH = "dbpath"
+PID_PATH = "pidpath"
+PIDFILE_PATH = PID_PATH + "/sssd.pid"
+LOG_PATH = "logpath"
+MCACHE_PATH = "mcpath"