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 ;;
127	ndb) INDEXDB=indexdb ;;
128esac
129
130export	BACKEND BACKENDTYPE INDEXDB MAINDB \
131	WAIT KILLSERVERS PRESERVE SYNCMODE USERDATA \
132	SRCDIR
133
134if test $# = 0 ; then
135	echo "$USAGE"; exit 1
136fi
137
138# need defines.sh for the definitions of the directories
139. $SRCDIR/scripts/defines.sh
140
141SCRIPTDIR="${TOPDIR}/tests/scripts"
142
143export SCRIPTDIR
144
145SCRIPTNAME="$1"
146shift
147
148if test -x "${SCRIPTDIR}/${SCRIPTNAME}" ; then
149	SCRIPT="${SCRIPTDIR}/${SCRIPTNAME}"
150elif test -x "`echo ${SCRIPTDIR}/test*-${SCRIPTNAME}`"; then
151	SCRIPT="`echo ${SCRIPTDIR}/test*-${SCRIPTNAME}`"
152elif test -x "`echo ${SCRIPTDIR}/${SCRIPTNAME}-*`"; then
153	SCRIPT="`echo ${SCRIPTDIR}/${SCRIPTNAME}-*`"
154else
155	echo "run: ${SCRIPTNAME} not found (or not executable)"
156	exit 1;
157fi
158
159if test ! -r ${DATADIR}/test.ldif ; then
160	${LN_S} ${SRCDIR}/data ${DATADIR}
161fi
162if test ! -r ${SCHEMADIR}/core.schema ; then
163	${LN_S} ${TOPSRCDIR}/servers/slapd/schema ${SCHEMADIR}
164fi
165if test ! -r ./data; then
166	${LN_S} ${TOPDIR}/tests/data ./
167fi
168
169if test -d ${TESTDIR} ; then
170	if test $PRESERVE = no ; then
171		echo "Cleaning up test run directory leftover from previous run."
172		/bin/rm -rf ${TESTDIR}
173	elif test $PRESERVE = yes ; then
174		echo "Cleaning up only database directories leftover from previous run."
175		/bin/rm -rf ${TESTDIR}/db.*
176	fi
177fi
178if test $BACKEND = ndb ; then
179	mysql --user root <<EOF
180	drop database if exists db_1;
181	drop database if exists db_2;
182	drop database if exists db_3;
183	drop database if exists db_4;
184	drop database if exists db_5;
185	drop database if exists db_6;
186EOF
187fi
188mkdir -p ${TESTDIR}
189
190if test $USERDATA = yes ; then
191	if test ! -d userdata ; then
192		echo "User data directory (userdata) does not exist."
193		exit 1
194	fi
195	cp -R userdata/* ${TESTDIR}
196fi
197
198# disable LDAP initialization
199LDAPNOINIT=true; export LDAPNOINIT
200
201echo "Running ${SCRIPT} for ${BACKEND}..."
202while [ $COUNTER -le $LOOP ]; do
203	if [ $LOOP -gt 1 ]; then
204		echo "Running $COUNTER of $LOOP iterations"
205	fi
206	$SCRIPT $*
207	RC=$?
208
209	if test $CLEAN = yes ; then
210		echo "Cleaning up test run directory from this run."
211		/bin/rm -rf ${TESTDIR}
212		echo "Cleaning up symlinks."
213		/bin/rm -f ${DATADIR} ${SCHEMADIR}
214	fi
215
216	if [ $RC -ne 0 ]; then
217		if [ $LOOP -gt 1 ]; then
218			echo "Failed after $COUNTER of $LOOP iterations"
219		fi
220		exit $RC
221	else
222		COUNTER=`expr $COUNTER + 1`
223		if [ $COUNTER -le $LOOP ]; then
224			echo "Cleaning up test run directory from this run."
225			/bin/rm -rf ${TESTDIR}
226		fi
227	fi
228done
229exit $RC
230