1#!/bin/sh
2## $OpenLDAP$
3## This work is part of OpenLDAP Software <http://www.openldap.org/>.
4##
5## Copyright 1998-2021 The OpenLDAP Foundation.
6## All rights reserved.
7##
8## Redistribution and use in source and binary forms, with or without
9## modification, are permitted only as authorized by the OpenLDAP
10## Public License.
11##
12## A copy of this license is available in the file LICENSE in the
13## top-level directory of the distribution or, alternatively, at
14## <http://www.OpenLDAP.org/license.html>.
15##
16## ACKNOWLEDGEMENTS:
17## This module was written in 2016 by Ondřej Kuzník for Symas Corp.
18
19USAGE="$0 [-b <backend>] [-c] [-k] [-l #] [-p] [-s {ro|rp}] [-u] [-w] <script>"
20
21TOPSRCDIR="${SRCDIR-$LDAP_SRC}"
22SRCDIR="${TOPSRCDIR}/tests"
23eval `grep EGREP_CMD= ${LDAP_BUILD}/tests/run`
24eval `$EGREP_CMD -e '^LN_S=' ${LDAP_BUILD}/tests/run`
25
26export SRCDIR TOPSRCDIR LN_S EGREP_CMD
27
28. "${SRCDIR}/scripts/defines.sh"
29
30BACKEND=
31CLEAN=no
32WAIT=0
33KILLSERVERS=yes
34PRESERVE=${PRESERVE-no}
35SYNCMODE=${SYNCMODE-rp}
36USERDATA=no
37LOOP=1
38COUNTER=1
39
40while test $# -gt 0 ; do
41	case "$1" in
42		-b | -backend)
43			BACKEND="$2"
44			shift; shift ;;
45
46		-c | -clean)
47			CLEAN=yes
48			shift ;;
49
50		-k | -kill)
51			KILLSERVERS=no
52			shift ;;
53		-l | -loop)
54			NUM="`echo $2 | sed 's/[0-9]//g'`"
55			if [ -z "$NUM" ]; then
56				LOOP=$2
57			else
58				echo "Loop variable not an int: $2"
59				echo "$USAGE"; exit 1
60			fi
61			shift ;
62			shift ;;
63
64		-p | -preserve)
65			PRESERVE=yes
66			shift ;;
67
68		-s | -syncmode)
69			case "$2" in
70				ro | rp)
71					SYNCMODE="$2"
72					;;
73				*)
74					echo "unknown sync mode $2"
75					echo "$USAGE"; exit 1
76					;;
77			esac
78			shift; shift ;;
79
80		-u | -userdata)
81			USERDATA=yes
82			shift ;;
83
84		-w | -wait)
85			WAIT=1
86			shift ;;
87
88		-)
89			shift
90			break ;;
91
92		-*)
93			echo "$USAGE"; exit 1
94			;;
95
96		*)
97			break ;;
98	esac
99done
100
101eval `$EGREP_CMD -e '^AC' ${LDAP_BUILD}/tests/run`
102export `$EGREP_CMD -e '^AC' ${LDAP_BUILD}/tests/run | sed 's/=.*//'`
103
104if test -z "$BACKEND" ; then
105	for b in mdb ; do
106		if eval "test \"\$AC_$b\" != no" ; then
107			BACKEND=$b
108			break
109		fi
110	done
111	if test -z "$BACKEND" ; then
112		echo "No suitable default database backend configured" >&2
113		exit 1
114	fi
115fi
116
117BACKENDTYPE=`eval 'echo $AC_'$BACKEND`
118if test "x$BACKENDTYPE" = "x" ; then
119	BACKENDTYPE="unknown"
120fi
121
122# Backend features.  indexdb: indexing and unchecked limit.
123# maindb: main storage backend.  Currently index,limits,mode,paged results.
124INDEXDB=noindexdb MAINDB=nomaindb
125case $BACKEND in
126	mdb) INDEXDB=indexdb MAINDB=maindb ;;
127esac
128
129export	BACKEND BACKENDTYPE INDEXDB MAINDB \
130	WAIT KILLSERVERS PRESERVE SYNCMODE USERDATA \
131	SRCDIR
132
133if test $# = 0 ; then
134	echo "$USAGE"; exit 1
135fi
136
137# need defines.sh for the definitions of the directories
138. $SRCDIR/scripts/defines.sh
139
140SCRIPTDIR="${TOPDIR}/tests/scripts"
141
142export SCRIPTDIR
143
144SCRIPTNAME="$1"
145shift
146
147if test -x "${SCRIPTDIR}/${SCRIPTNAME}" ; then
148	SCRIPT="${SCRIPTDIR}/${SCRIPTNAME}"
149elif test -x "`echo ${SCRIPTDIR}/test*-${SCRIPTNAME}`"; then
150	SCRIPT="`echo ${SCRIPTDIR}/test*-${SCRIPTNAME}`"
151elif test -x "`echo ${SCRIPTDIR}/${SCRIPTNAME}-*`"; then
152	SCRIPT="`echo ${SCRIPTDIR}/${SCRIPTNAME}-*`"
153else
154	echo "run: ${SCRIPTNAME} not found (or not executable)"
155	exit 1;
156fi
157
158if test ! -r ${DATADIR}/test.ldif ; then
159	${LN_S} ${SRCDIR}/data ${DATADIR}
160fi
161if test ! -r ${SCHEMADIR}/core.schema ; then
162	${LN_S} ${TOPSRCDIR}/servers/slapd/schema ${SCHEMADIR}
163fi
164if test ! -r ./data; then
165	${LN_S} ${TOPDIR}/tests/data ./
166fi
167
168if test -d ${TESTDIR} ; then
169	if test $PRESERVE = no ; then
170		echo "Cleaning up test run directory leftover from previous run."
171		/bin/rm -rf ${TESTDIR}
172	elif test $PRESERVE = yes ; then
173		echo "Cleaning up only database directories leftover from previous run."
174		/bin/rm -rf ${TESTDIR}/db.*
175	fi
176fi
177mkdir -p ${TESTDIR}
178
179if test $USERDATA = yes ; then
180	if test ! -d userdata ; then
181		echo "User data directory (userdata) does not exist."
182		exit 1
183	fi
184	cp -R userdata/* ${TESTDIR}
185fi
186
187# disable LDAP initialization
188LDAPNOINIT=true; export LDAPNOINIT
189
190echo "Running ${SCRIPT} for ${BACKEND}..."
191while [ $COUNTER -le $LOOP ]; do
192	if [ $LOOP -gt 1 ]; then
193		echo "Running $COUNTER of $LOOP iterations"
194	fi
195	$SCRIPT $*
196	RC=$?
197
198	if test $CLEAN = yes ; then
199		echo "Cleaning up test run directory from this run."
200		/bin/rm -rf ${TESTDIR}
201		echo "Cleaning up symlinks."
202		/bin/rm -f ${DATADIR} ${SCHEMADIR}
203	fi
204
205	if [ $RC -ne 0 ]; then
206		if [ $LOOP -gt 1 ]; then
207			echo "Failed after $COUNTER of $LOOP iterations"
208		fi
209		exit $RC
210	else
211		COUNTER=`expr $COUNTER + 1`
212		if [ $COUNTER -le $LOOP ]; then
213			echo "Cleaning up test run directory from this run."
214			/bin/rm -rf ${TESTDIR}
215		fi
216	fi
217done
218exit $RC
219